STORM-1093 FIX "Dock" icon is still shown after a side panel has been docked with Ctrl+Shift+W.

Reason:
When an undocked side tray tab floater got closed with Ctrl+Shift+W,
LLSideTray::setTabDocked() was called. It docked the floater but didn't update
the dock/undock icon.

Fix:
Made setTabDocked() a general purpose method, not a hack suitable for using
only as a floater close callback in the basic viewer mode.
It now updates the dock/undock icon.

Other changes:
* Replaced numerous calls to toggleTabDocked with setDocked(),
  that is safer because does exactly what you want.
* Got rid of a duplicated floater close callback.
meow-7.2.2
Vadim ProductEngine 2011-04-22 19:07:15 +03:00
parent b15dca2263
commit 175f12350d
3 changed files with 24 additions and 42 deletions

View File

@ -47,5 +47,6 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
void LLFloaterSideTrayTab::onClose(bool app_quitting)
{
LLSideTray::getInstance()->setTabDocked(getName(), true);
// The floater is already being closed, so don't toggle it once more (that may crash viewer).
LLSideTray::getInstance()->setTabDocked(getName(), /* dock = */ true, /* toggle_floater = */ false);
}

View File

@ -127,8 +127,6 @@ protected:
void undock(LLFloater* floater_tab);
LLSideTray* getSideTray();
void onFloaterClose(LLSD::Boolean app_quitting);
public:
virtual ~LLSideTrayTab();
@ -146,7 +144,7 @@ public:
void onOpen (const LLSD& key);
void toggleTabDocked();
void toggleTabDocked(bool toggle_floater = true);
void setDocked(bool dock);
bool isDocked() const;
@ -160,7 +158,6 @@ private:
std::string mDescription;
LLView* mMainPanel;
boost::signals2::connection mFloaterCloseConn;
};
LLSideTrayTab::LLSideTrayTab(const Params& p)
@ -196,8 +193,8 @@ BOOL LLSideTrayTab::postBuild()
title_panel->getChild<LLTextBox>(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle);
getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this));
getChild<LLButton>("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false));
getChild<LLButton>("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, true));
return true;
}
@ -253,14 +250,16 @@ LLSideTray* LLSideTrayTab::getSideTray()
return side_tray;
}
void LLSideTrayTab::toggleTabDocked()
void LLSideTrayTab::toggleTabDocked(bool toggle_floater /* = true */)
{
// *FIX: Calling this method twice per frame would crash the viewer.
std::string tab_name = getName();
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
if (!floater_tab) return;
bool docking = LLFloater::isShown(floater_tab);
bool docking = !isDocked();
// Hide the "Tear Off" button when a tab gets undocked
// and show "Dock" button instead.
@ -278,7 +277,10 @@ void LLSideTrayTab::toggleTabDocked()
// Open/close the floater *after* we reparent the tab panel,
// so that it doesn't receive redundant visibility change notifications.
LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
if (toggle_floater)
{
LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
}
}
// Same as toggleTabDocked() apart from making sure that we do exactly what we want.
@ -298,18 +300,6 @@ bool LLSideTrayTab::isDocked() const
return dynamic_cast<LLSideTray*>(getParent()) != NULL;
}
void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting)
{
// If user presses Ctrl-Shift-W, handle that gracefully by docking all
// undocked tabs before their floaters get destroyed (STORM-1016).
// Don't dock on quit for the current dock state to be correctly saved.
if (app_quitting) return;
lldebugs << "Forcibly docking tab " << getName() << llendl;
setDocked(true);
}
BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
// Let children handle the event
@ -333,7 +323,6 @@ void LLSideTrayTab::dock(LLFloater* floater_tab)
return;
}
mFloaterCloseConn.disconnect();
setRect(side_tray->getLocalRect());
reshape(getRect().getWidth(), getRect().getHeight());
@ -382,7 +371,6 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
}
floater_tab->addChild(this);
mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2));
floater_tab->setTitle(mTabTitle);
floater_tab->setName(getName());
@ -510,7 +498,7 @@ public:
LLSideTrayTab* tab = side_tray->getTab(getName());
if (!tab) return FALSE;
tab->toggleTabDocked();
tab->setDocked(false);
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName());
if (!floater_tab) return FALSE;
@ -681,7 +669,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
{
tab->toggleTabDocked();
tab->setDocked(false);
tab_attached = false;
}
@ -1102,7 +1090,7 @@ void LLSideTray::detachTabs()
if (!is_visible) continue;
llassert(isTabAttached(tab->getName()));
tab->toggleTabDocked();
tab->setDocked(false);
}
}
@ -1327,8 +1315,9 @@ bool LLSideTray::isPanelActive(const std::string& panel_name)
return (panel->getName() == panel_name);
}
void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
void LLSideTray::setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater /* = true*/)
{
// Lookup tab by name.
LLSideTrayTab* tab = getTab(tab_name);
if (!tab)
{ // not a docked tab, look through detached tabs
@ -1345,20 +1334,12 @@ void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
}
if (tab)
{
bool tab_attached = isTabAttached(tab_name);
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
if (!floater_tab) return;
llassert(tab != NULL);
if (dock && !tab_attached)
{
tab->dock(floater_tab);
}
else if (!dock && tab_attached)
{
tab->undock(floater_tab);
}
// Toggle its dock state.
if (tab && tab->isDocked() != dock)
{
tab->toggleTabDocked(toggle_floater);
}
}

View File

@ -121,7 +121,7 @@ public:
LLPanel* getActivePanel ();
bool isPanelActive (const std::string& panel_name);
void setTabDocked(const std::string& tab_name, bool dock);
void setTabDocked(const std::string& tab_name, bool dock, bool toggle_floater = true);
/*
* get the panel of given type T (don't show it or do anything else with it)