diff options
author | Steven Bennetts <steve@lindenlab.com> | 2009-09-29 19:37:05 +0000 |
---|---|---|
committer | Steven Bennetts <steve@lindenlab.com> | 2009-09-29 19:37:05 +0000 |
commit | 606b381c9fbc43c214afd26fb2e2598eec656b66 (patch) | |
tree | 422a6d5d94d50bd97ac5bcbdb52f0f6de083c6e7 /indra/newview/llgrouplist.cpp | |
parent | 751cc7cf68bb4d766e8ecaaf76af054dcfbbe9dc (diff) |
merge https://svn.aws.productengine.com/secondlife/export-from-ll/viewer-2-0@1830 https://svn.aws.productengine.com/secondlife/pe/stable-2@1839 -> viewer-2.0.0-3
JIRAS:
EXT-96 EXT-204 EXT-312 EXT-334 EXT-479 EXT-498 EXT-514 EXT-637 EXT-647 EXT-746 EXT-748 EXT-749 EXT-757 EXT-789 EXT-794 EXT-808 EXT-817 EXT-823 EXT-831 EXT-834 EXT-837 EXT-844 EXT-848 EXT-862 EXT-876 EXT-896 EXT-897 EXT-898 EXT-899 EXT-910 EXT-912 EXT-918 EXT-921 EXT-925 EXT-926 EXT-928 EXT-930 EXT-931 EXT-935 EXT-938 EXT-939 EXT-952 EXT-985 EXT-986 EXT-992 EXT-994 EXT-995 EXT-996 EXT-997 EXT-998 EXT-1001 EXT-1004 EXT-1010 EXT-1012 EXT-1016 EXT-1018 EXT-1020 EXT-1028 EXT-1041 EXT-1044 EXT-1051 EXT-1052 EXT-1061 EXT-1069 EXT-1071 EXT-1074 EXT-1075 EXT-1076 EXT-1078 EXT-1080 EXT-1081 EXT-1082 EXT-1083 EXT-1085 EXT-1092 EXT-1093 EXT-1099 EXT-1100 EXT-1101 EXT-1104 EXT-1106 EXT-1111 EXT-1113 EXT-1114 EXT-1115 EXT-1116 EXT-1118 EXT-1119 EXT-1129 EXT-1132 EXT-1135 EXT-1138 EXT-1142 EXT-1161 EXT-1162 EXT-1178 EXT-1180
* NEW DEVELOPMENT:
* EXT-898 - Add dock/undock support for camera and movement controls
* Avatar list changes
* Bottom bar changes: menu, docking, visibility
* Camera changes
* Camera & Movement Floaters
* Dockable Floaters (LLDockableFloater)
* Removed LLListCtrl
* Toast / Notification changes: signal / destruction changes, ordering
* Nearby chat input should display active voice indicator
QA NOTES:
* Message Well Window is ready to be tested for regression & matching the spec.
* Verify Group List Item L&F
* Verify All tabs in People Panel
* Verify that Picks behavior is not changed
Diffstat (limited to 'indra/newview/llgrouplist.cpp')
-rw-r--r-- | indra/newview/llgrouplist.cpp | 206 |
1 files changed, 192 insertions, 14 deletions
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index cddc67cb0a..d3b013237b 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -35,24 +35,53 @@ #include "llgrouplist.h" // libs +#include "llbutton.h" +#include "lliconctrl.h" +#include "lltextbox.h" #include "lltrans.h" // newview #include "llagent.h" +#include "llgroupactions.h" +#include "llviewercontrol.h" // for gSavedSettings static LLDefaultChildRegistry::Register<LLGroupList> r("group_list"); +S32 LLGroupListItem::sIconWidth = 0; + +class LLGroupComparator : public LLFlatListView::ItemComparator +{ +public: + /** Returns true if item1 < item2, false otherwise */ + /*virtual*/ bool compare(const LLPanel* item1, const LLPanel* item2) const + { + std::string name1 = static_cast<const LLGroupListItem*>(item1)->getGroupName(); + std::string name2 = static_cast<const LLGroupListItem*>(item2)->getGroupName(); + + LLStringUtil::toUpper(name1); + LLStringUtil::toUpper(name2); + + return name1 < name2; + } +}; + +static const LLGroupComparator GROUP_COMPARATOR; LLGroupList::Params::Params() { - // Prevent the active group from being always first in the list. - online_go_first = false; + } LLGroupList::LLGroupList(const Params& p) -: LLAvatarList(p) +: LLFlatListView(p) { + mShowIcons = gSavedSettings.getBOOL("GroupListShowIcons"); + setCommitOnSelectionChange(true); + // TODO: implement context menu // display a context menu appropriate for a list of group names - setContextMenu(LLScrollListCtrl::MENU_GROUP); +// setContextMenu(LLScrollListCtrl::MENU_GROUP); + + // Set default sort order. + setComparator(&GROUP_COMPARATOR); } static bool findInsensitive(std::string haystack, const std::string& needle_upper) @@ -63,36 +92,185 @@ static bool findInsensitive(std::string haystack, const std::string& needle_uppe BOOL LLGroupList::update(const std::string& name_filter) { - LLCtrlListInterface *group_list = getListInterface(); const LLUUID& highlight_id = gAgent.getGroupID(); S32 count = gAgent.mGroups.count(); LLUUID id; - group_list->operateOnAll(LLCtrlListInterface::OP_DELETE); + clear(); for(S32 i = 0; i < count; ++i) { - // *TODO: check powers mask? id = gAgent.mGroups.get(i).mID; const LLGroupData& group_data = gAgent.mGroups.get(i); if (name_filter != LLStringUtil::null && !findInsensitive(group_data.mName, name_filter)) continue; - addItem(id, group_data.mName, highlight_id == id, ADD_BOTTOM); // ADD_SORTED can only sort by first column anyway + addNewItem(id, group_data.mName, group_data.mInsigniaID, highlight_id == id, ADD_BOTTOM); } - // Force sorting the list. - updateSort(); + // Sort the list. + sort(); // add "none" to list at top { std::string loc_none = LLTrans::getString("GroupsNone"); if (name_filter == LLStringUtil::null || findInsensitive(loc_none, name_filter)) - addItem(LLUUID::null, loc_none, highlight_id.isNull(), ADD_TOP); + addNewItem(LLUUID::null, loc_none, LLUUID::null, highlight_id.isNull(), ADD_TOP); + } - // Prevent the "none" item from being sorted. - setNeedsSort(false); + selectItemByUUID(highlight_id); + + return TRUE; +} + +void LLGroupList::toggleIcons() +{ + // Save the new value for new items to use. + mShowIcons = !mShowIcons; + gSavedSettings.setBOOL("GroupListShowIcons", mShowIcons); + + // Show/hide icons for all existing items. + std::vector<LLPanel*> items; + getItems(items); + for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++) + { + static_cast<LLGroupListItem*>(*it)->setGroupIconVisible(mShowIcons); } +} + +////////////////////////////////////////////////////////////////////////// +// PRIVATE Section +////////////////////////////////////////////////////////////////////////// + +void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, BOOL is_bold, EAddPosition pos) +{ + LLGroupListItem* item = new LLGroupListItem(); + + item->setName(name); + item->setGroupID(id); + item->setGroupIconID(icon_id); +// item->setContextMenu(mContextMenu); + + item->childSetVisible("info_btn", false); + item->setGroupIconVisible(mShowIcons); + + addItem(item, id, pos); + +// setCommentVisible(false); +} + + +/************************************************************************/ +/* LLGroupListItem implementation */ +/************************************************************************/ + +LLGroupListItem::LLGroupListItem() +: LLPanel(), +mGroupIcon(NULL), +mGroupNameBox(NULL), +mInfoBtn(NULL), +//mContextMenu(NULL), //TODO: +mGroupID(LLUUID::null) +{ + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group_list_item.xml"); + + // Remember group icon width including its padding from the name text box, + // so that we can hide and show the icon again later. + if (!sIconWidth) + { + sIconWidth = mGroupNameBox->getRect().mLeft - mGroupIcon->getRect().mLeft; + } +} + +//virtual +BOOL LLGroupListItem::postBuild() +{ + mGroupIcon = getChild<LLIconCtrl>("group_icon"); + mGroupNameBox = getChild<LLTextBox>("group_name"); + + mInfoBtn = getChild<LLButton>("info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLGroupListItem::onInfoBtnClick, this)); - group_list->selectByValue(highlight_id); return TRUE; } + +//virtual +void LLGroupListItem::setValue( const LLSD& value ) +{ + if (!value.isMap()) return; + if (!value.has("selected")) return; + childSetVisible("selected_icon", value["selected"]); +} + +void LLGroupListItem::onMouseEnter(S32 x, S32 y, MASK mask) +{ + childSetVisible("hovered_icon", true); + if (mGroupID.notNull()) // don't show the info button for the "none" group + mInfoBtn->setVisible(true); + + LLPanel::onMouseEnter(x, y, mask); +} + +void LLGroupListItem::onMouseLeave(S32 x, S32 y, MASK mask) +{ + childSetVisible("hovered_icon", false); + mInfoBtn->setVisible(false); + + LLPanel::onMouseLeave(x, y, mask); +} + +void LLGroupListItem::setName(const std::string& name) +{ + mGroupName = name; + mGroupNameBox->setValue(name); + mGroupNameBox->setToolTip(name); +} + +void LLGroupListItem::setGroupID(const LLUUID& group_id) +{ + mGroupID = group_id; + setActive(group_id == gAgent.getGroupID()); +} + +void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id) +{ + if (group_icon_id.notNull()) + { + mGroupIcon->setValue(group_icon_id); + } +} + +void LLGroupListItem::setGroupIconVisible(bool visible) +{ + // Already done? Then do nothing. + if (mGroupIcon->getVisible() == (BOOL)visible) + return; + + // Show/hide the group icon. + mGroupIcon->setVisible(visible); + + // Move the group name horizontally by icon size + its distance from the group name. + LLRect name_rect = mGroupNameBox->getRect(); + name_rect.mLeft += visible ? sIconWidth : -sIconWidth; + mGroupNameBox->setRect(name_rect); +} + +////////////////////////////////////////////////////////////////////////// +// Private Section +////////////////////////////////////////////////////////////////////////// +void LLGroupListItem::setActive(bool active) +{ + // Active group should be bold. + LLFontDescriptor new_desc(mGroupNameBox->getFont()->getFontDesc()); + + // *NOTE dzaporozhan + // On Windows LLFontGL::NORMAL will not remove LLFontGL::BOLD if font + // is predefined as bold (SansSerifSmallBold, for example) + new_desc.setStyle(active ? LLFontGL::BOLD : LLFontGL::NORMAL); + mGroupNameBox->setFont(LLFontGL::getFont(new_desc)); +} + +void LLGroupListItem::onInfoBtnClick() +{ + LLGroupActions::show(mGroupID); +} +//EOF |