MyGUI  3.2.0
MyGUI_ScrollViewBase.cpp
Go to the documentation of this file.
1 
6 /*
7  This file is part of MyGUI.
8 
9  MyGUI is free software: you can redistribute it and/or modify
10  it under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  (at your option) any later version.
13 
14  MyGUI is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public License
20  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
21 */
22 
23 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_ScrollViewBase.h"
25 #include "MyGUI_ScrollBar.h"
26 
27 namespace MyGUI
28 {
29 
31  mVScroll(nullptr),
32  mHScroll(nullptr),
33  mClient(nullptr),
34  mVisibleHScroll(true),
35  mVisibleVScroll(true),
36  mVRange(0),
37  mHRange(0),
38  mChangeContentByResize(false)
39  {
40  }
41 
43  {
44  }
45 
47  {
48  if (mClient == nullptr)
49  return;
50 
51  eraseContent();
52  IntSize contentSize = getContentSize();
53  IntSize viewSize = getViewSize();
54 
55  // вертикальный контент не помещается
56  if (contentSize.height > viewSize.height)
57  {
58  if (mVScroll != nullptr)
59  {
61  {
62  mVScroll->setVisible(true);
64 
65  // размер может измениться
67  {
68  eraseContent();
69  contentSize = getContentSize();
70  viewSize = getViewSize();
71  }
72 
73  if (mHScroll != nullptr)
74  {
76 
77  // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
78  // пересчитываем горизонтальный скрол на предмет показа
79  if ((contentSize.width > viewSize.width) && ( ! mHScroll->getVisible()) && (mVisibleHScroll))
80  {
81  mHScroll->setVisible(true);
84 
85  // размер может измениться
87  {
88  eraseContent();
89  contentSize = getContentSize();
90  viewSize = getViewSize();
91  }
92 
93  }
94  }
95  }
96  }
97  }
98  // вертикальный контент помещается
99  else
100  {
101  if (mVScroll != nullptr)
102  {
103  if (mVScroll->getVisible())
104  {
105  mVScroll->setVisible(false);
107 
108  // размер может измениться
110  {
111  eraseContent();
112  contentSize = getContentSize();
113  viewSize = getViewSize();
114  }
115 
116  if (mHScroll != nullptr)
117  {
119 
120  // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
121  // пересчитываем горизонтальный скрол на предмет скрытия
122  if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
123  {
124  mHScroll->setVisible(false);
127 
128  // размер может измениться
130  {
131  eraseContent();
132  contentSize = getContentSize();
133  viewSize = getViewSize();
134  }
135 
136  }
137  }
138  }
139  }
140  }
141 
142 
143  // горизонтальный контент не помещается
144  if (contentSize.width > viewSize.width)
145  {
146  if (mHScroll != nullptr)
147  {
149  {
150  mHScroll->setVisible(true);
152 
153  // размер может измениться
155  {
156  eraseContent();
157  contentSize = getContentSize();
158  viewSize = getViewSize();
159  }
160 
161  if (mVScroll != nullptr)
162  {
164 
165  // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
166  // пересчитываем вертикальный скрол на предмет показа
167  if ((contentSize.height > viewSize.height) && ( ! mVScroll->getVisible()) && (mVisibleVScroll))
168  {
169  mVScroll->setVisible(true);
172 
173  // размер может измениться
175  {
176  eraseContent();
177  contentSize = getContentSize();
178  viewSize = getViewSize();
179  }
180 
181  }
182  }
183  }
184  }
185  }
186  // горизонтальный контент помещается
187  else
188  {
189  if (mHScroll != nullptr)
190  {
191  if (mHScroll->getVisible())
192  {
193  mHScroll->setVisible(false);
195 
196  // размер может измениться
198  {
199  eraseContent();
200  contentSize = getContentSize();
201  viewSize = getViewSize();
202  }
203 
204  if (mVScroll != nullptr)
205  {
207 
208  // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
209  // пересчитываем вертикальный скрол на предмет скрытия
210  if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
211  {
212  mVScroll->setVisible(false);
215 
216  // размер может измениться
218  {
219  eraseContent();
220  contentSize = getContentSize();
221  viewSize = getViewSize();
222  }
223  }
224  }
225  }
226  }
227  }
228 
229  mVRange = (viewSize.height >= contentSize.height) ? 0 : contentSize.height - viewSize.height;
230  mHRange = (viewSize.width >= contentSize.width) ? 0 : contentSize.width - viewSize.width;
231 
232  if (mVScroll != nullptr)
233  {
234  size_t page = getVScrollPage();
235  mVScroll->setScrollPage(page);
236  mVScroll->setScrollViewPage(viewSize.width > (int)page ? viewSize.width : page);
238  if (contentSize.height) mVScroll->setTrackSize(int (float(mVScroll->getLineSize() * viewSize.height) / float(contentSize.height)));
239  }
240  if (mHScroll != nullptr)
241  {
242  size_t page = getHScrollPage();
243  mHScroll->setScrollPage(page);
244  mHScroll->setScrollViewPage(viewSize.height > (int)page ? viewSize.height : page);
246  if (contentSize.width) mHScroll->setTrackSize(int (float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
247  }
248  }
249 
251  {
252  // размер контекста
253  IntSize contentSize = getContentSize();
254  // текущее смещение контекста
255  IntPoint contentPoint = getContentPosition();
256  // расчетное смещение
257  IntPoint offset = contentPoint;
258 
259  IntSize viewSize = getViewSize();
260 
261  Align align = getContentAlign();
262 
263  if (contentSize.width > viewSize.width)
264  {
265  // максимальный выход влево
266  if ((offset.left + viewSize.width) > contentSize.width)
267  {
268  offset.left = contentSize.width - viewSize.width;
269  }
270  // максимальный выход вправо
271  else if (offset.left < 0)
272  {
273  offset.left = 0;
274  }
275  }
276  else
277  {
278  if (align.isLeft())
279  {
280  offset.left = 0;
281  }
282  else if (align.isRight())
283  {
284  offset.left = contentSize.width - viewSize.width;
285  }
286  else
287  {
288  offset.left = (contentSize.width - viewSize.width) / 2;
289  }
290  }
291 
292  if (contentSize.height > viewSize.height)
293  {
294  // максимальный выход вверх
295  if ((offset.top + viewSize.height) > contentSize.height)
296  {
297  offset.top = contentSize.height - viewSize.height;
298  }
299  // максимальный выход вниз
300  else if (offset.top < 0)
301  {
302  offset.top = 0;
303  }
304  }
305  else
306  {
307  if (align.isTop())
308  {
309  offset.top = 0;
310  }
311  else if (align.isBottom())
312  {
313  offset.top = contentSize.height - viewSize.height;
314  }
315  else
316  {
317  offset.top = (contentSize.height - viewSize.height) / 2;
318  }
319  }
320 
321  if (offset != contentPoint)
322  {
323  if (nullptr != mVScroll) mVScroll->setScrollPosition(offset.top);
324  if (nullptr != mHScroll) mHScroll->setScrollPosition(offset.left);
325  setContentPosition(offset);
326  }
327  }
328 
330  {
331  return IntSize();
332  }
333 
335  {
336  return IntPoint();
337  }
338 
340  {
341  }
342 
344  {
345  return IntSize();
346  }
347 
349  {
350  return 1;
351  }
352 
354  {
355  return 1;
356  }
357 
359  {
360  return Align::Center;
361  }
362 
364  {
365  }
366 
367 } // namespace MyGUI