#ifndef GAME_CLIENT_COMPONENTS_MENUS_H
#define GAME_CLIENT_COMPONENTS_MENUS_H
#include
#include
#include
#include
// compnent to fetch keypresses, override all other input
class CMenusKeyBinder : public CComponent
{
public:
bool m_TakeKey;
bool m_GotKey;
IInput::CEvent m_Key;
CMenusKeyBinder();
virtual bool OnInput(IInput::CEvent Event);
};
class CMenus : public CComponent
{
static vec4 ms_GuiColor;
static vec4 ms_ColorTabbarInactiveOutgame;
static vec4 ms_ColorTabbarActiveOutgame;
static vec4 ms_ColorTabbarInactiveIngame;
static vec4 ms_ColorTabbarActiveIngame;
static vec4 ms_ColorTabbarInactive;
static vec4 ms_ColorTabbarActive;
vec4 ButtonColorMul(const void *pID);
int DoButton_DemoPlayer(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners);
int DoButton_SettingsTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoButton_CheckBox_Common(const void *pID, const char *pText, const char *pBoxText, const CUIRect *pRect);
int DoButton_CheckBox(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoButton_CheckBox_Number(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
/*static void ui_draw_menu_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
static void ui_draw_keyselect_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
static void ui_draw_menu_tab_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
static void ui_draw_settings_tab_button(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
*/
int DoButton_BrowseIcon(int Checked, const CUIRect *pRect);
int DoButton_GridHeader(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoButton_ListRow(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
//static void ui_draw_browse_icon(int what, const CUIRect *r);
//static void ui_draw_grid_header(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
/*static void ui_draw_checkbox_common(const void *id, const char *text, const char *boxtext, const CUIRect *r, const void *extra);
static void ui_draw_checkbox(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
static void ui_draw_checkbox_number(const void *id, const char *text, int checked, const CUIRect *r, const void *extra);
*/
int DoEditBox(void *pID, const CUIRect *pRect, char *pStr, unsigned StrSize, float FontSize, bool Hidden=false, int Corners=CUI::CORNER_ALL);
//static int ui_do_edit_box(void *id, const CUIRect *rect, char *str, unsigned str_size, float font_size, bool hidden=false);
float DoScrollbarV(const void *pID, const CUIRect *pRect, float Current);
float DoScrollbarH(const void *pID, const CUIRect *pRect, float Current);
void DoButton_KeySelect(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
int DoKeyReader(void *pID, const CUIRect *pRect, int Key);
//static int ui_do_key_reader(void *id, const CUIRect *rect, int key);
void UiDoGetButtons(int Start, int Stop, CUIRect View);
struct CListboxItem
{
int m_Visible;
int m_Selected;
CUIRect m_Rect;
CUIRect m_HitRect;
};
void UiDoListboxStart(void *pId, const CUIRect *pRect, float RowHeight, const char *pTitle, const char *pBottomText, int NumItems,
int ItemsPerRow, int SelectedIndex, float ScrollValue);
CListboxItem UiDoListboxNextItem(void *pID, bool Selected = false);
static CListboxItem UiDoListboxNextRow();
int UiDoListboxEnd(float *pScrollValue, bool *pItemActivated);
//static void demolist_listdir_callback(const char *name, int is_dir, void *user);
//static void demolist_list_callback(const CUIRect *rect, int index, void *user);
enum
{
POPUP_NONE=0,
POPUP_FIRST_LAUNCH,
POPUP_CONNECTING,
POPUP_MESSAGE,
POPUP_DISCONNECTED,
POPUP_PURE,
POPUP_PASSWORD,
POPUP_QUIT,
};
enum
{
PAGE_NEWS=1,
PAGE_GAME,
PAGE_SERVER_INFO,
PAGE_CALLVOTE,
PAGE_INTERNET,
PAGE_LAN,
PAGE_FAVORITES,
PAGE_DEMOS,
PAGE_SETTINGS,
PAGE_SYSTEM,
};
int m_GamePage;
int m_Popup;
int m_ActivePage;
bool m_MenuActive;
bool m_UseMouseButtons;
vec2 m_MousePos;
int64 m_LastInput;
//
char m_aMessageTopic[512];
char m_aMessageBody[512];
char m_aMessageButton[512];
void PopupMessage(const char *pTopic, const char *pBody, const char *pButton);
// TODO: this is a bit ugly but.. well.. yeah
enum { MAX_INPUTEVENTS = 32 };
static IInput::CEvent m_aInputEvents[MAX_INPUTEVENTS];
static int m_NumInputEvents;
// some settings
static float ms_ButtonHeight;
static float ms_ListheaderHeight;
static float ms_FontmodHeight;
// for graphic settings
bool m_NeedRestart;
bool m_NeedSendinfo;
//
bool m_EscapePressed;
bool m_EnterPressed;
// for call vote
int m_CallvoteSelectedOption;
int m_CallvoteSelectedPlayer;
// demo
struct CDemoItem
{
char m_aFilename[512];
char m_aName[256];
bool operator<(const CDemoItem &Other) { return str_comp(m_aName, Other.m_aName) < 0; }
};
sorted_array m_lDemos;
void DemolistPopulate();
static void DemolistCountCallback(const char *pName, int IsDir, void *pUser);
static void DemolistFetchCallback(const char *pName, int IsDir, void *pUser);
// found in menus.cpp
int Render();
//void render_background();
//void render_loading(float percent);
int RenderMenubar(CUIRect r);
void RenderNews(CUIRect MainView);
// found in menus_demo.cpp
void RenderDemoPlayer(CUIRect MainView);
void RenderDemoList(CUIRect MainView);
// found in menus_ingame.cpp
void RenderGame(CUIRect MainView);
void RenderServerInfo(CUIRect MainView);
void RenderServerControl(CUIRect MainView);
void RenderServerControlKick(CUIRect MainView);
void RenderServerControlServer(CUIRect MainView);
// found in menus_browser.cpp
int m_SelectedIndex;
void RenderServerbrowserServerList(CUIRect View);
void RenderServerbrowserServerDetail(CUIRect View);
void RenderServerbrowserFilters(CUIRect View);
void RenderServerbrowser(CUIRect MainView);
// found in menus_settings.cpp
void RenderSettingsGeneral(CUIRect MainView);
void RenderSettingsPlayer(CUIRect MainView);
void RenderSettingsControls(CUIRect MainView);
void RenderSettingsGraphics(CUIRect MainView);
void RenderSettingsSound(CUIRect MainView);
void RenderSettings(CUIRect MainView);
void SetActive(bool Active);
public:
void RenderBackground();
void UseMouseButtons(bool Use) { m_UseMouseButtons = Use; }
static CMenusKeyBinder m_Binder;
CMenus();
void RenderLoading(float Percent);
bool IsActive() const { return m_MenuActive; }
virtual void OnInit();
virtual void OnStateChange(int NewState, int OldState);
virtual void OnReset();
virtual void OnRender();
virtual bool OnInput(IInput::CEvent Event);
virtual bool OnMouseMove(float x, float y);
};
#endif