summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llui/lllayoutstack.cpp13
-rw-r--r--indra/llui/lllayoutstack.h8
-rw-r--r--indra/newview/llbottomtray.cpp131
-rw-r--r--indra/newview/llbottomtray.h22
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml14
5 files changed, 178 insertions, 10 deletions
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 14a6ddb7e0..1fb618adee 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -413,6 +413,19 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au
}
}
+bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp)
+{
+ LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+
+ if (panel)
+ {
+ if (min_widthp) *min_widthp = panel->mMinWidth;
+ if (min_heightp) *min_heightp = panel->mMinHeight;
+ }
+
+ return NULL != panel;
+}
+
static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
void LLLayoutStack::updateLayout(BOOL force_resize)
{
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index 9cbcb285dc..abd5436018 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -82,6 +82,14 @@ public:
void updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize);
+ /**
+ * Gets minimal width and/or height of the specified by name panel.
+ *
+ * If it is necessary to get only the one dimension pass NULL for another one.
+ * @returns true if specified by panel_name internal panel exists, false otherwise.
+ */
+ bool getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp);
+
void updateLayout(BOOL force_resize = FALSE);
static void updateClass();
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 958dbf226a..3c34aa4fa4 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -317,6 +317,10 @@ BOOL LLBottomTray::postBuild()
// Registering Chat Bar to receive Voice client status change notifications.
gVoiceClient->addObserver(this);
+ mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth();
+ mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth();
+ mObjectDefaultWidthMap[RS_BUTTON_CAMERA] = mCamPanel->getRect().getWidth();
+
return TRUE;
}
@@ -402,7 +406,6 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
}
}
- lldebugs << "There is no enough width to reshape all children: " << extra_shrink_width << llendl;
if (should_be_reshaped)
{
lldebugs << "Reshape all children with width: " << width << llendl;
@@ -473,7 +476,12 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
S32 buttons_freed_width = 0;
if (still_should_be_processed)
{
- processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
+ processShrinkButtons(&delta_width);
+
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
+ }
if (delta_width < 0)
{
@@ -493,7 +501,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
if (delta_width < 0)
{
extra_shrink_width = -delta_width;
- lldebugs << "There is no enough room for bottom tray, resizing still should be processed: "
+ llwarns << "There is no enough width to reshape all children: "
<< extra_shrink_width << llendl;
}
@@ -551,7 +559,7 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
}
- // if we have to show some buttons but whidth increasing is not enough...
+ // if we have to show some buttons but width increasing is not enough...
if (buttons_required_width > 0 && delta_width < buttons_required_width)
{
// ... let's shrink nearby chat & chiclet panels
@@ -587,6 +595,8 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
delta_width -= buttons_required_width;
+ processExtendButtons(&delta_width);
+
// how many space can nearby chatbar take?
S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
@@ -656,6 +666,119 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re
}
}
+void LLBottomTray::processShrinkButtons(S32* required_width)
+{
+ processShrinkButton(RS_BUTTON_CAMERA, required_width);
+
+ if (*required_width < 0)
+ {
+ processShrinkButton(RS_BUTTON_MOVEMENT, required_width);
+ }
+ if (*required_width < 0)
+ {
+ processShrinkButton(RS_BUTTON_GESTURES, required_width);
+ }
+}
+
+void LLBottomTray::processShrinkButton(EResizeState processed_object_type, /*const std::string& panel_name, */S32* required_width)
+{
+ LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
+ return;
+ }
+
+ if (panel->getVisible())
+ {
+ S32 panel_width = panel->getRect().getWidth();
+ S32 panel_min_width = 0;
+ std::string panel_name = panel->getName();
+ bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL);
+ S32 possible_shrink_width = panel_width - panel_min_width;
+
+ if (!success)
+ {
+ lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
+ }
+ // we have some space to free by shrinking the button
+ else if (possible_shrink_width > 0)
+ {
+ // let calculate real width to shrink
+
+ // 1. apply all possible width
+ *required_width += possible_shrink_width;
+
+ // 2. it it is too much...
+ if (*required_width > 0)
+ {
+ // reduce applied shrunk width to the excessive value.
+ possible_shrink_width -= *required_width;
+ *required_width = 0;
+ }
+ panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight());
+
+ lldebugs << "Shrunk panel: " << panel_name
+ << ", shrunk width: " << possible_shrink_width
+ << ", rest width to process: " << *required_width
+ << llendl;
+ }
+ }
+}
+
+
+void LLBottomTray::processExtendButtons(S32* available_width)
+{
+ processExtendButton(RS_BUTTON_GESTURES, available_width);
+
+ if (*available_width > 0)
+ {
+ processExtendButton(RS_BUTTON_CAMERA, available_width);
+ }
+ if (*available_width > 0)
+ {
+ processExtendButton(RS_BUTTON_MOVEMENT, available_width);
+ }
+}
+
+void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width)
+{
+ LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
+ return;
+ }
+
+ if (!panel->getVisible()) return;
+
+ S32 panel_max_width = mObjectDefaultWidthMap[processed_object_type];
+ S32 panel_width = panel->getRect().getWidth();
+ S32 possible_extend_width = panel_max_width - panel_width;
+
+ if (possible_extend_width > 0)
+ {
+ // let calculate real width to extend
+
+ // 1. apply all possible width
+ *available_width -= possible_extend_width;
+
+ // 2. it it is too much...
+ if (*available_width < 0)
+ {
+ // reduce applied extended width to the excessive value.
+ possible_extend_width += *available_width;
+ *available_width = 0;
+ }
+ panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight());
+
+ lldebugs << "Extending panel: " << panel->getName()
+ << ", extended width: " << possible_extend_width
+ << ", rest width to process: " << *available_width
+ << llendl;
+ }
+}
+
bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
{
bool can_be_shown = mResizeState & processed_object_type;
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 8989816bfe..97bcc23403 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -98,7 +98,6 @@ private:
, RS_BUTTON_MOVEMENT = 0x0010
, RS_BUTTON_GESTURES = 0x0020
, RS_BUTTON_SPEAK = 0x0040
- , RS_RESIZABLE_BUTTONS = /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
}EResizeState;
S32 processWidthDecreased(S32 delta_width);
@@ -108,6 +107,24 @@ private:
void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
/**
+ * Shrinks shown buttons to reduce total taken space.
+ *
+ * @param - required_width - width which buttons can use to be shrunk. It is a negative value.
+ * It is increased on the value processed by buttons.
+ */
+ void processShrinkButtons(S32* required_width);
+ void processShrinkButton(EResizeState processed_object_type, S32* required_width);
+
+ /**
+ * Extends shown buttons to increase total taken space.
+ *
+ * @param - available_width - width which buttons can use to be extended. It is a positive value.
+ * It is decreased on the value processed by buttons.
+ */
+ void processExtendButtons(S32* available_width);
+ void processExtendButton(EResizeState processed_object_type, S32* available_width);
+
+ /**
* Determines if specified by type object can be shown. It should be hidden by shrink before.
*
* Processes buttons a such way to show buttons in constant order:
@@ -140,6 +157,9 @@ private:
typedef std::map<EResizeState, LLPanel*> state_object_map_t;
state_object_map_t mStateProcessedObjectMap;
+ typedef std::map<EResizeState, S32> state_object_width_map_t;
+ state_object_width_map_t mObjectDefaultWidthMap;
+
protected:
LLBottomTray(const LLSD& key = LLSD());
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index a902f50582..d2933c0c0e 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -94,7 +94,7 @@
min_height="28"
width="82"
top_delta="0"
- min_width="82"
+ min_width="52"
name="gesture_panel"
user_resize="false">
<gesture_combo_box
@@ -105,9 +105,13 @@
name="Gesture"
left="0"
top="3"
- use_ellipses="true"
width="82"
- tool_tip="Shows/hides gestures"/>
+ tool_tip="Shows/hides gestures">
+ <gesture_combo_box.drop_down_button
+ font="SansSerifSmall"
+ pad_right="10"
+ use_ellipses="true" />
+ </gesture_combo_box>
</layout_panel>
<icon
auto_resize="false"
@@ -131,7 +135,7 @@
name="movement_panel"
user_resize="false"
width="80"
- min_width="80">
+ min_width="49">
<button
follows="left|right"
height="23"
@@ -167,7 +171,7 @@
height="28"
layout="topleft"
min_height="28"
- min_width="80"
+ min_width="49"
name="cam_panel"
user_resize="false"
width="80">