MyGUI: MyGUI_ScrollViewBase.cpp Source File

MyGUI 3.2.2

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
14 ScrollViewBase::ScrollViewBase() :
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
26 ScrollViewBase::~ScrollViewBase()
27 {
28 }
29
30 void ScrollViewBase::updateScrollSize()
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 {
44 if (!mVScroll->getVisible() && mVisibleVScroll)
45 {
46 mVScroll->setVisible(true);
47 mClient->setSize(mClient->getWidth() - mVScroll->getWidth(), mClient->getHeight());
48
49 // размер может измениться
50 if (mChangeContentByResize)
51 {
52 eraseContent();
53 contentSize = getContentSize();
54 viewSize = getViewSize();
55 }
56
57 if (mHScroll != nullptr)
58 {
59 mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
60
61 // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
62 // пересчитываем горизонтальный скрол на предмет показа
63 if ((contentSize.width > viewSize.width) && ( ! mHScroll->getVisible()) && (mVisibleHScroll))
64 {
65 mHScroll->setVisible(true);
66 mClient->setSize(mClient->getWidth(), mClient->getHeight() - mHScroll->getHeight());
67 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
68
69 // размер может измениться
70 if (mChangeContentByResize)
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);
90 mClient->setSize(mClient->getWidth() + mVScroll->getWidth(), mClient->getHeight());
91
92 // размер может измениться
93 if (mChangeContentByResize)
94 {
95 eraseContent();
96 contentSize = getContentSize();
97 viewSize = getViewSize();
98 }
99
100 if (mHScroll != nullptr)
101 {
102 mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
103
104 // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
105 // пересчитываем горизонтальный скрол на предмет скрытия
106 if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
107 {
108 mHScroll->setVisible(false);
109 mClient->setSize(mClient->getWidth(), mClient->getHeight() + mHScroll->getHeight());
110 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
111
112 // размер может измениться
113 if (mChangeContentByResize)
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 {
132 if (!mHScroll->getVisible() && mVisibleHScroll)
133 {
134 mHScroll->setVisible(true);
135 mClient->setSize(mClient->getWidth(), mClient->getHeight() - mHScroll->getHeight());
136
137 // размер может измениться
138 if (mChangeContentByResize)
139 {
140 eraseContent();
141 contentSize = getContentSize();
142 viewSize = getViewSize();
143 }
144
145 if (mVScroll != nullptr)
146 {
147 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
148
149 // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
150 // пересчитываем вертикальный скрол на предмет показа
151 if ((contentSize.height > viewSize.height) && ( ! mVScroll->getVisible()) && (mVisibleVScroll))
152 {
153 mVScroll->setVisible(true);
154 mClient->setSize(mClient->getWidth() - mVScroll->getWidth(), mClient->getHeight());
155 mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
156
157 // размер может измениться
158 if (mChangeContentByResize)
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);
178 mClient->setSize(mClient->getWidth(), mClient->getHeight() + mHScroll->getHeight());
179
180 // размер может измениться
181 if (mChangeContentByResize)
182 {
183 eraseContent();
184 contentSize = getContentSize();
185 viewSize = getViewSize();
186 }
187
188 if (mVScroll != nullptr)
189 {
190 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
191
192 // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
193 // пересчитываем вертикальный скрол на предмет скрытия
194 if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
195 {
196 mVScroll->setVisible(false);
197 mClient->setSize(mClient->getWidth() + mVScroll->getWidth(), mClient->getHeight());
198 mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
199
200 // размер может измениться
201 if (mChangeContentByResize)
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);
221 mVScroll->setScrollRange(mVRange + 1);
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);
229 mHScroll->setScrollRange(mHRange + 1);
230 if (contentSize.width) 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) mVScroll->setScrollPosition(offset.top);
308 if (nullptr != mHScroll) mHScroll->setScrollPosition(offset.left);
309 setContentPosition(offset);
310 }
311 }
312
313 IntSize ScrollViewBase::getContentSize()
314 {
315 return IntSize();
316 }
317
318 IntPoint ScrollViewBase::getContentPosition()
319 {
320 return IntPoint();
321 }
322
323 void ScrollViewBase::setContentPosition(const IntPoint& _value)
324 {
325 }
326
327 IntSize ScrollViewBase::getViewSize()
328 {
329 return IntSize();
330 }
331
332 size_t ScrollViewBase::getHScrollPage()
333 {
334 return 1;
335 }
336
337 size_t ScrollViewBase::getVScrollPage()
338 {
339 return 1;
340 }
341
342 Align ScrollViewBase::getContentAlign()
343 {
344 return Align::Center;
345 }
346
347 void ScrollViewBase::eraseContent()
348 {
349 }
350
351 } // namespace MyGUI
MyGUI::Align::isTop
bool isTop() const
Definition: MyGUI_Align.h:74
MyGUI::ScrollViewBase::getContentAlign
virtual Align getContentAlign()
Definition: MyGUI_ScrollViewBase.cpp:342
MyGUI::ScrollBar::setScrollViewPage
void setScrollViewPage(size_t _value)
Definition: MyGUI_ScrollBar.cpp:620
MyGUI::types::TSize::height
T height
Definition: MyGUI_TSize.h:21
MyGUI::ScrollBar::setTrackSize
void setTrackSize(int _value)
Definition: MyGUI_ScrollBar.cpp:378
MyGUI::ScrollViewBase::~ScrollViewBase
virtual ~ScrollViewBase()
Definition: MyGUI_ScrollViewBase.cpp:26
MyGUI::types::TPoint::top
T top
Definition: MyGUI_TPoint.h:21
MyGUI::ScrollViewBase::mVScroll
ScrollBar * mVScroll
Definition: MyGUI_ScrollViewBase.h:44
MyGUI::Align::Center
Definition: MyGUI_Align.h:25
MyGUI::ScrollViewBase::updateScrollPosition
void updateScrollPosition()
Definition: MyGUI_ScrollViewBase.cpp:234
MyGUI::ScrollViewBase::mClient
Widget * mClient
Definition: MyGUI_ScrollViewBase.h:46
MyGUI::ScrollViewBase::mChangeContentByResize
bool mChangeContentByResize
Definition: MyGUI_ScrollViewBase.h:55
MyGUI::ScrollBar::setSize
virtual void setSize(const IntSize &_value)
Definition: MyGUI_ScrollBar.cpp:364
MyGUI::ScrollBar::getLineSize
int getLineSize() const
Definition: MyGUI_ScrollBar.cpp:432
MyGUI::types::TPoint< int >
MyGUI::ScrollViewBase::getVScrollPage
virtual size_t getVScrollPage()
Definition: MyGUI_ScrollViewBase.cpp:337
MyGUI::types::TSize::width
T width
Definition: MyGUI_TSize.h:20
MyGUI::ScrollViewBase::getHScrollPage
virtual size_t getHScrollPage()
Definition: MyGUI_ScrollViewBase.cpp:332
MyGUI::IntSize
types::TSize< int > IntSize
Definition: MyGUI_Types.h:29
MyGUI::Align
Definition: MyGUI_Align.h:19
MyGUI::ScrollViewBase::getContentSize
virtual IntSize getContentSize()
Definition: MyGUI_ScrollViewBase.cpp:313
MyGUI_Precompiled.h
MyGUI::ScrollViewBase::ScrollViewBase
ScrollViewBase()
Definition: MyGUI_ScrollViewBase.cpp:14
MyGUI::IntPoint
types::TPoint< int > IntPoint
Definition: MyGUI_Types.h:26
MyGUI_ScrollViewBase.h
MyGUI::ScrollViewBase::getContentPosition
virtual IntPoint getContentPosition()
Definition: MyGUI_ScrollViewBase.cpp:318
MyGUI::types::TPoint::left
T left
Definition: MyGUI_TPoint.h:20
MyGUI::Widget::setVisible
virtual void setVisible(bool _value)
Definition: MyGUI_Widget.cpp:965
MyGUI::ScrollViewBase::mVRange
size_t mVRange
Definition: MyGUI_ScrollViewBase.h:51
MyGUI_ScrollBar.h
MyGUI::ScrollBar::setScrollPosition
void setScrollPosition(size_t _value)
Definition: MyGUI_ScrollBar.cpp:347
MyGUI::ScrollViewBase::mHRange
size_t mHRange
Definition: MyGUI_ScrollViewBase.h:52
MyGUI::ScrollViewBase::mHScroll
ScrollBar * mHScroll
Definition: MyGUI_ScrollViewBase.h:45
MyGUI::types::TSize< int >
nullptr
#define nullptr
Definition: MyGUI_Prerequest.h:29
MyGUI::ScrollViewBase::getViewSize
virtual IntSize getViewSize()
Definition: MyGUI_ScrollViewBase.cpp:327
MyGUI::Widget::setSize
virtual void setSize(const IntSize &_value)
Definition: MyGUI_Widget.cpp:652
MyGUI::Align::isRight
bool isRight() const
Definition: MyGUI_Align.h:64
MyGUI::ScrollViewBase::eraseContent
virtual void eraseContent()
Definition: MyGUI_ScrollViewBase.cpp:347
MyGUI::Align::isBottom
bool isBottom() const
Definition: MyGUI_Align.h:79
MyGUI::ICroppedRectangle::getHeight
int getHeight() const
Definition: MyGUI_ICroppedRectangle.h:119
MyGUI::ScrollBar::setScrollRange
void setScrollRange(size_t _value)
Definition: MyGUI_ScrollBar.cpp:337
MyGUI::Widget::getVisible
bool getVisible() const
Definition: MyGUI_Widget.cpp:1250
MyGUI::ScrollBar::setScrollPage
void setScrollPage(size_t _value)
Definition: MyGUI_ScrollBar.cpp:610
MyGUI::ScrollViewBase::mVisibleVScroll
bool mVisibleVScroll
Definition: MyGUI_ScrollViewBase.h:49
MyGUI::ScrollViewBase::mVisibleHScroll
bool mVisibleHScroll
Definition: MyGUI_ScrollViewBase.h:48
MyGUI::ICroppedRectangle::getWidth
int getWidth() const
Definition: MyGUI_ICroppedRectangle.h:114
MyGUI
Definition: MyGUI_ActionController.h:14
MyGUI::ScrollViewBase::updateScrollSize
void updateScrollSize()
Definition: MyGUI_ScrollViewBase.cpp:30
MyGUI::ScrollViewBase::setContentPosition
virtual void setContentPosition(const IntPoint &_value)
Definition: MyGUI_ScrollViewBase.cpp:323
MyGUI::Align::isLeft
bool isLeft() const
Definition: MyGUI_Align.h:59