diff options
author | Eugene Mutavchi <emutavchi@productengine.com> | 2010-01-29 19:55:41 +0200 |
---|---|---|
committer | Eugene Mutavchi <emutavchi@productengine.com> | 2010-01-29 19:55:41 +0200 |
commit | d3eb0e9765460801829419b15693b1b00ee5d369 (patch) | |
tree | ddb5d6ace5ec13786c3e6e0c4ac3b0c688519552 /indra/newview | |
parent | 3b34147ceafa02849fa3275e11ac2ae6a55c33a3 (diff) |
Fixed normal bug EXT-4697 (Buttons in bottom bar are compressed after quitting mouselook mode) and low bug EXT-4723 (Not all buttons are displayed on the bottom bar after leaving mouse look): - implemented the LLBottomTrayLite, which appears only in mouselook mode.
--HG--
branch : product-engine
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llagent.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llbottomtray.cpp | 173 | ||||
-rw-r--r-- | indra/newview/llbottomtray.h | 18 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/panel_bottomtray.xml | 9 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml | 95 |
5 files changed, 199 insertions, 98 deletions
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index da0e9238d6..2354323a66 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -2805,7 +2805,6 @@ void LLAgent::endAnimationUpdateUI() LLNavigationBar::getInstance()->setVisible(TRUE); gStatusBar->setVisibleForMouselook(true); - LLBottomTray::getInstance()->setVisible(TRUE); LLBottomTray::getInstance()->onMouselookModeOut(); LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE); @@ -2906,7 +2905,6 @@ void LLAgent::endAnimationUpdateUI() gStatusBar->setVisibleForMouselook(false); LLBottomTray::getInstance()->onMouselookModeIn(); - LLBottomTray::getInstance()->setVisible(FALSE); LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE); LLSideTray::getInstance()->updateSidetrayVisibility(); diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index bd68d52868..a2d594cfa2 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -62,6 +62,39 @@ namespace const std::string& PANEL_GESTURE_NAME = "gesture_panel"; } +class LLBottomTrayLite + : public LLPanel +{ +public: + LLBottomTrayLite() + : mNearbyChatBar(NULL), + mGesturePanel(NULL) + { + mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_bottomtray_lite.xml"); + // Necessary for focus movement among child controls + setFocusRoot(TRUE); + } + + BOOL postBuild() + { + mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); + mGesturePanel = getChild<LLPanel>("gesture_panel"); + return TRUE; + } + + void onFocusLost() + { + if (gAgent.cameraMouselook()) + { + LLBottomTray::getInstance()->setVisible(FALSE); + } + } + + LLNearbyChatBar* mNearbyChatBar; + LLPanel* mGesturePanel; +}; + LLBottomTray::LLBottomTray(const LLSD&) : mChicletPanel(NULL), mSpeakPanel(NULL), @@ -76,6 +109,8 @@ LLBottomTray::LLBottomTray(const LLSD&) , mSnapshotPanel(NULL) , mGesturePanel(NULL) , mCamButton(NULL) +, mBottomTrayLite(NULL) +, mIsInLiteMode(false) { // Firstly add ourself to IMSession observers, so we catch session events // before chiclets do that. @@ -100,6 +135,12 @@ LLBottomTray::LLBottomTray(const LLSD&) // Necessary for focus movement among child controls setFocusRoot(TRUE); + + { + mBottomTrayLite = new LLBottomTrayLite(); + mBottomTrayLite->setFollowsAll(); + mBottomTrayLite->setVisible(FALSE); + } } LLBottomTray::~LLBottomTray() @@ -134,6 +175,11 @@ void* LLBottomTray::createNearbyChatBar(void* userdata) return new LLNearbyChatBar(); } +LLNearbyChatBar* LLBottomTray::getNearbyChatBar() +{ + return mIsInLiteMode ? mBottomTrayLite->mNearbyChatBar : mNearbyChatBar; +} + LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id) { LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id); @@ -237,68 +283,27 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b mSpeakBtn->setEnabled(enable); } -//virtual -void LLBottomTray::onFocusLost() +void LLBottomTray::onMouselookModeOut() { - if (gAgent.cameraMouselook()) - { - setVisible(FALSE); - } + mIsInLiteMode = false; + mBottomTrayLite->setVisible(FALSE); + mNearbyChatBar->getChatBox()->setText(mBottomTrayLite->mNearbyChatBar->getChatBox()->getText()); + setVisible(TRUE); } -void LLBottomTray::savePanelsShape() +void LLBottomTray::onMouselookModeIn() { - mSavedShapeList.clear(); - for (child_list_const_iter_t - child_it = mToolbarStack->beginChild(), - child_it_end = mToolbarStack->endChild(); - child_it != child_it_end; ++child_it) - { - mSavedShapeList.push_back( (*child_it)->getRect() ); - } -} + setVisible(FALSE); -void LLBottomTray::restorePanelsShape() -{ - if (mSavedShapeList.size() != mToolbarStack->getChildCount()) - return; - int i = 0; - for (child_list_const_iter_t - child_it = mToolbarStack->beginChild(), - child_it_end = mToolbarStack->endChild(); - child_it != child_it_end; ++child_it) - { - (*child_it)->setShape(mSavedShapeList[i++]); - } -} + // Attach the lite bottom tray + if (getParent() && mBottomTrayLite->getParent() != getParent()) + getParent()->addChild(mBottomTrayLite); -void LLBottomTray::onMouselookModeOut() -{ - // Apply the saved settings when we are not in mouselook mode, see EXT-3988. - { - setTrayButtonVisibleIfPossible (RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"), false); - setTrayButtonVisibleIfPossible (RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"), false); - setTrayButtonVisibleIfPossible (RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"), false); - setTrayButtonVisibleIfPossible (RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton"),false); - } - // HACK: To avoid usage the LLLayoutStack logic of resizing, we force the updateLayout - // and then restore children saved shapes. See EXT-4309. - BOOL saved_anim = mToolbarStack->getAnimate(); - mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE); - // Disable animation to prevent layout updating in several frames. - mToolbarStack->setAnimate(FALSE); - // Force the updating of layout to reset panels collapse factor. - mToolbarStack->updateLayout(); - // Restore animate state. - mToolbarStack->setAnimate(saved_anim); - // Restore saved shapes. - restorePanelsShape(); -} + mBottomTrayLite->setShape(getLocalRect()); + mBottomTrayLite->mNearbyChatBar->getChatBox()->setText(mNearbyChatBar->getChatBox()->getText()); + mBottomTrayLite->mGesturePanel->setVisible(gSavedSettings.getBOOL("ShowGestureButton")); -void LLBottomTray::onMouselookModeIn() -{ - savePanelsShape(); - mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE); + mIsInLiteMode = true; } //virtual @@ -306,31 +311,14 @@ void LLBottomTray::onMouselookModeIn() // If bottom tray is already visible in mouselook mode, then onVisibilityChange will not be called from setVisible(true), void LLBottomTray::setVisible(BOOL visible) { - LLPanel::setVisible(visible); - - // *NOTE: we must check mToolbarStack against NULL because setVisible is called from the - // LLPanel::initFromParams BEFORE postBuild is called and child controls are not exist yet - if (NULL != mToolbarStack) + if (mIsInLiteMode) { - BOOL visibility = gAgent.cameraMouselook() ? false : true; - - for ( child_list_const_iter_t child_it = mToolbarStack->getChildList()->begin(); - child_it != mToolbarStack->getChildList()->end(); child_it++) - { - LLView* viewp = *child_it; - std::string name = viewp->getName(); - - // Chat bar and gesture button are shown even in mouselook mode. - // But the move, camera and snapshot buttons shouldn't be displayed. See EXT-3988. - if ("chat_bar" == name || "gesture_panel" == name || (visibility && ("movement_panel" == name || "cam_panel" == name || "snapshot_panel" == name))) - continue; - else - { - viewp->setVisible(visibility); - } - } + mBottomTrayLite->setVisible(visible); + } + else + { + LLPanel::setVisible(visible); } - if(visible) gFloaterView->setSnapOffsetBottom(getRect().getHeight()); else @@ -535,7 +523,18 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) if (mChicletPanel && mToolbarStack && mNearbyChatBar) { - mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); + // Firstly, update layout stack to ensure we deal with correct panel sizes. + { + BOOL saved_anim = mToolbarStack->getAnimate(); + // Set chiclet panel to be autoresized by default. + mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE); + // Disable animation to prevent layout updating in several frames. + mToolbarStack->setAnimate(FALSE); + // Force the updating of layout to reset panels collapse factor. + mToolbarStack->updateLayout(); + // Restore animate state. + mToolbarStack->setAnimate(saved_anim); + } // bottom tray is narrowed if (delta_width < 0) @@ -637,7 +636,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight()); - log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel"); + log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel"); lldebugs << "RS_CHATBAR_INPUT" << ", delta_panel: " << delta_panel @@ -1057,6 +1056,11 @@ void LLBottomTray::initStateProcessedObjectMap() mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel)); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel)); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel)); + + mDummiesMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLUICtrl>("after_gesture_panel"))); + mDummiesMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLUICtrl>("after_movement_panel"))); + mDummiesMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLUICtrl>("after_cam_panel"))); + mDummiesMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLUICtrl>("after_speak_panel"))); } void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) @@ -1069,6 +1073,11 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis } panel->setVisible(visible); + + if (mDummiesMap.count(shown_object_type)) + { + mDummiesMap[shown_object_type]->setVisible(visible); + } } void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification) @@ -1084,6 +1093,8 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type return; } + const S32 dummy_width = mDummiesMap.count(shown_object_type) ? mDummiesMap[shown_object_type]->getRect().getWidth() : 0; + const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth(); @@ -1093,7 +1104,7 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width) + (chiclet_panel_width - chiclet_panel_min_width); - const S32 required_width = panel->getRect().getWidth(); + const S32 required_width = panel->getRect().getWidth() + dummy_width; can_be_set = available_width >= required_width; } diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 562ee56912..ee0eb13218 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -46,6 +46,7 @@ class LLNotificationChiclet; class LLSpeakButton; class LLNearbyChatBar; class LLIMChiclet; +class LLBottomTrayLite; // Build time optimization, generate once in .cpp file #ifndef LLBOTTOMTRAY_CPP @@ -60,13 +61,14 @@ class LLBottomTray { LOG_CLASS(LLBottomTray); friend class LLSingleton<LLBottomTray>; + friend class LLBottomTrayLite; public: ~LLBottomTray(); BOOL postBuild(); LLChicletPanel* getChicletPanel() {return mChicletPanel;} - LLNearbyChatBar* getNearbyChatBar() {return mNearbyChatBar;} + LLNearbyChatBar* getNearbyChatBar(); void onCommitGesture(LLUICtrl* ctrl); @@ -79,7 +81,6 @@ public: virtual void reshape(S32 width, S32 height, BOOL called_from_parent); - virtual void onFocusLost(); virtual void setVisible(BOOL visible); // Implements LLVoiceClientStatusObserver::onChange() to enable the speak @@ -172,13 +173,6 @@ private: */ void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true); - /** - * Save and restore children shapes. - * Used to avoid the LLLayoutStack resizing logic between mouse look mode switching. - */ - void savePanelsShape(); - void restorePanelsShape(); - MASK mResizeState; typedef std::map<EResizeState, LLPanel*> state_object_map_t; @@ -187,8 +181,8 @@ private: typedef std::map<EResizeState, S32> state_object_width_map_t; state_object_width_map_t mObjectDefaultWidthMap; - typedef std::vector<LLRect> shape_list_t; - shape_list_t mSavedShapeList; + typedef std::map<EResizeState, LLUICtrl*> dummies_map_t; + dummies_map_t mDummiesMap; protected: @@ -214,6 +208,8 @@ protected: LLPanel* mGesturePanel; LLButton* mCamButton; LLButton* mMovementButton; + LLBottomTrayLite* mBottomTrayLite; + bool mIsInLiteMode; }; #endif // LL_LLBOTTOMPANEL_H diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 09ec2137b7..aad55685d2 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -87,7 +87,7 @@ image_name="spacer24.tga" layout="topleft" left="0" - name="DUMMY" + name="after_speak_panel" min_width="3" top="0" width="3"/> @@ -127,7 +127,7 @@ layout="topleft" left="0" min_width="3" - name="DUMMY" + name="after_gesture_panel" top="0" width="3"/> <layout_panel @@ -169,7 +169,7 @@ layout="topleft" left="0" min_width="3" - name="DUMMY" + name="after_movement_panel" top="0" width="3"/> <layout_panel @@ -212,7 +212,7 @@ layout="topleft" left="0" min_width="3" - name="DUMMY" + name="after_cam_panel" top="0" width="3"/> <layout_panel @@ -317,6 +317,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. layout="topleft" left="0" min_width="4" + name="DUMMY" top="0" width="5"/> <layout_panel diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml new file mode 100644 index 0000000000..6e9476f814 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + default_tab_group="2" + mouse_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + follows="left|bottom|right" + height="33" + layout="topleft" + left="0" + name="bottom_tray_lite" + tab_stop="true" + top="28" + chrome="true" + border_visible="false" + visible="false" + width="1000"> + <layout_stack + mouse_opaque="false" + border_size="0" + clip="false" + follows="all" + height="28" + layout="topleft" + left="0" + name="toolbar_stack_lite" + orientation="horizontal" + top="0" + width="1000"> + <icon + auto_resize="false" + follows="left|right" + height="10" + image_name="spacer24.tga" + layout="topleft" + min_width="2" + left="0" + top="0" + width="2" /> + <layout_panel + mouse_opaque="false" + auto_resize="true" + follows="left|right" + height="28" + layout="topleft" + left="0" + min_height="23" + width="310" + top="4" + min_width="188" + name="chat_bar" + user_resize="false" + filename="panel_nearby_chat_bar.xml" /> + <layout_panel + mouse_opaque="false" + auto_resize="false" + follows="right" + height="28" + layout="topleft" + min_height="28" + width="82" + top_delta="0" + min_width="52" + name="gesture_panel" + user_resize="false"> + <gesture_combo_list + follows="left|right" + height="23" + label="Gesture" + layout="topleft" + name="Gesture" + left="0" + top="5" + width="82" + tool_tip="Shows/hides gestures"> + <gesture_combo_list.combo_button + pad_right="10" + use_ellipses="true" /> + </gesture_combo_list> + </layout_panel> + <icon + auto_resize="false" + color="0 0 0 0" + follows="left|right" + height="10" + image_name="spacer24.tga" + layout="topleft" + left="0" + min_width="3" + name="after_gesture_panel" + top="0" + width="3"/> + </layout_stack> +</panel> |