浏览代码

Merge pull request #538 from bruvzg/ctl_demos

[Complex Text Layouts] Add BiDi and UI mirroring demos.
Aaron Franke 3 年之前
父节点
当前提交
895749024a
共有 42 个文件被更改,包括 1856 次插入0 次删除
  1. 94 0
      gui/bidi_and_font_features/LICENSE.LinLibertine.txt
  2. 92 0
      gui/bidi_and_font_features/LICENSE.Noto.txt
  3. 13 0
      gui/bidi_and_font_features/README.md
  4. 33 0
      gui/bidi_and_font_features/bidi.gd
  5. 627 0
      gui/bidi_and_font_features/bidi.tscn
  6. 15 0
      gui/bidi_and_font_features/custom_st_parser.gd
  7. 二进制
      gui/bidi_and_font_features/fonts/LinLibertine_R.otf
  8. 28 0
      gui/bidi_and_font_features/fonts/LinLibertine_R.otf.import
  9. 二进制
      gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf
  10. 28 0
      gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf.import
  11. 二进制
      gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf
  12. 28 0
      gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf.import
  13. 二进制
      gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf
  14. 28 0
      gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf.import
  15. 二进制
      gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf
  16. 28 0
      gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf.import
  17. 二进制
      gui/bidi_and_font_features/icon.png
  18. 35 0
      gui/bidi_and_font_features/icon.png.import
  19. 6 0
      gui/bidi_and_font_features/lib_font.tres
  20. 12 0
      gui/bidi_and_font_features/noto_font.tres
  21. 15 0
      gui/bidi_and_font_features/project.godot
  22. 二进制
      gui/bidi_and_font_features/screenshots/bidi.png
  23. 35 0
      gui/bidi_and_font_features/screenshots/bidi.png.import
  24. 二进制
      gui/bidi_and_font_features/screenshots/font_features.png
  25. 35 0
      gui/bidi_and_font_features/screenshots/font_features.png.import
  26. 二进制
      gui/bidi_and_font_features/screenshots/line_break_and_fill.png
  27. 35 0
      gui/bidi_and_font_features/screenshots/line_break_and_fill.png.import
  28. 92 0
      gui/ui_mirroring/LICENSE.Noto.txt
  29. 12 0
      gui/ui_mirroring/README.md
  30. 二进制
      gui/ui_mirroring/fonts/NotoNaskhArabic-Bold.ttf
  31. 28 0
      gui/ui_mirroring/fonts/NotoNaskhArabic-Bold.ttf.import
  32. 二进制
      gui/ui_mirroring/fonts/NotoSans-Bold.ttf
  33. 28 0
      gui/ui_mirroring/fonts/NotoSans-Bold.ttf.import
  34. 二进制
      gui/ui_mirroring/icon.png
  35. 35 0
      gui/ui_mirroring/icon.png.import
  36. 8 0
      gui/ui_mirroring/noto_font.tres
  37. 15 0
      gui/ui_mirroring/project.godot
  38. 二进制
      gui/ui_mirroring/screenshots/ui_mirroring_ar.png
  39. 35 0
      gui/ui_mirroring/screenshots/ui_mirroring_ar.png.import
  40. 二进制
      gui/ui_mirroring/screenshots/ui_mirroring_en.png
  41. 35 0
      gui/ui_mirroring/screenshots/ui_mirroring_en.png.import
  42. 381 0
      gui/ui_mirroring/ui_mirroring.tscn

+ 94 - 0
gui/bidi_and_font_features/LICENSE.LinLibertine.txt

@@ -0,0 +1,94 @@
+Copyright (c) 2003–2012, Philipp H. Poll (www.linuxlibertine.org | gillian at linuxlibertine.org),
+with Reserved Font Name "Linux Libertine" and "Biolinum".
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.

+ 92 - 0
gui/bidi_and_font_features/LICENSE.Noto.txt

@@ -0,0 +1,92 @@
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to
+provide a free and open framework in which fonts may be shared and
+improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software
+components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to,
+deleting, or substituting -- in part or in whole -- any of the
+components of the Original Version, by changing formats or by porting
+the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed,
+modify, redistribute, and sell modified and unmodified copies of the
+Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the
+corresponding Copyright Holder. This restriction only applies to the
+primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created using
+the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.

+ 13 - 0
gui/bidi_and_font_features/README.md

@@ -0,0 +1,13 @@
+BiDI and Font Features Demo
+
+A demo showing BiDi text and BiDi overrides, line breaking and justification, and OpenType font features.
+
+Language: GDScript
+
+Renderer: Vulkan
+
+## Screenshots
+
+![Screenshot](screenshots/bidi.png)
+![Screenshot](screenshots/line_break_and_fill.png)
+![Screenshot](screenshots/font_features.png)

+ 33 - 0
gui/bidi_and_font_features/bidi.gd

@@ -0,0 +1,33 @@
+extends Control
+
+func _ready():
+	var tree = $"TabContainer/Text direction/Tree"
+	var root = tree.create_item()
+	tree.set_hide_root(true)
+	var first = tree.create_item(root)
+	first.set_text(0, "רֵאשִׁית")
+	var second = tree.create_item(first)
+	second.set_text(0, "שֵׁנִי")
+	var third = tree.create_item(second)
+	third.set_text(0, "שְׁלִישִׁי")
+	var fourth = tree.create_item(third)
+	fourth.set_text(0, "fourth")
+
+func _on_Tree_item_selected():
+	var tree = $"TabContainer/Text direction/Tree"
+	var path = ""
+	var item = tree.get_selected()
+	while item != null:
+		path = item.get_text(0) + "/" + path
+		item = item.get_parent()
+	$"TabContainer/Text direction/LineEditST".text = path
+	$"TabContainer/Text direction/LineEditNoST".text = path
+
+func _on_LineEditCustomSTDst_text_changed(new_text):
+	$"TabContainer/Text direction/LineEditCustomSTSource".text = new_text
+
+func _on_LineEditCustomSTSource_text_changed(new_text):
+	$"TabContainer/Text direction/LineEditCustomSTDst".text = new_text
+
+func _on_LineEditCustomSTDst_tree_entered():
+	$"TabContainer/Text direction/LineEditCustomSTDst".text = $"TabContainer/Text direction/LineEditCustomSTSource".text # Refresh text to apply custom script once it's loaded.

+ 627 - 0
gui/bidi_and_font_features/bidi.tscn

@@ -0,0 +1,627 @@
+[gd_scene load_steps=5 format=3 uid="uid://doa7j7q1j4p4e"]
+
+[ext_resource type="Font" path="res://noto_font.tres" id="1"]
+[ext_resource type="Script" path="res://bidi.gd" id="2"]
+[ext_resource type="Script" path="res://custom_st_parser.gd" id="3"]
+[ext_resource type="Font" path="res://lib_font.tres" id="4"]
+
+[node name="Control" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = ExtResource( "2" )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="TabContainer" type="TabContainer" parent="."]
+anchor_right = 1.0
+anchor_bottom = 1.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Line breaking and justification" type="Panel" parent="TabContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 38.0
+offset_right = -4.0
+offset_bottom = -4.0
+script = null
+
+[node name="LabelBrkInfo" type="Label" parent="TabContainer/Line breaking and justification"]
+offset_left = 30.0
+offset_top = 30.0
+offset_right = 830.0
+offset_bottom = 52.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "1. Line breaking and space justification."
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelTHNoBreak" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 69.5027
+offset_right = 988.0
+offset_bottom = 92.5027
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "ภาษาไทย หรือ ภาษาไทยกลาง เป็นภาษาราชการและภาษาประจำชาติของประเทศไทย ภาษาไทยเป็นภาษาในกลุ่มภาษาไทซึ่งเป็นกลุ่มย่อยของตระกูลภาษาขร้า-ไท"
+autowrap_mode = 3
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelTHBreak" type="Label" parent="TabContainer/Line breaking and justification"]
+offset_left = 30.0
+offset_top = 100.0
+offset_right = 333.0
+offset_bottom = 200.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "ภาษาไทย หรือ ภาษาไทยกลาง เป็นภาษาราชการและภาษาประจำชาติของประเทศไทย ภาษาไทยเป็นภาษาในกลุ่มภาษาไทซึ่งเป็นกลุ่มย่อยของตระกูลภาษาขร้า-ไท"
+align = 3
+autowrap_mode = 3
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelJstInfo" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 213.5
+offset_right = 830.0
+offset_bottom = 236.5
+theme_override_colors/font_color = Color(0.420413, 0.832031, 0.504023, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "2. Kashida justification."
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelARNoJst2" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 248.5
+offset_right = 830.0
+offset_bottom = 271.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "آنچ اندر وهم ناید آن شوم"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelARJst" type="Label" parent="TabContainer/Line breaking and justification"]
+anchor_top = 0.000891266
+anchor_bottom = 0.000891266
+offset_left = 30.0
+offset_top = 273.5
+offset_right = 255.0
+offset_bottom = 296.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "آنچ اندر وهم ناید آن شوم"
+align = 3
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Text direction" type="Panel" parent="TabContainer"]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 38.0
+offset_right = -4.0
+offset_bottom = -4.0
+script = null
+
+[node name="LabelDirInfo" type="Label" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 30.0
+offset_right = 830.0
+offset_bottom = 50.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "1. Base text direction. (Left-to-right, Auto, Right-to-left)"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditL1" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 60.0
+offset_right = 260.0
+offset_bottom = 90.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Najaf (ٱلنَّجَف‎), also known as Baniqia."
+editable = false
+context_menu_enabled = false
+text_direction = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditA1" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 270.0
+offset_top = 60.0
+offset_right = 500.0
+offset_bottom = 90.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Najaf (ٱلنَّجَف‎), also known as Baniqia."
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditR1" type="LineEdit" parent="TabContainer/Text direction"]
+modulate = Color(0.847059, 0.54902, 0.54902, 1)
+offset_left = 510.0
+offset_top = 60.0
+offset_right = 740.0
+offset_bottom = 90.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Najaf (ٱلنَّجَف‎), also known as Baniqia."
+editable = false
+context_menu_enabled = false
+text_direction = 2
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditL2" type="LineEdit" parent="TabContainer/Text direction"]
+modulate = Color(0.847059, 0.54902, 0.54902, 1)
+offset_left = 30.0
+offset_top = 99.5
+offset_right = 260.0
+offset_bottom = 129.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "الإنجليزية أو الإنغليزية (بالإنجليزية: English)‏،"
+editable = false
+context_menu_enabled = false
+text_direction = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditA2" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 270.0
+offset_top = 100.0
+offset_right = 500.0
+offset_bottom = 130.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "الإنجليزية أو الإنغليزية (بالإنجليزية: English)‏،"
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditR2" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 510.0
+offset_top = 100.0
+offset_right = 740.0
+offset_bottom = 130.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "الإنجليزية أو الإنغليزية (بالإنجليزية: English)‏،"
+editable = false
+context_menu_enabled = false
+text_direction = 2
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelSTInfo" type="Label" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 150.0
+offset_right = 830.0
+offset_bottom = 170.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "2. BiDi override for structured text (select item in the list to test)."
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Tree" type="Tree" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 180.0
+offset_right = 430.0
+offset_bottom = 340.0
+theme_override_fonts/title_button_font = ExtResource( "1" )
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelNoST" type="Label" parent="TabContainer/Text direction"]
+offset_left = 460.0
+offset_top = 195.0
+offset_right = 560.0
+offset_bottom = 215.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "Default BiDi:"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelST" type="Label" parent="TabContainer/Text direction"]
+offset_left = 460.0
+offset_top = 238.5
+offset_right = 560.0
+offset_bottom = 258.5
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "\"File\" override:"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditNoST" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 582.0
+offset_top = 188.0
+offset_right = 882.0
+offset_bottom = 218.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditST" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 582.0
+offset_top = 236.0
+offset_right = 882.0
+offset_bottom = 266.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+editable = false
+context_menu_enabled = false
+structured_text_bidi_override = 2
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelSTCustomInfo" type="Label" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 358.0
+offset_right = 830.0
+offset_bottom = 381.0
+theme_override_colors/font_color = Color(0.419608, 0.831373, 0.505882, 1)
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "3. Custom BiDi override script (split by \":\" and reverse the order, see \"cutom_st_parser.gd\"):"
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditCustomSTSource" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 30.0
+offset_top = 396.0
+offset_right = 330.0
+offset_bottom = 426.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "first:second:third"
+context_menu_enabled = false
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LineEditCustomSTDst" type="LineEdit" parent="TabContainer/Text direction"]
+offset_left = 342.0
+offset_top = 396.0
+offset_right = 642.0
+offset_bottom = 426.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 14
+text = "first:second:third"
+context_menu_enabled = false
+structured_text_bidi_override = 6
+structured_text_bidi_override_options = []
+script = ExtResource( "3" )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="Font features" type="Panel" parent="TabContainer"]
+visible = false
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = 4.0
+offset_top = 38.0
+offset_right = -4.0
+offset_bottom = -4.0
+script = null
+
+[node name="LabelDisplay1" type="Label" parent="TabContainer/Font features"]
+offset_left = 30.0
+offset_top = 30.0
+offset_right = 330.0
+offset_bottom = 70.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo1" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 30.0
+offset_right = 746.0
+offset_bottom = 70.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "default, no features"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay2" type="Label" parent="TabContainer/Font features"]
+offset_left = 30.0
+offset_top = 69.5
+offset_right = 330.0
+offset_bottom = 109.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/standard_ligatures = null
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo2" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 70.0
+offset_right = 746.0
+offset_bottom = 110.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "standard_ligatures=0 (disabled)"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay3" type="Label" parent="TabContainer/Font features"]
+offset_left = 30.0
+offset_top = 109.5
+offset_right = 330.0
+offset_bottom = 149.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/small_capitals = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo3" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 110.0
+offset_right = 746.0
+offset_bottom = 150.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "small_capitals=1"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay4" type="Label" parent="TabContainer/Font features"]
+offset_left = 31.0
+offset_top = 150.5
+offset_right = 331.0
+offset_bottom = 190.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/slashed_zero = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo4" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 150.0
+offset_right = 746.0
+offset_bottom = 190.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "slashed_zero=1"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay5" type="Label" parent="TabContainer/Font features"]
+offset_left = 31.0
+offset_top = 190.5
+offset_right = 331.0
+offset_bottom = 230.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/fractions = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo5" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 190.0
+offset_right = 918.609
+offset_bottom = 230.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "fractions"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelDisplay6" type="Label" parent="TabContainer/Font features"]
+offset_left = 31.0
+offset_top = 230.5
+offset_right = 331.0
+offset_bottom = 270.5
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 24
+text = "Que fin after 019 1/2 1/3 &, h, β, θ,"
+valign = 1
+structured_text_bidi_override_options = []
+opentype_features/oldstyle_figures = 1.0
+opentype_features/stylistic_alternates = 1.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo6" type="Label" parent="TabContainer/Font features"]
+offset_left = 446.0
+offset_top = 230.0
+offset_right = 918.609
+offset_bottom = 270.0
+theme_override_fonts/font = ExtResource( "4" )
+theme_override_font_sizes/font_size = 16
+text = "oldstyle_figures=1, stylistic_alternates=1"
+valign = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="RichTextLabel" type="RichTextLabel" parent="TabContainer/Font features"]
+offset_left = 33.0
+offset_top = 287.0
+offset_right = 965.0
+offset_bottom = 383.0
+theme_override_fonts/normal_font = ExtResource( "4" )
+text = "
+Que fin 1/3 0 Que fin 1/3 0 Que fin 1/3 0
+"
+bbcode_enabled = true
+custom_effects = []
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="RichTextLabel2" type="RichTextLabel" parent="TabContainer/Font features"]
+anchor_left = -0.000334372
+anchor_right = -0.000334372
+offset_left = 33.3397
+offset_top = 407.0
+offset_right = 992.34
+offset_bottom = 490.0
+theme_override_fonts/normal_font = ExtResource( "4" )
+text = "[font_size=24]
+Que fin 1/3 0 [opentype_features=liga=0]Que fin 1/3 0[/opentype_features] [opentype_features=frac=1,zero]Que fin 1/3 0[/opentype_features]
+[/font_size]"
+custom_effects = []
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="item_selected" from="TabContainer/Text direction/Tree" to="." method="_on_Tree_item_selected"]
+[connection signal="text_changed" from="TabContainer/Text direction/LineEditCustomSTSource" to="." method="_on_LineEditCustomSTSource_text_changed"]
+[connection signal="text_changed" from="TabContainer/Text direction/LineEditCustomSTDst" to="." method="_on_LineEditCustomSTDst_text_changed"]
+[connection signal="tree_entered" from="TabContainer/Text direction/LineEditCustomSTDst" to="." method="_on_LineEditCustomSTDst_tree_entered"]

+ 15 - 0
gui/bidi_and_font_features/custom_st_parser.gd

@@ -0,0 +1,15 @@
+extends LineEdit
+
+func _structured_text_parser(args, text):
+	var output = []
+	var tags = text.split(":")
+	var prev = 0
+	var count = int(tags.size())
+	output.clear()
+	for i in range(count):
+		var range1 = Vector2i(prev, prev + tags[i].length())
+		var range2 = Vector2i(prev + tags[i].length(), prev + tags[i].length() + 1)
+		output.push_front(range1)
+		output.push_front(range2)
+		prev = prev + tags[i].length() + 1
+	return output

二进制
gui/bidi_and_font_features/fonts/LinLibertine_R.otf


+ 28 - 0
gui/bidi_and_font_features/fonts/LinLibertine_R.otf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://bic5b75wmaxwj"
+path="res://.godot/imported/LinLibertine_R.otf-0d33583986cf94e9ad55cc89a5951934.fontdata"
+
+[deps]
+
+source_file="res://fonts/LinLibertine_R.otf"
+dest_files=["res://.godot/imported/LinLibertine_R.otf-0d33583986cf94e9ad55cc89a5951934.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

二进制
gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoNaskhArabicUI_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://61ui1kmi5tt7"
+path="res://.godot/imported/NotoNaskhArabicUI_Regular.ttf-71ae3841953d426d66ee60d00f69e0e0.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoNaskhArabicUI_Regular.ttf"
+dest_files=["res://.godot/imported/NotoNaskhArabicUI_Regular.ttf-71ae3841953d426d66ee60d00f69e0e0.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

二进制
gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoSansHebrew_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://cwer1pi5ka4io"
+path="res://.godot/imported/NotoSansHebrew_Regular.ttf-9d09161984e30bb05b9445728c29a2a8.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSansHebrew_Regular.ttf"
+dest_files=["res://.godot/imported/NotoSansHebrew_Regular.ttf-9d09161984e30bb05b9445728c29a2a8.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

二进制
gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoSansThaiUI_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://dcyy0x2u3jocr"
+path="res://.godot/imported/NotoSansThaiUI_Regular.ttf-a2b65614687aa5ce07b4d39f23198f14.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSansThaiUI_Regular.ttf"
+dest_files=["res://.godot/imported/NotoSansThaiUI_Regular.ttf-a2b65614687aa5ce07b4d39f23198f14.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

二进制
gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf


+ 28 - 0
gui/bidi_and_font_features/fonts/NotoSansUI_Regular.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://ba53h385o6ips"
+path="res://.godot/imported/NotoSansUI_Regular.ttf-e126ff40055cb76ad9714327677638b8.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSansUI_Regular.ttf"
+dest_files=["res://.godot/imported/NotoSansUI_Regular.ttf-e126ff40055cb76ad9714327677638b8.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

二进制
gui/bidi_and_font_features/icon.png


+ 35 - 0
gui/bidi_and_font_features/icon.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://g6u3g3bv5nva"
+path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 6 - 0
gui/bidi_and_font_features/lib_font.tres

@@ -0,0 +1,6 @@
+[gd_resource type="Font" load_steps=2 format=2]
+
+[ext_resource path="res://fonts/LinLibertine_R.otf" type="FontData" id=1]
+
+[resource]
+data/0 = ExtResource( 1 )

+ 12 - 0
gui/bidi_and_font_features/noto_font.tres

@@ -0,0 +1,12 @@
+[gd_resource type="Font" load_steps=5 format=2]
+
+[ext_resource path="res://fonts/NotoSansThaiUI_Regular.ttf" type="FontData" id=1]
+[ext_resource path="res://fonts/NotoNaskhArabicUI_Regular.ttf" type="FontData" id=2]
+[ext_resource path="res://fonts/NotoSansHebrew_Regular.ttf" type="FontData" id=3]
+[ext_resource path="res://fonts/NotoSansUI_Regular.ttf" type="FontData" id=4]
+
+[resource]
+data/0 = ExtResource( 1 )
+data/1 = ExtResource( 2 )
+data/2 = ExtResource( 3 )
+data/3 = ExtResource( 4 )

+ 15 - 0
gui/bidi_and_font_features/project.godot

@@ -0,0 +1,15 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=4
+
+[application]
+
+config/name="BiDi and font features demo."
+run/main_scene="res://bidi.tscn"
+config/icon="res://icon.png"

二进制
gui/bidi_and_font_features/screenshots/bidi.png


+ 35 - 0
gui/bidi_and_font_features/screenshots/bidi.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://e0kr85p63y1e"
+path="res://.godot/imported/bidi.png-b063a53994859c3e43f1022e88c1162c.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/bidi.png"
+dest_files=["res://.godot/imported/bidi.png-b063a53994859c3e43f1022e88c1162c.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

二进制
gui/bidi_and_font_features/screenshots/font_features.png


+ 35 - 0
gui/bidi_and_font_features/screenshots/font_features.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://c1acx0yclosw3"
+path="res://.godot/imported/font_features.png-0a9509f2c2c735752a635f0a4ca36458.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/font_features.png"
+dest_files=["res://.godot/imported/font_features.png-0a9509f2c2c735752a635f0a4ca36458.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

二进制
gui/bidi_and_font_features/screenshots/line_break_and_fill.png


+ 35 - 0
gui/bidi_and_font_features/screenshots/line_break_and_fill.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://buudvan2lbkg8"
+path="res://.godot/imported/line_break_and_fill.png-7f47b8c4f43550cfc850eae46ff42cd7.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/line_break_and_fill.png"
+dest_files=["res://.godot/imported/line_break_and_fill.png-7f47b8c4f43550cfc850eae46ff42cd7.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 92 - 0
gui/ui_mirroring/LICENSE.Noto.txt

@@ -0,0 +1,92 @@
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to
+provide a free and open framework in which fonts may be shared and
+improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software
+components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to,
+deleting, or substituting -- in part or in whole -- any of the
+components of the Original Version, by changing formats or by porting
+the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed,
+modify, redistribute, and sell modified and unmodified copies of the
+Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the
+corresponding Copyright Holder. This restriction only applies to the
+primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created using
+the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.

+ 12 - 0
gui/ui_mirroring/README.md

@@ -0,0 +1,12 @@
+# UI Mirroring Demo
+
+A demo showing how to use UI mirroring.
+
+Language: GDScript
+
+Renderer: Vulkan
+
+## Screenshots
+
+![Screenshot](screenshots/ui_mirroring_ar.png)
+![Screenshot](screenshots/ui_mirroring_en.png)

二进制
gui/ui_mirroring/fonts/NotoNaskhArabic-Bold.ttf


+ 28 - 0
gui/ui_mirroring/fonts/NotoNaskhArabic-Bold.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://cppw66bb3hcnx"
+path="res://.godot/imported/NotoNaskhArabic-Bold.ttf-b67ac52f5189efb58090e60209f82666.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoNaskhArabic-Bold.ttf"
+dest_files=["res://.godot/imported/NotoNaskhArabic-Bold.ttf-b67ac52f5189efb58090e60209f82666.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

二进制
gui/ui_mirroring/fonts/NotoSans-Bold.ttf


+ 28 - 0
gui/ui_mirroring/fonts/NotoSans-Bold.ttf.import

@@ -0,0 +1,28 @@
+[remap]
+
+importer="font_data_dynamic"
+type="FontData"
+uid="uid://gfhw2u2k16h"
+path="res://.godot/imported/NotoSans-Bold.ttf-8ff3d9f1cfda88e84d6afd9724b2bba7.fontdata"
+
+[deps]
+
+source_file="res://fonts/NotoSans-Bold.ttf"
+dest_files=["res://.godot/imported/NotoSans-Bold.ttf-8ff3d9f1cfda88e84d6afd9724b2bba7.fontdata"]
+
+[params]
+
+antialiased=true
+multichannel_signed_distance_field=false
+msdf_pixel_range=8.0
+force_autohinter=false
+hinting=1
+oversampling=0.0
+compress=true
+preload/char_ranges=PackedStringArray()
+preload/glyph_ranges=PackedStringArray()
+preload/configurations=PackedStringArray()
+support_overrides/language_enabled=PackedStringArray()
+support_overrides/language_disabled=PackedStringArray()
+support_overrides/script_enabled=PackedStringArray()
+support_overrides/script_disabled=PackedStringArray()

二进制
gui/ui_mirroring/icon.png


+ 35 - 0
gui/ui_mirroring/icon.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://bn78a6fg2lrwg"
+path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://icon.png"
+dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 8 - 0
gui/ui_mirroring/noto_font.tres

@@ -0,0 +1,8 @@
+[gd_resource type="Font" load_steps=3 format=2]
+
+[ext_resource path="res://fonts/NotoSans-Bold.ttf" type="FontData" id=1]
+[ext_resource path="res://fonts/NotoNaskhArabic-Bold.ttf" type="FontData" id=2]
+
+[resource]
+data/0 = ExtResource( 1 )
+data/1 = ExtResource( 2 )

+ 15 - 0
gui/ui_mirroring/project.godot

@@ -0,0 +1,15 @@
+; Engine configuration file.
+; It's best edited using the editor UI and not directly,
+; since the parameters that go here are not all obvious.
+;
+; Format:
+;   [section] ; section goes between []
+;   param=value ; assign values to parameters
+
+config_version=4
+
+[application]
+
+config/name="UI Mirroring Demo"
+run/main_scene="res://ui_mirroring.tscn"
+config/icon="res://icon.png"

二进制
gui/ui_mirroring/screenshots/ui_mirroring_ar.png


+ 35 - 0
gui/ui_mirroring/screenshots/ui_mirroring_ar.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://bk7vjwlmxebjj"
+path="res://.godot/imported/ui_mirroring_ar.png-0ac3776471fa54847d7107e345a38530.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/ui_mirroring_ar.png"
+dest_files=["res://.godot/imported/ui_mirroring_ar.png-0ac3776471fa54847d7107e345a38530.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

二进制
gui/ui_mirroring/screenshots/ui_mirroring_en.png


+ 35 - 0
gui/ui_mirroring/screenshots/ui_mirroring_en.png.import

@@ -0,0 +1,35 @@
+[remap]
+
+importer="texture"
+type="StreamTexture2D"
+uid="uid://kmiwt21qccaq"
+path="res://.godot/imported/ui_mirroring_en.png-2424f2dd8e09af8f321757ff70ce6185.stex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://screenshots/ui_mirroring_en.png"
+dest_files=["res://.godot/imported/ui_mirroring_en.png-2424f2dd8e09af8f321757ff70ce6185.stex"]
+
+[params]
+
+compress/mode=0
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/bptc_ldr=0
+compress/normal_map=0
+compress/channel_pack=0
+compress/streamed=false
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/HDR_as_SRGB=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0

+ 381 - 0
gui/ui_mirroring/ui_mirroring.tscn

@@ -0,0 +1,381 @@
+[gd_scene load_steps=3 format=3 uid="uid://c20r173idr1eu"]
+
+[ext_resource type="Font" path="res://noto_font.tres" id="1"]
+
+[sub_resource type="GDScript" id="1"]
+script/source = "extends Control
+
+func _ready():
+	$Label.text = TranslationServer.get_locale()
+
+func _on_Button_pressed():
+	if TranslationServer.get_locale() != \"ar\":
+		TranslationServer.set_locale(\"ar\")
+	else:
+		TranslationServer.set_locale(\"en\")
+	$Label.text = TranslationServer.get_locale()
+"
+
+[node name="Control" type="Control"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+script = SubResource( "1" )
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="PanelLTR" type="Panel" parent="."]
+self_modulate = Color(0.494118, 1, 0.737255, 1)
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = 35.0
+offset_top = -200.0
+offset_right = 275.0
+offset_bottom = -50.0
+layout_direction = 2
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="GridContainer" type="GridContainer" parent="PanelLTR"]
+offset_right = 40.0
+offset_bottom = 40.0
+columns = 3
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ButtonNW" type="Button" parent="PanelLTR/GridContainer"]
+offset_right = 77.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "NorthWest"
+script = null
+
+[node name="ButtonN" type="Button" parent="PanelLTR/GridContainer"]
+offset_left = 81.0
+offset_right = 128.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "North"
+script = null
+
+[node name="ButtonNE" type="Button" parent="PanelLTR/GridContainer"]
+offset_left = 132.0
+offset_right = 204.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "NorthEast"
+script = null
+
+[node name="ButtonW" type="Button" parent="PanelLTR/GridContainer"]
+offset_top = 31.0
+offset_right = 77.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "West"
+script = null
+
+[node name="ButtonCenter" type="Button" parent="PanelLTR/GridContainer"]
+offset_left = 81.0
+offset_top = 31.0
+offset_right = 128.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "*"
+script = null
+
+[node name="ButtonE" type="Button" parent="PanelLTR/GridContainer"]
+offset_left = 132.0
+offset_top = 31.0
+offset_right = 204.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Еast"
+script = null
+
+[node name="ButtonSW" type="Button" parent="PanelLTR/GridContainer"]
+offset_top = 62.0
+offset_right = 77.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "SouthWest"
+script = null
+
+[node name="ButtonS" type="Button" parent="PanelLTR/GridContainer"]
+offset_left = 81.0
+offset_top = 62.0
+offset_right = 128.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "South"
+script = null
+
+[node name="ButtonSE" type="Button" parent="PanelLTR/GridContainer"]
+offset_left = 132.0
+offset_top = 62.0
+offset_right = 204.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "SouthEast"
+script = null
+
+[node name="PanelLocale" type="Panel" parent="PanelLTR"]
+self_modulate = Color(0.819608, 0.254902, 0.254902, 1)
+offset_left = 20.0
+offset_top = 90.0
+offset_right = 170.0
+offset_bottom = 130.0
+layout_direction = 1
+script = null
+
+[node name="HBoxContainer" type="HBoxContainer" parent="PanelLTR/PanelLocale"]
+offset_right = 107.0
+offset_bottom = 34.0005
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ButtonPrev" type="Button" parent="PanelLTR/PanelLocale/HBoxContainer"]
+offset_right = 64.0
+offset_bottom = 34.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Previous"
+script = null
+
+[node name="ButtonNext" type="Button" parent="PanelLTR/PanelLocale/HBoxContainer"]
+offset_left = 68.0
+offset_right = 109.0
+offset_bottom = 34.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Next"
+script = null
+
+[node name="PanelRTL" type="Panel" parent="."]
+self_modulate = Color(0.0705882, 0.235294, 1, 1)
+anchor_top = 1.0
+anchor_bottom = 1.0
+offset_left = 33.9999
+offset_top = -200.0
+offset_right = 284.0
+offset_bottom = -50.0
+layout_direction = 3
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="GridContainer" type="GridContainer" parent="PanelRTL"]
+offset_right = 40.0
+offset_bottom = 40.0
+columns = 3
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ButtonNW" type="Button" parent="PanelRTL/GridContainer"]
+offset_right = 81.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "الشمال الشرقي"
+script = null
+
+[node name="ButtonN" type="Button" parent="PanelRTL/GridContainer"]
+offset_left = 85.0
+offset_right = 131.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "الشمال"
+script = null
+
+[node name="ButtonNE" type="Button" parent="PanelRTL/GridContainer"]
+offset_left = 135.0
+offset_right = 214.0
+offset_bottom = 27.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "الشمال الغربي"
+script = null
+
+[node name="ButtonW" type="Button" parent="PanelRTL/GridContainer"]
+offset_top = 31.0
+offset_right = 81.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "الشرق"
+script = null
+
+[node name="ButtonCenter" type="Button" parent="PanelRTL/GridContainer"]
+offset_left = 85.0
+offset_top = 31.0
+offset_right = 131.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "*"
+script = null
+
+[node name="ButtonE" type="Button" parent="PanelRTL/GridContainer"]
+offset_left = 135.0
+offset_top = 31.0
+offset_right = 214.0
+offset_bottom = 58.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "الغرب"
+script = null
+
+[node name="ButtonSW" type="Button" parent="PanelRTL/GridContainer"]
+offset_top = 62.0
+offset_right = 81.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "الجنوب الشرقي"
+script = null
+
+[node name="ButtonS" type="Button" parent="PanelRTL/GridContainer"]
+offset_left = 85.0
+offset_top = 62.0
+offset_right = 131.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "الجنوب"
+script = null
+
+[node name="ButtonSE" type="Button" parent="PanelRTL/GridContainer"]
+offset_left = 135.0
+offset_top = 62.0
+offset_right = 214.0
+offset_bottom = 89.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = " 	الجنوب الغربي"
+script = null
+
+[node name="ButtonSwapLocale" type="Button" parent="."]
+offset_left = 670.0
+offset_top = 25.0
+offset_right = 820.0
+offset_bottom = 65.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Swap locale"
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="PanelSide" type="Panel" parent="."]
+anchor_left = 1.0
+anchor_right = 1.0
+anchor_bottom = 1.0
+offset_left = -20.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="HBoxContainer" type="HBoxContainer" parent="."]
+offset_left = 20.0
+offset_top = 20.0
+offset_right = 140.0
+offset_bottom = 60.0
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="ButtonBack" type="Button" parent="HBoxContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Back"
+script = null
+
+[node name="ButtonFwd" type="Button" parent="HBoxContainer"]
+offset_left = 44.0
+offset_right = 105.0
+offset_bottom = 40.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Forward"
+script = null
+
+[node name="Label" type="Label" parent="."]
+offset_left = 670.0
+offset_top = 70.0
+offset_right = 820.0
+offset_bottom = 100.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+align = 1
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="LabelInfo" type="Label" parent="."]
+offset_left = 100.0
+offset_top = 100.0
+offset_right = 550.0
+offset_bottom = 300.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Click \"Swap Locale\" button to swap locale between \"en  and \"ar\".
+
+Green tinted controls - LTR layout direction.
+Blue tinted controls - RTL layout direction.
+Red tinted controls - Layout direction from locale.
+Gray (default) controls - Inherited layout direction."
+structured_text_bidi_override_options = []
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[node name="OptionButton" type="OptionButton" parent="."]
+offset_left = 129.0
+offset_top = 240.0
+offset_right = 264.0
+offset_bottom = 260.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+items = []
+script = null
+
+[node name="CheckBox" type="CheckBox" parent="."]
+offset_left = 124.0
+offset_top = 265.0
+offset_right = 184.0
+offset_bottom = 290.0
+theme_override_fonts/font = ExtResource( "1" )
+theme_override_font_sizes/font_size = 12
+text = "Test"
+script = null
+__meta__ = {
+"_edit_use_anchors_": false
+}
+
+[connection signal="pressed" from="ButtonSwapLocale" to="." method="_on_Button_pressed"]