From 8fd89c3b4c0f2d82599bdaa7f4243c4e7d7a7ae4 Mon Sep 17 00:00:00 2001 From: Xananax Date: Sun, 30 Apr 2023 18:47:36 +0200 Subject: [PATCH] remove native dialogs --- export_presets.cfg | 2 +- project.godot | 4 +-- scripts/time_sheet.gd | 65 +++++++++++++++++++++++++++++++++++++------ ui/composed_ui.tscn | 11 +++++++- ui/settings.gd | 52 +++++++++++++++++++++------------- ui/settings.tscn | 39 +++++++++++--------------- 6 files changed, 119 insertions(+), 54 deletions(-) diff --git a/export_presets.cfg b/export_presets.cfg index 094309c..662f6b1 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -50,7 +50,7 @@ script_encryption_key="" custom_template/debug="" custom_template/release="" -application/name="mutnt" +application/name="Rat Times" application/info="Made with Godot Engine" application/icon="res://assets/logo.icns" application/identifier="io.mutnt.app.rattimes" diff --git a/project.godot b/project.godot index 8b479f3..a6af3cc 100644 --- a/project.godot +++ b/project.godot @@ -96,9 +96,9 @@ window/handheld/orientation="portrait" window/ios/hide_home_indicator=false window/stretch/aspect="keep" -[editor_plugins] +[global] -enabled=PoolStringArray( "res://addons/native_dialogs/plugin.cfg" ) +rced=false [gui] diff --git a/scripts/time_sheet.gd b/scripts/time_sheet.gd index 1b4d41b..323bcd3 100644 --- a/scripts/time_sheet.gd +++ b/scripts/time_sheet.gd @@ -28,15 +28,9 @@ func load_file() -> bool: entries.append(entry) file.close() - entries.sort_custom(self, "_sort_entries") - return true -func _sort_entries(a: TimeEntry, b: TimeEntry) -> bool: - return a.name < b.name - - func get_active_entry_from_name(task_name: String) -> TimeEntry: for _entry in entries: var current_time_entry := _entry as TimeEntry @@ -103,9 +97,11 @@ func save() -> void: func make_items_tree() -> TimeEntryTreeItem: + var sorted_entries := EntrySorter.new(entries).sort_by([["name"], ["start_date", true]]).entries + var tree := TimeEntryTreeItem.new() - for entry_index in entries.size(): - var entry := entries[entry_index] as TimeEntry + for entry_index in sorted_entries.size(): + var entry := sorted_entries[entry_index] as TimeEntry var parts := entry.name.split("/") var repo: TimeEntryTreeItem = tree.get_child(parts, true) repo.append(entry) @@ -119,3 +115,56 @@ static func restore(file_path: String) -> TimeSheet: if success: return timesheet return null + +class EntrySorter: + + var entries: Array + var _sorters := PoolStringArray() + + func _init(initial_entries: Array) -> void: + entries = initial_entries.duplicate() + + func by_name(reverse := false) -> EntrySorter: + return sort_by_one("name", reverse) + + func by_date(reverse := false) -> EntrySorter: + return sort_by_one("date", reverse) + + func sort_by_one(property: String, reverse := false) -> EntrySorter: + var method_name := "_by_%s"%[property] + assert(has_method(method_name), "%s is not a valid sorting property"%[property]) + entries.sort_custom(self, method_name) + if reverse: + entries.invert() + return self + + func sort_by(initial_sorters: Array) -> EntrySorter: + for item in initial_sorters: + var property = item[0] + var reversed = item[1] if item.size() > 1 else false + var method_name := "_by_%s"%[property] + assert(has_method(method_name), "%s is not a valid sorting property"%[property]) + assert(reversed == null or reversed is bool, "The second item is not a boolean") + return self + _sorters = initial_sorters + entries.sort_custom(self, "__by_multiple") + _sorters = PoolStringArray() + return self + + func __by_multiple(a: TimeEntry, b: TimeEntry) -> bool: + for item in _sorters: + var property = item[0] + var reversed = item[1] + var method_name := "_by_%s"%[property] + var result: bool = call(method_name, a, b) + if reversed: + result = not result + if result == false: + return false + return true + + func _by_name(a: TimeEntry, b: TimeEntry) -> bool: + return a.name < b.name + + func _by_date(a: TimeEntry, b: TimeEntry) -> bool: + return a.start_time < b.start_time diff --git a/ui/composed_ui.tscn b/ui/composed_ui.tscn index 1a068c1..2ca1abc 100644 --- a/ui/composed_ui.tscn +++ b/ui/composed_ui.tscn @@ -68,12 +68,21 @@ margin_right = 350.0 margin_bottom = 750.0 size_flags_vertical = 3 -[node name="TasksList" parent="VBoxContainer/TabContainer" instance=ExtResource( 2 )] +[node name="Task List" type="VBoxContainer" parent="VBoxContainer/TabContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 margin_left = 5.0 margin_top = 46.0 margin_right = -5.0 margin_bottom = -5.0 + +[node name="TasksList" parent="VBoxContainer/TabContainer/Task List" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 340.0 +margin_bottom = 550.0 size_flags_horizontal = 3 +size_flags_vertical = 3 [node name="Settings" type="ScrollContainer" parent="VBoxContainer/TabContainer"] visible = false diff --git a/ui/settings.gd b/ui/settings.gd index 244f2ae..6d04564 100644 --- a/ui/settings.gd +++ b/ui/settings.gd @@ -2,17 +2,15 @@ extends Control var config: ConfigManager = preload("res://config_manager.tres") -const NativeDialogs := preload("res://addons/native_dialogs/native_dialogs.gd") - -onready var file_path_line_edit := $"%FilePathLineEdit" as LineEdit -onready var file_path_button := $"%FilePathButton" as Button -onready var theme_path_button := $"%ThemePathButton" as Button -onready var sound_check_box := $"%SoundCheckBox" as CheckBox -onready var open_data_dir_button := $"%OpenDataDirButton" as Button -onready var file_path_open_button := $"%FilePathOpenButton" as Button -onready var attributions_rich_text_label := $"%AttributionsRichTextLabel" as RichTextLabel -var file_path_file_dialog := NativeDialogs.SaveFile.new() -var theme_path_file_dialog := NativeDialogs.OpenFile.new() +onready var file_path_line_edit: LineEdit = $"%FilePathLineEdit" as LineEdit +onready var file_path_button: Button = $"%FilePathButton" as Button +onready var theme_path_button: Button = $"%ThemePathButton" as Button +onready var sound_check_box: CheckBox = $"%SoundCheckBox" as CheckBox +onready var open_data_dir_button: Button = $"%OpenDataDirButton" as Button +onready var file_path_open_button: Button = $"%FilePathOpenButton" as Button +onready var attributions_rich_text_label: RichTextLabel = $"%AttributionsRichTextLabel" as RichTextLabel +onready var file_path_file_dialog: FileDialog = $"%FilePathFileDialog" as FileDialog +onready var theme_path_file_dialog: FileDialog = $"%ThemePathFileDialog" as FileDialog func _ready() -> void: @@ -26,9 +24,8 @@ func _ready() -> void: # warning-ignore:return_value_discarded file_path_button.connect("pressed", self, "_on_file_path_button_pressed") - file_path_file_dialog.filters = ["*.csv ; CSV Files"] - file_path_file_dialog.force_overwrite = true - add_child(file_path_file_dialog) + # warning-ignore:return_value_discarded + file_path_file_dialog.connect("visibility_changed", self, "_resize_on_dialog", [file_path_file_dialog]) # warning-ignore:return_value_discarded file_path_file_dialog.connect("file_selected", self, "_on_current_file_selected") @@ -38,10 +35,10 @@ func _ready() -> void: # warning-ignore:return_value_discarded theme_path_button.connect("pressed", self, "_on_theme_path_button_pressed") - theme_path_file_dialog.filters = ["*.theme ; Theme Files"] - add_child(theme_path_file_dialog) # warning-ignore:return_value_discarded - theme_path_file_dialog.connect("files_selected", self, "_on_new_theme_selected") + theme_path_file_dialog.connect("visibility_changed", self, "_resize_on_dialog", [theme_path_file_dialog]) + # warning-ignore:return_value_discarded + theme_path_file_dialog.connect("file_selected", self, "_on_new_theme_selected") theme_path_file_dialog.hide() file_path_file_dialog.hide() @@ -71,8 +68,7 @@ func _on_theme_changed() -> void: func _on_file_path_button_pressed() -> void: - file_path_file_dialog.initial_path = config.current_timesheet_file_path - file_path_file_dialog.show() + _set_file_dialog_file_path(file_path_file_dialog, config.current_timesheet_file_path) func _on_current_file_selected(new_file: String) -> void: @@ -84,7 +80,7 @@ func _on_sound_toggle(is_on: bool) -> void: func _on_theme_path_button_pressed() -> void: - theme_path_file_dialog.initial_path = config.theme_file_path + _set_file_dialog_file_path(theme_path_file_dialog, config.theme_file_path) theme_path_file_dialog.show() @@ -110,3 +106,19 @@ func _open_path(path: String): var canonical_path := ProjectSettings.globalize_path(path).strip_edges() # warning-ignore:return_value_discarded OS.shell_open("file://"+canonical_path) + +func _set_file_dialog_file_path(dialog: FileDialog, path: String) -> void: + #dialog.current_path = path + #dialog.current_file = path + dialog.current_dir = path.get_base_dir() + dialog.show() + dialog.invalidate() + +var previous_window_size := OS.window_size + +func _resize_on_dialog(dialog: Control) -> void: + if dialog.visible == true: + previous_window_size = OS.window_size + OS.window_size = file_path_file_dialog.rect_size + else: + OS.window_size = previous_window_size diff --git a/ui/settings.tscn b/ui/settings.tscn index ffd3578..710683d 100644 --- a/ui/settings.tscn +++ b/ui/settings.tscn @@ -126,31 +126,26 @@ This game uses Godot Engine, available under the following license: [node name="CanvasLayer" type="CanvasLayer" parent="."] -[node name="FilePathFileDialog" type="FileDialog" parent="CanvasLayer"] -unique_name_in_owner = true -visible = true -margin_top = 39.0 -margin_right = 875.0 -margin_bottom = 765.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -window_title = "Pick a file" -resizable = true -dialog_hide_on_ok = true -mode_overrides_title = false -access = 2 -filters = PoolStringArray( "*.csv ; Comma Separated Files" ) +[node name="Popups" type="Control" parent="CanvasLayer"] +margin_right = 40.0 +margin_bottom = 40.0 +mouse_filter = 2 -[node name="ThemePathFileDialog" type="FileDialog" parent="CanvasLayer"] +[node name="FilePathFileDialog" type="FileDialog" parent="CanvasLayer/Popups"] unique_name_in_owner = true -anchor_right = 1.0 -anchor_bottom = 1.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -window_title = "Open a File" -resizable = true +margin_right = 1092.0 +margin_bottom = 762.0 +window_title = "Select CSV" +dialog_hide_on_ok = true +access = 2 +filters = PoolStringArray( "*.csv ; CSV Files" ) + +[node name="ThemePathFileDialog" type="FileDialog" parent="CanvasLayer/Popups"] +unique_name_in_owner = true +margin_right = 1092.0 +margin_bottom = 762.0 +window_title = "Select a Theme File" dialog_hide_on_ok = true -mode_overrides_title = false mode = 0 access = 2 filters = PoolStringArray( "*.theme ; Theme Files" )