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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcontainerview.cpp
  3.  * @brief Container for all statistics info
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-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 "linden_common.h"
  33. #include "llcontainerview.h"
  34. #include "llerror.h"
  35. #include "llfontgl.h"
  36. #include "llgl.h"
  37. #include "llui.h"
  38. #include "llstring.h"
  39. #include "llscrollcontainer.h"
  40. #include "lluictrlfactory.h"
  41. static LLDefaultChildRegistry::Register<LLContainerView> r1("container_view");
  42. #include "llpanel.h"
  43. #include "llstatview.h"
  44. static ContainerViewRegistry::Register<LLStatView> r2("stat_view");
  45. static ContainerViewRegistry::Register<LLPanel> r3("panel", &LLPanel::fromXML);
  46. LLContainerView::LLContainerView(const LLContainerView::Params& p)
  47. : LLView(p),
  48. mShowLabel(p.show_label),
  49. mLabel(p.label),
  50. mDisplayChildren(p.display_children)
  51. {
  52. mCollapsible = TRUE;
  53. mScrollContainer = NULL;
  54. }
  55. LLContainerView::~LLContainerView()
  56. {
  57. // Children all cleaned up by default view destructor.
  58. }
  59. BOOL LLContainerView::postBuild()
  60. {
  61. setDisplayChildren(mDisplayChildren);
  62. reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
  63. return TRUE;
  64. }
  65. bool LLContainerView::addChild(LLView* child, S32 tab_group)
  66. {
  67. bool res = LLView::addChild(child, tab_group);
  68. if (res)
  69. {
  70. sendChildToBack(child);
  71. }
  72. return res;
  73. }
  74. BOOL LLContainerView::handleMouseDown(S32 x, S32 y, MASK mask)
  75. {
  76. BOOL handled = FALSE;
  77. if (mDisplayChildren)
  78. {
  79. handled = (LLView::childrenHandleMouseDown(x, y, mask) != NULL);
  80. }
  81. if (!handled)
  82. {
  83. if( mCollapsible && mShowLabel && (y >= getRect().getHeight() - 10) )
  84. {
  85. setDisplayChildren(!mDisplayChildren);
  86. reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
  87. handled = TRUE;
  88. }
  89. }
  90. return handled;
  91. }
  92. BOOL LLContainerView::handleMouseUp(S32 x, S32 y, MASK mask)
  93. {
  94. BOOL handled = FALSE;
  95. if (mDisplayChildren)
  96. {
  97. handled = (LLView::childrenHandleMouseUp(x, y, mask) != NULL);
  98. }
  99. return handled;
  100. }
  101. void LLContainerView::draw()
  102. {
  103. {
  104. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  105. gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.f, 0.f, 0.f, 0.25f));
  106. }
  107. // Draw the label
  108. if (mShowLabel)
  109. {
  110. LLFontGL::getFontMonospace()->renderUTF8(
  111. mLabel, 0, 2, getRect().getHeight() - 2, LLColor4(1,1,1,1), LLFontGL::LEFT, LLFontGL::TOP);
  112. }
  113. LLView::draw();
  114. }
  115. void LLContainerView::reshape(S32 width, S32 height, BOOL called_from_parent)
  116. {
  117. LLRect scroller_rect;
  118. scroller_rect.setOriginAndSize(0, 0, width, height);
  119. if (mScrollContainer)
  120. {
  121. scroller_rect = mScrollContainer->getContentWindowRect();
  122. }
  123. else
  124. {
  125. // if we're uncontained - make height as small as possible
  126. scroller_rect.mTop = 0;
  127. }
  128. arrange(scroller_rect.getWidth(), scroller_rect.getHeight(), called_from_parent);
  129. // sometimes, after layout, our container will change size (scrollbars popping in and out)
  130. // if so, attempt another layout
  131. if (mScrollContainer)
  132. {
  133. LLRect new_container_rect = mScrollContainer->getContentWindowRect();
  134. if ((new_container_rect.getWidth() != scroller_rect.getWidth()) ||
  135. (new_container_rect.getHeight() != scroller_rect.getHeight()))  // the container size has changed, attempt to arrange again
  136. {
  137. arrange(new_container_rect.getWidth(), new_container_rect.getHeight(), called_from_parent);
  138. }
  139. }
  140. }
  141. void LLContainerView::arrange(S32 width, S32 height, BOOL called_from_parent)
  142. {
  143. // Determine the sizes and locations of all contained views
  144. S32 total_height = 0;
  145. S32 top, left, right, bottom;
  146. //LLView *childp;
  147. // These will be used for the children
  148. left = 4;
  149. top = getRect().getHeight() - 4;
  150. right = width - 2;
  151. bottom = top;
  152. // Leave some space for the top label/grab handle
  153. if (mShowLabel)
  154. {
  155. total_height += 20;
  156. }
  157. if (mDisplayChildren)
  158. {
  159. // Determine total height
  160. U32 child_height = 0;
  161. for (child_list_const_iter_t child_iter = getChildList()->begin();
  162.  child_iter != getChildList()->end(); ++child_iter)
  163. {
  164. LLView *childp = *child_iter;
  165. if (!childp->getVisible())
  166. {
  167. llwarns << "Incorrect visibility!" << llendl;
  168. }
  169. LLRect child_rect = childp->getRequiredRect();
  170. child_height += child_rect.getHeight();
  171. child_height += 2;
  172. }
  173. total_height += child_height;
  174. }
  175. if (total_height < height)
  176. total_height = height;
  177. if (followsTop())
  178. {
  179. // HACK: casting away const. Should use setRect or some helper function instead.
  180. const_cast<LLRect&>(getRect()).mBottom = getRect().mTop - total_height;
  181. }
  182. else
  183. {
  184. // HACK: casting away const. Should use setRect or some helper function instead.
  185. const_cast<LLRect&>(getRect()).mTop = getRect().mBottom + total_height;
  186. }
  187. // HACK: casting away const. Should use setRect or some helper function instead.
  188. const_cast<LLRect&>(getRect()).mRight = getRect().mLeft + width;
  189. top = total_height;
  190. if (mShowLabel)
  191. {
  192. top -= 20;
  193. }
  194. bottom = top;
  195. if (mDisplayChildren)
  196. {
  197. // Iterate through all children, and put in container from top down.
  198. for (child_list_const_iter_t child_iter = getChildList()->begin();
  199.  child_iter != getChildList()->end(); ++child_iter)
  200. {
  201. LLView *childp = *child_iter;
  202. LLRect child_rect = childp->getRequiredRect();
  203. bottom -= child_rect.getHeight();
  204. LLRect r(left, bottom + child_rect.getHeight(), right, bottom);
  205. childp->setRect(r);
  206. childp->reshape(right - left, top - bottom);
  207. top = bottom - 2;
  208. bottom = top;
  209. }
  210. }
  211. if (!called_from_parent)
  212. {
  213. if (getParent())
  214. {
  215. getParent()->reshape(getParent()->getRect().getWidth(), getParent()->getRect().getHeight(), FALSE);
  216. }
  217. }
  218. }
  219. LLRect LLContainerView::getRequiredRect()
  220. {
  221. LLRect req_rect;
  222. //LLView *childp;
  223. U32 total_height = 0;
  224. // Determine the sizes and locations of all contained views
  225. // Leave some space for the top label/grab handle
  226. if (mShowLabel)
  227. {
  228. total_height = 20;
  229. }
  230. if (mDisplayChildren)
  231. {
  232. // Determine total height
  233. U32 child_height = 0;
  234. for (child_list_const_iter_t child_iter = getChildList()->begin();
  235.  child_iter != getChildList()->end(); ++child_iter)
  236. {
  237. LLView *childp = *child_iter;
  238. LLRect child_rect = childp->getRequiredRect();
  239. child_height += child_rect.getHeight();
  240. child_height += 2;
  241. }
  242. total_height += child_height;
  243. }
  244. req_rect.mTop = total_height;
  245. return req_rect;
  246. }
  247. void LLContainerView::setLabel(const std::string& label)
  248. {
  249. mLabel = label;
  250. }
  251. void LLContainerView::setDisplayChildren(const BOOL displayChildren)
  252. {
  253. mDisplayChildren = displayChildren;
  254. for (child_list_const_iter_t child_iter = getChildList()->begin();
  255.  child_iter != getChildList()->end(); ++child_iter)
  256. {
  257. LLView *childp = *child_iter;
  258. childp->setVisible(mDisplayChildren);
  259. }
  260. }