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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llscrolllistcell.cpp
  3.  * @brief Scroll lists are composed of rows (items), each of which 
  4.  * contains columns (cells).
  5.  *
  6.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2007-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "linden_common.h"
  34. #include "llscrolllistcell.h"
  35. #include "llcheckboxctrl.h"
  36. #include "llui.h" // LLUIImage
  37. #include "lluictrlfactory.h"
  38. //static 
  39. LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_p)
  40. {
  41. LLScrollListCell* cell = NULL;
  42. if (cell_p.type() == "icon")
  43. {
  44. cell = new LLScrollListIcon(cell_p);
  45. }
  46. else if (cell_p.type() == "checkbox")
  47. {
  48. cell = new LLScrollListCheck(cell_p);
  49. }
  50. else if (cell_p.type() == "date")
  51. {
  52. cell = new LLScrollListDate(cell_p);
  53. }
  54. else // default is "text"
  55. {
  56. cell = new LLScrollListText(cell_p);
  57. }
  58. if (cell_p.value.isProvided())
  59. {
  60. cell->setValue(cell_p.value);
  61. }
  62. return cell;
  63. }
  64. LLScrollListCell::LLScrollListCell(const LLScrollListCell::Params& p)
  65. : mWidth(p.width), 
  66. mToolTip(p.tool_tip)
  67. {}
  68. // virtual
  69. const LLSD LLScrollListCell::getValue() const
  70. {
  71. return LLStringUtil::null;
  72. }
  73. //
  74. // LLScrollListIcon
  75. //
  76. LLScrollListIcon::LLScrollListIcon(const LLScrollListCell::Params& p)
  77. : LLScrollListCell(p),
  78. mIcon(LLUI::getUIImage(p.value().asString())),
  79. mColor(p.color),
  80. mAlignment(p.font_halign)
  81. {}
  82. LLScrollListIcon::~LLScrollListIcon()
  83. {
  84. }
  85. /*virtual*/
  86. S32 LLScrollListIcon::getHeight() const
  87. { return mIcon ? mIcon->getHeight() : 0; }
  88. /*virtual*/
  89. const LLSD LLScrollListIcon::getValue() const
  90. { return mIcon.isNull() ? LLStringUtil::null : mIcon->getName(); }
  91. void LLScrollListIcon::setValue(const LLSD& value)
  92. {
  93. if (value.isUUID())
  94. {
  95. // don't use default image specified by LLUUID::null, use no image in that case
  96. LLUUID image_id = value.asUUID();
  97. mIcon = image_id.notNull() ? LLUI::getUIImageByID(image_id) : LLUIImagePtr(NULL);
  98. }
  99. else
  100. {
  101. std::string value_string = value.asString();
  102. if (LLUUID::validate(value_string))
  103. {
  104. setValue(LLUUID(value_string));
  105. }
  106. else if (!value_string.empty())
  107. {
  108. mIcon = LLUI::getUIImage(value.asString());
  109. }
  110. else
  111. {
  112. mIcon = NULL;
  113. }
  114. }
  115. }
  116. void LLScrollListIcon::setColor(const LLColor4& color)
  117. {
  118. mColor = color;
  119. }
  120. S32 LLScrollListIcon::getWidth() const 
  121. {
  122. // if no specified fix width, use width of icon
  123. if (LLScrollListCell::getWidth() == 0 && mIcon.notNull())
  124. {
  125. return mIcon->getWidth();
  126. }
  127. return LLScrollListCell::getWidth();
  128. }
  129. void LLScrollListIcon::draw(const LLColor4& color, const LLColor4& highlight_color)  const
  130. {
  131. if (mIcon)
  132. {
  133. switch(mAlignment)
  134. {
  135. case LLFontGL::LEFT:
  136. mIcon->draw(0, 0, mColor);
  137. break;
  138. case LLFontGL::RIGHT:
  139. mIcon->draw(getWidth() - mIcon->getWidth(), 0, mColor);
  140. break;
  141. case LLFontGL::HCENTER:
  142. mIcon->draw((getWidth() - mIcon->getWidth()) / 2, 0, mColor);
  143. break;
  144. default:
  145. break;
  146. }
  147. }
  148. }
  149. //
  150. // LLScrollListText
  151. //
  152. U32 LLScrollListText::sCount = 0;
  153. LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
  154. : LLScrollListCell(p),
  155. mText(p.value().asString()),
  156. mFont(p.font),
  157. mColor(p.color),
  158. mUseColor(p.color.isProvided()),
  159. mFontAlignment(p.font_halign),
  160. mVisible(p.visible),
  161. mHighlightCount( 0 ),
  162. mHighlightOffset( 0 )
  163. {
  164. sCount++;
  165. // initialize rounded rect image
  166. if (!mRoundedRectImage)
  167. {
  168. mRoundedRectImage = LLUI::getUIImage("Rounded_Square");
  169. }
  170. }
  171. //virtual 
  172. void LLScrollListText::highlightText(S32 offset, S32 num_chars)
  173. {
  174. mHighlightOffset = offset;
  175. mHighlightCount = num_chars;
  176. }
  177. //virtual 
  178. BOOL LLScrollListText::isText() const
  179. {
  180. return TRUE;
  181. }
  182. // virtual
  183. const std::string &LLScrollListText::getToolTip() const
  184. {
  185. // If base class has a tooltip, return that
  186. if (! LLScrollListCell::getToolTip().empty())
  187. return LLScrollListCell::getToolTip();
  188. // ...otherwise, return the value itself as the tooltip
  189. return mText.getString();
  190. }
  191. // virtual
  192. BOOL LLScrollListText::needsToolTip() const
  193. {
  194. // If base class has a tooltip, return that
  195. if (LLScrollListCell::needsToolTip())
  196. return LLScrollListCell::needsToolTip();
  197. // ...otherwise, show tooltips for truncated text
  198. return mFont->getWidth(mText.getString()) > getWidth();
  199. }
  200. //virtual 
  201. BOOL LLScrollListText::getVisible() const
  202. {
  203. return mVisible;
  204. }
  205. //virtual 
  206. S32 LLScrollListText::getHeight() const
  207. {
  208. return llround(mFont->getLineHeight());
  209. }
  210. LLScrollListText::~LLScrollListText()
  211. {
  212. sCount--;
  213. }
  214. S32 LLScrollListText::getContentWidth() const
  215. {
  216. return mFont->getWidth(mText.getString());
  217. }
  218. void LLScrollListText::setColor(const LLColor4& color)
  219. {
  220. mColor = color;
  221. mUseColor = TRUE;
  222. }
  223. void LLScrollListText::setText(const LLStringExplicit& text)
  224. {
  225. mText = text;
  226. }
  227. void LLScrollListText::setFontStyle(const U8 font_style)
  228. {
  229. LLFontDescriptor new_desc(mFont->getFontDesc());
  230. new_desc.setStyle(font_style);
  231. mFont = LLFontGL::getFont(new_desc);
  232. }
  233. //virtual
  234. void LLScrollListText::setValue(const LLSD& text)
  235. {
  236. setText(text.asString());
  237. }
  238. //virtual 
  239. const LLSD LLScrollListText::getValue() const
  240. return LLSD(mText.getString()); 
  241. }
  242. void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_color) const
  243. {
  244. LLColor4 display_color;
  245. if (mUseColor)
  246. {
  247. display_color = mColor;
  248. }
  249. else
  250. {
  251. display_color = color;
  252. }
  253. if (mHighlightCount > 0)
  254. {
  255. S32 left = 0;
  256. switch(mFontAlignment)
  257. {
  258. case LLFontGL::LEFT:
  259. left = mFont->getWidth(mText.getString(), 0, mHighlightOffset);
  260. break;
  261. case LLFontGL::RIGHT:
  262. left = getWidth() - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX);
  263. break;
  264. case LLFontGL::HCENTER:
  265. left = (getWidth() - mFont->getWidth(mText.getString())) / 2;
  266. break;
  267. }
  268. LLRect highlight_rect(left - 2, 
  269. llround(mFont->getLineHeight()) + 1, 
  270. left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1, 
  271. 1);
  272. mRoundedRectImage->draw(highlight_rect, highlight_color);
  273. }
  274. // Try to draw the entire string
  275. F32 right_x;
  276. U32 string_chars = mText.length();
  277. F32 start_x = 0.f;
  278. switch(mFontAlignment)
  279. {
  280. case LLFontGL::LEFT:
  281. start_x = 0.f;
  282. break;
  283. case LLFontGL::RIGHT:
  284. start_x = (F32)getWidth();
  285. break;
  286. case LLFontGL::HCENTER:
  287. start_x = (F32)getWidth() * 0.5f;
  288. break;
  289. }
  290. mFont->render(mText.getWString(), 0, 
  291. start_x, 2.f,
  292. display_color,
  293. mFontAlignment,
  294. LLFontGL::BOTTOM, 
  295. 0,
  296. LLFontGL::NO_SHADOW,
  297. string_chars, 
  298. getWidth(),
  299. &right_x, 
  300. TRUE);
  301. }
  302. //
  303. // LLScrollListCheck
  304. //
  305. LLScrollListCheck::LLScrollListCheck(const LLScrollListCell::Params& p)
  306. : LLScrollListCell(p)
  307. {
  308. LLCheckBoxCtrl::Params checkbox_p;
  309. checkbox_p.name("checkbox");
  310. checkbox_p.rect = LLRect(0, p.width, p.width, 0);
  311. checkbox_p.enabled(p.enabled);
  312. checkbox_p.initial_value(p.value());
  313. mCheckBox = LLUICtrlFactory::create<LLCheckBoxCtrl>(checkbox_p);
  314.  
  315. LLRect rect(mCheckBox->getRect());
  316. if (p.width)
  317. {
  318. rect.mRight = rect.mLeft + p.width;
  319. mCheckBox->setRect(rect);
  320. setWidth(p.width);
  321. }
  322. else
  323. {
  324. setWidth(rect.getWidth()); //check_box->getWidth();
  325. }
  326. mCheckBox->setColor(p.color);
  327. }
  328. LLScrollListCheck::~LLScrollListCheck()
  329. {
  330. delete mCheckBox;
  331. mCheckBox = NULL;
  332. }
  333. void LLScrollListCheck::draw(const LLColor4& color, const LLColor4& highlight_color) const
  334. {
  335. mCheckBox->draw();
  336. }
  337. BOOL LLScrollListCheck::handleClick()
  338. if (mCheckBox->getEnabled())
  339. {
  340. mCheckBox->toggle();
  341. }
  342. // don't change selection when clicking on embedded checkbox
  343. return TRUE; 
  344. }
  345. /*virtual*/
  346. const LLSD LLScrollListCheck::getValue() const
  347. {
  348. return mCheckBox->getValue();
  349. }
  350. /*virtual*/
  351. void LLScrollListCheck::setValue(const LLSD& value)
  352. {
  353. mCheckBox->setValue(value);
  354. }
  355. /*virtual*/
  356. void LLScrollListCheck::onCommit()
  357. {
  358. mCheckBox->onCommit();
  359. }
  360. /*virtual*/
  361. void LLScrollListCheck::setEnabled(BOOL enable)
  362. {
  363. mCheckBox->setEnabled(enable);
  364. }
  365. //
  366. // LLScrollListDate
  367. //
  368. LLScrollListDate::LLScrollListDate( const LLScrollListCell::Params& p)
  369. : LLScrollListText(p),
  370. mDate(p.value().asDate())
  371. {}
  372. void LLScrollListDate::setValue(const LLSD& value)
  373. {
  374. mDate = value.asDate();
  375. LLScrollListText::setValue(mDate.asRFC1123());
  376. }
  377. const LLSD LLScrollListDate::getValue() const
  378. {
  379. return mDate;
  380. }