@@ -21,8 +21,7 @@ guiScrollBar::guiScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s3
21
21
is_horizontal(horizontal), is_auto_scaling(auto_scale),
22
22
dragged_by_slider(false ), tray_clicked(false ), scroll_pos(0 ),
23
23
draw_center(0 ), thumb_size(0 ), min_pos(0 ), max_pos(100 ), small_step(10 ),
24
- large_step(50 ), desired_pos(0 ), last_change(0 ), drag_offset(0 ),
25
- page_size(100 ), border_size(0 )
24
+ large_step(50 ), last_change(0 ), drag_offset(0 ), page_size(100 ), border_size(0 )
26
25
{
27
26
refreshControls ();
28
27
setNotClipped (false );
@@ -116,12 +115,25 @@ bool guiScrollBar::OnEvent(const SEvent &event)
116
115
if (is_inside) {
117
116
is_dragging = true ;
118
117
dragged_by_slider = slider_rect.isPointInside (p);
119
- core::vector2di corner =
120
- slider_rect.UpperLeftCorner ;
121
- drag_offset = is_horizontal ? p.X - corner.X
122
- : p.Y - corner.Y ;
118
+ core::vector2di corner = slider_rect.UpperLeftCorner ;
119
+ drag_offset = is_horizontal ? p.X - corner.X : p.Y - corner.Y ;
123
120
tray_clicked = !dragged_by_slider;
124
- desired_pos = getPosFromMousePos (p);
121
+ if (tray_clicked) {
122
+ const s32 new_pos = getPosFromMousePos (p);
123
+ const s32 old_pos = scroll_pos;
124
+ setPos (new_pos);
125
+ // drag in the middle
126
+ drag_offset = thumb_size / 2 ;
127
+ // report the scroll event
128
+ if (scroll_pos != old_pos && Parent) {
129
+ SEvent e;
130
+ e.EventType = EET_GUI_EVENT;
131
+ e.GUIEvent .Caller = this ;
132
+ e.GUIEvent .Element = nullptr ;
133
+ e.GUIEvent .EventType = EGET_SCROLL_BAR_CHANGED;
134
+ Parent->OnEvent (e);
135
+ }
136
+ }
125
137
Environment->setFocus (this );
126
138
return true ;
127
139
}
@@ -158,10 +170,7 @@ bool guiScrollBar::OnEvent(const SEvent &event)
158
170
const s32 new_pos = getPosFromMousePos (p);
159
171
const s32 old_pos = scroll_pos;
160
172
161
- if (dragged_by_slider)
162
- setPos (new_pos);
163
- else
164
- desired_pos = new_pos;
173
+ setPos (new_pos);
165
174
166
175
if (scroll_pos != old_pos && Parent) {
167
176
SEvent e;
@@ -184,32 +193,6 @@ bool guiScrollBar::OnEvent(const SEvent &event)
184
193
return IGUIElement::OnEvent (event);
185
194
}
186
195
187
- void guiScrollBar::OnPostRender (u32 timeMs)
188
- {
189
- if (is_dragging && !dragged_by_slider && tray_clicked &&
190
- timeMs > last_change + 200 ) {
191
- last_change = timeMs;
192
- const s32 old_pos = scroll_pos;
193
-
194
- if (desired_pos >= scroll_pos + large_step)
195
- setPos (scroll_pos + large_step);
196
- else if (desired_pos <= scroll_pos - large_step)
197
- setPos (scroll_pos - large_step);
198
- else if (desired_pos >= scroll_pos - large_step &&
199
- desired_pos <= scroll_pos + large_step)
200
- setPos (desired_pos);
201
-
202
- if (scroll_pos != old_pos && Parent) {
203
- SEvent e;
204
- e.EventType = EET_GUI_EVENT;
205
- e.GUIEvent .Caller = this ;
206
- e.GUIEvent .Element = nullptr ;
207
- e.GUIEvent .EventType = EGET_SCROLL_BAR_CHANGED;
208
- Parent->OnEvent (e);
209
- }
210
- }
211
- }
212
-
213
196
void guiScrollBar::draw ()
214
197
{
215
198
if (!IsVisible)
@@ -439,4 +422,4 @@ void guiScrollBar::refreshControls()
439
422
bool visible = (border_size != 0 );
440
423
up_button->setVisible (visible);
441
424
down_button->setVisible (visible);
442
- }
425
+ }
0 commit comments