summaryrefslogtreecommitdiff
path: root/indra/newview/llnamelistctrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llnamelistctrl.cpp')
-rw-r--r--indra/newview/llnamelistctrl.cpp232
1 files changed, 179 insertions, 53 deletions
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 722113928b..6521ae3b1e 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -2,49 +2,46 @@
* @file llnamelistctrl.cpp
* @brief A list of names, automatically refreshed from name cache.
*
- * $LicenseInfo:firstyear=2003&license=viewergpl$
- *
- * Copyright (c) 2003-2009, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2003&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 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.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * 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.
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * 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$
*/
#include "llviewerprecompiledheaders.h"
-#include <boost/tokenizer.hpp>
-
#include "llnamelistctrl.h"
+#include <boost/tokenizer.hpp>
+
#include "llcachename.h"
-#include "llagent.h"
+#include "llfloaterreg.h"
#include "llinventory.h"
#include "llscrolllistitem.h"
#include "llscrolllistcell.h"
#include "llscrolllistcolumn.h"
#include "llsdparam.h"
+#include "lltooltip.h"
+
+static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list");
-static LLDefaultWidgetRegistry::Register<LLNameListCtrl> r("name_list");
+static const S32 info_icon_size = 16;
void LLNameListCtrl::NameTypeNames::declareValues()
{
@@ -62,23 +59,23 @@ LLNameListCtrl::Params::Params()
LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
: LLScrollListCtrl(p),
- mAllowCallingCardDrop(p.allow_calling_card_drop),
+ mNameColumnIndex(p.name_column.column_index),
mNameColumn(p.name_column.column_name),
- mNameColumnIndex(p.name_column.column_index)
+ mAllowCallingCardDrop(p.allow_calling_card_drop)
{}
// public
void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
- BOOL enabled, std::string& suffix)
+ BOOL enabled, const std::string& suffix)
{
//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
- std::string fullname;
- gCacheName->getFullName(agent_id, fullname);
-
- fullname.append(suffix);
+ NameItem item;
+ item.value = agent_id;
+ item.enabled = enabled;
+ item.target = INDIVIDUAL;
- addStringUUIDItem(fullname, agent_id, pos, enabled);
+ addNameItemRow(item, pos, suffix);
}
// virtual, public
@@ -129,6 +126,105 @@ BOOL LLNameListCtrl::handleDragAndDrop(
return handled;
}
+void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group)
+{
+ if (is_group)
+ LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", avatar_id));
+ else
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
+}
+
+void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index )
+{
+ S32 cur_index = getHighlightedItemInx();
+ if (cur_index != target_index)
+ {
+ if(0 <= cur_index && cur_index < (S32)getItemList().size())
+ {
+ LLScrollListItem* item = getItemList()[cur_index];
+ if (item)
+ {
+ LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
+ if (cell)
+ cell->setTextWidth(cell->getTextWidth() + info_icon_size);
+ }
+ else
+ {
+ llwarns << "highlighted name list item is NULL" << llendl;
+ }
+ }
+ if(target_index != -1)
+ {
+ LLScrollListItem* item = getItemList()[target_index];
+ LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
+ if (item)
+ {
+ if (cell)
+ cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+ }
+ else
+ {
+ llwarns << "target name item is NULL" << llendl;
+ }
+ }
+ }
+
+ LLScrollListCtrl::mouseOverHighlightNthItem(target_index);
+}
+
+//virtual
+BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = FALSE;
+ S32 column_index = getColumnIndexFromOffset(x);
+ LLScrollListItem* hit_item = hitItem(x, y);
+ if (hit_item
+ && column_index == mNameColumnIndex)
+ {
+ // ...this is the column with the avatar name
+ LLUUID avatar_id = hit_item->getUUID();
+ if (avatar_id.notNull())
+ {
+ // ...valid avatar id
+
+ LLScrollListCell* hit_cell = hit_item->getColumn(column_index);
+ if (hit_cell)
+ {
+ S32 row_index = getItemIndex(hit_item);
+ LLRect cell_rect = getCellRect(row_index, column_index);
+ // Convert rect local to screen coordinates
+ LLRect sticky_rect;
+ localRectToScreen(cell_rect, &sticky_rect);
+
+ // Spawn at right side of cell
+ LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small");
+ LLCoordGL pos( sticky_rect.mRight - info_icon_size, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 );
+
+ // Should we show a group or an avatar inspector?
+ bool is_group = hit_item->getValue()["is_group"].asBoolean();
+
+ LLToolTip::Params params;
+ params.background_visible( false );
+ params.click_callback( boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group) );
+ params.delay_time(0.0f); // spawn instantly on hover
+ params.image( icon );
+ params.message("");
+ params.padding(0);
+ params.pos(pos);
+ params.sticky_rect(sticky_rect);
+
+ LLToolTipMgr::getInstance()->show(params);
+ handled = TRUE;
+ }
+ }
+ }
+ if (!handled)
+ {
+ handled = LLScrollListCtrl::handleToolTip(x, y, mask);
+ }
+ return handled;
+}
+
// public
void LLNameListCtrl::addGroupNameItem(const LLUUID& group_id, EAddPosition pos,
BOOL enabled)
@@ -138,42 +234,57 @@ void LLNameListCtrl::addGroupNameItem(const LLUUID& group_id, EAddPosition pos,
item.enabled = enabled;
item.target = GROUP;
- addRow(item, pos);
+ addNameItemRow(item, pos);
}
// public
void LLNameListCtrl::addGroupNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)
{
item.target = GROUP;
- addRow(item, pos);
+ addNameItemRow(item, pos);
}
void LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)
{
item.target = INDIVIDUAL;
- addRow(item, pos);
+ addNameItemRow(item, pos);
}
LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata)
{
LLNameListCtrl::NameItem item_params;
- LLParamSDParser::instance().readSD(element, item_params);
+ LLParamSDParser parser;
+ parser.readSD(element, item_params);
item_params.userdata = userdata;
- return addRow(item_params, pos);
+ return addNameItemRow(item_params, pos);
}
-LLScrollListItem* LLNameListCtrl::addRow(const LLNameListCtrl::NameItem& name_item, EAddPosition pos)
+LLScrollListItem* LLNameListCtrl::addNameItemRow(
+ const LLNameListCtrl::NameItem& name_item,
+ EAddPosition pos,
+ const std::string& suffix)
{
- LLScrollListItem* item = LLScrollListCtrl::addRow(name_item, pos);
+ LLUUID id = name_item.value().asUUID();
+ LLNameListItem* item = NULL;
+
+ // Store item type so that we can invoke the proper inspector.
+ // *TODO Vadim: Is there a more proper way of storing additional item data?
+ {
+ LLNameListCtrl::NameItem item_p(name_item);
+ item_p.value = LLSD().with("uuid", id).with("is_group", name_item.target() == GROUP);
+ item = new LLNameListItem(item_p);
+ LLScrollListCtrl::addRow(item, item_p, pos);
+ }
+
if (!item) return NULL;
// use supplied name by default
- std::string fullname = name_item.display_name;
+ std::string fullname = name_item.name;
switch(name_item.target)
{
case GROUP:
- gCacheName->getGroupName(name_item.value().asUUID(), fullname);
+ gCacheName->getGroupName(id, fullname);
// fullname will be "nobody" if group not found
break;
case SPECIAL:
@@ -182,7 +293,7 @@ LLScrollListItem* LLNameListCtrl::addRow(const LLNameListCtrl::NameItem& name_it
case INDIVIDUAL:
{
std::string name;
- if (gCacheName->getFullName(name_item.value().asUUID(), name))
+ if (gCacheName->getFullName(id, name))
{
fullname = name;
}
@@ -192,6 +303,12 @@ LLScrollListItem* LLNameListCtrl::addRow(const LLNameListCtrl::NameItem& name_it
break;
}
+ // Append optional suffix.
+ if (!suffix.empty())
+ {
+ fullname.append(suffix);
+ }
+
LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
@@ -213,15 +330,24 @@ LLScrollListItem* LLNameListCtrl::addRow(const LLNameListCtrl::NameItem& name_it
// public
void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
{
- BOOL item_exists = selectByID( agent_id );
- if(item_exists)
+ // Find the item specified with agent_id.
+ S32 idx = -1;
+ for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++)
{
- S32 index = getItemIndex(getFirstSelected());
- if(index >= 0)
+ LLScrollListItem* item = *it;
+ if (item->getUUID() == agent_id)
{
- deleteSingleItem(index);
+ idx = getItemIndex(item);
+ break;
}
}
+
+ // Remove it.
+ if (idx >= 0)
+ {
+ selectNthItem(idx); // not sure whether this is needed, taken from previous implementation
+ deleteSingleItem(idx);
+ }
}
// public
@@ -248,8 +374,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
LLScrollListItem* item = *iter;
if (item->getUUID() == id)
{
- LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(0);
- cell = item->getColumn(mNameColumnIndex);
+ LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
cell->setValue(fullname);
@@ -265,11 +390,12 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
const std::string& last, BOOL is_group)
{
+ LLInstanceTrackerScopedGuard guard;
LLInstanceTracker<LLNameListCtrl>::instance_iter it;
- for (it = beginInstances(); it != endInstances(); ++it)
+ for (it = guard.beginInstances(); it != guard.endInstances(); ++it)
{
- LLNameListCtrl* ctrl = *it;
- ctrl->refresh(id, first, last, is_group);
+ LLNameListCtrl& ctrl = *it;
+ ctrl.refresh(id, first, last, is_group);
}
}