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-enginemeow-7.2.2
parent
7f4680c8c2
commit
5d4b48bbb4
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
left="0"
|
||||
name="chat_bar"
|
||||
top="21"
|
||||
width="310">
|
||||
width="308">
|
||||
<line_editor
|
||||
border_style="line"
|
||||
border_thickness="1"
|
||||
|
|
|
|||
Loading…
Reference in New Issue