a game about throwing hammers made for the github game off
Diffstat (limited to 'ui/graphics.gd')
-rw-r--r--ui/graphics.gd80
1 files changed, 80 insertions, 0 deletions
diff --git a/ui/graphics.gd b/ui/graphics.gd
new file mode 100644
index 0000000..b074ed5
--- /dev/null
+++ b/ui/graphics.gd
@@ -0,0 +1,80 @@
+extends Popuppable
+
+const file = "user://graphics.settings"
+const SaveLoad := preload("res://addons/remap/private/SaveLoadUtils.gd") # so what its private, im using gdscript
+
+enum {FULLSCREEN, BORDERLESS_FS, WINDOWED}
+const map := {
+ FULLSCREEN: DisplayServer.WINDOW_MODE_FULLSCREEN,
+ WINDOWED: DisplayServer.WINDOW_MODE_WINDOWED,
+}
+const default_settings_data := {
+ window = WINDOWED,
+ vsync = false,
+}
+
+@onready var vsync: CheckBox = $"%vsyncbutton"
+@onready var window: CaretOptionButton = $"%windowbutton"
+
+var ignore_set_settings := false
+var has_loaded := false
+
+var settings := default_settings_data
+
+func save() -> void:
+ SaveLoad.save(file, settings)
+
+func _ready() -> void:
+ var lod := SaveLoad.load_file(file)
+ settings = lod if dict_cmp(lod, default_settings_data) else default_settings_data # check if the keys and vaue types are correct
+ has_loaded = true
+ update_button_visuals()
+
+static func dict_cmp(d1: Dictionary, d2: Dictionary) -> bool:
+ return (
+ len(d1) == len(d2)
+ and sort(d1.keys()) == sort(d2.keys())
+ and value_types(d1.values()) == value_types(d2.values())
+ )
+
+static func sort(arr: Array) -> Array:
+ arr.sort()
+ return arr
+
+static func value_types(arr: Array) -> Array:
+ var types = []
+ for value in arr:
+ types.append(typeof(value))
+ types.sort()
+ return types
+
+func update_button_visuals():
+ ignore_set_settings = true
+ vsync.button_pressed = settings.vsync
+ window.current_option = settings.window
+ ignore_set_settings = false
+
+func update_window():
+ if settings.window == BORDERLESS_FS:
+ DisplayServer.window_set_mode(map[FULLSCREEN])
+ DisplayServer.window_set_flag(DisplayServer.WINDOW_FLAG_BORDERLESS, true)
+ else:
+ DisplayServer.window_set_mode(map[settings.window])
+
+func update_vsync():
+ var vsync_mode := DisplayServer.VSYNC_DISABLED if not settings.vsync else DisplayServer.VSYNC_ENABLED
+ DisplayServer.window_set_vsync_mode(vsync_mode)
+
+func _on_vsync_toggled(button_pressed: bool) -> void:
+ if not has_loaded: return
+ if not ignore_set_settings:
+ settings.vsync = button_pressed
+ save()
+ update_vsync()
+
+func _on_window_mode_changed(current_option: int) -> void:
+ if not has_loaded: return
+ if not ignore_set_settings:
+ settings.window = current_option
+ save()
+ update_window()