Skip to content

Commit

Permalink
Support horizontal mouse wheel scroll
Browse files Browse the repository at this point in the history
  • Loading branch information
Xottab-DUTY committed Jul 21, 2018
1 parent be4712d commit 9a8eccb
Show file tree
Hide file tree
Showing 14 changed files with 47 additions and 30 deletions.
19 changes: 10 additions & 9 deletions src/xrEngine/IInputReceiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ using Ivector2 = _vector2<int>;
class ENGINE_API IInputReceiver
{
public:
virtual ~IInputReceiver() = default;
static void IR_GetLastMouseDelta(Ivector2& p);
static void IR_GetMousePosScreen(Ivector2& p);
static void IR_GetMousePosReal(SDL_Window* m_sdlWnd, Ivector2& p);
Expand All @@ -31,16 +32,16 @@ class ENGINE_API IInputReceiver
virtual void IR_OnDeactivate(void);
virtual void IR_OnActivate(void);

virtual void IR_OnMousePress(int /*btn*/){};
virtual void IR_OnMouseRelease(int /*btn*/){};
virtual void IR_OnMouseHold(int /*btn*/){};
virtual void IR_OnMouseWheel(int /*direction*/){};
virtual void IR_OnMouseMove(int /*x*/, int /*y*/){};
virtual void IR_OnMouseStop(int /*x*/, int /*y*/){};
virtual void IR_OnMousePress(int /*btn*/) {}
virtual void IR_OnMouseRelease(int /*btn*/) {}
virtual void IR_OnMouseHold(int /*btn*/) {}
virtual void IR_OnMouseWheel(int /*x*/, int /*y*/) {}
virtual void IR_OnMouseMove(int /*x*/, int /*y*/) {}
virtual void IR_OnMouseStop(int /*x*/, int /*y*/) {}

virtual void IR_OnKeyboardPress(int /*dik*/){};
virtual void IR_OnKeyboardRelease(int /*dik*/){};
virtual void IR_OnKeyboardHold(int /*dik*/){};
virtual void IR_OnKeyboardPress(int /*dik*/) {}
virtual void IR_OnKeyboardRelease(int /*dik*/) {}
virtual void IR_OnKeyboardHold(int /*dik*/) {}
};

ENGINE_API extern float psMouseSens;
Expand Down
5 changes: 3 additions & 2 deletions src/xrEngine/xr_input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ void CInput::MouseUpdate()
cbStack.back()->IR_OnMousePress(event.button.button - 1);
break;
case SDL_MOUSEWHEEL:
mouseMoved = true;
timeStamp[2] = dwCurTime + event.wheel.timestamp;
timeStamp[3] = dwCurTime + event.wheel.timestamp;
offs[2] += event.wheel.y;
Expand Down Expand Up @@ -152,8 +153,8 @@ void CInput::MouseUpdate()
{
if (offs[0] || offs[1])
cbStack.back()->IR_OnMouseMove(offs[0], offs[1]);
if (offs[2])
cbStack.back()->IR_OnMouseWheel(offs[2]);
if (offs[2] || offs[3])
cbStack.back()->IR_OnMouseWheel(offs[2], offs[3]);
}
else
{
Expand Down
2 changes: 1 addition & 1 deletion src/xrGame/Actor.h
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ class CActor : public CEntityAlive,
virtual void IR_OnKeyboardPress(int dik);
virtual void IR_OnKeyboardRelease(int dik);
virtual void IR_OnKeyboardHold(int dik);
virtual void IR_OnMouseWheel(int direction);
virtual void IR_OnMouseWheel(int x, int y);
virtual float GetLookFactor();

public:
Expand Down
8 changes: 4 additions & 4 deletions src/xrGame/ActorInput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,18 +199,18 @@ void CActor::IR_OnKeyboardPress(int cmd)
}
}

void CActor::IR_OnMouseWheel(int direction)
void CActor::IR_OnMouseWheel(int x, int y)
{
if (hud_adj_mode)
{
g_player_hud->tune(Ivector().set(0, 0, direction));
g_player_hud->tune(Ivector().set(0, 0, x));
return;
}

if (inventory().Action((direction > 0) ? (u16)kWPN_ZOOM_DEC : (u16)kWPN_ZOOM_INC, CMD_START))
if (inventory().Action((x > 0) ? (u16)kWPN_ZOOM_DEC : (u16)kWPN_ZOOM_INC, CMD_START))
return;

if (direction > 0)
if (x > 0)
OnNextWeaponSlot();
else
OnPrevWeaponSlot();
Expand Down
2 changes: 1 addition & 1 deletion src/xrGame/Level.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ class CLevel : public IGame_Level, public IPureClient
virtual void IR_OnMouseHold(int btn);
virtual void IR_OnMouseMove(int, int);
virtual void IR_OnMouseStop(int, int);
virtual void IR_OnMouseWheel(int direction);
virtual void IR_OnMouseWheel(int x, int y);
virtual void IR_OnActivate(void);
int get_RPID(LPCSTR name);
// Game
Expand Down
8 changes: 4 additions & 4 deletions src/xrGame/Level_input.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,18 @@ extern float g_fTimeFactor;

#define CURRENT_ENTITY() (game ? ((GameID() == eGameIDSingle) ? CurrentEntity() : CurrentControlEntity()) : NULL)

void CLevel::IR_OnMouseWheel(int direction)
void CLevel::IR_OnMouseWheel(int x, int y)
{
if (g_bDisableAllInput)
return;

#ifdef INPUT_CALLBACKS
/* avo: script callback */
if (g_actor)
g_actor->callback(GameObject::eMouseWheel)(direction);
g_actor->callback(GameObject::eMouseWheel)(x);
/* avo: end */
#endif
if (CurrentGameUI()->IR_UIOnMouseWheel(direction))
if (CurrentGameUI()->IR_UIOnMouseWheel(x, y))
return;
if (Device.Paused()
#ifdef DEBUG
Expand All @@ -67,7 +67,7 @@ void CLevel::IR_OnMouseWheel(int direction)
{
IInputReceiver* IR = smart_cast<IInputReceiver*>(smart_cast<CGameObject*>(CURRENT_ENTITY()));
if (IR)
IR->IR_OnMouseWheel(direction);
IR->IR_OnMouseWheel(x, y);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/xrGame/MainMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -371,12 +371,12 @@ void CMainMenu::IR_OnKeyboardHold(int dik)
CDialogHolder::IR_UIOnKeyboardHold((SDL_Scancode)dik);
};

void CMainMenu::IR_OnMouseWheel(int direction)
void CMainMenu::IR_OnMouseWheel(int x, int y)
{
if (!IsActive())
return;

CDialogHolder::IR_UIOnMouseWheel(direction);
CDialogHolder::IR_UIOnMouseWheel(x, y);
}

bool CMainMenu::OnRenderPPUI_query() { return IsActive() && !m_Flags.test(flGameSaveScreenshot) && b_shniaganeed_pp; }
Expand Down
2 changes: 1 addition & 1 deletion src/xrGame/MainMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class CMainMenu : public IMainMenu,
virtual void IR_OnKeyboardRelease(int dik);
virtual void IR_OnKeyboardHold(int dik);

virtual void IR_OnMouseWheel(int direction);
virtual void IR_OnMouseWheel(int x, int y);

bool OnRenderPPUI_query();
void OnRenderPPUI_main();
Expand Down
15 changes: 13 additions & 2 deletions src/xrGame/UIDialogHolder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ bool CDialogHolder::IR_UIOnKeyboardHold(SDL_Scancode dik)
return true;
}

bool CDialogHolder::IR_UIOnMouseWheel(int direction)
bool CDialogHolder::IR_UIOnMouseWheel(int x, int y)
{
CUIDialogWnd* TIR = TopInputReceiver();
if (!TIR)
Expand All @@ -349,7 +349,18 @@ bool CDialogHolder::IR_UIOnMouseWheel(int direction)

Fvector2 pos = GetUICursor().GetCursorPosition();

TIR->OnMouseAction(pos.x, pos.y, (direction > 0) ? WINDOW_MOUSE_WHEEL_UP : WINDOW_MOUSE_WHEEL_DOWN);
// Vertical scroll is in higher priority
EUIMessages wheelMessage;
if (x > 0)
wheelMessage = WINDOW_MOUSE_WHEEL_UP;
else if (x < 0)
wheelMessage = WINDOW_MOUSE_WHEEL_DOWN;
else if (y > 0)
wheelMessage = WINDOW_MOUSE_WHEEL_RIGHT;
else
wheelMessage = WINDOW_MOUSE_WHEEL_LEFT;

TIR->OnMouseAction(pos.x, pos.y, wheelMessage);
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion src/xrGame/UIDialogHolder.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,6 @@ class CDialogHolder : public pureFrame
virtual bool IR_UIOnKeyboardPress(SDL_Scancode dik);
virtual bool IR_UIOnKeyboardRelease(SDL_Scancode dik);
virtual bool IR_UIOnMouseMove(int dx, int dy);
virtual bool IR_UIOnMouseWheel(int direction);
virtual bool IR_UIOnMouseWheel(int x, int y);
virtual bool IR_UIOnKeyboardHold(SDL_Scancode dik);
};
4 changes: 2 additions & 2 deletions src/xrGame/ui/UIGameTutorial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -387,10 +387,10 @@ void CUISequencer::IR_OnKeyboardHold(int dik)
m_pStoredInputReceiver->IR_OnKeyboardHold(dik);
}

void CUISequencer::IR_OnMouseWheel(int direction)
void CUISequencer::IR_OnMouseWheel(int x, int y)
{
if (!GrabInput() && m_pStoredInputReceiver)
m_pStoredInputReceiver->IR_OnMouseWheel(direction);
m_pStoredInputReceiver->IR_OnMouseWheel(x, y);
}

void CUISequencer::IR_OnKeyboardPress(int dik)
Expand Down
2 changes: 1 addition & 1 deletion src/xrGame/ui/UIGameTutorial.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class CUISequencer : public pureFrame, public pureRender, public IInputReceiver
virtual void IR_OnKeyboardRelease(int dik);
virtual void IR_OnKeyboardHold(int dik);

virtual void IR_OnMouseWheel(int direction);
virtual void IR_OnMouseWheel(int x, int y);
virtual void IR_OnActivate(void);
bool Persistent() { return !!m_flags.test(etsPersistent); }
fastdelegate::FastDelegate0<> m_on_destroy_event;
Expand Down
2 changes: 2 additions & 0 deletions src/xrGame/ui/UIMessages.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ enum EUIMessages
WINDOW_MOUSE_MOVE,
WINDOW_MOUSE_WHEEL_UP,
WINDOW_MOUSE_WHEEL_DOWN,
WINDOW_MOUSE_WHEEL_LEFT,
WINDOW_MOUSE_WHEEL_RIGHT,
WINDOW_LBUTTON_DB_CLICK,
WINDOW_KEY_PRESSED,
WINDOW_KEY_RELEASED,
Expand Down
2 changes: 2 additions & 0 deletions src/xrGame/ui/UIWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,8 @@ bool CUIWindow::OnMouseAction(float x, float y, EUIMessages mouse_action)
case WINDOW_MOUSE_MOVE: OnMouseMove(); break;
case WINDOW_MOUSE_WHEEL_DOWN: OnMouseScroll(WINDOW_MOUSE_WHEEL_DOWN); break;
case WINDOW_MOUSE_WHEEL_UP: OnMouseScroll(WINDOW_MOUSE_WHEEL_UP); break;
case WINDOW_MOUSE_WHEEL_LEFT: OnMouseScroll(WINDOW_MOUSE_WHEEL_LEFT); break;
case WINDOW_MOUSE_WHEEL_RIGHT: OnMouseScroll(WINDOW_MOUSE_WHEEL_RIGHT); break;
case WINDOW_LBUTTON_DOWN:
if (OnMouseDown(MOUSE_1))
return true;
Expand Down

0 comments on commit 9a8eccb

Please sign in to comment.