From 135b35cfac7ad87894f4816cf7374d22e4f610b6 Mon Sep 17 00:00:00 2001 From: antimundo Date: Tue, 27 Feb 2024 17:27:33 +0100 Subject: [PATCH] Add fullscreen button in settings --- project.godot | 1 + scenes/autoload/display_manager.gd | 43 ++++++++++++++++++++++++++++++ scenes/autoload/global.gd | 7 ----- scenes/main_menu/settings.tscn | 14 ++++++++++ scenes/main_menu/settings_video.gd | 18 +++++++++++++ 5 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 scenes/autoload/display_manager.gd diff --git a/project.godot b/project.godot index 460dd21..d8bbbc9 100644 --- a/project.godot +++ b/project.godot @@ -19,6 +19,7 @@ config/icon="res://icon.svg" Global="*res://scenes/autoload/global.gd" DataManager="*res://scenes/autoload/data_manager.gd" +DisplayManager="*res://scenes/autoload/display_manager.gd" [display] diff --git a/scenes/autoload/display_manager.gd b/scenes/autoload/display_manager.gd new file mode 100644 index 0000000..7422b39 --- /dev/null +++ b/scenes/autoload/display_manager.gd @@ -0,0 +1,43 @@ +extends Node + +signal window_mode_updated(window_mode: DisplayServer.WindowMode) + +func _ready(): + var category = DataManager.categories.SETTINGS + if DataManager.get_data(category, "window_mode"): + var selected = DataManager.get_data(category, "window_mode") + set_window_mode(get_window_mode_from_string(selected)) + +func _input(event): + if event.is_action_pressed("fullscreen"): + if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN: + set_window_mode(DisplayServer.WINDOW_MODE_MAXIMIZED) + else: + set_window_mode(DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN) + +func set_window_mode_from_string(window_mode: String): + set_window_mode(get_window_mode_from_string(window_mode)) + +func get_window_mode_from_string(window_mode: String): + match window_mode: + "fullscreen": + return DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN + "windowed": + return DisplayServer.WINDOW_MODE_MAXIMIZED + return null + +func get_string_from_window_mode(window_mode: DisplayServer.WindowMode): + match window_mode: + DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN: + return "fullscreen" + DisplayServer.WINDOW_MODE_MAXIMIZED: + return "windowed" + return null + +func set_window_mode(window_mode: DisplayServer.WindowMode): + window_mode_updated.emit(window_mode) + DisplayServer.window_set_mode(window_mode) + if window_mode == DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN: + DataManager.save_data("window_mode", "fullscreen", DataManager.categories.SETTINGS) + elif window_mode == DisplayServer.WINDOW_MODE_MAXIMIZED: + DataManager.save_data("window_mode", "windowed", DataManager.categories.SETTINGS) diff --git a/scenes/autoload/global.gd b/scenes/autoload/global.gd index 21e2a3e..cfbdbe9 100644 --- a/scenes/autoload/global.gd +++ b/scenes/autoload/global.gd @@ -68,10 +68,3 @@ func string_to_color(string_vector: String) -> Color: # Create the Vector3D object return Color(r, g, b, a) - -func _input(event): - if event.is_action_pressed("fullscreen"): - if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_MAXIMIZED) - else: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_EXCLUSIVE_FULLSCREEN) diff --git a/scenes/main_menu/settings.tscn b/scenes/main_menu/settings.tscn index 7bd4e85..fcbd8af 100644 --- a/scenes/main_menu/settings.tscn +++ b/scenes/main_menu/settings.tscn @@ -333,6 +333,19 @@ min_value = 45.0 max_value = 130.0 value = 80.0 +[node name="WindowModeLabel" type="Label" parent="HBoxContainer/Control2/Video/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Window mode" + +[node name="WindowModeOptions" type="OptionButton" parent="HBoxContainer/Control2/Video/MarginContainer/VBoxContainer"] +layout_mode = 2 +item_count = 2 +selected = 0 +popup/item_0/text = "fullscreen" +popup/item_0/id = 1 +popup/item_1/text = "windowed" +popup/item_1/id = 0 + [node name="Controls" type="Control" parent="HBoxContainer/Control2"] visible = false layout_mode = 1 @@ -448,6 +461,7 @@ layout_mode = 2 [connection signal="file_selected" from="HBoxContainer/Control2/Crosshair/MarginContainer/VBoxContainer/ImportFileDialog" to="HBoxContainer/Control2/Crosshair" method="_on_import_file_dialog_file_selected"] [connection signal="value_changed" from="HBoxContainer/Control2/Video/MarginContainer/VBoxContainer/ResolutionSlider" to="HBoxContainer/Control2/Video" method="_on_resolution_slider_value_changed"] [connection signal="value_changed" from="HBoxContainer/Control2/Video/MarginContainer/VBoxContainer/FovSlider" to="HBoxContainer/Control2/Video" method="_on_fov_slider_value_changed"] +[connection signal="item_selected" from="HBoxContainer/Control2/Video/MarginContainer/VBoxContainer/WindowModeOptions" to="HBoxContainer/Control2/Video" method="_on_window_mode_options_item_selected"] [connection signal="item_selected" from="HBoxContainer/Control2/Controls/MarginContainer/VBoxContainer/HBoxContainer2/Game" to="HBoxContainer/Control2/Controls" method="_on_game_item_selected"] [connection signal="text_changed" from="HBoxContainer/Control2/Controls/MarginContainer/VBoxContainer/HBoxContainer2/Sensitivity" to="HBoxContainer/Control2/Controls" method="_on_sensitivity_text_changed"] [connection signal="value_changed" from="HBoxContainer/Control2/Audio/MarginContainer/VBoxContainer/VolumeSlider" to="HBoxContainer/Control2/Audio" method="_on_volume_slider_value_changed"] diff --git a/scenes/main_menu/settings_video.gd b/scenes/main_menu/settings_video.gd index b4fdd3d..27f83fc 100644 --- a/scenes/main_menu/settings_video.gd +++ b/scenes/main_menu/settings_video.gd @@ -4,8 +4,10 @@ extends Control @onready var resolution_slider = $MarginContainer/VBoxContainer/ResolutionSlider @onready var fov_label = $MarginContainer/VBoxContainer/FovLabel @onready var fov_slider = $MarginContainer/VBoxContainer/FovSlider +@onready var window_mode_options = $MarginContainer/VBoxContainer/WindowModeOptions func _ready(): + DisplayManager.window_mode_updated.connect(_on_display_manager_window_mode_updated) update_fov_label() update_resolution_label() get_viewport().size_changed.connect(self.update_resolution_label) @@ -15,6 +17,11 @@ func _ready(): resolution_slider.value = DataManager.get_data(category, "resolution") if DataManager.get_data(category, "camera_fov"): fov_slider.value = DataManager.get_data(category, "camera_fov") + if DataManager.get_data(category, "window_mode"): + var selected = DataManager.get_data(category, "window_mode") + for i in range(window_mode_options.item_count): + if selected == window_mode_options.get_item_text(i): + window_mode_options.select(i) func _on_resolution_slider_value_changed(value: float) -> void: get_viewport().scaling_3d_scale = value @@ -24,6 +31,17 @@ func _on_resolution_slider_value_changed(value: float) -> void: func _on_fov_slider_value_changed(value): update_fov_label() DataManager.save_data("camera_fov", value, DataManager.categories.SETTINGS) + +func _on_window_mode_options_item_selected(index): + var option = window_mode_options.get_item_text(index) + DisplayManager.set_window_mode_from_string(option) + DataManager.save_data("window_mode", option, DataManager.categories.SETTINGS) + +func _on_display_manager_window_mode_updated(window_mode): + var selected = DisplayManager.get_string_from_window_mode(window_mode) + for i in range(window_mode_options.item_count): + if selected == window_mode_options.get_item_text(i): + window_mode_options.select(i) func update_resolution_label() -> void: var viewport_render_size = get_viewport().size * get_viewport().scaling_3d_scale