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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llchatitemscontainer.cpp
  3.  * @brief chat history scrolling panel implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-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 "llchatitemscontainerctrl.h"
  34. #include "lltextbox.h"
  35. #include "llchatmsgbox.h"
  36. #include "llavatariconctrl.h"
  37. #include "llfloaterreg.h"
  38. #include "lllocalcliprect.h"
  39. #include "lltrans.h"
  40. #include "llviewercontrol.h"
  41. #include "llagentdata.h"
  42. static const S32 msg_left_offset = 10;
  43. static const S32 msg_right_offset = 10;
  44. static const S32 msg_height_pad = 5;
  45. //*******************************************************************************************************************
  46. //LLNearbyChatToastPanel
  47. //*******************************************************************************************************************
  48. LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance()
  49. {
  50. LLNearbyChatToastPanel* item = new LLNearbyChatToastPanel();
  51. LLUICtrlFactory::getInstance()->buildPanel(item, "panel_chat_item.xml");
  52. item->setFollows(FOLLOWS_NONE);
  53. return item;
  54. }
  55. void LLNearbyChatToastPanel::reshape (S32 width, S32 height, BOOL called_from_parent )
  56. {
  57. LLPanel::reshape(width, height,called_from_parent);
  58. LLUICtrl* msg_text = getChild<LLUICtrl>("msg_text", false);
  59. LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
  60. LLRect msg_text_rect = msg_text->getRect();
  61. LLRect avatar_rect = icon->getRect();
  62. avatar_rect.setLeftTopAndSize(2,height-2,avatar_rect.getWidth(),avatar_rect.getHeight());
  63. icon->setRect(avatar_rect);
  64. msg_text_rect.setLeftTopAndSize( avatar_rect.mRight + msg_left_offset, 
  65. height - msg_height_pad, 
  66. width - avatar_rect.mRight  - msg_left_offset - msg_right_offset, 
  67. height - 2*msg_height_pad);
  68. msg_text->reshape( msg_text_rect.getWidth(), msg_text_rect.getHeight(), 1);
  69. msg_text->setRect(msg_text_rect);
  70. }
  71. BOOL LLNearbyChatToastPanel::postBuild()
  72. {
  73. return LLPanel::postBuild();
  74. }
  75. void LLNearbyChatToastPanel::addMessage(LLSD& notification)
  76. {
  77. std::string messageText = notification["message"].asString(); // UTF-8 line of text
  78. LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
  79. std::string color_name = notification["text_color"].asString();
  80. LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
  81. textColor.mV[VALPHA] =notification["color_alpha"].asReal();
  82. S32 font_size = notification["font_size"].asInteger();
  83. LLFontGL*       messageFont;
  84. switch(font_size)
  85. {
  86. case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
  87. default:
  88. case 1: messageFont = LLFontGL::getFontSansSerif();     break;
  89. case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
  90. }
  91. //append text
  92. {
  93. LLStyle::Params style_params;
  94. style_params.color(textColor);
  95. std::string font_name = LLFontGL::nameFromFont(messageFont);
  96. std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
  97. style_params.font.name(font_name);
  98. style_params.font.size(font_style_size);
  99. int chat_type = notification["chat_type"].asInteger();
  100. if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
  101. {
  102. style_params.font.style = "ITALIC";
  103. }
  104. else if( chat_type == CHAT_TYPE_SHOUT)
  105. {
  106. style_params.font.style = "BOLD";
  107. }
  108. else if( chat_type == CHAT_TYPE_WHISPER)
  109. {
  110. style_params.font.style = "ITALIC";
  111. }
  112. msg_text->appendText(messageText, TRUE, style_params);
  113. }
  114. snapToMessageHeight();
  115. }
  116. void LLNearbyChatToastPanel::init(LLSD& notification)
  117. {
  118. std::string messageText = notification["message"].asString(); // UTF-8 line of text
  119. std::string fromName = notification["from"].asString(); // agent or object name
  120. mFromID = notification["from_id"].asUUID(); // agent id or object id
  121. int sType = notification["source"].asInteger();
  122.     mSourceType = (EChatSourceType)sType;
  123. std::string color_name = notification["text_color"].asString();
  124. LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
  125. textColor.mV[VALPHA] =notification["color_alpha"].asReal();
  126. S32 font_size = notification["font_size"].asInteger();
  127. LLFontGL*       messageFont;
  128. switch(font_size)
  129. {
  130. case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
  131. default:
  132. case 1: messageFont = LLFontGL::getFontSansSerif();     break;
  133. case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
  134. }
  135. LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
  136. msg_text->setText(std::string(""));
  137. if ( notification["chat_style"].asInteger() != CHAT_STYLE_IRC )
  138. {
  139. std::string str_sender;
  140. str_sender = fromName;
  141. str_sender+=" ";
  142. //append user name
  143. {
  144. LLStyle::Params style_params_name;
  145. LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor");
  146. style_params_name.color(userNameColor);
  147. std::string font_name = LLFontGL::nameFromFont(messageFont);
  148. std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
  149. style_params_name.font.name(font_name);
  150. style_params_name.font.size(font_style_size);
  151. msg_text->appendText(str_sender, FALSE, style_params_name);
  152. }
  153. }
  154. //append text
  155. {
  156. LLStyle::Params style_params;
  157. style_params.color(textColor);
  158. std::string font_name = LLFontGL::nameFromFont(messageFont);
  159. std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
  160. style_params.font.name(font_name);
  161. style_params.font.size(font_style_size);
  162. int chat_type = notification["chat_type"].asInteger();
  163. if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
  164. {
  165. style_params.font.style = "ITALIC";
  166. }
  167. else if( chat_type == CHAT_TYPE_SHOUT)
  168. {
  169. style_params.font.style = "BOLD";
  170. }
  171. else if( chat_type == CHAT_TYPE_WHISPER)
  172. {
  173. style_params.font.style = "ITALIC";
  174. }
  175. msg_text->appendText(messageText, FALSE, style_params);
  176. }
  177. snapToMessageHeight();
  178. mIsDirty = true;//will set Avatar Icon in draw
  179. }
  180. void LLNearbyChatToastPanel::snapToMessageHeight ()
  181. {
  182. LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
  183. S32 new_height = llmax (text_box->getTextPixelHeight() + 2*text_box->getVPad() + 2*msg_height_pad, 25);
  184. LLRect panel_rect = getRect();
  185. panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), new_height);
  186. reshape( getRect().getWidth(), getRect().getHeight(), 1);
  187. setRect(panel_rect);
  188. }
  189. void LLNearbyChatToastPanel::onMouseLeave (S32 x, S32 y, MASK mask)
  190. {
  191. }
  192. void LLNearbyChatToastPanel::onMouseEnter (S32 x, S32 y, MASK mask)
  193. {
  194. if(mSourceType != CHAT_SOURCE_AGENT)
  195. return;
  196. }
  197. BOOL LLNearbyChatToastPanel::handleMouseDown (S32 x, S32 y, MASK mask)
  198. {
  199. return LLPanel::handleMouseDown(x,y,mask);
  200. }
  201. BOOL LLNearbyChatToastPanel::handleMouseUp (S32 x, S32 y, MASK mask)
  202. {
  203. /*
  204. fix for request  EXT-4780
  205. leaving this commented since I don't remember why ew block those messages...
  206. if(mSourceType != CHAT_SOURCE_AGENT)
  207. return LLPanel::handleMouseUp(x,y,mask);
  208.     */
  209. LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
  210. S32 local_x = x - text_box->getRect().mLeft;
  211. S32 local_y = y - text_box->getRect().mBottom;
  212. //if text_box process mouse up (ussually this is click on url) - we didn't show nearby_chat.
  213. if (text_box->pointInView(local_x, local_y) )
  214. {
  215. if (text_box->handleMouseUp(local_x,local_y,mask) == TRUE)
  216. return TRUE;
  217. else
  218. {
  219. LLFloaterReg::showInstance("nearby_chat",LLSD());
  220. return FALSE;
  221. }
  222. }
  223. LLFloaterReg::showInstance("nearby_chat",LLSD());
  224. return LLPanel::handleMouseUp(x,y,mask);
  225. }
  226. void LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
  227. {
  228. LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
  229. if(icon)
  230. icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
  231. }
  232. bool LLNearbyChatToastPanel::canAddText ()
  233. {
  234. LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text");
  235. if(!msg_text)
  236. return false;
  237. return msg_text->getLineCount()<10;
  238. }
  239. BOOL LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
  240. {
  241. LLUICtrl* avatar_icon = getChild<LLUICtrl>("avatar_icon", false);
  242. S32 local_x = x - avatar_icon->getRect().mLeft;
  243. S32 local_y = y - avatar_icon->getRect().mBottom;
  244. //eat message for avatar icon if msg was from object
  245. if(avatar_icon->pointInView(local_x, local_y) && mSourceType != CHAT_SOURCE_AGENT)
  246. return TRUE;
  247. return LLPanel::handleRightMouseDown(x,y,mask);
  248. }
  249. void LLNearbyChatToastPanel::draw()
  250. {
  251. if(mIsDirty)
  252. {
  253. LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false);
  254. if(icon)
  255. {
  256. icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
  257. if(mSourceType == CHAT_SOURCE_AGENT)
  258. icon->setValue(mFromID);
  259. else
  260. icon->setValue(LLSD("OBJECT_Icon"));
  261. }
  262. mIsDirty = false;
  263. }
  264. LLToastPanelBase::draw();
  265. }