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
meow-7.2.2
Mike Antipov 2010-05-19 15:23:51 +03:00
parent 7f4680c8c2
commit 5d4b48bbb4
8 changed files with 115 additions and 104 deletions

View File

@ -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);

View File

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

View File

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

View File

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

View File

@ -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));

View File

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

View File

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

View File

@ -7,7 +7,7 @@
left="0"
name="chat_bar"
top="21"
width="310">
width="308">
<line_editor
border_style="line"
border_thickness="1"