phoenix-firestorm/indra/newview/llsidetray.h

298 lines
8.9 KiB
C++

/**
* @file LLSideTray.h
* @brief SideBar header file
*
* $LicenseInfo:firstyear=2004&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLSIDETRAY_H_
#define LL_LLSIDETRAY_H_
#include "llpanel.h"
#include "llsidetraytab.h"
#include "string"
class LLAccordionCtrl;
// Define an interface for side tab button badge values
class LLSideTrayTabBadgeDriver
{
public:
virtual std::string getBadgeString() const = 0;
};
// Deal with LLSideTrayTab being opaque. Generic do-nothing cast...
template <class T>
T tab_cast(LLSideTrayTab* tab) { return tab; }
// specialized for implementation in presence of LLSideTrayTab definition
template <>
LLPanel* tab_cast<LLPanel*>(LLSideTrayTab* tab);
// added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions
// while disconnecting viewer in LLAppViewer::disconnectViewer().
// LLDestroyClassList::instance().fireCallbacks() calls destroyClass method. See EXT-245.
class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray>
{
friend class LLUICtrlFactory;
friend class LLDestroyClass<LLSideTray>;
friend class LLSideTrayTab;
friend class LLSideTrayButton;
public:
LOG_CLASS(LLSideTray);
struct Params
: public LLInitParam::Block<Params, LLPanel::Params>
{
// initial state
Optional<bool> collapsed;
Optional<LLUIImage*> tab_btn_image_normal,
tab_btn_image_selected;
Optional<S32> default_button_width,
default_button_height,
default_button_margin;
Params();
};
static LLSideTray* getInstance ();
static bool instanceCreated ();
protected:
LLSideTray(const Params& params);
typedef std::vector<LLSideTrayTab*> child_vector_t;
typedef child_vector_t::iterator child_vector_iter_t;
typedef child_vector_t::const_iterator child_vector_const_iter_t;
typedef child_vector_t::reverse_iterator child_vector_reverse_iter_t;
typedef child_vector_t::const_reverse_iterator child_vector_const_reverse_iter_t;
typedef std::vector<std::string> tab_order_vector_t;
typedef tab_order_vector_t::const_iterator tab_order_vector_const_iter_t;
public:
// interface functions
/**
* Select tab with specific name and set it active
*
* @param name Tab to switch to.
* @param keep_prev_visible Whether to keep the previously selected tab visible.
*/
bool selectTabByName (const std::string& name, bool keep_prev_visible = false);
/**
* Select tab with specific index and set it active
*/
bool selectTabByIndex(size_t index);
/**
* Activate tab with "panel_name" panel
* if no such tab - return NULL, otherwise a pointer to the panel
* Pass params as array, or they may be overwritten(example - params["name"]="nearby")
*/
LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
bool hidePanel (const std::string& panel_name);
/**
* Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
* If "sub_panel" is not visible Side Tray is opened to display it,
* otherwise Side Tray is collapsed.
* params are passed to "panel_name" panel onOpen().
*/
void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD());
/*
* get the panel (don't show it or do anything else with it)
*/
LLPanel* getPanel (const std::string& panel_name);
LLPanel* getActivePanel ();
std::string getActivePanelName ();
bool isPanelActive (const std::string& panel_name);
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)
*/
template <typename T>
T* getPanel(const std::string& panel_name)
{
T* panel = dynamic_cast<T*>(getPanel(panel_name));
if (!panel)
{
llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl;
return NULL;
}
return panel;
}
/*
* get currently active tab
*/
// [RLVa:KB] - Checked: 2010-03-01 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
// *sighs* LLSideTrayTab is defined in llsidetray.cpp... we can make do with an LLPanel* though
const LLPanel* getActiveTab() const;
// [/RLVa:KB]
/*
* collapse SideBar, hiding visible tab and moving tab buttons
* to the right corner of the screen
*/
void collapseSideBar ();
/*
* expand SideBar
*
* @param open_active Whether to call onOpen() for the active tab.
*/
void expandSideBar(bool open_active = true);
/**
*hightlight if focused. manly copypaste from highlightFocusedFloater
*/
void highlightFocused();
void setVisible(BOOL visible)
{
if (getParent()) getParent()->setVisible(visible);
}
LLPanel* getButtonsPanel() { return mButtonsPanel; }
// [RLVa:KB] - Checked: 2010-02-28 (RLVa-1.4.0a) | Added: RLVa-1.2.0a
LLButton* getButtonFromName(const std::string& strName)
{
button_map_t::const_iterator itBtn = mTabButtons.find(strName);
return (mTabButtons.end() != itBtn) ? itBtn->second : NULL;
}
// [/RLVa:KB]
// bool getCollapsed() { return mCollapsed; }
// [SL:KB] - Patch: UI-SideTrayDndButtonCommit | Checked: 2011-06-19 (Catznip-2.6.0c) | Added: Catznip-2.6.0c
bool getCollapsed() const { return mCollapsed; }
// [/SL:KB]
void setTabButtonBadgeDriver(std::string tabName, LLSideTrayTabBadgeDriver* driver);
public:
virtual ~LLSideTray(){};
virtual BOOL postBuild();
BOOL handleMouseDown (S32 x, S32 y, MASK mask);
void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
/**
* @return side tray width if it's visible and expanded, 0 otherwise.
*
* Not that width of the tab buttons is not included.
*
* @see setVisibleWidthChangeCallback()
*/
S32 getVisibleWidth();
void setVisibleWidthChangeCallback(const commit_signal_t::slot_type& cb);
void updateSidetrayVisibility();
void handleLoginComplete();
// bool isTabAttached (const std::string& name);
// [RLVa:KB] - Checked: 2010-12-14 (RLVa-1.2.2c) | Added: RLVa-1.2.2c
bool isTabAttached (const std::string& name);
bool isTabAttached (const LLSideTrayTab* tab);
// [/RLVa:KB]
// [RLVa:KB] - Checked: 2010-09-07 (RLVa-1.2.1a) | Added: RLVa-1.2.1a
void toggleTabDocked(const std::string& strTabName);
// [/RLVa:KB]
//-TT Toggle sidebar panels with buttons
static bool isFloaterPanelVisible(const std::string& panel_name);
//-TT
protected:
bool addChild (LLView* view, S32 tab_group);
bool removeTab (LLSideTrayTab* tab); // Used to detach tabs temporarily
bool addTab (LLSideTrayTab* tab); // Used to re-attach tabs
bool hasTabs ();
// const LLSideTrayTab* getActiveTab() const { return mActiveTab; }
LLSideTrayTab* getTab(const std::string& name);
void createButtons ();
void arrange ();
void detachTabs ();
void reflectCollapseChange();
void processTriState ();
void toggleTabButton (LLSideTrayTab* tab);
LLPanel* openChildPanel (LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params);
void onTabButtonClick(std::string name);
// [RLVa:KB] - Checked: 2010-12-13 (RLVa-1.4.0a) | Added: RLVa-1.2.2c
bool onTabDestroy (const LLSideTrayTab* tab);
// [/RLVa:KB]
void onToggleCollapse();
//-TT Toggle sidebar panels with buttons
LLSideTrayTab* getTabByPanel(const std::string& panel_name);
//-TT
private:
// Implementation of LLDestroyClass<LLSideTray>
static void destroyClass()
{
// Disable SideTray to avoid crashes. EXT-245
if (LLSideTray::instanceCreated())
LLSideTray::getInstance()->setEnabled(FALSE);
}
private:
// Since we provide no public way to query mTabs and mDetachedTabs, give
// LLSideTrayListener friend access.
friend class LLSideTrayListener;
LLPanel* mButtonsPanel;
typedef std::map<std::string,LLButton*> button_map_t;
button_map_t mTabButtons;
typedef std::map<std::string,LLSideTrayTabBadgeDriver*> badge_map_t;
badge_map_t mTabButtonBadgeDrivers;
child_vector_t mTabs;
child_vector_t mDetachedTabs;
tab_order_vector_t mOriginalTabOrder;
LLSideTrayTab* mActiveTab;
commit_signal_t mVisibleWidthChangeSignal;
LLButton* mCollapseButton;
bool mCollapsed;
static LLSideTray* sInstance;
};
#endif