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