summaryrefslogtreecommitdiff
path: root/indra/newview/llgrouplist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llgrouplist.cpp')
-rw-r--r--indra/newview/llgrouplist.cpp369
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);
}