UFO: Alien Invasion
Loading...
Searching...
No Matches
ui_data.cpp
Go to the documentation of this file.
1
4
5/*
6Copyright (C) 2002-2025 UFO: Alien Invasion.
7
8This program is free software; you can redistribute it and/or
9modify it under the terms of the GNU General Public License
10as published by the Free Software Foundation; either version 2
11of the License, or (at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16
17See the GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
23*/
24
25#include "../cl_shared.h"
26#include "../cl_language.h"
27#include "ui_main.h"
28#include "ui_internal.h"
29#include "ui_nodes.h"
30#include "node/ui_node_option.h"
31
32#include "../cl_language.h"
33
37static const char* const ui_sharedDataIDNames[] = {
38 "",
83
95};
97
102int UI_GetDataIDByName (const char* name)
103{
104 for (int num = 0; num < UI_MAX_DATAID; num++)
106 return num;
107
108 return -1;
109}
110
115void UI_RegisterText (int dataId, const char* text)
116{
117 UI_ResetData(dataId);
118
119 if (!text)
120 return;
121
122 ui_global.sharedData[dataId].type = UI_SHARED_TEXT;
123 ui_global.sharedData[dataId].data.text = text;
124 ui_global.sharedData[dataId].versionId++;
125}
126
132{
134 if (ui_global.sharedData[dataId].type == UI_SHARED_LINKEDLISTTEXT && ui_global.sharedData[dataId].data.linkedListText == text) {
135 ui_global.sharedData[dataId].versionId++;
136 return;
137 }
138 UI_ResetData(dataId);
139 ui_global.sharedData[dataId].type = UI_SHARED_LINKEDLISTTEXT;
140 ui_global.sharedData[dataId].data.linkedListText = text;
141 ui_global.sharedData[dataId].versionId++;
142}
143
144const char* UI_GetText (int textId)
145{
146 if (ui_global.sharedData[textId].type != UI_SHARED_TEXT)
147 return nullptr;
148 return CL_Translate(ui_global.sharedData[textId].data.text);
149}
150
151const char* UI_GetTextFromList (int textId, int line)
152{
153 if (ui_global.sharedData[textId].type != UI_SHARED_LINKEDLISTTEXT)
154 return nullptr;
155 linkedList_t* list = ui_global.sharedData[textId].data.linkedListText;
156 return static_cast<const char*>(LIST_GetByIdx(list, line));
157}
158
159int UI_GetDataVersion (int textId)
160{
161 return ui_global.sharedData[textId].versionId;
162}
163
172uiNode_t* UI_AddOption (uiNode_t** tree, const char* name, const char* label, const char* value)
173{
174 uiNode_t* last;
175 uiNode_t* option;
176 assert(tree != nullptr);
177
178 option = UI_AllocOptionNode(name, label, value);
179
180 /* append the option */
181 last = *tree;
182 if (last != nullptr) {
183 while (last->next)
184 last = last->next;
185 }
186
187 if (last)
188 last->next = option;
189 else
190 *tree = option;
191
192 return option;
193}
194
200static void UI_DeleteOption (uiNode_t* tree)
201{
202 while (tree) {
203 uiNode_t* del = tree;
204 tree = tree->next;
205 UI_DeleteNode(del);
206 }
207}
208
212void UI_ResetData (int dataId)
213{
214 assert(dataId < UI_MAX_DATAID);
215 assert(dataId >= 0);
216
217 switch (ui_global.sharedData[dataId].type) {
219 LIST_Delete(&ui_global.sharedData[dataId].data.linkedListText);
220 break;
221 case UI_SHARED_OPTION:
222 if (_Mem_AllocatedInPool(com_genericPool, ui_global.sharedData[dataId].data.option)) {
223 UI_DeleteOption(ui_global.sharedData[dataId].data.option);
224 }
225 break;
226 default:
227 break;
228 }
229
230 ui_global.sharedData[dataId].type = UI_SHARED_NONE;
231 ui_global.sharedData[dataId].data.text = nullptr;
232 ui_global.sharedData[dataId].versionId++;
233}
234
241{
242 uiNode_t* prev = *option;
243 uiNode_t* prevfind = nullptr;
244 uiNode_t* search = (*option)->next;
245 const char* label = CL_Translate(OPTIONEXTRADATA(*option).label);
246
247 /* search the smaller element */
248 while (search) {
249 const char* searchlabel = CL_Translate(OPTIONEXTRADATA(search).label);
250 if (strcmp(label, searchlabel) < 0) {
251 prevfind = prev;
252 label = searchlabel;
253 }
254 prev = search;
255 search = search->next;
256 }
257
258 /* remove the first element */
259 if (prevfind == nullptr) {
260 uiNode_t* tmp = *option;
261 *option = (*option)->next;
262 return tmp;
263 } else {
264 uiNode_t* tmp = prevfind->next;
265 prevfind->next = tmp->next;
266 return tmp;
267 }
268}
269
274{
275 uiNode_t* option;
276
277 /* unlink the unsorted list */
278 option = *first;
279 if (option == nullptr)
280 return;
281 *first = nullptr;
282
283 /* construct a sorted list */
284 while (option) {
285 uiNode_t* element;
286 element = UI_OptionNodeRemoveHigherOption(&option);
287 element->next = *first;
288 *first = element;
289 }
290}
291
297void UI_UpdateInvisOptions (uiNode_t* option, const linkedList_t* stringList)
298{
299 if (option == nullptr || stringList == nullptr)
300 return;
301
302 while (option) {
303 if (LIST_ContainsString(stringList, option->name))
304 option->invis = false;
305 else
306 option->invis = true;
307 option = option->next;
308 }
309}
310
311void UI_RegisterOption (int dataId, uiNode_t* option)
312{
314 if (ui_global.sharedData[dataId].type == UI_SHARED_OPTION && ui_global.sharedData[dataId].data.option == option) {
315 ui_global.sharedData[dataId].versionId++;
316 return;
317 }
318 UI_ResetData(dataId);
319 ui_global.sharedData[dataId].type = UI_SHARED_OPTION;
320 ui_global.sharedData[dataId].data.option = option;
321 ui_global.sharedData[dataId].versionId++;
322}
323
325{
326 if (ui_global.sharedData[dataId].type == UI_SHARED_OPTION) {
327 return ui_global.sharedData[dataId].data.option;
328 }
329 return nullptr;
330}
331
339{
340 while (option) {
341 assert(option->behaviour == ui_optionBehaviour);
342 if (option->invis) {
343 option = option->next;
344 continue;
345 }
346
347 /* we are on the right element */
348 if (index == 0) {
349 iterator->option = option;
350 return option;
351 }
352
353 /* not the parent */
354 index--;
355
356 if (OPTIONEXTRADATA(option).collapsed) {
357 option = option->next;
358 continue;
359 }
360
361 /* its a child */
362 if (index < OPTIONEXTRADATA(option).childCount) {
364 assert(false);
365 iterator->depthCache[iterator->depthPos] = option;
366 iterator->depthPos++;
367 return UI_FindOptionAtIndex(index, option->firstChild, iterator);
368 }
369 index -= OPTIONEXTRADATA(option).childCount;
370 option = option->next;
371 }
372
373 iterator->option = nullptr;
374 return nullptr;
375}
376
395 return UI_InitOptionIteratorAtIndex(index, option, iterator, true, true);
396}
397
417uiNode_t* UI_InitOptionIteratorAtIndex (int index, uiNode_t* option, uiOptionIterator_t* iterator, bool skipCollapsed, bool skipInvisible)
418{
419 assert(option == nullptr || option->behaviour == ui_optionBehaviour);
420 OBJZERO(*iterator);
421 iterator->skipCollapsed = skipCollapsed;
422 iterator->skipInvisible = skipInvisible;
423 return UI_FindOptionAtIndex(index, option, iterator);
424}
425
431{
432 uiNode_t* option;
433
434 option = iterator->option;
435 assert(iterator->depthPos < MAX_DEPTH_OPTIONITERATORCACHE);
436 iterator->depthCache[iterator->depthPos] = option;
437 iterator->depthPos++;
438
439 if (OPTIONEXTRADATA(option).collapsed && iterator->skipCollapsed)
440 option = nullptr;
441 else
442 option = option->firstChild;
443
444 while (true) {
445 while (option) {
446 if (!option->invis || !iterator->skipInvisible) {
447 iterator->option = option;
448 return option;
449 }
450 option = option->next;
451 }
452 if (iterator->depthPos == 0)
453 break;
454 iterator->depthPos--;
455 option = iterator->depthCache[iterator->depthPos]->next;
456 }
457
458 iterator->option = nullptr;
459 return nullptr;
460}
461
468uiNode_t* UI_FindOptionByValue (uiOptionIterator_t* iterator, const char* value)
469{
470 while (iterator->option) {
471 assert(iterator->option->behaviour == ui_optionBehaviour);
472 if (Q_streq(OPTIONEXTRADATA(iterator->option).value, value))
473 return iterator->option;
475 }
476 return nullptr;
477}
478
486{
487 int i = 0;
488 while (iterator->option) {
489 if (iterator->option == option)
490 return i;
491 i++;
493 }
494 return -1;
495}
496
502static void UI_ResetData_f (void)
503{
504 if (Cmd_Argc() == 2) {
505 const char* dataId = Cmd_Argv(1);
506 const int id = UI_GetDataIDByName(dataId);
507 if (id == -1)
508 Com_Printf("%s: invalid data ID: %s\n", Cmd_Argv(0), dataId);
509 else
510 UI_ResetData(id);
511 } else {
512 for (int i = 0; i < UI_MAX_DATAID; i++)
514 }
515}
516
521void UI_InitData (void)
522{
523 Cmd_AddCommand("ui_resetdata", UI_ResetData_f, "Resets memory and data used by a UI data id");
524}
const char * CL_Translate(const char *t)
Share stuff between the different cgame implementations.
const char * Cmd_Argv(int arg)
Returns a given argument.
Definition cmd.cpp:516
int Cmd_Argc(void)
Return the number of arguments of the current command. "command parameter" will result in a argc of 2...
Definition cmd.cpp:505
void Cmd_AddCommand(const char *cmdName, xcommand_t function, const char *desc)
Add a new command to the script interface.
Definition cmd.cpp:744
void Com_Printf(const char *const fmt,...)
Definition common.cpp:428
memPool_t * com_genericPool
Definition common.cpp:72
void LIST_Delete(linkedList_t **list)
Definition list.cpp:195
void * LIST_GetByIdx(linkedList_t *list, int index)
Get an entry of a linked list by its index in the list.
Definition list.cpp:362
const linkedList_t * LIST_ContainsString(const linkedList_t *list, const char *string)
Searches for the first occurrence of a given string.
Definition list.cpp:73
bool _Mem_AllocatedInPool(memPool_t *pool, const void *pointer)
Definition mem.cpp:486
QGL_EXTERN GLuint index
Definition r_gl.h:110
QGL_EXTERN GLint i
Definition r_gl.h:113
QGL_EXTERN GLuint GLsizei GLsizei GLint GLenum GLchar * name
Definition r_gl.h:110
#define Q_streq(a, b)
Definition shared.h:136
#define STRINGIFY(x)
Definition shared.h:89
#define OBJZERO(obj)
Definition shared.h:178
#define lengthof(x)
Definition shared.h:105
#define CASSERT(x)
Definition shared.h:107
Atomic structure used to define most of the UI.
Definition ui_nodes.h:80
uiNode_t * firstChild
Definition ui_nodes.h:89
bool invis
Definition ui_nodes.h:101
uiNode_t * next
Definition ui_nodes.h:91
uiBehaviour_t * behaviour
Definition ui_nodes.h:83
char name[MAX_VAR]
Definition ui_nodes.h:82
uiNode_t * option
Definition ui_data.h:60
uiNode_t * depthCache[MAX_DEPTH_OPTIONITERATORCACHE]
Definition ui_data.h:61
static void UI_DeleteOption(uiNode_t *tree)
Definition ui_data.cpp:200
uiNode_t * UI_InitOptionIteratorAtIndex(int index, uiNode_t *option, uiOptionIterator_t *iterator)
Init an option iterator at an index.
Definition ui_data.cpp:394
void UI_RegisterOption(int dataId, uiNode_t *option)
Definition ui_data.cpp:311
void UI_InitData(void)
Initialize console command about UI shared data.
Definition ui_data.cpp:521
void UI_UpdateInvisOptions(uiNode_t *option, const linkedList_t *stringList)
Unhide those options that are stored in the linked list and hide the others.
Definition ui_data.cpp:297
static uiNode_t * UI_FindOptionAtIndex(int index, uiNode_t *option, uiOptionIterator_t *iterator)
find an option why index (0 is the first option)
Definition ui_data.cpp:338
void UI_ResetData(int dataId)
Reset a shared data. Type became NONE and value became nullptr.
Definition ui_data.cpp:212
int UI_GetDataIDByName(const char *name)
Return a dataId by name.
Definition ui_data.cpp:102
uiNode_t * UI_GetOption(int dataId)
Definition ui_data.cpp:324
void UI_SortOptions(uiNode_t **first)
Sort options by alphabet.
Definition ui_data.cpp:273
static uiNode_t * UI_OptionNodeRemoveHigherOption(uiNode_t **option)
Remove the higher element (in alphabet) from a list.
Definition ui_data.cpp:240
int UI_FindOptionPosition(uiOptionIterator_t *iterator, const uiNode_t *option)
Find an option position from an option iterator.
Definition ui_data.cpp:485
static void UI_ResetData_f(void)
Resets the ui_global.sharedData pointers from a func node.
Definition ui_data.cpp:502
void UI_RegisterText(int dataId, const char *text)
share a text with a data id
Definition ui_data.cpp:115
void UI_RegisterLinkedListText(int dataId, linkedList_t *text)
share a linked list of text with a data id
Definition ui_data.cpp:131
const char * UI_GetText(int textId)
Definition ui_data.cpp:144
static const char *const ui_sharedDataIDNames[]
Definition ui_data.cpp:37
uiNode_t * UI_OptionIteratorNextOption(uiOptionIterator_t *iterator)
Find the next element from the iterator Iterator skipCollapsed and skipInvisible attribute can contro...
Definition ui_data.cpp:430
const char * UI_GetTextFromList(int textId, int line)
Definition ui_data.cpp:151
int UI_GetDataVersion(int textId)
Definition ui_data.cpp:159
uiNode_t * UI_AddOption(uiNode_t **tree, const char *name, const char *label, const char *value)
Append an option to an option list.
Definition ui_data.cpp:172
uiNode_t * UI_FindOptionByValue(uiOptionIterator_t *iterator, const char *value)
Find an option (and all his parents) by is value.
Definition ui_data.cpp:468
@ UI_SHARED_NONE
Definition ui_data.h:38
@ UI_SHARED_TEXT
Definition ui_data.h:39
@ UI_SHARED_LINKEDLISTTEXT
Definition ui_data.h:40
@ UI_SHARED_OPTION
Definition ui_data.h:41
#define MAX_DEPTH_OPTIONITERATORCACHE
Definition ui_data.h:57
@ TEXT_UFORECOVERY_NATIONS
Definition ui_dataids.h:62
@ TEXT_GENERIC
Definition ui_dataids.h:56
@ OPTION_TEAMDEFS
Definition ui_dataids.h:84
@ TEXT_MISSIONBRIEFING
Definition ui_dataids.h:71
@ TEXT_UFOPEDIA_MAIL
Definition ui_dataids.h:50
@ TEXT_UFOPEDIA_MAILHEADER
Definition ui_dataids.h:49
@ UI_MAX_DATAID
Definition ui_dataids.h:87
@ TEXT_PRODUCTION_QUEUED
Definition ui_dataids.h:46
@ TEXT_MOUSECURSOR_LEFT
Definition ui_dataids.h:60
@ TEXT_UFOPEDIA_REQUIREMENT
Definition ui_dataids.h:34
@ TEXT_AIRCRAFT_INFO
Definition ui_dataids.h:41
@ TEXT_MOUSECURSOR_TOP
Definition ui_dataids.h:58
@ TEXT_BASEDEFENCE_LIST
Definition ui_dataids.h:54
@ TEXT_MISSIONBRIEFING_VICTORY_CONDITIONS
Definition ui_dataids.h:73
@ TEXT_MATERIAL_STAGES
Definition ui_dataids.h:65
@ TEXT_AIRCRAFT_LIST
Definition ui_dataids.h:40
@ OPTION_UFOS
Definition ui_dataids.h:81
@ TEXT_LIST2
Definition ui_dataids.h:32
@ TEXT_AIREQUIP_1
Definition ui_dataids.h:52
@ TEXT_XVI
Definition ui_dataids.h:57
@ TEXT_LIST
Definition ui_dataids.h:31
@ TEXT_BUILDINGS
Definition ui_dataids.h:35
@ OPTION_VIDEO_RESOLUTIONS
Definition ui_dataids.h:77
@ OPTION_JOYSTICKS
Definition ui_dataids.h:76
@ TEXT_CHAT_WINDOW
Definition ui_dataids.h:51
@ TEXT_STANDARD
Definition ui_dataids.h:30
@ TEXT_MOUSECURSOR_RIGHT
Definition ui_dataids.h:45
@ TEXT_PRODUCTION_LIST
Definition ui_dataids.h:42
@ TEXT_UFOPEDIA
Definition ui_dataids.h:33
@ TEXT_PRODUCTION_INFO
Definition ui_dataids.h:44
@ TEXT_MISSIONBRIEFING_TITLE
Definition ui_dataids.h:72
@ TEXT_PRODUCTION_AMOUNT
Definition ui_dataids.h:43
@ TEXT_ITEMDESCRIPTION
Definition ui_dataids.h:70
@ TEXT_MOUSECURSOR_BOTTOM
Definition ui_dataids.h:59
@ TEXT_UFORECOVERY_CAPACITIES
Definition ui_dataids.h:64
@ TEXT_POPUP
Definition ui_dataids.h:38
@ TEXT_BUILDING_INFO
Definition ui_dataids.h:36
@ TEXT_IRCUSERS
Definition ui_dataids.h:67
@ TEXT_BASE_LIST
Definition ui_dataids.h:47
@ OPTION_SINGLEPLAYER_SKINS
Definition ui_dataids.h:78
@ OPTION_LANGUAGES
Definition ui_dataids.h:75
@ TEXT_MOUSECURSOR_PLAYERNAMES
Definition ui_dataids.h:48
@ TEXT_RESEARCH
Definition ui_dataids.h:37
@ OPTION_MULTIPLAYER_SKINS
Definition ui_dataids.h:79
@ TEXT_MULTIPLAYER_USERTEAM
Definition ui_dataids.h:69
@ TEXT_UFORECOVERY_UFOYARDS
Definition ui_dataids.h:63
@ TEXT_MULTIPLAYER_USERLIST
Definition ui_dataids.h:68
@ TEXT_AIREQUIP_2
Definition ui_dataids.h:53
@ TEXT_TIPOFTHEDAY
Definition ui_dataids.h:55
@ OPTION_BASELIST
Definition ui_dataids.h:83
@ TEXT_IRCCONTENT
Definition ui_dataids.h:66
@ TEXT_MESSAGEOPTIONS
Definition ui_dataids.h:61
@ TEXT_POPUP_INFO
Definition ui_dataids.h:39
@ OPTION_DROPSHIPS
Definition ui_dataids.h:82
@ OPTION_PRODUCTION_REQUIREMENTS
Definition ui_dataids.h:85
@ OPTION_UFOPEDIA
Definition ui_dataids.h:80
Internal data use by the UI package.
uiGlobal_t ui_global
Definition ui_main.cpp:38
const uiBehaviour_t * ui_optionBehaviour
uiNode_t * UI_AllocOptionNode(const char *name, const char *label, const char *value)
Initializes an option with a very little set of values.
#define OPTIONEXTRADATA(node)
void UI_DeleteNode(uiNode_t *node)
Definition ui_nodes.cpp:618