MyGUI  3.0.1
MyGUI_ScrollViewBase.cpp
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 
24 #include "MyGUI_Precompiled.h"
25 #include "MyGUI_ScrollViewBase.h"
26 #include "MyGUI_VScroll.h"
27 #include "MyGUI_HScroll.h"
28 
29 namespace MyGUI
30 {
31 
33  mVScroll(nullptr),
34  mHScroll(nullptr),
35  mClient(nullptr),
36  mVisibleHScroll(true),
37  mVisibleVScroll(true),
38  mVRange(0),
39  mHRange(0),
40  mChangeContentByResize(false)
41  {
42  }
43 
45  {
46  if (mClient == nullptr)
47  return;
48 
49  eraseContent();
50  IntSize contentSize = getContentSize();
51  IntSize viewSize = getViewSize();
52 
53  // вертикальный контент не помещается
54  if (contentSize.height > viewSize.height)
55  {
56  if (mVScroll != nullptr)
57  {
58  if (( ! mVScroll->isVisible()) && (mVisibleVScroll))
59  {
60  mVScroll->setVisible(true);
62 
63  // размер может измениться
65  {
66  eraseContent();
67  contentSize = getContentSize();
68  viewSize = getViewSize();
69  }
70 
71  if (mHScroll != nullptr)
72  {
74 
75  // если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
76  // пересчитываем горизонтальный скрол на предмет показа
77  if ((contentSize.width > viewSize.width) && ( ! mHScroll->isVisible()) && (mVisibleHScroll))
78  {
79  mHScroll->setVisible(true);
82 
83  // размер может измениться
85  {
86  eraseContent();
87  contentSize = getContentSize();
88  viewSize = getViewSize();
89  }
90 
91  }
92  }
93  }
94  }
95  }
96  // вертикальный контент помещается
97  else
98  {
99  if (mVScroll != nullptr)
100  {
101  if (mVScroll->isVisible())
102  {
103  mVScroll->setVisible(false);
105 
106  // размер может измениться
108  {
109  eraseContent();
110  contentSize = getContentSize();
111  viewSize = getViewSize();
112  }
113 
114  if (mHScroll != nullptr)
115  {
117 
118  // если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
119  // пересчитываем горизонтальный скрол на предмет скрытия
120  if ((contentSize.width <= viewSize.width) && (mHScroll->isVisible()))
121  {
122  mHScroll->setVisible(false);
125 
126  // размер может измениться
128  {
129  eraseContent();
130  contentSize = getContentSize();
131  viewSize = getViewSize();
132  }
133 
134  }
135  }
136  }
137  }
138  }
139 
140 
141  // горизонтальный контент не помещается
142  if (contentSize.width > viewSize.width)
143  {
144  if (mHScroll != nullptr)
145  {
146  if (( ! mHScroll->isVisible()) && (mVisibleHScroll))
147  {
148  mHScroll->setVisible(true);
150 
151  // размер может измениться
153  {
154  eraseContent();
155  contentSize = getContentSize();
156  viewSize = getViewSize();
157  }
158 
159  if (mVScroll != nullptr)
160  {
162 
163  // если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
164  // пересчитываем вертикальный скрол на предмет показа
165  if ((contentSize.height > viewSize.height) && ( ! mVScroll->isVisible()) && (mVisibleVScroll))
166  {
167  mVScroll->setVisible(true);
170 
171  // размер может измениться
173  {
174  eraseContent();
175  contentSize = getContentSize();
176  viewSize = getViewSize();
177  }
178 
179  }
180  }
181  }
182  }
183  }
184  // горизонтальный контент помещается
185  else
186  {
187  if (mHScroll != nullptr)
188  {
189  if (mHScroll->isVisible())
190  {
191  mHScroll->setVisible(false);
193 
194  // размер может измениться
196  {
197  eraseContent();
198  contentSize = getContentSize();
199  viewSize = getViewSize();
200  }
201 
202  if (mVScroll != nullptr)
203  {
205 
206  // если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
207  // пересчитываем вертикальный скрол на предмет скрытия
208  if ((contentSize.height <= viewSize.height) && (mVScroll->isVisible()))
209  {
210  mVScroll->setVisible(false);
213 
214  // размер может измениться
216  {
217  eraseContent();
218  contentSize = getContentSize();
219  viewSize = getViewSize();
220  }
221  }
222  }
223  }
224  }
225  }
226 
227  mVRange = (viewSize.height >= contentSize.height) ? 0 : contentSize.height - viewSize.height;
228  mHRange = (viewSize.width >= contentSize.width) ? 0 : contentSize.width - viewSize.width;
229 
230  if (mVScroll != nullptr)
231  {
232  size_t page = getVScrollPage();
233  mVScroll->setScrollPage(page);
234  mVScroll->setScrollViewPage(viewSize.width > (int)page ? viewSize.width : page);
236  if (contentSize.height) mVScroll->setTrackSize(int (float(mVScroll->getLineSize() * viewSize.height) / float(contentSize.height)));
237  }
238  if (mHScroll != nullptr)
239  {
240  size_t page = getHScrollPage();
241  mHScroll->setScrollPage(page);
242  mHScroll->setScrollViewPage(viewSize.height > (int)page ? viewSize.height : page);
244  if (contentSize.width) mHScroll->setTrackSize(int (float(mHScroll->getLineSize() * viewSize.width) / float(contentSize.width)));
245  }
246  }
247 
249  {
250  // размер контекста
251  IntSize contentSize = getContentSize();
252  // текущее смещение контекста
253  IntPoint contentPoint = getContentPosition();
254  // расчетное смещение
255  IntPoint offset = contentPoint;
256 
257  IntSize viewSize = getViewSize();
258 
259  Align align = getContentAlign();
260 
261  if (contentSize.width > viewSize.width)
262  {
263  // максимальный выход влево
264  if ((offset.left + viewSize.width) > contentSize.width)
265  {
266  offset.left = contentSize.width - viewSize.width;
267  }
268  // максимальный выход вправо
269  else if (offset.left < 0)
270  {
271  offset.left = 0;
272  }
273  }
274  else
275  {
276  if (align.isLeft())
277  {
278  offset.left = 0;
279  }
280  else if (align.isRight())
281  {
282  offset.left = contentSize.width - viewSize.width;
283  }
284  else
285  {
286  offset.left = (contentSize.width - viewSize.width) / 2;
287  }
288  }
289 
290  if (contentSize.height > viewSize.height)
291  {
292  // максимальный выход вверх
293  if ((offset.top + viewSize.height) > contentSize.height)
294  {
295  offset.top = contentSize.height - viewSize.height;
296  }
297  // максимальный выход вниз
298  else if (offset.top < 0)
299  {
300  offset.top = 0;
301  }
302  }
303  else
304  {
305  if (align.isTop())
306  {
307  offset.top = 0;
308  }
309  else if (align.isBottom())
310  {
311  offset.top = contentSize.height - viewSize.height;
312  }
313  else
314  {
315  offset.top = (contentSize.height - viewSize.height) / 2;
316  }
317  }
318 
319  if (offset != contentPoint)
320  {
321  if (nullptr != mVScroll) mVScroll->setScrollPosition(offset.top);
322  if (nullptr != mHScroll) mHScroll->setScrollPosition(offset.left);
323  setContentPosition(offset);
324  }
325  }
326 
327 } // namespace MyGUI