mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-17 09:51:26 +00:00
165a980065
- fixed: It is a bad idea to start a save within an MKEY_Input event. At this time the window chain is not stable because the text input screen is in the middle of being taken down, so the save should be deferred until the next Ticker call of the SaveMenu.
306 lines
No EOL
7.4 KiB
Text
306 lines
No EOL
7.4 KiB
Text
|
|
struct KeyBindings native
|
|
{
|
|
native static String NameKeys(int k1, int k2);
|
|
|
|
native int, int GetKeysForCommand(String cmd);
|
|
native void SetBind(int key, String cmd);
|
|
native void UnbindACommand (String str);
|
|
}
|
|
|
|
struct OptionValues native
|
|
{
|
|
native static int GetCount(Name group);
|
|
native static String GetText(Name group, int index);
|
|
native static double GetValue(Name group, int index);
|
|
native static String GetTextValue(Name group, int index);
|
|
}
|
|
|
|
struct JoystickConfig native
|
|
{
|
|
enum EJoyAxis
|
|
{
|
|
JOYAXIS_None = -1,
|
|
JOYAXIS_Yaw,
|
|
JOYAXIS_Pitch,
|
|
JOYAXIS_Forward,
|
|
JOYAXIS_Side,
|
|
JOYAXIS_Up,
|
|
// JOYAXIS_Roll, // Ha ha. No roll for you.
|
|
NUM_JOYAXIS,
|
|
};
|
|
|
|
native float GetSensitivity();
|
|
native void SetSensitivity(float scale);
|
|
|
|
native float GetAxisScale(int axis);
|
|
native void SetAxisScale(int axis, float scale);
|
|
|
|
native float GetAxisDeadZone(int axis);
|
|
native void SetAxisDeadZone(int axis, float zone);
|
|
|
|
native int GetAxisMap(int axis);
|
|
native void SetAxisMap(int axis, int gameaxis);
|
|
|
|
native String GetName();
|
|
native int GetNumAxes();
|
|
native String GetAxisName(int axis);
|
|
|
|
}
|
|
|
|
class Menu : Object native
|
|
{
|
|
enum EMenuKey
|
|
{
|
|
MKEY_Up,
|
|
MKEY_Down,
|
|
MKEY_Left,
|
|
MKEY_Right,
|
|
MKEY_PageUp,
|
|
MKEY_PageDown,
|
|
MKEY_Enter,
|
|
MKEY_Back,
|
|
MKEY_Clear,
|
|
NUM_MKEYS,
|
|
|
|
// These are not buttons but events sent from other menus
|
|
|
|
MKEY_Input,
|
|
MKEY_Abort,
|
|
MKEY_MBYes,
|
|
MKEY_MBNo,
|
|
}
|
|
|
|
enum EMenuMouse
|
|
{
|
|
MOUSE_Click,
|
|
MOUSE_Move,
|
|
MOUSE_Release
|
|
};
|
|
|
|
enum EMenuState
|
|
{
|
|
Off, // Menu is closed
|
|
On, // Menu is opened
|
|
WaitKey, // Menu is opened and waiting for a key in the controls menu
|
|
OnNoPause, // Menu is opened but does not pause the game
|
|
};
|
|
|
|
native Menu mParentMenu;
|
|
native bool mMouseCapture;
|
|
native bool mBackbuttonSelected;
|
|
native bool DontDim;
|
|
|
|
native static int MenuTime();
|
|
native static void SetVideoMode();
|
|
native static Menu GetCurrentMenu();
|
|
native static void SetMenu(Name mnu, int param = 0);
|
|
native static void StartMessage(String msg, int mode = 0, Name command = 'none');
|
|
native static void SetMouseCapture(bool on);
|
|
native void Close();
|
|
native void ActivateMenu();
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
void Init(Menu parent)
|
|
{
|
|
mParentMenu = parent;
|
|
mMouseCapture = false;
|
|
mBackbuttonSelected = false;
|
|
DontDim = false;
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
virtual bool MenuEvent (int mkey, bool fromcontroller)
|
|
{
|
|
switch (mkey)
|
|
{
|
|
case MKEY_Back:
|
|
Close();
|
|
MenuSound (GetCurrentMenu() != null? "menu/backup" : "menu/clear");
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
protected bool MouseEventBack(int type, int x, int y)
|
|
{
|
|
if (m_show_backbutton >= 0)
|
|
{
|
|
let tex = TexMan.CheckForTexture(gameinfo.mBackButton, TexMan.Type_MiscPatch);
|
|
if (tex.IsValid())
|
|
{
|
|
Vector2 v = TexMan.GetScaledSize(tex);
|
|
int w = int(v.X + 0.5) * CleanXfac;
|
|
int h = int(v.Y + 0.5) * CleanYfac;
|
|
if (m_show_backbutton&1) x -= screen.GetWidth() - w;
|
|
if (m_show_backbutton&2) y -= screen.GetHeight() - h;
|
|
mBackbuttonSelected = ( x >= 0 && x < w && y >= 0 && y < h);
|
|
if (mBackbuttonSelected && type == MOUSE_Release)
|
|
{
|
|
if (m_use_mouse == 2) mBackbuttonSelected = false;
|
|
MenuEvent(MKEY_Back, true);
|
|
}
|
|
return mBackbuttonSelected;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
virtual bool Responder(InputEventData ev)
|
|
{
|
|
bool res = false;
|
|
if (ev.type == InputEventData.GUI_Event)
|
|
{
|
|
if (ev.subtype == InputEventData.GUI_LButtonDown)
|
|
{
|
|
res = MouseEventBack(MOUSE_Click, ev.data1, ev.data2);
|
|
// make the menu's mouse handler believe that the current coordinate is outside the valid range
|
|
if (res) ev.data2 = -1;
|
|
res |= MouseEvent(MOUSE_Click, ev.data1, ev.data2);
|
|
if (res)
|
|
{
|
|
SetCapture(true);
|
|
}
|
|
|
|
}
|
|
else if (ev.subtype == InputEventData.GUI_MouseMove)
|
|
{
|
|
BackbuttonTime = 4*Thinker.TICRATE;
|
|
if (mMouseCapture || m_use_mouse == 1)
|
|
{
|
|
res = MouseEventBack(MOUSE_Move, ev.data1, ev.data2);
|
|
if (res) ev.data2 = -1;
|
|
res |= MouseEvent(MOUSE_Move, ev.data1, ev.data2);
|
|
}
|
|
}
|
|
else if (ev.subtype == InputEventData.GUI_LButtonUp)
|
|
{
|
|
if (mMouseCapture)
|
|
{
|
|
SetCapture(false);
|
|
res = MouseEventBack(MOUSE_Release, ev.data1, ev.data2);
|
|
if (res) ev.data2 = -1;
|
|
res |= MouseEvent(MOUSE_Release, ev.data1, ev.data2);
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
virtual void Drawer ()
|
|
{
|
|
if (self == GetCurrentMenu() && BackbuttonAlpha > 0 && m_show_backbutton >= 0 && m_use_mouse)
|
|
{
|
|
let tex = TexMan.CheckForTexture(gameinfo.mBackButton, TexMan.Type_MiscPatch);
|
|
if (tex.IsValid())
|
|
{
|
|
Vector2 v = TexMan.GetScaledSize(tex);
|
|
int w = int(v.X + 0.5) * CleanXfac;
|
|
int h = int(v.Y + 0.5) * CleanYfac;
|
|
int x = (!(m_show_backbutton&1))? 0:screen.GetWidth() - w;
|
|
int y = (!(m_show_backbutton&2))? 0:screen.GetHeight() - h;
|
|
if (mBackbuttonSelected && (mMouseCapture || m_use_mouse == 1))
|
|
{
|
|
screen.DrawTexture(tex, true, x, y, DTA_CleanNoMove, true, DTA_ColorOverlay, Color(40, 255,255,255));
|
|
}
|
|
else
|
|
{
|
|
screen.DrawTexture(tex, true, x, y, DTA_CleanNoMove, true, DTA_Alpha, BackbuttonAlpha);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
void SetCapture(bool on)
|
|
{
|
|
if (mMouseCapture != on)
|
|
{
|
|
mMouseCapture = on;
|
|
SetMouseCapture(on);
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
virtual bool TranslateKeyboardEvents() { return true; }
|
|
virtual void SetFocus(MenuItemBase fc) {}
|
|
virtual bool CheckFocus(MenuItemBase fc) { return false; }
|
|
virtual void ReleaseFocus() {}
|
|
virtual void ResetColor() {}
|
|
virtual bool MouseEvent(int type, int mx, int my) { return true; }
|
|
virtual void Ticker() {}
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
static void MenuSound(Sound snd)
|
|
{
|
|
S_Sound (snd, CHAN_VOICE | CHAN_UI, snd_menuvolume, ATTN_NONE);
|
|
}
|
|
|
|
static void DrawConText (int color, int x, int y, String str)
|
|
{
|
|
screen.DrawText (ConFont, color, x, y, str, DTA_CellX, 8 * CleanXfac_1, DTA_CellY, 8 * CleanYfac_1);
|
|
}
|
|
|
|
}
|
|
|
|
class MenuDescriptor : Object native
|
|
{
|
|
native Name mMenuName;
|
|
native String mNetgameMessage;
|
|
native Class<Menu> mClass;
|
|
|
|
native static MenuDescriptor GetDescriptor(Name n);
|
|
}
|
|
|
|
// This class is only needed to give it a virtual Init method that doesn't belong to Menu itself
|
|
class GenericMenu : Menu
|
|
{
|
|
virtual void Init(Menu parent)
|
|
{
|
|
Super.Init(parent);
|
|
}
|
|
} |