static void OpenSelectorWindow(txt_dropdown_list_t *list) { txt_window_t *window; int i; // Open a simple window with no title bar or action buttons. window = TXT_NewWindow(NULL); TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, NULL); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL); // Position the window so that the currently selected item appears // over the top of the list widget. TXT_SetWindowPosition(window, TXT_HORIZ_LEFT, TXT_VERT_TOP, list->widget.x - 2, SelectorWindowY(list)); // Add a button to the window for each option in the list. for (i=0; i<list->num_values; ++i) { txt_button_t *button; callback_data_t *data; button = TXT_NewButton(list->values[i]); TXT_AddWidget(window, button); // Callback struct data = malloc(sizeof(callback_data_t)); data->list = list; data->window = window; data->item = i; // When the button is pressed, invoke the button press callback TXT_SignalConnect(button, "pressed", ItemSelected, data); // When the window is closed, free back the callback struct TXT_SignalConnect(window, "closed", FreeCallbackData, data); // Is this the currently-selected value? If so, select the button // in the window as the default. if (i == *list->variable) { TXT_SelectWidget(window, button); } } // Catch presses of escape in this window and close it. TXT_SetKeyListener(window, SelectorWindowListener, NULL); }
void JoinMultiGame(void) { txt_window_t *window; txt_table_t *gameopt_table; txt_table_t *serveropt_table; txt_inputbox_t *address_box; window = TXT_NewWindow("Join multiplayer game"); TXT_SetWindowHelpURL(window, MULTI_JOIN_HELP_URL); TXT_AddWidgets(window, gameopt_table = TXT_NewTable(2), TXT_NewSeparator("Server"), serveropt_table = TXT_NewTable(1), TXT_NewStrut(0, 1), TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), NULL); TXT_SetColumnWidths(gameopt_table, 12, 12); TXT_AddWidgets(gameopt_table, TXT_NewLabel("Game"), IWADSelector(), NULL); if (gamemission == hexen) { TXT_AddWidgets(gameopt_table, TXT_NewLabel("Character class "), TXT_NewDropdownList(&character_class, character_classes, 3), NULL); } TXT_AddWidgets(serveropt_table, TXT_NewHorizBox( TXT_NewLabel("Connect to address: "), address_box = TXT_NewInputBox(&connect_address, 30), NULL), TXT_NewButton2("Find server on Internet...", FindInternetServer, NULL), TXT_NewButton2("Find server on local network...", FindLANServer, NULL), NULL); TXT_SelectWidget(window, address_box); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, JoinGameAction()); }
int TXT_SelectWidget(TXT_UNCAST_ARG(table), TXT_UNCAST_ARG(widget)) { TXT_CAST_ARG(txt_table_t, table); TXT_CAST_ARG(txt_widget_t, widget); int i; for (i=0; i<table->num_widgets; ++i) { if (table->widgets[i] == NULL) { continue; } if (table->widgets[i] == widget) { // Found the item! Select it and return. table->selected_x = i % table->columns; table->selected_y = i / table->columns; return 1; } if (table->widgets[i]->widget_class == &txt_table_class) { // This item is a subtable. Recursively search this table. if (TXT_SelectWidget(table->widgets[i], widget)) { // Found it in the subtable. Select this subtable and return. table->selected_x = i % table->columns; table->selected_y = i / table->columns; return 1; } } } // Not found. return 0; }
void JoinMultiGame(void) { txt_window_t *window; txt_table_t *gameopt_table; txt_table_t *serveropt_table; txt_inputbox_t *address_box; window = TXT_NewWindow("Join multiplayer game"); TXT_AddWidgets(window, gameopt_table = TXT_NewTable(2), TXT_NewSeparator("Server"), serveropt_table = TXT_NewTable(2), TXT_NewStrut(0, 1), TXT_NewButton2("Add extra parameters...", OpenExtraParamsWindow, NULL), NULL); TXT_SetColumnWidths(gameopt_table, 12, 12); TXT_AddWidgets(gameopt_table, TXT_NewLabel("Game"), IWADSelector(), NULL); TXT_AddWidgets(serveropt_table, TXT_NewRadioButton("Connect to address:", &jointype, JOIN_ADDRESS), address_box = TXT_NewInputBox(&connect_address, 30), TXT_NewRadioButton("Auto-join LAN game", &jointype, JOIN_AUTO_LAN), NULL); TXT_SignalConnect(address_box, "changed", SelectAddressJoin, NULL); TXT_SelectWidget(window, address_box); TXT_SetWindowAction(window, TXT_HORIZ_CENTER, WadWindowAction()); TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, JoinGameAction()); }
static void LevelSelectDialog(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(user_data)) { txt_window_t *window; txt_table_t *table; txt_button_t *button; iwad_t *iwad; char buf[10]; int x, y; int l; int i; window = TXT_NewWindow("Select level"); table = TXT_NewTable(4); TXT_AddWidget(window, table); if (warptype == WARP_DOOM1) { // ExMy levels iwad = GetCurrentIWAD(); for (i=0; i<4 * 9; ++i) { x = (i % 4) + 1; y = (i / 4) + 1; // chex.wad only has E1M1-E1M5. if (iwad->mask == IWAD_CHEX && (x > 1 || y > 5)) { continue; } // doom1.wad only has E1 if (iwad->mask == IWAD_DOOM1 && x > 1) { continue; } sprintf(buf, " E%iM%i ", x, y); button = TXT_NewButton(buf); TXT_SignalConnect(button, "pressed", SetDoom1Warp, (void *) (x * 10 + y)); TXT_SignalConnect(button, "pressed", CloseLevelSelectDialog, window); TXT_AddWidget(table, button); if (warpepisode == x && warpmap == y) { TXT_SelectWidget(table, button); } } } else { for (i=0; i<32; ++i) { x = i % 4; y = i / 4; l = x * 8 + y + 1; sprintf(buf, " MAP%02i ", l); button = TXT_NewButton(buf); TXT_SignalConnect(button, "pressed", SetDoom2Warp, (void *) l); TXT_SignalConnect(button, "pressed", CloseLevelSelectDialog, window); TXT_AddWidget(table, button); if (warpmap == l) { TXT_SelectWidget(table, button); } } } }
static void LevelSelectDialog(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(user_data)) { txt_window_t *window; txt_button_t *button; const iwad_t *iwad; char buf[10]; int episodes; intptr_t x, y; intptr_t l; int i; window = TXT_NewWindow("Select level"); iwad = GetCurrentIWAD(); if (warptype == WARP_ExMy) { episodes = D_GetNumEpisodes(iwad->mission, iwad->mode); TXT_SetTableColumns(window, episodes); // ExMy levels for (y=1; y<10; ++y) { for (x=1; x<=episodes; ++x) { if (IsChexQuest(iwad) && (x > 1 || y > 5)) { continue; } if (!D_ValidEpisodeMap(iwad->mission, iwad->mode, x, y)) { TXT_AddWidget(window, NULL); continue; } M_snprintf(buf, sizeof(buf), " E%" PRIiPTR "M%" PRIiPTR " ", x, y); button = TXT_NewButton(buf); TXT_SignalConnect(button, "pressed", SetExMyWarp, (void *) (x * 10 + y)); TXT_SignalConnect(button, "pressed", CloseLevelSelectDialog, window); TXT_AddWidget(window, button); if (warpepisode == x && warpmap == y) { TXT_SelectWidget(window, button); } } } } else { TXT_SetTableColumns(window, 6); for (i=0; i<60; ++i) { x = i % 6; y = i / 6; l = x * 10 + y + 1; if (!D_ValidEpisodeMap(iwad->mission, iwad->mode, 1, l)) { TXT_AddWidget(window, NULL); continue; } M_snprintf(buf, sizeof(buf), " MAP%02" PRIiPTR " ", l); button = TXT_NewButton(buf); TXT_SignalConnect(button, "pressed", SetMAPxyWarp, (void *) l); TXT_SignalConnect(button, "pressed", CloseLevelSelectDialog, window); TXT_AddWidget(window, button); if (warpmap == l) { TXT_SelectWidget(window, button); } } } }