llnamelistctrl.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llnamelistctrl.cpp
  3.  * @brief A list of names, automatically refreshed from name cache.
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llnamelistctrl.h"
  34. #include <boost/tokenizer.hpp>
  35. #include "llcachename.h"
  36. #include "llfloaterreg.h"
  37. #include "llinventory.h"
  38. #include "llscrolllistitem.h"
  39. #include "llscrolllistcell.h"
  40. #include "llscrolllistcolumn.h"
  41. #include "llsdparam.h"
  42. #include "lltooltip.h"
  43. static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list");
  44. void LLNameListCtrl::NameTypeNames::declareValues()
  45. {
  46. declare("INDIVIDUAL", LLNameListCtrl::INDIVIDUAL);
  47. declare("GROUP", LLNameListCtrl::GROUP);
  48. declare("SPECIAL", LLNameListCtrl::SPECIAL);
  49. }
  50. LLNameListCtrl::Params::Params()
  51. : name_column(""),
  52. allow_calling_card_drop("allow_calling_card_drop", false)
  53. {
  54. name = "name_list";
  55. }
  56. LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
  57. : LLScrollListCtrl(p),
  58. mNameColumnIndex(p.name_column.column_index),
  59. mNameColumn(p.name_column.column_name),
  60. mAllowCallingCardDrop(p.allow_calling_card_drop)
  61. {}
  62. // public
  63. void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
  64.  BOOL enabled, std::string& suffix)
  65. {
  66. //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
  67. NameItem item;
  68. item.value = agent_id;
  69. item.enabled = enabled;
  70. item.target = INDIVIDUAL;
  71. addNameItemRow(item, pos);
  72. }
  73. // virtual, public
  74. BOOL LLNameListCtrl::handleDragAndDrop( 
  75. S32 x, S32 y, MASK mask,
  76. BOOL drop,
  77. EDragAndDropType cargo_type, void *cargo_data, 
  78. EAcceptance *accept,
  79. std::string& tooltip_msg)
  80. {
  81. if (!mAllowCallingCardDrop)
  82. {
  83. return FALSE;
  84. }
  85. BOOL handled = FALSE;
  86. if (cargo_type == DAD_CALLINGCARD)
  87. {
  88. if (drop)
  89. {
  90. LLInventoryItem* item = (LLInventoryItem *)cargo_data;
  91. addNameItem(item->getCreatorUUID());
  92. }
  93. *accept = ACCEPT_YES_MULTI;
  94. }
  95. else
  96. {
  97. *accept = ACCEPT_NO;
  98. if (tooltip_msg.empty())
  99. {
  100. if (!getToolTip().empty())
  101. {
  102. tooltip_msg = getToolTip();
  103. }
  104. else
  105. {
  106. // backwards compatable English tooltip (should be overridden in xml)
  107. tooltip_msg.assign("Drag a calling card herento add a resident.");
  108. }
  109. }
  110. }
  111. handled = TRUE;
  112. lldebugst(LLERR_USER_INPUT) << "dragAndDrop handled by LLNameListCtrl " << getName() << llendl;
  113. return handled;
  114. }
  115. void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group)
  116. {
  117. if (is_group)
  118. LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", avatar_id));
  119. else
  120. LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
  121. }
  122. //virtual
  123. BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
  124. {
  125. BOOL handled = FALSE;
  126. S32 column_index = getColumnIndexFromOffset(x);
  127. LLScrollListItem* hit_item = hitItem(x, y);
  128. if (hit_item
  129. && column_index == mNameColumnIndex)
  130. {
  131. // ...this is the column with the avatar name
  132. LLUUID avatar_id = hit_item->getUUID();
  133. if (avatar_id.notNull())
  134. {
  135. // ...valid avatar id
  136. LLScrollListCell* hit_cell = hit_item->getColumn(column_index);
  137. if (hit_cell)
  138. {
  139. S32 row_index = getItemIndex(hit_item);
  140. LLRect cell_rect = getCellRect(row_index, column_index);
  141. // Convert rect local to screen coordinates
  142. LLRect sticky_rect;
  143. localRectToScreen(cell_rect, &sticky_rect);
  144. // Spawn at right side of cell
  145. LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small");
  146. LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 );
  147. // Should we show a group or an avatar inspector?
  148. bool is_group = hit_item->getValue()["is_group"].asBoolean();
  149. LLToolTip::Params params;
  150. params.background_visible( false );
  151. params.click_callback( boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group) );
  152. params.delay_time(0.0f); // spawn instantly on hover
  153. params.image( icon );
  154. params.message("");
  155. params.padding(0);
  156. params.pos(pos);
  157. params.sticky_rect(sticky_rect);
  158. LLToolTipMgr::getInstance()->show(params);
  159. handled = TRUE;
  160. }
  161. }
  162. }
  163. if (!handled)
  164. {
  165. handled = LLScrollListCtrl::handleToolTip(x, y, mask);
  166. }
  167. return handled;
  168. }
  169. // public
  170. void LLNameListCtrl::addGroupNameItem(const LLUUID& group_id, EAddPosition pos,
  171.   BOOL enabled)
  172. {
  173. NameItem item;
  174. item.value = group_id;
  175. item.enabled = enabled;
  176. item.target = GROUP;
  177. addNameItemRow(item, pos);
  178. }
  179. // public
  180. void LLNameListCtrl::addGroupNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)
  181. {
  182. item.target = GROUP;
  183. addNameItemRow(item, pos);
  184. }
  185. void LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)
  186. {
  187. item.target = INDIVIDUAL;
  188. addNameItemRow(item, pos);
  189. }
  190. LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata)
  191. {
  192. LLNameListCtrl::NameItem item_params;
  193. LLParamSDParser::instance().readSD(element, item_params);
  194. item_params.userdata = userdata;
  195. return addNameItemRow(item_params, pos);
  196. }
  197. LLScrollListItem* LLNameListCtrl::addNameItemRow(
  198. const LLNameListCtrl::NameItem& name_item,
  199. EAddPosition pos,
  200. std::string& suffix)
  201. {
  202. LLUUID id = name_item.value().asUUID();
  203. LLNameListItem* item = NULL;
  204. // Store item type so that we can invoke the proper inspector.
  205. // *TODO Vadim: Is there a more proper way of storing additional item data?
  206. {
  207. LLNameListCtrl::NameItem item_p(name_item);
  208. item_p.value = LLSD().with("uuid", id).with("is_group", name_item.target() == GROUP);
  209. item = new LLNameListItem(item_p);
  210. LLScrollListCtrl::addRow(item, item_p, pos);
  211. }
  212. if (!item) return NULL;
  213. // use supplied name by default
  214. std::string fullname = name_item.name;
  215. switch(name_item.target)
  216. {
  217. case GROUP:
  218. gCacheName->getGroupName(id, fullname);
  219. // fullname will be "nobody" if group not found
  220. break;
  221. case SPECIAL:
  222. // just use supplied name
  223. break;
  224. case INDIVIDUAL:
  225. {
  226. std::string name;
  227. if (gCacheName->getFullName(id, name))
  228. {
  229. fullname = name;
  230. }
  231. break;
  232. }
  233. default:
  234. break;
  235. }
  236. // Append optional suffix.
  237. if (!suffix.empty())
  238. {
  239. fullname.append(suffix);
  240. }
  241. LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
  242. if (cell)
  243. {
  244. cell->setValue(fullname);
  245. }
  246. dirtyColumns();
  247. // this column is resizable
  248. LLScrollListColumn* columnp = getColumn(mNameColumnIndex);
  249. if (columnp && columnp->mHeader)
  250. {
  251. columnp->mHeader->setHasResizableElement(TRUE);
  252. }
  253. return item;
  254. }
  255. // public
  256. void LLNameListCtrl::removeNameItem(const LLUUID& agent_id)
  257. {
  258. // Find the item specified with agent_id.
  259. S32 idx = -1;
  260. for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++)
  261. {
  262. LLScrollListItem* item = *it;
  263. if (item->getUUID() == agent_id)
  264. {
  265. idx = getItemIndex(item);
  266. break;
  267. }
  268. }
  269. // Remove it.
  270. if (idx >= 0)
  271. {
  272. selectNthItem(idx); // not sure whether this is needed, taken from previous implementation
  273. deleteSingleItem(idx);
  274. }
  275. }
  276. // public
  277. void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first, 
  278.  const std::string& last, BOOL is_group)
  279. {
  280. //llinfos << "LLNameListCtrl::refresh " << id << " '" << first << " "
  281. // << last << "'" << llendl;
  282. std::string fullname;
  283. if (!is_group)
  284. {
  285. fullname = first + " " + last;
  286. }
  287. else
  288. {
  289. fullname = first;
  290. }
  291. // TODO: scan items for that ID, fix if necessary
  292. item_list::iterator iter;
  293. for (iter = getItemList().begin(); iter != getItemList().end(); iter++)
  294. {
  295. LLScrollListItem* item = *iter;
  296. if (item->getUUID() == id)
  297. {
  298. LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
  299. if (cell)
  300. {
  301. cell->setValue(fullname);
  302. }
  303. }
  304. }
  305. dirtyColumns();
  306. }
  307. // static
  308. void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
  309. const std::string& last, BOOL is_group)
  310. {
  311. LLInstanceTrackerScopedGuard guard;
  312. LLInstanceTracker<LLNameListCtrl>::instance_iter it;
  313. for (it = guard.beginInstances(); it != guard.endInstances(); ++it)
  314. {
  315. LLNameListCtrl& ctrl = *it;
  316. ctrl.refresh(id, first, last, is_group);
  317. }
  318. }
  319. void LLNameListCtrl::updateColumns()
  320. {
  321. LLScrollListCtrl::updateColumns();
  322. if (!mNameColumn.empty())
  323. {
  324. LLScrollListColumn* name_column = getColumn(mNameColumn);
  325. if (name_column)
  326. {
  327. mNameColumnIndex = name_column->mIndex;
  328. }
  329. }
  330. }