Provide a way for a floater to remain the topmost floater, even when focus is given to a different floater

master
Kitty Barnett 2022-10-23 16:35:44 +02:00
parent 90e272993b
commit f6f52d327b
2 changed files with 27 additions and 1 deletions

View File

@ -3039,7 +3039,29 @@ void LLFloaterView::syncFloaterTabOrder()
LLFloater* floaterp = dynamic_cast<LLFloater*>(*child_it);
if (gFocusMgr.childHasKeyboardFocus(floaterp))
{
bringToFront(floaterp, FALSE);
if (mFrontChild != floaterp)
{
// Grab a list of the top floaters that want to stay on top of the focused floater
std::list<LLView*> listTop;
if (mFrontChild && !mFrontChild->canFocusStealFrontmost())
{
for (LLView* childfloaterp : *getChildList())
{
if (static_cast<LLFloater*>(childfloaterp)->canFocusStealFrontmost())
break;
listTop.push_back(childfloaterp);
}
}
bringToFront(floaterp, FALSE);
// Restore top floaters
for (LLView* childp :listTop)
{
sendChildToFront(childp);
}
}
break;
}
}

View File

@ -313,6 +313,9 @@ public:
/*virtual*/ void setVisible(BOOL visible); // do not override
/*virtual*/ void onVisibilityChange ( BOOL new_visibility ); // do not override
bool canFocusStealFrontmost() const { return mFocusStealsFrontmost; }
void setFocusStealsFrontmost(bool wants_frontmost) { mFocusStealsFrontmost = wants_frontmost; }
void setFrontmost(BOOL take_focus = TRUE, BOOL restore = TRUE);
virtual void setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());
@ -478,6 +481,7 @@ private:
BOOL mCanTearOff;
BOOL mCanMinimize;
BOOL mCanClose;
bool mFocusStealsFrontmost = true; // FALSE if we don't want the currently focused floater to cover this floater without user interaction
BOOL mDragOnLeft;
BOOL mResizable;