TDME2  1.9.200
GUISelectorHController.cpp
Go to the documentation of this file.
2 
3 #include <memory>
4 #include <string>
5 
6 #include <tdme/tdme.h>
13 #include <tdme/gui/nodes/GUINode.h>
18 #include <tdme/gui/GUI.h>
21 
22 using std::make_unique;
23 using std::string;
24 using std::to_string;
25 using std::unique_ptr;
26 
40 using tdme::gui::GUI;
43 
44 string GUISelectorHController::CONDITION_DISABLED = "disabled";
45 string GUISelectorHController::CONDITION_ENABLED = "enabled";
46 
47 GUISelectorHController::GUISelectorHController(GUINode* node)
48  : GUIElementController(node)
49 {
50  this->disabled = required_dynamic_cast<GUIElementNode*>(node)->isDisabled();
51 }
52 
54 {
55  return disabled;
56 }
57 
59 {
60  auto& nodeConditions = required_dynamic_cast<GUIElementNode*>(node)->getActiveConditions();
61  nodeConditions.remove(this->disabled == true?CONDITION_DISABLED:CONDITION_ENABLED);
62  this->disabled = disabled;
63  nodeConditions.add(this->disabled == true?CONDITION_DISABLED:CONDITION_ENABLED);
64 }
65 
67 {
68  //
69  GUIElementController::initialize();
70 
71  //
73 
74  //
75  innerNode = required_dynamic_cast<GUIParentNode*>(node->getScreenNode()->getInnerNodeById(node->getId()));
76 
77  //
78  class GUISelectorHControllerActionListener: public virtual GUIActionListener
79  {
80  public:
81  void onAction(GUIActionListenerType type, GUIElementNode* node) override {
82  if (type != GUIActionListenerType::PERFORMED) return;
83  if (node == leftArrowNode) {
84  selectorHController->selectPrevious();
85  } else
86  if (node == rightArrowNode) {
87  selectorHController->selectNext();
88  }
89  }
90 
91  /**
92  * Public constructor
93  * @param selectorHController selector horizontal Controller
94  * @param leftArrowNode left arrow node
95  * @param rightArrowNode right arrow node
96  */
97  GUISelectorHControllerActionListener(GUISelectorHController* selectorHController, GUIElementNode* leftArrowNode, GUIElementNode* rightArrowNode)
98  : selectorHController(selectorHController)
99  , leftArrowNode(leftArrowNode)
100  , rightArrowNode(rightArrowNode) {
101  }
102 
103  private:
104  GUISelectorHController* selectorHController;
105  GUIElementNode* leftArrowNode;
106  GUIElementNode* rightArrowNode;
107  };
108 
109  //
110  auto const leftArrowNode = dynamic_cast<GUIElementNode*>(node->getScreenNode()->getNodeById(node->getId() + "_left"));
111  auto const rightArrowNode = dynamic_cast<GUIElementNode*>(node->getScreenNode()->getNodeById(node->getId() + "_right"));
112  node->getScreenNode()->addActionListener((actionListener = make_unique<GUISelectorHControllerActionListener>(this, leftArrowNode, rightArrowNode)).get());
113 }
114 
116 {
117  //
118  GUIElementController::dispose();
119 
120  //
121  if (actionListener != nullptr) {
123  actionListener = nullptr;
124  }
125 }
126 
128 {
129 }
130 
132 {
133  if (selectedHOptionControllerIdx == -1) return;
135 }
136 
138  unselect();
140  if (selectedHOptionControllerIdx == -1) return;
142 }
143 
144 void GUISelectorHController::select(GUIElementNode* selectedSelectorHOptionElementNode) {
145  unselect();
146  auto selectedSelectorHOptionElementController = selectedSelectorHOptionElementNode->getController();
147  auto i = 0;
148  for (auto selectorHOptionController: selectorHOptionControllers) {
149  if (selectorHOptionController == selectedSelectorHOptionElementController) {
150  select(i);
151  break;
152  }
153  i++;
154  }
155 }
156 
158 {
159  vector<GUINode*> childControllerNodes;
161  required_dynamic_cast<GUIParentNode*>(node)->getChildControllerNodes(childControllerNodes);
162  for (auto i = 0; i < childControllerNodes.size(); i++) {
163  auto childControllerNode = childControllerNodes[i];
164  auto childController = dynamic_cast<GUISelectorHOptionController*>(childControllerNode->getController());
165  if (childController != nullptr) selectorHOptionControllers.push_back(childController);
166  }
167 }
168 
170 {
171  unselect();
172  if (selectorHOptionControllers.size() == 0)
173  return;
174 
175  auto disabledCount = 0;
176  while (disabledCount < selectorHOptionControllers.size()) {
179  selectorHOptionControllers[selectedHOptionControllerIdx]->isHidden() == false) break;
180  disabledCount++;
181  }
182  if (disabledCount == selectorHOptionControllers.size()) {
184  return;
185  }
186 
188 }
189 
191 {
192  unselect();
193  if (selectorHOptionControllers.size() == 0)
194  return;
195 
197 
198  auto disabledCount = 0;
199  while (disabledCount < selectorHOptionControllers.size()) {
204  selectorHOptionControllers[selectedHOptionControllerIdx]->isHidden() == false) break;
205  disabledCount++;
206  }
207  if (disabledCount == selectorHOptionControllers.size()) {
209  return;
210  }
211 
213 }
214 
216 {
217  GUIElementController::handleMouseEvent(node, event);
218  if (disabled == true) return;
219  if (event->getButton() == MOUSE_BUTTON_LEFT) {
220  if (node == innerNode && innerNode->isEventBelongingToNode(event) == true) {
221  if (event->getType() == GUIMouseEvent::MOUSEEVENT_RELEASED) {
222  auto elementNode = required_dynamic_cast<GUIElementNode*>(this->node);
223  node->getScreenNode()->getGUI()->setFoccussedNode(elementNode);
224  selectNext();
225  }
226  }
227  }
228 }
229 
231 {
232  GUIElementController::handleKeyboardEvent(event);
233  if (disabled == true) return;
234  switch (event->getKeyCode()) {
235  case GUIKeyboardEvent::KEYCODE_LEFT: {
236  event->setProcessed(true);
237  if (event->getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
238  selectPrevious();
239  }
240  }
241  break;
242  case GUIKeyboardEvent::KEYCODE_RIGHT: {
243  event->setProcessed(true);
244  if (event->getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
245  selectNext();
246  }
247  }
248  break;
249  }
250 }
251 
253 {
254  GUIElementController::tick();
255 }
256 
258 {
259 }
260 
262 {
263 }
264 
266 {
267  return true;
268 }
269 
271 {
272  value.reset();
273  if (selectedHOptionControllerIdx != -1) value.append(required_dynamic_cast<GUIElementNode*>(selectorHOptionControllers[selectedHOptionControllerIdx]->getNode())->getValue());
274  return value;
275 }
276 
278 {
279  unselect();
280  auto i = 0;
281  for (auto selectorHOptionController: selectorHOptionControllers) {
282  auto selectorHOptionNode = required_dynamic_cast<GUIElementNode*>(selectorHOptionController->getNode());
283  if (value.equals(selectorHOptionNode->getValue())) {
284  select(i);
285  break;
286  }
287  i++;
288  }
289 }
290 
294  auto i = 0;
295  for (auto selectorHOptionController: selectorHOptionControllers) {
296  auto selectorHOptionNode = required_dynamic_cast<GUIElementNode*>(selectorHOptionController->getNode());
297  selectorHOptionController->unselect();
298  if (selectorHOptionNode->isSelected() == true) {
300  break;
301  }
302  i++;
303  }
306 }
#define MOUSE_BUTTON_LEFT
GUI module class.
Definition: GUI.h:64
void setFoccussedNode(GUIElementNode *newFoccussedNode)
Set focussed node.
Definition: GUI.cpp:267
GUI selector horizontal controller.
vector< GUISelectorHOptionController * > selectorHOptionControllers
void initialize() override
Initialize controller after element has been created.
unique_ptr< GUIActionListener > actionListener
void handleKeyboardEvent(GUIKeyboardEvent *event) override
Handle keyboard event.
void setValue(const MutableString &value) override
Set value.
void handleMouseEvent(GUINode *node, GUIMouseEvent *event) override
Handle mouse event.
void tick() override
Tick method will be executed once per frame.
static STATIC_DLL_IMPEXT string CONDITION_DISABLED
static STATIC_DLL_IMPEXT string CONDITION_ENABLED
void setDisabled(bool disabled) override
Set disabled.
void onSubTreeChange() override
On sub tree change.
void determineSelectorHOptionControllers()
Determine drop down option controllers.
GUIKeyboardEventType getType() const
GUIMouseEventType getType() const
Definition: GUIMouseEvent.h:78
GUI element node conditions.
GUI node base class.
Definition: GUINode.h:64
bool isEventBelongingToNode(GUIMouseEvent *event, Vector2 &nodeCoordinate)
Is event belonging to node.
Definition: GUINode.h:604
GUINodeController * getController()
Definition: GUINode.h:661
GUIScreenNode * getScreenNode()
Definition: GUINode.h:325
const string & getId()
Definition: GUINode.h:339
GUI parent node base class thats supporting child nodes.
Definition: GUIParentNode.h:42
GUI screen node that represents a screen that can be rendered via GUI system.
Definition: GUIScreenNode.h:72
void removeActionListener(GUIActionListener *listener)
Remove action listener.
void addActionListener(GUIActionListener *listener)
Add action listener.
GUINode * getInnerNodeById(const string &nodeId)
Get inner GUI node by id.
GUINode * getNodeById(const string &nodeId)
Get GUI node by id.
Mutable utf8 aware string class.
Definition: MutableString.h:23
MutableString & append(char c)
Append character.
bool equals(const string &s2) const
Equals.
MutableString & reset()
Reset.
Definition: MutableString.h:95
String tools class.
Definition: StringTools.h:22
GUI action listener interface.