|
@@ -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);
|
|
|
|