diff options
Diffstat (limited to 'indra/newview/llbottomtray.h')
-rw-r--r-- | indra/newview/llbottomtray.h | 154 |
1 files changed, 134 insertions, 20 deletions
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index a28f1e42ec..3c45777645 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -33,7 +33,7 @@ #ifndef LL_LLBOTTOMPANEL_H #define LL_LLBOTTOMPANEL_H -#include <llmenugl.h> +#include "llmenugl.h" #include "llpanel.h" #include "llimview.h" @@ -43,24 +43,32 @@ class LLChicletPanel; class LLLineEditor; class LLLayoutStack; class LLNotificationChiclet; -class LLTalkButton; +class LLSpeakButton; class LLNearbyChatBar; class LLIMChiclet; +class LLBottomTrayLite; + +// Build time optimization, generate once in .cpp file +#ifndef LLBOTTOMTRAY_CPP +extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); +#endif class LLBottomTray : public LLSingleton<LLBottomTray> , public LLPanel , public LLIMSessionObserver + , public LLVoiceClientStatusObserver { + LOG_CLASS(LLBottomTray); friend class LLSingleton<LLBottomTray>; + friend class LLBottomTrayLite; public: ~LLBottomTray(); BOOL postBuild(); LLChicletPanel* getChicletPanel() {return mChicletPanel;} - LLNotificationChiclet* getSysWell() {return mSysWell;} - LLNearbyChatBar* getNearbyChatBar() {return mNearbyChatBar;} + LLNearbyChatBar* getNearbyChatBar(); void onCommitGesture(LLUICtrl* ctrl); @@ -69,11 +77,18 @@ public: virtual void sessionRemoved(const LLUUID& session_id); void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id); + S32 getTotalUnreadIMCount(); + virtual void reshape(S32 width, S32 height, BOOL called_from_parent); - virtual void onFocusLost(); virtual void setVisible(BOOL visible); + /*virtual*/ S32 notifyParent(const LLSD& info); + + // Implements LLVoiceClientStatusObserver::onChange() to enable the speak + // button when voice is available + /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); + void showBottomTrayContextMenu(S32 x, S32 y, MASK mask); void showGestureButton(BOOL visible); @@ -81,19 +96,117 @@ public: void showCameraButton(BOOL visible); void showSnapshotButton(BOOL visible); -private: + void toggleMovementControls(); + void toggleCameraControls(); + + void onMouselookModeIn(); + void onMouselookModeOut(); + + /** + * Creates IM Chiclet based on session type (IM chat or Group chat) + */ + LLIMChiclet* createIMChiclet(const LLUUID& session_id); - enum EResizeState +private: + typedef enum e_resize_status_type { - STATE_CHICLET_PANEL = 1, - STATE_CHATBAR_INPUT, - STATE_BUTTONS - }; + RS_NORESIZE = 0x0000 + , RS_CHICLET_PANEL = 0x0001 + , RS_CHATBAR_INPUT = 0x0002 + , RS_BUTTON_SNAPSHOT = 0x0004 + , RS_BUTTON_CAMERA = 0x0008 + , RS_BUTTON_MOVEMENT = 0x0010 + , RS_BUTTON_GESTURES = 0x0020 + , RS_BUTTON_SPEAK = 0x0040 + , RS_IM_WELL = 0x0080 + , RS_NOTIFICATION_WELL = 0x0100 + + /** + * Specifies buttons which can be hidden when bottom tray is shrunk. + * They are: Gestures, Movement (Move), Camera (View), Snapshot + */ + , RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES + }EResizeState; + + S32 processWidthDecreased(S32 delta_width); + void processWidthIncreased(S32 delta_width); + void log(LLView* panel, const std::string& descr); + bool processShowButton(EResizeState shown_object_type, S32* available_width); + void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width); + + /** + * Shrinks shown buttons to reduce total taken space. + * + * @param - required_width - width which buttons can use to be shrunk. It is a negative value. + * It is increased on the value processed by buttons. + */ + void processShrinkButtons(S32* required_width, S32* buttons_freed_width); + void processShrinkButton(EResizeState processed_object_type, S32* required_width); - void updateResizeState(S32 width, S32 height); - void verifyChildControlsSizes(); + /** + * Extends shown buttons to increase total taken space. + * + * @param - available_width - width which buttons can use to be extended. It is a positive value. + * It is decreased on the value processed by buttons. + */ + void processExtendButtons(S32* available_width); + void processExtendButton(EResizeState processed_object_type, S32* available_width); - EResizeState mResizeState; + /** + * Determines if specified by type object can be shown. It should be hidden by shrink before. + * + * Processes buttons a such way to show buttons in constant order: + * - Gestures, Move, View, Snapshot + */ + bool canButtonBeShown(EResizeState processed_object_type) const; + void initStateProcessedObjectMap(); + + /** + * Sets passed visibility to object specified by resize type. + */ + void setTrayButtonVisible(EResizeState shown_object_type, bool visible); + + /** + * Sets passed visibility to object specified by resize type if it is possible. + * + * If it is impossible to show required button due to there is no enough room in bottom tray + * it will no be shown. Is called via context menu commands. + * In this case Alert Dialog will be shown to notify user about that. + * + * Method also stores resize state to be processed while future bottom tray extending: + * - if hidden while resizing button should be hidden it will not be shown while extending; + * - if hidden via context menu button should be shown but there is no enough room for now + * it will be shown while extending. + */ + void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true); + + /** + * Sets passed visibility to required button and fit widths of shown + * buttons(notice that method can shrink widths to + * allocate needed room in bottom tray). + * Returns true if visibility of required button was set. + */ + bool setVisibleAndFitWidths(EResizeState object_type, bool visible); + + /** + * Shows/hides panel with specified well button (IM or Notification) + * + * @param[in] object_type - type of well button to be processed. + * Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL. + * @param[in] visible - flag specified whether button should be shown or hidden. + */ + void showWellButton(EResizeState object_type, bool visible); + + MASK mResizeState; + + typedef std::map<EResizeState, LLPanel*> state_object_map_t; + state_object_map_t mStateProcessedObjectMap; + + typedef std::map<EResizeState, S32> state_object_width_map_t; + state_object_width_map_t mObjectDefaultWidthMap; + + typedef std::map<EResizeState, LLUICtrl*> dummies_map_t; + dummies_map_t mDummiesMap; protected: @@ -103,14 +216,13 @@ protected: static void* createNearbyChatBar(void* userdata); - /** - * Creates IM Chiclet based on session type (IM chat or Group chat) - */ - LLIMChiclet* createIMChiclet(const LLUUID& session_id); + void updateContextMenu(S32 x, S32 y, MASK mask); + void onContextMenuItemClicked(const LLSD& userdata); + bool onContextMenuItemEnabled(const LLSD& userdata); LLChicletPanel* mChicletPanel; - LLNotificationChiclet* mSysWell; - LLTalkButton* mTalkBtn; + LLPanel* mSpeakPanel; + LLSpeakButton* mSpeakBtn; LLNearbyChatBar* mNearbyChatBar; LLLayoutStack* mToolbarStack; LLMenuGL* mBottomTrayContextMenu; @@ -120,6 +232,8 @@ protected: LLPanel* mGesturePanel; LLButton* mCamButton; LLButton* mMovementButton; + LLBottomTrayLite* mBottomTrayLite; + bool mIsInLiteMode; }; #endif // LL_LLBOTTOMPANEL_H |