From 175f12350d351570712db03e15c1bc89af677ad8 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Fri, 22 Apr 2011 19:07:15 +0300 Subject: 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. --- indra/newview/llfloatersidetraytab.cpp | 3 +- indra/newview/llsidetray.cpp | 61 ++++++++++++---------------------- indra/newview/llsidetray.h | 2 +- 3 files changed, 24 insertions(+), 42 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp index 94407e6da0..9f15e62d84 100644 --- a/indra/newview/llfloatersidetraytab.cpp +++ b/indra/newview/llfloatersidetraytab.cpp @@ -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); } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 4f18ee1da2..615899d49f 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -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(TAB_PANEL_CAPTION_TITLE_BOX)->setValue(mTabTitle); - getChild("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); - getChild("dock")->setCommitCallback(boost::bind(&LLSideTrayTab::toggleTabDocked, this)); + getChild("undock")->setCommitCallback(boost::bind(&LLSideTrayTab::setDocked, this, false)); + getChild("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(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); } } diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 1dddd9e9bc..57e4264247 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -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) -- cgit v1.2.3