Allow complex user interaction with notify tips

Hover and active right click menu now maintain their presence
This commit is contained in:
Liru Færs
2019-12-22 21:35:53 -05:00
parent 4110d1975a
commit 967b3646a6
2 changed files with 23 additions and 1 deletions

View File

@@ -37,12 +37,14 @@
#include "llchat.h"
#include "lliconctrl.h"
#include "llmenugl.h"
#include "lltextbox.h"
#include "lltexteditor.h"
#include "lltrans.h"
#include "lluiconstants.h"
#include "llviewerdisplay.h"
#include "llviewertexturelist.h"
#include "llviewerwindow.h" // for gViewerWindow
#include "llfloaterchat.h" // for add_chat_history()
#include "lloverlaybar.h" // for gOverlayBar
#include "lluictrlfactory.h"
@@ -435,9 +437,27 @@ BOOL LLNotifyBox::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
bool done = LLPanel::handleRightMouseDown(x, y, mask);
if (!done && !mIsTip) moveToBack(true);
if (done && mIsTip) mEventTimer.stop(); // Stop timer on hover so the user can interact
return done || !mIsTip;
}
// virtual
BOOL LLNotifyBox::handleHover(S32 x, S32 y, MASK mask)
{
if (mIsTip) mEventTimer.stop(); // Stop timer on hover so the user can interact
return LLPanel::handleHover(x, y, mask);
}
bool LLNotifyBox::userIsInteracting() const
{
// If the mouse is over us, the user may wish to interact
S32 local_x;
S32 local_y;
screenPointToLocal(gViewerWindow->getCurrentMouseX(), gViewerWindow->getCurrentMouseY(), &local_x, &local_y);
return pointInView(local_x, local_y) || // We're actively hovered
// our text is the target of an active menu that could be open (getVisibleMenu sucks because it contains a loop of two dynamic casts, so keep this at the end)
(mText && mText->getActive<LLTextEditor>() == mText && LLMenuGL::sMenuContainer->getVisibleMenu());
}
// virtual
void LLNotifyBox::draw()
@@ -445,7 +465,7 @@ void LLNotifyBox::draw()
// If we are teleporting, stop the timer and restart it when the teleporting completes
if (gTeleportDisplay)
mEventTimer.stop();
else if (!mEventTimer.getStarted())
else if (!mEventTimer.getStarted() && (!mIsTip || !userIsInteracting())) // If it's not a tip, we can resume instantly, otherwise the user may be interacting
mEventTimer.start();
F32 display_time = mAnimateTimer.getElapsedTimeF32();

View File

@@ -72,6 +72,8 @@ protected:
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask) override;
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override;
BOOL handleHover(S32 x, S32 y, MASK mask) override;
bool userIsInteracting() const;
// Animate as sliding onto the screen.
/*virtual*/ void draw() override;