MyGUI 3.2.0

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

- File List
- Globals

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
30 ScrollViewBase::ScrollViewBase() :
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
42 ScrollViewBase::~ScrollViewBase()
43 {
44 }
45
46 void ScrollViewBase::updateScrollSize()
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 {
60 if (!mVScroll->getVisible() && mVisibleVScroll)
61 {
62 mVScroll->setVisible(true);
63 mClient->setSize(mClient->getWidth() - mVScroll->getWidth(), mClient->getHeight());
64
65 // размер может измениться
66 if (mChangeContentByResize)
67 {
68 eraseContent();
69 contentSize = getContentSize();
70 viewSize = getViewSize();
71 }
72
73 if (mHScroll != nullptr)
74 {
75 mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
76
77 // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
78 // пересчитываем горизонтальный скрол на предмет показа
79 if ((contentSize.width > viewSize.width) && ( ! mHScroll->getVisible()) && (mVisibleHScroll))
80 {
81 mHScroll->setVisible(true);
82 mClient->setSize(mClient->getWidth(), mClient->getHeight() - mHScroll->getHeight());
83 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
84
85 // размер может измениться
86 if (mChangeContentByResize)
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);
106 mClient->setSize(mClient->getWidth() + mVScroll->getWidth(), mClient->getHeight());
107
108 // размер может измениться
109 if (mChangeContentByResize)
110 {
111 eraseContent();
112 contentSize = getContentSize();
113 viewSize = getViewSize();
114 }
115
116 if (mHScroll != nullptr)
117 {
118 mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
119
120 // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
121 // пересчитываем горизонтальный скрол на предмет скрытия
122 if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
123 {
124 mHScroll->setVisible(false);
125 mClient->setSize(mClient->getWidth(), mClient->getHeight() + mHScroll->getHeight());
126 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
127
128 // размер может измениться
129 if (mChangeContentByResize)
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 {
148 if (!mHScroll->getVisible() && mVisibleHScroll)
149 {
150 mHScroll->setVisible(true);
151 mClient->setSize(mClient->getWidth(), mClient->getHeight() - mHScroll->getHeight());
152
153 // размер может измениться
154 if (mChangeContentByResize)
155 {
156 eraseContent();
157 contentSize = getContentSize();
158 viewSize = getViewSize();
159 }
160
161 if (mVScroll != nullptr)
162 {
163 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() - mHScroll->getHeight());
164
165 // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
166 // пересчитываем вертикальный скрол на предмет показа
167 if ((contentSize.height > viewSize.height) && ( ! mVScroll->getVisible()) && (mVisibleVScroll))
168 {
169 mVScroll->setVisible(true);
170 mClient->setSize(mClient->getWidth() - mVScroll->getWidth(), mClient->getHeight());
171 mHScroll->setSize(mHScroll->getWidth() - mVScroll->getWidth(), mHScroll->getHeight());
172
173 // размер может измениться
174 if (mChangeContentByResize)
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);
194 mClient->setSize(mClient->getWidth(), mClient->getHeight() + mHScroll->getHeight());
195
196 // размер может измениться
197 if (mChangeContentByResize)
198 {
199 eraseContent();
200 contentSize = getContentSize();
201 viewSize = getViewSize();
202 }
203
204 if (mVScroll != nullptr)
205 {
206 mVScroll->setSize(mVScroll->getWidth(), mVScroll->getHeight() + mHScroll->getHeight());
207
208 // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
209 // пересчитываем вертикальный скрол на предмет скрытия
210 if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
211 {
212 mVScroll->setVisible(false);
213 mClient->setSize(mClient->getWidth() + mVScroll->getWidth(), mClient->getHeight());
214 mHScroll->setSize(mHScroll->getWidth() + mVScroll->getWidth(), mHScroll->getHeight());
215
216 // размер может измениться
217 if (mChangeContentByResize)
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);
237 mVScroll->setScrollRange(mVRange + 1);
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);
245 mHScroll->setScrollRange(mHRange + 1);
246 if (contentSize.width) mHScroll->setTrackSize(int (float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
247 }
248 }
249
250 void ScrollViewBase::updateScrollPosition()
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
329 IntSize ScrollViewBase::getContentSize()
330 {
331 return IntSize();
332 }
333
334 IntPoint ScrollViewBase::getContentPosition()
335 {
336 return IntPoint();
337 }
338
339 void ScrollViewBase::setContentPosition(const IntPoint& _value)
340 {
341 }
342
343 IntSize ScrollViewBase::getViewSize()
344 {
345 return IntSize();
346 }
347
348 size_t ScrollViewBase::getHScrollPage()
349 {
350 return 1;
351 }
352
353 size_t ScrollViewBase::getVScrollPage()
354 {
355 return 1;
356 }
357
358 Align ScrollViewBase::getContentAlign()
359 {
360 return Align::Center;
361 }
362
363 void ScrollViewBase::eraseContent()
364 {
365 }
366
367 } // namespace MyGUI
MyGUI::ScrollViewBase::updateScrollSize
void updateScrollSize()
Definition: MyGUI_ScrollViewBase.cpp:46
MyGUI::ScrollViewBase::getVScrollPage
virtual size_t getVScrollPage()
Definition: MyGUI_ScrollViewBase.cpp:353
MyGUI::ScrollViewBase::mHRange
size_t mHRange
Definition: MyGUI_ScrollViewBase.h:67
MyGUI::types::TPoint< int >
MyGUI::IntSize
types::TSize< int > IntSize
Definition: MyGUI_Types.h:44
MyGUI_Precompiled.h
MyGUI::ICroppedRectangle::getHeight
int getHeight() const
Definition: MyGUI_ICroppedRectangle.h:134
MyGUI::ScrollViewBase::mHScroll
ScrollBar * mHScroll
Definition: MyGUI_ScrollViewBase.h:60
MyGUI::Align::isBottom
bool isBottom() const
Definition: MyGUI_Align.h:94
MyGUI::ScrollViewBase::getContentSize
virtual IntSize getContentSize()
Definition: MyGUI_ScrollViewBase.cpp:329
MyGUI::types::TSize< int >
MyGUI::Align::Center
Definition: MyGUI_Align.h:40
MyGUI::ScrollViewBase::mChangeContentByResize
bool mChangeContentByResize
Definition: MyGUI_ScrollViewBase.h:70
MyGUI::ScrollBar::setTrackSize
void setTrackSize(int _value)
Definition: MyGUI_ScrollBar.cpp:414
MyGUI::Widget::setVisible
virtual void setVisible(bool _value)
Definition: MyGUI_Widget.cpp:965
MyGUI::ScrollViewBase::getContentPosition
virtual IntPoint getContentPosition()
Definition: MyGUI_ScrollViewBase.cpp:334
nullptr
#define nullptr
Definition: MyGUI_Prerequest.h:47
MyGUI::types::TPoint::top
T top
Definition: MyGUI_TPoint.h:36
MyGUI::ScrollViewBase::mVScroll
ScrollBar * mVScroll
Definition: MyGUI_ScrollViewBase.h:59
MyGUI::Widget::setSize
virtual void setSize(const IntSize &_value)
Definition: MyGUI_Widget.cpp:656
MyGUI::ScrollBar::getLineSize
int getLineSize() const
Definition: MyGUI_ScrollBar.cpp:439
MyGUI::ScrollViewBase::mVisibleHScroll
bool mVisibleHScroll
Definition: MyGUI_ScrollViewBase.h:63
MyGUI_ScrollViewBase.h
MyGUI::ScrollViewBase::eraseContent
virtual void eraseContent()
Definition: MyGUI_ScrollViewBase.cpp:363
MyGUI::ScrollBar::setSize
virtual void setSize(const IntSize &_value)
Definition: MyGUI_ScrollBar.cpp:400
MyGUI::ScrollViewBase::getContentAlign
virtual Align getContentAlign()
Definition: MyGUI_ScrollViewBase.cpp:358
MyGUI::Align::isLeft
bool isLeft() const
Definition: MyGUI_Align.h:74
MyGUI::types::TPoint::left
T left
Definition: MyGUI_TPoint.h:35
MyGUI::ICroppedRectangle::getWidth
int getWidth() const
Definition: MyGUI_ICroppedRectangle.h:129
MyGUI::types::TSize::width
T width
Definition: MyGUI_TSize.h:35
MyGUI::ScrollViewBase::mVisibleVScroll
bool mVisibleVScroll
Definition: MyGUI_ScrollViewBase.h:64
MyGUI::ScrollViewBase::getHScrollPage
virtual size_t getHScrollPage()
Definition: MyGUI_ScrollViewBase.cpp:348
MyGUI_ScrollBar.h
MyGUI::Align::isRight
bool isRight() const
Definition: MyGUI_Align.h:79
MyGUI::ScrollViewBase::setContentPosition
virtual void setContentPosition(const IntPoint &_value)
Definition: MyGUI_ScrollViewBase.cpp:339
MyGUI::Align::isTop
bool isTop() const
Definition: MyGUI_Align.h:89
MyGUI::ScrollViewBase::~ScrollViewBase
virtual ~ScrollViewBase()
Definition: MyGUI_ScrollViewBase.cpp:42
MyGUI::ScrollViewBase::updateScrollPosition
void updateScrollPosition()
Definition: MyGUI_ScrollViewBase.cpp:250
MyGUI::ScrollBar::setScrollPage
void setScrollPage(size_t _value)
Definition: MyGUI_ScrollBar.cpp:508
MyGUI::ScrollBar::setScrollRange
void setScrollRange(size_t _value)
Definition: MyGUI_ScrollBar.cpp:373
MyGUI::Align
Definition: MyGUI_Align.h:34
MyGUI::types::TSize::height
T height
Definition: MyGUI_TSize.h:36
MyGUI::Widget::getVisible
bool getVisible() const
Definition: MyGUI_Widget.cpp:1220
MyGUI::ScrollBar::setScrollViewPage
void setScrollViewPage(size_t _value)
Definition: MyGUI_ScrollBar.cpp:518
MyGUI::ScrollViewBase::getViewSize
virtual IntSize getViewSize()
Definition: MyGUI_ScrollViewBase.cpp:343
MyGUI::ScrollViewBase::mClient
Widget * mClient
Definition: MyGUI_ScrollViewBase.h:61
MyGUI::ScrollBar::setScrollPosition
void setScrollPosition(size_t _value)
Definition: MyGUI_ScrollBar.cpp:383
MyGUI::ScrollViewBase::mVRange
size_t mVRange
Definition: MyGUI_ScrollViewBase.h:66
MyGUI::ScrollViewBase::ScrollViewBase
ScrollViewBase()
Definition: MyGUI_ScrollViewBase.cpp:30
MyGUI::IntPoint
types::TPoint< int > IntPoint
Definition: MyGUI_Types.h:41