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 Function for menu buttons to update message settings. * @sa MSO_Set * @todo move this into scripts */ static void MSO_Toggle_f (void) { if (cgi->Cmd_Argc() != 3) Com_Printf("Usage: %s <listId> <pause|notify|sound>\n", cgi->Cmd_Argv(0)); else { uiOptionIterator_t iterator; const int listIndex = atoi(cgi->Cmd_Argv(1)); int idx; const msgCategoryEntry_t* selectedEntry; int optionType; bool activate; int type; uiNode_t* messageSetting = cgi->UI_GetOption(TEXT_MESSAGEOPTIONS); UI_InitOptionIteratorAtIndex(messageList_scroll + listIndex, messageSetting, &iterator); if (!iterator.option) return; idx = atoi(OPTIONEXTRADATA(iterator.option).value); selectedEntry = &ccs.msgCategoryEntries[idx]; if (!selectedEntry) return; if (selectedEntry->isCategory) { Com_Printf("Toggle command with selected category entry ignored.\n"); return; } for (type = 0; type < NT_NUM_NOTIFYTYPE; type++) { if (Q_streq(nt_strings[type], selectedEntry->notifyType)) break; } if (type == NT_NUM_NOTIFYTYPE) { Com_Printf("Unrecognized messagetype during toggle '%s' ignored\n", selectedEntry->notifyType); return; } if (Q_streq(cgi->Cmd_Argv(2), "pause")) { optionType = MSO_PAUSE; activate = !selectedEntry->settings->doPause; } else if (Q_streq(cgi->Cmd_Argv(2), "notify")) { optionType = MSO_NOTIFY; activate = !selectedEntry->settings->doNotify; } else { optionType = MSO_SOUND; activate = !selectedEntry->settings->doSound; } MSO_Set(listIndex, (notify_t)type, optionType, activate, true); } }
static uiNode_t* UI_OptionTreeNodeGetOptionAtPosition (uiNode_t * node, int x, int y, int *depth) { uiNode_t* option; const char *font; int fontHeight; int count; uiOptionIterator_t iterator; UI_NodeAbsoluteToRelativePos(node, &x, &y); font = UI_GetFontFromNode(node); fontHeight = EXTRADATA(node).lineHeight; if (fontHeight == 0) fontHeight = UI_FontGetHeight(font); option = UI_OptionTreeNodeGetFirstOption(node); count = EXTRADATA(node).scrollY.viewPos + (y - node->padding) / fontHeight; option = UI_InitOptionIteratorAtIndex(count, option, &iterator); *depth = iterator.depthPos; return option; }
/** * @brief Executes confuncs to update visible message options lines. * @sa MSO_Init_f * @todo move this into scripts */ static void MSO_UpdateVisibleButtons (void) { int visible;/* current line */ uiOptionIterator_t iterator; uiNode_t* messageSetting = cgi->UI_GetOption(TEXT_MESSAGEOPTIONS); UI_InitOptionIteratorAtIndex(messageList_scroll, messageSetting, &iterator); /* update visible button lines based on current displayed values */ for (visible = 0; visible < messageList_size; visible++) { const uiNode_t* option = iterator.option; int idx; msgCategoryEntry_t* entry; if (!option) break; idx = atoi(OPTIONEXTRADATACONST(option).value); entry = &ccs.msgCategoryEntries[idx]; if (!entry) break; if (entry->isCategory) { /* category is visible anyway*/ cgi->UI_ExecuteConfunc("ms_disable %i", visible); } else { assert(entry->category); cgi->UI_ExecuteConfunc("ms_enable %i", visible); cgi->UI_ExecuteConfunc("ms_btnstate %i %i %i %i", visible, entry->settings->doPause, entry->settings->doNotify, entry->settings->doSound); } UI_OptionIteratorNextOption(&iterator); } for (; visible < messageList_size; visible++) cgi->UI_ExecuteConfunc("ms_disable %i", visible); }
/** * @brief Init an option iterator at an index * @note invis option are skipped, and child are counted * @param[in] index Requested index (0 is the first option) * @param[in] option First element of options (it can be a tree) * @param[out] iterator Initialised iterator * @return the first option element found (current position of the iterator) * @code * uiOptionIterator_t iterator; * UI_InitOptionIteratorAtIndex(index, firstOption, &iterator); // also return the option * while (iterator.option) { * ... * UI_OptionIteratorNextOption(&iterator); // also return the option * } * @endcode * @todo Rework that code, we should split "Init" and "AtIndex" */ uiNode_t* UI_InitOptionIteratorAtIndex(int index, uiNode_t* option, uiOptionIterator_t* iterator) { return UI_InitOptionIteratorAtIndex(index, option, iterator, true, true); }
static void UI_OptionTreeNodeDraw (uiNode_t *node) { static const int panelTemplate[] = { CORNER_SIZE, MID_SIZE, CORNER_SIZE, CORNER_SIZE, MID_SIZE, CORNER_SIZE, MARGE }; uiNode_t* option; const char *ref; const char *font; vec2_t pos; const char* image; int fontHeight; int currentY; int currentDecY = 0; const float *textColor; vec4_t disabledColor = {0.5, 0.5, 0.5, 1.0}; int count = 0; uiOptionIterator_t iterator; if (!systemExpand) systemExpand = UI_GetSpriteByName("icons/system_expand"); if (!systemCollapse) systemCollapse = UI_GetSpriteByName("icons/system_collapse"); ref = UI_AbstractOptionGetCurrentValue(node); if (ref == NULL) return; UI_GetNodeAbsPos(node, pos); image = UI_GetReferenceString(node, node->image); if (image) UI_DrawPanel(pos, node->size, image, 0, 0, panelTemplate); font = UI_GetFontFromNode(node); fontHeight = EXTRADATA(node).lineHeight; currentY = pos[1] + node->padding; if (fontHeight == 0) fontHeight = UI_FontGetHeight(font); else { const int height = UI_FontGetHeight(font); currentDecY = (fontHeight - height) / 2; } /* skip option over current position */ option = UI_OptionTreeNodeGetFirstOption(node); UI_OptionTreeNodeUpdateScroll(node); option = UI_InitOptionIteratorAtIndex(EXTRADATA(node).scrollY.viewPos, option, &iterator); /* draw all available options for this selectbox */ for (; option; option = UI_OptionIteratorNextOption(&iterator)) { int decX; const char *label; /* outside the node */ if (currentY + fontHeight > pos[1] + node->size[1] - node->padding) { count++; break; } /* draw the hover effect */ if (OPTIONEXTRADATA(option).hovered) UI_DrawFill(pos[0] + node->padding, currentY, node->size[0] - node->padding - node->padding, fontHeight, node->color); /* text color */ if (Q_streq(OPTIONEXTRADATA(option).value, ref)) { textColor = node->selectedColor; } else if (node->disabled || option->disabled) { textColor = disabledColor; } else if (option->color[3] == 0.0f) { textColor = node->color; } else { textColor = option->color; } /* print the option label */ decX = pos[0] + node->padding + iterator.depthPos * DEPTH_WIDTH; R_Color(NULL); if (option->firstChild) { uiSprite_t *icon = OPTIONEXTRADATA(option).collapsed ? systemExpand : systemCollapse; UI_DrawSpriteInBox(OPTIONEXTRADATA(option).flipIcon, icon, SPRITE_STATUS_NORMAL, decX, currentY, icon->size[0], fontHeight); } decX += COLLAPSEBUTTON_WIDTH; if (OPTIONEXTRADATA(option).icon) { uiSpriteStatus_t iconStatus = SPRITE_STATUS_NORMAL; if (option->disabled) iconStatus = SPRITE_STATUS_DISABLED; UI_DrawSpriteInBox(OPTIONEXTRADATA(option).flipIcon, OPTIONEXTRADATA(option).icon, iconStatus, decX, currentY, OPTIONEXTRADATA(option).icon->size[0], fontHeight); decX += OPTIONEXTRADATA(option).icon->size[0] + fontHeight / 4; } label = OPTIONEXTRADATA(option).label; if (label[0] == '_') label = _(label + 1); R_Color(textColor); UI_DrawString(font, ALIGN_UL, decX, currentY + currentDecY, pos[0], node->size[0] - node->padding - node->padding, 0, label, 0, 0, NULL, qfalse, LONGLINES_PRETTYCHOP); /* next entries' position */ currentY += fontHeight; count++; } R_Color(NULL); }