MyGUI: MyGUI_ScrollViewBase.cpp Source File

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"
8#include "MyGUI_ScrollViewBase.h"
9#include "MyGUI_ScrollBar.h"
10
11namespace MyGUI
12{
13
14 void ScrollViewBase::updateScrollSize()
15 {
16 if (mScrollViewClient == nullptr)
17 return;
18
19 eraseContent();
20 IntSize contentSize = getContentSize();
21 IntSize viewSize = getViewSize();
22
23 // вертикальный контент не помещается
24 if (contentSize.height > viewSize.height)
25 {
26 if (mVScroll != nullptr)
27 {
28 if (!mVScroll->getVisible() && mVisibleVScroll)
29 {
30 mVScroll->setVisible(true);
31 mScrollViewClient->setSize(
32 mScrollViewClient->getWidth() - mVScroll->getWidth(),
33 mScrollViewClient->getHeight());
34
35 // размер может измениться
36 if (mChangeContentByResize)
37 {
38 eraseContent();
39 contentSize = getContentSize();
40 viewSize = getViewSize();
41 }
42
43 if (mHScroll != nullptr)
44 {
45 mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
46
47 // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
48 // пересчитываем горизонтальный скрол на предмет показа
49 if ((contentSize.width > viewSize.width) && (!mHScroll->getVisible()) && (mVisibleHScroll))
50 {
51 mHScroll->setVisible(true);
52 mScrollViewClient->setSize(
53 mScrollViewClient->getWidth(),
54 mScrollViewClient->getHeight() - mHScroll->getHeight());
55 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
56
57 // размер может измениться
58 if (mChangeContentByResize)
59 {
60 eraseContent();
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);
77 mScrollViewClient->setSize(
78 mScrollViewClient->getWidth() + mVScroll->getWidth(),
79 mScrollViewClient->getHeight());
80
81 // размер может измениться
82 if (mChangeContentByResize)
83 {
84 eraseContent();
85 contentSize = getContentSize();
86 viewSize = getViewSize();
87 }
88
89 if (mHScroll != nullptr)
90 {
91 mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
92
93 // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
94 // пересчитываем горизонтальный скрол на предмет скрытия
95 if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
96 {
97 mHScroll->setVisible(false);
98 mScrollViewClient->setSize(
99 mScrollViewClient->getWidth(),
100 mScrollViewClient->getHeight() + mHScroll->getHeight());
101 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
102
103 // размер может измениться
104 if (mChangeContentByResize)
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 {
122 if (!mHScroll->getVisible() && mVisibleHScroll)
123 {
124 mHScroll->setVisible(true);
125 mScrollViewClient->setSize(
126 mScrollViewClient->getWidth(),
127 mScrollViewClient->getHeight() - mHScroll->getHeight());
128
129 // размер может измениться
130 if (mChangeContentByResize)
131 {
132 eraseContent();
133 contentSize = getContentSize();
134 viewSize = getViewSize();
135 }
136
137 if (mVScroll != nullptr)
138 {
139 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
140
141 // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
142 // пересчитываем вертикальный скрол на предмет показа
143 if ((contentSize.height > viewSize.height) && (!mVScroll->getVisible()) && (mVisibleVScroll))
144 {
145 mVScroll->setVisible(true);
146 mScrollViewClient->setSize(
147 mScrollViewClient->getWidth() - mVScroll->getWidth(),
148 mScrollViewClient->getHeight());
149 mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
150
151 // размер может измениться
152 if (mChangeContentByResize)
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);
171 mScrollViewClient->setSize(
172 mScrollViewClient->getWidth(),
173 mScrollViewClient->getHeight() + mHScroll->getHeight());
174
175 // размер может измениться
176 if (mChangeContentByResize)
177 {
178 eraseContent();
179 contentSize = getContentSize();
180 viewSize = getViewSize();
181 }
182
183 if (mVScroll != nullptr)
184 {
185 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
186
187 // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
188 // пересчитываем вертикальный скрол на предмет скрытия
189 if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
190 {
191 mVScroll->setVisible(false);
192 mScrollViewClient->setSize(
193 mScrollViewClient->getWidth() + mVScroll->getWidth(),
194 mScrollViewClient->getHeight());
195 mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
196
197 // размер может измениться
198 if (mChangeContentByResize)
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);
218 mVScroll->setScrollRange(mVRange + 1);
219 if (contentSize.height)
220 mVScroll->setTrackSize(
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);
228 mHScroll->setScrollRange(mHRange + 1);
229 if (contentSize.width)
230 mHScroll->setTrackSize(int(float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
231 }
232 }
233
234 void ScrollViewBase::updateScrollPosition()
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)
308 mVScroll->setScrollPosition(offset.top);
309 if (nullptr != mHScroll)
310 mHScroll->setScrollPosition(offset.left);
311 setContentPosition(offset);
312 }
313 }
314
315 IntSize ScrollViewBase::getContentSize() const
316 {
317 return {};
318 }
319
320 IntPoint ScrollViewBase::getContentPosition() const
321 {
322 return {};
323 }
324
325 void ScrollViewBase::setContentPosition(const IntPoint& _value)
326 {
327 }
328
329 IntSize ScrollViewBase::getViewSize() const
330 {
331 return {};
332 }
333
334 size_t ScrollViewBase::getHScrollPage() const
335 {
336 return 1;
337 }
338
339 size_t ScrollViewBase::getVScrollPage() const
340 {
341 return 1;
342 }
343
344 Align ScrollViewBase::getContentAlign() const
345 {
346 return Align::Center;
347 }
348
349 void ScrollViewBase::eraseContent()
350 {
351 }
352
353} // namespace MyGUI
MyGUI_Precompiled.h
MyGUI_ScrollBar.h
MyGUI_ScrollViewBase.h
MyGUI::ScrollViewBase::getViewSize
virtual IntSize getViewSize() const
Definition MyGUI_ScrollViewBase.cpp:329
MyGUI::ScrollViewBase::mHScroll
ScrollBar * mHScroll
Definition MyGUI_ScrollViewBase.h:44
MyGUI::ScrollViewBase::mVRange
size_t mVRange
Definition MyGUI_ScrollViewBase.h:50
MyGUI::ScrollViewBase::getHScrollPage
virtual size_t getHScrollPage() const
Definition MyGUI_ScrollViewBase.cpp:334
MyGUI::ScrollViewBase::updateScrollPosition
void updateScrollPosition()
Definition MyGUI_ScrollViewBase.cpp:234
MyGUI::ScrollViewBase::setContentPosition
virtual void setContentPosition(const IntPoint &_value)
Definition MyGUI_ScrollViewBase.cpp:325
MyGUI::ScrollViewBase::mHRange
size_t mHRange
Definition MyGUI_ScrollViewBase.h:51
MyGUI::ScrollViewBase::mScrollViewClient
Widget * mScrollViewClient
Definition MyGUI_ScrollViewBase.h:45
MyGUI::ScrollViewBase::mVisibleVScroll
bool mVisibleVScroll
Definition MyGUI_ScrollViewBase.h:48
MyGUI::ScrollViewBase::getContentPosition
virtual IntPoint getContentPosition() const
Definition MyGUI_ScrollViewBase.cpp:320
MyGUI::ScrollViewBase::mChangeContentByResize
bool mChangeContentByResize
Definition MyGUI_ScrollViewBase.h:54
MyGUI::ScrollViewBase::mVisibleHScroll
bool mVisibleHScroll
Definition MyGUI_ScrollViewBase.h:47
MyGUI::ScrollViewBase::getContentAlign
virtual Align getContentAlign() const
Definition MyGUI_ScrollViewBase.cpp:344
MyGUI::ScrollViewBase::getContentSize
virtual IntSize getContentSize() const
Definition MyGUI_ScrollViewBase.cpp:315
MyGUI::ScrollViewBase::updateScrollSize
void updateScrollSize()
Definition MyGUI_ScrollViewBase.cpp:14
MyGUI::ScrollViewBase::mVScroll
ScrollBar * mVScroll
Definition MyGUI_ScrollViewBase.h:43
MyGUI::ScrollViewBase::eraseContent
virtual void eraseContent()
Definition MyGUI_ScrollViewBase.cpp:349
MyGUI::ScrollViewBase::getVScrollPage
virtual size_t getVScrollPage() const
Definition MyGUI_ScrollViewBase.cpp:339
MyGUI
Definition MyGUI_ActionController.h:15
MyGUI::IntPoint
types::TPoint< int > IntPoint
Definition MyGUI_Types.h:27
MyGUI::IntSize
types::TSize< int > IntSize
Definition MyGUI_Types.h:30
MyGUI::Align
Definition MyGUI_Align.h:20
MyGUI::Align::Center
@ Center
Definition MyGUI_Align.h:25
MyGUI::Align::isTop
bool isTop() const
Definition MyGUI_Align.h:74
MyGUI::Align::isRight
bool isRight() const
Definition MyGUI_Align.h:64
MyGUI::Align::isLeft
bool isLeft() const
Definition MyGUI_Align.h:59
MyGUI::Align::isBottom
bool isBottom() const
Definition MyGUI_Align.h:79
MyGUI::types::TPoint::left
T left
Definition MyGUI_TPoint.h:19
MyGUI::types::TPoint::top
T top
Definition MyGUI_TPoint.h:20
MyGUI::types::TSize::width
T width
Definition MyGUI_TSize.h:19
MyGUI::types::TSize::height
T height
Definition MyGUI_TSize.h:20