diff options
Diffstat (limited to 'indra/newview/llgrouplist.cpp')
-rw-r--r-- | indra/newview/llgrouplist.cpp | 369 |
1 files changed, 192 insertions, 177 deletions
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 32af2592d3..38b2f4adc8 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llgrouplist.cpp * @brief List of the groups the agent belongs to. * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -40,8 +40,8 @@ #include "llagent.h" #include "llgroupactions.h" #include "llfloaterreg.h" -#include "llviewercontrol.h" // for gSavedSettings -#include "llviewermenu.h" // for gMenuHolder +#include "llviewercontrol.h" // for gSavedSettings +#include "llviewermenu.h" // for gMenuHolder #include "llvoiceclient.h" static LLDefaultChildRegistry::Register<LLGroupList> r("group_list"); @@ -49,19 +49,19 @@ static LLDefaultChildRegistry::Register<LLGroupList> r("group_list"); class LLGroupComparator : public LLFlatListView::ItemComparator { public: - LLGroupComparator() {}; + LLGroupComparator() {}; - /** 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(); + /** 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); + LLStringUtil::toUpper(name1); + LLStringUtil::toUpper(name2); - return name1 < name2; - } + return name1 < name2; + } }; class LLSharedGroupComparator : public LLFlatListView::ItemComparator @@ -100,15 +100,15 @@ LLGroupList::Params::Params() } LLGroupList::LLGroupList(const Params& p) -: LLFlatListViewEx(p) +: LLFlatListViewEx(p) , mForAgent(p.for_agent) - , mDirty(true) // to force initial update + , mDirty(true) // to force initial update , mShowIcons(false) , mShowNone(true) { - setCommitOnSelectionChange(true); + setCommitOnSelectionChange(true); - // Set default sort order. + // Set default sort order. if (mForAgent) { setComparator(&GROUP_COMPARATOR); @@ -120,7 +120,7 @@ LLGroupList::LLGroupList(const Params& p) } if (mForAgent) - { + { enableForAgent(true); } } @@ -140,32 +140,32 @@ void LLGroupList::enableForAgent(bool show_icons) // Listen for agent group changes. gAgent.addListener(this, "new group"); - // Set up context menu. - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + // Set up context menu. + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; - registrar.add("People.Groups.Action", boost::bind(&LLGroupList::onContextMenuItemClick, this, _2)); - enable_registrar.add("People.Groups.Enable", boost::bind(&LLGroupList::onContextMenuItemEnable, this, _2)); + registrar.add("People.Groups.Action", boost::bind(&LLGroupList::onContextMenuItemClick, this, _2)); + enable_registrar.add("People.Groups.Enable", boost::bind(&LLGroupList::onContextMenuItemEnable, this, _2)); - LLToggleableMenu* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_groups.xml", - gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - if(context_menu) - mContextMenuHandle = context_menu->getHandle(); + LLToggleableMenu* context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_groups.xml", + gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + if(context_menu) + mContextMenuHandle = context_menu->getHandle(); } // virtual void LLGroupList::draw() { - if (mDirty) - refresh(); + if (mDirty) + refresh(); - LLFlatListView::draw(); + LLFlatListView::draw(); } // virtual BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask) { - BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask); + BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask); if (mForAgent) { @@ -176,40 +176,40 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask) context_menu->updateParent(LLMenuGL::sMenuContainer); LLMenuGL::showPopup(this, context_menu, x, y); } - } + } - return handled; + return handled; } // virtual BOOL LLGroupList::handleDoubleClick(S32 x, S32 y, MASK mask) { - BOOL handled = LLView::handleDoubleClick(x, y, mask); - // Handle double click only for the selected item in the list, skip clicks on empty space. - if (handled) - { - if (mDoubleClickSignal && getItemsRect().pointInRect(x, y)) - { - (*mDoubleClickSignal)(this, x, y, mask); - } - } + BOOL handled = LLView::handleDoubleClick(x, y, mask); + // Handle double click only for the selected item in the list, skip clicks on empty space. + if (handled) + { + if (mDoubleClickSignal && getItemsRect().pointInRect(x, y)) + { + (*mDoubleClickSignal)(this, x, y, mask); + } + } - return handled; + return handled; } void LLGroupList::setNameFilter(const std::string& filter) { - std::string filter_upper = filter; - LLStringUtil::toUpper(filter_upper); - if (mNameFilter != filter_upper) - { - mNameFilter = filter_upper; + std::string filter_upper = filter; + LLStringUtil::toUpper(filter_upper); + if (mNameFilter != filter_upper) + { + mNameFilter = filter_upper; - // set no items message depend on filter state - updateNoItemsMessage(filter); + // set no items message depend on filter state + updateNoItemsMessage(filter); - setDirty(); - } + setDirty(); + } } static bool findInsensitive(std::string haystack, const std::string& needle_upper) @@ -222,10 +222,10 @@ void LLGroupList::refresh() { if (mForAgent) { - const LLUUID& highlight_id = gAgent.getGroupID(); - S32 count = gAgent.mGroups.size(); - LLUUID id; - bool have_filter = !mNameFilter.empty(); + const LLUUID& highlight_id = gAgent.getGroupID(); + S32 count = gAgent.mGroups.size(); + LLUUID id; + bool have_filter = !mNameFilter.empty(); clear(); @@ -264,23 +264,23 @@ void LLGroupList::refresh() sort(); } - setDirty(false); - onCommit(); + setDirty(false); + onCommit(); } void LLGroupList::toggleIcons() { - // Save the new value for new items to use. - mShowIcons = !mShowIcons; - gSavedSettings.setBOOL("GroupListShowIcons", mShowIcons); + // 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); - } + // 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); + } } void LLGroupList::setGroups(const std::map< std::string,LLUUID> group_list) @@ -295,33 +295,34 @@ void LLGroupList::setGroups(const std::map< std::string,LLUUID> group_list) void LLGroupList::addNewItem(const LLUUID& id, const std::string& name, const LLUUID& icon_id, EAddPosition pos, bool visible_in_profile) { - LLGroupListItem* item = new LLGroupListItem(mForAgent, mShowIcons); + LLGroupListItem* item = new LLGroupListItem(mForAgent, mShowIcons); - item->setGroupID(id); - item->setName(name, mNameFilter); - item->setGroupIconID(icon_id); + item->setGroupID(id); + item->setName(name, mNameFilter); + item->setGroupIconID(icon_id); - item->getChildView("info_btn")->setVisible( false); - item->getChildView("profile_btn")->setVisible( false); - item->setGroupIconVisible(mShowIcons); + item->getChildView("info_btn")->setVisible( false); + item->getChildView("profile_btn")->setVisible( false); + item->getChildView("notices_btn")->setVisible(false); + item->setGroupIconVisible(mShowIcons); if (!mShowIcons) { item->setVisibleInProfile(visible_in_profile); } - addItem(item, id, pos); + addItem(item, id, pos); -// setCommentVisible(false); +// setCommentVisible(false); } // virtual bool LLGroupList::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { - // Why is "new group" sufficient? - if (event->desc() == "new group") - { - setDirty(); - return true; - } + // Why is "new group" sufficient? + if (event->desc() == "new group") + { + setDirty(); + return true; + } if (event->desc() == "value_changed") { @@ -346,51 +347,51 @@ bool LLGroupList::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& return true; } - return false; + return false; } bool LLGroupList::onContextMenuItemClick(const LLSD& userdata) { - std::string action = userdata.asString(); - LLUUID selected_group = getSelectedUUID(); - - if (action == "view_info") - { - LLGroupActions::show(selected_group); - } - else if (action == "chat") - { - LLGroupActions::startIM(selected_group); - } - else if (action == "call") - { - LLGroupActions::startCall(selected_group); - } - else if (action == "activate") - { - LLGroupActions::activate(selected_group); - } - else if (action == "leave") - { - LLGroupActions::leave(selected_group); - } - - return true; + std::string action = userdata.asString(); + LLUUID selected_group = getSelectedUUID(); + + if (action == "view_info") + { + LLGroupActions::show(selected_group); + } + else if (action == "chat") + { + LLGroupActions::startIM(selected_group); + } + else if (action == "call") + { + LLGroupActions::startCall(selected_group); + } + else if (action == "activate") + { + LLGroupActions::activate(selected_group); + } + else if (action == "leave") + { + LLGroupActions::leave(selected_group); + } + + return true; } bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata) { - LLUUID selected_group_id = getSelectedUUID(); - bool real_group_selected = selected_group_id.notNull(); // a "real" (not "none") group is selected + LLUUID selected_group_id = getSelectedUUID(); + bool real_group_selected = selected_group_id.notNull(); // a "real" (not "none") group is selected - // each group including "none" can be activated - if (userdata.asString() == "activate") - return gAgent.getGroupID() != selected_group_id; + // each group including "none" can be activated + if (userdata.asString() == "activate") + return gAgent.getGroupID() != selected_group_id; - if (userdata.asString() == "call") - return real_group_selected && LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); + if (userdata.asString() == "call") + return real_group_selected && LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); - return real_group_selected; + return real_group_selected; } /************************************************************************/ @@ -398,11 +399,12 @@ bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata) /************************************************************************/ LLGroupListItem::LLGroupListItem(bool for_agent, bool show_icons) -: LLPanel(), +: LLPanel(), mGroupIcon(NULL), mGroupNameBox(NULL), mInfoBtn(NULL), mProfileBtn(NULL), +mNoticesBtn(NULL), mVisibilityHideBtn(NULL), mVisibilityShowBtn(NULL), mGroupID(LLUUID::null), @@ -420,21 +422,24 @@ mForAgent(for_agent) LLGroupListItem::~LLGroupListItem() { - LLGroupMgr::getInstance()->removeObserver(this); + LLGroupMgr::getInstance()->removeObserver(this); } //virtual BOOL LLGroupListItem::postBuild() { - mGroupIcon = getChild<LLGroupIconCtrl>("group_icon"); - mGroupNameBox = getChild<LLTextBox>("group_name"); + mGroupIcon = getChild<LLGroupIconCtrl>("group_icon"); + mGroupNameBox = getChild<LLTextBox>("group_name"); - mInfoBtn = getChild<LLButton>("info_btn"); - mInfoBtn->setClickedCallback(boost::bind(&LLGroupListItem::onInfoBtnClick, this)); + mInfoBtn = getChild<LLButton>("info_btn"); + mInfoBtn->setClickedCallback(boost::bind(&LLGroupListItem::onInfoBtnClick, this)); mProfileBtn = getChild<LLButton>("profile_btn"); mProfileBtn->setClickedCallback([this](LLUICtrl *, const LLSD &) { onProfileBtnClick(); }); + mNoticesBtn = getChild<LLButton>("notices_btn"); + mNoticesBtn->setClickedCallback([this](LLUICtrl *, const LLSD &) { onNoticesBtnClick(); }); + mVisibilityHideBtn = findChild<LLButton>("visibility_hide_btn"); if (mVisibilityHideBtn) { @@ -452,65 +457,70 @@ BOOL LLGroupListItem::postBuild() // have icons of different sizes so we need to figure it per file. mIconWidth = mGroupNameBox->getRect().mLeft - mGroupIcon->getRect().mLeft; - return TRUE; + return TRUE; } //virtual void LLGroupListItem::setValue( const LLSD& value ) { - if (!value.isMap()) return; - if (!value.has("selected")) return; - getChildView("selected_icon")->setVisible( value["selected"]); + if (!value.isMap()) return; + if (!value.has("selected")) return; + getChildView("selected_icon")->setVisible( value["selected"]); } void LLGroupListItem::onMouseEnter(S32 x, S32 y, MASK mask) { - getChildView("hovered_icon")->setVisible( true); - if (mGroupID.notNull()) // don't show the info button for the "none" group - { - mInfoBtn->setVisible(true); + getChildView("hovered_icon")->setVisible( true); + if (mGroupID.notNull()) // don't show the info button for the "none" group + { + mInfoBtn->setVisible(true); mProfileBtn->setVisible(true); - if (mForAgent && mVisibilityHideBtn) + if (mForAgent) { LLGroupData agent_gdatap; if (gAgent.getGroupData(mGroupID, agent_gdatap)) { - mVisibilityHideBtn->setVisible(agent_gdatap.mListInProfile); - mVisibilityShowBtn->setVisible(!agent_gdatap.mListInProfile); + if (mVisibilityHideBtn) + { + mVisibilityHideBtn->setVisible(agent_gdatap.mListInProfile); + mVisibilityShowBtn->setVisible(!agent_gdatap.mListInProfile); + } + mNoticesBtn->setVisible(true); } } - } + } - LLPanel::onMouseEnter(x, y, mask); + LLPanel::onMouseEnter(x, y, mask); } void LLGroupListItem::onMouseLeave(S32 x, S32 y, MASK mask) { - getChildView("hovered_icon")->setVisible( false); - mInfoBtn->setVisible(false); + getChildView("hovered_icon")->setVisible( false); + mInfoBtn->setVisible(false); mProfileBtn->setVisible(false); + mNoticesBtn->setVisible(false); if (mVisibilityHideBtn) { mVisibilityHideBtn->setVisible(false); mVisibilityShowBtn->setVisible(false); } - LLPanel::onMouseLeave(x, y, mask); + LLPanel::onMouseLeave(x, y, mask); } void LLGroupListItem::setName(const std::string& name, const std::string& highlight) { - mGroupName = name; - LLTextUtil::textboxSetHighlightedVal(mGroupNameBox, mGroupNameStyle, name, highlight); - mGroupNameBox->setToolTip(name); + mGroupName = name; + LLTextUtil::textboxSetHighlightedVal(mGroupNameBox, mGroupNameStyle, name, highlight); + mGroupNameBox->setToolTip(name); } void LLGroupListItem::setGroupID(const LLUUID& group_id) { - LLGroupMgr::getInstance()->removeObserver(this); - - mID = group_id; - mGroupID = group_id; + LLGroupMgr::getInstance()->removeObserver(this); + + mID = group_id; + mGroupID = group_id; if (mForAgent) { @@ -523,27 +533,27 @@ void LLGroupListItem::setGroupID(const LLUUID& group_id) setBold(gAgent.isInGroup(group_id, true)); } - LLGroupMgr::getInstance()->addObserver(this); + LLGroupMgr::getInstance()->addObserver(this); } void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id) { - mGroupIcon->setIconId(group_icon_id); + mGroupIcon->setIconId(group_icon_id); } void LLGroupListItem::setGroupIconVisible(bool visible) { - // Already done? Then do nothing. - if (mGroupIcon->getVisible() == (BOOL)visible) - return; + // Already done? Then do nothing. + if (mGroupIcon->getVisible() == (BOOL)visible) + return; - // Show/hide the group icon. - mGroupIcon->setVisible(visible); + // 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 ? mIconWidth : -mIconWidth; - mGroupNameBox->setRect(name_rect); + // Move the group name horizontally by icon size + its distance from the group name. + LLRect name_rect = mGroupNameBox->getRect(); + name_rect.mLeft += visible ? mIconWidth : -mIconWidth; + mGroupNameBox->setRect(name_rect); } void LLGroupListItem::setVisibleInProfile(bool visible) @@ -556,31 +566,36 @@ void LLGroupListItem::setVisibleInProfile(bool visible) ////////////////////////////////////////////////////////////////////////// void LLGroupListItem::setBold(bool bold) { - // *BUG: setName() overrides the style params. + // *BUG: setName() overrides the style params. - LLFontDescriptor new_desc(mGroupNameBox->getFont()->getFontDesc()); + 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(bold ? LLFontGL::BOLD : LLFontGL::NORMAL); - LLFontGL* new_font = LLFontGL::getFont(new_desc); - mGroupNameStyle.font = new_font; + // *NOTE dzaporozhan + // On Windows LLFontGL::NORMAL will not remove LLFontGL::BOLD if font + // is predefined as bold (SansSerifSmallBold, for example) + new_desc.setStyle(bold ? LLFontGL::BOLD : LLFontGL::NORMAL); + LLFontGL* new_font = LLFontGL::getFont(new_desc); + mGroupNameStyle.font = new_font; - // *NOTE: You cannot set the style on a text box anymore, you must - // rebuild the text. This will cause problems if the text contains - // hyperlinks, as their styles will be wrong. - mGroupNameBox->setText(mGroupName, mGroupNameStyle); + // *NOTE: You cannot set the style on a text box anymore, you must + // rebuild the text. This will cause problems if the text contains + // hyperlinks, as their styles will be wrong. + mGroupNameBox->setText(mGroupName, mGroupNameStyle); } void LLGroupListItem::onInfoBtnClick() { - LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mGroupID)); + LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mGroupID)); } void LLGroupListItem::onProfileBtnClick() { - LLGroupActions::show(mGroupID); + LLGroupActions::show(mGroupID); +} + +void LLGroupListItem::onNoticesBtnClick() +{ + LLGroupActions::show(mGroupID, true); } void LLGroupListItem::onVisibilityBtnClick(bool new_visibility) @@ -597,8 +612,8 @@ void LLGroupListItem::onVisibilityBtnClick(bool new_visibility) void LLGroupListItem::changed(LLGroupChange gc) { - LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID); - if ((gc == GC_ALL || gc == GC_PROPERTIES) && group_data) + LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID); + if ((gc == GC_ALL || gc == GC_PROPERTIES) && group_data) { setGroupIconID(group_data->mInsigniaID); } |