diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index ddaed23d556..2891a087b26 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -644,6 +644,10 @@ If [code]true[/code], increases the scrollbar touch area to improve usability on touchscreen devices. [b]Note:[/b] Defaults to [code]true[/code] on touchscreen devices. + + Specify the multiplier to apply to the scale for the editor gizmo handles to improve usability on touchscreen devices. + [b]Note:[/b] Defaults to [code]1[/code] on non-touchscreen devices. + The address to listen to when starting the remote debugger. This can be set to [code]0.0.0.0[/code] to allow external clients to connect to the remote debugger (instead of restricting the remote debugger to connections from [code]localhost[/code]). diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 3681f61cd8b..b777fa1edf1 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -762,7 +762,9 @@ void EditorNode::_notification(int p_what) { EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/theme") || EditorSettings::get_singleton()->check_changed_settings_in_group("text_editor/help/help") || EditorSettings::get_singleton()->check_changed_settings_in_group("filesystem/file_dialog/thumbnail_size") || - EditorSettings::get_singleton()->check_changed_settings_in_group("run/output/font_size"); + EditorSettings::get_singleton()->check_changed_settings_in_group("run/output/font_size") || + EditorSettings::get_singleton()->check_changed_settings_in_group("interface/touchscreen/increase_scrollbar_touch_area") || + EditorSettings::get_singleton()->check_changed_settings_in_group("interface/touchscreen/scale_gizmo_handles"); if (theme_changed) { theme = create_custom_theme(theme_base->get_theme()); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 9a6302b695d..9577cd0e634 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -477,6 +477,7 @@ void EditorSettings::_load_defaults(Ref p_extra_config) { set_restart_if_changed("interface/touchscreen/enable_long_press_as_right_click", true); EDITOR_SETTING(Variant::BOOL, PROPERTY_HINT_NONE, "interface/touchscreen/enable_pan_and_scale_gestures", has_touchscreen_ui, "") set_restart_if_changed("interface/touchscreen/enable_pan_and_scale_gestures", true); + EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "interface/touchscreen/scale_gizmo_handles", has_touchscreen_ui ? 3 : 1, "1,5,1") // Scene tabs EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "interface/scene_tabs/display_close_button", 1, "Never,If Tab Active,Always"); // TabBar::CloseButtonDisplayPolicy @@ -696,7 +697,7 @@ void EditorSettings::_load_defaults(Ref p_extra_config) { _initial_set("editors/tiles_editor/grid_color", Color(1.0, 0.5, 0.2, 0.5)); // Polygon editor - _initial_set("editors/polygon_editor/point_grab_radius", 8); + _initial_set("editors/polygon_editor/point_grab_radius", has_touchscreen_ui ? 32 : 8); _initial_set("editors/polygon_editor/show_previous_outline", true); // Animation diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 1a8a216605d..1b5144af670 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -255,6 +255,28 @@ static Ref editor_generate_icon(int p_index, float p_scale, float return ImageTexture::create_from_image(img); } +float get_gizmo_handle_scale(const String &gizmo_handle_name = "") { + const float scale_gizmo_handles_for_touch = EDITOR_GET("interface/touchscreen/scale_gizmo_handles"); + if (scale_gizmo_handles_for_touch > 1.0f) { + // The names of the icons that require additional scaling. + static HashSet gizmo_to_scale; + if (gizmo_to_scale.is_empty()) { + gizmo_to_scale.insert("EditorHandle"); + gizmo_to_scale.insert("EditorHandleAdd"); + gizmo_to_scale.insert("EditorHandleDisabled"); + gizmo_to_scale.insert("EditorCurveHandle"); + gizmo_to_scale.insert("EditorPathSharpHandle"); + gizmo_to_scale.insert("EditorPathSmoothHandle"); + } + + if (gizmo_to_scale.has(gizmo_handle_name)) { + return EDSCALE * scale_gizmo_handles_for_touch; + } + } + + return EDSCALE; +} + void editor_register_and_generate_icons(Ref p_theme, bool p_dark_theme, float p_icon_saturation, int p_thumb_size, bool p_only_thumbs = false) { // Before we register the icons, we adjust their colors and saturation. // Most icons follow the standard rules for color conversion to follow the editor @@ -314,22 +336,23 @@ void editor_register_and_generate_icons(Ref p_theme, bool p_dark_theme, f for (int i = 0; i < editor_icons_count; i++) { Ref icon; - if (accent_color_icons.has(editor_icons_names[i])) { - icon = editor_generate_icon(i, EDSCALE, 1.0, accent_color_map); + const String &editor_icon_name = editor_icons_names[i]; + if (accent_color_icons.has(editor_icon_name)) { + icon = editor_generate_icon(i, get_gizmo_handle_scale(editor_icon_name), 1.0, accent_color_map); } else { float saturation = p_icon_saturation; - if (saturation_exceptions.has(editor_icons_names[i])) { + if (saturation_exceptions.has(editor_icon_name)) { saturation = 1.0; } - if (conversion_exceptions.has(editor_icons_names[i])) { - icon = editor_generate_icon(i, EDSCALE, saturation); + if (conversion_exceptions.has(editor_icon_name)) { + icon = editor_generate_icon(i, get_gizmo_handle_scale(editor_icon_name), saturation); } else { - icon = editor_generate_icon(i, EDSCALE, saturation, color_conversion_map); + icon = editor_generate_icon(i, get_gizmo_handle_scale(editor_icon_name), saturation, color_conversion_map); } } - p_theme->set_icon(editor_icons_names[i], SNAME("EditorIcons"), icon); + p_theme->set_icon(editor_icon_name, SNAME("EditorIcons"), icon); } } @@ -395,6 +418,7 @@ Ref create_editor_theme(const Ref p_theme) { Color base_color = EDITOR_GET("interface/theme/base_color"); float contrast = EDITOR_GET("interface/theme/contrast"); bool increase_scrollbar_touch_area = EDITOR_GET("interface/touchscreen/increase_scrollbar_touch_area"); + const float gizmo_handle_scale = EDITOR_GET("interface/touchscreen/scale_gizmo_handles"); bool draw_extra_borders = EDITOR_GET("interface/theme/draw_extra_borders"); float icon_saturation = EDITOR_GET("interface/theme/icon_saturation"); float relationship_line_opacity = EDITOR_GET("interface/theme/relationship_line_opacity"); @@ -594,6 +618,7 @@ Ref create_editor_theme(const Ref p_theme) { theme->set_constant("class_icon_size", "Editor", 16 * EDSCALE); theme->set_constant("dark_theme", "Editor", dark_theme); theme->set_constant("color_picker_button_height", "Editor", 28 * EDSCALE); + theme->set_constant("gizmo_handle_scale", "Editor", gizmo_handle_scale); // Register editor icons. // If the settings are comparable to the old theme, then just copy them over. @@ -609,8 +634,10 @@ Ref create_editor_theme(const Ref p_theme) { const bool prev_dark_theme = (bool)p_theme->get_constant(SNAME("dark_theme"), SNAME("Editor")); const Color prev_accent_color = p_theme->get_color(SNAME("accent_color"), SNAME("Editor")); const float prev_icon_saturation = p_theme->get_color(SNAME("icon_saturation"), SNAME("Editor")).r; + const float prev_gizmo_handle_scale = (float)p_theme->get_constant(SNAME("gizmo_handle_scale"), SNAME("Editor")); keep_old_icons = (Math::is_equal_approx(prev_scale, EDSCALE) && + Math::is_equal_approx(prev_gizmo_handle_scale, gizmo_handle_scale) && prev_dark_theme == dark_theme && prev_accent_color == accent_color && prev_icon_saturation == icon_saturation); diff --git a/editor/plugins/collision_shape_2d_editor_plugin.cpp b/editor/plugins/collision_shape_2d_editor_plugin.cpp index 0aef364c2de..15c40a5cb3f 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.cpp +++ b/editor/plugins/collision_shape_2d_editor_plugin.cpp @@ -33,6 +33,7 @@ #include "canvas_item_editor_plugin.h" #include "core/os/keyboard.h" #include "editor/editor_node.h" +#include "editor/editor_settings.h" #include "editor/editor_undo_redo_manager.h" #include "scene/resources/capsule_shape_2d.h" #include "scene/resources/circle_shape_2d.h" @@ -44,6 +45,10 @@ #include "scene/resources/world_boundary_shape_2d.h" #include "scene/scene_string_names.h" +CollisionShape2DEditor::CollisionShape2DEditor() { + grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius"); +} + void CollisionShape2DEditor::_node_removed(Node *p_node) { if (p_node == node) { node = nullptr; @@ -307,7 +312,7 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref &p_e if (mb->get_button_index() == MouseButton::LEFT) { if (mb->is_pressed()) { for (int i = 0; i < handles.size(); i++) { - if (xform.xform(handles[i]).distance_to(gpoint) < 8) { + if (xform.xform(handles[i]).distance_to(gpoint) < grab_threshold) { edit_handle = i; break; @@ -529,6 +534,12 @@ void CollisionShape2DEditor::_notification(int p_what) { _shape_changed(); } } break; + + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + if (EditorSettings::get_singleton()->check_changed_settings_in_group("editors/polygon_editor/point_grab_radius")) { + grab_threshold = EDITOR_GET("editors/polygon_editor/point_grab_radius"); + } + } break; } } diff --git a/editor/plugins/collision_shape_2d_editor_plugin.h b/editor/plugins/collision_shape_2d_editor_plugin.h index 13a99ec6f34..d58f5d511f0 100644 --- a/editor/plugins/collision_shape_2d_editor_plugin.h +++ b/editor/plugins/collision_shape_2d_editor_plugin.h @@ -69,6 +69,7 @@ class CollisionShape2DEditor : public Control { int shape_type = -1; int edit_handle = -1; bool pressed = false; + real_t grab_threshold = 8; Variant original; Transform2D original_transform; Vector2 original_point; @@ -90,6 +91,8 @@ public: bool forward_canvas_gui_input(const Ref &p_event); void forward_canvas_draw_over_viewport(Control *p_overlay); void edit(Node *p_node); + + CollisionShape2DEditor(); }; class CollisionShape2DEditorPlugin : public EditorPlugin { diff --git a/editor/plugins/curve_editor_plugin.cpp b/editor/plugins/curve_editor_plugin.cpp index ba2d7e67bf0..72cd1da9dd7 100644 --- a/editor/plugins/curve_editor_plugin.cpp +++ b/editor/plugins/curve_editor_plugin.cpp @@ -49,6 +49,7 @@ CurveEditor::CurveEditor() { _tangents_length = 40; _dragging = false; _has_undo_data = false; + _gizmo_handle_scale = EDITOR_GET("interface/touchscreen/scale_gizmo_handles"); set_focus_mode(FOCUS_ALL); set_clip_contents(true); @@ -105,6 +106,11 @@ void CurveEditor::_notification(int p_what) { case NOTIFICATION_DRAW: { _draw(); } break; + case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { + if (EditorSettings::get_singleton()->check_changed_settings_in_group("interface/touchscreen/scale_gizmo_handles")) { + _gizmo_handle_scale = EDITOR_GET("interface/touchscreen/scale_gizmo_handles"); + } + } break; } } @@ -397,7 +403,7 @@ int CurveEditor::get_point_at(Vector2 pos) const { } const Curve &curve = **_curve_ref; - const float true_hover_radius = Math::round(_hover_radius * EDSCALE); + const float true_hover_radius = Math::round(_hover_radius * _gizmo_handle_scale * EDSCALE); const float r = true_hover_radius * true_hover_radius; for (int i = 0; i < curve.get_point_count(); ++i) { @@ -417,14 +423,14 @@ CurveEditor::TangentIndex CurveEditor::get_tangent_at(Vector2 pos) const { if (_selected_point != 0) { Vector2 control_pos = get_tangent_view_pos(_selected_point, TANGENT_LEFT); - if (control_pos.distance_to(pos) < _hover_radius) { + if (control_pos.distance_to(pos) < _hover_radius * _gizmo_handle_scale) { return TANGENT_LEFT; } } if (_selected_point != _curve_ref->get_point_count() - 1) { Vector2 control_pos = get_tangent_view_pos(_selected_point, TANGENT_RIGHT); - if (control_pos.distance_to(pos) < _hover_radius) { + if (control_pos.distance_to(pos) < _hover_radius * _gizmo_handle_scale) { return TANGENT_RIGHT; } } @@ -562,7 +568,7 @@ Vector2 CurveEditor::get_tangent_view_pos(int i, TangentIndex tangent) const { Vector2 point_pos = get_view_pos(_curve_ref->get_point_position(i)); Vector2 control_pos = get_view_pos(_curve_ref->get_point_position(i) + dir); - return point_pos + Math::round(_tangents_length * EDSCALE) * (control_pos - point_pos).normalized(); + return point_pos + Math::round(_tangents_length * _gizmo_handle_scale * EDSCALE) * (control_pos - point_pos).normalized(); } Vector2 CurveEditor::get_view_pos(Vector2 world_pos) const { @@ -707,13 +713,13 @@ void CurveEditor::_draw() { if (i != 0) { Vector2 control_pos = get_tangent_view_pos(i, TANGENT_LEFT); draw_line(get_view_pos(pos), control_pos, tangent_color, Math::round(EDSCALE)); - draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(Math::round(2 * EDSCALE)), tangent_color); + draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(Math::round(2 * _gizmo_handle_scale * EDSCALE)), tangent_color); } if (i != curve.get_point_count() - 1) { Vector2 control_pos = get_tangent_view_pos(i, TANGENT_RIGHT); draw_line(get_view_pos(pos), control_pos, tangent_color, Math::round(EDSCALE)); - draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(Math::round(2 * EDSCALE)), tangent_color); + draw_rect(Rect2(control_pos, Vector2(1, 1)).grow(Math::round(2 * _gizmo_handle_scale * EDSCALE)), tangent_color); } } @@ -736,7 +742,7 @@ void CurveEditor::_draw() { for (int i = 0; i < curve.get_point_count(); ++i) { Vector2 pos = curve.get_point_position(i); - draw_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(Math::round(3 * EDSCALE)), i == _selected_point ? selected_point_color : point_color); + draw_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(Math::round(3 * _gizmo_handle_scale * EDSCALE)), i == _selected_point ? selected_point_color : point_color); // TODO Circles are prettier. Needs a fix! Or a texture //draw_circle(pos, 2, point_color); } @@ -746,7 +752,7 @@ void CurveEditor::_draw() { if (_hover_point != -1) { const Color hover_color = line_color; Vector2 pos = curve.get_point_position(_hover_point); - draw_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(Math::round(_hover_radius * EDSCALE)), hover_color, false, Math::round(EDSCALE)); + draw_rect(Rect2(get_view_pos(pos), Vector2(1, 1)).grow(Math::round(_hover_radius * _gizmo_handle_scale * EDSCALE)), hover_color, false, Math::round(EDSCALE)); } // Help text diff --git a/editor/plugins/curve_editor_plugin.h b/editor/plugins/curve_editor_plugin.h index ca1a824f0c7..b0d666b8472 100644 --- a/editor/plugins/curve_editor_plugin.h +++ b/editor/plugins/curve_editor_plugin.h @@ -117,6 +117,7 @@ private: // Constant float _hover_radius; float _tangents_length; + float _gizmo_handle_scale = 1.0; }; class EditorInspectorPluginCurve : public EditorInspectorPlugin {