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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatergroups.cpp
  3.  * @brief LLPanelGroups class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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. /*
  33.  * Shown from Edit -> Groups...
  34.  * Shows the agent's groups and allows the edit window to be invoked.
  35.  * Also overloaded to allow picking of a single group for assigning 
  36.  * objects and land to groups.
  37.  */
  38. #include "llviewerprecompiledheaders.h"
  39. #include "llfloatergroups.h"
  40. #include "roles_constants.h"
  41. #include "llagent.h"
  42. #include "llbutton.h"
  43. #include "llgroupactions.h"
  44. #include "llscrolllistctrl.h"
  45. #include "lltextbox.h"
  46. #include "lluictrlfactory.h"
  47. #include "lltrans.h"
  48. using namespace LLOldEvents;
  49. // helper functions
  50. void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask = GP_ALL_POWERS);
  51. ///----------------------------------------------------------------------------
  52. /// Class LLFloaterGroupPicker
  53. ///----------------------------------------------------------------------------
  54. LLFloaterGroupPicker::LLFloaterGroupPicker(const LLSD& seed)
  55. :  LLFloater(seed),
  56. mPowersMask(GP_ALL_POWERS),
  57. mID(seed.asUUID())
  58. {
  59. //  LLUICtrlFactory::getInstance()->buildFloater(this, "floater_choose_group.xml");
  60. }
  61. LLFloaterGroupPicker::~LLFloaterGroupPicker()
  62. {
  63. }
  64. void LLFloaterGroupPicker::setPowersMask(U64 powers_mask)
  65. {
  66. mPowersMask = powers_mask;
  67. init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID(), mPowersMask);
  68. }
  69. BOOL LLFloaterGroupPicker::postBuild()
  70. {
  71. LLScrollListCtrl* list_ctrl = getChild<LLScrollListCtrl>("group list");
  72. if (list_ctrl)
  73. {
  74. init_group_list(list_ctrl, gAgent.getGroupID(), mPowersMask);
  75. list_ctrl->setDoubleClickCallback(onBtnOK, this);
  76. list_ctrl->setContextMenu(LLScrollListCtrl::MENU_GROUP);
  77. }
  78. childSetAction("OK", onBtnOK, this);
  79. childSetAction("Cancel", onBtnCancel, this);
  80. setDefaultBtn("OK");
  81. childEnable("OK");
  82. return TRUE;
  83. }
  84. void LLFloaterGroupPicker::removeNoneOption()
  85. {
  86. // Remove group "none" from list. Group "none" is added in init_group_list(). 
  87. // Some UI elements use group "none", we need to manually delete it here.
  88. // Group "none" ID is LLUUID:null.
  89. LLCtrlListInterface* group_list = getChild<LLScrollListCtrl>("group list")->getListInterface();
  90. if(group_list)
  91. {
  92. group_list->selectByValue(LLUUID::null);
  93. group_list->operateOnSelection(LLCtrlListInterface::OP_DELETE);
  94. }
  95. }
  96. void LLFloaterGroupPicker::onBtnOK(void* userdata)
  97. {
  98. LLFloaterGroupPicker* self = (LLFloaterGroupPicker*)userdata;
  99. if(self) self->ok();
  100. }
  101. void LLFloaterGroupPicker::onBtnCancel(void* userdata)
  102. {
  103. LLFloaterGroupPicker* self = (LLFloaterGroupPicker*)userdata;
  104. if(self) self->closeFloater();
  105. }
  106. void LLFloaterGroupPicker::ok()
  107. {
  108. LLCtrlListInterface *group_list = childGetListInterface("group list");
  109. LLUUID group_id;
  110. if (group_list)
  111. {
  112. group_id = group_list->getCurrentID();
  113. }
  114. mGroupSelectSignal(group_id);
  115. closeFloater();
  116. }
  117. ///----------------------------------------------------------------------------
  118. /// Class LLPanelGroups
  119. ///----------------------------------------------------------------------------
  120. //LLEventListener
  121. //virtual
  122. bool LLPanelGroups::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
  123. {
  124. if (event->desc() == "new group")
  125. {
  126. reset();
  127. return true;
  128. }
  129. return false;
  130. }
  131. // Default constructor
  132. LLPanelGroups::LLPanelGroups() :
  133. LLPanel()
  134. {
  135. gAgent.addListener(this, "new group");
  136. }
  137. LLPanelGroups::~LLPanelGroups()
  138. {
  139. gAgent.removeListener(this);
  140. }
  141. // clear the group list, and get a fresh set of info.
  142. void LLPanelGroups::reset()
  143. {
  144. LLCtrlListInterface *group_list = childGetListInterface("group list");
  145. if (group_list)
  146. {
  147. group_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
  148. }
  149. childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count()));
  150. childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS));
  151. init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID());
  152. enableButtons();
  153. }
  154. BOOL LLPanelGroups::postBuild()
  155. {
  156. childSetCommitCallback("group list", onGroupList, this);
  157. childSetTextArg("groupcount", "[COUNT]", llformat("%d",gAgent.mGroups.count()));
  158. childSetTextArg("groupcount", "[MAX]", llformat("%d",MAX_AGENT_GROUPS));
  159. LLScrollListCtrl *list = getChild<LLScrollListCtrl>("group list");
  160. if (list)
  161. {
  162. init_group_list(list, gAgent.getGroupID());
  163. list->setDoubleClickCallback(onBtnIM, this);
  164. list->setContextMenu(LLScrollListCtrl::MENU_GROUP);
  165. }
  166. childSetAction("Activate", onBtnActivate, this);
  167. childSetAction("Info", onBtnInfo, this);
  168. childSetAction("IM", onBtnIM, this);
  169. childSetAction("Leave", onBtnLeave, this);
  170. childSetAction("Create", onBtnCreate, this);
  171. childSetAction("Search...", onBtnSearch, this);
  172. setDefaultBtn("IM");
  173. reset();
  174. return TRUE;
  175. }
  176. void LLPanelGroups::enableButtons()
  177. {
  178. LLCtrlListInterface *group_list = childGetListInterface("group list");
  179. LLUUID group_id;
  180. if (group_list)
  181. {
  182. group_id = group_list->getCurrentID();
  183. }
  184. if(group_id != gAgent.getGroupID())
  185. {
  186. childEnable("Activate");
  187. }
  188. else
  189. {
  190. childDisable("Activate");
  191. }
  192. if (group_id.notNull())
  193. {
  194. childEnable("Info");
  195. childEnable("IM");
  196. childEnable("Leave");
  197. }
  198. else
  199. {
  200. childDisable("Info");
  201. childDisable("IM");
  202. childDisable("Leave");
  203. }
  204. childSetEnabled("Create", gAgent.canJoinGroups());
  205. }
  206. void LLPanelGroups::onBtnCreate(void* userdata)
  207. {
  208. LLPanelGroups* self = (LLPanelGroups*)userdata;
  209. if(self) self->create();
  210. }
  211. void LLPanelGroups::onBtnActivate(void* userdata)
  212. {
  213. LLPanelGroups* self = (LLPanelGroups*)userdata;
  214. if(self) self->activate();
  215. }
  216. void LLPanelGroups::onBtnInfo(void* userdata)
  217. {
  218. LLPanelGroups* self = (LLPanelGroups*)userdata;
  219. if(self) self->info();
  220. }
  221. void LLPanelGroups::onBtnIM(void* userdata)
  222. {
  223. LLPanelGroups* self = (LLPanelGroups*)userdata;
  224. if(self) self->startIM();
  225. }
  226. void LLPanelGroups::onBtnLeave(void* userdata)
  227. {
  228. LLPanelGroups* self = (LLPanelGroups*)userdata;
  229. if(self) self->leave();
  230. }
  231. void LLPanelGroups::onBtnSearch(void* userdata)
  232. {
  233. LLPanelGroups* self = (LLPanelGroups*)userdata;
  234. if(self) self->search();
  235. }
  236. void LLPanelGroups::create()
  237. {
  238. LLGroupActions::createGroup();
  239. }
  240. void LLPanelGroups::activate()
  241. {
  242. LLCtrlListInterface *group_list = childGetListInterface("group list");
  243. LLUUID group_id;
  244. if (group_list)
  245. {
  246. group_id = group_list->getCurrentID();
  247. }
  248. LLGroupActions::activate(group_id);
  249. }
  250. void LLPanelGroups::info()
  251. {
  252. LLCtrlListInterface *group_list = childGetListInterface("group list");
  253. LLUUID group_id;
  254. if (group_list && (group_id = group_list->getCurrentID()).notNull())
  255. {
  256. LLGroupActions::show(group_id);
  257. }
  258. }
  259. void LLPanelGroups::startIM()
  260. {
  261. LLCtrlListInterface *group_list = childGetListInterface("group list");
  262. LLUUID group_id;
  263. if (group_list && (group_id = group_list->getCurrentID()).notNull())
  264. {
  265. LLGroupActions::startIM(group_id);
  266. }
  267. }
  268. void LLPanelGroups::leave()
  269. {
  270. LLCtrlListInterface *group_list = childGetListInterface("group list");
  271. LLUUID group_id;
  272. if (group_list && (group_id = group_list->getCurrentID()).notNull())
  273. {
  274. LLGroupActions::leave(group_id);
  275. }
  276. }
  277. void LLPanelGroups::search()
  278. {
  279. LLGroupActions::search();
  280. }
  281. void LLPanelGroups::onGroupList(LLUICtrl* ctrl, void* userdata)
  282. {
  283. LLPanelGroups* self = (LLPanelGroups*)userdata;
  284. if(self) self->enableButtons();
  285. }
  286. void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask)
  287. {
  288. S32 count = gAgent.mGroups.count();
  289. LLUUID id;
  290. LLCtrlListInterface *group_list = ctrl->getListInterface();
  291. if (!group_list) return;
  292. group_list->operateOnAll(LLCtrlListInterface::OP_DELETE);
  293. for(S32 i = 0; i < count; ++i)
  294. {
  295. id = gAgent.mGroups.get(i).mID;
  296. LLGroupData* group_datap = &gAgent.mGroups.get(i);
  297. if ((powers_mask == GP_ALL_POWERS) || ((group_datap->mPowers & powers_mask) != 0))
  298. {
  299. std::string style = "NORMAL";
  300. if(highlight_id == id)
  301. {
  302. style = "BOLD";
  303. }
  304. LLSD element;
  305. element["id"] = id;
  306. element["columns"][0]["column"] = "name";
  307. element["columns"][0]["value"] = group_datap->mName;
  308. element["columns"][0]["font"]["name"] = "SANSSERIF";
  309. element["columns"][0]["font"]["style"] = style;
  310. group_list->addElement(element, ADD_SORTED);
  311. }
  312. }
  313. // add "none" to list at top
  314. {
  315. std::string style = "NORMAL";
  316. if (highlight_id.isNull())
  317. {
  318. style = "BOLD";
  319. }
  320. LLSD element;
  321. element["id"] = LLUUID::null;
  322. element["columns"][0]["column"] = "name";
  323. element["columns"][0]["value"] = LLTrans::getString("GroupsNone");
  324. element["columns"][0]["font"]["name"] = "SANSSERIF";
  325. element["columns"][0]["font"]["style"] = style;
  326. group_list->addElement(element, ADD_TOP);
  327. }
  328. group_list->selectByValue(highlight_id);
  329. }