fixed EXT-3193 “Closing toasts cause blocking toast screen channel.”,

added direct check of toast hovering to avoid collisions with order of
mouseEnter and mouseLeave events;

corrected EXT-3096,
added call off startFadingToasts in deleteToast since mouseLeave not will be
called in case closing toast;

--HG--
branch : product-engine
meow-7.2.2
Alexei Arabadji 2009-12-08 20:34:30 +02:00
parent 7348fbb69a
commit 7d261eb9cf
2 changed files with 17 additions and 28 deletions

View File

@ -243,6 +243,7 @@ void LLScreenChannel::deleteToast(LLToast* toast)
if(mHoveredToast == toast)
{
mHoveredToast = NULL;
startFadingToasts();
}
// close the toast
@ -720,39 +721,28 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id)
//--------------------------------------------------------------------------
void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
{
// because of LLViewerWindow::updateUI() that ALWAYS calls onMouseEnter BEFORE onMouseLeave
// we must check this to prevent incorrect setting for hovering in a channel
std::map<LLToast*, bool>::iterator it_first, it_second;
S32 stack_size = mToastEventStack.size();
if(mouse_enter)
// because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave
// we must check hovering directly to prevent incorrect setting for hovering in a channel
S32 x,y;
if (mouse_enter)
{
mHoveredToast = toast;
}
else
{
mHoveredToast = NULL;
}
switch(stack_size)
{
case 0:
mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
break;
case 1:
it_first = mToastEventStack.begin();
if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )
toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
gViewerWindow->getCurrentMouseY(), &x, &y);
bool hover = toast->pointInView(x, y) == TRUE;
if (hover)
{
mToastEventStack.clear();
mHoveredToast = toast;
}
else
}
else if (mHoveredToast != NULL)
{
mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
gViewerWindow->getCurrentMouseY(), &x, &y);
bool hover = mHoveredToast->pointInView(x, y) == TRUE;
if (!hover)
{
mToastEventStack.clear();
mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
mHoveredToast = NULL;
}
break;
default:
LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;
}
if(!isHovering())

View File

@ -279,7 +279,6 @@ private:
std::vector<ToastElem> mToastList;
std::vector<ToastElem> mStoredToastList;
std::map<LLToast*, bool> mToastEventStack;
};
}