From 3dec4200f025c8355eda4464551ab6dfd5a6ca4b Mon Sep 17 00:00:00 2001 From: Variable Date: Fri, 24 Jan 2025 16:37:31 +0500 Subject: [PATCH 1/8] Fix Create Folder sub-dialog of Export > Browse being always behind (thus making it unusable) --- src/Main.gd | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Main.gd b/src/Main.gd index 1a2b083f1f68..28762e3bb3c0 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -186,6 +186,14 @@ func _ready() -> void: quit_and_save_dialog.add_button("Exit without saving", false, "ExitWithoutSaving") _handle_cmdline_arguments() get_tree().root.files_dropped.connect(_on_files_dropped) + + # Procedurally set always_on_top roperty of sub dialogs + for file_dialog in get_tree().get_nodes_in_group("FileDialogs"): + for dialog_child in file_dialog.get_children(true): + if dialog_child is Window: + # Sub dialogs are usually open one at a time so it should be safe to set them all + # to be always on top + dialog_child.always_on_top = true if OS.get_name() == "Android": OS.request_permissions() _handle_backup() From 6a358b3647375453fd2bc508a177b72475093d36 Mon Sep 17 00:00:00 2001 From: Variable Date: Wed, 5 Feb 2025 13:03:45 +0500 Subject: [PATCH 2/8] Add a dedicated tag (makes it easier to remove it if godot itself fixes this bug later), save and save as dialog are fixed --- project.godot | 1 + src/Main.gd | 3 ++- src/Main.tscn | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/project.godot b/project.godot index 248a3919d70b..cc41b917254b 100644 --- a/project.godot +++ b/project.godot @@ -62,6 +62,7 @@ enabled=PackedStringArray("res://addons/aimg_io/plugin.cfg", "res://addons/docka CanvasCameras="" CanvasPreviews="" +FixInternalDialogs="Nodes in this group contain internal windows whose always_on_top needs correction" [importer_defaults] diff --git a/src/Main.gd b/src/Main.gd index 28762e3bb3c0..a8f6513e3dd2 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -188,12 +188,13 @@ func _ready() -> void: get_tree().root.files_dropped.connect(_on_files_dropped) # Procedurally set always_on_top roperty of sub dialogs - for file_dialog in get_tree().get_nodes_in_group("FileDialogs"): + for file_dialog in get_tree().get_nodes_in_group(&"FixInternalDialogs"): for dialog_child in file_dialog.get_children(true): if dialog_child is Window: # Sub dialogs are usually open one at a time so it should be safe to set them all # to be always on top dialog_child.always_on_top = true + file_dialog.remove_from_group(&"FixInternalDialogs") if OS.get_name() == "Android": OS.request_permissions() _handle_backup() diff --git a/src/Main.tscn b/src/Main.tscn index 1dfb9224e534..4d02d273a50f 100644 --- a/src/Main.tscn +++ b/src/Main.tscn @@ -49,9 +49,9 @@ mouse_filter = 2 [node name="PatternsPopup" parent="Dialogs" instance=ExtResource("5")] -[node name="OpenSprite" parent="Dialogs" instance=ExtResource("12")] +[node name="OpenSprite" parent="Dialogs" groups=["FixInternalDialogs"] instance=ExtResource("12")] -[node name="SaveSprite" parent="Dialogs" instance=ExtResource("11")] +[node name="SaveSprite" parent="Dialogs" groups=["FixInternalDialogs"] instance=ExtResource("11")] [node name="SaveSpriteHTML5" parent="Dialogs" instance=ExtResource("8")] @@ -115,8 +115,8 @@ script = ExtResource("17_k1xhp") [connection signal="files_selected" from="Dialogs/OpenSprite" to="." method="_on_OpenSprite_files_selected"] [connection signal="visibility_changed" from="Dialogs/OpenSprite" to="." method="_on_open_sprite_visibility_changed"] [connection signal="file_selected" from="Dialogs/SaveSprite" to="." method="_on_SaveSprite_file_selected"] -[connection signal="visibility_changed" from="Dialogs/SaveSprite" to="." method="_can_draw_true"] [connection signal="visibility_changed" from="Dialogs/SaveSprite" to="." method="_on_save_sprite_visibility_changed"] +[connection signal="visibility_changed" from="Dialogs/SaveSprite" to="." method="_can_draw_true"] [connection signal="confirmed" from="Dialogs/SaveSpriteHTML5" to="." method="save_project" binds= [""]] [connection signal="visibility_changed" from="Dialogs/SaveSpriteHTML5" to="." method="_can_draw_true"] [connection signal="visibility_changed" from="Dialogs/ExportDialog" to="." method="_can_draw_true"] From 35d2d50a06dc1ec59ba3f61f2faa8394c7fd1d7e Mon Sep 17 00:00:00 2001 From: Variable Date: Wed, 5 Feb 2025 13:06:11 +0500 Subject: [PATCH 3/8] the scecnes themselves have the tag instead of in Main.tscn --- src/Main.tscn | 4 ++-- src/UI/Dialogs/OpenSprite.tscn | 2 +- src/UI/Dialogs/SaveSprite.tscn | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Main.tscn b/src/Main.tscn index 4d02d273a50f..5838cd83eb8b 100644 --- a/src/Main.tscn +++ b/src/Main.tscn @@ -49,9 +49,9 @@ mouse_filter = 2 [node name="PatternsPopup" parent="Dialogs" instance=ExtResource("5")] -[node name="OpenSprite" parent="Dialogs" groups=["FixInternalDialogs"] instance=ExtResource("12")] +[node name="OpenSprite" parent="Dialogs" instance=ExtResource("12")] -[node name="SaveSprite" parent="Dialogs" groups=["FixInternalDialogs"] instance=ExtResource("11")] +[node name="SaveSprite" parent="Dialogs" instance=ExtResource("11")] [node name="SaveSpriteHTML5" parent="Dialogs" instance=ExtResource("8")] diff --git a/src/UI/Dialogs/OpenSprite.tscn b/src/UI/Dialogs/OpenSprite.tscn index dbf301485519..2d415d55038f 100644 --- a/src/UI/Dialogs/OpenSprite.tscn +++ b/src/UI/Dialogs/OpenSprite.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://b3aeqj2k58wdk"] -[node name="OpenSprite" type="FileDialog" groups=["FileDialogs"]] +[node name="OpenSprite" type="FileDialog" groups=["FileDialogs", "FixInternalDialogs"]] title = "Open File(s)" size = Vector2i(558, 400) ok_button_text = "Open" diff --git a/src/UI/Dialogs/SaveSprite.tscn b/src/UI/Dialogs/SaveSprite.tscn index ebea77fc5230..8623602043bc 100644 --- a/src/UI/Dialogs/SaveSprite.tscn +++ b/src/UI/Dialogs/SaveSprite.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://d4euwo633u33b"] -[node name="SaveSprite" type="FileDialog" groups=["FileDialogs"]] +[node name="SaveSprite" type="FileDialog" groups=["FileDialogs", "FixInternalDialogs"]] size = Vector2i(675, 400) ok_button_text = "Save" access = 2 From c1619d626ede07823fa7986c26976373f4fe3630 Mon Sep 17 00:00:00 2001 From: Variable Date: Wed, 5 Feb 2025 13:36:14 +0500 Subject: [PATCH 4/8] Fix browse->new folder of export dialog --- src/Main.gd | 8 -------- src/UI/Dialogs/ExportDialog.tscn | 5 ++++- src/UI/TopMenuContainer/TopMenuContainer.gd | 15 +++++++++++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Main.gd b/src/Main.gd index a8f6513e3dd2..fdc89b8dbfdd 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -187,14 +187,6 @@ func _ready() -> void: _handle_cmdline_arguments() get_tree().root.files_dropped.connect(_on_files_dropped) - # Procedurally set always_on_top roperty of sub dialogs - for file_dialog in get_tree().get_nodes_in_group(&"FixInternalDialogs"): - for dialog_child in file_dialog.get_children(true): - if dialog_child is Window: - # Sub dialogs are usually open one at a time so it should be safe to set them all - # to be always on top - dialog_child.always_on_top = true - file_dialog.remove_from_group(&"FixInternalDialogs") if OS.get_name() == "Android": OS.request_permissions() _handle_backup() diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn index f108f940354c..70ec09e6c1ac 100644 --- a/src/UI/Dialogs/ExportDialog.tscn +++ b/src/UI/Dialogs/ExportDialog.tscn @@ -44,6 +44,7 @@ size_flags_vertical = 3 [node name="TransparentChecker" parent="VBoxContainer/VSplitContainer/PreviewPanel" instance=ExtResource("2")] unique_name_in_owner = true layout_mode = 0 +anchors_preset = 0 anchor_right = 1.0 anchor_bottom = 1.0 @@ -330,7 +331,7 @@ tooltip_text = "Only export content that is within the bounds of a selected area mouse_default_cursor_shape = 2 text = "Clip image content to selection" -[node name="PathDialog" type="FileDialog" parent="." groups=["FileDialogs"]] +[node name="PathDialog" type="FileDialog" parent="." groups=["FileDialogs", "FixInternalDialogs"]] mode = 2 title = "Open a Directory" size = Vector2i(675, 500) @@ -340,10 +341,12 @@ file_mode = 2 access = 2 [node name="PathValidationAlert" type="AcceptDialog" parent="."] +size = Vector2i(346, 100) always_on_top = true dialog_text = "DirAccess path and file name are not valid!" [node name="FileExistsAlert" type="AcceptDialog" parent="."] +size = Vector2i(272, 100) always_on_top = true dialog_text = "File %s already exists. Overwrite?" diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index 2633e6fcd03b..6940f842110a 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -92,6 +92,21 @@ class Dialog: node = scene.instantiate() if is_instance_valid(node): Global.control.get_node("Dialogs").add_child(node) + fix_internal_dialogs() + + static func fix_internal_dialogs() -> void: + # Procedurally set always_on_top roperty of sub items. + # (This could be an option button or window, etc...) + for item in Global.get_tree().get_nodes_in_group(&"FixInternalDialogs"): + # Sub dialogs are usually open one at a time so it should be safe to set them all + # to be always on top. + var parent_window: Window = item.get_window() + if item is Window: + parent_window = item + for dialog_child in item.get_children(true): + if dialog_child is Window: + dialog_child.always_on_top = parent_window.always_on_top + item.remove_from_group(&"FixInternalDialogs") func _ready() -> void: From f91ed1cc9464cd613a90e6267f1069d76ebf4392 Mon Sep 17 00:00:00 2001 From: Variable Date: Wed, 5 Feb 2025 13:39:08 +0500 Subject: [PATCH 5/8] fix a typo --- src/Main.gd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Main.gd b/src/Main.gd index fdc89b8dbfdd..2e7981f3b0be 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -187,6 +187,8 @@ func _ready() -> void: _handle_cmdline_arguments() get_tree().root.files_dropped.connect(_on_files_dropped) + Global.top_menu_container.Dialog.fix_internal_dialogs() + if OS.get_name() == "Android": OS.request_permissions() _handle_backup() From 9746b5b0d39bd1b96be6a64d9cd5f0279cc5975b Mon Sep 17 00:00:00 2001 From: Variable Date: Wed, 5 Feb 2025 13:45:29 +0500 Subject: [PATCH 6/8] Restore lines that were unintentionally changed by Godot --- src/Main.gd | 1 + src/Main.tscn | 2 +- src/UI/Dialogs/ExportDialog.tscn | 3 --- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Main.gd b/src/Main.gd index 2e7981f3b0be..e844190bc5ba 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -187,6 +187,7 @@ func _ready() -> void: _handle_cmdline_arguments() get_tree().root.files_dropped.connect(_on_files_dropped) + # Fix always_on_top of currently existing internal dialogs Global.top_menu_container.Dialog.fix_internal_dialogs() if OS.get_name() == "Android": diff --git a/src/Main.tscn b/src/Main.tscn index 5838cd83eb8b..1dfb9224e534 100644 --- a/src/Main.tscn +++ b/src/Main.tscn @@ -115,8 +115,8 @@ script = ExtResource("17_k1xhp") [connection signal="files_selected" from="Dialogs/OpenSprite" to="." method="_on_OpenSprite_files_selected"] [connection signal="visibility_changed" from="Dialogs/OpenSprite" to="." method="_on_open_sprite_visibility_changed"] [connection signal="file_selected" from="Dialogs/SaveSprite" to="." method="_on_SaveSprite_file_selected"] -[connection signal="visibility_changed" from="Dialogs/SaveSprite" to="." method="_on_save_sprite_visibility_changed"] [connection signal="visibility_changed" from="Dialogs/SaveSprite" to="." method="_can_draw_true"] +[connection signal="visibility_changed" from="Dialogs/SaveSprite" to="." method="_on_save_sprite_visibility_changed"] [connection signal="confirmed" from="Dialogs/SaveSpriteHTML5" to="." method="save_project" binds= [""]] [connection signal="visibility_changed" from="Dialogs/SaveSpriteHTML5" to="." method="_can_draw_true"] [connection signal="visibility_changed" from="Dialogs/ExportDialog" to="." method="_can_draw_true"] diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn index 70ec09e6c1ac..42d12df15826 100644 --- a/src/UI/Dialogs/ExportDialog.tscn +++ b/src/UI/Dialogs/ExportDialog.tscn @@ -44,7 +44,6 @@ size_flags_vertical = 3 [node name="TransparentChecker" parent="VBoxContainer/VSplitContainer/PreviewPanel" instance=ExtResource("2")] unique_name_in_owner = true layout_mode = 0 -anchors_preset = 0 anchor_right = 1.0 anchor_bottom = 1.0 @@ -341,12 +340,10 @@ file_mode = 2 access = 2 [node name="PathValidationAlert" type="AcceptDialog" parent="."] -size = Vector2i(346, 100) always_on_top = true dialog_text = "DirAccess path and file name are not valid!" [node name="FileExistsAlert" type="AcceptDialog" parent="."] -size = Vector2i(272, 100) always_on_top = true dialog_text = "File %s already exists. Overwrite?" From 557cd7deb1deb95e340bf4e8ab0566e15a1ee92a Mon Sep 17 00:00:00 2001 From: Variable Date: Wed, 5 Feb 2025 19:17:57 +0500 Subject: [PATCH 7/8] simplify the code and move it to the Export Dialog --- project.godot | 1 - src/Main.gd | 3 --- src/UI/Dialogs/ExportDialog.gd | 5 +++++ src/UI/Dialogs/ExportDialog.tscn | 3 ++- src/UI/Dialogs/OpenSprite.tscn | 2 +- src/UI/Dialogs/SaveSprite.tscn | 2 +- src/UI/TopMenuContainer/TopMenuContainer.gd | 15 --------------- 7 files changed, 9 insertions(+), 22 deletions(-) diff --git a/project.godot b/project.godot index 52e0ce5f550c..b63d4ac8e6cf 100644 --- a/project.godot +++ b/project.godot @@ -62,7 +62,6 @@ enabled=PackedStringArray("res://addons/aimg_io/plugin.cfg", "res://addons/docka CanvasCameras="" CanvasPreviews="" -FixInternalDialogs="Nodes in this group contain internal windows whose always_on_top needs correction" [importer_defaults] diff --git a/src/Main.gd b/src/Main.gd index f8ecf861849c..a245e430592a 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -187,9 +187,6 @@ func _ready() -> void: _handle_cmdline_arguments() get_tree().root.files_dropped.connect(_on_files_dropped) - # Fix always_on_top of currently existing internal dialogs - Global.top_menu_container.Dialog.fix_internal_dialogs() - if OS.get_name() == "Android": OS.request_permissions() _handle_backup() diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd index c6f27be696a7..192c79d1f927 100644 --- a/src/UI/Dialogs/ExportDialog.gd +++ b/src/UI/Dialogs/ExportDialog.gd @@ -63,6 +63,11 @@ func _ready() -> void: else: file_exists_alert_popup.add_button("Cancel Export", false, "cancel") + # TODO: Remove the for loop when https://github.com/godotengine/godot/issues/92848 gets fixed. + for dialog_child in path_dialog_popup.get_children(true): + if dialog_child is Window: + dialog_child.always_on_top = path_dialog_popup.always_on_top + func show_tab() -> void: get_tree().call_group("ExportImageOptions", "hide") diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn index 42d12df15826..58947062b954 100644 --- a/src/UI/Dialogs/ExportDialog.tscn +++ b/src/UI/Dialogs/ExportDialog.tscn @@ -44,6 +44,7 @@ size_flags_vertical = 3 [node name="TransparentChecker" parent="VBoxContainer/VSplitContainer/PreviewPanel" instance=ExtResource("2")] unique_name_in_owner = true layout_mode = 0 +anchors_preset = 0 anchor_right = 1.0 anchor_bottom = 1.0 @@ -330,7 +331,7 @@ tooltip_text = "Only export content that is within the bounds of a selected area mouse_default_cursor_shape = 2 text = "Clip image content to selection" -[node name="PathDialog" type="FileDialog" parent="." groups=["FileDialogs", "FixInternalDialogs"]] +[node name="PathDialog" type="FileDialog" parent="." groups=["FileDialogs"]] mode = 2 title = "Open a Directory" size = Vector2i(675, 500) diff --git a/src/UI/Dialogs/OpenSprite.tscn b/src/UI/Dialogs/OpenSprite.tscn index 2d415d55038f..dbf301485519 100644 --- a/src/UI/Dialogs/OpenSprite.tscn +++ b/src/UI/Dialogs/OpenSprite.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://b3aeqj2k58wdk"] -[node name="OpenSprite" type="FileDialog" groups=["FileDialogs", "FixInternalDialogs"]] +[node name="OpenSprite" type="FileDialog" groups=["FileDialogs"]] title = "Open File(s)" size = Vector2i(558, 400) ok_button_text = "Open" diff --git a/src/UI/Dialogs/SaveSprite.tscn b/src/UI/Dialogs/SaveSprite.tscn index 8623602043bc..ebea77fc5230 100644 --- a/src/UI/Dialogs/SaveSprite.tscn +++ b/src/UI/Dialogs/SaveSprite.tscn @@ -1,6 +1,6 @@ [gd_scene format=3 uid="uid://d4euwo633u33b"] -[node name="SaveSprite" type="FileDialog" groups=["FileDialogs", "FixInternalDialogs"]] +[node name="SaveSprite" type="FileDialog" groups=["FileDialogs"]] size = Vector2i(675, 400) ok_button_text = "Save" access = 2 diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index a1a5ac0cbd83..163175574659 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -99,21 +99,6 @@ class Dialog: node = scene.instantiate() if is_instance_valid(node): Global.control.get_node("Dialogs").add_child(node) - fix_internal_dialogs() - - static func fix_internal_dialogs() -> void: - # Procedurally set always_on_top roperty of sub items. - # (This could be an option button or window, etc...) - for item in Global.get_tree().get_nodes_in_group(&"FixInternalDialogs"): - # Sub dialogs are usually open one at a time so it should be safe to set them all - # to be always on top. - var parent_window: Window = item.get_window() - if item is Window: - parent_window = item - for dialog_child in item.get_children(true): - if dialog_child is Window: - dialog_child.always_on_top = parent_window.always_on_top - item.remove_from_group(&"FixInternalDialogs") func _ready() -> void: From 46334874d2405e403554daa486153642737a2b10 Mon Sep 17 00:00:00 2001 From: Variable Date: Wed, 5 Feb 2025 19:21:08 +0500 Subject: [PATCH 8/8] fix artefacts of moving the code --- src/Main.gd | 1 - src/UI/Dialogs/ExportDialog.gd | 2 +- src/UI/Dialogs/ExportDialog.tscn | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Main.gd b/src/Main.gd index a245e430592a..3dc33ed3d5db 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -186,7 +186,6 @@ func _ready() -> void: quit_and_save_dialog.add_button("Exit without saving", false, "ExitWithoutSaving") _handle_cmdline_arguments() get_tree().root.files_dropped.connect(_on_files_dropped) - if OS.get_name() == "Android": OS.request_permissions() _handle_backup() diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd index 192c79d1f927..a0f8ace79403 100644 --- a/src/UI/Dialogs/ExportDialog.gd +++ b/src/UI/Dialogs/ExportDialog.gd @@ -63,7 +63,7 @@ func _ready() -> void: else: file_exists_alert_popup.add_button("Cancel Export", false, "cancel") - # TODO: Remove the for loop when https://github.com/godotengine/godot/issues/92848 gets fixed. + # TODO: Remove the loop when https://github.com/godotengine/godot/issues/92848 gets fixed. for dialog_child in path_dialog_popup.get_children(true): if dialog_child is Window: dialog_child.always_on_top = path_dialog_popup.always_on_top diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn index 58947062b954..f108f940354c 100644 --- a/src/UI/Dialogs/ExportDialog.tscn +++ b/src/UI/Dialogs/ExportDialog.tscn @@ -44,7 +44,6 @@ size_flags_vertical = 3 [node name="TransparentChecker" parent="VBoxContainer/VSplitContainer/PreviewPanel" instance=ExtResource("2")] unique_name_in_owner = true layout_mode = 0 -anchors_preset = 0 anchor_right = 1.0 anchor_bottom = 1.0