MyGUI  3.4.0
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 
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 
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  {
41  {
42  mVScroll->setVisible(true);
44 
45  // размер может измениться
47  {
48  eraseContent();
49  contentSize = getContentSize();
50  viewSize = getViewSize();
51  }
52 
53  if (mHScroll != nullptr)
54  {
56 
57  // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
58  // пересчитываем горизонтальный скрол на предмет показа
59  if ((contentSize.width > viewSize.width) && ( ! mHScroll->getVisible()) && (mVisibleHScroll))
60  {
61  mHScroll->setVisible(true);
64 
65  // размер может измениться
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);
87 
88  // размер может измениться
90  {
91  eraseContent();
92  contentSize = getContentSize();
93  viewSize = getViewSize();
94  }
95 
96  if (mHScroll != nullptr)
97  {
99 
100  // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
101  // пересчитываем горизонтальный скрол на предмет скрытия
102  if ((contentSize.width <= viewSize.width) && (mHScroll->getVisible()))
103  {
104  mHScroll->setVisible(false);
107 
108  // размер может измениться
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  {
129  {
130  mHScroll->setVisible(true);
132 
133  // размер может измениться
135  {
136  eraseContent();
137  contentSize = getContentSize();
138  viewSize = getViewSize();
139  }
140 
141  if (mVScroll != nullptr)
142  {
144 
145  // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
146  // пересчитываем вертикальный скрол на предмет показа
147  if ((contentSize.height > viewSize.height) && ( ! mVScroll->getVisible()) && (mVisibleVScroll))
148  {
149  mVScroll->setVisible(true);
152 
153  // размер может измениться
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);
175 
176  // размер может измениться
178  {
179  eraseContent();
180  contentSize = getContentSize();
181  viewSize = getViewSize();
182  }
183 
184  if (mVScroll != nullptr)
185  {
187 
188  // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
189  // пересчитываем вертикальный скрол на предмет скрытия
190  if ((contentSize.height <= viewSize.height) && (mVScroll->getVisible()))
191  {
192  mVScroll->setVisible(false);
195 
196  // размер может измениться
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);
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);
226  if (contentSize.width) mHScroll->setTrackSize(int (float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
227  }
228  }
229 
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 
310  {
311  return IntSize();
312  }
313 
315  {
316  return IntPoint();
317  }
318 
320  {
321  }
322 
324  {
325  return IntSize();
326  }
327 
329  {
330  return 1;
331  }
332 
334  {
335  return 1;
336  }
337 
339  {
340  return Align::Center;
341  }
342 
344  {
345  }
346 
347 } // namespace MyGUI
MyGUI::Align::isTop
bool isTop() const
Definition: MyGUI_Align.h:74
MyGUI::ScrollViewBase::getContentAlign
virtual Align getContentAlign()
Definition: MyGUI_ScrollViewBase.cpp:338
MyGUI::ScrollBar::setScrollViewPage
void setScrollViewPage(size_t _value)
Definition: MyGUI_ScrollBar.cpp:623
MyGUI::types::TSize::height
T height
Definition: MyGUI_TSize.h:21
MyGUI::ScrollBar::setTrackSize
void setTrackSize(int _value)
Definition: MyGUI_ScrollBar.cpp:381
MyGUI::types::TPoint::top
T top
Definition: MyGUI_TPoint.h:21
MyGUI::ScrollViewBase::mVScroll
ScrollBar * mVScroll
Definition: MyGUI_ScrollViewBase.h:44
MyGUI::Align::Center
@ Center
Definition: MyGUI_Align.h:25
MyGUI::ScrollViewBase::updateScrollPosition
void updateScrollPosition()
Definition: MyGUI_ScrollViewBase.cpp:230
MyGUI::ScrollViewBase::mChangeContentByResize
bool mChangeContentByResize
Definition: MyGUI_ScrollViewBase.h:55
MyGUI::ScrollBar::setSize
void setSize(const IntSize &_value) override
Definition: MyGUI_ScrollBar.cpp:367
MyGUI::ScrollBar::getLineSize
int getLineSize() const
Definition: MyGUI_ScrollBar.cpp:435
MyGUI::types::TPoint< int >
MyGUI::ScrollViewBase::getVScrollPage
virtual size_t getVScrollPage()
Definition: MyGUI_ScrollViewBase.cpp:333
MyGUI::types::TSize::width
T width
Definition: MyGUI_TSize.h:20
MyGUI::ScrollViewBase::getHScrollPage
virtual size_t getHScrollPage()
Definition: MyGUI_ScrollViewBase.cpp:328
MyGUI::Align
Definition: MyGUI_Align.h:20
MyGUI::ScrollViewBase::getContentSize
virtual IntSize getContentSize()
Definition: MyGUI_ScrollViewBase.cpp:309
MyGUI_Precompiled.h
MyGUI::ScrollViewBase::ScrollViewBase
ScrollViewBase()
Definition: MyGUI_ScrollViewBase.cpp:14
MyGUI_ScrollViewBase.h
MyGUI::ScrollViewBase::getContentPosition
virtual IntPoint getContentPosition()
Definition: MyGUI_ScrollViewBase.cpp:314
MyGUI::types::TPoint::left
T left
Definition: MyGUI_TPoint.h:20
MyGUI::Widget::setVisible
virtual void setVisible(bool _value)
Definition: MyGUI_Widget.cpp:957
MyGUI::Widget::setSize
void setSize(const IntSize &_value) override
Definition: MyGUI_Widget.cpp:647
MyGUI::ScrollViewBase::mScrollViewClient
Widget * mScrollViewClient
Definition: MyGUI_ScrollViewBase.h:46
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:350
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 >
MyGUI::ScrollViewBase::getViewSize
virtual IntSize getViewSize()
Definition: MyGUI_ScrollViewBase.cpp:323
MyGUI::Align::isRight
bool isRight() const
Definition: MyGUI_Align.h:64
MyGUI::ScrollViewBase::eraseContent
virtual void eraseContent()
Definition: MyGUI_ScrollViewBase.cpp:343
MyGUI::Align::isBottom
bool isBottom() const
Definition: MyGUI_Align.h:79
MyGUI::ICroppedRectangle::getHeight
int getHeight() const
Definition: MyGUI_ICroppedRectangle.h:119
MyGUI::IntSize
types::TSize< int > IntSize
Definition: MyGUI_Types.h:29
MyGUI::ScrollBar::setScrollRange
void setScrollRange(size_t _value)
Definition: MyGUI_ScrollBar.cpp:340
MyGUI::Widget::getVisible
bool getVisible() const
Definition: MyGUI_Widget.cpp:1249
MyGUI::ScrollBar::setScrollPage
void setScrollPage(size_t _value)
Definition: MyGUI_ScrollBar.cpp:613
MyGUI::ScrollViewBase::mVisibleVScroll
bool mVisibleVScroll
Definition: MyGUI_ScrollViewBase.h:49
MyGUI::IntPoint
types::TPoint< int > IntPoint
Definition: MyGUI_Types.h:26
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:15
MyGUI::ScrollViewBase::updateScrollSize
void updateScrollSize()
Definition: MyGUI_ScrollViewBase.cpp:26
MyGUI::ScrollViewBase::setContentPosition
virtual void setContentPosition(const IntPoint &_value)
Definition: MyGUI_ScrollViewBase.cpp:319
MyGUI::Align::isLeft
bool isLeft() const
Definition: MyGUI_Align.h:59