MyGUI 3.4.3
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"
9#include "MyGUI_ScrollBar.h"
10
11namespace MyGUI
12{
13
15 {
16 if (mScrollViewClient == nullptr)
17 return;
18
20 IntSize contentSize = getContentSize();
21 IntSize viewSize = getViewSize();
22
23 // вертикальный контент не помещается
24 if (contentSize.height > viewSize.height)
25 {
26 if (mVScroll != nullptr)
27 {
29 {
30 mVScroll->setVisible(true);
34
35 // размер может измениться
37 {
39 contentSize = getContentSize();
40 viewSize = getViewSize();
41 }
42
43 if (mHScroll != nullptr)
44 {
46
47 // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
48 // пересчитываем горизонтальный скрол на предмет показа
49 if ((contentSize.width > viewSize.width) && (!mHScroll->getVisible()) && (mVisibleHScroll))
50 {
51 mHScroll->setVisible(true);
56
57 // размер может измениться
59 {
61 contentSize = getContentSize();
62 viewSize = getViewSize();
63 }
64 }
65 }
66 }
67 }
68 }
69 // вертикальный контент помещается
70 else
71 {
72 if (mVScroll != nullptr)
73 {
74 if (mVScroll->getVisible())
75 {
76 mVScroll->setVisible(false);
80
81 // размер может измениться
83 {
85 contentSize = getContentSize();
86 viewSize = getViewSize();
87 }
88
89 if (mHScroll != nullptr)
90 {
92
93 // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
94 // пересчитываем горизонтальный скрол на предмет скрытия
95 if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
96 {
97 mHScroll->setVisible(false);
102
103 // размер может измениться
105 {
106 eraseContent();
107 contentSize = getContentSize();
108 viewSize = getViewSize();
109 }
110 }
111 }
112 }
113 }
114 }
115
116
117 // горизонтальный контент не помещается
118 if (contentSize.width > viewSize.width)
119 {
120 if (mHScroll != nullptr)
121 {
123 {
124 mHScroll->setVisible(true);
128
129 // размер может измениться
131 {
132 eraseContent();
133 contentSize = getContentSize();
134 viewSize = getViewSize();
135 }
136
137 if (mVScroll != nullptr)
138 {
140
141 // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
142 // пересчитываем вертикальный скрол на предмет показа
143 if ((contentSize.height > viewSize.height) && (!mVScroll->getVisible()) && (mVisibleVScroll))
144 {
145 mVScroll->setVisible(true);
150
151 // размер может измениться
153 {
154 eraseContent();
155 contentSize = getContentSize();
156 viewSize = getViewSize();
157 }
158 }
159 }
160 }
161 }
162 }
163 // горизонтальный контент помещается
164 else
165 {
166 if (mHScroll != nullptr)
167 {
168 if (mHScroll->getVisible())
169 {
170 mHScroll->setVisible(false);
174
175 // размер может измениться
177 {
178 eraseContent();
179 contentSize = getContentSize();
180 viewSize = getViewSize();
181 }
182
183 if (mVScroll != nullptr)
184 {
186
187 // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
188 // пересчитываем вертикальный скрол на предмет скрытия
189 if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
190 {
191 mVScroll->setVisible(false);
196
197 // размер может измениться
199 {
200 eraseContent();
201 contentSize = getContentSize();
202 viewSize = getViewSize();
203 }
204 }
205 }
206 }
207 }
208 }
209
210 mVRange = (viewSize.height >= contentSize.height) ? 0 : contentSize.height - viewSize.height;
211 mHRange = (viewSize.width >= contentSize.width) ? 0 : contentSize.width - viewSize.width;
212
213 if (mVScroll != nullptr)
214 {
215 size_t page = getVScrollPage();
216 mVScroll->setScrollPage(page);
217 mVScroll->setScrollViewPage(viewSize.height > (int)page ? viewSize.height : page);
219 if (contentSize.height)
221 int(float(mVScroll->getLineSize() * viewSize.height) / float(contentSize.height)));
222 }
223 if (mHScroll != nullptr)
224 {
225 size_t page = getHScrollPage();
226 mHScroll->setScrollPage(page);
227 mHScroll->setScrollViewPage(viewSize.width > (int)page ? viewSize.width : page);
229 if (contentSize.width)
230 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)
309 if (nullptr != mHScroll)
311 setContentPosition(offset);
312 }
313 }
314
316 {
317 return {};
318 }
319
321 {
322 return {};
323 }
324
326 {
327 }
328
330 {
331 return {};
332 }
333
335 {
336 return 1;
337 }
338
340 {
341 return 1;
342 }
343
345 {
346 return Align::Center;
347 }
348
352
353} // namespace MyGUI
void setTrackSize(int _size)
void setScrollPosition(size_t _position)
void setScrollViewPage(size_t _value)
void setSize(const IntSize &_size) override
void setScrollRange(size_t _range)
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
void setSize(const IntSize &_size) override
virtual void setVisible(bool _value)
bool getVisible() const
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