Fixed nice-to-have bug EXT-3706 - Redundant spacing in the voice controls panel.
--HG-- branch : product-enginemeow-7.2.2
parent
88d8f86ccc
commit
b798a63d12
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue