/* Copyright (C) 1997-2001 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __QMENU_H__ #define __QMENU_H__ #include "config.h" #include "q_shared.h" #include "q_list.h" #include "q_field.h" #include "q_uis.h" #include "com_public.h" #include "ref_public.h" #include "key_public.h" #include "snd_public.h" #include "cl_public.h" #include "ui_public.h" #define UI_Malloc( size ) com.TagMalloc( size, TAG_UI ) #define MAXMENUITEMS 64 #define MTYPE_BAD 0 #define MTYPE_SLIDER 1 #define MTYPE_LIST 2 #define MTYPE_ACTION 3 #define MTYPE_SPINCONTROL 4 #define MTYPE_SEPARATOR 5 #define MTYPE_FIELD 6 #define MTYPE_BITMAP 7 #define MTYPE_IMAGELIST 8 #define MTYPE_STATIC 9 #define MTYPE_KEYBIND 10 #define QMF_LEFT_JUSTIFY 0x00000001 #define QMF_GRAYED 0x00000002 #define QMF_NUMBERSONLY 0x00000004 #define QMF_HASFOCUS 0x00000008 #define QMF_HIDDEN 0x00000010 #define QMF_DISABLED 0x00000020 #define QMF_CUSTOM_COLOR 0x00000040 #define ID_MENU -1 #define QM_GOTFOCUS 1 #define QM_LOSTFOCUS 2 #define QM_ACTIVATE 3 #define QM_CHANGE 4 #define QM_KEY 5 #define QM_CHAR 6 #define QM_MOUSE 7 #define QM_DESTROY 8 #define QM_DESTROY_CHILD 9 #define QM_SIZE 10 #define QM_SORT 11 #define QMS_NOTHANDLED 0 #define QMS_SILENT 1 #define QMS_IN 2 #define QMS_MOVE 3 #define QMS_OUT 4 #define QMS_BEEP 5 #define RCOLUMN_OFFSET 16 #define LCOLUMN_OFFSET -16 #define MENU_SPACING 12 #define DOUBLE_CLICK_DELAY 300 #define UI_IsItemSelectable( item ) \ ( (item)->type != MTYPE_SEPARATOR && \ (item)->type != MTYPE_STATIC && \ !( (item)->flags & (QMF_GRAYED|QMF_HIDDEN|QMF_DISABLED) ) ) typedef struct menuFrameWork_s { char *banner, *statusbar; int nitems; void *items[MAXMENUITEMS]; qboolean transparent; qboolean keywait; void (*draw)( struct menuFrameWork_s *self ); int (*callback)( int id, int msg, int param ); } menuFrameWork_t; typedef struct menuCommon_s { int type; int id; const char *name; menuFrameWork_t *parent; color_t color; vrect_t rect; int x, y; int width, height; int flags; int uiFlags; } menuCommon_t; typedef struct menuField_s { menuCommon_t generic; inputField_t field; } menuField_t; typedef struct menuSlider_s { menuCommon_t generic; float minvalue; float maxvalue; float curvalue; float range; } menuSlider_t; #define MAX_COLUMNS 8 #define MLIST_SPACING 10 #define MLIST_BORDER_WIDTH 1 #define MLIST_SCROLLBAR_WIDTH 10 #define MLIST_PRESTEP 3 typedef enum menuListFlags_e { MLF_NOSELECT = ( 1 << 0 ), MLF_HIDE_SCROLLBAR = ( 1 << 1 ), MLF_HIDE_SCROLLBAR_EMPTY = ( 1 << 2 ), MLF_HIDE_BACKGROUND = ( 1 << 3 ), MLF_HIDE_HEADER = ( 1 << 4 ) } menuListFlags_t; typedef struct menuListColumn_s { char *name; int width; int uiFlags; } menuListColumn_t; typedef struct menuList_s { menuCommon_t generic; void **items; int numItems; int maxItems; menuListFlags_t mlFlags; int extrasize; int prestep; int curvalue; int clickTime; char scratch[8]; int scratchCount; int scratchTime; menuListColumn_t columns[MAX_COLUMNS]; int numcolumns; int sortdir, sortcol; } menuList_t; typedef struct imageList_s { menuCommon_t generic; const char *name; int prestep; int curvalue; const char **names; const qhandle_t *images; int clickTime; int numcolumns; int numRows; int imageWidth; int imageHeight; } imageList_t; typedef struct menuSpinControl_s { menuCommon_t generic; const char **itemnames; int numItems; int curvalue; } menuSpinControl_t; typedef struct menuAction_s { menuCommon_t generic; } menuAction_t; typedef struct menuSeparator_s { menuCommon_t generic; } menuSeparator_t; typedef struct menuBitmap_s { menuCommon_t generic; qhandle_t pic; const char *errorImage; } menuBitmap_t; typedef struct menuStatic_s { menuCommon_t generic; int maxChars; } menuStatic_t; typedef struct menuKeybind_s { menuCommon_t generic; char binding[32]; char altbinding[32]; } menuKeybind_t; #define MAX_PLAYERMODELS 32 typedef struct playerModelInfo_s { int nskins; char **skindisplaynames; char **weaponNames; int numWeapons; char directory[MAX_QPATH]; } playerModelInfo_t; void PlayerModel_Load( void ); void PlayerModel_Free( void ); #define MAX_MENU_DEPTH 8 typedef struct uiStatic_s { int realtime; glconfig_t glconfig; clipRect_t clipRect; int width, height; // scaled float scale; int menuDepth; menuFrameWork_t *layers[MAX_MENU_DEPTH]; menuFrameWork_t *activeMenu; int mouseCoords[2]; qboolean entersound; // play after drawing a frame, so caching // won't disrupt the sound qboolean transparent; int numPlayerModels; playerModelInfo_t pmi[MAX_PLAYERMODELS]; qhandle_t backgroundHandle; qhandle_t fontHandle; qhandle_t cursorHandle; int cursorWidth, cursorHeight; char m_demos_browse[MAX_OSPATH]; int m_demos_selection; } uiStatic_t; extern uiStatic_t uis; extern cvar_t *ui_debug; void UI_PushMenu( menuFrameWork_t *menu ); void UI_ForceMenuOff( void ); void UI_PopMenu( void ); qboolean UI_DoHitTest( void ); qboolean UI_CursorInRect( vrect_t *rect ); void *UI_FormatColumns( int extrasize, ... ) q_sentinel; char *UI_GetColumn( char *s, int n ); void UI_AddToServerList( const serverStatus_t *status ); char *UI_CopyString( const char *in ); void UI_DrawLoading( int realtime ); void UI_SetupDefaultBanner( menuStatic_t *banner, const char *name ); void UI_DrawString( int x, int y, const color_t color, int flags, const char *string ); void UI_DrawChar( int x, int y, int flags, int ch ); void UI_StringDimensions( vrect_t *rc, int flags, const char *string ); void Menu_Init( menuFrameWork_t *menu ); void Menu_Size( menuFrameWork_t *menu ); void Menu_Draw( menuFrameWork_t *menu ); void Menu_AddItem( menuFrameWork_t *menu, void *item ); int Menu_SelectItem( menuFrameWork_t *menu ); int Menu_SlideItem( menuFrameWork_t *menu, int dir ); int Menu_KeyEvent( menuCommon_t *item, int key ); int Menu_CharEvent( menuCommon_t *item, int key ); int Menu_MouseMove( menuCommon_t *item ); void Menu_SetFocus( menuCommon_t *item ); int Menu_AdjustCursor( menuFrameWork_t *menu, int dir ); menuCommon_t *Menu_ItemAtCursor( menuFrameWork_t *menu ); menuCommon_t *Menu_HitTest( menuFrameWork_t *menu ); void MenuList_Init( menuList_t *l ); void MenuList_SetValue( menuList_t *l, int value ); void MenuList_Sort( menuList_t *l, int offset, int (*cmpfunc)( const void *, const void * ) ); void SpinControl_Init( menuSpinControl_t *s ); void Bitmap_Init( menuBitmap_t *b ); void M_Menu_Error_f( comErrorType_t type, const char *text ); void M_Menu_Confirm_f( const char *text, void (*action)( qboolean yes ) ); void M_Menu_Main_f (void); void M_Menu_Game_f (void); void M_Menu_LoadGame_f (void); void M_Menu_SaveGame_f (void); void M_Menu_PlayerConfig_f (void); void M_Menu_DownloadOptions_f (void); void M_Menu_Credits_f( void ); void M_Menu_Multiplayer_f( void ); void M_Menu_JoinServer_f (void); void M_Menu_AddressBook_f( void ); void M_Menu_StartServer_f (void); void M_Menu_DMOptions_f (void); void M_Menu_Video_f (void); void M_Menu_Options_f (void); void M_Menu_Keys_f (void); void M_Menu_Weapons_f( void ); void M_Menu_Quit_f (void); void M_Menu_Demos_f( void ); void M_Menu_Credits( void ); void M_Menu_Network_f( void ); void M_Menu_Mods_f( void ); void M_Menu_Ingame_f( void ); #endif