mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 09:34:19 +00:00
Use dropdown menu to select game controller
Instead of using one button to cycle through all controllers.
This commit is contained in:
parent
387a71ab0d
commit
5b3f6e8ffd
|
@ -187,14 +187,10 @@ void CInput::CloseJoysticks()
|
|||
m_pActiveJoystick = nullptr;
|
||||
}
|
||||
|
||||
void CInput::SelectNextJoystick()
|
||||
void CInput::SetActiveJoystick(size_t Index)
|
||||
{
|
||||
const int Num = m_vJoysticks.size();
|
||||
if(Num > 1)
|
||||
{
|
||||
m_pActiveJoystick = &m_vJoysticks[(m_pActiveJoystick->GetIndex() + 1) % Num];
|
||||
str_copy(g_Config.m_InpControllerGUID, m_pActiveJoystick->GetGUID());
|
||||
}
|
||||
m_pActiveJoystick = &m_vJoysticks[Index];
|
||||
str_copy(g_Config.m_InpControllerGUID, m_pActiveJoystick->GetGUID());
|
||||
}
|
||||
|
||||
float CInput::CJoystick::GetAxisValue(int Axis)
|
||||
|
|
|
@ -122,8 +122,9 @@ public:
|
|||
bool KeyPress(int Key, bool CheckCounter) const override { return CheckCounter ? (m_aInputCount[Key] == m_InputCounter) : m_aInputCount[Key]; }
|
||||
|
||||
size_t NumJoysticks() const override { return m_vJoysticks.size(); }
|
||||
CJoystick *GetJoystick(size_t Index) override { return &m_vJoysticks[Index]; }
|
||||
CJoystick *GetActiveJoystick() override { return m_pActiveJoystick; }
|
||||
void SelectNextJoystick() override;
|
||||
void SetActiveJoystick(size_t Index) override;
|
||||
|
||||
bool MouseRelative(float *pX, float *pY) override;
|
||||
void MouseModeAbsolute() override;
|
||||
|
|
|
@ -98,8 +98,9 @@ public:
|
|||
virtual bool Absolute(float *pX, float *pY) = 0;
|
||||
};
|
||||
virtual size_t NumJoysticks() const = 0;
|
||||
virtual IJoystick *GetJoystick(size_t Index) = 0;
|
||||
virtual IJoystick *GetActiveJoystick() = 0;
|
||||
virtual void SelectNextJoystick() = 0;
|
||||
virtual void SetActiveJoystick(size_t Index) = 0;
|
||||
|
||||
// mouse
|
||||
virtual void NativeMousePos(int *pX, int *pY) const = 0;
|
||||
|
|
|
@ -1078,20 +1078,39 @@ float CMenus::RenderSettingsControlsJoystick(CUIRect View)
|
|||
{
|
||||
// show joystick device selection if more than one available or just the joystick name if there is only one
|
||||
{
|
||||
CUIRect JoystickDropDown;
|
||||
View.HSplitTop(Spacing, nullptr, &View);
|
||||
View.HSplitTop(ButtonHeight, &Button, &View);
|
||||
char aBuf[96];
|
||||
str_format(aBuf, sizeof(aBuf), Localize("Controller %d: %s"), Input()->GetActiveJoystick()->GetIndex(), Input()->GetActiveJoystick()->GetName());
|
||||
View.HSplitTop(ButtonHeight, &JoystickDropDown, &View);
|
||||
if(NumJoysticks > 1)
|
||||
{
|
||||
static CButtonContainer s_ButtonJoystickId;
|
||||
if(DoButton_Menu(&s_ButtonJoystickId, aBuf, 0, &Button))
|
||||
Input()->SelectNextJoystick();
|
||||
GameClient()->m_Tooltips.DoToolTip(&s_ButtonJoystickId, &Button, Localize("Click to cycle through all available controllers."));
|
||||
static std::vector<std::string> s_vJoystickNames;
|
||||
static std::vector<const char *> s_vpJoystickNames;
|
||||
s_vJoystickNames.resize(NumJoysticks);
|
||||
s_vpJoystickNames.resize(NumJoysticks);
|
||||
|
||||
for(int i = 0; i < NumJoysticks; ++i)
|
||||
{
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "%s %d: %s", Localize("Controller"), i, Input()->GetJoystick(i)->GetName());
|
||||
s_vJoystickNames[i] = aBuf;
|
||||
s_vpJoystickNames[i] = s_vJoystickNames[i].c_str();
|
||||
}
|
||||
|
||||
static CUI::SDropDownState s_JoystickDropDownState;
|
||||
static CScrollRegion s_JoystickDropDownScrollRegion;
|
||||
s_JoystickDropDownState.m_SelectionPopupContext.m_pScrollRegion = &s_JoystickDropDownScrollRegion;
|
||||
const int CurrentJoystick = Input()->GetActiveJoystick()->GetIndex();
|
||||
const int NewJoystick = UI()->DoDropDown(&JoystickDropDown, CurrentJoystick, s_vpJoystickNames.data(), s_vpJoystickNames.size(), s_JoystickDropDownState);
|
||||
if(NewJoystick != CurrentJoystick)
|
||||
{
|
||||
Input()->SetActiveJoystick(NewJoystick);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UI()->DoLabel(&Button, aBuf, 13.0f, TEXTALIGN_ML);
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "%s 0: %s", Localize("Controller"), Input()->GetJoystick(0)->GetName());
|
||||
UI()->DoLabel(&JoystickDropDown, aBuf, 13.0f, TEXTALIGN_ML);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue