diff options
| author | Mike Antipov <mantipov@productengine.com> | 2010-05-19 15:23:51 +0300 | 
|---|---|---|
| committer | Mike Antipov <mantipov@productengine.com> | 2010-05-19 15:23:51 +0300 | 
| commit | 5d4b48bbb4c20ad4fcbba31d92ebcf23ef5496a6 (patch) | |
| tree | 316d1db05701c49cd5707391c6f9c660ec313456 | |
| parent | 7f4680c8c22804e6506375e4cedd1daf7d721670 (diff) | |
EXT-7104 WIP Implemented a functionality to control the width of the chat entry field.
* LLResizeBar calls notifyParent on resizing before changing rect of view, bottomtray processed this notification to update other buttons.
* Had to move setup of buttons visibility on startup into LLBottomTray to ensure all buttons have necessary visibility BEFORE restore the width of the chat entry field;
* Updated layout between chatbar and speak button to show resize mouse pointer in the middle between them.
Implemented behavior: visible buttons shrink to their minimal width when the chat entry field gets wider.
Also were refactored:
* moved declaration of settings related to buttons visibility from the settings.xml to LLBottomTray.
* moved setting of control listeners to LLBottomTray.
Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/403/
--HG--
branch : product-engine
| -rw-r--r-- | indra/llui/llresizebar.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 44 | ||||
| -rw-r--r-- | indra/newview/llbottomtray.cpp | 91 | ||||
| -rw-r--r-- | indra/newview/llbottomtray.h | 11 | ||||
| -rw-r--r-- | indra/newview/llviewercontrol.cpp | 29 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 20 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_bottomtray.xml | 17 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml | 2 | 
8 files changed, 115 insertions, 104 deletions
| diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp index 0c46edf300..5d26b904b5 100644 --- a/indra/llui/llresizebar.cpp +++ b/indra/llui/llresizebar.cpp @@ -182,6 +182,11 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)  				break;  			} +			notifyParent(LLSD().with("action", "resize") +				.with("view_name", mResizingView->getName()) +				.with("new_height", new_height) +				.with("new_width", new_width)); +  			scaled_rect.mTop = scaled_rect.mBottom + new_height;  			scaled_rect.mRight = scaled_rect.mLeft + new_width;  			mResizingView->setRect(scaled_rect); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f71662a7c8..cae4a14eed 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8140,17 +8140,6 @@        <key>Value</key>        <integer>0</integer>      </map>     -    <key>ShowCameraButton</key>                 -    <map> -      <key>Comment</key> -      <string>Show/Hide Camera button in the bottom tray</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer>    -    </map>  	<key>ShowScriptErrors</key>      <map>        <key>Comment</key> @@ -8173,39 +8162,6 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>ShowSnapshotButton</key>                 -    <map> -      <key>Comment</key> -      <string>Show/Hide Snapshot button button in the bottom tray</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer>    -    </map> -    <key>ShowMoveButton</key>                 -    <map> -      <key>Comment</key> -      <string>Show/Hide Move button in the bottom tray</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer>    -    </map>     -    <key>ShowGestureButton</key>                 -    <map> -      <key>Comment</key> -      <string>Show/Hide Gesture button in the bottom tray</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>Boolean</string> -      <key>Value</key> -      <integer>1</integer>    -    </map>      <key>ShowObjectRenderingCost</key>                      <map>        <key>Comment</key> diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 7f528c88b2..2c82fc5118 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -61,7 +61,7 @@ namespace  	const std::string& PANEL_CAMERA_NAME	= "cam_panel";  	const std::string& PANEL_GESTURE_NAME	= "gesture_panel"; -	S32 get_panel_min_width(LLLayoutStack* stack, LLPanel* panel) +	S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel)  	{  		S32 minimal_width = 0;  		llassert(stack); @@ -183,6 +183,13 @@ LLBottomTray::~LLBottomTray()  	{  		LLIMMgr::getInstance()->removeSessionObserver(this);  	} + +	if (mNearbyChatBar) +	{ +		// store custom width of chatbar panel. +		S32 custom_width = mNearbyChatBar->getRect().getWidth(); +		gSavedSettings.setS32("ChatBarCustomWidth", custom_width); +	}  }  // *TODO Vadim: why void* ? @@ -361,6 +368,20 @@ S32 LLBottomTray::notifyParent(const LLSD& info)  		showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible);  		return 1;  	} + +	if (info.has("action") && info["action"] == "resize") +	{ +		const std::string& name = info["view_name"]; + +		// expected only resize of nearby chatbar +		if (mNearbyChatBar->getName() != name) return LLPanel::notifyParent(info); + +		const S32 new_width = info["new_width"]; + +		processChatbarCustomization(new_width); + +		return 2; +	}  	return LLPanel::notifyParent(info);  } @@ -648,6 +669,24 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)  	if (mNearbyChatBar)			log(mNearbyChatBar, "after");  	if (mChicletPanel)			log(mChicletPanel, "after"); + + +	// Restore width of the chatbar on first reshape. +	// we can not to do this from postBuild because reshape is called from parent view on startup +	// creation after it and reset width according to resize logic. +	static bool needs_restore_custom_state = true; +	if (mNearbyChatBar && needs_restore_custom_state) +	{ +		// restore custom width of chatbar panel. +		S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth"); +		if (new_width > 0) +		{ +			processChatbarCustomization(new_width); +			mNearbyChatBar->reshape(new_width, mNearbyChatBar->getRect().getHeight()); +		} +		needs_restore_custom_state = false; +	} +  }  S32 LLBottomTray::processWidthDecreased(S32 delta_width) @@ -1168,7 +1207,11 @@ void LLBottomTray::initResizeStateContainers()  void LLBottomTray::initButtonsVisibility()  { -	// *TODO: move control settings of other buttons here +	setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton")); +	setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton")); +	setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); +	setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton")); +  	setTrayButtonVisibleIfPossible(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton"));  	setTrayButtonVisibleIfPossible(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton"));  	setTrayButtonVisibleIfPossible(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton")); @@ -1177,13 +1220,24 @@ void LLBottomTray::initButtonsVisibility()  void LLBottomTray::setButtonsControlsAndListeners()  { -	// *TODO: move control settings of other buttons here +	gSavedSettings.declareBOOL("ShowGestureButton", TRUE, "Shows/Hides Gesture button in the bottom tray. (Declared in code)"); +	gSavedSettings.declareBOOL("ShowMoveButton", TRUE, "Shows/Hides Move button in the bottom tray. (Declared in code)"); +	gSavedSettings.declareBOOL("ShowSnapshotButton", TRUE, "Shows/Hides Snapshot button button in the bottom tray. (Declared in code)"); +	gSavedSettings.declareBOOL("ShowCameraButton", TRUE, "Show/Hide View button in the bottom tray. (Declared in code)");  	gSavedSettings.declareBOOL("ShowBuildButton", TRUE, "Shows/Hides Build button in the bottom tray. (Declared in code)");  	gSavedSettings.declareBOOL("ShowSearchButton", TRUE, "Shows/Hides Search button in the bottom tray. (Declared in code)");  	gSavedSettings.declareBOOL("ShowWorldMapButton", TRUE, "Shows/Hides Map button in the bottom tray. (Declared in code)");  	gSavedSettings.declareBOOL("ShowMiniMapButton", TRUE, "Shows/Hides Mini-Map button in the bottom tray. (Declared in code)"); +	gSavedSettings.declareS32("ChatBarCustomWidth", 0, "Stores customized width of chat bar. (Declared in code)"); + + +	gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2)); +	gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2)); +	gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); +	gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SNAPSHOT, _2)); +  	gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2));  	gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2));  	gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2)); @@ -1262,6 +1316,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible  			const S32 chatbar_shrunk_width =  				mNearbyChatBar->getRect().getWidth() - get_panel_min_width(mToolbarStack, mNearbyChatBar); +			// *TODO: update list of processed buttons to use new buttons;  			const S32 sum_of_min_widths =  				get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_CAMERA])   +  				get_panel_min_width(mToolbarStack, mStateProcessedObjectMap[RS_BUTTON_MOVEMENT]) + @@ -1352,4 +1407,34 @@ void LLBottomTray::showWellButton(EResizeState object_type, bool visible)  	}  } +void LLBottomTray::processChatbarCustomization(S32 new_width) +{ +	if (NULL == mNearbyChatBar) return; + +	const S32 delta_width = mNearbyChatBar->getRect().getWidth() - new_width; + +	if (delta_width == 0) return; + +	LLView * chiclet_layout_panel = mChicletPanel->getParent(); +	const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel); +	const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth(); +	const S32 available_chiclet_shrink_width = chiclet_panel_width - chiclet_min_width; +	llassert(available_chiclet_shrink_width >= 0); + +	if (delta_width > 0) // panel gets narrowly +	{ +		S32 total_possible_width = delta_width + available_chiclet_shrink_width; +		processShowButtons(total_possible_width); +		processExtendButtons(total_possible_width); +	} +	// here (delta_width < 0) // panel gets wider +	else //if (-delta_width > available_chiclet_shrink_width) +	{ +		S32 required_width = delta_width + available_chiclet_shrink_width; +		S32 buttons_freed_width = 0; +		processShrinkButtons(required_width, buttons_freed_width); +		processHideButtons(required_width, buttons_freed_width); +	} +} +  //EOF diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 5588aefb42..74b8ed0d87 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -341,6 +341,17 @@ private:  	 */  	void showWellButton(EResizeState object_type, bool visible); +	/** +	 * Handles a customization of chatbar width. +	 * +	 * When chatbar gets wider layout stack will reduce chiclet panel (it is auto-resizable) +	 *	But once chiclet panel reaches its minimal width Stack will force to reduce buttons width. +	 *	including Speak button. The similar behavior is when chatbar gets narrowly. +	 * This methods force resize behavior to resize buttons properly in these cases. +	 */ +	void processChatbarCustomization(S32 new_width); + +  	MASK mResizeState;  	typedef std::map<EResizeState, LLPanel*> state_object_map_t; diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 514f72c334..f02e15706d 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -70,7 +70,6 @@  #include "llvosurfacepatch.h"  #include "llvowlsky.h"  #include "llrender.h" -#include "llbottomtray.h"  #include "llnavigationbar.h"  #include "llfloatertools.h"  #include "llpaneloutfitsinventory.h" @@ -460,30 +459,6 @@ bool toggle_agent_pause(const LLSD& newvalue)  	return true;  } -bool toggle_show_gesture_button(const LLSD& newvalue) -{ -	LLBottomTray::getInstance()->showGestureButton(newvalue.asBoolean()); -	return true; -} - -bool toggle_show_move_button(const LLSD& newvalue) -{ -	LLBottomTray::getInstance()->showMoveButton(newvalue.asBoolean()); -	return true; -} - -bool toggle_show_camera_button(const LLSD& newvalue) -{ -	LLBottomTray::getInstance()->showCameraButton(newvalue.asBoolean()); -	return true; -} - -bool toggle_show_snapshot_button(const LLSD& newvalue) -{ -	LLBottomTray::getInstance()->showSnapshotButton(newvalue.asBoolean()); -	return true; -} -  bool toggle_show_navigation_panel(const LLSD& newvalue)  {  	LLNavigationBar::getInstance()->showNavigationPanel(newvalue.asBoolean()); @@ -638,10 +613,6 @@ void settings_setup_listeners()  	gSavedSettings.getControl("QAMode")->getSignal()->connect(boost::bind(&show_debug_menus));  	gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus));  	gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2)); -	gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&toggle_show_gesture_button, _2)); -	gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&toggle_show_move_button, _2)); -	gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&toggle_show_camera_button, _2)); -	gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&toggle_show_snapshot_button, _2));  	gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));  	gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));  	gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2)); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 56d22a0608..9b45ffcc82 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1664,26 +1664,6 @@ void LLViewerWindow::initWorldUI()  		navbar->showFavoritesPanel(FALSE);  	} -	if (!gSavedSettings.getBOOL("ShowCameraButton")) -	{ -		LLBottomTray::getInstance()->showCameraButton(FALSE); -	} - -	if (!gSavedSettings.getBOOL("ShowSnapshotButton")) -	{ -		LLBottomTray::getInstance()->showSnapshotButton(FALSE); -	} - -	if (!gSavedSettings.getBOOL("ShowMoveButton")) -	{ -		LLBottomTray::getInstance()->showMoveButton(FALSE); -	} - -	if (!gSavedSettings.getBOOL("ShowGestureButton")) -	{ -		LLBottomTray::getInstance()->showGestureButton(FALSE); -	} -  	if ( gHUDView == NULL )  	{  		LLRect hud_rect = full_window; diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 2cb91fe1f0..0840812826 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -48,29 +48,32 @@           left="0"           max_width="320"           min_height="23" -         min_width="216" +         min_width="214"           mouse_opaque="false"           name="chat_bar"           top="4" -         user_resize="false" -         width="310" /> +         user_resize="true" +         width="308" /> +        <!-- +        There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap) +        -->          <layout_panel           auto_resize="false"           follows="right"           height="28"           layout="topleft"           min_height="28" -         min_width="57" +         min_width="59"           mouse_opaque="false"           name="speak_panel"           top_delta="0"           user_resize="false" -         width="108"> +         width="110">              <talk_button               follows="left|right"               height="23"               layout="topleft" -             left="0" +             left="2"               name="talk"               top="5"               width="105"> @@ -190,7 +193,7 @@           min_width="40"           mouse_opaque="false"           name="snapshot_panel" -         width="40"> +         width="39">              <button               follows="left|right"               height="23" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index 5dbd8bfe6a..55df70eb71 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -7,7 +7,7 @@   left="0"   name="chat_bar"   top="21" - width="310"> + width="308">      <line_editor       border_style="line"       border_thickness="1" | 
