phoenix-firestorm/indra/newview/llsidetray.h

204 lines
5.7 KiB
C++

/**
* @file LLSideTray.h
* @brief SideBar header file
*
* $LicenseInfo:firstyear=2004&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_LLSIDETRAY_H_
#define LL_LLSIDETRAY_H_
#include "llpanel.h"
#include "string"
class LLAccordionCtrl;
class LLSideTrayTab;
// 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>;
public:
LOG_CLASS(LLSideTray);
struct Params
: public LLInitParam::Block<Params, LLPanel::Params>
{
// initial state
Optional<bool> collapsed;
Optional<std::string> tab_btn_image_normal;
Optional<std::string> tab_btn_image_selected;
Optional<S32> default_button_width;
Optional<S32> default_button_height;
Optional<S32> default_button_margin;
Params();
};
static LLSideTray* getInstance ();
static bool instanceCreated ();
protected:
LLSideTray(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;
public:
// interface functions
/**
* Select tab with specific name and set it active
*/
bool selectTabByName (const std::string& name);
/**
* 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());
/**
* 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 ();
bool isPanelActive (const std::string& panel_name);
/*
* get currently active tab
*/
const LLSideTrayTab* getActiveTab() const { return mActiveTab; }
/*
* collapse SideBar, hiding visible tab and moving tab buttons
* to the right corner of the screen
*/
void collapseSideBar ();
/*
* expand SideBar
*/
void expandSideBar ();
/**
*hightlight if focused. manly copypaste from highlightFocusedFloater
*/
void highlightFocused();
void setVisible(BOOL visible)
{
if (getParent()) getParent()->setVisible(visible);
}
LLPanel* getButtonsPanel() { return mButtonsPanel; }
bool getCollapsed() { return mCollapsed; }
public:
virtual ~LLSideTray(){};
virtual BOOL postBuild();
void onTabButtonClick(std::string name);
void onToggleCollapse();
bool addChild (LLView* view, S32 tab_group);
BOOL handleMouseDown (S32 x, S32 y, MASK mask);
void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE);
void processTriState ();
void updateSidetrayVisibility();
commit_signal_t& getCollapseSignal() { return mCollapseSignal; }
void handleLoginComplete();
protected:
LLSideTrayTab* getTab (const std::string& name);
void createButtons ();
LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip,
LLUICtrl::commit_callback_t callback);
void arrange ();
void reflectCollapseChange();
void toggleTabButton (LLSideTrayTab* tab);
private:
// Implementation of LLDestroyClass<LLSideTray>
static void destroyClass()
{
// Disable SideTray to avoid crashes. EXT-245
if (LLSideTray::instanceCreated())
LLSideTray::getInstance()->setEnabled(FALSE);
}
private:
LLPanel* mButtonsPanel;
typedef std::map<std::string,LLButton*> button_map_t;
button_map_t mTabButtons;
child_vector_t mTabs;
LLSideTrayTab* mActiveTab;
commit_signal_t mCollapseSignal;
LLButton* mCollapseButton;
bool mCollapsed;
static LLSideTray* sInstance;
};
#endif