MyGUI  3.2.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  mClient(nullptr),
18  mVisibleHScroll(true),
19  mVisibleVScroll(true),
20  mVRange(0),
21  mHRange(0),
22  mChangeContentByResize(false)
23  {
24  }
25 
27  {
28  }
29 
31  {
32  if (mClient == nullptr)
33  return;
34 
35  eraseContent();
36  IntSize contentSize = getContentSize();
37  IntSize viewSize = getViewSize();
38 
39  // вертикальный контент не помещается
40  if (contentSize.height > viewSize.height)
41  {
42  if (mVScroll != nullptr)
43  {
45  {
46  mVScroll->setVisible(true);
48 
49  // размер может измениться
51  {
52  eraseContent();
53  contentSize = getContentSize();
54  viewSize = getViewSize();
55  }
56 
57  if (mHScroll != nullptr)
58  {
60 
61  // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
62  // пересчитываем горизонтальный скрол на предмет показа
63  if ((contentSize.width > viewSize.width) && ( ! mHScroll->getVisible()) && (mVisibleHScroll))
64  {
65  mHScroll->setVisible(true);
68 
69  // размер может измениться
71  {
72  eraseContent();
73  contentSize = getContentSize();
74  viewSize = getViewSize();
75  }
76 
77  }
78  }
79  }
80  }
81  }
82  // вертикальный контент помещается
83  else
84  {
85  if (mVScroll != nullptr)
86  {
87  if (mVScroll->getVisible())
88  {
89  mVScroll->setVisible(false);
91 
92  // размер может измениться
94  {
95  eraseContent();
96  contentSize = getContentSize();
97  viewSize = getViewSize();
98  }
99 
100  if (mHScroll != nullptr)
101  {
103 
104  // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
105  // пересчитываем горизонтальный скрол на предмет скрытия
106  if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
107  {
108  mHScroll->setVisible(false);
111 
112  // размер может измениться
114  {
115  eraseContent();
116  contentSize = getContentSize();
117  viewSize = getViewSize();
118  }
119 
120  }
121  }
122  }
123  }
124  }
125 
126 
127  // горизонтальный контент не помещается
128  if (contentSize.width > viewSize.width)
129  {
130  if (mHScroll != nullptr)
131  {
133  {
134  mHScroll->setVisible(true);
136 
137  // размер может измениться
139  {
140  eraseContent();
141  contentSize = getContentSize();
142  viewSize = getViewSize();
143  }
144 
145  if (mVScroll != nullptr)
146  {
148 
149  // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
150  // пересчитываем вертикальный скрол на предмет показа
151  if ((contentSize.height > viewSize.height) && ( ! mVScroll->getVisible()) && (mVisibleVScroll))
152  {
153  mVScroll->setVisible(true);
156 
157  // размер может измениться
159  {
160  eraseContent();
161  contentSize = getContentSize();
162  viewSize = getViewSize();
163  }
164 
165  }
166  }
167  }
168  }
169  }
170  // горизонтальный контент помещается
171  else
172  {
173  if (mHScroll != nullptr)
174  {
175  if (mHScroll->getVisible())
176  {
177  mHScroll->setVisible(false);
179 
180  // размер может измениться
182  {
183  eraseContent();
184  contentSize = getContentSize();
185  viewSize = getViewSize();
186  }
187 
188  if (mVScroll != nullptr)
189  {
191 
192  // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
193  // пересчитываем вертикальный скрол на предмет скрытия
194  if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
195  {
196  mVScroll->setVisible(false);
199 
200  // размер может измениться
202  {
203  eraseContent();
204  contentSize = getContentSize();
205  viewSize = getViewSize();
206  }
207  }
208  }
209  }
210  }
211  }
212 
213  mVRange = (viewSize.height >= contentSize.height) ? 0 : contentSize.height - viewSize.height;
214  mHRange = (viewSize.width >= contentSize.width) ? 0 : contentSize.width - viewSize.width;
215 
216  if (mVScroll != nullptr)
217  {
218  size_t page = getVScrollPage();
219  mVScroll->setScrollPage(page);
220  mVScroll->setScrollViewPage(viewSize.width > (int)page ? viewSize.width : page);
222  if (contentSize.height) mVScroll->setTrackSize(int (float(mVScroll->getLineSize() * viewSize.height) / float(contentSize.height)));
223  }
224  if (mHScroll != nullptr)
225  {
226  size_t page = getHScrollPage();
227  mHScroll->setScrollPage(page);
228  mHScroll->setScrollViewPage(viewSize.height > (int)page ? viewSize.height : page);
230  if (contentSize.width) mHScroll->setTrackSize(int (float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
231  }
232  }
233 
235  {
236  // размер контекста
237  IntSize contentSize = getContentSize();
238  // текущее смещение контекста
239  IntPoint contentPoint = getContentPosition();
240  // расчетное смещение
241  IntPoint offset = contentPoint;
242 
243  IntSize viewSize = getViewSize();
244 
245  Align align = getContentAlign();
246 
247  if (contentSize.width > viewSize.width)
248  {
249  // максимальный выход влево
250  if ((offset.left + viewSize.width) > contentSize.width)
251  {
252  offset.left = contentSize.width - viewSize.width;
253  }
254  // максимальный выход вправо
255  else if (offset.left < 0)
256  {
257  offset.left = 0;
258  }
259  }
260  else
261  {
262  if (align.isLeft())
263  {
264  offset.left = 0;
265  }
266  else if (align.isRight())
267  {
268  offset.left = contentSize.width - viewSize.width;
269  }
270  else
271  {
272  offset.left = (contentSize.width - viewSize.width) / 2;
273  }
274  }
275 
276  if (contentSize.height > viewSize.height)
277  {
278  // максимальный выход вверх
279  if ((offset.top + viewSize.height) > contentSize.height)
280  {
281  offset.top = contentSize.height - viewSize.height;
282  }
283  // максимальный выход вниз
284  else if (offset.top < 0)
285  {
286  offset.top = 0;
287  }
288  }
289  else
290  {
291  if (align.isTop())
292  {
293  offset.top = 0;
294  }
295  else if (align.isBottom())
296  {
297  offset.top = contentSize.height - viewSize.height;
298  }
299  else
300  {
301  offset.top = (contentSize.height - viewSize.height) / 2;
302  }
303  }
304 
305  if (offset != contentPoint)
306  {
307  if (nullptr != mVScroll) mVScroll->setScrollPosition(offset.top);
308  if (nullptr != mHScroll) mHScroll->setScrollPosition(offset.left);
309  setContentPosition(offset);
310  }
311  }
312 
314  {
315  return IntSize();
316  }
317 
319  {
320  return IntPoint();
321  }
322 
324  {
325  }
326 
328  {
329  return IntSize();
330  }
331 
333  {
334  return 1;
335  }
336 
338  {
339  return 1;
340  }
341 
343  {
344  return Align::Center;
345  }
346 
348  {
349  }
350 
351 } // namespace MyGUI