summaryrefslogtreecommitdiff
path: root/indra/newview/llavatarlistitem.cpp
diff options
context:
space:
mode:
authorMike Antipov <mantipov@productengine.com>2010-01-11 18:39:15 +0200
committerMike Antipov <mantipov@productengine.com>2010-01-11 18:39:15 +0200
commit1bdae78926d11389ac6f4ca8daae3bf50ba7ceda (patch)
tree2f64d528dc790df88944850cd70831f08190ab18 /indra/newview/llavatarlistitem.cpp
parent8be80d14c199773001a1a22bce89f55bdf22af54 (diff)
Work on low task EXT-3456 (Code Improvements: Improve LLAvatarListItem to show/hide its buttons properly)
Initial implementation: * implemented common functionality to update Avatar List Item children positions & size (for name) depend on children visibility * added its usage whereve visibility of child view is changed * removed direct changing of "info button" visibility in Avatar List when Avatar List Item is added --HG-- branch : product-engine
Diffstat (limited to 'indra/newview/llavatarlistitem.cpp')
-rw-r--r--indra/newview/llavatarlistitem.cpp173
1 files changed, 143 insertions, 30 deletions
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 6945ac6932..aa5a575464 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -48,6 +48,10 @@ S32 LLAvatarListItem::sIconWidth = 0;
S32 LLAvatarListItem::sInfoBtnWidth = 0;
S32 LLAvatarListItem::sProfileBtnWidth = 0;
S32 LLAvatarListItem::sSpeakingIndicatorWidth = 0;
+S32 LLAvatarListItem::sLeftPadding = 0;
+S32 LLAvatarListItem::sRightNamePadding = 0;
+S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT];
+
LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
: LLPanel(),
@@ -95,10 +99,7 @@ BOOL LLAvatarListItem::postBuild()
// so that we can hide and show the icon again later.
if (!sStaticInitialized)
{
- sIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft;
- sInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight;
- sProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight;
- sSpeakingIndicatorWidth = mSpeakingIndicator->getRect().mRight - mAvatarName->getRect().mRight;
+ initChildrenWidths(this);
sStaticInitialized = true;
}
@@ -137,6 +138,8 @@ void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
mProfileBtn->setVisible(mShowProfileBtn);
LLPanel::onMouseEnter(x, y, mask);
+
+ updateChildren();
}
void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
@@ -146,6 +149,8 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
mProfileBtn->setVisible(false);
LLPanel::onMouseLeave(x, y, mask);
+
+ updateChildren();
}
// virtual, called by LLAvatarTracker
@@ -215,12 +220,8 @@ void LLAvatarListItem::showLastInteractionTime(bool show)
if (show)
return;
- LLRect name_rect = mAvatarName->getRect();
- LLRect time_rect = mLastInteractionTime->getRect();
-
mLastInteractionTime->setVisible(false);
- name_rect.mRight += (time_rect.mRight - name_rect.mRight);
- mAvatarName->setRect(name_rect);
+ updateChildren();
}
void LLAvatarListItem::setLastInteractionTime(U32 secs_since)
@@ -234,12 +235,6 @@ void LLAvatarListItem::setShowInfoBtn(bool show)
if(mShowInfoBtn == show)
return;
mShowInfoBtn = show;
- S32 width_delta = show ? - sInfoBtnWidth : sInfoBtnWidth;
-
- //Translating speaking indicator
- mSpeakingIndicator->translate(width_delta, 0);
- //Reshaping avatar name
- mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
}
void LLAvatarListItem::setShowProfileBtn(bool show)
@@ -248,12 +243,6 @@ void LLAvatarListItem::setShowProfileBtn(bool show)
if(mShowProfileBtn == show)
return;
mShowProfileBtn = show;
- S32 width_delta = show ? - sProfileBtnWidth : sProfileBtnWidth;
-
- //Translating speaking indicator
- mSpeakingIndicator->translate(width_delta, 0);
- //Reshaping avatar name
- mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
}
void LLAvatarListItem::setSpeakingIndicatorVisible(bool visible)
@@ -262,10 +251,7 @@ void LLAvatarListItem::setSpeakingIndicatorVisible(bool visible)
if (mSpeakingIndicator->getVisible() == (BOOL)visible)
return;
mSpeakingIndicator->setVisible(visible);
- S32 width_delta = visible ? - sSpeakingIndicatorWidth : sSpeakingIndicatorWidth;
-
- //Reshaping avatar name
- mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
+ updateChildren();
}
void LLAvatarListItem::setAvatarIconVisible(bool visible)
@@ -276,11 +262,7 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible)
// Show/hide avatar icon.
mAvatarIcon->setVisible(visible);
-
- // Move the avatar name horizontally by icon size + its distance from the avatar name.
- LLRect name_rect = mAvatarName->getRect();
- name_rect.mLeft += visible ? sIconWidth : -sIconWidth;
- mAvatarName->setRect(name_rect);
+ updateChildren();
}
void LLAvatarListItem::onInfoBtnClick()
@@ -346,6 +328,7 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
void LLAvatarListItem::reshapeAvatarName()
{
+/*
S32 width_delta = 0;
width_delta += mShowProfileBtn ? sProfileBtnWidth : 0;
width_delta += mSpeakingIndicator->getVisible() ? sSpeakingIndicatorWidth : 0;
@@ -357,6 +340,7 @@ void LLAvatarListItem::reshapeAvatarName()
S32 width = getRect().getWidth() - width_delta;
mAvatarName->reshape(width, height);
+*/
}
// Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
@@ -492,4 +476,133 @@ LLAvatarListItem::icon_color_map_t& LLAvatarListItem::getItemIconColorMap()
return item_icon_color_map;
}
+// static
+void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
+{
+ //profile btn width + padding
+ S32 profile_btn_width = avatar_item->getRect().getWidth() - avatar_item->mProfileBtn->getRect().mLeft;
+
+ //info btn width + padding
+ S32 info_btn_width = avatar_item->mProfileBtn->getRect().mLeft - avatar_item->mInfoBtn->getRect().mLeft;
+
+ //speaking indicator width + padding
+ S32 speaking_indicator_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mSpeakingIndicator->getRect().mLeft;
+
+ // last interaction time textbox width + padding
+ S32 last_interaction_time_width = avatar_item->mSpeakingIndicator->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
+
+ // icon width + padding
+ S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
+
+ sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft;
+ sRightNamePadding = avatar_item->mLastInteractionTime->getRect().mLeft - avatar_item->mAvatarName->getRect().mRight;
+
+ S32 index = ALIC_COUNT;
+ sChildrenWidths[--index] = icon_width;
+ sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space"
+ sChildrenWidths[--index] = last_interaction_time_width;
+ sChildrenWidths[--index] = speaking_indicator_width;
+ sChildrenWidths[--index] = info_btn_width;
+ sChildrenWidths[--index] = profile_btn_width;
+}
+
+void LLAvatarListItem::updateChildren()
+{
+ LL_DEBUGS("AvatarItemReshape") << LL_ENDL;
+ LL_DEBUGS("AvatarItemReshape") << "Updating for: " << getAvatarName() << LL_ENDL;
+
+ S32 name_new_width = getRect().getWidth();
+ S32 ctrl_new_left = name_new_width;
+ S32 name_new_left = sLeftPadding;
+
+ // iterate through all children and set them into correct position depend on each child visibility
+ // assume that child indexes are in back order: the first in Enum is the last (right) in the item
+ // iterate & set child views starting from right to left
+ for (S32 i = 0; i < ALIC_COUNT; ++i)
+ {
+ // skip "name" textbox, it will be processed out of loop later
+ if (ALIC_NAME == i) continue;
+
+ LLView* control = getItemChildView((EAvatarListItemChildIndex)i);
+
+ LL_DEBUGS("AvatarItemReshape") << "Processing control: " << control->getName() << LL_ENDL;
+ // skip invisible views
+ if (!control->getVisible()) continue;
+
+ S32 ctrl_width = sChildrenWidths[i]; // including space between current & left controls
+
+ // decrease available for
+ name_new_width -= ctrl_width;
+ LL_DEBUGS("AvatarItemReshape") << "width: " << ctrl_width << ", name_new_width: " << name_new_width << LL_ENDL;
+
+ LLRect control_rect = control->getRect();
+ LL_DEBUGS("AvatarItemReshape") << "rect before: " << control_rect << LL_ENDL;
+
+ if (ALIC_ICON == i)
+ {
+ // assume that this is the last iteration,
+ // so it is not necessary to save "ctrl_new_left" value calculated on previous iterations
+ ctrl_new_left = sLeftPadding;//control_rect.mLeft;
+ name_new_left = ctrl_new_left + ctrl_width;
+ }
+ else
+ {
+ ctrl_new_left -= ctrl_width;
+ }
+
+ LL_DEBUGS("AvatarItemReshape") << "ctrl_new_left: " << ctrl_new_left << LL_ENDL;
+
+ control_rect.setLeftTopAndSize(
+ ctrl_new_left,
+ control_rect.mTop,
+ control_rect.getWidth(),
+ control_rect.getHeight());
+
+ LL_DEBUGS("AvatarItemReshape") << "rect after: " << control_rect << LL_ENDL;
+ control->setShape(control_rect);
+ }
+
+ // set size and position of the "name" child
+ LLView* name_view = getItemChildView(ALIC_NAME);
+ LLRect name_view_rect = name_view->getRect();
+ LL_DEBUGS("AvatarItemReshape") << "name rect before: " << name_view_rect << LL_ENDL;
+
+ // apply paddings
+ name_new_width -= sLeftPadding;
+ name_new_width -= sRightNamePadding;
+
+ name_view_rect.setLeftTopAndSize(
+ name_new_left,
+ name_view_rect.mTop,
+ name_new_width,
+ name_view_rect.getHeight());
+
+ name_view->setShape(name_view_rect);
+
+ LL_DEBUGS("AvatarItemReshape") << "name rect after: " << name_view_rect << LL_ENDL;
+}
+
+LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_index)
+{
+ LLView* child_view = mAvatarName;
+ if (child_view_index < 0 || ALIC_COUNT <= child_view_index)
+ {
+ LL_WARNS("AvatarItemReshape") << "Child view index is out of range: " << child_view_index << LL_ENDL;
+ return child_view;
+ }
+ switch (child_view_index)
+ {
+ case ALIC_ICON: child_view = mAvatarIcon; break;
+ case ALIC_NAME: child_view = mAvatarName; break;
+ case ALIC_INTERACTION_TIME: child_view = mLastInteractionTime; break;
+ case ALIC_SPEAKER_INDICATOR: child_view = mSpeakingIndicator; break;
+ case ALIC_INFO_BUTTON: child_view = mInfoBtn; break;
+ case ALIC_PROFILE_BUTTON: child_view = mProfileBtn; break;
+ default:
+ LL_WARNS("AvatarItemReshape") << "Unexpected child view index is passed: " << child_view_index << LL_ENDL;
+ }
+
+ return child_view;
+}
+
// EOF