4 #include <unordered_set>
24 using std::unordered_set;
42 string GUISelectBoxController::CONDITION_DISABLED =
"disabled";
43 string GUISelectBoxController::CONDITION_ENABLED =
"enabled";
45 GUISelectBoxController::GUISelectBoxController(
GUINode* node)
48 this->
disabled = required_dynamic_cast<GUIElementNode*>(
node)->isDisabled();
64 GUIElementController::initialize();
68 if (selectBoxOptionController->isSelected() ==
false)
continue;
73 value.
append(required_dynamic_cast<GUIElementNode*>(selectBoxOptionController->getNode())->getValue());
76 value.
set(required_dynamic_cast<GUIElementNode*>(selectBoxOptionController->getNode())->getValue());
85 GUIElementController::dispose();
110 auto optionElementNodeController = optionElementNode->
getController();
121 if (optionIdx == -1)
return;
139 if (optionIdx == -1)
return;
146 if (optionIdx == -1)
return;
162 if (optionIdx == -1)
return;
174 if (optionIdx == -1)
return;
178 auto disabledCount = 0;
195 if (optionIdx == -1)
return;
199 auto disabledCount = 0;
201 if (--optionIdx < 0) optionIdx = 0;
219 string selectionValue;
234 if (optionIdx == -1)
return;
241 if (optionIdx == -1)
return;
251 if (selectBoxParentOptionController !=
nullptr) selectBoxParentOptionController->
toggleExpandState();
261 if (selectBoxParentOptionController !=
nullptr) {
262 if (selectBoxParentOptionController->isExpanded() ==
false) selectBoxParentOptionController->
toggleExpandState();
273 if (selectBoxParentOptionController !=
nullptr) {
274 if (selectBoxParentOptionController->isExpanded() ==
true) selectBoxParentOptionController->
toggleExpandState();
283 if (optionIdx == -1)
return;
291 vector<GUINode*> childControllerNodes;
293 required_dynamic_cast<GUIParentNode*>(
node)->getChildControllerNodes(childControllerNodes);
296 for (
auto i = 0; i < childControllerNodes.size(); i++) {
297 auto childControllerNode = childControllerNodes[i];
298 auto childController = childControllerNode->getController();
300 if (selectBoxOptionController !=
nullptr) {
307 vector<GUINode*> childControllerNodes;
309 required_dynamic_cast<GUIParentNode*>(
node)->getChildControllerNodes(childControllerNodes);
312 for (
auto i = 0; i < childControllerNodes.size(); i++) {
313 auto childControllerNode = childControllerNodes[i];
314 auto childController = childControllerNode->getController();
316 if (selectBoxOptionController !=
nullptr && selectBoxOptionController->isHierarchyExpanded() ==
true) {
324 vector<GUINode*> childControllerNodes;
326 required_dynamic_cast<GUIParentNode*>(
node)->getChildControllerNodes(childControllerNodes);
329 for (
auto i = 0; i < childControllerNodes.size(); i++) {
330 auto childControllerNode = childControllerNodes[i];
331 auto childController = childControllerNode->getController();
333 if (selectBoxParentOptionController !=
nullptr) {
341 GUIElementController::handleMouseEvent(
node, event);
342 auto disabled = required_dynamic_cast<GUISelectBoxController*>(this->node->
getController())->isDisabled();
344 if (event->
getType() == GUIMouseEvent::MOUSEEVENT_PRESSED) {
352 GUIElementController::handleKeyboardEvent(event);
354 if (event->
getType() != GUIKeyboardEvent::KEYBOARDEVENT_KEY_TYPED) {
355 auto isKeyDown =
event->getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED;
360 case GUIKeyboardEvent::KEYCODE_UP: {
361 event->setProcessed(
true);
362 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
371 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
376 case GUIKeyboardEvent::KEYCODE_DOWN: {
377 event->setProcessed(
true);
378 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
387 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
392 case GUIKeyboardEvent::KEYCODE_RIGHT:
393 event->setProcessed(
true);
394 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
399 case GUIKeyboardEvent::KEYCODE_LEFT: {
400 event->setProcessed(
true);
401 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
407 case GUIKeyboardEvent::KEYCODE_SPACE: {
408 event->setProcessed(
true);
409 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
414 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
425 GUIElementController::tick();
458 unordered_set<string> valueSet;
462 valueSet.insert(valueTokenizer.
nextToken());
469 auto selectBoxOptionNode = required_dynamic_cast<GUIElementNode*>(selectBoxOptionController->getNode());
470 auto optionValue = selectBoxOptionNode->getValue();
471 if (selectBoxOptionController->isSelected() ==
true) selectBoxOptionController->unselect();
472 if (selectBoxOptionController->isFocussed() ==
true) selectBoxOptionController->unfocus();
473 if (valueSet.find(optionValue) != valueSet.end()) {
474 selectBoxOptionController->expandHierarchy();
476 selectBoxOptionNodeControllerLast = selectBoxOptionController;
480 if (selectBoxOptionNodeControllerLast !=
nullptr) {
482 focus(required_dynamic_cast<GUIElementNode*>(selectBoxOptionNodeControllerLast->
getNode()));
488 auto selectBoxOptionNode = required_dynamic_cast<GUIElementNode*>(selectBoxOptionController->getNode());
491 selectBoxOptionNode->scrollToNodeX(required_dynamic_cast<GUIParentNode*>(
node));
492 selectBoxOptionNode->scrollToNodeY(required_dynamic_cast<GUIParentNode*>(
node));
498 for (
const auto& valueSetValue: valueSet) {
500 this->value.
append(valueSetValue);
510 expandedParentOptionValues.clear();
513 if (required_dynamic_cast<GUISelectBoxParentOptionController*>(selectBoxParentOptionController)->isExpanded() ==
true) {
514 expandedParentOptionValues.push_back(required_dynamic_cast<GUIElementNode*>(selectBoxParentOptionController->getNode())->getValue());
522 for (
const auto& expandedParentOptionValue: expandedParentOptionValues) {
524 if (expandedParentOptionValue == required_dynamic_cast<GUIElementNode*>(selectBoxParentOptionController->getNode())->getValue()) {
525 auto parentOptionNodeController = required_dynamic_cast<GUISelectBoxParentOptionController*>(selectBoxParentOptionController);
526 if (parentOptionNodeController->isExpanded() ==
false) parentOptionNodeController->toggleExpandState();
void setFoccussedNode(GUIElementNode *newFoccussedNode)
Set focussed node.
GUI select box controller.
void selectCurrent()
Select current options.
void onFocusGained() override
On focus gained.
void dispose() override
Dispose controller.
void focus(int optionIdx)
Focus.
void expand(int optionIdx)
Expand.
void postLayout() override
Post layout event.
void determineExpandedParentOptionValues(vector< string > &expandedParentOptionValues)
Determine expanded parent option values.
MutableString singleValue
void initialize() override
Initialize controller after element has been created.
void handleKeyboardEvent(GUIKeyboardEvent *event) override
Handle keyboard event.
void determineExpandedOptions()
Determine expanded options.
void collapse(int optionIdx)
Collapse.
void onFocusLost() override
On focus lost.
void setValue(const MutableString &value) override
Set value.
void handleMouseEvent(GUINode *node, GUIMouseEvent *event) override
Handle mouse event.
int getFocussedOptionIdx()
Get focussed option idx.
void determineParentOptions()
Determine parent options.
void tick() override
Tick method will be executed once per frame.
void unfocus()
Unfocus all nodes.
void unselect()
Unselect all nodes.
static constexpr STATIC_DLL_IMPEXT char VALUE_DELIMITER
void focusPrevious()
Focus previous option.
void determineAllOptions()
Determine all options.
void toggleOpenState(int optionIdx)
Toggle open state of current parent option.
vector< GUISelectBoxOptionController * > selectBoxOptionControllers
void expandParentOptionsByValues(const vector< string > &expandedParentOptionValues)
Expand parent options by values.
bool isMultipleSelection()
const MutableString & getValue() override
void onSubTreeChange() override
On sub tree change.
void toggle(int optionIdx)
Toggle.
void focusNext()
Focus next option.
void select()
Select focussed node.
int getOptionIdx(GUIElementNode *optionElementNode)
Get focussed option idx.
GUI select box option controller.
GUI select box parent option controller.
void toggleExpandState()
Toggle expand state.
int32_t getKeyCode() const
GUIKeyboardEventType getType() const
GUIMouseEventType getType() const
bool isDisabled() override
GUI element node conditions.
void scrollToNodeY(GUIParentNode *toNode=nullptr)
Scroll to node Y.
void scrollToNodeX(GUIParentNode *toNode=nullptr)
Scroll to node X.
bool isEventBelongingToNode(GUIMouseEvent *event, Vector2 &nodeCoordinate)
Is event belonging to node.
GUINodeController * getController()
GUIScreenNode * getScreenNode()
GUI parent node base class thats supporting child nodes.
GUI screen node that represents a screen that can be rendered via GUI system.
void invalidateLayout(GUINode *node)
Mark a node to be invalidated regarding layout.
void forwardChange(GUIElementNode *node)
Forward change event.
Mutable utf8 aware string class.
MutableString & append(char c)
Append character.
bool equals(const string &s2) const
Equals.
const string & getString() const
MutableString & set(char c)
Set character.
MutableString & reset()
Reset.
void replace(const string &what, const string &by, int beginIndex=0)
Replace string with another string.
const string & nextToken()
void tokenize(const string &str, const string &delimiters, bool emptyTokens=false)
Tokenize.