diff options
Diffstat (limited to 'editor')
31 files changed, 281 insertions, 225 deletions
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index aca2f59134..34881c8aff 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -1454,7 +1454,7 @@ void EditorNode::_edit_current() { } } else if (current_res->get_path().is_resource_file()) { if (FileAccess::exists(current_res->get_path() + ".import")) { - editable_warning = TTR("This resource was imported, so it's not editable. Change it's settings in the import panel and re-import."); + editable_warning = TTR("This resource was imported, so it's not editable. Change its settings in the import panel and then re-import."); } } } else if (is_node) { @@ -5691,12 +5691,12 @@ void EditorPluginList::edit(Object *p_object) { } } -bool EditorPluginList::forward_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { +bool EditorPluginList::forward_gui_input(const Ref<InputEvent> &p_event) { bool discard = false; for (int i = 0; i < plugins_list.size(); i++) { - if (plugins_list[i]->forward_canvas_gui_input(p_canvas_xform, p_event)) { + if (plugins_list[i]->forward_canvas_gui_input(p_event)) { discard = true; } } @@ -5720,10 +5720,10 @@ bool EditorPluginList::forward_spatial_gui_input(Camera *p_camera, const Ref<Inp return discard; } -void EditorPluginList::forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas) { +void EditorPluginList::forward_draw_over_canvas(Control *p_canvas) { for (int i = 0; i < plugins_list.size(); i++) { - plugins_list[i]->forward_draw_over_canvas(p_canvas_xform, p_canvas); + plugins_list[i]->forward_draw_over_canvas(p_canvas); } } diff --git a/editor/editor_node.h b/editor/editor_node.h index 0d1c6787cd..32d46e686b 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -812,9 +812,9 @@ public: void make_visible(bool p_visible); void edit(Object *p_object); - bool forward_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event); + bool forward_gui_input(const Ref<InputEvent> &p_event); bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event, bool serve_when_force_input_enabled); - void forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas); + void forward_draw_over_canvas(Control *p_canvas); void add_plugin(EditorPlugin *p_plugin); void clear(); bool empty(); diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp index a528662e0f..229d6adfef 100644 --- a/editor/editor_plugin.cpp +++ b/editor/editor_plugin.cpp @@ -402,18 +402,18 @@ Ref<SpatialEditorGizmo> EditorPlugin::create_spatial_gizmo(Spatial *p_spatial) { return Ref<SpatialEditorGizmo>(); } -bool EditorPlugin::forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { +bool EditorPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { if (get_script_instance() && get_script_instance()->has_method("forward_canvas_gui_input")) { - return get_script_instance()->call("forward_canvas_gui_input", p_canvas_xform, p_event); + return get_script_instance()->call("forward_canvas_gui_input", p_event); } return false; } -void EditorPlugin::forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas) { +void EditorPlugin::forward_draw_over_canvas(Control *p_canvas) { if (get_script_instance() && get_script_instance()->has_method("forward_draw_over_canvas")) { - get_script_instance()->call("forward_draw_over_canvas", p_canvas_xform, p_canvas); + get_script_instance()->call("forward_draw_over_canvas", p_canvas); } } diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h index 18530e9ce4..1d68eee117 100644 --- a/editor/editor_plugin.h +++ b/editor/editor_plugin.h @@ -156,8 +156,8 @@ public: void notify_scene_closed(const String &scene_filepath); virtual Ref<SpatialEditorGizmo> create_spatial_gizmo(Spatial *p_spatial); - virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event); - virtual void forward_draw_over_canvas(const Transform2D &p_canvas_xform, Control *p_canvas); + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event); + virtual void forward_draw_over_canvas(Control *p_canvas); virtual bool forward_spatial_gui_input(Camera *p_camera, const Ref<InputEvent> &p_event); virtual String get_name() const; virtual bool has_main_screen() const; diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 13ed7a7f30..992322978e 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -392,7 +392,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { editor_register_and_generate_icons(theme, dark_theme, thumb_size); } // thumbnail size has changed, so we regenerate the medium sizes - if (p_theme != NULL && fabs(p_theme->get_constant("thumb_size", "Editor") - thumb_size) > 0.00001) { + if (p_theme != NULL && fabs((double)p_theme->get_constant("thumb_size", "Editor") - thumb_size) > 0.00001) { editor_register_and_generate_icons(p_theme, dark_theme, thumb_size, true); } diff --git a/editor/icons/icon_viewport_speed.svg b/editor/icons/icon_viewport_speed.svg new file mode 100644 index 0000000000..e64b5a8059 --- /dev/null +++ b/editor/icons/icon_viewport_speed.svg @@ -0,0 +1,4 @@ +<svg width="16" height="16" version="1.1" viewBox="0 0 4.2333333 4.2333333" xmlns="http://www.w3.org/2000/svg"> +<path d="m1.5875 0c-0.28858 0-0.52917 0.24059-0.52917 0.52917v0.61132c-0.085589-0.051-0.18113-0.0891-0.28525-0.0853-0.34849 0.0127-0.5952 0.37346-0.48059 0.70278l0.26355 0.79066c0.048664 0.14623 0.15979 0.24805 0.29249 0.30644l-0.60927 0.40669c-0.13121 0.0845-0.22102 0.22389-0.24133 0.3633-0.020312 0.13941 0.017471 0.26985 0.087333 0.37465s0.17614 0.19045 0.31264 0.22532c0.13634 0.0348 0.29946 6e-3 0.42788-0.0827h5.159e-4l1.0852-0.72348 0.26097 0.52192c0.11682 0.23391 0.39274 0.34829 0.64079 0.26561l0.79375-0.26458-0.00775 3e-3c0.15105-0.0454 0.27732-0.15615 0.33486-0.2863 0.057538-0.13015 0.055144-0.26773 0.014986-0.38809-0.03156-0.0946-0.10972-0.1687-0.19275-0.23617 0.069099-0.0546 0.1445-0.10364 0.18035-0.19325 0.051761-0.12941 0.045257-0.29292-0.02377-0.43098l-0.26459-0.52946c-0.089407-0.17933-0.27348-0.29308-0.47335-0.29305h-0.1111c0.052029-0.0817 0.1111-0.16214 0.1111-0.26458v-0.79375c0-0.28858-0.24059-0.52917-0.52917-0.52917z" color="#000000" color-rendering="auto" dominant-baseline="auto" image-rendering="auto" shape-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/> +<path d="m1.5875 0.26458c-0.14658 0-0.26458 0.118-0.26458 0.26459v0.79375c0 0.14658 0.118 0.26458 0.26458 0.26458h0.26458v0.262a0.26461 0.26461 0 0 0 -0.083716 0.0165l-0.5426 0.18086-0.18087-0.5426a0.26461 0.26461 0 0 0 -0.262 -0.18448 0.26461 0.26461 0 0 0 -0.2403 0.3514l0.26458 0.79375a0.26461 0.26461 0 0 0 0.33486 0.16743l0.44545-0.14831v0.16174c0 0.0108 0.00495 0.02 0.0062 0.0305l-1.2113 0.80771a0.26461 0.26461 0 1 0 0.29352 0.44028l1.3379-0.89194 0.39532 0.79014a0.26461 0.26461 0 0 0 0.32039 0.1328l0.79375-0.26458a0.26461 0.26461 0 1 0 -0.16743 -0.50175l-0.57619 0.19172-0.25787-0.51625c0.072998-0.047 0.12402-0.12495 0.12402-0.21859v-0.26458h0.36587l0.1912 0.38292a0.26461 0.26461 0 1 0 0.47336 -0.23668l-0.26458-0.52916a0.26461 0.26461 0 0 0 -0.23668 -0.14625h-0.79375v-0.26458h0.26458c0.14658 0 0.26458-0.118 0.26458-0.26458v-0.79375c0-0.14659-0.118-0.26459-0.26458-0.26459zm0 0.52917h0.26458v0.52917h-0.26458z" fill="#fff" fill-opacity=".99608"/> +</svg> diff --git a/editor/icons/icon_viewport_zoom.svg b/editor/icons/icon_viewport_zoom.svg new file mode 100644 index 0000000000..18d4ec32ce --- /dev/null +++ b/editor/icons/icon_viewport_zoom.svg @@ -0,0 +1,6 @@ +<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"> +<g> +<path d="m6 0c-3.3019 0-6 2.6981-6 6s2.6981 6 6 6h0.00195c0.88828 0 1.737-0.2588 2.5332-0.6367l3.8281 3.8281c0.39053 0.3904 1.0235 0.3904 1.4141 0l1.4141-1.4141c0.39033-0.3905 0.39033-1.0235 0-1.414l-3.791-3.791c0.02779-0.058 0.06588-0.1109 0.0918-0.17 0.05554-0.1268 0.08414-0.2638 0.08398-0.4023h1.4238c0.55226-1e-4 0.99994-0.4477 1-1v-1h1c0.55226-1e-4 0.99994-0.4477 1-1v-2c-5.5e-5 -0.5523-0.44774-0.9999-1-1h-1v-1c-5.5e-5 -0.5523-0.44774-0.9999-1-1h-2c-0.55226 1e-4 -0.99994 0.4477-1 1v1h-0.00977c1.44e-4 -0.3151-0.14822-0.6118-0.40039-0.8008-1.0353-0.7764-2.2938-1.1967-3.5879-1.1992h-0.00195z" color="#000000" color-rendering="auto" dominant-baseline="auto" image-rendering="auto" shape-rendering="auto" solid-color="#000000" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/> +<path d="m6 1a5 5 0 0 0 -5 5 5 5 0 0 0 5 5 5 5 0 0 0 2.752 -0.83398l4.3184 4.3184 1.4141-1.4141-4.3184-4.3184a5 5 0 0 0 0.41016 -0.75195h-0.57617v-2h-1a3 3 0 0 1 -3 3 3 3 0 0 1 -3 -3 3 3 0 0 1 3 -3 3 3 0 0 1 2 0.76758v-1.7676h0.99023a5 5 0 0 0 -2.9902 -1zm5 0v2h-2v2h2v2h2v-2h2v-2h-2v-2z" fill="#fff"/> +</g> +</svg> diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp index 2fd74d529e..ffa4e36b5a 100644 --- a/editor/plugins/abstract_polygon_2d_editor.cpp +++ b/editor/plugins/abstract_polygon_2d_editor.cpp @@ -195,9 +195,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform(); Vector2 gpoint = mb->get_position(); - Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint); - cpoint = canvas_item_editor->snap_point(cpoint); - cpoint = _get_node()->get_global_transform().affine_inverse().xform(cpoint); + Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); //first check if a point is to be added (segment split) real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8); @@ -425,15 +423,14 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) if (edited_point != -1 && (wip_active || (mm->get_button_mask() & BUTTON_MASK_LEFT))) { Vector2 gpoint = mm->get_position(); - Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint); - cpoint = canvas_item_editor->snap_point(cpoint); - edited_point_pos = _get_node()->get_global_transform().affine_inverse().xform(cpoint); + Vector2 cpoint = _get_node()->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position()))); + edited_point_pos = cpoint; if (!wip_active) { Vector<Vector2> vertices = _get_polygon(edited_polygon); ERR_FAIL_INDEX_V(edited_point, vertices.size(), false); - vertices[edited_point] = edited_point_pos - _get_offset(edited_polygon); + vertices[edited_point] = cpoint - _get_offset(edited_polygon); _set_polygon(edited_polygon, vertices); } @@ -444,8 +441,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) return false; } -void AbstractPolygon2DEditor::_canvas_draw() { - +void AbstractPolygon2DEditor::forward_draw_over_canvas(Control *p_canvas) { if (!_get_node()) return; @@ -527,9 +523,6 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) { if (_is_empty()) _menu_option(MODE_CREATE); - if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw"); - wip.clear(); wip_active = false; edited_point = -1; @@ -539,15 +532,11 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) { } else { _set_node(NULL); - - if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw"); } } void AbstractPolygon2DEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_canvas_draw"), &AbstractPolygon2DEditor::_canvas_draw); ClassDB::bind_method(D_METHOD("_node_removed"), &AbstractPolygon2DEditor::_node_removed); ClassDB::bind_method(D_METHOD("_menu_option"), &AbstractPolygon2DEditor::_menu_option); ClassDB::bind_method(D_METHOD("_create_resource"), &AbstractPolygon2DEditor::_create_resource); diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h index 86e14694da..3e3bff6d0d 100644 --- a/editor/plugins/abstract_polygon_2d_editor.h +++ b/editor/plugins/abstract_polygon_2d_editor.h @@ -75,7 +75,6 @@ protected: virtual void _menu_option(int p_option); void _wip_close(); - void _canvas_draw(); void _notification(int p_what); void _node_removed(Node *p_node); @@ -103,6 +102,8 @@ protected: public: bool forward_gui_input(const Ref<InputEvent> &p_event); + void forward_draw_over_canvas(Control *p_canvas); + void edit(Node *p_polygon); AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wip_destructive = true); }; @@ -116,7 +117,8 @@ class AbstractPolygon2DEditorPlugin : public EditorPlugin { String klass; public: - virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return polygon_editor->forward_gui_input(p_event); } + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return polygon_editor->forward_gui_input(p_event); } + virtual void forward_draw_over_canvas(Control *p_canvas) { polygon_editor->forward_draw_over_canvas(p_canvas); } bool has_main_screen() const { return false; } virtual String get_name() const { return klass; } diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 3f64e75bc8..2270421eca 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -1198,14 +1198,23 @@ void CanvasItemEditor::_update_cursor() { viewport->set_default_cursor_shape(c); } -void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) { +void CanvasItemEditor::_gui_input_viewport_base(const Ref<InputEvent> &p_event) { + + Ref<InputEventMouseMotion> m = p_event; + if (m.is_valid()) { + if (!viewport_base->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field())) + viewport_base->call_deferred("grab_focus"); + } +} + +void CanvasItemEditor::_gui_input_viewport(const Ref<InputEvent> &p_event) { { EditorNode *en = editor; EditorPluginList *over_plugin_list = en->get_editor_plugins_over(); if (!over_plugin_list->empty()) { - bool discard = over_plugin_list->forward_gui_input(transform, p_event); + bool discard = over_plugin_list->forward_gui_input(p_event); if (discard) { accept_event(); return; @@ -1224,7 +1233,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) _update_scroll(0); viewport->update(); } else { - _zoom_on_position(zoom * (1 - (0.05 * b->get_factor())), viewport_scrollable->get_transform().affine_inverse().xform(b->get_position())); + _zoom_on_position(zoom * (1 - (0.05 * b->get_factor())), b->get_position()); } return; @@ -1237,7 +1246,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) _update_scroll(0); viewport->update(); } else { - _zoom_on_position(zoom * ((0.95 + (0.05 * b->get_factor())) / 0.95), viewport_scrollable->get_transform().affine_inverse().xform(b->get_position())); + _zoom_on_position(zoom * ((0.95 + (0.05 * b->get_factor())) / 0.95), b->get_position()); } return; @@ -1320,7 +1329,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) if (b->get_button_index() == BUTTON_LEFT && tool == TOOL_EDIT_PIVOT) { if (b->is_pressed()) { // Set the pivot point - Point2 mouse_pos = viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()); + Point2 mouse_pos = b->get_position(); mouse_pos = transform.affine_inverse().xform(mouse_pos); mouse_pos = snap_point(mouse_pos, SNAP_DEFAULT, _get_single_item()); _edit_set_pivot(mouse_pos); @@ -1443,8 +1452,8 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) E->get().to }; - Vector2 p = Geometry::get_closest_point_to_segment_2d(viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()), s); - float d = p.distance_to(viewport_scrollable->get_transform().affine_inverse().xform(b->get_position())); + Vector2 p = Geometry::get_closest_point_to_segment_2d(b->get_position(), s); + float d = p.distance_to(b->get_position()); if (d < bone_width && d < closest_dist) { Cbone = E; closest_dist = d; @@ -1506,7 +1515,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) CanvasItemEditorSelectedItem *se = editor_selection->get_node_editor_data<CanvasItemEditorSelectedItem>(canvas_item); ERR_FAIL_COND(!se); - Point2 click = viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()); + Point2 click = b->get_position(); // Rotation if ((b->get_control() && tool == TOOL_SELECT) || tool == TOOL_ROTATE) { @@ -1561,7 +1570,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) } // Multiple selected items - Point2 click = viewport_scrollable->get_transform().affine_inverse().xform(b->get_position()); + Point2 click = b->get_position(); if ((b->get_alt() || tool == TOOL_MOVE) && get_item_count()) { // Drag the nodes @@ -1621,12 +1630,9 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) // Mouse motion event _update_cursor(); - if (!viewport_base->has_focus() && (!get_focus_owner() || !get_focus_owner()->is_text_field())) - viewport_base->call_deferred("grab_focus"); - if (box_selecting) { // Update box selection - box_selecting_to = transform.affine_inverse().xform(viewport_scrollable->get_transform().affine_inverse().xform(m->get_position())); + box_selecting_to = transform.affine_inverse().xform(m->get_position()); viewport->update(); return; } @@ -1672,7 +1678,7 @@ void CanvasItemEditor::_viewport_base_gui_input(const Ref<InputEvent> &p_event) } Vector2 dfrom = drag_from; - Vector2 dto = transform.affine_inverse().xform(viewport_scrollable->get_transform().affine_inverse().xform(m->get_position())); + Vector2 dto = transform.affine_inverse().xform(m->get_position()); if (canvas_item->has_meta("_edit_lock_")) continue; @@ -2159,8 +2165,8 @@ void CanvasItemEditor::_draw_grid() { Vector2 real_grid_offset; if (snap_relative && get_item_count() > 0) { Vector2 topleft = _find_topleftmost_point(); - real_grid_offset.x = fmod(topleft.x, grid_step.x * Math::pow(2.0, grid_step_multiplier)); - real_grid_offset.y = fmod(topleft.y, grid_step.y * Math::pow(2.0, grid_step_multiplier)); + real_grid_offset.x = fmod(topleft.x, grid_step.x * (real_t)Math::pow(2.0, grid_step_multiplier)); + real_grid_offset.y = fmod(topleft.y, grid_step.y * (real_t)Math::pow(2.0, grid_step_multiplier)); } else { real_grid_offset = grid_offset; } @@ -2681,9 +2687,8 @@ void CanvasItemEditor::_draw_viewport() { EditorPluginList *over_plugin_list = editor->get_editor_plugins_over(); if (!over_plugin_list->empty()) { - over_plugin_list->forward_draw_over_canvas(transform, viewport); + over_plugin_list->forward_draw_over_canvas(viewport); } - _draw_focus(); _draw_bones(); } @@ -3694,7 +3699,8 @@ void CanvasItemEditor::_bind_methods() { ClassDB::bind_method("_unhandled_key_input", &CanvasItemEditor::_unhandled_key_input); ClassDB::bind_method("_draw_viewport", &CanvasItemEditor::_draw_viewport); ClassDB::bind_method("_draw_viewport_base", &CanvasItemEditor::_draw_viewport_base); - ClassDB::bind_method("_viewport_base_gui_input", &CanvasItemEditor::_viewport_base_gui_input); + ClassDB::bind_method("_gui_input_viewport", &CanvasItemEditor::_gui_input_viewport); + ClassDB::bind_method("_gui_input_viewport_base", &CanvasItemEditor::_gui_input_viewport_base); ClassDB::bind_method("_snap_changed", &CanvasItemEditor::_snap_changed); ClassDB::bind_method(D_METHOD("_selection_result_pressed"), &CanvasItemEditor::_selection_result_pressed); ClassDB::bind_method(D_METHOD("_selection_menu_hide"), &CanvasItemEditor::_selection_menu_hide); @@ -3747,7 +3753,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { palette_split->add_child(viewport_base); viewport_base->set_clip_contents(true); viewport_base->connect("draw", this, "_draw_viewport_base"); - viewport_base->connect("gui_input", this, "_viewport_base_gui_input"); + viewport_base->connect("gui_input", this, "_gui_input_viewport_base"); viewport_base->set_focus_mode(FOCUS_ALL); viewport_base->set_v_size_flags(SIZE_EXPAND_FILL); viewport_base->set_h_size_flags(SIZE_EXPAND_FILL); @@ -3771,6 +3777,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) { viewport->set_anchors_and_margins_preset(Control::PRESET_WIDE); viewport->set_clip_contents(true); viewport->connect("draw", this, "_draw_viewport"); + viewport->connect("gui_input", this, "_gui_input_viewport"); h_scroll = memnew(HScrollBar); viewport->add_child(h_scroll); diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h index 69dc25d180..a8183ba286 100644 --- a/editor/plugins/canvas_item_editor_plugin.h +++ b/editor/plugins/canvas_item_editor_plugin.h @@ -410,10 +410,11 @@ class CanvasItemEditor : public VBoxContainer { void _draw_locks_and_groups(Node *p_node, const Transform2D &p_xform); void _draw_viewport(); - - void _viewport_base_gui_input(const Ref<InputEvent> &p_event); void _draw_viewport_base(); + void _gui_input_viewport(const Ref<InputEvent> &p_event); + void _gui_input_viewport_base(const Ref<InputEvent> &p_event); + void _focus_selection(int p_op); void _snap_if_closer(Point2 p_value, Point2 p_target_snap, Point2 &r_current_snap, bool (&r_snapped)[2], real_t rotation = 0.0, float p_radius = 10.0); diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.cpp b/editor/plugins/collision_polygon_2d_editor_plugin.cpp index 00e6d617a1..00e6d617a1 100755..100644 --- a/editor/plugins/collision_polygon_2d_editor_plugin.cpp +++ b/editor/plugins/collision_polygon_2d_editor_plugin.cpp diff --git a/editor/plugins/collision_polygon_2d_editor_plugin.h b/editor/plugins/collision_polygon_2d_editor_plugin.h index edf3bbcc08..edf3bbcc08 100755..100644 --- a/editor/plugins/collision_polygon_2d_editor_plugin.h +++ b/editor/plugins/collision_polygon_2d_editor_plugin.h diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index 3e6165e552..005de096cd 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -302,7 +302,7 @@ void CollisionShape2DEditor::commit_handle(int idx, Variant &p_org) { undo_redo->commit_action(); } -bool CollisionShape2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { +bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { if (!node) { return false; @@ -317,17 +317,17 @@ bool CollisionShape2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { } Ref<InputEventMouseButton> mb = p_event; + Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); if (mb.is_valid()) { - Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); - - Point2 gpoint(mb->get_position().x, mb->get_position().y); + Vector2 gpoint = mb->get_position(); + Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); if (mb->get_button_index() == BUTTON_LEFT) { if (mb->is_pressed()) { for (int i = 0; i < handles.size(); i++) { - if (gt.xform(handles[i]).distance_to(gpoint) < 8) { + if (xform.xform(handles[i]).distance_to(gpoint) < 8) { edit_handle = i; break; @@ -368,9 +368,7 @@ bool CollisionShape2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } - Point2 gpoint = mm->get_position(); - Point2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint); - cpoint = canvas_item_editor->snap_point(cpoint); + Vector2 cpoint = canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position())); cpoint = node->get_global_transform().affine_inverse().xform(cpoint); set_handle(edit_handle, cpoint); @@ -416,7 +414,7 @@ void CollisionShape2DEditor::_get_current_shape_type() { canvas_item_editor->get_viewport_control()->update(); } -void CollisionShape2DEditor::_canvas_draw() { +void CollisionShape2DEditor::forward_draw_over_canvas(Control *p_canvas) { if (!node) { return; @@ -432,7 +430,6 @@ void CollisionShape2DEditor::_canvas_draw() { return; } - Control *c = canvas_item_editor->get_viewport_control(); Transform2D gt = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); Ref<Texture> h = get_icon("EditorHandle", "EditorIcons"); @@ -451,8 +448,8 @@ void CollisionShape2DEditor::_canvas_draw() { handles[0] = Point2(radius, -height); handles[1] = Point2(0, -(height + radius)); - c->draw_texture(h, gt.xform(handles[0]) - size); - c->draw_texture(h, gt.xform(handles[1]) - size); + p_canvas->draw_texture(h, gt.xform(handles[0]) - size); + p_canvas->draw_texture(h, gt.xform(handles[1]) - size); } break; @@ -462,7 +459,7 @@ void CollisionShape2DEditor::_canvas_draw() { handles.resize(1); handles[0] = Point2(shape->get_radius(), 0); - c->draw_texture(h, gt.xform(handles[0]) - size); + p_canvas->draw_texture(h, gt.xform(handles[0]) - size); } break; @@ -481,8 +478,8 @@ void CollisionShape2DEditor::_canvas_draw() { handles[0] = shape->get_normal() * shape->get_d(); handles[1] = shape->get_normal() * (shape->get_d() + 30.0); - c->draw_texture(h, gt.xform(handles[0]) - size); - c->draw_texture(h, gt.xform(handles[1]) - size); + p_canvas->draw_texture(h, gt.xform(handles[0]) - size); + p_canvas->draw_texture(h, gt.xform(handles[1]) - size); } break; @@ -492,7 +489,7 @@ void CollisionShape2DEditor::_canvas_draw() { handles.resize(1); handles[0] = Point2(0, shape->get_length()); - c->draw_texture(h, gt.xform(handles[0]) - size); + p_canvas->draw_texture(h, gt.xform(handles[0]) - size); } break; @@ -504,8 +501,8 @@ void CollisionShape2DEditor::_canvas_draw() { handles[0] = Point2(ext.x, 0); handles[1] = Point2(0, -ext.y); - c->draw_texture(h, gt.xform(handles[0]) - size); - c->draw_texture(h, gt.xform(handles[1]) - size); + p_canvas->draw_texture(h, gt.xform(handles[0]) - size); + p_canvas->draw_texture(h, gt.xform(handles[1]) - size); } break; @@ -516,8 +513,8 @@ void CollisionShape2DEditor::_canvas_draw() { handles[0] = shape->get_a(); handles[1] = shape->get_b(); - c->draw_texture(h, gt.xform(handles[0]) - size); - c->draw_texture(h, gt.xform(handles[1]) - size); + p_canvas->draw_texture(h, gt.xform(handles[0]) - size); + p_canvas->draw_texture(h, gt.xform(handles[1]) - size); } break; } @@ -532,18 +529,12 @@ void CollisionShape2DEditor::edit(Node *p_node) { if (p_node) { node = Object::cast_to<CollisionShape2D>(p_node); - if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw"); - _get_current_shape_type(); } else { edit_handle = -1; shape_type = -1; - if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw"); - node = NULL; } @@ -552,7 +543,6 @@ void CollisionShape2DEditor::edit(Node *p_node) { void CollisionShape2DEditor::_bind_methods() { - ClassDB::bind_method("_canvas_draw", &CollisionShape2DEditor::_canvas_draw); ClassDB::bind_method("_get_current_shape_type", &CollisionShape2DEditor::_get_current_shape_type); } diff --git a/editor/plugins/collision_shape_2d_editor_plugin.h b/editor/plugins/collision_shape_2d_editor_plugin.h index ffa91952e0..d4fbe87fb3 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.h +++ b/editor/plugins/collision_shape_2d_editor_plugin.h @@ -68,13 +68,13 @@ class CollisionShape2DEditor : public Control { void commit_handle(int idx, Variant &p_org); void _get_current_shape_type(); - void _canvas_draw(); protected: static void _bind_methods(); public: - bool forward_gui_input(const Ref<InputEvent> &p_event); + bool forward_canvas_gui_input(const Ref<InputEvent> &p_event); + void forward_draw_over_canvas(Control *p_canvas); void edit(Node *p_node); CollisionShape2DEditor(EditorNode *p_editor); @@ -87,7 +87,8 @@ class CollisionShape2DEditorPlugin : public EditorPlugin { EditorNode *editor; public: - virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return collision_shape_2d_editor->forward_gui_input(p_event); } + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return collision_shape_2d_editor->forward_canvas_gui_input(p_event); } + virtual void forward_draw_over_canvas(Control *p_canvas) { return collision_shape_2d_editor->forward_draw_over_canvas(p_canvas); } virtual String get_name() const { return "CollisionShape2D"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp index ed0bc60d2f..485657d2c9 100644 --- a/editor/plugins/light_occluder_2d_editor_plugin.cpp +++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp @@ -119,9 +119,7 @@ bool LightOccluder2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); Vector2 gpoint = mb->get_position(); - Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint); - cpoint = canvas_item_editor->snap_point(cpoint); - cpoint = node->get_global_transform().affine_inverse().xform(cpoint); + Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); Vector<Vector2> poly = Variant(node->get_occluder_polygon()->get_polygon()); @@ -319,7 +317,8 @@ bool LightOccluder2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } -void LightOccluder2DEditor::_canvas_draw() { + +void LightOccluder2DEditor::forward_draw_over_canvas(Control *p_canvas) { if (!node || !node->get_occluder_polygon().is_valid()) return; @@ -368,17 +367,12 @@ void LightOccluder2DEditor::edit(Node *p_collision_polygon) { if (p_collision_polygon) { node = Object::cast_to<LightOccluder2D>(p_collision_polygon); - if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw"); wip.clear(); wip_active = false; edited_point = -1; canvas_item_editor->get_viewport_control()->update(); } else { node = NULL; - - if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw"); } } @@ -395,7 +389,6 @@ void LightOccluder2DEditor::_create_poly() { void LightOccluder2DEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_menu_option"), &LightOccluder2DEditor::_menu_option); - ClassDB::bind_method(D_METHOD("_canvas_draw"), &LightOccluder2DEditor::_canvas_draw); ClassDB::bind_method(D_METHOD("_node_removed"), &LightOccluder2DEditor::_node_removed); ClassDB::bind_method(D_METHOD("_create_poly"), &LightOccluder2DEditor::_create_poly); } @@ -430,7 +423,7 @@ LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) { void LightOccluder2DEditorPlugin::edit(Object *p_object) { - collision_polygon_editor->edit(Object::cast_to<Node>(p_object)); + light_occluder_editor->edit(Object::cast_to<Node>(p_object)); } bool LightOccluder2DEditorPlugin::handles(Object *p_object) const { @@ -441,21 +434,21 @@ bool LightOccluder2DEditorPlugin::handles(Object *p_object) const { void LightOccluder2DEditorPlugin::make_visible(bool p_visible) { if (p_visible) { - collision_polygon_editor->show(); + light_occluder_editor->show(); } else { - collision_polygon_editor->hide(); - collision_polygon_editor->edit(NULL); + light_occluder_editor->hide(); + light_occluder_editor->edit(NULL); } } LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) { editor = p_node; - collision_polygon_editor = memnew(LightOccluder2DEditor(p_node)); - CanvasItemEditor::get_singleton()->add_control_to_menu_panel(collision_polygon_editor); + light_occluder_editor = memnew(LightOccluder2DEditor(p_node)); + CanvasItemEditor::get_singleton()->add_control_to_menu_panel(light_occluder_editor); - collision_polygon_editor->hide(); + light_occluder_editor->hide(); } LightOccluder2DEditorPlugin::~LightOccluder2DEditorPlugin() { diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h index b270dcb6e5..068832d8ed 100644 --- a/editor/plugins/light_occluder_2d_editor_plugin.h +++ b/editor/plugins/light_occluder_2d_editor_plugin.h @@ -72,7 +72,6 @@ class LightOccluder2DEditor : public HBoxContainer { ConfirmationDialog *create_poly; void _wip_close(bool p_closed); - void _canvas_draw(); void _menu_option(int p_option); void _create_poly(); @@ -83,6 +82,7 @@ protected: public: Vector2 snap_point(const Vector2 &p_point) const; + void forward_draw_over_canvas(Control *p_canvas); bool forward_gui_input(const Ref<InputEvent> &p_event); void edit(Node *p_collision_polygon); LightOccluder2DEditor(EditorNode *p_editor); @@ -92,11 +92,12 @@ class LightOccluder2DEditorPlugin : public EditorPlugin { GDCLASS(LightOccluder2DEditorPlugin, EditorPlugin); - LightOccluder2DEditor *collision_polygon_editor; + LightOccluder2DEditor *light_occluder_editor; EditorNode *editor; public: - virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return collision_polygon_editor->forward_gui_input(p_event); } + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return light_occluder_editor->forward_gui_input(p_event); } + virtual void forward_draw_over_canvas(Control *p_canvas) { return light_occluder_editor->forward_draw_over_canvas(p_canvas); } virtual String get_name() const { return "LightOccluder2D"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/line_2d_editor_plugin.cpp b/editor/plugins/line_2d_editor_plugin.cpp index ef3ee6a78f..0533aaa9c0 100644 --- a/editor/plugins/line_2d_editor_plugin.cpp +++ b/editor/plugins/line_2d_editor_plugin.cpp @@ -54,16 +54,10 @@ void Line2DEditor::_notification(int p_what) { } } -Vector2 Line2DEditor::mouse_to_local_pos(Vector2 gpos, bool alt) { - Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); - return !alt ? canvas_item_editor->snap_point(xform.affine_inverse().xform(gpos)) : node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpos))); -} - -int Line2DEditor::get_point_index_at(Vector2 gpos) { +int Line2DEditor::get_point_index_at(const Transform2D &xform, Vector2 gpos) { ERR_FAIL_COND_V(node == 0, -1); real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8); - Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); for (int i = 0; i < node->get_point_count(); ++i) { Point2 p = xform.xform(node->get_point_position(i)); @@ -75,7 +69,7 @@ int Line2DEditor::get_point_index_at(Vector2 gpos) { return -1; } -bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { +bool Line2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { if (!node) return false; @@ -88,10 +82,10 @@ bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { if (mb.is_valid()) { Vector2 gpoint = mb->get_position(); - Vector2 cpoint = mouse_to_local_pos(gpoint, mb->get_alt()); + Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); if (mb->is_pressed() && _dragging == false) { - int i = get_point_index_at(gpoint); + int i = get_point_index_at(canvas_item_editor->get_canvas_transform() * node->get_global_transform(), gpoint); if (i != -1) { if (mb->get_button_index() == BUTTON_LEFT && !mb->get_shift() && mode == MODE_EDIT) { _dragging = true; @@ -146,7 +140,8 @@ bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { if (mm.is_valid()) { if (_dragging) { - Vector2 cpoint = mouse_to_local_pos(mm->get_position(), mm->get_alt()); + Vector2 gpoint = mm->get_position(); + Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position()))); node->set_point_position(action_point, cpoint); canvas_item_editor->get_viewport_control()->update(); return true; @@ -156,7 +151,7 @@ bool Line2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } -void Line2DEditor::_canvas_draw() { +void Line2DEditor::forward_draw_over_canvas(Control *p_canvas) { if (!node) return; @@ -190,13 +185,9 @@ void Line2DEditor::edit(Node *p_line2d) { if (p_line2d) { node = Object::cast_to<Line2D>(p_line2d); - if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw"); if (!node->is_connected("visibility_changed", this, "_node_visibility_changed")) node->connect("visibility_changed", this, "_node_visibility_changed"); } else { - if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw"); // node may have been deleted at this point if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed")) node->disconnect("visibility_changed", this, "_node_visibility_changed"); @@ -205,7 +196,6 @@ void Line2DEditor::edit(Node *p_line2d) { } void Line2DEditor::_bind_methods() { - ClassDB::bind_method(D_METHOD("_canvas_draw"), &Line2DEditor::_canvas_draw); ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Line2DEditor::_node_visibility_changed); ClassDB::bind_method(D_METHOD("_mode_selected"), &Line2DEditor::_mode_selected); } diff --git a/editor/plugins/line_2d_editor_plugin.h b/editor/plugins/line_2d_editor_plugin.h index dea0433084..6858680aed 100644 --- a/editor/plugins/line_2d_editor_plugin.h +++ b/editor/plugins/line_2d_editor_plugin.h @@ -40,27 +40,11 @@ class CanvasItemEditor; class Line2DEditor : public HBoxContainer { GDCLASS(Line2DEditor, HBoxContainer) - -public: - bool forward_gui_input(const Ref<InputEvent> &p_event); - void edit(Node *p_line2d); - Line2DEditor(EditorNode *p_editor); - -protected: - void _node_removed(Node *p_node); - void _notification(int p_what); - - Vector2 mouse_to_local_pos(Vector2 mpos); - - static void _bind_methods(); - private: void _mode_selected(int p_mode); - void _canvas_draw(); void _node_visibility_changed(); - int get_point_index_at(Vector2 gpos); - Vector2 mouse_to_local_pos(Vector2 gpos, bool alt); + int get_point_index_at(const Transform2D &xform, Vector2 gpos); UndoRedo *undo_redo; @@ -86,17 +70,26 @@ private: int action_point; Point2 moving_from; Point2 moving_screen_from; + +protected: + void _node_removed(Node *p_node); + void _notification(int p_what); + + static void _bind_methods(); + +public: + bool forward_canvas_gui_input(const Ref<InputEvent> &p_event); + void forward_draw_over_canvas(Control *p_canvas); + void edit(Node *p_line2d); + Line2DEditor(EditorNode *p_editor); }; class Line2DEditorPlugin : public EditorPlugin { GDCLASS(Line2DEditorPlugin, EditorPlugin) public: - virtual bool forward_canvas_gui_input( - const Transform2D &p_canvas_xform, - const Ref<InputEvent> &p_event) { - return line2d_editor->forward_gui_input(p_event); - } + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return line2d_editor->forward_canvas_gui_input(p_event); } + virtual void forward_draw_over_canvas(Control *p_canvas) { return line2d_editor->forward_draw_over_canvas(p_canvas); } virtual String get_name() const { return "Line2D"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/navigation_polygon_editor_plugin.cpp b/editor/plugins/navigation_polygon_editor_plugin.cpp index 6560a8dac7..6560a8dac7 100755..100644 --- a/editor/plugins/navigation_polygon_editor_plugin.cpp +++ b/editor/plugins/navigation_polygon_editor_plugin.cpp diff --git a/editor/plugins/navigation_polygon_editor_plugin.h b/editor/plugins/navigation_polygon_editor_plugin.h index 54cc347a8c..54cc347a8c 100755..100644 --- a/editor/plugins/navigation_polygon_editor_plugin.h +++ b/editor/plugins/navigation_polygon_editor_plugin.h diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp index df10ac8929..2174f08e23 100644 --- a/editor/plugins/path_2d_editor_plugin.cpp +++ b/editor/plugins/path_2d_editor_plugin.cpp @@ -76,10 +76,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); Vector2 gpoint = mb->get_position(); - Vector2 cpoint = - !mb->get_alt() ? - canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint)) : - node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); + Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position()))); real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8); @@ -239,10 +236,7 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { // Handle point/control movement. Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform(); Vector2 gpoint = mm->get_position(); - Vector2 cpoint = - !mm->get_alt() ? - canvas_item_editor->snap_point(xform.affine_inverse().xform(gpoint)) : - node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint))); + Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mm->get_position()))); Ref<Curve2D> curve = node->get_curve(); @@ -274,7 +268,8 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } -void Path2DEditor::_canvas_draw() { + +void Path2DEditor::forward_draw_over_canvas(Control *p_canvas) { if (!node) return; @@ -329,16 +324,11 @@ void Path2DEditor::edit(Node *p_path2d) { if (p_path2d) { node = Object::cast_to<Path2D>(p_path2d); - if (!canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->connect("draw", this, "_canvas_draw"); if (!node->is_connected("visibility_changed", this, "_node_visibility_changed")) node->connect("visibility_changed", this, "_node_visibility_changed"); } else { - if (canvas_item_editor->get_viewport_control()->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->get_viewport_control()->disconnect("draw", this, "_canvas_draw"); - // node may have been deleted at this point if (node && node->is_connected("visibility_changed", this, "_node_visibility_changed")) node->disconnect("visibility_changed", this, "_node_visibility_changed"); @@ -349,7 +339,6 @@ void Path2DEditor::edit(Node *p_path2d) { void Path2DEditor::_bind_methods() { //ClassDB::bind_method(D_METHOD("_menu_option"),&Path2DEditor::_menu_option); - ClassDB::bind_method(D_METHOD("_canvas_draw"), &Path2DEditor::_canvas_draw); ClassDB::bind_method(D_METHOD("_node_visibility_changed"), &Path2DEditor::_node_visibility_changed); ClassDB::bind_method(D_METHOD("_mode_selected"), &Path2DEditor::_mode_selected); } diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h index f0f5d4d637..516e48c471 100644 --- a/editor/plugins/path_2d_editor_plugin.h +++ b/editor/plugins/path_2d_editor_plugin.h @@ -84,7 +84,6 @@ class Path2DEditor : public HBoxContainer { void _mode_selected(int p_mode); - void _canvas_draw(); void _node_visibility_changed(); friend class Path2DEditorPlugin; @@ -95,6 +94,7 @@ protected: public: bool forward_gui_input(const Ref<InputEvent> &p_event); + void forward_draw_over_canvas(Control *p_canvas); void edit(Node *p_path2d); Path2DEditor(EditorNode *p_editor); }; @@ -107,7 +107,8 @@ class Path2DEditorPlugin : public EditorPlugin { EditorNode *editor; public: - virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return path2d_editor->forward_gui_input(p_event); } + virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return path2d_editor->forward_gui_input(p_event); } + virtual void forward_draw_over_canvas(Control *p_canvas) { return path2d_editor->forward_draw_over_canvas(p_canvas); } virtual String get_name() const { return "Path2D"; } bool has_main_screen() const { return false; } diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 0e8c13b067..0e8c13b067 100755..100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h index 90da3e61c1..90da3e61c1 100755..100644 --- a/editor/plugins/polygon_2d_editor_plugin.h +++ b/editor/plugins/polygon_2d_editor_plugin.h diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index d216e47c02..547679b056 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -2095,7 +2095,7 @@ void SpatialEditorViewport::_notification(int p_what) { } // TODO That should be part of the drawing API... -static void stroke_rect(CanvasItem *ci, Rect2 rect, Color color, real_t width = 1.0) { +static void stroke_rect(CanvasItem &ci, Rect2 rect, Color color, real_t width = 1.0) { // a---b // | | @@ -2105,10 +2105,31 @@ static void stroke_rect(CanvasItem *ci, Rect2 rect, Color color, real_t width = Vector2 c(rect.position.x, rect.position.y + rect.size.y); Vector2 d(rect.position + rect.size); - ci->draw_line(a, b, color, width); - ci->draw_line(b, d, color, width); - ci->draw_line(d, c, color, width); - ci->draw_line(c, a, color, width); + ci.draw_line(a, b, color, width); + ci.draw_line(b, d, color, width); + ci.draw_line(d, c, color, width); + ci.draw_line(c, a, color, width); +} + +static void draw_indicator_bar(Control &surface, real_t fill, Ref<Texture> icon) { + + // Adjust bar size from control height + Vector2 surface_size = surface.get_size(); + real_t h = surface_size.y / 2.0; + real_t y = (surface_size.y - h) / 2.0; + + Rect2 r(10, y, 6, h); + real_t sy = r.size.y * fill; + + // Note: because this bar appears over the viewport, it has to stay readable for any background color + // Draw both neutral dark and bright colors to account this + surface.draw_rect(r, Color(1, 1, 1, 0.2)); + surface.draw_rect(Rect2(r.position.x, r.position.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6)); + stroke_rect(surface, r.grow(1), Color(0, 0, 0, 0.7)); + + Vector2 icon_size = icon->get_size(); + Vector2 icon_pos = Vector2(r.position.x - (icon_size.x - r.size.x) / 2, r.position.y + r.size.y + 2); + surface.draw_texture(icon, icon_pos); } void SpatialEditorViewport::_draw() { @@ -2167,35 +2188,47 @@ void SpatialEditorViewport::_draw() { draw_rect = Rect2(Vector2(), s).clip(draw_rect); - stroke_rect(surface, draw_rect, Color(0.6, 0.6, 0.1, 0.5), 2.0); + stroke_rect(*surface, draw_rect, Color(0.6, 0.6, 0.1, 0.5), 2.0); } else { if (zoom_indicator_delay > 0.0) { - // Show indicative zoom factor - real_t min_distance = ZOOM_MIN_DISTANCE; // TODO Why not pick znear to limit zoom? - real_t max_distance = camera->get_zfar(); - real_t scale_length = (max_distance - min_distance); + if (is_freelook_active()) { + // Show speed - if (Math::abs(scale_length) > CMP_EPSILON) { - real_t logscale_t = 1.0 - Math::log(1 + cursor.distance - min_distance) / Math::log(1 + scale_length); + real_t min_speed = FREELOOK_MIN_SPEED; + real_t max_speed = camera->get_zfar(); + real_t scale_length = (max_speed - min_speed); - // There is no real maximum distance so that factor can become negative, - // Let's make it look asymptotic instead (will decrease slower and slower). - if (logscale_t < 0.25) - logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0); + if (Math::abs(scale_length) > CMP_EPSILON) { + real_t logscale_t = 1.0 - Math::log(1 + freelook_speed - min_speed) / Math::log(1 + scale_length); - Vector2 surface_size = surface->get_size(); - real_t h = surface_size.y / 2.0; - real_t y = (surface_size.y - h) / 2.0; + // There is no real maximum speed so that factor can become negative, + // Let's make it look asymptotic instead (will decrease slower and slower). + if (logscale_t < 0.25) + logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0); - Rect2 r(10, y, 6, h); - real_t sy = r.size.y * logscale_t; + draw_indicator_bar(*surface, 1.0 - logscale_t, get_icon("ViewportSpeed", "EditorIcons")); + } - surface->draw_rect(r, Color(1, 1, 1, 0.2)); - surface->draw_rect(Rect2(r.position.x, r.position.y + r.size.y - sy, r.size.x, sy), Color(1, 1, 1, 0.6)); - stroke_rect(surface, r.grow(1), Color(0, 0, 0, 0.7)); + } else { + // Show zoom + + real_t min_distance = ZOOM_MIN_DISTANCE; // TODO Why not pick znear to limit zoom? + real_t max_distance = camera->get_zfar(); + real_t scale_length = (max_distance - min_distance); + + if (Math::abs(scale_length) > CMP_EPSILON) { + real_t logscale_t = 1.0 - Math::log(1 + cursor.distance - min_distance) / Math::log(1 + scale_length); + + // There is no real maximum distance so that factor can become negative, + // Let's make it look asymptotic instead (will decrease slower and slower). + if (logscale_t < 0.25) + logscale_t = 0.25 * Math::exp(4.0 * logscale_t - 1.0); + + draw_indicator_bar(*surface, logscale_t, get_icon("ViewportZoom", "EditorIcons")); + } } } } @@ -2732,8 +2765,14 @@ Vector3 SpatialEditorViewport::_get_instance_position(const Point2 &p_pos) const normal = hit_normal; } } - Vector3 center = preview_bounds->get_size() * 0.5; - return point + (center * normal); + Vector3 offset = Vector3(); + for (int i = 0; i < 3; i++) { + if (normal[i] > 0.0) + offset[i] = (preview_bounds->get_size()[i] - (preview_bounds->get_size()[i] + preview_bounds->get_position()[i])); + else if (normal[i] < 0.0) + offset[i] = -(preview_bounds->get_size()[i] + preview_bounds->get_position()[i]); + } + return point + offset; } Rect3 SpatialEditorViewport::_calculate_spatial_bounds(const Spatial *p_parent, const Rect3 p_bounds) { diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 2f2ed7bdf0..d12b3f1e0e 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -229,7 +229,7 @@ struct _PaletteEntry { return name < p_rhs.name; } }; -} +} // namespace void TileMapEditor::_update_palette() { @@ -1152,7 +1152,7 @@ bool TileMapEditor::forward_gui_input(const Ref<InputEvent> &p_event) { return false; } -void TileMapEditor::_canvas_draw() { +void TileMapEditor::forward_draw_over_canvas(Control *p_canvas) { if (!node) return; @@ -1379,8 +1379,6 @@ void TileMapEditor::edit(Node *p_tile_map) { if (p_tile_map) { node = Object::cast_to<TileMap>(p_tile_map); - if (!canvas_item_editor->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->connect("draw", this, "_canvas_draw"); if (!canvas_item_editor->is_connected("mouse_entered", this, "_canvas_mouse_enter")) canvas_item_editor->connect("mouse_entered", this, "_canvas_mouse_enter"); if (!canvas_item_editor->is_connected("mouse_exited", this, "_canvas_mouse_exit")) @@ -1391,8 +1389,6 @@ void TileMapEditor::edit(Node *p_tile_map) { } else { node = NULL; - if (canvas_item_editor->is_connected("draw", this, "_canvas_draw")) - canvas_item_editor->disconnect("draw", this, "_canvas_draw"); if (canvas_item_editor->is_connected("mouse_entered", this, "_canvas_mouse_enter")) canvas_item_editor->disconnect("mouse_entered", this, "_canvas_mouse_enter"); if (canvas_item_editor->is_connected("mouse_exited", this, "_canvas_mouse_exit")) @@ -1428,7 +1424,6 @@ void TileMapEditor::_bind_methods() { ClassDB::bind_method(D_METHOD("_text_changed"), &TileMapEditor::_text_changed); ClassDB::bind_method(D_METHOD("_sbox_input"), &TileMapEditor::_sbox_input); ClassDB::bind_method(D_METHOD("_menu_option"), &TileMapEditor::_menu_option); - ClassDB::bind_method(D_METHOD("_canvas_draw"), &TileMapEditor::_canvas_draw); ClassDB::bind_method(D_METHOD("_canvas_mouse_enter"), &TileMapEditor::_canvas_mouse_enter); ClassDB::bind_method(D_METHOD("_canvas_mouse_exit"), &TileMapEditor::_canvas_mouse_exit); ClassDB::bind_method(D_METHOD("_tileset_settings_changed"), &TileMapEditor::_tileset_settings_changed); diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h index c8f29dfb7b..5b042e4780 100644 --- a/editor/plugins/tile_map_editor_plugin.h +++ b/editor/plugins/tile_map_editor_plugin.h @@ -163,7 +163,6 @@ class TileMapEditor : public VBoxContainer { void _text_changed(const String &p_text); void _sbox_input(const Ref<InputEvent> &p_ie); void _update_palette(); - void _canvas_draw(); void _menu_option(int p_option); void _set_cell(const Point2i &p_pos, int p_value, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false, bool p_with_undo = false); @@ -183,6 +182,8 @@ public: HBoxContainer *get_toolbar() const { return toolbar; } bool forward_gui_input(const Ref<InputEvent> &p_event); + void forward_draw_over_canvas(Control *p_canvas); + void edit(Node *p_tile_map); TileMapEditor(EditorNode *p_editor); @@ -197,6 +198,7 @@ class TileMapEditorPlugin : public EditorPlugin { public: virtual bool forward_canvas_gui_input(const Transform2D &p_canvas_xform, const Ref<InputEvent> &p_event) { return tile_map_editor->forward_gui_input(p_event); } + virtual void forward_draw_over_canvas(Control *p_canvas) { tile_map_editor->forward_draw_over_canvas(p_canvas); } virtual String get_name() const { return "TileMap"; } bool has_main_screen() const { return false; } diff --git a/editor/script_editor_debugger.h b/editor/script_editor_debugger.h index 64ac2535a9..d0faab5892 100644 --- a/editor/script_editor_debugger.h +++ b/editor/script_editor_debugger.h @@ -166,9 +166,6 @@ class ScriptEditorDebugger : public Control { void _method_changed(Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE); void _property_changed(Object *p_base, const StringName &p_property, const Variant &p_value); - static void _method_changeds(void *p_ud, Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE); - static void _property_changeds(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value); - void _error_selected(int p_idx); void _error_stack_selected(int p_idx); @@ -196,6 +193,9 @@ public: void set_live_debugging(bool p_enable); + static void _method_changeds(void *p_ud, Object *p_base, const StringName &p_name, VARIANT_ARG_DECLARE); + static void _property_changeds(void *p_ud, Object *p_base, const StringName &p_property, const Variant &p_value); + void live_debug_create_node(const NodePath &p_parent, const String &p_type, const String &p_name); void live_debug_instance_node(const NodePath &p_parent, const String &p_path, const String &p_name); void live_debug_remove_node(const NodePath &p_at); diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp index 86979a1174..c052845be9 100644 --- a/editor/settings_config_dialog.cpp +++ b/editor/settings_config_dialog.cpp @@ -35,6 +35,7 @@ #include "os/keyboard.h" #include "project_settings.h" #include "scene/gui/margin_container.h" +#include "script_editor_debugger.h" void EditorSettingsDialog::ok_pressed() { @@ -91,6 +92,7 @@ void EditorSettingsDialog::popup_edit_settings() { search_box->grab_focus(); _update_shortcuts(); + set_process_unhandled_input(true); // Restore valid window bounds or pop up at default size. if (EditorSettings::get_singleton()->has_setting("interface/dialogs/editor_settings_bounds")) { @@ -121,19 +123,62 @@ void EditorSettingsDialog::_filter_shortcuts(const String &p_filter) { _update_shortcuts(); } +void EditorSettingsDialog::_undo_redo_callback(void *p_self, const String &p_name) { + EditorNode::get_log()->add_message(p_name); +} + void EditorSettingsDialog::_notification(int p_what) { switch (p_what) { + case NOTIFICATION_READY: { + ScriptEditorDebugger *sed = ScriptEditor::get_singleton()->get_debugger(); + undo_redo->set_method_notify_callback(sed->_method_changeds, sed); + undo_redo->set_property_notify_callback(sed->_property_changeds, sed); + undo_redo->set_commit_notify_callback(_undo_redo_callback, this); + } break; case NOTIFICATION_ENTER_TREE: { clear_button->set_icon(get_icon("Close", "EditorIcons")); shortcut_clear_button->set_icon(get_icon("Close", "EditorIcons")); } break; case NOTIFICATION_POPUP_HIDE: { EditorSettings::get_singleton()->set("interface/dialogs/editor_settings_bounds", get_rect()); + set_process_unhandled_input(false); } break; } } +void EditorSettingsDialog::_unhandled_input(const Ref<InputEvent> &p_event) { + + Ref<InputEventKey> k = p_event; + + if (k.is_valid() && is_window_modal_on_top()) { + + if (k->is_pressed()) { + + bool handled = false; + + if (ED_IS_SHORTCUT("editor/undo", p_event)) { + String action = undo_redo->get_current_action_name(); + if (action != "") + EditorNode::get_log()->add_message("UNDO: " + action); + undo_redo->undo(); + handled = true; + } + if (ED_IS_SHORTCUT("editor/redo", p_event)) { + undo_redo->redo(); + String action = undo_redo->get_current_action_name(); + if (action != "") + EditorNode::get_log()->add_message("REDO: " + action); + handled = true; + } + + if (handled) { + accept_event(); + } + } + } +} + void EditorSettingsDialog::_update_shortcuts() { shortcuts->clear(); @@ -212,30 +257,28 @@ void EditorSettingsDialog::_shortcut_button_pressed(Object *p_item, int p_column if (!sc.is_valid()) return; //pointless, there is nothing - UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Erase Shortcut"); - ur->add_do_method(sc.ptr(), "set_shortcut", Ref<InputEvent>()); - ur->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - ur->add_do_method(this, "_update_shortcuts"); - ur->add_undo_method(this, "_update_shortcuts"); - ur->add_do_method(this, "_settings_changed"); - ur->add_undo_method(this, "_settings_changed"); - ur->commit_action(); + undo_redo->create_action("Erase Shortcut"); + undo_redo->add_do_method(sc.ptr(), "set_shortcut", Ref<InputEvent>()); + undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); } else if (p_idx == 2) { //revert to original if (!sc.is_valid()) return; //pointless, there is nothing Ref<InputEvent> original = sc->get_meta("original"); - UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Restore Shortcut"); - ur->add_do_method(sc.ptr(), "set_shortcut", original); - ur->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - ur->add_do_method(this, "_update_shortcuts"); - ur->add_undo_method(this, "_update_shortcuts"); - ur->add_do_method(this, "_settings_changed"); - ur->add_undo_method(this, "_settings_changed"); - ur->commit_action(); + undo_redo->create_action("Restore Shortcut"); + undo_redo->add_do_method(sc.ptr(), "set_shortcut", original); + undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); } } @@ -276,19 +319,19 @@ void EditorSettingsDialog::_press_a_key_confirm() { Ref<ShortCut> sc = EditorSettings::get_singleton()->get_shortcut(shortcut_configured); - UndoRedo *ur = EditorNode::get_singleton()->get_undo_redo(); - ur->create_action("Change Shortcut '" + shortcut_configured + "'"); - ur->add_do_method(sc.ptr(), "set_shortcut", ie); - ur->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); - ur->add_do_method(this, "_update_shortcuts"); - ur->add_undo_method(this, "_update_shortcuts"); - ur->add_do_method(this, "_settings_changed"); - ur->add_undo_method(this, "_settings_changed"); - ur->commit_action(); + undo_redo->create_action("Change Shortcut '" + shortcut_configured + "'"); + undo_redo->add_do_method(sc.ptr(), "set_shortcut", ie); + undo_redo->add_undo_method(sc.ptr(), "set_shortcut", sc->get_shortcut()); + undo_redo->add_do_method(this, "_update_shortcuts"); + undo_redo->add_undo_method(this, "_update_shortcuts"); + undo_redo->add_do_method(this, "_settings_changed"); + undo_redo->add_undo_method(this, "_settings_changed"); + undo_redo->commit_action(); } void EditorSettingsDialog::_bind_methods() { + ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorSettingsDialog::_unhandled_input); ClassDB::bind_method(D_METHOD("_settings_save"), &EditorSettingsDialog::_settings_save); ClassDB::bind_method(D_METHOD("_settings_changed"), &EditorSettingsDialog::_settings_changed); ClassDB::bind_method(D_METHOD("_settings_property_edited"), &EditorSettingsDialog::_settings_property_edited); @@ -305,6 +348,7 @@ EditorSettingsDialog::EditorSettingsDialog() { set_title(TTR("Editor Settings")); set_resizable(true); + undo_redo = memnew(UndoRedo); tabs = memnew(TabContainer); tabs->set_tab_align(TabContainer::ALIGN_LEFT); @@ -336,7 +380,7 @@ EditorSettingsDialog::EditorSettingsDialog() { property_editor->get_property_editor()->set_use_filter(true); property_editor->register_search_box(search_box); property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); - property_editor->get_property_editor()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo()); + property_editor->get_property_editor()->set_undo_redo(undo_redo); vbc->add_child(property_editor); property_editor->get_property_editor()->connect("property_edited", this, "_settings_property_edited"); @@ -400,3 +444,7 @@ EditorSettingsDialog::EditorSettingsDialog() { updating = false; } + +EditorSettingsDialog::~EditorSettingsDialog() { + memdelete(undo_redo); +} diff --git a/editor/settings_config_dialog.h b/editor/settings_config_dialog.h index 8a66d5098c..a03b15c06d 100644 --- a/editor/settings_config_dialog.h +++ b/editor/settings_config_dialog.h @@ -50,6 +50,7 @@ class EditorSettingsDialog : public AcceptDialog { Timer *timer; + UndoRedo *undo_redo; Tree *shortcuts; ConfirmationDialog *press_a_key; @@ -65,6 +66,7 @@ class EditorSettingsDialog : public AcceptDialog { void _settings_property_edited(const String &p_name); void _settings_save(); + void _unhandled_input(const Ref<InputEvent> &p_event); void _notification(int p_what); void _press_a_key_confirm(); @@ -78,6 +80,8 @@ class EditorSettingsDialog : public AcceptDialog { void _update_shortcuts(); void _shortcut_button_pressed(Object *p_item, int p_column, int p_idx); + static void _undo_redo_callback(void *p_self, const String &p_name); + protected: static void _bind_methods(); @@ -85,6 +89,7 @@ public: void popup_edit_settings(); EditorSettingsDialog(); + ~EditorSettingsDialog(); }; #endif // SETTINGS_CONFIG_DIALOG_H |