mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2024-12-22 11:56:49 +01:00
Ported: 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.
- m4gr3d
b78935ef51
This commit is contained in:
parent
d6f5dd35e8
commit
37fa118ec4
@ -520,6 +520,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>
|
||||
|
@ -388,6 +388,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
|
||||
set_restart_if_changed("interface/touchscreen/enable_long_press_as_right_click", true);
|
||||
_initial_set("interface/touchscreen/enable_pan_and_scale_gestures", has_touchscreen_ui);
|
||||
set_restart_if_changed("interface/touchscreen/enable_pan_and_scale_gestures", true);
|
||||
_initial_set("interface/touchscreen/scale_gizmo_handles", has_touchscreen_ui ? 3 : 1);
|
||||
hints["interface/touchscreen/scale_gizmo_handles"] = PropertyInfo(Variant::REAL, "interface/touchscreen/scale_gizmo_handles", PROPERTY_HINT_RANGE, "1,5,1");
|
||||
|
||||
// Scene tabs
|
||||
_initial_set("interface/scene_tabs/show_thumbnail_on_hover", true);
|
||||
@ -621,7 +623,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
|
||||
_initial_set("editors/2d/pan_speed", 20);
|
||||
|
||||
// Polygon editor
|
||||
_initial_set("editors/poly_editor/point_grab_radius", 8);
|
||||
_initial_set("editors/poly_editor/point_grab_radius", has_touchscreen_ui ? 32 : 8);
|
||||
_initial_set("editors/poly_editor/show_previous_outline", true);
|
||||
|
||||
// Animation
|
||||
|
@ -151,6 +151,27 @@ static Ref<ImageTexture> editor_generate_icon(int p_index, bool p_convert_color,
|
||||
#define ADD_CONVERT_COLOR(dictionary, old_color, new_color) dictionary[Color::html(old_color)] = Color::html(new_color)
|
||||
#endif
|
||||
|
||||
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 custom scaling.
|
||||
static RBSet<StringName> gizmo_to_scale;
|
||||
if (gizmo_to_scale.empty()) {
|
||||
gizmo_to_scale.insert("EditorHandle");
|
||||
gizmo_to_scale.insert("EditorHandleAdd");
|
||||
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 = true, int p_thumb_size = 32, bool p_only_thumbs = false) {
|
||||
OS::get_singleton()->benchmark_begin_measure("editor_register_and_generate_icons_" + String((p_only_thumbs ? "with_only_thumbs" : "all")));
|
||||
|
||||
@ -276,10 +297,11 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme =
|
||||
// Generate icons.
|
||||
if (!p_only_thumbs) {
|
||||
for (int i = 0; i < editor_icons_count; i++) {
|
||||
const int is_exception = exceptions.has(editor_icons_names[i]);
|
||||
const Ref<ImageTexture> icon = editor_generate_icon(i, !is_exception);
|
||||
const String &editor_icon_name = editor_icons_names[i];
|
||||
const int is_exception = exceptions.has(editor_icon_name);
|
||||
const Ref<ImageTexture> icon = editor_generate_icon(i, !is_exception, get_gizmo_handle_scale(editor_icon_name));
|
||||
|
||||
p_theme->set_icon(editor_icons_names[i], "EditorIcons", icon);
|
||||
p_theme->set_icon(editor_icon_name, "EditorIcons", icon);
|
||||
}
|
||||
}
|
||||
|
||||
@ -330,6 +352,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
|
||||
String preset = EDITOR_GET("interface/theme/preset");
|
||||
|
||||
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 highlight_tabs = EDITOR_GET("interface/theme/highlight_tabs");
|
||||
int border_size = EDITOR_GET("interface/theme/border_size");
|
||||
|
||||
@ -478,11 +501,18 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
|
||||
theme->set_constant("scale", "Editor", EDSCALE);
|
||||
theme->set_constant("thumb_size", "Editor", thumb_size);
|
||||
theme->set_constant("dark_theme", "Editor", dark_theme);
|
||||
theme->set_constant("gizmo_handle_scale", "Editor", gizmo_handle_scale);
|
||||
|
||||
//Register icons + font
|
||||
bool keep_old_icons = false;
|
||||
if (p_theme != nullptr) {
|
||||
keep_old_icons = fabs(p_theme->get_constant("scale", "Editor") - EDSCALE) < 0.00001 &&
|
||||
fabs(p_theme->get_constant("gizmo_handle_scale", "Editor") - gizmo_handle_scale) < 0.00001 &&
|
||||
(bool)p_theme->get_constant("dark_theme", "Editor") == dark_theme;
|
||||
}
|
||||
|
||||
// the resolution and the icon color (dark_theme bool) has not changed, so we do not regenerate the icons
|
||||
if (p_theme != nullptr && fabs(p_theme->get_constant("scale", "Editor") - EDSCALE) < 0.00001 && (bool)p_theme->get_constant("dark_theme", "Editor") == dark_theme) {
|
||||
if (keep_old_icons) {
|
||||
// register already generated icons
|
||||
for (int i = 0; i < editor_icons_count; i++) {
|
||||
theme->set_icon(editor_icons_names[i], "EditorIcons", p_theme->get_icon(editor_icons_names[i], "EditorIcons"));
|
||||
|
@ -31,6 +31,19 @@
|
||||
#include "collision_shape_2d_editor_plugin.h"
|
||||
|
||||
#include "canvas_item_editor_plugin.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/input/input_event.h"
|
||||
#include "core/math/math_defs.h"
|
||||
#include "core/math/math_funcs.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/object/undo_redo.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "scene/2d/collision_shape_2d.h"
|
||||
#include "scene/main/node.h"
|
||||
#include "scene/main/scene_tree.h"
|
||||
#include "scene/resources/capsule_shape_2d.h"
|
||||
#include "scene/resources/circle_shape_2d.h"
|
||||
#include "scene/resources/concave_polygon_shape_2d.h"
|
||||
@ -38,18 +51,6 @@
|
||||
#include "scene/resources/line_shape_2d.h"
|
||||
#include "scene/resources/rectangle_shape_2d.h"
|
||||
#include "scene/resources/segment_shape_2d.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/math/math_defs.h"
|
||||
#include "core/math/math_funcs.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/input/input_event.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "core/object/undo_redo.h"
|
||||
#include "editor/editor_node.h"
|
||||
#include "scene/2d/collision_shape_2d.h"
|
||||
#include "scene/main/node.h"
|
||||
#include "scene/main/scene_tree.h"
|
||||
#include "scene/resources/shape_2d.h"
|
||||
#include "scene/resources/texture.h"
|
||||
|
||||
@ -357,7 +358,7 @@ bool CollisionShape2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_e
|
||||
if (mb->get_button_index() == BUTTON_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;
|
||||
@ -571,6 +572,10 @@ void CollisionShape2DEditor::_notification(int p_what) {
|
||||
case NOTIFICATION_EXIT_TREE: {
|
||||
get_tree()->disconnect("node_removed", this, "_node_removed");
|
||||
} break;
|
||||
|
||||
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
|
||||
grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -603,6 +608,7 @@ CollisionShape2DEditor::CollisionShape2DEditor(EditorNode *p_editor) {
|
||||
node = nullptr;
|
||||
canvas_item_editor = nullptr;
|
||||
editor = p_editor;
|
||||
grab_threshold = EDITOR_GET("editors/poly_editor/point_grab_radius");
|
||||
|
||||
undo_redo = p_editor->get_undo_redo();
|
||||
|
||||
|
@ -83,6 +83,7 @@ class CollisionShape2DEditor : public Control {
|
||||
int shape_type;
|
||||
int edit_handle;
|
||||
bool pressed;
|
||||
real_t grab_threshold;
|
||||
Variant original;
|
||||
Transform2D original_transform;
|
||||
Point2 last_point;
|
||||
|
@ -31,24 +31,24 @@
|
||||
#include "curve_editor_plugin.h"
|
||||
|
||||
#include "core/core_string_names.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "editor/editor_scale.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/math/color.h"
|
||||
#include "core/error/error_macros.h"
|
||||
#include "core/input/input.h"
|
||||
#include "core/input/input_event.h"
|
||||
#include "core/io/image.h"
|
||||
#include "core/math/color.h"
|
||||
#include "core/math/math_defs.h"
|
||||
#include "core/math/math_funcs.h"
|
||||
#include "core/math/rect2.h"
|
||||
#include "core/input/input_event.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/object/resource.h"
|
||||
#include "core/object/undo_redo.h"
|
||||
#include "core/os/keyboard.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "core/string/string_name.h"
|
||||
#include "core/typedefs.h"
|
||||
#include "core/object/undo_redo.h"
|
||||
#include "core/variant/variant.h"
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_scale.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "scene/2d/canvas_item.h"
|
||||
#include "scene/gui/popup_menu.h"
|
||||
@ -63,6 +63,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);
|
||||
@ -115,8 +116,13 @@ Size2 CurveEditor::get_minimum_size() const {
|
||||
}
|
||||
|
||||
void CurveEditor::_notification(int p_what) {
|
||||
if (p_what == NOTIFICATION_DRAW) {
|
||||
_draw();
|
||||
switch (p_what) {
|
||||
case NOTIFICATION_DRAW: {
|
||||
_draw();
|
||||
} break;
|
||||
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
|
||||
_gizmo_handle_scale = EDITOR_GET("interface/touchscreen/scale_gizmo_handles");
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -410,7 +416,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) {
|
||||
@ -430,14 +436,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;
|
||||
}
|
||||
}
|
||||
@ -574,7 +580,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 {
|
||||
@ -718,13 +724,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), true);
|
||||
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), true);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -747,7 +753,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);
|
||||
}
|
||||
@ -757,7 +763,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
|
||||
|
@ -129,6 +129,7 @@ private:
|
||||
// Constant
|
||||
float _hover_radius;
|
||||
float _tangents_length;
|
||||
float _gizmo_handle_scale;
|
||||
};
|
||||
|
||||
class EditorInspectorPluginCurve : public EditorInspectorPlugin {
|
||||
|
Loading…
Reference in New Issue
Block a user