Provide a way for a floater to remain the topmost floater, even when focus is given to a different floater
parent
90e272993b
commit
f6f52d327b
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue