5 #include <unordered_set>
29 using std::unordered_set;
50 string GUIGridController::CONDITION_DISABLED =
"disabled";
51 string GUIGridController::CONDITION_ENABLED =
"enabled";
53 GUIGridController::GUIGridController(
GUINode* node)
56 this->
disabled = required_dynamic_cast<GUIElementNode*>(
node)->isDisabled();
72 GUIElementController::initialize();
76 if (gridItemController->isSelected() ==
false)
continue;
81 value.
append(required_dynamic_cast<GUIElementNode*>(gridItemController->getNode())->getValue());
84 value.
set(required_dynamic_cast<GUIElementNode*>(gridItemController->getNode())->getValue());
90 auto horizontalItemsOptionValue = required_dynamic_cast<GUIElementNode*>(
node)->getOptionValue(
"horizontal-items");
91 if (horizontalItemsOptionValue.empty() ==
false)
horizontalItems = Integer::parse(horizontalItemsOptionValue);
93 Console::println(
"GUIGridController::initialize(): options: horizontal-items: invalid value: " + required_dynamic_cast<GUIElementNode*>(
node)->getOptionValue(
"horizontal-items"));
100 GUIElementController::dispose();
125 auto itemElementNodeController = gridItemElementNode->
getController();
136 if (itemIdx == -1)
return;
153 auto itemIdx =
getItemIdx(gridItemElementNode);
154 if (itemIdx == -1)
return;
161 if (itemIdx == -1)
return;
176 auto itemIdx =
getItemIdx(gridItemElementNode);
177 if (itemIdx == -1)
return;
189 if (itemIdx == -1)
return;
193 auto disabledCount = 0;
210 if (itemIdx == -1)
return;
214 auto disabledCount = 0;
216 if (--itemIdx < 0) itemIdx = 0;
234 string selectionValue;
248 auto itemIdx =
getItemIdx(gridItemElementNode);
249 if (itemIdx == -1)
return;
256 if (itemIdx == -1)
return;
263 vector<GUINode*> childControllerNodes;
265 required_dynamic_cast<GUIParentNode*>(
node)->getChildControllerNodes(childControllerNodes);
268 for (
auto i = 0; i < childControllerNodes.size(); i++) {
269 auto childControllerNode = childControllerNodes[i];
270 auto childController = childControllerNode->getController();
272 if (gridItemController !=
nullptr) {
280 GUIElementController::handleMouseEvent(
node, event);
281 auto disabled = required_dynamic_cast<GUIGridController*>(this->node->
getController())->isDisabled();
283 if (event->
getType() == GUIMouseEvent::MOUSEEVENT_PRESSED) {
291 GUIElementController::handleKeyboardEvent(event);
293 if (event->
getType() != GUIKeyboardEvent::KEYBOARDEVENT_KEY_TYPED) {
294 auto isKeyDown =
event->getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED;
299 case GUIKeyboardEvent::KEYCODE_UP: {
300 event->setProcessed(
true);
301 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
310 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
315 case GUIKeyboardEvent::KEYCODE_DOWN: {
316 event->setProcessed(
true);
317 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
326 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
331 case GUIKeyboardEvent::KEYCODE_SPACE: {
332 event->setProcessed(
true);
333 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_PRESSED) {
338 if (event->
getType() == GUIKeyboardEvent::KEYBOARDEVENT_KEY_RELEASED) {
349 GUIElementController::tick();
382 unordered_set<string> valueSet;
386 valueSet.insert(valueTokenizer.
nextToken());
393 auto gridItemNode = required_dynamic_cast<GUIElementNode*>(gridItemController->getNode());
394 auto itemValue = gridItemNode->getValue();
395 if (gridItemController->isSelected() ==
true) gridItemController->unselect();
396 if (gridItemController->isFocussed() ==
true) gridItemController->unfocus();
397 if (valueSet.find(itemValue) != valueSet.end()) {
399 gridItemControllerLast = gridItemController;
402 if (gridItemControllerLast !=
nullptr) {
404 focus(required_dynamic_cast<GUIElementNode*>(gridItemControllerLast->
getNode()));
410 auto gridItemNode = required_dynamic_cast<GUIElementNode*>(gridItemController->getNode());
413 gridItemNode->scrollToNodeX(required_dynamic_cast<GUIParentNode*>(
node));
414 gridItemNode->scrollToNodeY(required_dynamic_cast<GUIParentNode*>(
node));
420 for (
auto& valueSetValue: valueSet) {
422 this->value.
append(valueSetValue);
433 if (unlayoutedParentNode->getSubNodesCount() == 0)
return;
440 layoutedParentNode->clearSubNodes();
441 auto gridItemIdx = 0;
442 auto gridHorizontalLayoutIdx = 0;
443 auto gridHorizontalLayoutId =
node->
getId() +
"_hl_" + to_string(gridHorizontalLayoutIdx++);
444 GUIParser::parse(layoutedParentNode,
"<layout id=\"" + gridHorizontalLayoutId +
"\" alignment=\"horizontal\" width=\"auto\"></layout>\n");
446 while (unlayoutedParentNode->getSubNodesCount() > 0) {
447 required_dynamic_cast<GUIParentNode*>(
node->
getScreenNode()->
getNodeById(gridHorizontalLayoutId))->moveSubNode(unlayoutedParentNode, 0);
449 if ((gridItemIdx %
horizontalItems) == 0 && unlayoutedParentNode->getSubNodesCount() > 0) {
450 gridHorizontalLayoutId =
node->
getId() +
"_hl_" + to_string(gridHorizontalLayoutIdx++);
451 GUIParser::parse(layoutedParentNode,
"<layout id=\"" + gridHorizontalLayoutId +
"\" alignment=\"horizontal\" width=\"auto\"></layout>\n");
static GUIScreenNode * parse(const string &pathName, const string &fileName, const unordered_map< string, string > &variables={}, const EngineMiniScript::ScriptVariable &miniScriptArguments=EngineMiniScript::ScriptVariable(), Context *context=nullptr)
Parses a GUI XML file.
void setFoccussedNode(GUIElementNode *newFoccussedNode)
Set focussed node.
void selectCurrent()
Select current item.
vector< GUIGridItemController * > gridItemControllers
void onFocusGained() override
On focus gained.
void dispose() override
Dispose controller.
void postLayout() override
Post layout event.
void determineItems()
Determine items.
MutableString singleValue
void initialize() override
Initialize controller after element has been created.
void handleKeyboardEvent(GUIKeyboardEvent *event) override
Handle keyboard event.
void onFocusLost() override
On focus lost.
void setValue(const MutableString &value) override
Set value.
void handleMouseEvent(GUINode *node, GUIMouseEvent *event) override
Handle mouse event.
void focus(int itemIdx)
Focus.
void tick() override
Tick method will be executed once per frame.
void unfocus()
Unfocus all items.
void unselect()
Unselect all items.
static constexpr STATIC_DLL_IMPEXT char VALUE_DELIMITER
void focusPrevious()
Focus previous item.
void toggle(int itemIdx)
Toggle.
int getItemIdx(GUIElementNode *gridItemElementNode)
Get item idx.
bool isMultipleSelection()
const MutableString & getValue() override
void onSubTreeChange() override
On sub tree change.
void focusNext()
Focus next item.
void select()
Select focussed node.
int getFocussedItemIdx()
Get focussed item idx.
GUI grid item controller.
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.
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.
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.
std::exception Exception
Exception base class.