/** * @brief Console function to push a dropdown window at a position. It work like UI_PushWindow but move the window at the right position * @sa UI_PushWindow * @note The usage is "ui_push_dropdown sourcenode pointposition destinationnode pointposition" * sourcenode must be a node into the window we want to push, * we will move the window to have sourcenode over destinationnode * pointposition select for each node a position (like a corner). */ static void UI_PushDropDownWindow_f (void) { vec2_t source; vec2_t destination; uiNode_t *node; int direction; size_t writtenBytes; int result; if (Cmd_Argc() != 4 && Cmd_Argc() != 5) { Com_Printf("Usage: %s <source-anchor> <point-in-source-anchor> <dest-anchor> <point-in-dest-anchor>\n", Cmd_Argv(0)); return; } /* get the source anchor */ node = UI_GetNodeByPath(Cmd_Argv(1)); if (node == NULL) { Com_Printf("UI_PushDropDownWindow_f: Node '%s' doesn't exist\n", Cmd_Argv(1)); return; } result = Com_ParseValue(&direction, Cmd_Argv(2), V_INT, 0, sizeof(direction), &writtenBytes); if (result != RESULT_OK) { Com_Printf("UI_PushDropDownWindow_f: '%s' in not a V_INT\n", Cmd_Argv(2)); return; } UI_NodeGetPoint(node, source, direction); UI_NodeRelativeToAbsolutePoint(node, source); /* get the destination anchor */ if (Q_streq(Cmd_Argv(4), "mouse")) { destination[0] = mousePosX; destination[1] = mousePosY; } else { /* get the source anchor */ node = UI_GetNodeByPath(Cmd_Argv(3)); if (node == NULL) { Com_Printf("UI_PushDropDownWindow_f: Node '%s' doesn't exist\n", Cmd_Argv(3)); return; } result = Com_ParseValue(&direction, Cmd_Argv(4), V_INT, 0, sizeof(direction), &writtenBytes); if (result != RESULT_OK) { Com_Printf("UI_PushDropDownWindow_f: '%s' in not a V_INT\n", Cmd_Argv(4)); return; } UI_NodeGetPoint(node, destination, direction); UI_NodeRelativeToAbsolutePoint(node, destination); } /* update the window and push it */ node = UI_GetNodeByPath(Cmd_Argv(1)); if (node == NULL) { Com_Printf("UI_PushDropDownWindow_f: Node '%s' doesn't exist\n", Cmd_Argv(1)); return; } node = node->root; node->box.pos[0] += destination[0] - source[0]; node->box.pos[1] += destination[1] - source[1]; UI_PushWindow(node->name); }
/** * @brief Remove a function callback from a node event */ static void UI_RemoveListener_f (void) { uiNode_t *node; uiNode_t *function; const value_t *property; if (Cmd_Argc() != 3) { Com_Printf("Usage: %s <pathnode@event> <pathnode>\n", Cmd_Argv(0)); return; } UI_ReadNodePath(Cmd_Argv(1), NULL, &node, &property); if (node == NULL) { Com_Printf("UI_RemoveListener_f: '%s' node not found.\n", Cmd_Argv(1)); return; } if (property == NULL || property->type != V_UI_ACTION) { Com_Printf("UI_RemoveListener_f: '%s' property not found, or is not an event.\n", Cmd_Argv(1)); return; } function = UI_GetNodeByPath(Cmd_Argv(2)); if (function == NULL) { Com_Printf("UI_RemoveListener_f: '%s' node not found.\n", Cmd_Argv(2)); return; } UI_RemoveListener(node, property, function); }
/** * @brief Scroll to the bottom * @param[in] nodePath absolute path */ void UI_TextScrollEnd (const char* nodePath) { uiNode_t* node = UI_GetNodeByPath(nodePath); if (!node) { Com_DPrintf(DEBUG_CLIENT, "UI_TextScrollEnd: Node '%s' could not be found\n", nodePath); return; } if (!UI_NodeInstanceOf(node, "text")) { Com_Printf("UI_TextScrollEnd: '%s' node is no instance of 'text'.\n", Cmd_Argv(1)); return; } uiTextNode* b = dynamic_cast<uiTextNode*>(node->behaviour->manager.get()); b->validateCache(node); if (EXTRADATA(node).super.scrollY.fullSize > EXTRADATA(node).super.scrollY.viewSize) { EXTRADATA(node).super.scrollY.viewPos = EXTRADATA(node).super.scrollY.fullSize - EXTRADATA(node).super.scrollY.viewSize; UI_ExecuteEventActions(node, EXTRADATA(node).super.onViewChange); } }
/** * @brief Active an element of a vscrollbarnode. * @note This command work like an user, so, if need, change event are fired */ static void UI_ActiveVScrollbarNode_f () { uiNode_t *node; int actionId; if (Cmd_Argc() != 3) { Com_Printf("Usage: %s <node-path> <action-id>\n", Cmd_Argv(0)); return; } node = UI_GetNodeByPath(Cmd_Argv(1)); if (node == NULL) { Com_Printf("UI_ActiveVScrollbarNode_f: node '%s' not found\n", Cmd_Argv(1)); return; } if (!UI_NodeInstanceOf(node, "vscrollbar")) { Com_Printf("UI_ActiveVScrollbarNode_f: node '%s' is not a 'vscrollbar'\n", Cmd_Argv(1)); return; } actionId = atoi(Cmd_Argv(2)); UI_VScrollbarNodeAction(node, actionId, qfalse); }
/** * @brief set a node property from the command line * @todo Unify path syntaxe to allow to create a common autocompletion */ static void UI_NodeSetProperty_f (void) { uiNode_t* node; const value_t* property; if (Cmd_Argc() != 4) { Com_Printf("Usage: %s <nodepath> <prop> <value>\n", Cmd_Argv(0)); return; } node = UI_GetNodeByPath(Cmd_Argv(1)); if (!node) { Com_Printf("UI_NodeSetProperty_f: Node '%s' not found\n", Cmd_Argv(1)); return; } property = UI_GetPropertyFromBehaviour(node->behaviour, Cmd_Argv(2)); if (!property) { Com_Printf("Property '%s@%s' doesn't exist\n", UI_GetPath(node), Cmd_Argv(2)); return; } UI_NodeSetProperty(node, property, Cmd_Argv(3)); }