FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
UnityCsReference/Modules/IMGUI/SliderHandler.cs at master · timFinn/UnityCsReference · GitHub
timFinn
/
UnityCsReference
Public
forked from
Unity-Technologies/UnityCsReference
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
UnityCsReference
/
Modules
/
IMGUI
/
SliderHandler.cs
Copy path
More file actions
More file actions
Latest commit
History
History
History
376 lines (316 loc) · 12.3 KB
Breadcrumbs
UnityCsReference
/
Modules
/
IMGUI
/
SliderHandler.cs
Copy path
File metadata and controls
376 lines (316 loc) · 12.3 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
// Unity C# reference source
// Copyright (c) Unity Technologies. For terms of use, see
// https://unity3d.com/legal/licenses/Unity_Reference_Only_License
using
System
;
using
UnityEngine
.
Scripting
;
namespace
UnityEngine
{
// State for when we're dragging a slider.
internal
class
SliderState
{
[
RequiredByNativeCode
]
// Created by reflection from SliderHandler.SliderState
public
SliderState
(
)
{
}
public
float
dragStartPos
;
public
float
dragStartValue
;
public
bool
isDragging
;
}
// TODO: Make the thumb positioning / sizing be right
internal
struct
SliderHandler
{
readonly
Rect
position
;
readonly
float
currentValue
;
readonly
float
size
;
readonly
float
start
;
readonly
float
end
;
readonly
GUIStyle
slider
;
readonly
GUIStyle
thumb
;
readonly
GUIStyle
thumbExtent
;
readonly
bool
horiz
;
readonly
int
id
;
public
SliderHandler
(
Rect
position
,
float
currentValue
,
float
size
,
float
start
,
float
end
,
GUIStyle
slider
,
GUIStyle
thumb
,
bool
horiz
,
int
id
,
GUIStyle
thumbExtent
=
null
)
{
this
.
position
=
position
;
this
.
currentValue
=
currentValue
;
this
.
size
=
size
;
this
.
start
=
start
;
this
.
end
=
end
;
this
.
slider
=
slider
;
this
.
thumb
=
thumb
;
this
.
thumbExtent
=
thumbExtent
;
this
.
horiz
=
horiz
;
this
.
id
=
id
;
}
public
float
Handle
(
)
{
if
(
slider
==
null
||
thumb
==
null
)
return
currentValue
;
switch
(
CurrentEventType
(
)
)
{
case
EventType
.
MouseDown
:
return
OnMouseDown
(
)
;
case
EventType
.
MouseDrag
:
return
OnMouseDrag
(
)
;
case
EventType
.
MouseUp
:
return
OnMouseUp
(
)
;
case
EventType
.
Repaint
:
return
OnRepaint
(
)
;
}
return
currentValue
;
}
private
float
OnMouseDown
(
)
{
var
thumbZone
=
ThumbSelectionRect
(
)
;
var
mouseOverThumb
=
GUIUtility
.
HitTest
(
thumbZone
,
CurrentEvent
(
)
)
;
var
boundingRect
=
Rect
.
zero
;
// Bounding box that includes the slider and its thumb.
boundingRect
.
xMin
=
Math
.
Min
(
position
.
xMin
,
thumbZone
.
xMin
)
;
boundingRect
.
xMax
=
Math
.
Max
(
position
.
xMax
,
thumbZone
.
xMax
)
;
boundingRect
.
yMin
=
Math
.
Min
(
position
.
yMin
,
thumbZone
.
yMin
)
;
boundingRect
.
yMax
=
Math
.
Max
(
position
.
yMax
,
thumbZone
.
yMax
)
;
// if the click is outside this control, just bail out...
if
(
IsEmptySlider
(
)
||
(
!
GUIUtility
.
HitTest
(
boundingRect
,
CurrentEvent
(
)
)
&&
!
mouseOverThumb
)
)
return
currentValue
;
GUI
.
scrollTroughSide
=
0
;
GUIUtility
.
hotControl
=
id
;
CurrentEvent
(
)
.
Use
(
)
;
if
(
mouseOverThumb
)
{
// We have a mousedown on the thumb
// Record where we're dragging from, so the user can get back.
StartDraggingWithValue
(
ClampedCurrentValue
(
)
)
;
return
currentValue
;
}
GUI
.
changed
=
true
;
// We're outside the thumb, but inside the trough.
// If we have a scrollSize, we do pgup/pgdn style movements
// if not, we just snap to the current position and begin tracking
if
(
SupportsPageMovements
(
)
)
{
SliderState
(
)
.
isDragging
=
false
;
GUI
.
nextScrollStepTime
=
SystemClock
.
now
.
AddMilliseconds
(
ScrollWaitDefinitions
.
firstWait
)
;
GUI
.
scrollTroughSide
=
CurrentScrollTroughSide
(
)
;
return
PageMovementValue
(
)
;
}
float
newValue
=
ValueForCurrentMousePosition
(
)
;
StartDraggingWithValue
(
newValue
)
;
return
Clamp
(
newValue
)
;
}
private
float
OnMouseDrag
(
)
{
if
(
GUIUtility
.
hotControl
!=
id
)
return
currentValue
;
var
sliderState
=
SliderState
(
)
;
if
(
!
sliderState
.
isDragging
)
return
currentValue
;
GUI
.
changed
=
true
;
CurrentEvent
(
)
.
Use
(
)
;
// Recalculate the value from the mouse position. this has the side effect that values are relative to the
// click point - no matter where inside the trough the original value was. Also means user can get back original value
// if he drags back to start position.
float
deltaPos
=
MousePosition
(
)
-
sliderState
.
dragStartPos
;
var
newValue
=
sliderState
.
dragStartValue
+
deltaPos
/
ValuesPerPixel
(
)
;
return
Clamp
(
newValue
)
;
}
private
float
OnMouseUp
(
)
{
if
(
GUIUtility
.
hotControl
==
id
)
{
CurrentEvent
(
)
.
Use
(
)
;
GUIUtility
.
hotControl
=
0
;
}
return
currentValue
;
}
private
float
OnRepaint
(
)
{
bool
hover
=
GUIUtility
.
HitTest
(
position
,
CurrentEvent
(
)
)
;
slider
.
Draw
(
position
,
GUIContent
.
none
,
id
,
false
,
hover
)
;
if
(
currentValue
>=
Mathf
.
Min
(
start
,
end
)
&&
currentValue
<=
Mathf
.
Max
(
start
,
end
)
)
{
if
(
thumbExtent
!=
null
)
thumbExtent
.
Draw
(
ThumbExtRect
(
)
,
GUIContent
.
none
,
id
,
false
,
hover
)
;
thumb
.
Draw
(
ThumbRect
(
)
,
GUIContent
.
none
,
id
,
false
,
hover
)
;
}
if
(
GUIUtility
.
hotControl
!=
id
||
!
hover
||
IsEmptySlider
(
)
)
return
currentValue
;
var
thumbRect
=
ThumbRect
(
)
;
// If the slider is horizontal then use its entire height to hit test on the thumb
if
(
this
.
horiz
)
{
thumbRect
.
y
=
position
.
y
;
thumbRect
.
height
=
position
.
height
;
}
// ... otherwise use the entire width
else
{
thumbRect
.
x
=
position
.
x
;
thumbRect
.
width
=
position
.
width
;
}
if
(
GUIUtility
.
HitTest
(
thumbRect
,
CurrentEvent
(
)
)
)
{
if
(
GUI
.
scrollTroughSide
!=
0
)
// if was scrolling with "trough" and the thumb reached mouse - sliding action over
{
GUIUtility
.
hotControl
=
0
;
}
return
currentValue
;
}
GUI
.
InternalRepaintEditorWindow
(
)
;
if
(
SystemClock
.
now
<
GUI
.
nextScrollStepTime
)
return
currentValue
;
if
(
CurrentScrollTroughSide
(
)
!=
GUI
.
scrollTroughSide
)
return
currentValue
;
GUI
.
nextScrollStepTime
=
SystemClock
.
now
.
AddMilliseconds
(
ScrollWaitDefinitions
.
regularWait
)
;
if
(
SupportsPageMovements
(
)
)
{
SliderState
(
)
.
isDragging
=
false
;
GUI
.
changed
=
true
;
return
PageMovementValue
(
)
;
}
return
ClampedCurrentValue
(
)
;
}
private
EventType
CurrentEventType
(
)
{
return
CurrentEvent
(
)
.
GetTypeForControl
(
id
)
;
}
private
int
CurrentScrollTroughSide
(
)
{
float
mousePos
=
horiz
?
CurrentEvent
(
)
.
mousePosition
.
x
:
CurrentEvent
(
)
.
mousePosition
.
y
;
float
thumbPos
=
horiz
?
ThumbRect
(
)
.
x
:
ThumbRect
(
)
.
y
;
return
mousePos
>
thumbPos
?
1
:
-
1
;
}
private
bool
IsEmptySlider
(
)
{
return
start
==
end
;
}
private
bool
SupportsPageMovements
(
)
{
return
size
!=
0
&&
GUI
.
usePageScrollbars
;
}
private
float
PageMovementValue
(
)
{
var
newValue
=
currentValue
;
var
sign
=
start
>
end
?
-
1
:
1
;
if
(
MousePosition
(
)
>
PageUpMovementBound
(
)
)
newValue
+=
size
*
sign
*
.9f
;
else
newValue
-=
size
*
sign
*
.9f
;
return
Clamp
(
newValue
)
;
}
private
float
PageUpMovementBound
(
)
{
if
(
horiz
)
return
ThumbRect
(
)
.
xMax
-
position
.
x
;
return
ThumbRect
(
)
.
yMax
-
position
.
y
;
}
private
Event
CurrentEvent
(
)
{
return
Event
.
current
;
}
private
float
ValueForCurrentMousePosition
(
)
{
if
(
horiz
)
return
(
MousePosition
(
)
-
ThumbRect
(
)
.
width
*
.5f
)
/
ValuesPerPixel
(
)
+
start
-
size
*
.5f
;
return
(
MousePosition
(
)
-
ThumbRect
(
)
.
height
*
.5f
)
/
ValuesPerPixel
(
)
+
start
-
size
*
.5f
;
}
private
float
Clamp
(
float
value
)
{
return
Mathf
.
Clamp
(
value
,
MinValue
(
)
,
MaxValue
(
)
)
;
}
private
Rect
ThumbSelectionRect
(
)
{
var
selectionRect
=
ThumbRect
(
)
;
return
selectionRect
;
}
private
void
StartDraggingWithValue
(
float
dragStartValue
)
{
var
state
=
SliderState
(
)
;
state
.
dragStartPos
=
MousePosition
(
)
;
state
.
dragStartValue
=
dragStartValue
;
state
.
isDragging
=
true
;
}
private
SliderState
SliderState
(
)
{
return
(
SliderState
)
GUIUtility
.
GetStateObject
(
typeof
(
SliderState
)
,
id
)
;
}
private
Rect
ThumbExtRect
(
)
{
var
rect
=
new
Rect
(
0
,
0
,
thumbExtent
.
fixedWidth
,
thumbExtent
.
fixedHeight
)
{
center
=
ThumbRect
(
)
.
center
}
;
return
rect
;
}
private
Rect
ThumbRect
(
)
{
return
horiz
?
HorizontalThumbRect
(
)
:
VerticalThumbRect
(
)
;
}
private
Rect
VerticalThumbRect
(
)
{
Rect
contentRect
=
thumb
.
margin
.
Remove
(
slider
.
padding
.
Remove
(
position
)
)
;
float
thumbWidth
=
(
thumb
.
fixedWidth
!=
0
?
thumb
.
fixedWidth
:
contentRect
.
width
)
;
var
thumbSize
=
ThumbSize
(
)
;
var
valuesPerPixel
=
ValuesPerPixel
(
)
;
if
(
start
<
end
)
{
return
new
Rect
(
contentRect
.
x
,
(
ClampedCurrentValue
(
)
-
start
)
*
valuesPerPixel
+
contentRect
.
y
,
thumbWidth
,
size
*
valuesPerPixel
+
thumbSize
)
;
}
else
{
return
new
Rect
(
contentRect
.
x
,
(
ClampedCurrentValue
(
)
+
size
-
start
)
*
valuesPerPixel
+
contentRect
.
y
,
thumbWidth
,
size
*
-
valuesPerPixel
+
thumbSize
)
;
}
}
private
Rect
HorizontalThumbRect
(
)
{
Rect
contentRect
=
thumb
.
margin
.
Remove
(
slider
.
padding
.
Remove
(
position
)
)
;
float
thumbHeight
=
(
thumb
.
fixedHeight
!=
0
?
thumb
.
fixedHeight
:
contentRect
.
height
)
;
var
thumbSize
=
ThumbSize
(
)
;
var
valuesPerPixel
=
ValuesPerPixel
(
)
;
if
(
start
<
end
)
return
new
Rect
(
(
ClampedCurrentValue
(
)
-
start
)
*
valuesPerPixel
+
contentRect
.
x
,
contentRect
.
y
,
size
*
valuesPerPixel
+
thumbSize
,
thumbHeight
)
;
return
new
Rect
(
(
ClampedCurrentValue
(
)
+
size
-
start
)
*
valuesPerPixel
+
contentRect
.
x
,
contentRect
.
y
,
size
*
-
valuesPerPixel
+
thumbSize
,
thumbHeight
)
;
}
private
float
ClampedCurrentValue
(
)
{
return
Clamp
(
currentValue
)
;
}
private
float
MousePosition
(
)
{
if
(
horiz
)
return
CurrentEvent
(
)
.
mousePosition
.
x
-
position
.
x
;
return
CurrentEvent
(
)
.
mousePosition
.
y
-
position
.
y
;
}
private
float
ValuesPerPixel
(
)
{
var
length
=
(
end
==
start
)
?
1
:
end
-
start
;
if
(
horiz
)
return
(
position
.
width
-
slider
.
padding
.
horizontal
-
ThumbSize
(
)
)
/
length
;
return
(
position
.
height
-
slider
.
padding
.
vertical
-
ThumbSize
(
)
)
/
length
;
}
private
float
ThumbSize
(
)
{
if
(
horiz
)
return
thumb
.
fixedWidth
!=
0
?
thumb
.
fixedWidth
:
thumb
.
padding
.
horizontal
;
return
thumb
.
fixedHeight
!=
0
?
thumb
.
fixedHeight
:
thumb
.
padding
.
vertical
;
}
private
float
MaxValue
(
)
{
return
Mathf
.
Max
(
start
,
end
)
-
size
;
}
private
float
MinValue
(
)
{
return
Mathf
.
Min
(
start
,
end
)
;
}
}
}
Back
|
FazBrowse Home
|
New Git URL