MyGUI: MyGUI_ScrollViewBase.cpp Source File

MyGUI 3.4.2

- Main Page
- Related Pages
- Namespaces
- Data Structures
- Files
- Examples

- File List
- Globals

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