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 | |
| 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
| -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> | 
