summaryrefslogtreecommitdiff
path: root/scene/gui/scroll_container.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scene/gui/scroll_container.cpp')
-rw-r--r--scene/gui/scroll_container.cpp310
1 files changed, 141 insertions, 169 deletions
diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp
index 2296c9742d..c543b783b9 100644
--- a/scene/gui/scroll_container.cpp
+++ b/scene/gui/scroll_container.cpp
@@ -35,10 +35,9 @@ bool ScrollContainer::clips_input() const {
Size2 ScrollContainer::get_minimum_size() const {
-
Size2 min_size;
- for(int i=0;i<get_child_count();i++) {
+ for (int i = 0; i < get_child_count(); i++) {
Control *c = get_child(i)->cast_to<Control>();
if (!c)
@@ -49,161 +48,150 @@ Size2 ScrollContainer::get_minimum_size() const {
continue;
Size2 minsize = c->get_combined_minimum_size();
-
if (!scroll_h) {
min_size.x = MAX(min_size.x, minsize.x);
}
if (!scroll_v) {
min_size.y = MAX(min_size.y, minsize.y);
-
}
}
if (h_scroll->is_visible_in_tree()) {
- min_size.y+=h_scroll->get_minimum_size().y;
+ min_size.y += h_scroll->get_minimum_size().y;
}
if (v_scroll->is_visible_in_tree()) {
- min_size.x+=v_scroll->get_minimum_size().x;
+ min_size.x += v_scroll->get_minimum_size().x;
}
return min_size;
};
-
void ScrollContainer::_cancel_drag() {
set_fixed_process(false);
- drag_touching_deaccel=false;
- drag_touching=false;
- drag_speed=Vector2();
- drag_accum=Vector2();
- last_drag_accum=Vector2();
- drag_from=Vector2();
+ drag_touching_deaccel = false;
+ drag_touching = false;
+ drag_speed = Vector2();
+ drag_accum = Vector2();
+ last_drag_accum = Vector2();
+ drag_from = Vector2();
}
-void ScrollContainer::_gui_input(const InputEvent& p_gui_input) {
+void ScrollContainer::_gui_input(const InputEvent &p_gui_input) {
-
- switch(p_gui_input.type) {
+ switch (p_gui_input.type) {
case InputEvent::MOUSE_BUTTON: {
- const InputEventMouseButton &mb=p_gui_input.mouse_button;
+ const InputEventMouseButton &mb = p_gui_input.mouse_button;
- if (mb.button_index==BUTTON_WHEEL_UP && mb.pressed) {
- if (h_scroll->is_visible_in_tree() && !v_scroll->is_visible_in_tree()){
+ if (mb.button_index == BUTTON_WHEEL_UP && mb.pressed) {
+ if (h_scroll->is_visible_in_tree() && !v_scroll->is_visible_in_tree()) {
// only horizontal is enabled, scroll horizontally
- h_scroll->set_value( h_scroll->get_value()-h_scroll->get_page()/8 );
+ h_scroll->set_value(h_scroll->get_value() - h_scroll->get_page() / 8);
} else if (v_scroll->is_visible_in_tree()) {
- v_scroll->set_value( v_scroll->get_value()-v_scroll->get_page()/8 );
+ v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() / 8);
}
}
- if (mb.button_index==BUTTON_WHEEL_DOWN && mb.pressed) {
- if (h_scroll->is_visible_in_tree() && !v_scroll->is_visible_in_tree()){
+ if (mb.button_index == BUTTON_WHEEL_DOWN && mb.pressed) {
+ if (h_scroll->is_visible_in_tree() && !v_scroll->is_visible_in_tree()) {
// only horizontal is enabled, scroll horizontally
- h_scroll->set_value( h_scroll->get_value()+h_scroll->get_page()/8 );
+ h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() / 8);
} else if (v_scroll->is_visible_in_tree()) {
- v_scroll->set_value( v_scroll->get_value()+v_scroll->get_page()/8 );
+ v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() / 8);
}
}
- if(!OS::get_singleton()->has_touchscreen_ui_hint())
+ if (!OS::get_singleton()->has_touchscreen_ui_hint())
return;
- if (mb.button_index!=BUTTON_LEFT)
+ if (mb.button_index != BUTTON_LEFT)
break;
if (mb.pressed) {
if (drag_touching) {
set_fixed_process(false);
- drag_touching_deaccel=false;
- drag_touching=false;
- drag_speed=Vector2();
- drag_accum=Vector2();
- last_drag_accum=Vector2();
- drag_from=Vector2();
+ drag_touching_deaccel = false;
+ drag_touching = false;
+ drag_speed = Vector2();
+ drag_accum = Vector2();
+ last_drag_accum = Vector2();
+ drag_from = Vector2();
}
if (true) {
- drag_speed=Vector2();
- drag_accum=Vector2();
- last_drag_accum=Vector2();
- drag_from=Vector2(h_scroll->get_value(),v_scroll->get_value());
- drag_touching=OS::get_singleton()->has_touchscreen_ui_hint();
- drag_touching_deaccel=false;
- time_since_motion=0;
+ drag_speed = Vector2();
+ drag_accum = Vector2();
+ last_drag_accum = Vector2();
+ drag_from = Vector2(h_scroll->get_value(), v_scroll->get_value());
+ drag_touching = OS::get_singleton()->has_touchscreen_ui_hint();
+ drag_touching_deaccel = false;
+ time_since_motion = 0;
if (drag_touching) {
set_fixed_process(true);
- time_since_motion=0;
-
+ time_since_motion = 0;
}
}
-
} else {
if (drag_touching) {
- if (drag_speed==Vector2()) {
- drag_touching_deaccel=false;
- drag_touching=false;
+ if (drag_speed == Vector2()) {
+ drag_touching_deaccel = false;
+ drag_touching = false;
set_fixed_process(false);
} else {
- drag_touching_deaccel=true;
+ drag_touching_deaccel = true;
}
}
}
-
} break;
case InputEvent::MOUSE_MOTION: {
- const InputEventMouseMotion &mm=p_gui_input.mouse_motion;
+ const InputEventMouseMotion &mm = p_gui_input.mouse_motion;
- if (drag_touching && ! drag_touching_deaccel) {
+ if (drag_touching && !drag_touching_deaccel) {
- Vector2 motion = Vector2(mm.relative_x,mm.relative_y);
- drag_accum-=motion;
- Vector2 diff = drag_from+drag_accum;
+ Vector2 motion = Vector2(mm.relative_x, mm.relative_y);
+ drag_accum -= motion;
+ Vector2 diff = drag_from + drag_accum;
if (scroll_h)
h_scroll->set_value(diff.x);
else
- drag_accum.x=0;
+ drag_accum.x = 0;
if (scroll_v)
v_scroll->set_value(diff.y);
else
- drag_accum.y=0;
- time_since_motion=0;
+ drag_accum.y = 0;
+ time_since_motion = 0;
}
} break;
}
-
}
-
void ScrollContainer::_update_scrollbar_pos() {
Size2 hmin = h_scroll->get_combined_minimum_size();
Size2 vmin = v_scroll->get_combined_minimum_size();
- v_scroll->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,vmin.width);
- v_scroll->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,0);
- v_scroll->set_anchor_and_margin(MARGIN_TOP,ANCHOR_BEGIN,0);
- v_scroll->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,0);
+ v_scroll->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_END, vmin.width);
+ v_scroll->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, 0);
+ v_scroll->set_anchor_and_margin(MARGIN_TOP, ANCHOR_BEGIN, 0);
+ v_scroll->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, 0);
- h_scroll->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,0);
- h_scroll->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,0);
- h_scroll->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,hmin.height);
- h_scroll->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,0);
+ h_scroll->set_anchor_and_margin(MARGIN_LEFT, ANCHOR_BEGIN, 0);
+ h_scroll->set_anchor_and_margin(MARGIN_RIGHT, ANCHOR_END, 0);
+ h_scroll->set_anchor_and_margin(MARGIN_TOP, ANCHOR_END, hmin.height);
+ h_scroll->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, 0);
h_scroll->raise();
v_scroll->raise();
-
}
-
void ScrollContainer::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
@@ -211,18 +199,17 @@ void ScrollContainer::_notification(int p_what) {
call_deferred("_update_scrollbar_pos");
};
-
- if (p_what==NOTIFICATION_SORT_CHILDREN) {
+ if (p_what == NOTIFICATION_SORT_CHILDREN) {
child_max_size = Size2(0, 0);
Size2 size = get_size();
if (h_scroll->is_visible_in_tree())
- size.y-=h_scroll->get_minimum_size().y;
+ size.y -= h_scroll->get_minimum_size().y;
if (v_scroll->is_visible_in_tree())
- size.x-=h_scroll->get_minimum_size().x;
+ size.x -= h_scroll->get_minimum_size().x;
- for(int i=0;i<get_child_count();i++) {
+ for (int i = 0; i < get_child_count(); i++) {
Control *c = get_child(i)->cast_to<Control>();
if (!c)
@@ -235,24 +222,23 @@ void ScrollContainer::_notification(int p_what) {
child_max_size.x = MAX(child_max_size.x, minsize.x);
child_max_size.y = MAX(child_max_size.y, minsize.y);
- Rect2 r = Rect2(-scroll,minsize);
- if (!scroll_h || (!h_scroll->is_visible_in_tree() && c->get_h_size_flags()&SIZE_EXPAND)) {
- r.pos.x=0;
- if (c->get_h_size_flags()&SIZE_EXPAND)
- r.size.width=MAX(size.width,minsize.width);
+ Rect2 r = Rect2(-scroll, minsize);
+ if (!scroll_h || (!h_scroll->is_visible_in_tree() && c->get_h_size_flags() & SIZE_EXPAND)) {
+ r.pos.x = 0;
+ if (c->get_h_size_flags() & SIZE_EXPAND)
+ r.size.width = MAX(size.width, minsize.width);
else
- r.size.width=minsize.width;
+ r.size.width = minsize.width;
}
- if (!scroll_v || (!v_scroll->is_visible_in_tree() && c->get_v_size_flags()&SIZE_EXPAND)) {
- r.pos.y=0;
- r.size.height=size.height;
- if (c->get_v_size_flags()&SIZE_EXPAND)
- r.size.height=MAX(size.height,minsize.height);
+ if (!scroll_v || (!v_scroll->is_visible_in_tree() && c->get_v_size_flags() & SIZE_EXPAND)) {
+ r.pos.y = 0;
+ r.size.height = size.height;
+ if (c->get_v_size_flags() & SIZE_EXPAND)
+ r.size.height = MAX(size.height, minsize.height);
else
- r.size.height=minsize.height;
-
+ r.size.height = minsize.height;
}
- fit_child_in_rect(c,r);
+ fit_child_in_rect(c, r);
}
update();
};
@@ -260,37 +246,36 @@ void ScrollContainer::_notification(int p_what) {
if (p_what == NOTIFICATION_DRAW) {
update_scrollbars();
-
}
- if (p_what==NOTIFICATION_FIXED_PROCESS) {
+ if (p_what == NOTIFICATION_FIXED_PROCESS) {
- if (drag_touching) {
+ if (drag_touching) {
if (drag_touching_deaccel) {
- Vector2 pos = Vector2(h_scroll->get_value(),v_scroll->get_value());
- pos+=drag_speed*get_fixed_process_delta_time();
+ Vector2 pos = Vector2(h_scroll->get_value(), v_scroll->get_value());
+ pos += drag_speed * get_fixed_process_delta_time();
- bool turnoff_h=false;
- bool turnoff_v=false;
+ bool turnoff_h = false;
+ bool turnoff_v = false;
- if (pos.x<0) {
- pos.x=0;
- turnoff_h=true;
+ if (pos.x < 0) {
+ pos.x = 0;
+ turnoff_h = true;
}
- if (pos.x > (h_scroll->get_max()-h_scroll->get_page())) {
- pos.x=h_scroll->get_max()-h_scroll->get_page();
- turnoff_h=true;
+ if (pos.x > (h_scroll->get_max() - h_scroll->get_page())) {
+ pos.x = h_scroll->get_max() - h_scroll->get_page();
+ turnoff_h = true;
}
- if (pos.y<0) {
- pos.y=0;
- turnoff_v=true;
+ if (pos.y < 0) {
+ pos.y = 0;
+ turnoff_v = true;
}
- if (pos.y > (v_scroll->get_max()-v_scroll->get_page())) {
- pos.y=v_scroll->get_max()-v_scroll->get_page();
- turnoff_v=true;
+ if (pos.y > (v_scroll->get_max() - v_scroll->get_page())) {
+ pos.y = v_scroll->get_max() - v_scroll->get_page();
+ turnoff_v = true;
}
if (scroll_h)
@@ -298,48 +283,43 @@ void ScrollContainer::_notification(int p_what) {
if (scroll_v)
v_scroll->set_value(pos.y);
- float sgn_x = drag_speed.x<0? -1 : 1;
+ float sgn_x = drag_speed.x < 0 ? -1 : 1;
float val_x = Math::abs(drag_speed.x);
- val_x-=1000*get_fixed_process_delta_time();
+ val_x -= 1000 * get_fixed_process_delta_time();
- if (val_x<0) {
- turnoff_h=true;
+ if (val_x < 0) {
+ turnoff_h = true;
}
-
- float sgn_y = drag_speed.y<0? -1 : 1;
+ float sgn_y = drag_speed.y < 0 ? -1 : 1;
float val_y = Math::abs(drag_speed.y);
- val_y-=1000*get_fixed_process_delta_time();
+ val_y -= 1000 * get_fixed_process_delta_time();
- if (val_y<0) {
- turnoff_v=true;
+ if (val_y < 0) {
+ turnoff_v = true;
}
-
- drag_speed=Vector2(sgn_x*val_x,sgn_y*val_y);
+ drag_speed = Vector2(sgn_x * val_x, sgn_y * val_y);
if (turnoff_h && turnoff_v) {
set_fixed_process(false);
- drag_touching=false;
- drag_touching_deaccel=false;
+ drag_touching = false;
+ drag_touching_deaccel = false;
}
-
} else {
-
- if (time_since_motion==0 || time_since_motion>0.1) {
+ if (time_since_motion == 0 || time_since_motion > 0.1) {
Vector2 diff = drag_accum - last_drag_accum;
- last_drag_accum=drag_accum;
- drag_speed=diff/get_fixed_process_delta_time();
+ last_drag_accum = drag_accum;
+ drag_speed = diff / get_fixed_process_delta_time();
}
- time_since_motion+=get_fixed_process_delta_time();
+ time_since_motion += get_fixed_process_delta_time();
}
}
}
-
};
void ScrollContainer::update_scrollbars() {
@@ -354,66 +334,62 @@ void ScrollContainer::update_scrollbars() {
if (!scroll_v || min.height <= size.height - hmin.height) {
v_scroll->hide();
- scroll.y=0;
+ scroll.y = 0;
} else {
v_scroll->show();
- scroll.y=v_scroll->get_value();
-
+ scroll.y = v_scroll->get_value();
}
v_scroll->set_max(min.height);
v_scroll->set_page(size.height - hmin.height);
-
if (!scroll_h || min.width <= size.width - vmin.width) {
h_scroll->hide();
- scroll.x=0;
+ scroll.x = 0;
} else {
h_scroll->show();
h_scroll->set_max(min.width);
h_scroll->set_page(size.width - vmin.width);
- scroll.x=h_scroll->get_value();
+ scroll.x = h_scroll->get_value();
}
}
void ScrollContainer::_scroll_moved(float) {
- scroll.x=h_scroll->get_value();
- scroll.y=v_scroll->get_value();
+ scroll.x = h_scroll->get_value();
+ scroll.y = v_scroll->get_value();
queue_sort();
update();
};
-
void ScrollContainer::set_enable_h_scroll(bool p_enable) {
- scroll_h=p_enable;
+ scroll_h = p_enable;
queue_sort();
}
-bool ScrollContainer::is_h_scroll_enabled() const{
+bool ScrollContainer::is_h_scroll_enabled() const {
return scroll_h;
}
void ScrollContainer::set_enable_v_scroll(bool p_enable) {
- scroll_v=p_enable;
+ scroll_v = p_enable;
queue_sort();
}
-bool ScrollContainer::is_v_scroll_enabled() const{
+bool ScrollContainer::is_v_scroll_enabled() const {
return scroll_v;
}
int ScrollContainer::get_v_scroll() const {
-
return v_scroll->get_value();
}
void ScrollContainer::set_v_scroll(int p_pos) {
@@ -430,14 +406,13 @@ void ScrollContainer::set_h_scroll(int p_pos) {
h_scroll->set_value(p_pos);
_cancel_drag();
-
}
String ScrollContainer::get_configuration_warning() const {
- int found=0;
+ int found = 0;
- for(int i=0;i<get_child_count();i++) {
+ for (int i = 0; i < get_child_count(); i++) {
Control *c = get_child(i)->cast_to<Control>();
if (!c)
@@ -450,31 +425,29 @@ String ScrollContainer::get_configuration_warning() const {
found++;
}
- if (found!=1)
+ if (found != 1)
return TTR("ScrollContainer is intended to work with a single child control.\nUse a container as child (VBox,HBox,etc), or a Control and set the custom minimum size manually.");
else
return "";
}
-
void ScrollContainer::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_scroll_moved"),&ScrollContainer::_scroll_moved);
- ClassDB::bind_method(D_METHOD("_gui_input"),&ScrollContainer::_gui_input);
- ClassDB::bind_method(D_METHOD("set_enable_h_scroll","enable"),&ScrollContainer::set_enable_h_scroll);
- ClassDB::bind_method(D_METHOD("is_h_scroll_enabled"),&ScrollContainer::is_h_scroll_enabled);
- ClassDB::bind_method(D_METHOD("set_enable_v_scroll","enable"),&ScrollContainer::set_enable_v_scroll);
- ClassDB::bind_method(D_METHOD("is_v_scroll_enabled"),&ScrollContainer::is_v_scroll_enabled);
- ClassDB::bind_method(D_METHOD("_update_scrollbar_pos"),&ScrollContainer::_update_scrollbar_pos);
- ClassDB::bind_method(D_METHOD("set_h_scroll","val"),&ScrollContainer::set_h_scroll);
- ClassDB::bind_method(D_METHOD("get_h_scroll"),&ScrollContainer::get_h_scroll);
- ClassDB::bind_method(D_METHOD("set_v_scroll","val"),&ScrollContainer::set_v_scroll);
- ClassDB::bind_method(D_METHOD("get_v_scroll"),&ScrollContainer::get_v_scroll);
-
- ADD_GROUP("Scroll","scroll_");
- ADD_PROPERTY( PropertyInfo( Variant::BOOL, "scroll_horizontal"), "set_enable_h_scroll","is_h_scroll_enabled");
- ADD_PROPERTY( PropertyInfo( Variant::BOOL, "scroll_vertical"), "set_enable_v_scroll","is_v_scroll_enabled");
-
+ ClassDB::bind_method(D_METHOD("_scroll_moved"), &ScrollContainer::_scroll_moved);
+ ClassDB::bind_method(D_METHOD("_gui_input"), &ScrollContainer::_gui_input);
+ ClassDB::bind_method(D_METHOD("set_enable_h_scroll", "enable"), &ScrollContainer::set_enable_h_scroll);
+ ClassDB::bind_method(D_METHOD("is_h_scroll_enabled"), &ScrollContainer::is_h_scroll_enabled);
+ ClassDB::bind_method(D_METHOD("set_enable_v_scroll", "enable"), &ScrollContainer::set_enable_v_scroll);
+ ClassDB::bind_method(D_METHOD("is_v_scroll_enabled"), &ScrollContainer::is_v_scroll_enabled);
+ ClassDB::bind_method(D_METHOD("_update_scrollbar_pos"), &ScrollContainer::_update_scrollbar_pos);
+ ClassDB::bind_method(D_METHOD("set_h_scroll", "val"), &ScrollContainer::set_h_scroll);
+ ClassDB::bind_method(D_METHOD("get_h_scroll"), &ScrollContainer::get_h_scroll);
+ ClassDB::bind_method(D_METHOD("set_v_scroll", "val"), &ScrollContainer::set_v_scroll);
+ ClassDB::bind_method(D_METHOD("get_v_scroll"), &ScrollContainer::get_v_scroll);
+
+ ADD_GROUP("Scroll", "scroll_");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_horizontal"), "set_enable_h_scroll", "is_h_scroll_enabled");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_vertical"), "set_enable_v_scroll", "is_v_scroll_enabled");
};
ScrollContainer::ScrollContainer() {
@@ -487,15 +460,14 @@ ScrollContainer::ScrollContainer() {
v_scroll->set_name("_v_scroll");
add_child(v_scroll);
- h_scroll->connect("value_changed", this,"_scroll_moved");
- v_scroll->connect("value_changed", this,"_scroll_moved");
+ h_scroll->connect("value_changed", this, "_scroll_moved");
+ v_scroll->connect("value_changed", this, "_scroll_moved");
- drag_speed=Vector2();
- drag_touching=false;
- drag_touching_deaccel=false;
- scroll_h=true;
- scroll_v=true;
+ drag_speed = Vector2();
+ drag_touching = false;
+ drag_touching_deaccel = false;
+ scroll_h = true;
+ scroll_v = true;
set_clip_contents(true);
};
-