summaryrefslogtreecommitdiffstats
path: root/scene/gui/control.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-03-06 10:57:56 +0100
committerRémi Verschelde <rverschelde@gmail.com>2023-03-06 10:57:56 +0100
commit0b98b470ccdb2cd87b6ae3fe14b0f58920eaa6ea (patch)
treecf5c5351b8f961de1d9641b32de5ada80283d087 /scene/gui/control.cpp
parent45738d078ad17565f2285ddeba6e6fd3662ed6af (diff)
parent82d7923c653b6328ba279bd4183b63b69e21edfc (diff)
downloadredot-engine-0b98b470ccdb2cd87b6ae3fe14b0f58920eaa6ea.tar.gz
Merge pull request #73716 from bruvzg/improve_locale_selection
Improve layout direction/locale automatic selection.
Diffstat (limited to 'scene/gui/control.cpp')
-rw-r--r--scene/gui/control.cpp41
1 files changed, 28 insertions, 13 deletions
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index ec75fcb665..10f9529ca9 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -2793,19 +2793,34 @@ 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) {
- Window *parent_window = get_parent_window();
- Control *parent_control = get_parent_control();
- if (parent_control) {
- const_cast<Control *>(this)->data.is_rtl = parent_control->is_layout_rtl();
- } else if (parent_window) {
- const_cast<Control *>(this)->data.is_rtl = parent_window->is_layout_rtl();
- } else {
- if (GLOBAL_GET(SNAME("internationalization/rendering/force_right_to_left_layout_direction"))) {
- const_cast<Control *>(this)->data.is_rtl = true;
- } else {
- String locale = TranslationServer::get_singleton()->get_tool_locale();
- const_cast<Control *>(this)->data.is_rtl = TS->is_locale_right_to_left(locale);
+ if (GLOBAL_GET(SNAME("internationalization/rendering/force_right_to_left_layout_direction"))) {
+ const_cast<Control *>(this)->data.is_rtl = true;
+ return data.is_rtl;
+ }
+ Node *parent_node = get_parent();
+ while (parent_node) {
+ Control *parent_control = Object::cast_to<Control>(parent_node);
+ if (parent_control) {
+ const_cast<Control *>(this)->data.is_rtl = parent_control->is_layout_rtl();
+ return data.is_rtl;
}
+
+ Window *parent_window = Object::cast_to<Window>(parent_node);
+ if (parent_window) {
+ const_cast<Control *>(this)->data.is_rtl = parent_window->is_layout_rtl();
+ return data.is_rtl;
+ }
+ parent_node = parent_node->get_parent();
+ }
+
+ int root_dir = GLOBAL_GET(SNAME("internationalization/rendering/root_node_layout_direction"));
+ if (root_dir == 1) {
+ const_cast<Control *>(this)->data.is_rtl = false;
+ } else if (root_dir == 2) {
+ const_cast<Control *>(this)->data.is_rtl = true;
+ } else {
+ String locale = TranslationServer::get_singleton()->get_tool_locale();
+ const_cast<Control *>(this)->data.is_rtl = TS->is_locale_right_to_left(locale);
}
} else if (data.layout_dir == LAYOUT_DIRECTION_LOCALE) {
if (GLOBAL_GET(SNAME("internationalization/rendering/force_right_to_left_layout_direction"))) {
@@ -3230,7 +3245,7 @@ void Control::_bind_methods() {
ADD_GROUP("Layout", "");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents");
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size");
- ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_direction", PROPERTY_HINT_ENUM, "Inherited,Locale,Left-to-Right,Right-to-Left"), "set_layout_direction", "get_layout_direction");
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_direction", PROPERTY_HINT_ENUM, "Inherited,Based on Locale,Left-to-Right,Right-to-Left"), "set_layout_direction", "get_layout_direction");
ADD_PROPERTY(PropertyInfo(Variant::INT, "layout_mode", PROPERTY_HINT_ENUM, "Position,Anchors,Container,Uncontrolled", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_INTERNAL), "_set_layout_mode", "_get_layout_mode");
ADD_PROPERTY_DEFAULT("layout_mode", LayoutMode::LAYOUT_MODE_POSITION);