From 82c7366e20d8944fe39b5789b0e74ecb0c06368e Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk Date: Wed, 1 Sep 2010 19:14:41 +0300 Subject: VWR-21060 FIXED opening side tray tabs via shortcut, menu item or button outside of Side Tray. Reviewed by Vadim Savchuk. --- indra/newview/llsidetray.cpp | 103 ++++++++++++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 30 deletions(-) (limited to 'indra/newview/llsidetray.cpp') diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 85b6e0dec4..3d6fc0d8fd 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -212,10 +212,12 @@ void LLSideTrayTab::onOpen (const LLSD& key) void LLSideTrayTab::toggleTabDocked() { - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", mTabTitle)); + std::string tab_name = getName(); + + LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab_name)); if (!floater_tab) return; - LLFloaterReg::toggleInstance("side_bar_tab", LLSD().with("name", mTabTitle)); + LLFloaterReg::toggleInstance("side_bar_tab", LLSD().with("name", tab_name)); LLSideTray* side_tray = LLSideTray::getInstance(); @@ -334,10 +336,9 @@ public: tab->toggleTabDocked(); - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab->getTabTitle())); + LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab->getName())); if (!floater_tab) return FALSE; - LLRect original_rect = floater_tab->getRect(); S32 header_snap_y = floater_tab->getHeaderHeight() / 2; S32 snap_x = screen_x - original_rect.mLeft - original_rect.getWidth() / 2; @@ -485,6 +486,54 @@ void LLSideTray::toggleTabButton(LLSideTrayTab* tab) } } +LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params) +{ + LLView* view = tab->findChildView(panel_name, true); + if (!view) return NULL; + + std::string tab_name = tab->getName(); + + // Select tab and expand Side Tray only when a tab is attached. + if (isTabAttached(tab_name)) + { + selectTabByName(tab_name); + if (mCollapsed) + expandSideBar(); + } + else + { + LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab_name)); + if (!floater_tab) return NULL; + + // Restore the floater if it was minimized. + if (floater_tab->isMinimized()) + { + floater_tab->setMinimized(FALSE); + } + + // Send the floater to the front. + floater_tab->setFrontmost(); + } + + LLSideTrayPanelContainer* container = dynamic_cast(view->getParent()); + if (container) + { + LLSD new_params = params; + new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name; + container->onOpen(new_params); + + return container->getCurrentPanel(); + } + + LLPanel* panel = dynamic_cast(view); + if (panel) + { + panel->onOpen(params); + } + + return panel; +} + bool LLSideTray::selectTabByIndex(size_t index) { if(index>=mTabs.size()) @@ -623,6 +672,9 @@ bool LLSideTray::removeTab(LLSideTrayTab* tab) removeChild(tab); mTabs.erase(tab_it); + // Add the tab to detached tabs list. + mDetachedTabs.push_back(tab); + // Remove the button from the buttons panel so that it isn't drawn anymore. mButtonsPanel->removeChild(btn); @@ -684,6 +736,13 @@ bool LLSideTray::addTab(LLSideTrayTab* tab) // Arrange tabs after inserting a new one. arrange(); + // Remove the tab from the list of detached tabs. + child_vector_iter_t tab_it = std::find(mDetachedTabs.begin(), mDetachedTabs.end(), tab); + if (tab_it != mDetachedTabs.end()) + { + mDetachedTabs.erase(tab_it); + } + return true; } @@ -919,35 +978,19 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent) */ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params) { - //arrange tabs + // Look up the tab in the list of detached tabs. child_vector_const_iter_t child_it; - for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) { - LLView* view = (*child_it)->findChildView(panel_name,true); - if(view) - { - selectTabByName ((*child_it)->getName()); - if(mCollapsed) - expandSideBar(); - - LLSideTrayPanelContainer* container = dynamic_cast(view->getParent()); - if(container) - { - LLSD new_params = params; - new_params[LLSideTrayPanelContainer::PARAM_SUB_PANEL_NAME] = panel_name; - container->onOpen(new_params); - - return container->getCurrentPanel(); - } - - LLPanel* panel = dynamic_cast(view); - if(panel) - { - panel->onOpen(params); - } + LLPanel* panel = openChildPanel(*child_it, panel_name, params); + if (panel) return panel; + } - return panel; - } + // Look up the tab in the list of attached tabs. + for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + { + LLPanel* panel = openChildPanel(*child_it, panel_name, params); + if (panel) return panel; } return NULL; } -- cgit v1.2.3 From 4020b91ec6e8ab4994969ddda37f5ebbd9985367 Mon Sep 17 00:00:00 2001 From: Vadim Savchuk Date: Wed, 1 Sep 2010 21:11:25 +0300 Subject: VWR-21127 WIP Implemented saving position and dimensions of detached sidebar tabs. Reviewed by Sergey Litovchuk. --- indra/newview/llsidetray.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/llsidetray.cpp') diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 3d6fc0d8fd..3f0c1fa946 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -214,10 +214,10 @@ void LLSideTrayTab::toggleTabDocked() { std::string tab_name = getName(); - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab_name)); + LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); if (!floater_tab) return; - LLFloaterReg::toggleInstance("side_bar_tab", LLSD().with("name", tab_name)); + LLFloaterReg::toggleInstance("side_bar_tab", tab_name); LLSideTray* side_tray = LLSideTray::getInstance(); @@ -336,7 +336,7 @@ public: tab->toggleTabDocked(); - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab->getName())); + LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab->getName()); if (!floater_tab) return FALSE; LLRect original_rect = floater_tab->getRect(); @@ -502,7 +502,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel } else { - LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", LLSD().with("name", tab_name)); + LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); if (!floater_tab) return NULL; // Restore the floater if it was minimized. -- cgit v1.2.3 From 61555ce1f0d2b45ec21fe123ab604b6e18c21ccc Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk Date: Wed, 1 Sep 2010 22:58:29 +0300 Subject: VWR-20696 ADDITIONAL FIX Added calling onOpen() for tabs being undocked. Reviewed by Vadim Savchuk. --- indra/newview/llsidetray.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'indra/newview/llsidetray.cpp') diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 3f0c1fa946..9893370dcf 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -250,6 +250,13 @@ void LLSideTrayTab::toggleTabDocked() { side_tray->collapseSideBar(); } + + if (side_tray->getActiveTab() != this) + { + // When a tab other then current active tab is detached from Side Tray + // onOpen() should be called as tab visibility is changed. + onOpen(LLSD()); + } } else { -- cgit v1.2.3 From c2935e40a6966f47ebd87705dd730ab0960e2b6d Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk Date: Thu, 2 Sep 2010 20:13:25 +0300 Subject: VWR-20696 ADDITIONAL FIX Fix dock/undock button image changing depending on tab state. --- indra/newview/llsidetray.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'indra/newview/llsidetray.cpp') diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 9893370dcf..086e35dfdc 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -176,6 +176,7 @@ 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)); return true; @@ -221,7 +222,14 @@ void LLSideTrayTab::toggleTabDocked() LLSideTray* side_tray = LLSideTray::getInstance(); - if (LLFloater::isShown(floater_tab)) + bool is_tab_undocked = LLFloater::isShown(floater_tab); + + // Hide the "Tear Off" button when a tab gets undocked + // and show "Dock" button instead. + getChild("undock")->setVisible(!is_tab_undocked); + getChild("dock")->setVisible(is_tab_undocked); + + if (is_tab_undocked) { // Remove the tab from Side Tray's tabs list. // We have to do it despite removing the tab from Side Tray's child view tree -- cgit v1.2.3 From 15ca7e43eb46d1a2a0a306c0f53e13e57a03a482 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk Date: Fri, 3 Sep 2010 00:32:19 +0300 Subject: VWR-21060 FIXED showing the panel in detached tab if it was in minimized state and was called via keyboard shortcut. --- indra/newview/llsidetray.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview/llsidetray.cpp') diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 086e35dfdc..9e989ed052 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -1015,7 +1015,9 @@ void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, if(!sub_panel) return; - if (sub_panel->isInVisibleChain()) + // If a panel is visible and attached to Side Tray (has LLSideTray among its ancestors) + // it should be toggled off by collapsing Side Tray. + if (sub_panel->isInVisibleChain() && sub_panel->hasAncestor(this)) { LLSideTray::getInstance()->collapseSideBar(); } -- cgit v1.2.3 From 785de381de313673fa38e86d9df10599aa22d03b Mon Sep 17 00:00:00 2001 From: Vadim Savchuk Date: Fri, 3 Sep 2010 00:32:26 +0300 Subject: VWR-21127 FIXED Implemented restoring sidebar tabs that were detached in previous session. It is now possible to detach some sidebar tabs, exit the viewer, login again and see those tabs still detached. Also fixed incorrect saving of tabs dimensions implemented in the previous commit (766d6e749836). Reviewed by Sergey Litovchuk --- indra/newview/llsidetray.cpp | 176 +++++++++++++++++++++++++++++++------------ 1 file changed, 128 insertions(+), 48 deletions(-) (limited to 'indra/newview/llsidetray.cpp') diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 9e989ed052..a143318763 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -111,7 +111,11 @@ public: }; protected: LLSideTrayTab(const Params& params); - + + void dock(); + void undock(LLFloater* floater_tab); + + LLSideTray* getSideTray(); public: virtual ~LLSideTrayTab(); @@ -211,6 +215,28 @@ void LLSideTrayTab::onOpen (const LLSD& key) panel->onOpen(key); } +// Attempts to get the existing side tray instance. +// Needed to avoid recursive calls of LLSideTray::getInstance(). +LLSideTray* LLSideTrayTab::getSideTray() +{ + // First, check if the side tray is our parent (i.e. we're attached). + LLSideTray* side_tray = dynamic_cast(getParent()); + if (!side_tray) + { + // Detached? Ok, check if the instance exists at all/ + if (LLSideTray::instanceCreated()) + { + side_tray = LLSideTray::getInstance(); + } + else + { + llerrs << "No safe way to get the side tray instance" << llendl; + } + } + + return side_tray; +} + void LLSideTrayTab::toggleTabDocked() { std::string tab_name = getName(); @@ -220,70 +246,99 @@ void LLSideTrayTab::toggleTabDocked() LLFloaterReg::toggleInstance("side_bar_tab", tab_name); - LLSideTray* side_tray = LLSideTray::getInstance(); - - bool is_tab_undocked = LLFloater::isShown(floater_tab); + bool docking = !LLFloater::isShown(floater_tab); // Hide the "Tear Off" button when a tab gets undocked // and show "Dock" button instead. - getChild("undock")->setVisible(!is_tab_undocked); - getChild("dock")->setVisible(is_tab_undocked); + getChild("undock")->setVisible(docking); + getChild("dock")->setVisible(!docking); - if (is_tab_undocked) + if (docking) { - // Remove the tab from Side Tray's tabs list. - // We have to do it despite removing the tab from Side Tray's child view tree - // by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs. - if (!side_tray->removeTab(this)) - { - llwarns << "Failed to remove tab " << getName() << " from side tray" << llendl; - return; - } + dock(); + } + else + { + undock(floater_tab); + } +} - setVisible(true); // *HACK: restore visibility after being hidden by LLSideTray::selectTabByName(). - floater_tab->addChild(this); - floater_tab->setTitle(mTabTitle); +void LLSideTrayTab::dock() +{ + LLSideTray* side_tray = getSideTray(); + if (!side_tray) return; - LLRect rect = side_tray->getLocalRect(); - floater_tab->reshape(rect.getWidth(), rect.getHeight()); + if (!side_tray->addTab(this)) + { + llwarns << "Failed to add tab " << getName() << " to side tray" << llendl; + return; + } - rect.mTop -= floater_tab->getHeaderHeight(); - setRect(rect); - reshape(rect.getWidth(), rect.getHeight()); + setRect(side_tray->getLocalRect()); + reshape(getRect().getWidth(), getRect().getHeight()); - // Set FOLLOWS_ALL flag for the tab to follow floater dimensions upon resizing. - setFollowsAll(); + // Select the re-docked tab. + side_tray->selectTabByName(getName()); - if (!side_tray->getCollapsed()) - { - side_tray->collapseSideBar(); - } + if (side_tray->getCollapsed()) + { + side_tray->expandSideBar(); + } +} - if (side_tray->getActiveTab() != this) - { - // When a tab other then current active tab is detached from Side Tray - // onOpen() should be called as tab visibility is changed. - onOpen(LLSD()); - } +void LLSideTrayTab::undock(LLFloater* floater_tab) +{ + LLSideTray* side_tray = getSideTray(); + if (!side_tray) return; + + // Remove the tab from Side Tray's tabs list. + // We have to do it despite removing the tab from Side Tray's child view tree + // by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs. + if (!side_tray->removeTab(this)) + { + llwarns << "Failed to remove tab " << getName() << " from side tray" << llendl; + return; + } + + setVisible(true); // *HACK: restore visibility after being hidden by LLSideTray::selectTabByName(). + floater_tab->addChild(this); + floater_tab->setTitle(mTabTitle); + + // Reshape the floater if needed. + LLRect floater_rect; + if (floater_tab->hasSavedRect()) + { + // We've got saved rect for the floater, hence no need to reshape it. + floater_rect = floater_tab->getLocalRect(); } else { - if (!side_tray->addTab(this)) - { - llwarns << "Failed to add tab " << getName() << " to side tray" << llendl; - return; - } + // Detaching for the first time. Reshape the floater. + floater_rect = side_tray->getLocalRect(); + floater_tab->reshape(floater_rect.getWidth(), floater_rect.getHeight()); + } - setRect(side_tray->getLocalRect()); - reshape(getRect().getWidth(), getRect().getHeight()); + // Reshape the panel. + { + LLRect panel_rect = floater_rect; + panel_rect.mTop -= floater_tab->getHeaderHeight(); + setRect(panel_rect); + reshape(panel_rect.getWidth(), panel_rect.getHeight()); + } - // Select the re-docked tab. - side_tray->selectTabByName(getName()); + // Set FOLLOWS_ALL flag for the tab to follow floater dimensions upon resizing. + setFollowsAll(); - if (side_tray->getCollapsed()) - { - side_tray->expandSideBar(); - } + if (!side_tray->getCollapsed()) + { + side_tray->collapseSideBar(); + } + + if (side_tray->getActiveTab() != this) + { + // When a tab other then current active tab is detached from Side Tray + // onOpen() should be called as tab visibility is changed. + onOpen(LLSD()); } } @@ -460,6 +515,7 @@ BOOL LLSideTray::postBuild() getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, (*it).channel, _2)); } } + return true; } @@ -467,6 +523,8 @@ void LLSideTray::handleLoginComplete() { //reset tab to "home" tab if it was changesd during login process selectTabByName("sidebar_home"); + + detachTabs(); } LLSideTrayTab* LLSideTray::getTab(const std::string& name) @@ -901,6 +959,28 @@ void LLSideTray::arrange() mButtonsPanel->setVisible(hasTabs()); } +// Detach those tabs that were detached when the viewer exited last time. +void LLSideTray::detachTabs() +{ + // copy mTabs because LLSideTray::toggleTabDocked() modifies it. + child_vector_t tabs = mTabs; + + for (child_vector_const_iter_t it = tabs.begin(); it != tabs.end(); ++it) + { + LLSideTrayTab* tab = *it; + + std::string floater_ctrl_name = LLFloater::getControlName("side_bar_tab", LLSD(tab->getName())); + std::string vis_ctrl_name = LLFloaterReg::getVisibilityControlName(floater_ctrl_name); + if (!LLUI::sSettingGroups["floater"]->controlExists(vis_ctrl_name)) continue; + + bool is_visible = LLUI::sSettingGroups["floater"]->getBOOL(vis_ctrl_name); + if (!is_visible) continue; + + llassert(isTabAttached(tab->getName())); + tab->toggleTabDocked(); + } +} + void LLSideTray::collapseSideBar() { mCollapsed = true; -- cgit v1.2.3 From 96b7e1760d39cc08720edd488c876a719055a572 Mon Sep 17 00:00:00 2001 From: Sergei Litovchuk Date: Fri, 3 Sep 2010 17:12:59 +0300 Subject: VWR-21060 FIXED creating dummy widget in Side Tray when attempting to get a detached tab. --- indra/newview/llsidetray.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'indra/newview/llsidetray.cpp') diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index a143318763..7af3ad9896 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -529,12 +529,14 @@ void LLSideTray::handleLoginComplete() LLSideTrayTab* LLSideTray::getTab(const std::string& name) { - return getChild(name,false); + return findChild(name,false); } bool LLSideTray::isTabAttached(const std::string& name) { LLSideTrayTab* tab = getTab(name); + if (!tab) return false; + return std::find(mTabs.begin(), mTabs.end(), tab) != mTabs.end(); } @@ -619,6 +621,7 @@ bool LLSideTray::selectTabByIndex(size_t index) bool LLSideTray::selectTabByName (const std::string& name) { LLSideTrayTab* new_tab = getTab(name); + if (!new_tab) return false; // Bail out if already selected. if (new_tab == mActiveTab) @@ -865,8 +868,10 @@ void LLSideTray::processTriState () void LLSideTray::onTabButtonClick(string name) { - LLSideTrayTab* side_bar = getTab(name); - if(side_bar == mActiveTab) + LLSideTrayTab* tab = getTab(name); + if (!tab) return; + + if(tab == mActiveTab) { processTriState (); return; @@ -1141,6 +1146,17 @@ LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse) LLPanel* LLSideTray::getPanel(const std::string& panel_name) { + // Look up the panel in the list of detached tabs. + for ( child_vector_const_iter_t child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it) + { + LLPanel *panel = findChildPanel(*child_it,panel_name,true); + if(panel) + { + return panel; + } + } + + // Look up the panel in the list of attached tabs. for ( child_vector_const_iter_t child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) { LLPanel *panel = findChildPanel(*child_it,panel_name,true); -- cgit v1.2.3