STORM-236 FIXED Allow the "Speak" button to be removed, like other buttons.

Cumulative diff of changes made by Wolfpup, Richard and me.

Description:
* Ability to hide the Speak button with the bottom tray context menu.
* Made the chat input resize handle visible, so that the feature is easily discoverable.
* Applied Richard's fix to layout panel resizing logic.
meow-7.2.2
Vadim ProductEngine 2011-03-03 20:49:42 +02:00
parent aa72b0df03
commit 0247cd6aeb
8 changed files with 103 additions and 22 deletions

View File

@ -831,6 +831,7 @@ WolfPup Lowenhar
STORM-102
STORM-103
STORM-143
STORM-236
STORM-255
STORM-256
STORM-288

View File

@ -563,7 +563,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
}
// update resize bars with new limits
LLResizeBar* last_resize_bar = NULL;
LLLayoutPanel* last_resizeable_panel = NULL;
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
{
LLPanel* panelp = (*panel_it);
@ -585,17 +585,17 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
BOOL resize_bar_enabled = panelp->getVisible() && (*panel_it)->mUserResize;
(*panel_it)->mResizeBar->setVisible(resize_bar_enabled);
if (resize_bar_enabled)
if ((*panel_it)->mUserResize || (*panel_it)->mAutoResize)
{
last_resize_bar = (*panel_it)->mResizeBar;
last_resizeable_panel = (*panel_it);
}
}
// hide last resize bar as there is nothing past it
// resize bars need to be in between two resizable panels
if (last_resize_bar)
if (last_resizeable_panel)
{
last_resize_bar->setVisible(FALSE);
last_resizeable_panel->mResizeBar->setVisible(FALSE);
}
// not enough room to fit existing contents

View File

@ -67,10 +67,14 @@ BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
{
if (mCanDrag)
{
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
// pass hover to bottomtray
LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
// pass hover to bottomtray
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
// Reset cursor in case you move your mouse from the drag handle to a button.
getWindow()->setCursor(UI_CURSOR_ARROW);
return TRUE;
}
else
@ -505,6 +509,22 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
}
void LLBottomTray::showSpeakButton(bool visible)
{
setTrayButtonVisible(RS_BUTTON_SPEAK, visible);
// Adjust other panels.
const S32 panel_width = mSpeakPanel->getRect().getWidth();
if (visible)
{
processWidthDecreased(-panel_width);
}
else
{
processWidthIncreased(panel_width);
}
}
void LLBottomTray::toggleMovementControls()
{
if (mMovementButton)
@ -698,6 +718,7 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
if (!landing_state_found) landing_state = RS_BUTTON_SPEAK;
mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state);
}
// Synchronize button process order with their order
resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin();
const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end();
@ -774,11 +795,12 @@ void LLBottomTray::loadButtonsOrder()
// placing panels in layout stack according to button order which we loaded in previous for
for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i)
{
LLPanel* panel_to_move = *it == RS_BUTTON_SPEAK ? mSpeakPanel : mStateProcessedObjectMap[*it];
LLPanel* panel_to_move = getButtonPanel(*it);
mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend
}
// Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it
// manually here
mToolbarStack->movePanel(getChild<LLLayoutPanel>("chat_bar_resize_handle_panel"), NULL, true);
mToolbarStack->movePanel(mChatBarContainer, NULL, true);
}
@ -1273,7 +1295,6 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_
// then shrink Speak button
if (required_width < 0)
{
S32 panel_min_width = 0;
std::string panel_name = mSpeakPanel->getName();
bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width);
@ -1521,13 +1542,13 @@ void LLBottomTray::initResizeStateContainers()
// ... and add Speak button because it also can be shrunk.
mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
}
// this method must be called before restoring of the chat entry field on startup
// because it resets chatbar's width according to resize logic.
void LLBottomTray::initButtonsVisibility()
{
setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat"));
setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
@ -1540,6 +1561,7 @@ void LLBottomTray::initButtonsVisibility()
void LLBottomTray::setButtonsControlsAndListeners()
{
gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
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));
@ -1568,8 +1590,7 @@ bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, cons
void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
{
llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
LLPanel* panel = getButtonPanel(shown_object_type);
if (NULL == panel)
{
lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
@ -1592,6 +1613,14 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type
bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible)
{
// The Speak button is treated specially: if voice is enabled,
// the button should be displayed no matter how much space we've got.
if (object_type == RS_BUTTON_SPEAK)
{
showSpeakButton(visible);
return true;
}
LLPanel* cur_panel = mStateProcessedObjectMap[object_type];
if (NULL == cur_panel)
{
@ -1695,6 +1724,17 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
return is_set;
}
LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type)
{
if (button_type == RS_BUTTON_SPEAK)
{
return mSpeakPanel;
}
llassert(mStateProcessedObjectMap[button_type] != NULL);
return mStateProcessedObjectMap[button_type];
}
void LLBottomTray::showWellButton(EResizeState object_type, bool visible)
{
llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type );

View File

@ -116,6 +116,7 @@ public:
void showMoveButton(BOOL visible);
void showCameraButton(BOOL visible);
void showSnapshotButton(BOOL visible);
void showSpeakButton(bool visible);
void toggleMovementControls();
void toggleCameraControls();
@ -390,6 +391,11 @@ private:
*/
bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
/**
* Get panel containing the given button.
*/
LLPanel* getButtonPanel(EResizeState button_type);
/**
* Shows/hides panel with specified well button (IM or Notification)
*
@ -410,6 +416,7 @@ private:
void processChatbarCustomization(S32 new_width);
/// Buttons automatically hidden due to lack of space.
MASK mResizeState;
typedef std::map<EResizeState, LLPanel*> state_object_map_t;
@ -424,6 +431,7 @@ private:
* Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
*/
resize_state_vec_t mButtonsProcessOrder;
/**
* Contains order in which child buttons are shown.
* It traces order of all bottomtray buttons that may change place via drag'n'drop and should

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -115,6 +115,7 @@ with the same filename but different name
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
<texture name="ChatBarHandle" file_name="bottomtray/ChatBarHandle.png" preload="false" />
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
<texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
<texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />

View File

@ -8,6 +8,18 @@
top="624"
visible="false"
width="128">
<menu_item_check
label="Voice Enabled"
layout="topleft"
name="EnableVoiceChat">
<menu_item_check.on_click
function="ToggleControl"
parameter="EnableVoiceChat" />
<menu_item_check.on_check
function="CheckControl"
parameter="EnableVoiceChat" />
</menu_item_check>
<menu_item_separator/>
<menu_item_check
label="Gesture button"
layout="topleft"

View File

@ -45,11 +45,11 @@
min_width="214"
height="28"
mouse_opaque="false"
name="chat_bar_layout_panel"
name="chat_bar_layout_panel"
user_resize="true"
width="308" >
width="310" >
<panel
name="chat_bar"
name="chat_bar"
filename="panel_nearby_chat_bar.xml"
left="0"
height="28"
@ -60,11 +60,30 @@
/>
</layout_panel>
<!--
There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap)
This 5px Panel is an indicator of where the resize handle is.
The panel provides a gap between the resize handle icon and a button to the right.
-->
<layout_panel
auto_resize="false"
follows="right"
layout="topleft"
max_width="5"
min_width="5"
name="chat_bar_resize_handle_panel"
user_resize="false"
width="5">
<icon
follows="top|right"
height="25"
image_name="ChatBarHandle"
layout="topleft"
left="-7"
name="resize_handle"
top="4"
width="5" />
</layout_panel>
<layout_panel
auto_resize="false"
follows="left|right"
height="28"
layout="topleft"
min_height="28"
@ -72,13 +91,13 @@
mouse_opaque="false"
name="speak_panel"
top_delta="0"
user_resize="true"
width="110">
user_resize="false"
width="108">
<talk_button
follows="left|right"
height="23"
layout="topleft"
left="2"
left="0"
name="talk"
top="5"
width="105">