Add ICursorControl::getReferenceRect

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6455 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien 2023-03-14 22:05:45 +00:00
parent f989112dcb
commit a23af985e4
7 changed files with 76 additions and 0 deletions

@ -1,6 +1,7 @@
-------------------------- --------------------------
Changes in 1.9 (not yet released) Changes in 1.9 (not yet released)
- Add ICursorControl::getReferenceRect
- Fix: Listbox no longer sending EGET_LISTBOX_SELECTED_AGAIN instead of EGET_LISTBOX_CHANGED when pressed mouse was moved over item before releasing the mouse button - Fix: Listbox no longer sending EGET_LISTBOX_SELECTED_AGAIN instead of EGET_LISTBOX_CHANGED when pressed mouse was moved over item before releasing the mouse button
- Listbox items can now change individual background colors - Listbox items can now change individual background colors
- Fix some bitfield sizes in SMaterial which were chosen too small for enums (PolygonOffsetDirection, ZWriteEnable, BlendOperation) - Fix some bitfield sizes in SMaterial which were chosen too small for enums (PolygonOffsetDirection, ZWriteEnable, BlendOperation)

@ -160,6 +160,12 @@ namespace gui
\param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/ \param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/
virtual void setReferenceRect(core::rect<s32>* rect=0) = 0; virtual void setReferenceRect(core::rect<s32>* rect=0) = 0;
//! Returns the current absolute reference rect used for the cursor position
/** \param rect Will receive the reference rectangle when the function returns true
When the result is false drivers can still write some platform specific values in there.
Generally at least the width/height of the returned rect will correspond to the current window size.
\return Return true when a reference rectangle has been set and is used by this driver */
virtual bool getReferenceRect(core::rect<s32>& rect) { return false; }
//! Sets the active cursor icon //! Sets the active cursor icon
/** Setting cursor icons is so far only supported on Win32 and Linux */ /** Setting cursor icons is so far only supported on Win32 and Linux */

@ -197,6 +197,20 @@ namespace irr
UseReferenceRect = false; UseReferenceRect = false;
} }
virtual bool getReferenceRect(core::rect<s32>& rect) IRR_OVERRIDE
{
if ( UseReferenceRect )
{
rect = ReferenceRect;
}
else
{
rect.UpperLeftCorner = core::vector2di(0,0);
rect.LowerRightCorner.X = (irr::s32)WindowSize.Width;
rect.LowerRightCorner.Y = (irr::s32)WindowSize.Height;
}
return UseReferenceRect;
}
//! Updates the internal cursor position //! Updates the internal cursor position
void setInternalCursorPosition(const core::position2di &pos) void setInternalCursorPosition(const core::position2di &pos)

@ -160,6 +160,14 @@ namespace irr
{ {
} }
virtual bool getReferenceRect(core::rect<s32>& rect) IRR_OVERRIDE
{
rect.UpperLeftCorner = core::vector2di(0,0);
rect.LowerRightCorner.X = (irr::s32)Device->CreationParams.WindowSize.Width;
rect.LowerRightCorner.Y = (irr::s32)Device->CreationParams.WindowSize.Height;
return false;
}
private: private:
void updateCursorPos() void updateCursorPos()

@ -327,6 +327,21 @@ namespace irr
UseReferenceRect = false; UseReferenceRect = false;
} }
virtual bool getReferenceRect(core::rect<s32>& rect) IRR_OVERRIDE
{
if ( UseReferenceRect )
{
rect = ReferenceRect;
}
else
{
rect.UpperLeftCorner = core::vector2di(0,0);
rect.LowerRightCorner.X = (irr::s32)Device->Width;
rect.LowerRightCorner.Y = (irr::s32)Device->Height;
}
return UseReferenceRect;
}
//! Sets the active cursor icon //! Sets the active cursor icon
virtual void setActiveIcon(gui::ECURSOR_ICON iconId) IRR_OVERRIDE; virtual void setActiveIcon(gui::ECURSOR_ICON iconId) IRR_OVERRIDE;

@ -168,6 +168,14 @@ namespace irr
{ {
} }
virtual bool getReferenceRect(core::rect<s32>& rect) IRR_OVERRIDE
{
rect.UpperLeftCorner = core::vector2di(0,0);
rect.LowerRightCorner.X = (irr::s32)Device->Width;
rect.LowerRightCorner.Y = (irr::s32)Device->Height;
return false;
}
private: private:
void updateCursorPos() void updateCursorPos()

@ -275,6 +275,30 @@ namespace irr
UseReferenceRect = false; UseReferenceRect = false;
} }
virtual bool getReferenceRect(core::rect<s32>& rect) IRR_OVERRIDE
{
if ( UseReferenceRect )
{
rect = ReferenceRect;
}
else
{
RECT wndRect;
if (GetWindowRect(HWnd, &wndRect))
{
rect.UpperLeftCorner.X = wndRect.left+BorderX;
rect.UpperLeftCorner.Y = wndRect.top+BorderY;
}
else // error case - not sure if it matters what we set here as coordinates returned will be -1, -1
{
rect.UpperLeftCorner = core::vector2di(0,0);
}
rect.LowerRightCorner.X = rect.UpperLeftCorner.X + (irr::s32)WindowSize.Width;
rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + (irr::s32)WindowSize.Height;
}
return UseReferenceRect;
}
/** Used to notify the cursor that the window was resized. */ /** Used to notify the cursor that the window was resized. */
void OnResize(const core::dimension2d<u32>& size) void OnResize(const core::dimension2d<u32>& size)
{ {