MyGUI  3.4.1
MyGUI_ScrollViewBase.cpp
Go to the documentation of this file.
1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_ScrollViewBase.h"
9 #include "MyGUI_ScrollBar.h"
10 
11 namespace MyGUI
12 {
13 
15  mVScroll(nullptr),
16  mHScroll(nullptr),
17  mScrollViewClient(nullptr),
18  mVisibleHScroll(true),
19  mVisibleVScroll(true),
20  mVRange(0),
21  mHRange(0),
22  mChangeContentByResize(false)
23  {
24  }
25 
27  {
28  if (mScrollViewClient == nullptr)
29  return;
30 
31  eraseContent();
32  IntSize contentSize = getContentSize();
33  IntSize viewSize = getViewSize();
34 
35  // вертикальный контент не помещается
36  if (contentSize.height > viewSize.height)
37  {
38  if (mVScroll != nullptr)
39  {
41  {
42  mVScroll->setVisible(true);
44 
45  // размер может измениться
47  {
48  eraseContent();
49  contentSize = getContentSize();
50  viewSize = getViewSize();
51  }
52 
53  if (mHScroll != nullptr)
54  {
56 
57  // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
58  // пересчитываем горизонтальный скрол на предмет показа
59  if ((contentSize.width > viewSize.width) && ( ! mHScroll->getVisible()) && (mVisibleHScroll))
60  {
61  mHScroll->setVisible(true);
64 
65  // размер может измениться
67  {
68  eraseContent();
69  contentSize = getContentSize();
70  viewSize = getViewSize();
71  }
72 
73  }
74  }
75  }
76  }
77  }
78  // вертикальный контент помещается
79  else
80  {
81  if (mVScroll != nullptr)
82  {
83  if (mVScroll->getVisible())
84  {
85  mVScroll->setVisible(false);
87 
88  // размер может измениться
90  {
91  eraseContent();
92  contentSize = getContentSize();
93  viewSize = getViewSize();
94  }
95 
96  if (mHScroll != nullptr)
97  {
99 
100  // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
101  // пересчитываем горизонтальный скрол на предмет скрытия
102  if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
103  {
104  mHScroll->setVisible(false);
107 
108  // размер может измениться
110  {
111  eraseContent();
112  contentSize = getContentSize();
113  viewSize = getViewSize();
114  }
115 
116  }
117  }
118  }
119  }
120  }
121 
122 
123  // горизонтальный контент не помещается
124  if (contentSize.width > viewSize.width)
125  {
126  if (mHScroll != nullptr)
127  {
129  {
130  mHScroll->setVisible(true);
132 
133  // размер может измениться
135  {
136  eraseContent();
137  contentSize = getContentSize();
138  viewSize = getViewSize();
139  }
140 
141  if (mVScroll != nullptr)
142  {
144 
145  // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
146  // пересчитываем вертикальный скрол на предмет показа
147  if ((contentSize.height > viewSize.height) && ( ! mVScroll->getVisible()) && (mVisibleVScroll))
148  {
149  mVScroll->setVisible(true);
152 
153  // размер может измениться
155  {
156  eraseContent();
157  contentSize = getContentSize();
158  viewSize = getViewSize();
159  }
160 
161  }
162  }
163  }
164  }
165  }
166  // горизонтальный контент помещается
167  else
168  {
169  if (mHScroll != nullptr)
170  {
171  if (mHScroll->getVisible())
172  {
173  mHScroll->setVisible(false);
175 
176  // размер может измениться
178  {
179  eraseContent();
180  contentSize = getContentSize();
181  viewSize = getViewSize();
182  }
183 
184  if (mVScroll != nullptr)
185  {
187 
188  // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
189  // пересчитываем вертикальный скрол на предмет скрытия
190  if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
191  {
192  mVScroll->setVisible(false);
195 
196  // размер может измениться
198  {
199  eraseContent();
200  contentSize = getContentSize();
201  viewSize = getViewSize();
202  }
203  }
204  }
205  }
206  }
207  }
208 
209  mVRange = (viewSize.height >= contentSize.height) ? 0 : contentSize.height - viewSize.height;
210  mHRange = (viewSize.width >= contentSize.width) ? 0 : contentSize.width - viewSize.width;
211 
212  if (mVScroll != nullptr)
213  {
214  size_t page = getVScrollPage();
215  mVScroll->setScrollPage(page);
216  mVScroll->setScrollViewPage(viewSize.height > (int)page ? viewSize.height : page);
218  if (contentSize.height) mVScroll->setTrackSize(int (float(mVScroll->getLineSize() * viewSize.height) / float(contentSize.height)));
219  }
220  if (mHScroll != nullptr)
221  {
222  size_t page = getHScrollPage();
223  mHScroll->setScrollPage(page);
224  mHScroll->setScrollViewPage(viewSize.width > (int)page ? viewSize.width : page);
226  if (contentSize.width) mHScroll->setTrackSize(int (float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
227  }
228  }
229 
231  {
232  // размер контекста
233  IntSize contentSize = getContentSize();
234  // текущее смещение контекста
235  IntPoint contentPoint = getContentPosition();
236  // расчетное смещение
237  IntPoint offset = contentPoint;
238 
239  IntSize viewSize = getViewSize();
240 
241  Align align = getContentAlign();
242 
243  if (contentSize.width > viewSize.width)
244  {
245  // максимальный выход влево
246  if ((offset.left + viewSize.width) > contentSize.width)
247  {
248  offset.left = contentSize.width - viewSize.width;
249  }
250  // максимальный выход вправо
251  else if (offset.left < 0)
252  {
253  offset.left = 0;
254  }
255  }
256  else
257  {
258  if (align.isLeft())
259  {
260  offset.left = 0;
261  }
262  else if (align.isRight())
263  {
264  offset.left = contentSize.width - viewSize.width;
265  }
266  else
267  {
268  offset.left = (contentSize.width - viewSize.width) / 2;
269  }
270  }
271 
272  if (contentSize.height > viewSize.height)
273  {
274  // максимальный выход вверх
275  if ((offset.top + viewSize.height) > contentSize.height)
276  {
277  offset.top = contentSize.height - viewSize.height;
278  }
279  // максимальный выход вниз
280  else if (offset.top < 0)
281  {
282  offset.top = 0;
283  }
284  }
285  else
286  {
287  if (align.isTop())
288  {
289  offset.top = 0;
290  }
291  else if (align.isBottom())
292  {
293  offset.top = contentSize.height - viewSize.height;
294  }
295  else
296  {
297  offset.top = (contentSize.height - viewSize.height) / 2;
298  }
299  }
300 
301  if (offset != contentPoint)
302  {
303  if (nullptr != mVScroll) mVScroll->setScrollPosition(offset.top);
304  if (nullptr != mHScroll) mHScroll->setScrollPosition(offset.left);
305  setContentPosition(offset);
306  }
307  }
308 
310  {
311  return IntSize();
312  }
313 
315  {
316  return IntPoint();
317  }
318 
320  {
321  }
322 
324  {
325  return IntSize();
326  }
327 
329  {
330  return 1;
331  }
332 
334  {
335  return 1;
336  }
337 
339  {
340  return Align::Center;
341  }
342 
344  {
345  }
346 
347 } // namespace MyGUI
void setScrollRange(size_t _value)
int getLineSize() const
void setTrackSize(int _value)
void setSize(const IntSize &_value) override
void setScrollPosition(size_t _value)
void setScrollViewPage(size_t _value)
void setScrollPage(size_t _value)
virtual IntSize getViewSize() const
virtual size_t getHScrollPage() const
virtual void setContentPosition(const IntPoint &_value)
virtual IntPoint getContentPosition() const
virtual Align getContentAlign() const
virtual IntSize getContentSize() const
virtual size_t getVScrollPage() const
virtual void setVisible(bool _value)
bool getVisible() const
void setSize(const IntSize &_value) override
types::TSize< int > IntSize
Definition: MyGUI_Types.h:29
types::TPoint< int > IntPoint
Definition: MyGUI_Types.h:26
bool isTop() const
Definition: MyGUI_Align.h:74
bool isRight() const
Definition: MyGUI_Align.h:64
bool isLeft() const
Definition: MyGUI_Align.h:59
bool isBottom() const
Definition: MyGUI_Align.h:79