[Editor] Add option to override editor UI layout direction.

This commit is contained in:
bruvzg 2023-11-17 08:54:07 +02:00
parent ad72de5083
commit 932174fedf
No known key found for this signature in database
GPG key ID: 7960FCF39844EC38
10 changed files with 98 additions and 7 deletions

View file

@ -1387,7 +1387,7 @@ ProjectSettings::ProjectSettings() {
GLOBAL_DEF_RST(PropertyInfo(Variant::INT, "rendering/occlusion_culling/bvh_build_quality", PROPERTY_HINT_ENUM, "Low,Medium,High"), 2);
GLOBAL_DEF(PropertyInfo(Variant::INT, "memory/limits/multithreaded_server/rid_pool_prealloc", PROPERTY_HINT_RANGE, "0,500,1"), 60); // No negative and limit to 500 due to crashes.
GLOBAL_DEF_RST("internationalization/rendering/force_right_to_left_layout_direction", false);
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "internationalization/rendering/root_node_layout_direction", PROPERTY_HINT_ENUM, "Based on Locale,Left-to-Right,Right-to-Left"), 0);
GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "internationalization/rendering/root_node_layout_direction", PROPERTY_HINT_ENUM, "Based on Application Locale,Left-to-Right,Right-to-Left,Based on System Locale"), 0);
GLOBAL_DEF(PropertyInfo(Variant::INT, "gui/timers/incremental_search_max_interval_msec", PROPERTY_HINT_RANGE, "0,10000,1,or_greater"), 2000);

View file

@ -599,6 +599,9 @@
<member name="interface/editor/single_window_mode" type="bool" setter="" getter="">
If [code]true[/code], embed modal windows such as docks inside the main editor window. When single-window mode is enabled, tooltips will also be embedded inside the main editor window, which means they can't be displayed outside of the editor window.
</member>
<member name="interface/editor/ui_layout_direction" type="int" setter="" getter="">
Editor UI default layout direction.
</member>
<member name="interface/editor/unfocused_low_processor_mode_sleep_usec" type="float" setter="" getter="">
When the editor window is unfocused, the amount of sleeping between frames when the low-processor usage mode is enabled (in microseconds). Higher values will result in lower CPU/GPU usage, which can improve battery life on laptops (in addition to improving the running project's performance if the editor has to redraw continuously). However, higher values will result in a less responsive editor. The default value is set to limit the editor to 20 FPS when the editor window is unfocused. See also [member interface/editor/low_processor_mode_sleep_usec].
</member>

View file

@ -6909,6 +6909,10 @@ EditorNode::EditorNode() {
AcceptDialog::set_swap_cancel_ok(swap_cancel_ok == 2);
}
int ed_root_dir = EDITOR_GET("interface/editor/ui_layout_direction");
Control::set_root_layout_direction(ed_root_dir);
Window::set_root_layout_direction(ed_root_dir);
ResourceLoader::set_abort_on_missing_resources(false);
ResourceLoader::set_error_notify_func(&EditorNode::add_io_error);
ResourceLoader::set_dependency_error_notify_func(&EditorNode::_dependency_error_report);

View file

@ -400,6 +400,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
const String display_scale_hint_string = vformat("Auto (%d%%),75%%,100%%,125%%,150%%,175%%,200%%,Custom", Math::round(get_auto_display_scale() * 100));
EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/display_scale", 0, display_scale_hint_string, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
EDITOR_SETTING_USAGE(Variant::INT, PROPERTY_HINT_ENUM, "interface/editor/ui_layout_direction", 0, "Based on Application Locale,Left-to-Right,Right-to-Left,Based on System Locale", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED)
String ed_screen_hints = "Screen With Mouse Pointer:-4,Screen With Keyboard Focus:-3,Primary Screen:-2"; // Note: Main Window Screen:-1 is not used for the main window.
for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) {
ed_screen_hints += ",Screen " + itos(i + 1) + ":" + itos(i);

View file

@ -2847,6 +2847,10 @@ ProjectManager::ProjectManager() {
AcceptDialog::set_swap_cancel_ok(swap_cancel_ok == 2);
}
int pm_root_dir = EDITOR_GET("interface/editor/ui_layout_direction");
Control::set_root_layout_direction(pm_root_dir);
Window::set_root_layout_direction(pm_root_dir);
EditorColorMap::create();
EditorTheme::initialize();
Ref<Theme> theme = create_custom_theme();

View file

@ -197,6 +197,12 @@ void Control::reparent(Node *p_parent, bool p_keep_global_transform) {
// Editor integration.
int Control::root_layout_direction = 0;
void Control::set_root_layout_direction(int p_root_dir) {
root_layout_direction = p_root_dir;
}
void Control::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const {
ERR_READ_THREAD_GUARD;
Node::get_argument_options(p_function, p_idx, r_options);
@ -3024,10 +3030,35 @@ bool Control::is_layout_rtl() const {
if (data.is_rtl_dirty) {
const_cast<Control *>(this)->data.is_rtl_dirty = false;
if (data.layout_dir == LAYOUT_DIRECTION_INHERITED) {
#ifdef TOOLS_ENABLED
if (is_part_of_edited_scene() && GLOBAL_GET(SNAME("internationalization/rendering/force_right_to_left_layout_direction"))) {
const_cast<Control *>(this)->data.is_rtl = true;
return data.is_rtl;
}
if (is_inside_tree()) {
Node *edited_scene_root = get_tree()->get_edited_scene_root();
if (edited_scene_root == this) {
int proj_root_layout_direction = GLOBAL_GET(SNAME("internationalization/rendering/root_node_layout_direction"));
if (proj_root_layout_direction == 1) {
const_cast<Control *>(this)->data.is_rtl = false;
} else if (proj_root_layout_direction == 2) {
const_cast<Control *>(this)->data.is_rtl = true;
} else if (proj_root_layout_direction == 3) {
String locale = OS::get_singleton()->get_locale();
const_cast<Control *>(this)->data.is_rtl = TS->is_locale_right_to_left(locale);
} else {
String locale = TranslationServer::get_singleton()->get_tool_locale();
const_cast<Control *>(this)->data.is_rtl = TS->is_locale_right_to_left(locale);
}
return data.is_rtl;
}
}
#else
if (GLOBAL_GET(SNAME("internationalization/rendering/force_right_to_left_layout_direction"))) {
const_cast<Control *>(this)->data.is_rtl = true;
return data.is_rtl;
}
#endif
Node *parent_node = get_parent();
while (parent_node) {
Control *parent_control = Object::cast_to<Control>(parent_node);
@ -3044,11 +3075,13 @@ bool Control::is_layout_rtl() const {
parent_node = parent_node->get_parent();
}
int root_dir = GLOBAL_GET(SNAME("internationalization/rendering/root_node_layout_direction"));
if (root_dir == 1) {
if (root_layout_direction == 1) {
const_cast<Control *>(this)->data.is_rtl = false;
} else if (root_dir == 2) {
} else if (root_layout_direction == 2) {
const_cast<Control *>(this)->data.is_rtl = true;
} else if (root_layout_direction == 3) {
String locale = OS::get_singleton()->get_locale();
const_cast<Control *>(this)->data.is_rtl = TS->is_locale_right_to_left(locale);
} else {
String locale = TranslationServer::get_singleton()->get_tool_locale();
const_cast<Control *>(this)->data.is_rtl = TS->is_locale_right_to_left(locale);

View file

@ -317,6 +317,8 @@ private:
// Extra properties.
static int root_layout_direction;
String get_tooltip_text() const;
protected:
@ -403,6 +405,8 @@ public:
// Editor integration.
static void set_root_layout_direction(int p_root_dir);
virtual void get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const override;
PackedStringArray get_configuration_warnings() const override;

View file

@ -40,6 +40,14 @@
#include "scene/theme/theme_db.h"
#include "scene/theme/theme_owner.h"
// Editor integration.
int Window::root_layout_direction = 0;
void Window::set_root_layout_direction(int p_root_dir) {
root_layout_direction = p_root_dir;
}
// Dynamic properties.
bool Window::_set(const StringName &p_name, const Variant &p_value) {
@ -2517,9 +2525,32 @@ Window::LayoutDirection Window::get_layout_direction() const {
bool Window::is_layout_rtl() const {
ERR_READ_THREAD_GUARD_V(false);
if (layout_dir == LAYOUT_DIRECTION_INHERITED) {
#ifdef TOOLS_ENABLED
if (is_part_of_edited_scene() && GLOBAL_GET(SNAME("internationalization/rendering/force_right_to_left_layout_direction"))) {
return true;
}
if (is_inside_tree()) {
Node *edited_scene_root = get_tree()->get_edited_scene_root();
if (edited_scene_root == this) {
int proj_root_layout_direction = GLOBAL_GET(SNAME("internationalization/rendering/root_node_layout_direction"));
if (proj_root_layout_direction == 1) {
return false;
} else if (proj_root_layout_direction == 2) {
return true;
} else if (proj_root_layout_direction == 3) {
String locale = OS::get_singleton()->get_locale();
return TS->is_locale_right_to_left(locale);
} else {
String locale = TranslationServer::get_singleton()->get_tool_locale();
return TS->is_locale_right_to_left(locale);
}
}
}
#else
if (GLOBAL_GET(SNAME("internationalization/rendering/force_right_to_left_layout_direction"))) {
return true;
}
#endif
Node *parent_node = get_parent();
while (parent_node) {
Control *parent_control = Object::cast_to<Control>(parent_node);
@ -2534,11 +2565,13 @@ bool Window::is_layout_rtl() const {
parent_node = parent_node->get_parent();
}
int root_dir = GLOBAL_GET(SNAME("internationalization/rendering/root_node_layout_direction"));
if (root_dir == 1) {
if (root_layout_direction == 1) {
return false;
} else if (root_dir == 2) {
} else if (root_layout_direction == 2) {
return true;
} else if (root_layout_direction == 3) {
String locale = OS::get_singleton()->get_locale();
return TS->is_locale_right_to_left(locale);
} else {
String locale = TranslationServer::get_singleton()->get_tool_locale();
return TS->is_locale_right_to_left(locale);

View file

@ -234,6 +234,8 @@ private:
Ref<Shortcut> debugger_stop_shortcut;
static int root_layout_direction;
protected:
virtual Rect2i _popup_adjust_rect() const { return Rect2i(); }
virtual void _post_popup() {}
@ -260,6 +262,8 @@ public:
NOTIFICATION_THEME_CHANGED = 32
};
static void set_root_layout_direction(int p_root_dir);
void set_title(const String &p_title);
String get_title() const;

View file

@ -454,6 +454,10 @@ void register_scene_types() {
AcceptDialog::set_swap_cancel_ok(swap_cancel_ok);
#endif
int root_dir = GLOBAL_GET("internationalization/rendering/root_node_layout_direction");
Control::set_root_layout_direction(root_dir);
Window::set_root_layout_direction(root_dir);
/* REGISTER ANIMATION */
GDREGISTER_CLASS(Tween);
GDREGISTER_ABSTRACT_CLASS(Tweener);