fix: fix mouse and controller input handling in container menus
This commit is contained in:
@@ -21,6 +21,7 @@ IUIScene_AbstractContainerMenu::IUIScene_AbstractContainerMenu()
|
|||||||
|
|
||||||
m_pointerPos.x = 0.0f;
|
m_pointerPos.x = 0.0f;
|
||||||
m_pointerPos.y = 0.0f;
|
m_pointerPos.y = 0.0f;
|
||||||
|
m_bPointerDrivenByMouse = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,6 +358,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick()
|
|||||||
// If there is any input on sticks, move the pointer.
|
// If there is any input on sticks, move the pointer.
|
||||||
if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) )
|
if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) )
|
||||||
{
|
{
|
||||||
|
m_bPointerDrivenByMouse = false;
|
||||||
fInputDirX = ( fInputX > 0.0f ) ? 1.0f : ( fInputX < 0.0f )?-1.0f : 0.0f;
|
fInputDirX = ( fInputX > 0.0f ) ? 1.0f : ( fInputX < 0.0f )?-1.0f : 0.0f;
|
||||||
fInputDirY = ( fInputY > 0.0f ) ? 1.0f : ( fInputY < 0.0f )?-1.0f : 0.0f;
|
fInputDirY = ( fInputY > 0.0f ) ? 1.0f : ( fInputY < 0.0f )?-1.0f : 0.0f;
|
||||||
|
|
||||||
@@ -692,7 +694,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick()
|
|||||||
|
|
||||||
// If there is no stick input, and we are over a slot, then snap pointer to slot centre.
|
// If there is no stick input, and we are over a slot, then snap pointer to slot centre.
|
||||||
// 4J - TomK - only if this particular component allows so!
|
// 4J - TomK - only if this particular component allows so!
|
||||||
if(CanHaveFocus(eSectionUnderPointer))
|
if(!m_bPointerDrivenByMouse && CanHaveFocus(eSectionUnderPointer))
|
||||||
{
|
{
|
||||||
vPointerPos.x = vSnapPos.x;
|
vPointerPos.x = vSnapPos.x;
|
||||||
vPointerPos.y = vSnapPos.y;
|
vPointerPos.y = vSnapPos.y;
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ protected:
|
|||||||
eTutorial_State m_previousTutorialState;
|
eTutorial_State m_previousTutorialState;
|
||||||
|
|
||||||
UIVec2D m_pointerPos;
|
UIVec2D m_pointerPos;
|
||||||
|
bool m_bPointerDrivenByMouse;
|
||||||
|
|
||||||
// Offset from pointer image top left to centre (we use the centre as the actual pointer).
|
// Offset from pointer image top left to centre (we use the centre as the actual pointer).
|
||||||
float m_fPointerImageOffsetX;
|
float m_fPointerImageOffsetX;
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ void UIScene_AbstractContainerMenu::tick()
|
|||||||
|
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
bool mouseActive = (m_iPad == 0 && !KMInput.IsCaptured());
|
bool mouseActive = (m_iPad == 0 && !KMInput.IsCaptured());
|
||||||
bool useRawMousePointer = false;
|
bool drivePointerFromMouse = false;
|
||||||
float rawMouseMovieX = 0, rawMouseMovieY = 0;
|
float rawMouseMovieX = 0, rawMouseMovieY = 0;
|
||||||
int scrollDelta = 0;
|
int scrollDelta = 0;
|
||||||
// Map Windows mouse position to the virtual pointer in movie coordinates
|
// Map Windows mouse position to the virtual pointer in movie coordinates
|
||||||
@@ -215,11 +215,13 @@ void UIScene_AbstractContainerMenu::tick()
|
|||||||
rawMouseMovieX = mx;
|
rawMouseMovieX = mx;
|
||||||
rawMouseMovieY = my;
|
rawMouseMovieY = my;
|
||||||
|
|
||||||
// Only let the OS cursor drive the menu when the mouse is actively being used.
|
// Once the mouse has taken over the container cursor, keep following the OS cursor
|
||||||
// Otherwise a stationary mouse will override the controller cursor every tick.
|
// until explicit controller input takes ownership back.
|
||||||
useRawMousePointer = mouseMoved || KMInput.IsMouseDown(0) || KMInput.IsMouseDown(1) || KMInput.IsMouseDown(2) || scrollDelta != 0;
|
drivePointerFromMouse = m_bPointerDrivenByMouse || mouseMoved || KMInput.IsMouseDown(0) || KMInput.IsMouseDown(1) || KMInput.IsMouseDown(2) || scrollDelta != 0;
|
||||||
if (useRawMousePointer)
|
if (drivePointerFromMouse)
|
||||||
{
|
{
|
||||||
|
m_bPointerDrivenByMouse = true;
|
||||||
|
m_eCurrTapState = eTapStateNoInput;
|
||||||
m_pointerPos.x = mx;
|
m_pointerPos.x = mx;
|
||||||
m_pointerPos.y = my;
|
m_pointerPos.y = my;
|
||||||
}
|
}
|
||||||
@@ -293,7 +295,7 @@ void UIScene_AbstractContainerMenu::tick()
|
|||||||
|
|
||||||
#ifdef _WINDOWS64
|
#ifdef _WINDOWS64
|
||||||
S32 x, y;
|
S32 x, y;
|
||||||
if (mouseActive && useRawMousePointer)
|
if (mouseActive && m_bPointerDrivenByMouse)
|
||||||
{
|
{
|
||||||
// Send raw mouse position directly as Iggy event to avoid coordinate round-trip errors
|
// Send raw mouse position directly as Iggy event to avoid coordinate round-trip errors
|
||||||
// Scale mouse client coords to the Iggy display space (which was set to getRenderDimensions())
|
// Scale mouse client coords to the Iggy display space (which was set to getRenderDimensions())
|
||||||
@@ -386,6 +388,7 @@ void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat,
|
|||||||
|
|
||||||
if(pressed)
|
if(pressed)
|
||||||
{
|
{
|
||||||
|
m_bPointerDrivenByMouse = false;
|
||||||
handled = handleKeyDown(m_iPad, key, repeat);
|
handled = handleKeyDown(m_iPad, key, repeat);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user