mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Allow binding with modifiers in settings
This commit is contained in:
parent
1da935f4c1
commit
66c89eafb2
|
@ -43,11 +43,11 @@ public:
|
||||||
void UnbindAll();
|
void UnbindAll();
|
||||||
const char *Get(int KeyID, int Modifier);
|
const char *Get(int KeyID, int Modifier);
|
||||||
void GetKey(const char *pBindStr, char *aBuf, unsigned BufSize);
|
void GetKey(const char *pBindStr, char *aBuf, unsigned BufSize);
|
||||||
int GetModifierMask(IInput *i);
|
|
||||||
int GetModifierMaskOfKey(int Key);
|
|
||||||
bool ModifierMatchesKey(int Modifier, int Key);
|
|
||||||
const char *GetModifierName(int Modifier);
|
|
||||||
int GetBindSlot(const char *pBindString, int *Modifier);
|
int GetBindSlot(const char *pBindString, int *Modifier);
|
||||||
|
static int GetModifierMask(IInput *i);
|
||||||
|
static int GetModifierMaskOfKey(int Key);
|
||||||
|
static bool ModifierMatchesKey(int Modifier, int Key);
|
||||||
|
static const char *GetModifierName(int Modifier);
|
||||||
|
|
||||||
virtual void OnConsoleInit();
|
virtual void OnConsoleInit();
|
||||||
virtual bool OnInput(IInput::CEvent Event);
|
virtual bool OnInput(IInput::CEvent Event);
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <game/generated/protocol.h>
|
#include <game/generated/protocol.h>
|
||||||
|
|
||||||
#include <game/generated/client_data.h>
|
#include <game/generated/client_data.h>
|
||||||
|
#include <game/client/components/binds.h>
|
||||||
#include <game/client/components/sounds.h>
|
#include <game/client/components/sounds.h>
|
||||||
#include <game/client/gameclient.h>
|
#include <game/client/gameclient.h>
|
||||||
#include <game/client/lineinput.h>
|
#include <game/client/lineinput.h>
|
||||||
|
@ -579,7 +580,7 @@ float CMenus::DoScrollbarH(const void *pID, const CUIRect *pRect, float Current)
|
||||||
return ReturnValue;
|
return ReturnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CMenus::DoKeyReader(void *pID, const CUIRect *pRect, int Key)
|
int CMenus::DoKeyReader(void *pID, const CUIRect *pRect, int Key, int Modifier, int *NewModifier)
|
||||||
{
|
{
|
||||||
// process
|
// process
|
||||||
static void *pGrabbedID = 0;
|
static void *pGrabbedID = 0;
|
||||||
|
@ -587,6 +588,7 @@ int CMenus::DoKeyReader(void *pID, const CUIRect *pRect, int Key)
|
||||||
static int ButtonUsed = 0;
|
static int ButtonUsed = 0;
|
||||||
int Inside = UI()->MouseInside(pRect);
|
int Inside = UI()->MouseInside(pRect);
|
||||||
int NewKey = Key;
|
int NewKey = Key;
|
||||||
|
*NewModifier = Modifier;
|
||||||
|
|
||||||
if(!UI()->MouseButton(0) && !UI()->MouseButton(1) && pGrabbedID == pID)
|
if(!UI()->MouseButton(0) && !UI()->MouseButton(1) && pGrabbedID == pID)
|
||||||
MouseReleased = true;
|
MouseReleased = true;
|
||||||
|
@ -597,7 +599,10 @@ int CMenus::DoKeyReader(void *pID, const CUIRect *pRect, int Key)
|
||||||
{
|
{
|
||||||
// abort with escape key
|
// abort with escape key
|
||||||
if(m_Binder.m_Key.m_Key != KEY_ESCAPE)
|
if(m_Binder.m_Key.m_Key != KEY_ESCAPE)
|
||||||
|
{
|
||||||
NewKey = m_Binder.m_Key.m_Key;
|
NewKey = m_Binder.m_Key.m_Key;
|
||||||
|
*NewModifier = m_Binder.m_Modifier;
|
||||||
|
}
|
||||||
m_Binder.m_GotKey = false;
|
m_Binder.m_GotKey = false;
|
||||||
UI()->SetActiveItem(0);
|
UI()->SetActiveItem(0);
|
||||||
MouseReleased = false;
|
MouseReleased = false;
|
||||||
|
@ -639,10 +644,18 @@ int CMenus::DoKeyReader(void *pID, const CUIRect *pRect, int Key)
|
||||||
DoButton_KeySelect(pID, "???", 0, pRect);
|
DoButton_KeySelect(pID, "???", 0, pRect);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(Key == 0)
|
if(Key)
|
||||||
DoButton_KeySelect(pID, "", 0, pRect);
|
{
|
||||||
|
char aBuf[64];
|
||||||
|
if(*NewModifier)
|
||||||
|
str_format(aBuf, sizeof(aBuf), "%s+%s", CBinds::GetModifierName(*NewModifier), Input()->KeyName(Key));
|
||||||
else
|
else
|
||||||
DoButton_KeySelect(pID, Input()->KeyName(Key), 0, pRect);
|
str_format(aBuf, sizeof(aBuf), "%s", Input()->KeyName(Key));
|
||||||
|
|
||||||
|
DoButton_KeySelect(pID, aBuf, 0, pRect);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DoButton_KeySelect(pID, "", 0, pRect);
|
||||||
}
|
}
|
||||||
return NewKey;
|
return NewKey;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ public:
|
||||||
bool m_TakeKey;
|
bool m_TakeKey;
|
||||||
bool m_GotKey;
|
bool m_GotKey;
|
||||||
IInput::CEvent m_Key;
|
IInput::CEvent m_Key;
|
||||||
|
int m_Modifier;
|
||||||
CMenusKeyBinder();
|
CMenusKeyBinder();
|
||||||
virtual bool OnInput(IInput::CEvent Event);
|
virtual bool OnInput(IInput::CEvent Event);
|
||||||
};
|
};
|
||||||
|
@ -71,7 +72,7 @@ class CMenus : public CComponent
|
||||||
float DoScrollbarV(const void *pID, const CUIRect *pRect, float Current);
|
float DoScrollbarV(const void *pID, const CUIRect *pRect, float Current);
|
||||||
float DoScrollbarH(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);
|
void DoButton_KeySelect(const void *pID, const char *pText, int Checked, const CUIRect *pRect);
|
||||||
int DoKeyReader(void *pID, const CUIRect *pRect, int Key);
|
int DoKeyReader(void *pID, const CUIRect *pRect, int Key, int Modifier, int *NewModifier);
|
||||||
|
|
||||||
//static int ui_do_key_reader(void *id, const CUIRect *rect, int key);
|
//static int ui_do_key_reader(void *id, const CUIRect *rect, int key);
|
||||||
void UiDoGetButtons(int Start, int Stop, CUIRect View, CUIRect ScopeView);
|
void UiDoGetButtons(int Start, int Stop, CUIRect View, CUIRect ScopeView);
|
||||||
|
|
|
@ -36,17 +36,29 @@ CMenusKeyBinder::CMenusKeyBinder()
|
||||||
{
|
{
|
||||||
m_TakeKey = false;
|
m_TakeKey = false;
|
||||||
m_GotKey = false;
|
m_GotKey = false;
|
||||||
|
m_Modifier = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMenusKeyBinder::OnInput(IInput::CEvent Event)
|
bool CMenusKeyBinder::OnInput(IInput::CEvent Event)
|
||||||
{
|
{
|
||||||
if(m_TakeKey)
|
if(m_TakeKey)
|
||||||
{
|
{
|
||||||
if(Event.m_Flags&IInput::FLAG_PRESS)
|
int TriggeringEvent = (Event.m_Key == KEY_MOUSE_1) ? IInput::FLAG_PRESS : IInput::FLAG_RELEASE;
|
||||||
|
if(Event.m_Flags&TriggeringEvent)
|
||||||
{
|
{
|
||||||
m_Key = Event;
|
m_Key = Event;
|
||||||
m_GotKey = true;
|
m_GotKey = true;
|
||||||
m_TakeKey = false;
|
m_TakeKey = false;
|
||||||
|
|
||||||
|
int Mask = CBinds::GetModifierMask(Input());
|
||||||
|
m_Modifier = 0;
|
||||||
|
while(!(Mask&1))
|
||||||
|
{
|
||||||
|
Mask >>= 1;
|
||||||
|
m_Modifier++;
|
||||||
|
}
|
||||||
|
if(CBinds::ModifierMatchesKey(m_Modifier, Event.m_Key))
|
||||||
|
m_Modifier = 0;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -735,14 +747,14 @@ void CMenus::UiDoGetButtons(int Start, int Stop, CUIRect View, CUIRect ScopeView
|
||||||
str_format(aBuf, sizeof(aBuf), "%s:", (const char *)Key.m_Name);
|
str_format(aBuf, sizeof(aBuf), "%s:", (const char *)Key.m_Name);
|
||||||
|
|
||||||
UI()->DoLabelScaled(&Label, aBuf, 13.0f, -1);
|
UI()->DoLabelScaled(&Label, aBuf, 13.0f, -1);
|
||||||
int OldId = Key.m_KeyId;
|
int OldId = Key.m_KeyId, OldModifier = Key.m_Modifier, NewModifier;
|
||||||
int NewId = DoKeyReader((void *)&gs_aKeys[i].m_Name, &Button, OldId);
|
int NewId = DoKeyReader((void *)&gs_aKeys[i].m_Name, &Button, OldId, OldModifier, &NewModifier);
|
||||||
if(NewId != OldId)
|
if(NewId != OldId || NewModifier != OldModifier)
|
||||||
{
|
{
|
||||||
if(OldId != 0 || NewId == 0)
|
if(OldId != 0 || NewId == 0)
|
||||||
m_pClient->m_pBinds->Bind(OldId, "");
|
m_pClient->m_pBinds->Bind(OldId, "", false, OldModifier);
|
||||||
if(NewId != 0)
|
if(NewId != 0)
|
||||||
m_pClient->m_pBinds->Bind(NewId, gs_aKeys[i].m_pCommand);
|
m_pClient->m_pBinds->Bind(NewId, gs_aKeys[i].m_pCommand, false, NewModifier);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -201,6 +201,7 @@ void CGameClient::OnConsoleInit()
|
||||||
m_All.Add(&gs_Statboard);
|
m_All.Add(&gs_Statboard);
|
||||||
m_All.Add(m_pMotd);
|
m_All.Add(m_pMotd);
|
||||||
m_All.Add(m_pMenus);
|
m_All.Add(m_pMenus);
|
||||||
|
m_All.Add(&m_pMenus->m_Binder);
|
||||||
m_All.Add(m_pGameConsole);
|
m_All.Add(m_pGameConsole);
|
||||||
|
|
||||||
// build the input stack
|
// build the input stack
|
||||||
|
|
Loading…
Reference in a new issue