summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorDmitry Zaporozhan <dzaporozhan@productengine.com>2009-12-29 17:49:35 +0200
committerDmitry Zaporozhan <dzaporozhan@productengine.com>2009-12-29 17:49:35 +0200
commitb798a63d120dcfe4751d0bb56f6a2fcaafdd9966 (patch)
tree08deb1acb8a7143e40ff65a16f312e594da9ff56 /indra/newview
parent88d8f86cccf277814ca2d12abfa5b8d3c0e73c12 (diff)
Fixed nice-to-have bug EXT-3706 - Redundant spacing in the voice controls panel.
--HG-- branch : product-engine
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llcallfloater.cpp97
-rw-r--r--indra/newview/llcallfloater.h20
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml6
3 files changed, 122 insertions, 1 deletions
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 334bdd14b4..89c62b52a3 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -48,6 +48,7 @@
#include "llparticipantlist.h"
#include "llspeakers.h"
#include "lltransientfloatermgr.h"
+#include "llviewerwindow.h"
#include "llvoicechannel.h"
static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids);
@@ -216,6 +217,15 @@ void LLCallFloater::onChange()
}
}
+S32 LLCallFloater::notifyParent(const LLSD& info)
+{
+ if("size_changes" == info["action"])
+ {
+ reshapeToFitContent();
+ return 1;
+ }
+ return LLDockableFloater::notifyParent(info);
+}
//////////////////////////////////////////////////////////////////////////
/// PRIVATE SECTION
@@ -755,4 +765,91 @@ void LLCallFloater::reset()
mSpeakerManager = NULL;
}
+void reshape_floater(LLCallFloater* floater, S32 delta_height)
+{
+ // Try to update floater top side if it is docked(to bottom bar).
+ // Try to update floater bottom side or top side if it is un-docked.
+ // If world rect is too small, floater will not be reshaped at all.
+
+ LLRect floater_rect = floater->getRect();
+ LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
+
+ // floater is docked to bottom bar
+ if(floater->isDocked())
+ {
+ // can update floater top side
+ if(floater_rect.mTop + delta_height < world_rect.mTop)
+ {
+ floater_rect.set(floater_rect.mLeft, floater_rect.mTop + delta_height,
+ floater_rect.mRight, floater_rect.mBottom);
+ }
+ }
+ // floater is un-docked
+ else
+ {
+ // can update floater bottom side
+ if( floater_rect.mBottom - delta_height >= world_rect.mBottom )
+ {
+ floater_rect.set(floater_rect.mLeft, floater_rect.mTop,
+ floater_rect.mRight, floater_rect.mBottom - delta_height);
+ }
+ // could not update floater bottom side, check if we can update floater top side
+ else if( floater_rect.mTop + delta_height < world_rect.mTop )
+ {
+ floater_rect.set(floater_rect.mLeft, floater_rect.mTop + delta_height,
+ floater_rect.mRight, floater_rect.mBottom);
+ }
+ }
+
+ floater->reshape(floater_rect.getWidth(), floater_rect.getHeight());
+ floater->setRect(floater_rect);
+}
+
+void LLCallFloater::reshapeToFitContent()
+{
+ const S32 ITEM_HEIGHT = getParticipantItemHeight();
+ static const S32 MAX_VISIBLE_ITEMS = getMaxVisibleItems();
+
+ static S32 items_pad = mAvatarList->getItemsPad();
+ S32 list_height = mAvatarList->getRect().getHeight();
+ S32 items_height = mAvatarList->getItemsRect().getHeight();
+ if(items_height <= 0)
+ {
+ // make "no one near" text visible
+ items_height = ITEM_HEIGHT + items_pad;
+ }
+ S32 max_list_height = MAX_VISIBLE_ITEMS * ITEM_HEIGHT + items_pad * (MAX_VISIBLE_ITEMS - 1);
+ max_list_height += 2* mAvatarList->getBorderWidth();
+
+ S32 delta = items_height - list_height;
+ // too many items, don't reshape floater anymore, let scroll bar appear.
+ if(items_height > max_list_height)
+ {
+ delta = max_list_height - list_height;
+ }
+
+ reshape_floater(this, delta);
+}
+
+S32 LLCallFloater::getParticipantItemHeight()
+{
+ std::vector<LLPanel*> items;
+ mAvatarList->getItems(items);
+ if(items.size() > 0)
+ {
+ return items[0]->getRect().getHeight();
+ }
+ else
+ {
+ return getChild<LLPanel>("non_avatar_caller")->getRect().getHeight();
+ }
+}
+
+S32 LLCallFloater::getMaxVisibleItems()
+{
+ S32 value = 5; // default value, in case convertToS32() fails.
+ LLStringUtil::convertToS32(getString("max_visible_items"), value);
+ return value;
+}
+
//EOF
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index 2b856b9c32..8646300dd7 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -75,6 +75,11 @@ public:
*/
/*virtual*/ void onChange();
+ /**
+ * Will reshape floater when participant list size changes
+ */
+ /*virtual*/ S32 notifyParent(const LLSD& info);
+
static void sOnCurrentChannelChanged(const LLUUID& session_id);
private:
@@ -215,6 +220,21 @@ private:
*/
void reset();
+ /**
+ * Reshapes floater to fit participant list height
+ */
+ void reshapeToFitContent();
+
+ /**
+ * Returns height of participant list item
+ */
+ S32 getParticipantItemHeight();
+
+ /**
+ * Returns predefined max visible participants.
+ */
+ S32 getMaxVisibleItems();
+
private:
speaker_state_map_t mSpeakerStateMap;
LLSpeakerMgr* mSpeakerManager;
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index 474b703ae5..47fd03b8f6 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -5,7 +5,7 @@
can_close="false"
height="270"
layout="topleft"
- min_height="146"
+ min_height="122"
min_width="190"
name="floater_voice_controls"
title="Voice Controls"
@@ -32,6 +32,10 @@
name="no_one_near">
No one near
</string>
+ <string
+ name="max_visible_items">
+ 5
+ </string>
<panel
bevel_style="out"
border="true"