From a01005f397fddddc89701085a5465637fff65754 Mon Sep 17 00:00:00 2001 From: Vissa <46628714+Visssarion@users.noreply.github.com> Date: Thu, 9 Oct 2025 01:00:22 +0300 Subject: [PATCH] Add Multiple Windows Demo (#1103) --- misc/multiple_windows/README.md | 20 + misc/multiple_windows/icon.webp | Bin 0 -> 414 bytes misc/multiple_windows/icon.webp.import | 40 ++ misc/multiple_windows/project.godot | 31 ++ .../scenes/accept_dialogue/accept_dialog.tscn | 7 + .../confirmation_dialog.tscn | 7 + misc/multiple_windows/scenes/disable_other.gd | 29 ++ .../scenes/disable_other.gd.uid | 1 + .../draggable_window/draggable_region.gd | 6 + .../draggable_window/draggable_region.gd.uid | 1 + .../draggable_window/draggable_window.tscn | 40 ++ .../scenes/draggable_window/hand.svg | 66 ++++ .../scenes/draggable_window/hand.svg.import | 43 ++ .../sprite_polygon_passthrough.gd | 34 ++ .../sprite_polygon_passthrough.gd.uid | 1 + .../scenes/file_dialogue/file_dialog.tscn | 6 + misc/multiple_windows/scenes/main_scene.gd | 187 +++++++++ .../multiple_windows/scenes/main_scene.gd.uid | 1 + misc/multiple_windows/scenes/main_scene.tscn | 368 ++++++++++++++++++ .../scenes/popup/hide_on_mouse_exit.gd | 9 + .../scenes/popup/hide_on_mouse_exit.gd.uid | 1 + misc/multiple_windows/scenes/popup/popup.tscn | 14 + .../scenes/popup_menu/popup_menu.gd | 34 ++ .../scenes/popup_menu/popup_menu.gd.uid | 1 + .../scenes/popup_menu/popup_menu.tscn | 14 + .../scenes/popup_panel/popup_panel.tscn | 26 ++ .../status_indicator/status_indicator.gd | 27 ++ .../status_indicator/status_indicator.gd.uid | 1 + .../status_indicator/status_indicator.tscn | 12 + misc/multiple_windows/scenes/text_field.gd | 10 + .../multiple_windows/scenes/text_field.gd.uid | 1 + .../scenes/window/url_opener.gd | 10 + .../scenes/window/url_opener.gd.uid | 1 + misc/multiple_windows/scenes/window/window.gd | 11 + .../scenes/window/window.gd.uid | 1 + .../scenes/window/window.tscn | 30 ++ misc/multiple_windows/screenshots/.gdignore | 0 .../screenshots/screenshot.webp | Bin 0 -> 49332 bytes 38 files changed, 1091 insertions(+) create mode 100644 misc/multiple_windows/README.md create mode 100644 misc/multiple_windows/icon.webp create mode 100644 misc/multiple_windows/icon.webp.import create mode 100644 misc/multiple_windows/project.godot create mode 100644 misc/multiple_windows/scenes/accept_dialogue/accept_dialog.tscn create mode 100644 misc/multiple_windows/scenes/confimation_dialogue/confirmation_dialog.tscn create mode 100644 misc/multiple_windows/scenes/disable_other.gd create mode 100644 misc/multiple_windows/scenes/disable_other.gd.uid create mode 100644 misc/multiple_windows/scenes/draggable_window/draggable_region.gd create mode 100644 misc/multiple_windows/scenes/draggable_window/draggable_region.gd.uid create mode 100644 misc/multiple_windows/scenes/draggable_window/draggable_window.tscn create mode 100644 misc/multiple_windows/scenes/draggable_window/hand.svg create mode 100644 misc/multiple_windows/scenes/draggable_window/hand.svg.import create mode 100644 misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd create mode 100644 misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd.uid create mode 100644 misc/multiple_windows/scenes/file_dialogue/file_dialog.tscn create mode 100644 misc/multiple_windows/scenes/main_scene.gd create mode 100644 misc/multiple_windows/scenes/main_scene.gd.uid create mode 100644 misc/multiple_windows/scenes/main_scene.tscn create mode 100644 misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd create mode 100644 misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd.uid create mode 100644 misc/multiple_windows/scenes/popup/popup.tscn create mode 100644 misc/multiple_windows/scenes/popup_menu/popup_menu.gd create mode 100644 misc/multiple_windows/scenes/popup_menu/popup_menu.gd.uid create mode 100644 misc/multiple_windows/scenes/popup_menu/popup_menu.tscn create mode 100644 misc/multiple_windows/scenes/popup_panel/popup_panel.tscn create mode 100644 misc/multiple_windows/scenes/status_indicator/status_indicator.gd create mode 100644 misc/multiple_windows/scenes/status_indicator/status_indicator.gd.uid create mode 100644 misc/multiple_windows/scenes/status_indicator/status_indicator.tscn create mode 100644 misc/multiple_windows/scenes/text_field.gd create mode 100644 misc/multiple_windows/scenes/text_field.gd.uid create mode 100644 misc/multiple_windows/scenes/window/url_opener.gd create mode 100644 misc/multiple_windows/scenes/window/url_opener.gd.uid create mode 100644 misc/multiple_windows/scenes/window/window.gd create mode 100644 misc/multiple_windows/scenes/window/window.gd.uid create mode 100644 misc/multiple_windows/scenes/window/window.tscn create mode 100644 misc/multiple_windows/screenshots/.gdignore create mode 100644 misc/multiple_windows/screenshots/screenshot.webp diff --git a/misc/multiple_windows/README.md b/misc/multiple_windows/README.md new file mode 100644 index 00000000..e8d682ed --- /dev/null +++ b/misc/multiple_windows/README.md @@ -0,0 +1,20 @@ +# Window Management + +A demo showing all [`Window`](https://docs.godotengine.org/en/stable/classes/class_window.html) classes and their use within the main window. + +It includes: +- Embedding/unembedding subwindows. +- Using a transparent window. +- Adding physical objects to new windows. +- Showcase of all Dialog Windows. +- Showcase of all Popup Windows. +- Adding elements to a Popup Menu. +- Adding an icon to the system tray. + +Language: GDScript + +Renderer: Compatbility + +## Screenshots + +![Screenshot](screenshots/screenshot.webp) diff --git a/misc/multiple_windows/icon.webp b/misc/multiple_windows/icon.webp new file mode 100644 index 0000000000000000000000000000000000000000..e36bd12ef02d5f914557e5215df479fbfee8df8d GIT binary patch literal 414 zcmV;P0b%}9Nk&GN0RRA3MM6+kP&iD90RR9mf50CQhoGQs8z%fwmdV-SAP`9Mr`%+L zK$1V@CJO`z|FslIKsEUMfd>vF$!(h_l(YITH<1`T;Ov=*{yT6RNs-c3yT_Mfd;vZN zvyN?@%%*CG&7Joo$$Ca--fbdG|L>tj5iCplW24I=6SsV(C76h{t5lh^ZoUX|GfYGq+%g{ygL?+AMb%h@5g&%-E4~k zZ}J!S0~~pyp?qtK(YJ&@iMWC!4QxO3~Fj#c1lDa?16OBBcgElYAqfO0FT$<=z-5b8Qf`IUAZZcj?Ms I!~YHd079|NWdHyG literal 0 HcmV?d00001 diff --git a/misc/multiple_windows/icon.webp.import b/misc/multiple_windows/icon.webp.import new file mode 100644 index 00000000..670cfc50 --- /dev/null +++ b/misc/multiple_windows/icon.webp.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cehd300ehf1vw" +path="res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.webp" +dest_files=["res://.godot/imported/icon.webp-e94f9a68b0f625a567a797079e4d325f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/misc/multiple_windows/project.godot b/misc/multiple_windows/project.godot new file mode 100644 index 00000000..c10e1a8d --- /dev/null +++ b/misc/multiple_windows/project.godot @@ -0,0 +1,31 @@ +; 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=5 + +[application] + +config/name="Multiple Windows Demo" +config/description="A demo showing all Window classes and their use within the main window." +run/main_scene="res://scenes/main_scene.tscn" +config/features=PackedStringArray("4.5", "GL Compatibility") +run/low_processor_mode=true +config/icon="res://icon.webp" + +[display] + +window/size/viewport_width=650 +window/size/viewport_height=650 +window/stretch/mode="canvas_items" +window/stretch/aspect="expand" +window/per_pixel_transparency/allowed=true + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" diff --git a/misc/multiple_windows/scenes/accept_dialogue/accept_dialog.tscn b/misc/multiple_windows/scenes/accept_dialogue/accept_dialog.tscn new file mode 100644 index 00000000..cb6498c3 --- /dev/null +++ b/misc/multiple_windows/scenes/accept_dialogue/accept_dialog.tscn @@ -0,0 +1,7 @@ +[gd_scene format=3 uid="uid://cudrukovmha7p"] + +[node name="AcceptDialog" type="AcceptDialog"] +initial_position = 2 +size = Vector2i(277, 100) +visible = true +dialog_text = "This is an AcceptDialog window" diff --git a/misc/multiple_windows/scenes/confimation_dialogue/confirmation_dialog.tscn b/misc/multiple_windows/scenes/confimation_dialogue/confirmation_dialog.tscn new file mode 100644 index 00000000..4cd56fc8 --- /dev/null +++ b/misc/multiple_windows/scenes/confimation_dialogue/confirmation_dialog.tscn @@ -0,0 +1,7 @@ +[gd_scene format=3 uid="uid://1nswovajdv3n"] + +[node name="ConfirmationDialog" type="ConfirmationDialog"] +initial_position = 2 +size = Vector2i(310, 100) +visible = true +dialog_text = "This is a ConfimationDialog window" diff --git a/misc/multiple_windows/scenes/disable_other.gd b/misc/multiple_windows/scenes/disable_other.gd new file mode 100644 index 00000000..b1c93898 --- /dev/null +++ b/misc/multiple_windows/scenes/disable_other.gd @@ -0,0 +1,29 @@ +extends BaseButton + + +enum Behavior { + ENABLE_OTHERS_WHEN_ENABLED, + ENABLE_OTHERS_WHEN_DISABLED, +} + +@export var behavior: Behavior = Behavior.ENABLE_OTHERS_WHEN_ENABLED +@export var others: Array[BaseButton] = [] + + +func _ready() -> void: + var others_disabled: bool + if behavior == Behavior.ENABLE_OTHERS_WHEN_ENABLED: + others_disabled = not button_pressed + else: + others_disabled = button_pressed + for other in others: + other.disabled = others_disabled + + +func _toggled(toggled_on: bool) -> void: + if behavior == Behavior.ENABLE_OTHERS_WHEN_ENABLED: + for other in others: + other.disabled = not toggled_on + else: + for other in others: + other.disabled = toggled_on diff --git a/misc/multiple_windows/scenes/disable_other.gd.uid b/misc/multiple_windows/scenes/disable_other.gd.uid new file mode 100644 index 00000000..812aa2ae --- /dev/null +++ b/misc/multiple_windows/scenes/disable_other.gd.uid @@ -0,0 +1 @@ +uid://b4ngyw7e2c75u diff --git a/misc/multiple_windows/scenes/draggable_window/draggable_region.gd b/misc/multiple_windows/scenes/draggable_window/draggable_region.gd new file mode 100644 index 00000000..b8dd6c28 --- /dev/null +++ b/misc/multiple_windows/scenes/draggable_window/draggable_region.gd @@ -0,0 +1,6 @@ +extends Area2D + +func _input_event(_viewport: Viewport, event: InputEvent, _shape_index: int) -> void: + if event is InputEventMouseButton: + if event.pressed: + get_window().start_drag() diff --git a/misc/multiple_windows/scenes/draggable_window/draggable_region.gd.uid b/misc/multiple_windows/scenes/draggable_window/draggable_region.gd.uid new file mode 100644 index 00000000..cfce1cd5 --- /dev/null +++ b/misc/multiple_windows/scenes/draggable_window/draggable_region.gd.uid @@ -0,0 +1 @@ +uid://d1nq2ipicit18 diff --git a/misc/multiple_windows/scenes/draggable_window/draggable_window.tscn b/misc/multiple_windows/scenes/draggable_window/draggable_window.tscn new file mode 100644 index 00000000..5544f944 --- /dev/null +++ b/misc/multiple_windows/scenes/draggable_window/draggable_window.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=6 format=3 uid="uid://ek1fmwy87san"] + +[ext_resource type="Texture2D" uid="uid://pgdemhy0xqog" path="res://scenes/draggable_window/hand.svg" id="1_y4nm8"] +[ext_resource type="Script" uid="uid://d1nq2ipicit18" path="res://scenes/draggable_window/draggable_region.gd" id="2_pflw3"] +[ext_resource type="Script" uid="uid://djnd1kuhucddh" path="res://scenes/draggable_window/sprite_polygon_passthrough.gd" id="3_20753"] + +[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_ghj85"] +size = Vector2(256, 256) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_cvhp1"] +size = Vector2(128, 128) + +[node name="DraggableWindow" type="Window"] +transparent_bg = true +physics_object_picking = true +oversampling_override = 1.0 +size = Vector2i(128, 128) +unresizable = true +borderless = true +always_on_top = true +transparent = true + +[node name="BG" type="Sprite2D" parent="."] +visible = false +texture = SubResource("PlaceholderTexture2D_ghj85") +centered = false + +[node name="Icon" type="Sprite2D" parent="."] +position = Vector2(64, 64) +texture = ExtResource("1_y4nm8") + +[node name="Area2D" type="Area2D" parent="Icon"] +script = ExtResource("2_pflw3") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Icon/Area2D"] +shape = SubResource("RectangleShape2D_cvhp1") + +[node name="PassthroughGenerator" type="Node" parent="." node_paths=PackedStringArray("sprite")] +script = ExtResource("3_20753") +sprite = NodePath("../Icon") diff --git a/misc/multiple_windows/scenes/draggable_window/hand.svg b/misc/multiple_windows/scenes/draggable_window/hand.svg new file mode 100644 index 00000000..320920a7 --- /dev/null +++ b/misc/multiple_windows/scenes/draggable_window/hand.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/misc/multiple_windows/scenes/draggable_window/hand.svg.import b/misc/multiple_windows/scenes/draggable_window/hand.svg.import new file mode 100644 index 00000000..ef27b617 --- /dev/null +++ b/misc/multiple_windows/scenes/draggable_window/hand.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pgdemhy0xqog" +path="res://.godot/imported/hand.svg-b2d702bcd7ae140c6ed485fe3d5b4a36.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/draggable_window/hand.svg" +dest_files=["res://.godot/imported/hand.svg-b2d702bcd7ae140c6ed485fe3d5b4a36.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd b/misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd new file mode 100644 index 00000000..cb3ed80e --- /dev/null +++ b/misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd @@ -0,0 +1,34 @@ +extends Node + +@export var sprite: Sprite2D + +func generate_polygon(): + # Make a bitmap out of a sprite. + var bitmap := BitMap.new() + bitmap.create_from_image_alpha(sprite.texture.get_image()) + # Cell size in case sprite cell is used for animation. + var cell_size_x := float(bitmap.get_size().x) / sprite.hframes + var cell_size_y := float(bitmap.get_size().y) / sprite.vframes + var cell_rect: Rect2 = Rect2(cell_size_x * sprite.frame_coords.x, cell_size_y * sprite.frame_coords.y, cell_size_x, cell_size_y) + # Grow bitmap to make sure every pixel will be captured. + bitmap.grow_mask(1, cell_rect) + # Generate array of polygons from bitmap. + var bitmap_polygons: Array[PackedVector2Array] = bitmap.opaque_to_polygons(cell_rect, 1.0) + var polygon = PackedVector2Array() + # Offset to position polygon correctly in relation of sprite to a window. + var offset: Vector2 = sprite.position + sprite.offset + if sprite.centered: + offset -= Vector2(cell_size_x, cell_size_y) / 2 + + # First point is used to connect multiple polygons into one big polygon. + var first_point: Vector2 = bitmap_polygons[0][0] + # Uniting all polygons into polygon for window to use. + for bitmap_polygon: PackedVector2Array in bitmap_polygons: + for point: Vector2 in bitmap_polygon: + polygon.append(point + offset) + + polygon.append(first_point) + polygon.append(first_point) + + # Apply passthrough mask to the window. + get_window().mouse_passthrough_polygon = polygon diff --git a/misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd.uid b/misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd.uid new file mode 100644 index 00000000..687e975f --- /dev/null +++ b/misc/multiple_windows/scenes/draggable_window/sprite_polygon_passthrough.gd.uid @@ -0,0 +1 @@ +uid://djnd1kuhucddh diff --git a/misc/multiple_windows/scenes/file_dialogue/file_dialog.tscn b/misc/multiple_windows/scenes/file_dialogue/file_dialog.tscn new file mode 100644 index 00000000..39390d42 --- /dev/null +++ b/misc/multiple_windows/scenes/file_dialogue/file_dialog.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://dx84v67isxyjv"] + +[node name="FileDialog" type="FileDialog"] +initial_position = 2 +size = Vector2i(700, 400) +visible = true diff --git a/misc/multiple_windows/scenes/main_scene.gd b/misc/multiple_windows/scenes/main_scene.gd new file mode 100644 index 00000000..fa4f093b --- /dev/null +++ b/misc/multiple_windows/scenes/main_scene.gd @@ -0,0 +1,187 @@ +extends Control + + +@onready var window: Window = $Window +@onready var draggable_window: Window = $DraggableWindow +@onready var file_dialog: FileDialog = $FileDialog +@onready var file_dialog_output: TextEdit = $HBoxContainer/VBoxContainer2/FileDialogOutput +@onready var accept_dialog: AcceptDialog = $AcceptDialog +@onready var accept_dialog_output: TextEdit = $HBoxContainer/VBoxContainer2/AcceptOutput +@onready var confirmation_dialog: ConfirmationDialog = $ConfirmationDialog +@onready var confirmation_dialog_output: TextEdit = $HBoxContainer/VBoxContainer2/ConfirmationOutput +@onready var popup: Popup = $Popup +@onready var popup_menu: PopupMenu = $PopupMenu +@onready var popup_menu_output: TextEdit = $HBoxContainer/VBoxContainer3/PopupMenuOutput +@onready var popup_panel: PopupPanel = $PopupPanel +@onready var status_indicator: StatusIndicator = $StatusIndicator + + +func _on_embed_subwindows_toggled(toggled_on: bool) -> void: + var hidden_windows: Array[Window] = [] + for child in get_children(): + if child is Window and child.is_visible(): + child.hide() + hidden_windows.append(child) + + embed_subwindows(toggled_on) + for _window in hidden_windows: + _window.show() + + +func embed_subwindows(state: bool) -> void: + get_viewport().gui_embed_subwindows = state + + +func _on_window_button_pressed() -> void: + window.show() + window.grab_focus() + + +func _on_transient_window_toggled(toggled_on: bool) -> void: + window.transient = toggled_on + + +func _on_exclusive_window_toggled(toggled_on: bool) -> void: + window.exclusive = toggled_on + + +func _on_unresizable_window_toggled(toggled_on: bool) -> void: + window.unresizable = toggled_on + + +func _on_borderless_window_toggled(toggled_on: bool) -> void: + window.borderless = toggled_on + + +func _on_always_on_top_window_toggled(toggled_on: bool) -> void: + window.always_on_top = toggled_on + + +func _on_transparent_window_toggled(toggled_on: bool) -> void: + window.transparent = toggled_on + + +func _on_window_title_edit_text_changed(new_text: String) -> void: + window.title = new_text + + +func _on_draggable_window_button_pressed() -> void: + draggable_window.show() + draggable_window.grab_focus() + + +func _on_draggable_window_close_pressed() -> void: + draggable_window.hide() + + +func _on_bg_draggable_window_toggled(toggled_on: bool) -> void: + draggable_window.get_node("BG").visible = toggled_on + + +func _on_passthrough_polygon_item_selected(index: int) -> void: + match index: + 0: + draggable_window.mouse_passthrough_polygon = [] + 1: + draggable_window.get_node("PassthroughGenerator").generate_polygon() + 2: + draggable_window.mouse_passthrough_polygon = [ + Vector2(16, 0), Vector2(16, 128), + Vector2(116, 128), Vector2(116, 0)] + + +func _on_file_dialog_button_pressed() -> void: + file_dialog.show() + + +func _on_file_dialog_dir_selected(dir: String) -> void: + file_dialog_output.text = "Directory Path: " + dir + + +func _on_file_dialog_file_selected(path: String) -> void: + file_dialog_output.text = "File Path: " + path + + +func _on_file_dialog_files_selected(paths: PackedStringArray) -> void: + file_dialog_output.text = "Chosen Paths: " + str(paths) + + +func _on_file_dialog_options_item_selected(index: int) -> void: + match index: + 0: + file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + 1: + file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILES + 2: + file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_DIR + 3: + file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_ANY + 4: + file_dialog.file_mode = FileDialog.FILE_MODE_SAVE_FILE + +func _on_native_dialog_toggled(toggled_on: bool) -> void: + file_dialog.use_native_dialog = toggled_on + + +func _on_accept_button_text_submitted(new_text: String) -> void: + if not new_text.is_empty(): + accept_dialog.add_button(new_text, false, new_text) + + +func _on_accept_dialog_canceled() -> void: + accept_dialog_output.text = "Cancelled" + + +func _on_accept_dialog_confirmed() -> void: + accept_dialog_output.text = "Accepted" + + +func _on_accept_dialog_custom_action(action: StringName) -> void: + accept_dialog_output.text = "Custom Action: " + action + accept_dialog.hide() + + +func _on_accept_button_pressed() -> void: + accept_dialog.show() + + +func _on_confirmation_button_pressed() -> void: + confirmation_dialog.show() + + +func _on_confirmation_dialog_canceled() -> void: + confirmation_dialog_output.text = "Cancelled" + + +func _on_confirmation_dialog_confirmed() -> void: + confirmation_dialog_output.text = "Accepted" + + +func show_popup(_popup: Popup): + var mouse_position + if get_viewport().gui_embed_subwindows: + mouse_position = get_global_mouse_position() + else: + mouse_position = DisplayServer.mouse_get_position() + + _popup.popup(Rect2(mouse_position, _popup.size)) + + +func _on_popup_button_pressed() -> void: + show_popup(popup) + + +func _on_popup_menu_button_pressed() -> void: + show_popup(popup_menu) + + +func _on_popup_panel_button_pressed() -> void: + show_popup(popup_panel) + + +func _on_popup_menu_option_pressed(option: String) -> void: + popup_menu_output.text = option + " was pressed." + + +func _on_status_indicator_visible_toggled(toggled_on: bool) -> void: + status_indicator.visible = toggled_on diff --git a/misc/multiple_windows/scenes/main_scene.gd.uid b/misc/multiple_windows/scenes/main_scene.gd.uid new file mode 100644 index 00000000..c3ad87de --- /dev/null +++ b/misc/multiple_windows/scenes/main_scene.gd.uid @@ -0,0 +1 @@ +uid://brqixlpt4am24 diff --git a/misc/multiple_windows/scenes/main_scene.tscn b/misc/multiple_windows/scenes/main_scene.tscn new file mode 100644 index 00000000..fa663559 --- /dev/null +++ b/misc/multiple_windows/scenes/main_scene.tscn @@ -0,0 +1,368 @@ +[gd_scene load_steps=13 format=3 uid="uid://8nmbmlqd6df6"] + +[ext_resource type="Script" uid="uid://brqixlpt4am24" path="res://scenes/main_scene.gd" id="1_nwc20"] +[ext_resource type="PackedScene" uid="uid://blbehgenpldb" path="res://scenes/window/window.tscn" id="2_ldw47"] +[ext_resource type="Script" uid="uid://b4ngyw7e2c75u" path="res://scenes/disable_other.gd" id="2_psh0l"] +[ext_resource type="Script" uid="uid://evvrji8vwf5l" path="res://scenes/text_field.gd" id="3_bgndp"] +[ext_resource type="PackedScene" uid="uid://ek1fmwy87san" path="res://scenes/draggable_window/draggable_window.tscn" id="4_diw6b"] +[ext_resource type="PackedScene" uid="uid://dx84v67isxyjv" path="res://scenes/file_dialogue/file_dialog.tscn" id="5_f4o8g"] +[ext_resource type="PackedScene" uid="uid://cudrukovmha7p" path="res://scenes/accept_dialogue/accept_dialog.tscn" id="6_st8be"] +[ext_resource type="PackedScene" uid="uid://1nswovajdv3n" path="res://scenes/confimation_dialogue/confirmation_dialog.tscn" id="7_wii4q"] +[ext_resource type="PackedScene" uid="uid://p7lgllpnc8h8" path="res://scenes/popup/popup.tscn" id="8_vohc5"] +[ext_resource type="PackedScene" uid="uid://j7j6fe7plvmt" path="res://scenes/popup_menu/popup_menu.tscn" id="9_b1y32"] +[ext_resource type="PackedScene" uid="uid://dj15to28g17lb" path="res://scenes/popup_panel/popup_panel.tscn" id="10_rn47v"] +[ext_resource type="PackedScene" uid="uid://bfsfek8h27vha" path="res://scenes/status_indicator/status_indicator.tscn" id="12_cb4u3"] + +[node name="MainScene" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_nwc20") + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 32 +alignment = 1 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] +layout_mode = 2 + +[node name="EmbedSubwindows" type="CheckButton" parent="HBoxContainer/VBoxContainer" node_paths=PackedStringArray("others")] +layout_mode = 2 +button_pressed = true +text = "Embed Subwindows" +script = ExtResource("2_psh0l") +others = [NodePath("../TransparentWindow"), NodePath("../PassthroughPolygon")] +behavior = 1 + +[node name="HSeparator" type="HSeparator" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="WindowLabel" type="Label" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Window" +horizontal_alignment = 1 + +[node name="WindowButton" type="Button" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Show window" + +[node name="WindowTitleEdit" type="LineEdit" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +placeholder_text = "Window's Title" + +[node name="TransientWindow" type="CheckButton" parent="HBoxContainer/VBoxContainer" node_paths=PackedStringArray("others")] +layout_mode = 2 +text = "Transient" +script = ExtResource("2_psh0l") +others = [NodePath("../ExclusiveWindow")] + +[node name="ExclusiveWindow" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +tooltip_text = "Needs transient enabled to work." +disabled = true +text = "Exclusive +" + +[node name="UnresizableWindow" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Unresizable +" + +[node name="BorderlessWindow" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Borderless" + +[node name="AlwaysOnTopWindow" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Always on Top" + +[node name="TransparentWindow" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +tooltip_text = "Needs embed_subwindows disabled to work." +text = "Transparent +" + +[node name="HSeparator2" type="HSeparator" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="WindowArea2D" type="Label" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Window with Area2D" +horizontal_alignment = 1 + +[node name="HBoxContainerDW" type="HBoxContainer" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="DraggableWindowButton" type="Button" parent="HBoxContainer/VBoxContainer/HBoxContainerDW"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Draggable window" + +[node name="Close" type="Button" parent="HBoxContainer/VBoxContainer/HBoxContainerDW"] +layout_mode = 2 +text = "X" + +[node name="DraggableWindowExplanation" type="RichTextLabel" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/normal_font_size = 12 +text = "This window uses Area2D to detect if user clicked inside of it. +Since it's Area2D, you can change it's CollisionShape2D. +But since Area2D is a Physics Object, \"Physics Object Picking\" inside of Window's properties hard to be enabled. +" +fit_content = true + +[node name="BGDraggableWindow" type="CheckButton" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +tooltip_text = "Needs embed_subwindows disabled to work." +text = "Add Background" + +[node name="PassthroughLabel" type="Label" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Passthrough Polygon:" + +[node name="PassthroughPolygon" type="OptionButton" parent="HBoxContainer/VBoxContainer"] +layout_mode = 2 +tooltip_text = "Needs embed_subwindows disabled to work." +selected = 0 +item_count = 3 +popup/item_0/text = "Empty" +popup/item_0/id = 0 +popup/item_1/text = "Calculate via BitMap" +popup/item_1/id = 1 +popup/item_2/text = "Rectangle" +popup/item_2/id = 2 + +[node name="VBoxContainer2" type="VBoxContainer" parent="HBoxContainer"] +layout_mode = 2 + +[node name="FileDialogLabel" type="Label" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "File Dialog" +horizontal_alignment = 1 + +[node name="FileDialogButton" type="Button" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "Show File Dialog" + +[node name="FileDialogOptions" type="OptionButton" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +selected = 4 +item_count = 5 +popup/item_0/text = "Open File" +popup/item_0/id = 0 +popup/item_1/text = "Open Files" +popup/item_1/id = 1 +popup/item_2/text = "Open Folder" +popup/item_2/id = 2 +popup/item_3/text = "Open Any" +popup/item_3/id = 3 +popup/item_4/text = "Save" +popup/item_4/id = 4 + +[node name="NativeDialog" type="CheckButton" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "Use Native +Dialog" + +[node name="FileDialogOutput" type="TextEdit" parent="HBoxContainer/VBoxContainer2"] +custom_minimum_size = Vector2(200, 150) +layout_mode = 2 +placeholder_text = "Chosen path will show up here." +editable = false +wrap_mode = 1 + +[node name="HSeparator" type="HSeparator" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 + +[node name="AcceptLabel" type="Label" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "Accept Dialog" +horizontal_alignment = 1 + +[node name="AcceptButton" type="Button" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "Show Accept Dialog" + +[node name="NewButtonField" type="HBoxContainer" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="HBoxContainer/VBoxContainer2/NewButtonField" node_paths=PackedStringArray("submit_button")] +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "New button field" +script = ExtResource("3_bgndp") +submit_button = NodePath("../Submit") + +[node name="Submit" type="Button" parent="HBoxContainer/VBoxContainer2/NewButtonField"] +layout_mode = 2 +text = "Enter" + +[node name="AcceptOutput" type="TextEdit" parent="HBoxContainer/VBoxContainer2"] +custom_minimum_size = Vector2(200, 70) +layout_mode = 2 +placeholder_text = "Dialogue result will show up here." +editable = false +wrap_mode = 1 + +[node name="HSeparator2" type="HSeparator" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 + +[node name="ConfirmationLabel" type="Label" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "Confirmation Dialog" +horizontal_alignment = 1 + +[node name="ConfirmationButton" type="Button" parent="HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "Show Dialogue" + +[node name="ConfirmationOutput" type="TextEdit" parent="HBoxContainer/VBoxContainer2"] +custom_minimum_size = Vector2(200, 35) +layout_mode = 2 +placeholder_text = "Confirmation Result" +editable = false +wrap_mode = 1 + +[node name="VBoxContainer3" type="VBoxContainer" parent="HBoxContainer"] +layout_mode = 2 + +[node name="PopupLabel" type="Label" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 +text = "Popup" +horizontal_alignment = 1 + +[node name="PopupButton" type="Button" parent="HBoxContainer/VBoxContainer3"] +custom_minimum_size = Vector2(150, 85) +layout_mode = 2 +text = "Show Popup" + +[node name="PopupDescription" type="RichTextLabel" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 +theme_override_font_sizes/normal_font_size = 12 +theme_override_font_sizes/mono_font_size = 12 +bbcode_enabled = true +text = "Popup hiding on mouse exit is handled by via [code]mouse_exited[/code] signal" +fit_content = true + +[node name="HSeparator" type="HSeparator" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 + +[node name="PopupMenuLabel" type="Label" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 +text = "Popup" +horizontal_alignment = 1 + +[node name="PopupMenuButton" type="Button" parent="HBoxContainer/VBoxContainer3"] +custom_minimum_size = Vector2(150, 85) +layout_mode = 2 +text = "Show Popup" + +[node name="PopupMenuOutput" type="TextEdit" parent="HBoxContainer/VBoxContainer3"] +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 +placeholder_text = "Pressed option will show up here." +editable = false +wrap_mode = 1 + +[node name="HSeparator2" type="HSeparator" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 + +[node name="PopupPanelLabel" type="Label" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 +text = "Popup" +horizontal_alignment = 1 + +[node name="PopupPanelButton" type="Button" parent="HBoxContainer/VBoxContainer3"] +custom_minimum_size = Vector2(150, 85) +layout_mode = 2 +text = "Show Popup" + +[node name="HSeparator3" type="HSeparator" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 + +[node name="StatusIndicatorLabel" type="Label" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 +text = "Status Indicator" +horizontal_alignment = 1 + +[node name="StatusIndicatorVisible" type="CheckButton" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 +button_pressed = true +text = "Visible Tray Icon" + +[node name="OSLimitation" type="RichTextLabel" parent="HBoxContainer/VBoxContainer3"] +layout_mode = 2 +theme_override_font_sizes/normal_font_size = 12 +text = "Only works on Windows and macOS" +fit_content = true + +[node name="Window" parent="." instance=ExtResource("2_ldw47")] +visible = false + +[node name="DraggableWindow" parent="." instance=ExtResource("4_diw6b")] +visible = false + +[node name="FileDialog" parent="." instance=ExtResource("5_f4o8g")] +visible = false +access = 2 + +[node name="AcceptDialog" parent="." instance=ExtResource("6_st8be")] +visible = false + +[node name="ConfirmationDialog" parent="." instance=ExtResource("7_wii4q")] +visible = false + +[node name="Popup" parent="." instance=ExtResource("8_vohc5")] +visible = false + +[node name="PopupMenu" parent="." instance=ExtResource("9_b1y32")] +visible = false +unfocusable = false + +[node name="PopupPanel" parent="." instance=ExtResource("10_rn47v")] +visible = false + +[node name="StatusIndicator" parent="." instance=ExtResource("12_cb4u3")] +tooltip = "Multiple Windows Demo" + +[connection signal="toggled" from="HBoxContainer/VBoxContainer/EmbedSubwindows" to="." method="_on_embed_subwindows_toggled"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer/WindowButton" to="." method="_on_window_button_pressed"] +[connection signal="text_changed" from="HBoxContainer/VBoxContainer/WindowTitleEdit" to="." method="_on_window_title_edit_text_changed"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer/TransientWindow" to="." method="_on_transient_window_toggled"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer/ExclusiveWindow" to="." method="_on_exclusive_window_toggled"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer/UnresizableWindow" to="." method="_on_unresizable_window_toggled"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer/BorderlessWindow" to="." method="_on_borderless_window_toggled"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer/AlwaysOnTopWindow" to="." method="_on_always_on_top_window_toggled"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer/TransparentWindow" to="." method="_on_transparent_window_toggled"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer/HBoxContainerDW/DraggableWindowButton" to="." method="_on_draggable_window_button_pressed"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer/HBoxContainerDW/Close" to="." method="_on_draggable_window_close_pressed"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer/BGDraggableWindow" to="." method="_on_bg_draggable_window_toggled"] +[connection signal="item_selected" from="HBoxContainer/VBoxContainer/PassthroughPolygon" to="." method="_on_passthrough_polygon_item_selected"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer2/FileDialogButton" to="." method="_on_file_dialog_button_pressed"] +[connection signal="item_selected" from="HBoxContainer/VBoxContainer2/FileDialogOptions" to="." method="_on_file_dialog_options_item_selected"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer2/NativeDialog" to="." method="_on_native_dialog_toggled"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer2/AcceptButton" to="." method="_on_accept_button_pressed"] +[connection signal="text_submitted" from="HBoxContainer/VBoxContainer2/NewButtonField/LineEdit" to="." method="_on_accept_button_text_submitted"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer2/ConfirmationButton" to="." method="_on_confirmation_button_pressed"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer3/PopupButton" to="." method="_on_popup_button_pressed"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer3/PopupMenuButton" to="." method="_on_popup_menu_button_pressed"] +[connection signal="pressed" from="HBoxContainer/VBoxContainer3/PopupPanelButton" to="." method="_on_popup_panel_button_pressed"] +[connection signal="toggled" from="HBoxContainer/VBoxContainer3/StatusIndicatorVisible" to="." method="_on_status_indicator_visible_toggled"] +[connection signal="dir_selected" from="FileDialog" to="." method="_on_file_dialog_dir_selected"] +[connection signal="file_selected" from="FileDialog" to="." method="_on_file_dialog_file_selected"] +[connection signal="files_selected" from="FileDialog" to="." method="_on_file_dialog_files_selected"] +[connection signal="canceled" from="AcceptDialog" to="." method="_on_accept_dialog_canceled"] +[connection signal="confirmed" from="AcceptDialog" to="." method="_on_accept_dialog_confirmed"] +[connection signal="custom_action" from="AcceptDialog" to="." method="_on_accept_dialog_custom_action"] +[connection signal="canceled" from="ConfirmationDialog" to="." method="_on_confirmation_dialog_canceled"] +[connection signal="confirmed" from="ConfirmationDialog" to="." method="_on_confirmation_dialog_confirmed"] +[connection signal="option_pressed" from="PopupMenu" to="." method="_on_popup_menu_option_pressed"] diff --git a/misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd b/misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd new file mode 100644 index 00000000..6afecd11 --- /dev/null +++ b/misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd @@ -0,0 +1,9 @@ +extends Popup + + +func _ready() -> void: + mouse_exited.connect(_on_mouse_exited) + + +func _on_mouse_exited(): + hide() diff --git a/misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd.uid b/misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd.uid new file mode 100644 index 00000000..f090a059 --- /dev/null +++ b/misc/multiple_windows/scenes/popup/hide_on_mouse_exit.gd.uid @@ -0,0 +1 @@ +uid://vyfoelflu5ca diff --git a/misc/multiple_windows/scenes/popup/popup.tscn b/misc/multiple_windows/scenes/popup/popup.tscn new file mode 100644 index 00000000..4c79788f --- /dev/null +++ b/misc/multiple_windows/scenes/popup/popup.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=3 format=3 uid="uid://p7lgllpnc8h8"] + +[ext_resource type="Script" path="res://scenes/popup/hide_on_mouse_exit.gd" id="1_8lp3w"] +[ext_resource type="Texture2D" uid="uid://cehd300ehf1vw" path="res://icon.webp" id="2_yl4m2"] + +[node name="Popup" type="Popup"] +size = Vector2i(128, 128) +visible = true +script = ExtResource("1_8lp3w") + +[node name="TextureRect" type="TextureRect" parent="."] +offset_right = 40.0 +offset_bottom = 40.0 +texture = ExtResource("2_yl4m2") diff --git a/misc/multiple_windows/scenes/popup_menu/popup_menu.gd b/misc/multiple_windows/scenes/popup_menu/popup_menu.gd new file mode 100644 index 00000000..ee651609 --- /dev/null +++ b/misc/multiple_windows/scenes/popup_menu/popup_menu.gd @@ -0,0 +1,34 @@ +extends PopupMenu + + +signal option_pressed(option: String) + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + add_item("Normal Item") + add_multistate_item("Multistate Item", 3, 0) + add_radio_check_item("Radio Check Item 1") + add_radio_check_item("Radio Check Item 2") + add_check_item("Check Item") + add_separator("Separator") + add_submenu_item("Submenu", "SubPopupMenu") + var submenu: PopupMenu = $SubPopupMenu + submenu.transparent = true + submenu.add_item("Submenu Item 1") + submenu.add_item("Submenu Item 2") + submenu.index_pressed.connect(func(index): option_pressed.emit(submenu.get_item_text(index))) + index_pressed.connect(_on_index_pressed) + + +func _on_index_pressed(index: int) -> void: + if is_item_checkable(index): + set_item_checked(index, not is_item_checked(index)) + + match index: + 2: + set_item_checked(3, false) + 3: + set_item_checked(2, false) + + option_pressed.emit(get_item_text(index)) diff --git a/misc/multiple_windows/scenes/popup_menu/popup_menu.gd.uid b/misc/multiple_windows/scenes/popup_menu/popup_menu.gd.uid new file mode 100644 index 00000000..351aedd7 --- /dev/null +++ b/misc/multiple_windows/scenes/popup_menu/popup_menu.gd.uid @@ -0,0 +1 @@ +uid://dmqie5oywulfi diff --git a/misc/multiple_windows/scenes/popup_menu/popup_menu.tscn b/misc/multiple_windows/scenes/popup_menu/popup_menu.tscn new file mode 100644 index 00000000..3068abd7 --- /dev/null +++ b/misc/multiple_windows/scenes/popup_menu/popup_menu.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3 uid="uid://j7j6fe7plvmt"] + +[ext_resource type="Script" path="res://scenes/popup_menu/popup_menu.gd" id="1_hi4jw"] + +[node name="PopupMenu" type="PopupMenu"] +transparent_bg = true +visible = true +transparent = true +unfocusable = true +script = ExtResource("1_hi4jw") + +[node name="SubPopupMenu" type="PopupMenu" parent="."] +transparent_bg = true +transparent = true diff --git a/misc/multiple_windows/scenes/popup_panel/popup_panel.tscn b/misc/multiple_windows/scenes/popup_panel/popup_panel.tscn new file mode 100644 index 00000000..97656189 --- /dev/null +++ b/misc/multiple_windows/scenes/popup_panel/popup_panel.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=2 format=3 uid="uid://dj15to28g17lb"] + +[sub_resource type="GDScript" id="GDScript_aqitk"] +script/source = "extends ProgressBar + +func _on_h_slider_value_changed(_value: float) -> void: + value = _value +" + +[node name="PopupPanel" type="PopupPanel"] +visible = true + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +offset_left = 4.0 +offset_top = 4.0 +offset_right = 96.0 +offset_bottom = 96.0 + +[node name="ProgressBar" type="ProgressBar" parent="VBoxContainer"] +layout_mode = 2 +script = SubResource("GDScript_aqitk") + +[node name="HSlider" type="HSlider" parent="VBoxContainer"] +layout_mode = 2 + +[connection signal="value_changed" from="VBoxContainer/HSlider" to="VBoxContainer/ProgressBar" method="_on_h_slider_value_changed"] diff --git a/misc/multiple_windows/scenes/status_indicator/status_indicator.gd b/misc/multiple_windows/scenes/status_indicator/status_indicator.gd new file mode 100644 index 00000000..7933f25e --- /dev/null +++ b/misc/multiple_windows/scenes/status_indicator/status_indicator.gd @@ -0,0 +1,27 @@ +extends StatusIndicator + + +@onready var popup_menu: PopupMenu = get_node(menu) + + +func _ready() -> void: + popup_menu.prefer_native_menu = true + popup_menu.add_item("Quit") + popup_menu.index_pressed.connect(_on_popup_menu_index_pressed) + pressed.connect(_on_pressed) + + +# Isn't being called on right mouse button because menu is set. +func _on_pressed(mouse_button: int, _mouse_position: Vector2i) -> void: + if mouse_button == MOUSE_BUTTON_LEFT: + var window: Window = get_window() + if window.mode == Window.Mode.MODE_MINIMIZED: + window.mode = Window.Mode.MODE_WINDOWED + window.grab_focus() + + +func _on_popup_menu_index_pressed(index: int) -> void: + match index: + 0: + get_tree().root.propagate_notification(NOTIFICATION_WM_CLOSE_REQUEST) + get_tree().quit() diff --git a/misc/multiple_windows/scenes/status_indicator/status_indicator.gd.uid b/misc/multiple_windows/scenes/status_indicator/status_indicator.gd.uid new file mode 100644 index 00000000..03257846 --- /dev/null +++ b/misc/multiple_windows/scenes/status_indicator/status_indicator.gd.uid @@ -0,0 +1 @@ +uid://b3ccfgjmssfm3 diff --git a/misc/multiple_windows/scenes/status_indicator/status_indicator.tscn b/misc/multiple_windows/scenes/status_indicator/status_indicator.tscn new file mode 100644 index 00000000..2d869458 --- /dev/null +++ b/misc/multiple_windows/scenes/status_indicator/status_indicator.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=3 format=3 uid="uid://bfsfek8h27vha"] + +[ext_resource type="Texture2D" uid="uid://cehd300ehf1vw" path="res://icon.webp" id="1_ryu0x"] +[ext_resource type="Script" path="res://scenes/status_indicator/status_indicator.gd" id="2_oe45l"] + +[node name="StatusIndicator" type="StatusIndicator"] +icon = ExtResource("1_ryu0x") +menu = NodePath("PopupMenu") +script = ExtResource("2_oe45l") + +[node name="PopupMenu" type="PopupMenu" parent="."] +prefer_native_menu = true diff --git a/misc/multiple_windows/scenes/text_field.gd b/misc/multiple_windows/scenes/text_field.gd new file mode 100644 index 00000000..31a96f4d --- /dev/null +++ b/misc/multiple_windows/scenes/text_field.gd @@ -0,0 +1,10 @@ +extends LineEdit + + +@export var submit_button: Button + + +func _ready() -> void: + text_submitted.connect(func(_s): clear(), ConnectFlags.CONNECT_DEFERRED) + if submit_button: + submit_button.pressed.connect(func(): text_submitted.emit(text)) diff --git a/misc/multiple_windows/scenes/text_field.gd.uid b/misc/multiple_windows/scenes/text_field.gd.uid new file mode 100644 index 00000000..c88cd66c --- /dev/null +++ b/misc/multiple_windows/scenes/text_field.gd.uid @@ -0,0 +1 @@ +uid://evvrji8vwf5l diff --git a/misc/multiple_windows/scenes/window/url_opener.gd b/misc/multiple_windows/scenes/window/url_opener.gd new file mode 100644 index 00000000..f148ad1a --- /dev/null +++ b/misc/multiple_windows/scenes/window/url_opener.gd @@ -0,0 +1,10 @@ +extends RichTextLabel + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + meta_clicked.connect(_on_meta_clicked) + + +func _on_meta_clicked(meta: Variant) -> void: + OS.shell_open(str(meta)) diff --git a/misc/multiple_windows/scenes/window/url_opener.gd.uid b/misc/multiple_windows/scenes/window/url_opener.gd.uid new file mode 100644 index 00000000..d242fd83 --- /dev/null +++ b/misc/multiple_windows/scenes/window/url_opener.gd.uid @@ -0,0 +1 @@ +uid://bkauiff2v11ga diff --git a/misc/multiple_windows/scenes/window/window.gd b/misc/multiple_windows/scenes/window/window.gd new file mode 100644 index 00000000..ceaee472 --- /dev/null +++ b/misc/multiple_windows/scenes/window/window.gd @@ -0,0 +1,11 @@ +extends Window + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + close_requested.connect(_on_close_requested) + + +func _on_close_requested() -> void: + print("%s %s was hidden." % [str(self.get_class()), name]) + hide() diff --git a/misc/multiple_windows/scenes/window/window.gd.uid b/misc/multiple_windows/scenes/window/window.gd.uid new file mode 100644 index 00000000..2f454683 --- /dev/null +++ b/misc/multiple_windows/scenes/window/window.gd.uid @@ -0,0 +1 @@ +uid://op5na21b0cg3 diff --git a/misc/multiple_windows/scenes/window/window.tscn b/misc/multiple_windows/scenes/window/window.tscn new file mode 100644 index 00000000..fab15e3e --- /dev/null +++ b/misc/multiple_windows/scenes/window/window.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=3 format=3 uid="uid://blbehgenpldb"] + +[ext_resource type="Script" path="res://scenes/window/url_opener.gd" id="1_cqmq3"] +[ext_resource type="Script" path="res://scenes/window/window.gd" id="1_yx1y1"] + +[node name="Window" type="Window"] +initial_position = 2 +size = Vector2i(500, 150) +script = ExtResource("1_yx1y1") + +[node name="Control" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="RichTextLabel" type="RichTextLabel" parent="Control"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +bbcode_enabled = true +text = "[url=https://docs.godotengine.org/en/stable/classes/class_window.html]Window, Godot Docs[/url]: + +At runtime, [b]Windows[/b] will not close automatically when requested. You need to handle it manually using the [url=https://docs.godotengine.org/en/stable/classes/class_window.html#class-window-signal-close-requested]close_requested[/url] signal (this applies both to pressing the close button and clicking outside of a popup)." +script = ExtResource("1_cqmq3") diff --git a/misc/multiple_windows/screenshots/.gdignore b/misc/multiple_windows/screenshots/.gdignore new file mode 100644 index 00000000..e69de29b diff --git a/misc/multiple_windows/screenshots/screenshot.webp b/misc/multiple_windows/screenshots/screenshot.webp new file mode 100644 index 0000000000000000000000000000000000000000..c0424a0356813e6e2869324335e52b70b28092d2 GIT binary patch literal 49332 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
Jrsl-^V6j$q_Yf0zh}V4%b6zzWTlkcwf9dk|lk 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 literal 0 HcmV?d00001