summaryrefslogtreecommitdiff
path: root/indra/newview/llbottomtray.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llbottomtray.cpp')
-rw-r--r--indra/newview/llbottomtray.cpp255
1 files changed, 187 insertions, 68 deletions
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 291f645ea2..fd711b72b0 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -40,6 +40,7 @@
#include "llimfloater.h" // for LLIMFloater
#include "lllayoutstack.h"
#include "llnearbychatbar.h"
+#include "llspeakbutton.h"
#include "llsplitbutton.h"
#include "llsyswellwindow.h"
#include "llfloatercamera.h"
@@ -51,6 +52,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
mNearbyChatBar(NULL),
mToolbarStack(NULL)
, mMovementButton(NULL)
+, mResizeState(RS_NORESIZE)
// Add more members
{
mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
@@ -185,6 +187,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
}
}
+// virtual
+void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ // Time it takes to connect to voice channel might be pretty long,
+ // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
+ BOOL enable = FALSE;
+
+ switch (status)
+ {
+ // Do not add STATUS_VOICE_ENABLED because voice chat is
+ // inactive until STATUS_JOINED
+ case STATUS_JOINED:
+ enable = TRUE;
+ break;
+ default:
+ enable = FALSE;
+ break;
+ }
+
+ mSpeakBtn->setEnabled(enable);
+}
+
//virtual
void LLBottomTray::onFocusLost()
{
@@ -238,22 +262,22 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
void LLBottomTray::showGestureButton(BOOL visible)
{
- showTrayButton(RS_BUTTON_GESTURES, visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);
}
void LLBottomTray::showMoveButton(BOOL visible)
{
- showTrayButton(RS_BUTTON_MOVEMENT, visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);
}
void LLBottomTray::showCameraButton(BOOL visible)
{
- showTrayButton(RS_BUTTON_CAMERA, visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);
}
void LLBottomTray::showSnapshotButton(BOOL visible)
{
- showTrayButton(RS_BUTTON_SNAPSHOT, visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
}
namespace
@@ -280,6 +304,19 @@ BOOL LLBottomTray::postBuild()
mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
+ mSpeakBtn = getChild<LLSpeakButton>("talk");
+
+ // Speak button should be initially disabled because
+ // it takes some time between logging in to world and connecting to voice channel.
+ mSpeakBtn->setEnabled(FALSE);
+
+ // Localization tool doesn't understand custom buttons like <talk_button>
+ mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
+ mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
+
+ // Registering Chat Bar to receive Voice client status change notifications.
+ gVoiceClient->addObserver(this);
+
if (mChicletPanel && mToolbarStack && mNearbyChatBar)
{
verifyChildControlsSizes();
@@ -331,74 +368,87 @@ void LLBottomTray::verifyChildControlsSizes()
mNearbyChatBar->setRect(rect);
}
}
-#define __FEATURE_EXT_991
+
void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- lldebugs << "****************************************" << llendl;
+ static S32 debug_calling_number = 0;
+ lldebugs << "**************************************** " << ++debug_calling_number << llendl;
S32 current_width = getRect().getWidth();
+ S32 delta_width = width - current_width;
lldebugs << "Reshaping: "
<< ", width: " << width
- << ", height: " << height
- << ", called_from_parent: " << called_from_parent
<< ", cur width: " << current_width
- << ", cur height: " << getRect().getHeight()
+ << ", delta_width: " << delta_width
+ << ", called_from_parent: " << called_from_parent
<< llendl;
if (mNearbyChatBar) log(mNearbyChatBar, "before");
if (mChicletPanel) log(mChicletPanel, "before");
+ // stores width size on which bottom tray is less than width required by its children. EXT-991
+ static S32 extra_shrink_width = 0;
+ bool should_be_reshaped = true;
+
if (mChicletPanel && mToolbarStack && mNearbyChatBar)
{
mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
verifyChildControlsSizes();
- updateResizeState(width, current_width);
- }
-
- LLPanel::reshape(width, height, called_from_parent);
-
-
- if (mNearbyChatBar) log(mNearbyChatBar, "after");
- if (mChicletPanel) log(mChicletPanel, "after");
-}
-
-void LLBottomTray::updateResizeState(S32 new_width, S32 cur_width)
-{
- mResizeState = RS_NORESIZE;
-
- S32 delta_width = new_width - cur_width;
-// if (delta_width == 0) return;
- bool shrink = new_width < cur_width;
-
- const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
-
- const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
- const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
- const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
- lldebugs << "chatbar_panel_width: " << chatbar_panel_width
- << ", chatbar_panel_min_width: " << chatbar_panel_min_width
- << ", chatbar_panel_max_width: " << chatbar_panel_max_width
- << ", chiclet_panel_width: " << chiclet_panel_width
- << ", chiclet_panel_min_width: " << chiclet_panel_min_width
- << llendl;
+ // bottom tray is narrowed
+ if (delta_width < 0)
+ {
+ if (extra_shrink_width > 0)
+ {
+ // is world rect was extra shrunk and decreasing again only update this value
+ // to delta_width negative
+ extra_shrink_width -= delta_width; // use "-=" because delta_width is negative
+ should_be_reshaped = false;
+ }
+ else
+ {
+ extra_shrink_width = processWidthDecreased(delta_width);
- // bottom tray is narrowed
- if (shrink)
- {
- processWidthDecreased(delta_width);
+ // increase new width to extra_shrink_width value to not reshape less than bottom tray minimum
+ width += extra_shrink_width;
+ }
+ }
+ // bottom tray is widen
+ else
+ {
+ if (extra_shrink_width > delta_width)
+ {
+ // Less than minimum width is more than increasing (delta_width)
+ // only reduce it value and make no reshape
+ extra_shrink_width -= delta_width;
+ should_be_reshaped = false;
+ }
+ else
+ {
+ if (extra_shrink_width > 0)
+ {
+ // If we have some extra shrink width let's reduce delta_width & width
+ delta_width -= extra_shrink_width;
+ width -= extra_shrink_width;
+ extra_shrink_width = 0;
+ }
+ processWidthIncreased(delta_width);
+ }
+ }
}
- // bottom tray is widen
- else
+
+ lldebugs << "There is no enough width to reshape all children: " << extra_shrink_width << llendl;
+ if (should_be_reshaped)
{
- processWidthIncreased(delta_width);
+ lldebugs << "Reshape all children with width: " << width << llendl;
+ LLPanel::reshape(width, height, called_from_parent);
}
- lldebugs << "New resize state: " << mResizeState << llendl;
+ if (mNearbyChatBar) log(mNearbyChatBar, "after");
+ if (mChicletPanel) log(mChicletPanel, "after");
}
-void LLBottomTray::processWidthDecreased(S32 delta_width)
+S32 LLBottomTray::processWidthDecreased(S32 delta_width)
{
bool still_should_be_processed = true;
@@ -409,7 +459,6 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
{
// we have some space to decrease chiclet panel
S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
- mResizeState |= RS_CHICLET_PANEL;
S32 delta_panel = llmin(-delta_width, panel_delta_min);
@@ -437,27 +486,25 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
{
// we have some space to decrease chatbar panel
S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
- mResizeState |= RS_CHATBAR_INPUT;
S32 delta_panel = llmin(-delta_width, panel_delta_min);
- // is chatbar panel width enough to process resizing?
+ // whether chatbar panel width is enough to process resizing?
delta_width += panel_delta_min;
-
still_should_be_processed = delta_width < 0;
mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
+ log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel");
+
lldebugs << "RS_CHATBAR_INPUT"
<< ", delta_panel: " << delta_panel
<< ", delta_width: " << delta_width
<< llendl;
-
- log(mChicletPanel, "after nearby was processed");
-
}
+ S32 extra_shrink_width = 0;
S32 buttons_freed_width = 0;
if (still_should_be_processed)
{
@@ -480,7 +527,9 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
if (delta_width < 0)
{
- llwarns << "WARNING: there is no enough room for bottom tray, resizing still should be processed" << llendl;
+ extra_shrink_width = -delta_width;
+ lldebugs << "There is no enough room for bottom tray, resizing still should be processed: "
+ << extra_shrink_width << llendl;
}
if (buttons_freed_width > 0)
@@ -491,10 +540,14 @@ void LLBottomTray::processWidthDecreased(S32 delta_width)
lldebugs << buttons_freed_width << llendl;
}
}
+
+ return extra_shrink_width;
}
void LLBottomTray::processWidthIncreased(S32 delta_width)
{
+ if (delta_width <= 0) return;
+
const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
@@ -573,7 +626,6 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
{
- mResizeState |= RS_CHATBAR_INPUT;
S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
S32 delta_panel = llmin(delta_width, delta_panel_max);
delta_width -= delta_panel_max;
@@ -589,7 +641,7 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
return false;
}
- bool can_be_shown = canButtonBeShown(panel);
+ bool can_be_shown = canButtonBeShown(shown_object_type);
if (can_be_shown)
{
//validate if we have enough room to show this button
@@ -600,22 +652,23 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
*available_width -= required_width;
*buttons_required_width += required_width;
- showTrayButton(shown_object_type, true);
+ setTrayButtonVisible(shown_object_type, true);
lldebugs << "processing object type: " << shown_object_type
<< ", buttons_required_width: " << *buttons_required_width
<< llendl;
+ mResizeState &= ~shown_object_type;
}
}
return can_be_shown;
}
-void LLBottomTray::processHideButton(EResizeState shown_object_type, S32* required_width, S32* buttons_freed_width)
+void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
{
- LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
if (NULL == panel)
{
- lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+ lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
return;
}
@@ -628,20 +681,41 @@ void LLBottomTray::processHideButton(EResizeState shown_object_type, S32* requir
*buttons_freed_width += *required_width;
}
- showTrayButton(shown_object_type, false);
+ setTrayButtonVisible(processed_object_type, false);
- lldebugs << "processing object type: " << shown_object_type
+ mResizeState |= processed_object_type;
+
+ lldebugs << "processing object type: " << processed_object_type
<< ", buttons_freed_width: " << *buttons_freed_width
<< llendl;
}
}
-bool LLBottomTray::canButtonBeShown(LLPanel* panel) const
+bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
{
- bool can_be_shown = !panel->getVisible();
+ bool can_be_shown = mResizeState & processed_object_type;
if (can_be_shown)
{
- // *TODO: mantipov: synchronize with situation when button was hidden via context menu;
+ static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES;
+ static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT;
+ static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA;
+
+ switch(processed_object_type)
+ {
+ case RS_BUTTON_GESTURES: // Gestures should be shown first
+ break;
+ case RS_BUTTON_MOVEMENT: // Move only if gesture is shown
+ can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ case RS_BUTTON_CAMERA:
+ can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ case RS_BUTTON_SNAPSHOT:
+ can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ default: // nothing to do here
+ break;
+ }
}
return can_be_shown;
}
@@ -654,7 +728,7 @@ void LLBottomTray::initStateProcessedObjectMap()
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
}
-void LLBottomTray::showTrayButton(EResizeState shown_object_type, bool visible)
+void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
{
LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
if (NULL == panel)
@@ -665,4 +739,49 @@ void LLBottomTray::showTrayButton(EResizeState shown_object_type, bool visible)
panel->setVisible(visible);
}
+
+void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible)
+{
+ bool can_be_set = true;
+
+ if (visible)
+ {
+ LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+ return;
+ }
+
+ const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+ const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+
+ const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+ const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+
+ const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width)
+ + (chiclet_panel_width - chiclet_panel_min_width);
+
+ const S32 required_width = panel->getRect().getWidth();
+ can_be_set = available_width >= required_width;
+ }
+
+ if (can_be_set)
+ {
+ setTrayButtonVisible(shown_object_type, visible);
+
+ // if we hide the button mark it NOT to show while future bottom tray extending
+ if (!visible)
+ {
+ mResizeState &= ~shown_object_type;
+ }
+ }
+ else
+ {
+ // mark this button to show it while future bottom tray extending
+ mResizeState |= shown_object_type;
+ LLNotifications::instance().add("BottomTrayButtonCanNotBeShown");
+ }
+}
+
//EOF