Adds a scale_gizmo_handles
entry to the Touchscreen
editor settings
When enabled, this scales the editor icons to improve usability on touchscreen devices. In addition this commit fixes touch detection for the collision_shape_2d_editor_plugin so it scales with the icons size.
This commit is contained in:
parent
cbc99ee460
commit
30824e9818
8 changed files with 73 additions and 18 deletions
|
@ -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.
|
||||
</member>
|
||||
<member name="interface/touchscreen/scale_gizmo_handles" type="float" setter="" getter="">
|
||||
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.
|
||||
</member>
|
||||
<member name="network/debug/remote_host" type="String" setter="" getter="">
|
||||
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]).
|
||||
</member>
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -477,6 +477,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> 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<ConfigFile> 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
|
||||
|
|
|
@ -255,6 +255,28 @@ static Ref<ImageTexture> 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<StringName> 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<Theme> 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<Theme> p_theme, bool p_dark_theme, f
|
|||
for (int i = 0; i < editor_icons_count; i++) {
|
||||
Ref<ImageTexture> 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<Theme> create_editor_theme(const Ref<Theme> 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<Theme> create_editor_theme(const Ref<Theme> 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<Theme> create_editor_theme(const Ref<Theme> 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);
|
||||
|
|
|
@ -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<InputEvent> &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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<InputEvent> &p_event);
|
||||
void forward_canvas_draw_over_viewport(Control *p_overlay);
|
||||
void edit(Node *p_node);
|
||||
|
||||
CollisionShape2DEditor();
|
||||
};
|
||||
|
||||
class CollisionShape2DEditorPlugin : public EditorPlugin {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -117,6 +117,7 @@ private:
|
|||
// Constant
|
||||
float _hover_radius;
|
||||
float _tangents_length;
|
||||
float _gizmo_handle_scale = 1.0;
|
||||
};
|
||||
|
||||
class EditorInspectorPluginCurve : public EditorInspectorPlugin {
|
||||
|
|
Loading…
Reference in a new issue