forked from Mirrorlandia_minetest/minetest
guiScrollBar: move directly to clicked pos if clicked into tray
This commit is contained in:
parent
8efa1de835
commit
705630e7d0
@ -21,8 +21,7 @@ guiScrollBar::guiScrollBar(IGUIEnvironment *environment, IGUIElement *parent, s3
|
|||||||
is_horizontal(horizontal), is_auto_scaling(auto_scale),
|
is_horizontal(horizontal), is_auto_scaling(auto_scale),
|
||||||
dragged_by_slider(false), tray_clicked(false), scroll_pos(0),
|
dragged_by_slider(false), tray_clicked(false), scroll_pos(0),
|
||||||
draw_center(0), thumb_size(0), min_pos(0), max_pos(100), small_step(10),
|
draw_center(0), thumb_size(0), min_pos(0), max_pos(100), small_step(10),
|
||||||
large_step(50), desired_pos(0), last_change(0), drag_offset(0),
|
large_step(50), last_change(0), drag_offset(0), page_size(100), border_size(0)
|
||||||
page_size(100), border_size(0)
|
|
||||||
{
|
{
|
||||||
refreshControls();
|
refreshControls();
|
||||||
setNotClipped(false);
|
setNotClipped(false);
|
||||||
@ -116,12 +115,25 @@ bool guiScrollBar::OnEvent(const SEvent &event)
|
|||||||
if (is_inside) {
|
if (is_inside) {
|
||||||
is_dragging = true;
|
is_dragging = true;
|
||||||
dragged_by_slider = slider_rect.isPointInside(p);
|
dragged_by_slider = slider_rect.isPointInside(p);
|
||||||
core::vector2di corner =
|
core::vector2di corner = slider_rect.UpperLeftCorner;
|
||||||
slider_rect.UpperLeftCorner;
|
drag_offset = is_horizontal ? p.X - corner.X : p.Y - corner.Y;
|
||||||
drag_offset = is_horizontal ? p.X - corner.X
|
|
||||||
: p.Y - corner.Y;
|
|
||||||
tray_clicked = !dragged_by_slider;
|
tray_clicked = !dragged_by_slider;
|
||||||
desired_pos = getPosFromMousePos(p);
|
if (tray_clicked) {
|
||||||
|
const s32 new_pos = getPosFromMousePos(p);
|
||||||
|
const s32 old_pos = scroll_pos;
|
||||||
|
setPos(new_pos);
|
||||||
|
// drag in the middle
|
||||||
|
drag_offset = thumb_size / 2;
|
||||||
|
// report the scroll event
|
||||||
|
if (scroll_pos != old_pos && Parent) {
|
||||||
|
SEvent e;
|
||||||
|
e.EventType = EET_GUI_EVENT;
|
||||||
|
e.GUIEvent.Caller = this;
|
||||||
|
e.GUIEvent.Element = nullptr;
|
||||||
|
e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
|
||||||
|
Parent->OnEvent(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
Environment->setFocus(this);
|
Environment->setFocus(this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -158,10 +170,7 @@ bool guiScrollBar::OnEvent(const SEvent &event)
|
|||||||
const s32 new_pos = getPosFromMousePos(p);
|
const s32 new_pos = getPosFromMousePos(p);
|
||||||
const s32 old_pos = scroll_pos;
|
const s32 old_pos = scroll_pos;
|
||||||
|
|
||||||
if (dragged_by_slider)
|
setPos(new_pos);
|
||||||
setPos(new_pos);
|
|
||||||
else
|
|
||||||
desired_pos = new_pos;
|
|
||||||
|
|
||||||
if (scroll_pos != old_pos && Parent) {
|
if (scroll_pos != old_pos && Parent) {
|
||||||
SEvent e;
|
SEvent e;
|
||||||
@ -184,32 +193,6 @@ bool guiScrollBar::OnEvent(const SEvent &event)
|
|||||||
return IGUIElement::OnEvent(event);
|
return IGUIElement::OnEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void guiScrollBar::OnPostRender(u32 timeMs)
|
|
||||||
{
|
|
||||||
if (is_dragging && !dragged_by_slider && tray_clicked &&
|
|
||||||
timeMs > last_change + 200) {
|
|
||||||
last_change = timeMs;
|
|
||||||
const s32 old_pos = scroll_pos;
|
|
||||||
|
|
||||||
if (desired_pos >= scroll_pos + large_step)
|
|
||||||
setPos(scroll_pos + large_step);
|
|
||||||
else if (desired_pos <= scroll_pos - large_step)
|
|
||||||
setPos(scroll_pos - large_step);
|
|
||||||
else if (desired_pos >= scroll_pos - large_step &&
|
|
||||||
desired_pos <= scroll_pos + large_step)
|
|
||||||
setPos(desired_pos);
|
|
||||||
|
|
||||||
if (scroll_pos != old_pos && Parent) {
|
|
||||||
SEvent e;
|
|
||||||
e.EventType = EET_GUI_EVENT;
|
|
||||||
e.GUIEvent.Caller = this;
|
|
||||||
e.GUIEvent.Element = nullptr;
|
|
||||||
e.GUIEvent.EventType = EGET_SCROLL_BAR_CHANGED;
|
|
||||||
Parent->OnEvent(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void guiScrollBar::draw()
|
void guiScrollBar::draw()
|
||||||
{
|
{
|
||||||
if (!IsVisible)
|
if (!IsVisible)
|
||||||
@ -439,4 +422,4 @@ void guiScrollBar::refreshControls()
|
|||||||
bool visible = (border_size != 0);
|
bool visible = (border_size != 0);
|
||||||
up_button->setVisible(visible);
|
up_button->setVisible(visible);
|
||||||
down_button->setVisible(visible);
|
down_button->setVisible(visible);
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@ public:
|
|||||||
virtual void draw();
|
virtual void draw();
|
||||||
virtual void updateAbsolutePosition();
|
virtual void updateAbsolutePosition();
|
||||||
virtual bool OnEvent(const SEvent &event);
|
virtual bool OnEvent(const SEvent &event);
|
||||||
virtual void OnPostRender(u32 timeMs);
|
|
||||||
|
|
||||||
s32 getMax() const { return max_pos; }
|
s32 getMax() const { return max_pos; }
|
||||||
s32 getMin() const { return min_pos; }
|
s32 getMin() const { return min_pos; }
|
||||||
@ -60,7 +59,6 @@ private:
|
|||||||
s32 max_pos;
|
s32 max_pos;
|
||||||
s32 small_step;
|
s32 small_step;
|
||||||
s32 large_step;
|
s32 large_step;
|
||||||
s32 desired_pos;
|
|
||||||
u32 last_change;
|
u32 last_change;
|
||||||
s32 drag_offset;
|
s32 drag_offset;
|
||||||
s32 page_size;
|
s32 page_size;
|
||||||
@ -68,4 +66,4 @@ private:
|
|||||||
|
|
||||||
core::rect<s32> slider_rect;
|
core::rect<s32> slider_rect;
|
||||||
video::SColor current_icon_color;
|
video::SColor current_icon_color;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user