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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llscrollingpanellist.cpp
  3.  * @brief 
  4.  *
  5.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2006-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 "llstl.h"
  34. #include "llscrollingpanellist.h"
  35. static LLDefaultChildRegistry::Register<LLScrollingPanelList> r("scrolling_panel_list");
  36. /////////////////////////////////////////////////////////////////////
  37. // LLScrollingPanelList
  38. // This could probably be integrated with LLScrollContainer -SJB
  39. void LLScrollingPanelList::clearPanels()
  40. {
  41. deleteAllChildren();
  42. mPanelList.clear();
  43. reshape( 1, 1, FALSE );
  44. }
  45. S32 LLScrollingPanelList::addPanel( LLScrollingPanel* panel )
  46. {
  47. addChildInBack( panel );
  48. mPanelList.push_front( panel );
  49. // Resize this view
  50. S32 total_height = 0;
  51. S32 max_width = 0;
  52. S32 cur_gap = 0;
  53. for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin();
  54.  iter != mPanelList.end(); ++iter)
  55. {
  56. LLScrollingPanel *childp = *iter;
  57. total_height += childp->getRect().getHeight() + cur_gap;
  58. max_width = llmax( max_width, childp->getRect().getWidth() );
  59. cur_gap = GAP_BETWEEN_PANELS;
  60. }
  61. reshape( max_width, total_height, FALSE );
  62. // Reposition each of the child views
  63. S32 cur_y = total_height;
  64. for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin();
  65.  iter != mPanelList.end(); ++iter)
  66. {
  67. LLScrollingPanel *childp = *iter;
  68. cur_y -= childp->getRect().getHeight();
  69. childp->translate( -childp->getRect().mLeft, cur_y - childp->getRect().mBottom);
  70. cur_y -= GAP_BETWEEN_PANELS;
  71. }
  72. return total_height;
  73. }
  74. void LLScrollingPanelList::removePanel(LLScrollingPanel* panel) 
  75. {
  76. U32 index = 0;
  77. LLScrollingPanelList::panel_list_t::const_iterator iter;
  78. if (!mPanelList.empty()) 
  79. {
  80. for (iter = mPanelList.begin(); iter != mPanelList.end(); ++iter, ++index) 
  81. {
  82. if (*iter == panel) 
  83. {
  84. break;
  85. }
  86. }
  87. if(iter != mPanelList.end())
  88. {
  89. removePanel(index);
  90. }
  91. }
  92. }
  93. void LLScrollingPanelList::removePanel( U32 panel_index )
  94. {
  95. if ( mPanelList.empty() || panel_index >= mPanelList.size() )
  96. {
  97. llwarns << "Panel index " << panel_index << " is out of range!" << llendl;
  98. return;
  99. }
  100. else
  101. {
  102. removeChild( mPanelList.at(panel_index) );
  103. mPanelList.erase( mPanelList.begin() + panel_index );
  104. }
  105. const S32 GAP_BETWEEN_PANELS = 6;
  106. // Resize this view
  107. S32 total_height = 0;
  108. S32 max_width = 0;
  109. S32 cur_gap = 0;
  110. for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin();
  111.  iter != mPanelList.end(); ++iter)
  112. {
  113. LLScrollingPanel *childp = *iter;
  114. total_height += childp->getRect().getHeight() + cur_gap;
  115. max_width = llmax( max_width, childp->getRect().getWidth() );
  116. cur_gap = GAP_BETWEEN_PANELS;
  117. }
  118. reshape( max_width, total_height, FALSE );
  119. // Reposition each of the child views
  120. S32 cur_y = total_height;
  121. for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin();
  122.  iter != mPanelList.end(); ++iter)
  123. {
  124. LLScrollingPanel *childp = *iter;
  125. cur_y -= childp->getRect().getHeight();
  126. childp->translate( -childp->getRect().mLeft, cur_y - childp->getRect().mBottom);
  127. cur_y -= GAP_BETWEEN_PANELS;
  128. }
  129. }
  130. void LLScrollingPanelList::updatePanels(BOOL allow_modify)
  131. {
  132.     for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin();
  133.  iter != mPanelList.end(); ++iter)
  134.     {
  135. LLScrollingPanel *childp = *iter;
  136. childp->updatePanel(allow_modify);
  137.     }
  138. }
  139. void LLScrollingPanelList::updatePanelVisiblilty()
  140. {
  141. // Determine visibility of children.
  142. S32 BORDER_WIDTH = 2;  // HACK
  143. LLRect parent_local_rect = getParent()->getRect();
  144. parent_local_rect.stretch( -BORDER_WIDTH );
  145. LLRect parent_screen_rect;
  146. getParent()->localPointToScreen( 
  147. BORDER_WIDTH, 0, 
  148. &parent_screen_rect.mLeft, &parent_screen_rect.mBottom );
  149. getParent()->localPointToScreen( 
  150. parent_local_rect.getWidth() - BORDER_WIDTH, parent_local_rect.getHeight() - BORDER_WIDTH,
  151. &parent_screen_rect.mRight, &parent_screen_rect.mTop );
  152. for (std::deque<LLScrollingPanel*>::iterator iter = mPanelList.begin();
  153.  iter != mPanelList.end(); ++iter)
  154. {
  155. LLScrollingPanel *childp = *iter;
  156. const LLRect& local_rect = childp->getRect();
  157. LLRect screen_rect;
  158. childp->localPointToScreen( 
  159. 0, 0, 
  160. &screen_rect.mLeft, &screen_rect.mBottom );
  161. childp->localPointToScreen(
  162. local_rect.getWidth(), local_rect.getHeight(),
  163. &screen_rect.mRight, &screen_rect.mTop );
  164. BOOL intersects = 
  165. ( (screen_rect.mRight > parent_screen_rect.mLeft) && (screen_rect.mLeft < parent_screen_rect.mRight) ) && 
  166. ( (screen_rect.mTop > parent_screen_rect.mBottom) && (screen_rect.mBottom < parent_screen_rect.mTop) );
  167. childp->setVisible( intersects );
  168. }
  169. }
  170. void LLScrollingPanelList::draw()
  171. {
  172. updatePanelVisiblilty();
  173. LLUICtrl::draw();
  174. }