diff options
Diffstat (limited to 'scene')
| -rw-r--r-- | scene/2d/physics_body_2d.cpp | 18 | ||||
| -rw-r--r-- | scene/3d/remote_transform.cpp | 36 | ||||
| -rw-r--r-- | scene/gui/base_button.cpp | 11 | ||||
| -rw-r--r-- | scene/gui/base_button.h | 1 | ||||
| -rw-r--r-- | scene/gui/file_dialog.cpp | 3 | ||||
| -rw-r--r-- | scene/gui/tree.cpp | 17 | ||||
| -rw-r--r-- | scene/gui/tree.h | 2 | ||||
| -rw-r--r-- | scene/main/viewport.cpp | 7 | ||||
| -rw-r--r-- | scene/main/viewport.h | 1 |
9 files changed, 62 insertions, 34 deletions
diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 3dde228bfa..c440512c84 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -1279,7 +1279,6 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const colliders.push_back(collision); motion = collision.remainder; - bool is_on_slope = false; if (p_floor_direction == Vector2()) { //all is a wall on_wall = true; @@ -1291,16 +1290,14 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const floor_velocity = collision.collider_vel; if (p_stop_on_slope) { - if (Vector2() == lv_n + p_floor_direction) { + if (Vector2() == lv_n + p_floor_direction && collision.travel.length() < 1) { Transform2D gt = get_global_transform(); - gt.elements[2] -= collision.travel; + gt.elements[2] -= collision.travel.project(p_floor_direction.tangent()); set_global_transform(gt); return Vector2(); } } - is_on_slope = true; - } else if (collision.normal.dot(-p_floor_direction) >= Math::cos(p_floor_max_angle + FLOOR_ANGLE_THRESHOLD)) { //ceiling on_ceiling = true; } else { @@ -1308,14 +1305,9 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const } } - if (p_stop_on_slope && is_on_slope) { - motion = motion.slide(p_floor_direction); - lv = lv.slide(p_floor_direction); - } else { - Vector2 n = collision.normal; - motion = motion.slide(n); - lv = lv.slide(n); - } + Vector2 n = collision.normal; + motion = motion.slide(n); + lv = lv.slide(n); } if (p_stop_on_slope) diff --git a/scene/3d/remote_transform.cpp b/scene/3d/remote_transform.cpp index c12e49fb47..490fcf24fd 100644 --- a/scene/3d/remote_transform.cpp +++ b/scene/3d/remote_transform.cpp @@ -63,38 +63,40 @@ void RemoteTransform::_update_remote() { if (update_remote_position && update_remote_rotation && update_remote_scale) { n->set_global_transform(get_global_transform()); } else { - Transform n_trans = n->get_global_transform(); Transform our_trans = get_global_transform(); - if (!update_remote_position) - our_trans.set_origin(n_trans.get_origin()); + if (update_remote_rotation) + n->set_rotation(our_trans.basis.get_rotation()); - n->set_global_transform(our_trans); + if (update_remote_scale) + n->set_scale(our_trans.basis.get_scale()); - if (!update_remote_rotation) - n->set_rotation(n_trans.basis.get_rotation()); + if (update_remote_position) { + Transform n_trans = n->get_global_transform(); - if (!update_remote_scale) - n->set_scale(n_trans.basis.get_scale()); + n_trans.set_origin(our_trans.get_origin()); + n->set_global_transform(n_trans); + } } } else { if (update_remote_position && update_remote_rotation && update_remote_scale) { - n->set_global_transform(get_global_transform()); + n->set_transform(get_transform()); } else { - Transform n_trans = n->get_transform(); Transform our_trans = get_transform(); - if (!update_remote_position) - our_trans.set_origin(n_trans.get_origin()); + if (update_remote_rotation) + n->set_rotation(our_trans.basis.get_rotation()); - n->set_transform(our_trans); + if (update_remote_scale) + n->set_scale(our_trans.basis.get_scale()); - if (!update_remote_rotation) - n->set_rotation(n_trans.basis.get_rotation()); + if (update_remote_position) { + Transform n_trans = n->get_transform(); - if (!update_remote_scale) - n->set_scale(n_trans.basis.get_scale()); + n_trans.set_origin(our_trans.get_origin()); + n->set_transform(n_trans); + } } } } diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index 1ac19774f7..dc85c8e641 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -595,6 +595,16 @@ void ButtonGroup::get_buttons(List<BaseButton *> *r_buttons) { } } +Array ButtonGroup::_get_buttons() { + + Array btns; + for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { + btns.push_back(E->get()); + } + + return btns; +} + BaseButton *ButtonGroup::get_pressed_button() { for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { @@ -608,6 +618,7 @@ BaseButton *ButtonGroup::get_pressed_button() { void ButtonGroup::_bind_methods() { ClassDB::bind_method(D_METHOD("get_pressed_button"), &ButtonGroup::get_pressed_button); + ClassDB::bind_method(D_METHOD("get_buttons"), &ButtonGroup::_get_buttons); } ButtonGroup::ButtonGroup() { diff --git a/scene/gui/base_button.h b/scene/gui/base_button.h index a131e719ad..272c07f68a 100644 --- a/scene/gui/base_button.h +++ b/scene/gui/base_button.h @@ -143,6 +143,7 @@ protected: public: BaseButton *get_pressed_button(); void get_buttons(List<BaseButton *> *r_buttons); + Array _get_buttons(); ButtonGroup(); }; diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 1e9f4df4a3..a869f7cfcd 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "file_dialog.h" + #include "core/os/keyboard.h" #include "core/print_string.h" #include "scene/gui/label.h" @@ -596,7 +597,7 @@ void FileDialog::set_current_file(const String &p_file) { int lp = p_file.find_last("."); if (lp != -1) { file->select(0, lp); - if (file->is_inside_tree()) + if (file->is_inside_tree() && !get_tree()->is_node_being_edited(file)) file->grab_focus(); } } diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index f441364c44..479b035f86 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2701,6 +2701,7 @@ bool Tree::edit_selected() { Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2); Point2i textedpos = get_global_position() + rect.position - ofs; + cache.text_editor_position = textedpos; text_editor->set_position(textedpos); text_editor->set_size(rect.size); text_editor->clear(); @@ -2956,6 +2957,21 @@ void Tree::_notification(int p_what) { if (p_what == NOTIFICATION_THEME_CHANGED) { update_cache(); } + + if (p_what == NOTIFICATION_RESIZED || p_what == NOTIFICATION_TRANSFORM_CHANGED) { + + if (popup_edited_item != NULL) { + Rect2 rect = popup_edited_item->get_meta("__focus_rect"); + Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2); + Point2i textedpos = get_global_position() + rect.position - ofs; + + if (cache.text_editor_position != textedpos) { + cache.text_editor_position = textedpos; + text_editor->set_position(textedpos); + value_editor->set_position(textedpos + Point2i(0, text_editor->get_size().height)); + } + } + } } Size2 Tree::get_minimum_size() const { @@ -3884,6 +3900,7 @@ Tree::Tree() { value_editor->set_as_toplevel(true); text_editor->set_as_toplevel(true); + set_notify_transform(true); updating_value_editor = false; pressed_button = -1; diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 886ce66e2c..8622184bf8 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -457,6 +457,8 @@ private: TreeItem *hover_item; int hover_cell; + Point2i text_editor_position; + } cache; int _get_title_button_height() const; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 5b1c2d8020..b220df6ce1 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1727,6 +1727,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { gui.mouse_focus = _gui_find_control(pos); gui.mouse_focus_mask = 1 << (mb->get_button_index() - 1); + gui.last_mouse_focus = gui.mouse_focus; if (!gui.mouse_focus) { return; @@ -2114,14 +2115,14 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { set_input_as_handled(); return; } - } else if (gui.mouse_focus) { + } else if (touch_event->get_index() == 0 && gui.last_mouse_focus) { - if (gui.mouse_focus->can_process()) { + if (gui.last_mouse_focus->can_process()) { touch_event = touch_event->xformed_by(Transform2D()); //make a copy touch_event->set_position(gui.focus_inv_xform.xform(pos)); - _gui_call_input(gui.mouse_focus, touch_event); + _gui_call_input(gui.last_mouse_focus, touch_event); } set_input_as_handled(); return; diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 278350b1c9..6b6ca3b7db 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -271,6 +271,7 @@ private: bool key_event_accepted; Control *mouse_focus; + Control *last_mouse_focus; Control *mouse_click_grabber; int mouse_focus_mask; Control *key_focus; |