/** * @brief Handles selectboxes clicks */ static void UI_OptionTreeNodeClick (uiNode_t * node, int x, int y) { uiNode_t* option; int depth; if (UI_AbstractOptionGetCurrentValue(node) == NULL) return; /* select the right option */ option = UI_OptionTreeNodeGetOptionAtPosition(node, x, y, &depth); UI_NodeAbsoluteToRelativePos(node, &x, &y); /* extend/collapse*/ x -= depth * DEPTH_WIDTH; if (x >= 0 && x < COLLAPSEBUTTON_WIDTH) { if (option && option->firstChild) { OPTIONEXTRADATA(option).collapsed = !OPTIONEXTRADATA(option).collapsed; UI_OptionTreeNodeUpdateCache(node); } return; } /* update the status */ if (option) UI_AbstractOptionSetCurrentValue(node, OPTIONEXTRADATA(option).value); }
static void UI_OptionTreeSetSelectedValue (uiNode_t *node, const uiCallContext_t *context) { uiOptionIterator_t iterator; uiNode_t *option; uiNode_t *firstOption; const char* value; int pos, i; if (UI_GetParamNumber(context) != 1) { Com_Printf("UI_OptionTreeSetSelectedValue: Invalide number of param\n"); return; } value = UI_GetParam(context, 1); /* is the option exists */ firstOption = UI_OptionTreeNodeGetFirstOption(node); UI_InitOptionIteratorAtIndex(0, firstOption, &iterator); /** @todo merge that into the Init iterator function */ iterator.skipCollapsed = qfalse; option = UI_FindOptionByValue(&iterator, value); /* update the selection */ if (option) { UI_AbstractOptionSetCurrentValue(node, OPTIONEXTRADATA(option).value); } else { Com_Printf("UI_OptionTreeSetSelectedValue: Option value \"%s\" not found\n", value); return; } /* expend parents */ for (i = 0; i < iterator.depthPos; i++) OPTIONEXTRADATA(iterator.depthCache[i]).collapsed = qfalse; UI_OptionTreeNodeUpdateCache(node); UI_OptionTreeNodeUpdateScroll(node); /* fix scroll bar */ firstOption = UI_OptionTreeNodeGetFirstOption(node); UI_InitOptionIteratorAtIndex(0, firstOption, &iterator); pos = UI_FindOptionPosition(&iterator, option); if (pos == -1) return; if (pos < EXTRADATA(node).scrollY.viewPos || pos >= EXTRADATA(node).scrollY.viewPos + EXTRADATA(node).scrollY.viewSize) { qboolean updated; updated = UI_SetScroll(&EXTRADATA(node).scrollY, pos, -1, -1); if (updated && EXTRADATA(node).onViewChange) UI_ExecuteEventActions(node, EXTRADATA(node).onViewChange); } }
/** * @brief Return the first option of the node * @todo check versionId and update cached data, and fire events */ static uiNode_t* UI_OptionTreeNodeGetFirstOption (uiNode_t * node) { if (node->firstChild) { /** @todo FIXME it MUST be an option behaviour */ assert(node->firstChild->behaviour == ui_optionBehaviour); return node->firstChild; } else { const int v = UI_GetDataVersion(EXTRADATA(node).dataId); uiNode_t *option = UI_GetOption(EXTRADATA(node).dataId); if (v != EXTRADATA(node).versionId) { EXTRADATA(node).versionId = v; UI_OptionTreeNodeUpdateCache(node); } return option; } }
void uiOptionTreeNode::doLayout (uiNode_t *node) { UI_OptionTreeNodeUpdateCache(node); node->invalidated = false; }