void Script_SetMenuFocus(itemDef_t *item, qboolean *bAbort, char **args) { const char *name; if (String_Parse(args, &name)) { menuDef_t *focusMenu = Menus_FindByName(name); if (focusMenu && !(focusMenu->window.flags & WINDOW_HASFOCUS)) { Menu_ClearFocus(item->parent); focusMenu->window.flags |= WINDOW_HASFOCUS; } } }
static void JKG_Slice_Dialog_Show(const char *line1, const char *line2, const char *line3, int type, int dlgid) { menuDef_t *menu; sliceData.dlgActive = qtrue; if (line1) { Q_strncpyz(&sliceData.dlgText1[0], line1, 255); } else { sliceData.dlgText1[0] = 0; } if (line2) { Q_strncpyz(&sliceData.dlgText2[0], line2, 255); } else { sliceData.dlgText2[0] = 0; } if (line3) { Q_strncpyz(&sliceData.dlgText3[0], line3, 255); } else { sliceData.dlgText3[0] = 0; } sliceData.dlgType = type; sliceData.dlgid = dlgid; menu = Menus_FindByName("jkg_slice"); if (!menu) { return; } // First, disable all controls on the interface Menu_ItemDisable(menu, "grid", 1); Menu_ItemDisable(menu, "prog", 1); Menu_ItemDisable(menu, "btns", 1); Menu_ClearFocus(menu); Menu_ShowItemByName(menu, "dialog", qtrue); if (type == DLGTYPE_OK) { Menu_ShowItemByName(menu, "btn_dialogok", qtrue); } else if (type == DLGTYPE_YESNO) { Menu_ShowItemByName(menu, "btn_dialogyesno", qtrue); } }
static void JKG_Slice_Dialog_Close() { menuDef_t *menu; sliceData.dlgActive = 0; menu = Menus_FindByName("jkg_slice"); if (!menu) { return; } Menu_ShowItemByName(menu, "dialog", qfalse); Menu_ShowItemByName(menu, "btn_dialogok", qfalse); Menu_ShowItemByName(menu, "btn_dialogyesno", qfalse); Menu_ItemDisable(menu, "grid", 0); Menu_ItemDisable(menu, "prog", 0); Menu_ItemDisable(menu, "btns", 0); Menu_ClearFocus(menu); }
void Script_SetEditFocus(itemDef_t *item, qboolean *bAbort, char **args) { const char *name = NULL; if (String_Parse(args, &name)) { itemDef_t *editItem = Menu_FindItemByName(item->parent, name); if (editItem && TEXTFIELD(editItem->type)) { editFieldDef_t *editPtr = (editFieldDef_t *)editItem->typeData; Menu_ClearFocus(item->parent); editItem->window.flags |= WINDOW_HASFOCUS; if (editItem->onFocus) { Item_RunScript(editItem, NULL, editItem->onFocus); } if (DC->Assets.itemFocusSound) { DC->startLocalSound(DC->Assets.itemFocusSound, CHAN_LOCAL_SOUND); } // reset scroll offset so we can see what we're editing if (editPtr) { editPtr->paintOffset = 0; } DC->setCVar(EDITFIELD_TEMP_CVAR, ""); editItem->cursorPos = 0; g_editingField = qtrue; g_editItem = editItem; // the stupidest idea ever, let's just override the console, every ui element, user choice, etc // nuking this //DC->setOverstrikeMode(qtrue); } } }
void Menus_CloseByName(const char *p) { menuDef_t *menu = Menus_FindByName(p); if (menu != NULL) { int i; // Gordon: make sure no edit fields are left hanging for (i = 0; i < menu->itemCount; i++) { if (g_editItem == menu->items[i]) { g_editingField = qfalse; g_editItem = NULL; } } menu->cursorItem = -1; Menu_ClearFocus(menu); Menu_RunCloseScript(menu); menu->window.flags &= ~(WINDOW_VISIBLE | WINDOW_HASFOCUS | WINDOW_MOUSEOVER); if (menu->window.flags & WINDOW_MODAL) { if (modalMenuCount <= 0) { Com_Printf(S_COLOR_YELLOW "WARNING: tried closing a modal window with an empty modal stack!\n"); } else { modalMenuCount--; // if modal doesn't have a parent, the stack item may be NULL .. just go back to the main menu then if (modalMenuStack[modalMenuCount]) { Menus_ActivateByName(modalMenuStack[modalMenuCount]->window.name, qfalse); // don't try to push the one we are opening to the stack } } } } }
static void PartyMngt_Dialog_Close() { menuDef_t *menu; PDlgData.InUse = 0; menu = Menus_FindByName("jkg_partymanagement"); if (!menu) { return; } Menu_ShowItemByName(menu, "dialog", qfalse); Menu_ShowItemByName(menu, "btn_dialogok", qfalse); Menu_ShowItemByName(menu, "btn_dialogyesno", qfalse); Menu_ShowItemByName(menu, "btn_dialogtext", qfalse); Menu_ItemDisable(menu, "list", 0); Menu_ItemDisable(menu, "btn_noparty", 0); Menu_ItemDisable(menu, "btn_inparty", 0); Menu_ItemDisable(menu, "btn_inpartylead", 0); Menu_ItemDisable(menu, "btn_bottom", 0); Menu_ClearFocus(menu); }
void Script_SetFocus(itemDef_t *item, qboolean *bAbort, char **args) { const char *name = NULL; if (String_Parse(args, &name)) { itemDef_t *focusItem = Menu_FindItemByName(item->parent, name); if (focusItem && !(focusItem->window.flags & WINDOW_DECORATION) && !(focusItem->window.flags & WINDOW_HASFOCUS)) { Menu_ClearFocus(item->parent); focusItem->window.flags |= WINDOW_HASFOCUS; if (focusItem->onFocus) { Item_RunScript(focusItem, NULL, focusItem->onFocus); } if (DC->Assets.itemFocusSound) { DC->startLocalSound(DC->Assets.itemFocusSound, CHAN_LOCAL_SOUND); } } } }
static void PartyMngt_Dialog_Show(const char *line1, const char *line2, const char *line3, int type, PDlgCallback callback) { menuDef_t *menu; itemDef_t *item; if (!callback) { return; } PDlgData.InUse = 1; if (line1) { Q_strncpyz(&PDlgData.line1[0], line1, 255); } else { PDlgData.line1[0] = 0; } if (line2) { Q_strncpyz(&PDlgData.line2[0], line2, 255); } else { PDlgData.line2[0] = 0; } if (line3) { Q_strncpyz(&PDlgData.line3[0], line3, 255); } else { PDlgData.line3[0] = 0; } PDlgData.type = type; PDlgData.callback = callback; menu = Menus_FindByName("jkg_partymanagement"); if (!menu) { return; } // First, disable all controls on the interface Menu_ItemDisable(menu, "list", 1); Menu_ItemDisable(menu, "btn_noparty", 1); Menu_ItemDisable(menu, "btn_inparty", 1); Menu_ItemDisable(menu, "btn_inpartylead", 1); Menu_ItemDisable(menu, "btn_bottom", 1); Menu_ClearFocus(menu); Menu_ShowItemByName(menu, "dialog", qtrue); if (type == PDLG_OK) { Menu_ShowItemByName(menu, "btn_dialogok", qtrue); } else if (type == PDLG_YESNO) { Menu_ShowItemByName(menu, "btn_dialogyesno", qtrue); } else if (type == PDLG_TEXT) { Menu_ShowItemByName(menu, "btn_dialogtext", qtrue); // Clear the text item = Menu_FindItemByName(menu, "dlg_textentry"); if (item) { item->typeData.edit->buffer[0] = 0; item->cursorPos = 0; Menu_SetTextFieldFocus(item); } } else { // Invalid dialog type! assert(0); } }
void Script_ClearFocus(itemDef_t *item, qboolean *bAbort, char **args) { Menu_ClearFocus(item->parent); }
// Message Processor void JKG_Slice_ProcessCommand_f(void) { char arg[1024] = {0}; char data[840]; int len; int i, row, col; sfxHandle_t sfx; bitstream_t stream; trap->Cmd_Argv(1, arg, 1024); len = Base128_DecodeLength(strlen(arg)); Base128_Decode(arg, strlen(arg), data, 840); BitStream_Init(&stream, (unsigned char *)data, len); BitStream_BeginReading(&stream); for (;;) { switch (BitStream_ReadBits(&stream, 4)) // Get the next instruction { case SLICECMD_EOM: // End of message return; case SLICECMD_START: // Reset data memset(&sliceData, 0, sizeof(sliceData)); sliceData.active = qtrue; // Bring up UI trap->Cvar_Set("ui_hidehud", "1"); Menus_CloseAll(); if (Menus_ActivateByName("jkg_slice")) { trap->Key_SetCatcher( trap->Key_GetCatcher() | KEYCATCH_UI & ~KEYCATCH_CONSOLE ); } Menu_ClearFocus(Menus_FindByName("jkg_slice")); // Field is locked until all data is available sliceData.fieldLocked = qtrue; break; case SLICECMD_STOP: // End the slicing minigame sliceData.active = qfalse; Menus_CloseByName("jkg_slice"); trap->Cvar_Set("ui_hidehud", "0"); trap->Key_SetCatcher( trap->Key_GetCatcher() & ~KEYCATCH_UI ); break; case SLICECMD_CONFIG: // Receive configuration sliceData.width = BitStream_ReadBits(&stream, 3) + 1; sliceData.height = BitStream_ReadBits(&stream, 3) + 1; sliceData.securityLevels = BitStream_ReadBits(&stream, 3); sliceData.warningThreshold = BitStream_ReadBits(&stream, 5); sliceData.intrusionDetection = BitStream_ReadBool(&stream); if (sliceData.intrusionDetection) { sliceData.intrusionTime = BitStream_ReadByte(&stream) * 10; } else { sliceData.intrusionTime = 0; } sliceData.intrusionStart = 0; break; case SLICECMD_REVEAL: row = BitStream_ReadBits(&stream, 3); col = BitStream_ReadBits(&stream, 3); sliceData.grid[row][col].active = 1; sliceData.grid[row][col].revealTime = trap->Milliseconds(); sliceData.grid[row][col].type = BitStream_ReadBits(&stream, 3); break; case SLICECMD_LOCK: if (BitStream_ReadBool(&stream)) { sliceData.fieldLocked = qtrue; } else { sliceData.fieldLocked = qfalse; } break; case SLICECMD_PROGLST: JKG_Slice_ProgramListReset(); sliceData.selectedProgram = -1; sliceData.programCount = BitStream_ReadBits(&stream, 4); for (i = 0; i < sliceData.programCount; i++) { Q_strncpyz(sliceData.programs[i].ID, BitStream_ReadStringBuffered(&stream), sizeof(sliceData.programs[i].ID)); Q_strncpyz(sliceData.programs[i].name, BitStream_ReadStringBuffered(&stream), sizeof(sliceData.programs[i].name)); Q_strncpyz(sliceData.programs[i].desc, BitStream_ReadStringBuffered(&stream), sizeof(sliceData.programs[i].desc)); sliceData.programs[i].type = BitStream_ReadBits(&stream, 2); } break; case SLICECMD_SHOWMSG: { int mode = BitStream_ReadBits(&stream, 2); char buffer[3][256]; BitStream_ReadString(&stream, buffer[0], 256); BitStream_ReadString(&stream, buffer[1], 256); BitStream_ReadString(&stream, buffer[2], 256); JKG_Slice_Dialog_Show(buffer[0], buffer[1], buffer[2], mode, DLGID_SERVER); } break; case SLICECMD_ENDMSG: JKG_Slice_Dialog_Close(); break; case SLICECMD_SUMMARY: // Process column summaries for (i=0; i < sliceData.width; i++) { sliceData.summaries[i].value = BitStream_ReadBits(&stream, 6); sliceData.summaries[i].alarms = BitStream_ReadBits(&stream, 4); } // Process row summaries for (i=0; i < sliceData.height; i++) { sliceData.summaries[8+i].value = BitStream_ReadBits(&stream, 6); sliceData.summaries[8+i].alarms = BitStream_ReadBits(&stream, 4); } sliceData.summariesKnown = qtrue; break; case SLICECMD_SECUPDATE: for (i = 0; i < sliceData.securityLevels; i++) { sliceData.securityState[i] = BitStream_ReadBits(&stream, 2); } break; case SLICECMD_INTRUSION: // TODO: Play sound effect? sliceData.intrusionState = BitStream_ReadBits(&stream, 2); if (sliceData.intrusionState == 1) { sliceData.intrusionStart = trap->Milliseconds(); } else { sliceData.intrusionStart = 0; } break; case SLICECMD_WARNLEVEL: sliceData.warningLevel = BitStream_ReadBits(&stream, 5); break; case SLICECMD_BLINKNODE: row = BitStream_ReadBits(&stream, 3); col = BitStream_ReadBits(&stream, 3); sliceData.grid[row][col].blinkTime = trap->Milliseconds(); sliceData.grid[row][col].blinkColor = BitStream_ReadBool(&stream); break; case SLICECMD_INITFIELD: // Ready to play sliceData.fieldLocked = qfalse; break; case SLICECMD_ALARM: sfx = trap->S_RegisterSound("sound/effects/mpalarm.wav"); trap->S_StartLocalSound(sfx, CHAN_AUTO); break; default: Com_Printf("Error processing slice command, unknown command ID\n"); return; } } }