From 12ec528b5a92582efefbf30e8d8cff1d437261a9 Mon Sep 17 00:00:00 2001 From: Nimetu Date: Sat, 20 Oct 2018 19:07:32 +0300 Subject: [PATCH] Fixed: Mouse events on partially hidden elemnts --HG-- branch : develop --- code/nel/include/nel/gui/interface_group.h | 10 ++++++- code/nel/src/gui/interface_group.cpp | 32 ++++++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/code/nel/include/nel/gui/interface_group.h b/code/nel/include/nel/gui/interface_group.h index 01f2b9701..5f864e9e9 100644 --- a/code/nel/include/nel/gui/interface_group.h +++ b/code/nel/include/nel/gui/interface_group.h @@ -101,6 +101,9 @@ namespace NLGUI // test is a group is a direct child of this interface group bool isChildGroup(const CInterfaceGroup *group) const; + // test is x,y is inside last draw clip aread + bool isInViewport(sint32 x, sint32 y) const; + virtual bool isWindowUnder (sint32 x, sint32 y); // Virtual for menu that is not square CInterfaceGroup *getGroupUnder (sint32 x, sint32 y); virtual bool getViewsUnder (sint32 x, sint32 y, sint32 clipX, sint32 clipY, sint32 clipW, sint32 clipH, std::vector &vVB); // Return true if x,y under the group @@ -341,8 +344,13 @@ namespace NLGUI void alignElements(); protected: + /// Last clip area cached from draw call + sint32 _LastClipX; + sint32 _LastClipY; + sint32 _LastClipW; + sint32 _LastClipH; - void makeNewClip (sint32 &oldClipX, sint32 &oldClipY, sint32 &oldClipW, sint32 &oldClipH); + void makeNewClip (sint32 &oldClipX, sint32 &oldClipY, sint32 &oldClipW, sint32 &oldClipH, bool drawing = false); void restoreClip (sint32 oldSciX, sint32 oldSciY, sint32 oldSciW, sint32 oldSciH); // Compute clip contribution for current window, and a previous clipping rectangle. This doesn't change the clip window in the driver. diff --git a/code/nel/src/gui/interface_group.cpp b/code/nel/src/gui/interface_group.cpp index 789030a4a..3da60c9f2 100644 --- a/code/nel/src/gui/interface_group.cpp +++ b/code/nel/src/gui/interface_group.cpp @@ -77,6 +77,11 @@ namespace NLGUI _LUAEnvTableCreated= false; _DepthForZSort= 0.f; + _LastClipX = 0; + _LastClipY = 0; + _LastClipW = 0; + _LastClipH = 0; + #ifdef AJM_DEBUG_TRACK_INTERFACE_GROUPS CInterfaceManager::getInstance()->DebugTrackGroupsCreated( this ); #endif @@ -1254,7 +1259,8 @@ namespace NLGUI { const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event; - if (!isIn(eventDesc.getX(), eventDesc.getY())) + // group might be partially hidden (scolling) so test against last visible area + if (!isInViewport(eventDesc.getX(), eventDesc.getY())) return false; bool taken = false; @@ -1299,7 +1305,6 @@ namespace NLGUI } if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mousewheel) { - // handle the Mouse Wheel only if interesting if (_H>_MaxH) { CInterfaceGroup *currParent = _Parent; @@ -1329,7 +1334,7 @@ namespace NLGUI void CInterfaceGroup::draw () { sint32 oldSciX, oldSciY, oldSciW, oldSciH; - makeNewClip (oldSciX, oldSciY, oldSciW, oldSciH); + makeNewClip (oldSciX, oldSciY, oldSciW, oldSciH, true); // Display sons only if not total clipped CViewRenderer &rVR = *CViewRenderer::getInstance(); @@ -1718,6 +1723,16 @@ namespace NLGUI (y <= (_YReal + _HReal))); } + // ------------------------------------------------------------------------------------------------ + bool CInterfaceGroup::isInViewport(sint32 x, sint32 y) const + { + return ( + (x > _LastClipX) && + (x < (_LastClipX + _LastClipW))&& + (y > _LastClipY) && + (y < (_LastClipY + _LastClipH))); + } + // ------------------------------------------------------------------------------------------------ CInterfaceGroup* CInterfaceGroup::getGroupUnder (sint32 x, sint32 y) { @@ -1976,11 +1991,10 @@ namespace NLGUI newSciYDest = newSciY; newSciWDest = newSciW/* - _MarginLeft*/; newSciHDest = newSciH; - } // ------------------------------------------------------------------------------------------------ - void CInterfaceGroup::makeNewClip (sint32 &oldSciX, sint32 &oldSciY, sint32 &oldSciW, sint32 &oldSciH) + void CInterfaceGroup::makeNewClip (sint32 &oldSciX, sint32 &oldSciY, sint32 &oldSciW, sint32 &oldSciH, bool drawing) { CViewRenderer &rVR = *CViewRenderer::getInstance(); rVR.getClipWindow (oldSciX, oldSciY, oldSciW, oldSciH); @@ -1988,6 +2002,14 @@ namespace NLGUI sint32 newSciX, newSciY, newSciW, newSciH; computeCurrentClipContribution(oldSciX, oldSciY, oldSciW, oldSciH, newSciX, newSciY, newSciW, newSciH); rVR.setClipWindow (newSciX, newSciY, newSciW, newSciH); + + if (drawing) + { + _LastClipX = newSciX; + _LastClipY = newSciY; + _LastClipW = newSciW; + _LastClipH = newSciH; + } } // ------------------------------------------------------------------------------------------------