MyGUI
3.2.0
Main Page
Related Pages
Namespaces
Data Structures
Files
Examples
File List
Globals
MyGUIEngine
src
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
Generated by
1.8.3.1