Skip to content

Commit 705630e

Browse files
Desoursfan5
authored andcommittedJul 28, 2019
guiScrollBar: move directly to clicked pos if clicked into tray
1 parent 8efa1de commit 705630e

File tree

2 files changed

+22
-41
lines changed

2 files changed

+22
-41
lines changed
 

Diff for: ‎src/gui/guiScrollBar.cpp

+21-38
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ guiScrollBar::guiScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s3
2121
is_horizontal(horizontal), is_auto_scaling(auto_scale),
2222
dragged_by_slider(false), tray_clicked(false), scroll_pos(0),
2323
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)
2625
{
2726
refreshControls();
2827
setNotClipped(false);
@@ -116,12 +115,25 @@ bool guiScrollBar::OnEvent(const SEvent &event)
116115
if (is_inside) {
117116
is_dragging = true;
118117
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;
123120
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+
}
125137
Environment->setFocus(this);
126138
return true;
127139
}
@@ -158,10 +170,7 @@ bool guiScrollBar::OnEvent(const SEvent &event)
158170
const s32 new_pos = getPosFromMousePos(p);
159171
const s32 old_pos = scroll_pos;
160172

161-
if (dragged_by_slider)
162-
setPos(new_pos);
163-
else
164-
desired_pos = new_pos;
173+
setPos(new_pos);
165174

166175
if (scroll_pos != old_pos && Parent) {
167176
SEvent e;
@@ -184,32 +193,6 @@ bool guiScrollBar::OnEvent(const SEvent &event)
184193
return IGUIElement::OnEvent(event);
185194
}
186195

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-
213196
void guiScrollBar::draw()
214197
{
215198
if (!IsVisible)
@@ -439,4 +422,4 @@ void guiScrollBar::refreshControls()
439422
bool visible = (border_size != 0);
440423
up_button->setVisible(visible);
441424
down_button->setVisible(visible);
442-
}
425+
}

Diff for: ‎src/gui/guiScrollBar.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ class guiScrollBar : public IGUIElement
2626
virtual void draw();
2727
virtual void updateAbsolutePosition();
2828
virtual bool OnEvent(const SEvent &event);
29-
virtual void OnPostRender(u32 timeMs);
3029

3130
s32 getMax() const { return max_pos; }
3231
s32 getMin() const { return min_pos; }
@@ -60,12 +59,11 @@ class guiScrollBar : public IGUIElement
6059
s32 max_pos;
6160
s32 small_step;
6261
s32 large_step;
63-
s32 desired_pos;
6462
u32 last_change;
6563
s32 drag_offset;
6664
s32 page_size;
6765
s32 border_size;
6866

6967
core::rect<s32> slider_rect;
7068
video::SColor current_icon_color;
71-
};
69+
};

0 commit comments

Comments
 (0)