MyGUI
3.0.1
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
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
32
ScrollViewBase::ScrollViewBase
() :
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
44
void
ScrollViewBase::updateScrollSize
()
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
);
61
mClient
->
setSize
(
mClient
->
getWidth
() -
mVScroll
->
getWidth
(),
mClient
->
getHeight
());
62
63
// размер может измениться
64
if
(
mChangeContentByResize
)
65
{
66
eraseContent
();
67
contentSize =
getContentSize
();
68
viewSize =
getViewSize
();
69
}
70
71
if
(
mHScroll
!=
nullptr
)
72
{
73
mHScroll
->
setSize
(
mHScroll
->
getWidth
() -
mVScroll
->
getWidth
(),
mHScroll
->
getHeight
());
74
75
// если показали вертикальный скрол бар, уменьшилось вью по горизонтали,
76
// пересчитываем горизонтальный скрол на предмет показа
77
if
((contentSize.
width
> viewSize.
width
) && ( !
mHScroll
->
isVisible
()) && (
mVisibleHScroll
))
78
{
79
mHScroll
->
setVisible
(
true
);
80
mClient
->
setSize
(
mClient
->
getWidth
(),
mClient
->
getHeight
() -
mHScroll
->
getHeight
());
81
mVScroll
->
setSize
(
mVScroll
->
getWidth
(),
mVScroll
->
getHeight
() -
mHScroll
->
getHeight
());
82
83
// размер может измениться
84
if
(
mChangeContentByResize
)
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
);
104
mClient
->
setSize
(
mClient
->
getWidth
() +
mVScroll
->
getWidth
(),
mClient
->
getHeight
());
105
106
// размер может измениться
107
if
(
mChangeContentByResize
)
108
{
109
eraseContent
();
110
contentSize =
getContentSize
();
111
viewSize =
getViewSize
();
112
}
113
114
if
(
mHScroll
!=
nullptr
)
115
{
116
mHScroll
->
setSize
(
mHScroll
->
getWidth
() +
mVScroll
->
getWidth
(),
mHScroll
->
getHeight
());
117
118
// если скрыли вертикальный скрол бар, увеличилось вью по горизонтали,
119
// пересчитываем горизонтальный скрол на предмет скрытия
120
if
((contentSize.
width
<= viewSize.
width
) && (
mHScroll
->
isVisible
()))
121
{
122
mHScroll
->
setVisible
(
false
);
123
mClient
->
setSize
(
mClient
->
getWidth
(),
mClient
->
getHeight
() +
mHScroll
->
getHeight
());
124
mVScroll
->
setSize
(
mVScroll
->
getWidth
(),
mVScroll
->
getHeight
() +
mHScroll
->
getHeight
());
125
126
// размер может измениться
127
if
(
mChangeContentByResize
)
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
);
149
mClient
->
setSize
(
mClient
->
getWidth
(),
mClient
->
getHeight
() -
mHScroll
->
getHeight
());
150
151
// размер может измениться
152
if
(
mChangeContentByResize
)
153
{
154
eraseContent
();
155
contentSize =
getContentSize
();
156
viewSize =
getViewSize
();
157
}
158
159
if
(
mVScroll
!=
nullptr
)
160
{
161
mVScroll
->
setSize
(
mVScroll
->
getWidth
(),
mVScroll
->
getHeight
() -
mHScroll
->
getHeight
());
162
163
// если показали горизонтальный скрол бар, уменьшилось вью по вертикали,
164
// пересчитываем вертикальный скрол на предмет показа
165
if
((contentSize.
height
> viewSize.
height
) && ( !
mVScroll
->
isVisible
()) && (
mVisibleVScroll
))
166
{
167
mVScroll
->
setVisible
(
true
);
168
mClient
->
setSize
(
mClient
->
getWidth
() -
mVScroll
->
getWidth
(),
mClient
->
getHeight
());
169
mHScroll
->
setSize
(
mHScroll
->
getWidth
() -
mVScroll
->
getWidth
(),
mHScroll
->
getHeight
());
170
171
// размер может измениться
172
if
(
mChangeContentByResize
)
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
);
192
mClient
->
setSize
(
mClient
->
getWidth
(),
mClient
->
getHeight
() +
mHScroll
->
getHeight
());
193
194
// размер может измениться
195
if
(
mChangeContentByResize
)
196
{
197
eraseContent
();
198
contentSize =
getContentSize
();
199
viewSize =
getViewSize
();
200
}
201
202
if
(
mVScroll
!=
nullptr
)
203
{
204
mVScroll
->
setSize
(
mVScroll
->
getWidth
(),
mVScroll
->
getHeight
() +
mHScroll
->
getHeight
());
205
206
// если скрыли горизонтальный скрол бар, увеличилось вью по вертикали,
207
// пересчитываем вертикальный скрол на предмет скрытия
208
if
((contentSize.
height
<= viewSize.
height
) && (
mVScroll
->
isVisible
()))
209
{
210
mVScroll
->
setVisible
(
false
);
211
mClient
->
setSize
(
mClient
->
getWidth
() +
mVScroll
->
getWidth
(),
mClient
->
getHeight
());
212
mHScroll
->
setSize
(
mHScroll
->
getWidth
() +
mVScroll
->
getWidth
(),
mHScroll
->
getHeight
());
213
214
// размер может измениться
215
if
(
mChangeContentByResize
)
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);
235
mVScroll
->
setScrollRange
(
mVRange
+ 1);
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);
243
mHScroll
->
setScrollRange
(
mHRange
+ 1);
244
if
(contentSize.
width
)
mHScroll
->
setTrackSize
(
int
(
float
(
mHScroll
->
getLineSize
() * viewSize.
width
) /
float
(contentSize.
width
)));
245
}
246
}
247
248
void
ScrollViewBase::updateScrollPosition
()
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
Generated by
1.8.1.2