diff options
| author | dam <dam@gudinoff> | 2022-03-31 16:05:54 +0000 |
|---|---|---|
| committer | dam <dam@gudinoff> | 2022-03-31 16:05:54 +0000 |
| commit | 9b619b8c5f117e53b121c2d868b024c7c7d08f4c (patch) | |
| tree | 0dde86709240834ba3acb078b605af1b76a8cb18 | |
| parent | 6089eeb29382598d69c6b77be88d8ca4b1a3adf5 (diff) | |
| download | surgery-log-9b619b8c5f117e53b121c2d868b024c7c7d08f4c.tar.zst surgery-log-9b619b8c5f117e53b121c2d868b024c7c7d08f4c.zip | |
Fixed signals on popup and modal_dialog to make those usable.
| -rw-r--r-- | dialog/dialog.gd | 77 | ||||
| -rw-r--r-- | file_picker.gd | 18 | ||||
| -rw-r--r-- | logic/database.gd | 10 | ||||
| -rw-r--r-- | logic/popup.gd | 36 | ||||
| -rw-r--r-- | logic/stage.gd | 11 | ||||
| -rw-r--r-- | main.gd | 10 | ||||
| -rw-r--r-- | main.tscn | 25 | ||||
| -rw-r--r-- | menu/menu.gd | 33 | ||||
| -rw-r--r-- | option_set/option_set.gd | 4 | ||||
| -rw-r--r-- | option_set/option_set_list.gd | 26 | ||||
| -rw-r--r-- | project.godot | 6 | ||||
| -rw-r--r-- | readme.md | 7 | ||||
| -rw-r--r-- | theme_dark.tres (renamed from theme_white.tres) | 0 |
13 files changed, 194 insertions, 69 deletions
diff --git a/dialog/dialog.gd b/dialog/dialog.gd new file mode 100644 index 0000000..bfdbab5 --- /dev/null +++ b/dialog/dialog.gd @@ -0,0 +1,77 @@ +extends Control +class_name Dialog + +signal answered # (accepted: bool) +signal accepted # () +signal rejected # () + +export var clear_signals_on_hide := true + +var message : Label +var accept : Button +var reject : Button + + +func _init(): + self.anchor_right = 1.0 + self.anchor_bottom = 1.0 + self.rect_clip_content = true + self.connect("hide", self, "_clear_signals") + + reject = Button.new() + reject.text = "reject" + reject.anchor_top = 1.0 + reject.anchor_left = 0.0 + reject.anchor_right = 0.5 + reject.grow_vertical = Control.GROW_DIRECTION_BEGIN + reject.name = "reject" + reject.connect("pressed", self, "_signal_rejected") + add_child(reject) + + accept = Button.new() + accept.text = "accept" + accept.anchor_top = 1.0 + accept.anchor_left = 0.5 + accept.anchor_right = 1.0 + accept.grow_vertical = Control.GROW_DIRECTION_BEGIN + accept.name = "accept" + accept.connect("pressed", self, "_signal_accepted") + add_child(accept) + + message = Label.new() + message.autowrap = true + message.align = Label.ALIGN_CENTER + message.anchor_right = 1.0 + message.anchor_bottom = 1.0 + add_child(message) + + +func _clear_signals(): + if clear_signals_on_hide == false: + return + + for signal_name in ["answered", "accepted", "rejected"]: + for it in get_signal_connection_list(signal_name): + disconnect(it.signal, it.target, it.method) + + +func _signal_rejected(): + emit_signal("rejected") + emit_signal("answered", false) + hide() + + +func _signal_accepted(): + emit_signal("accepted") + emit_signal("answered", true) + hide() + + +func setup(message: String, accept_label: String = "Accept", reject_label: String = "Reject"): + self.message.text = message + accept.visible = accept_label != "" + accept.text = accept_label + reject.visible = reject_label != "" + reject.text = reject_label + + diff --git a/file_picker.gd b/file_picker.gd new file mode 100644 index 0000000..9715d0d --- /dev/null +++ b/file_picker.gd @@ -0,0 +1,18 @@ +extends FileDialog + +export var clear_signals_on_hide := true + + +func _init(): + self.connect("hide", self, "_clear_signals") + + +func _clear_signals(): + if clear_signals_on_hide == false: + return + + for signal_name in ["file_selected"]: + for it in get_signal_connection_list(signal_name): + disconnect(it.signal, it.target, it.method) + + diff --git a/logic/database.gd b/logic/database.gd index 5694dcc..b952356 100644 --- a/logic/database.gd +++ b/logic/database.gd @@ -8,12 +8,12 @@ var db: Array var selected_idx: int var staged_idx: int -onready var confirm_action := get_node("/root/main/confirm_action") as ConfirmationDialog onready var stage := get_node("/root/main/stage") as Stage onready var delete_button := get_node("actions/delete") as Button onready var edit_button := get_node("actions/edit") as Button onready var add_button := get_node("actions/add") as Button - +onready var popup := get_node("/root/main/popup") as ModalPopup +onready var dialog := get_node("/root/main/dialog") as Dialog func _init(): selected_idx = -1 @@ -75,9 +75,9 @@ func delete_action(): if selected_idx < 0: return - confirm_action.dialog_text = "Do you want to delete entry with process ID '%s' from the database?" % db[selected_idx].process_id - confirm_action.connect("confirmed", self, "delete_action_confirmed", [], CONNECT_ONESHOT) - confirm_action.show_modal(true) + dialog.setup("Do you want to delete entry with process ID '%s' from the database?" % db[selected_idx].process_id, "Yes, delete", "No") + dialog.connect("accepted", self, "delete_action_confirmed") + popup.open_popup("Delete entry?", dialog) func delete_action_confirmed(): diff --git a/logic/popup.gd b/logic/popup.gd index 2ff91fe..31897c7 100644 --- a/logic/popup.gd +++ b/logic/popup.gd @@ -3,20 +3,39 @@ class_name ModalPopup signal dismissed # () +export var clear_signals_on_hide := true + var control : Control var control_parent : Node onready var title := get_node("title") as Label onready var background := get_node("background") as Panel +onready var dismiss := get_node("dismiss") as Button func _init(): - anchor_right = 1.0 - anchor_bottom = 1.0 + self.anchor_right = 1.0 + self.anchor_bottom = 1.0 + self.rect_clip_content = true + self.connect("hide", self, "_clear_signals") func _ready(): - get_node("dismiss").connect("pressed", self, "dismiss") + dismiss.connect("pressed", self, "_dismiss") + + +func _clear_signals(): + if clear_signals_on_hide == false: + return + + for signal_name in ["dismissed"]: + for it in get_signal_connection_list(signal_name): + disconnect(it.signal, it.target, it.method) + + +func _dismiss(): + emit_signal("dismissed") + close_popup() func open_popup(title: String, item: Control): @@ -26,6 +45,7 @@ func open_popup(title: String, item: Control): self.title.text = title control = item + control.connect("hide", self, "close_popup") control_parent = control.get_parent() control_parent.remove_child(control) self.add_child(control) @@ -38,23 +58,19 @@ func open_popup(title: String, item: Control): control.margin_top = 20 control.margin_right = -20 control.margin_bottom = -20 - add_child(control) self.show() control.show() -func dismiss(): - emit_signal("dismissed") - - func close_popup(): if visible == false: return - self.hide() + + control.disconnect("hide", self, "close_popup") control.hide() + self.hide() remove_child(control) control_parent.add_child(control) control_parent = null - diff --git a/logic/stage.gd b/logic/stage.gd index bf311b9..fde67d3 100644 --- a/logic/stage.gd +++ b/logic/stage.gd @@ -23,7 +23,7 @@ const OPTION_SETS_TREE_STRUCTURE := { var staged_entry_hash: int var option_sets: Dictionary -onready var confirm_action := get_node("/root/main/confirm_action") as ConfirmationDialog + onready var process_id := get_node("controls/process_id") as LineEdit onready var surgery_id := get_node("controls/surgery_id") as LineEdit onready var date := get_node("controls/date_picker") as DatePicker @@ -40,7 +40,8 @@ onready var notes := get_node("controls/notes") as LineEdit onready var save_button := get_node("controls/save") as Button onready var discard_button := get_node("controls/discard") as Button onready var scrollbar := get_v_scrollbar() - +onready var popup := get_node("/root/main/popup") as ModalPopup +onready var dialog := get_node("/root/main/dialog") as Dialog func _init(): exclude_controls = ["date_picker", "save", "discard"] @@ -110,9 +111,9 @@ func save_action(): func discard_action(): if get_stage().hash() != staged_entry_hash: - confirm_action.dialog_text = "Do you want to discard the changes made?" - confirm_action.connect("confirmed", self, "discard_action_confirmed", [], CONNECT_ONESHOT) - confirm_action.show_modal(true) + dialog.setup("Do you want to discard the changes made?", "Yes, discard", "No") + dialog.connect("accepted", self, "discard_action_confirmed") + popup.open_popup("Discard changes?", dialog) else: discard_action_confirmed() @@ -3,11 +3,9 @@ extends Control var power_throttle_timeout: float onready var file_picker := get_node("/root/main/file_picker") as FileDialog -onready var confirm_action := get_node("/root/main/confirm_action") as ConfirmationDialog onready var controls_sensible_to_keyboard := [ self, file_picker, - confirm_action, ] @@ -25,8 +23,6 @@ func _init(): func _ready(): Input.set_use_accumulated_input(false) - confirm_action.get_cancel().connect("pressed", self, "dialog_cancelled", ["confirmed"]) - file_picker.get_cancel().connect("pressed", self, "dialog_cancelled", ["file_selected"]) func _process(delta: float): @@ -50,9 +46,3 @@ func _unhandled_input(event: InputEvent): power_throttle_timeout = 3.5 -func dialog_cancelled(confirmation_signal_name: String): - var confirmation_handlers = confirm_action.get_signal_connection_list(confirmation_signal_name) - for it in confirmation_handlers: - confirm_action.disconnect(it.signal, it.target, it.method) - - @@ -1,8 +1,8 @@ -[gd_scene load_steps=14 format=2] +[gd_scene load_steps=16 format=2] [ext_resource path="res://main.gd" type="Script" id=1] [ext_resource path="res://date_picker/date_picker.tscn" type="PackedScene" id=2] -[ext_resource path="res://theme_white.tres" type="Theme" id=3] +[ext_resource path="res://theme_dark.tres" type="Theme" id=3] [ext_resource path="res://menu/menu.gd" type="Script" id=4] [ext_resource path="res://logic/database.gd" type="Script" id=5] [ext_resource path="res://fonts/font_icons.tres" type="DynamicFont" id=6] @@ -13,6 +13,8 @@ [ext_resource path="res://touch_item_list/touch_item_list.tscn" type="PackedScene" id=11] [ext_resource path="res://touch_vertical_container/touch_vertical_container.tscn" type="PackedScene" id=12] [ext_resource path="res://fonts/font_mono_regular.tres" type="DynamicFont" id=13] +[ext_resource path="res://dialog/dialog.gd" type="Script" id=14] +[ext_resource path="res://file_picker.gd" type="Script" id=15] [node name="main" type="Control"] anchor_right = 1.0 @@ -240,19 +242,11 @@ filters = PoolStringArray( "*.*" ) show_hidden_files = true current_dir = "" current_path = "" +script = ExtResource( 15 ) __meta__ = { "_edit_use_anchors_": false } -[node name="confirm_action" type="ConfirmationDialog" parent="."] -anchor_right = 1.0 -anchor_bottom = 1.0 -size_flags_horizontal = 3 -size_flags_vertical = 3 -window_title = "" -dialog_text = "Do you confirm this action?" -dialog_autowrap = true - [node name="popup" type="ColorRect" parent="."] visible = false anchor_right = 1.0 @@ -290,7 +284,16 @@ flat = true [node name="option_set_list" type="Control" parent="."] visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 rect_clip_content = true script = ExtResource( 8 ) +[node name="dialog" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_clip_content = true +script = ExtResource( 14 ) + [editable path="stage"] diff --git a/menu/menu.gd b/menu/menu.gd index c963270..021c005 100644 --- a/menu/menu.gd +++ b/menu/menu.gd @@ -12,8 +12,9 @@ const menu_items: Array = [ const license_font_b612: String = "res://licenses/font_b612.txt" const license_godot: String = "res://licenses/godot.txt" -onready var popup := get_popup() as PopupMenu -onready var confirm_action := get_node("/root/main/confirm_action") as ConfirmationDialog +onready var menu := get_popup() as PopupMenu +onready var popup := get_node("/root/main/popup") as ModalPopup +onready var dialog := get_node("/root/main/dialog") as Dialog onready var file_picker := get_node("/root/main/file_picker") as FileDialog onready var database := get_node("/root/main/database") as Database onready var stage := get_node("/root/main/stage") as Stage @@ -21,8 +22,8 @@ onready var stage := get_node("/root/main/stage") as Stage func _ready(): for idx in range(menu_items.size()): - popup.add_item(menu_items[idx].label, idx) - popup.connect("id_pressed", self, "id_pressed") + menu.add_item(menu_items[idx].label, idx) + menu.connect("id_pressed", self, "id_pressed") func id_pressed(id: int): @@ -34,7 +35,7 @@ func import_option_sets_action(): file_picker.current_dir = OS.get_system_dir(OS.SYSTEM_DIR_DOWNLOADS) file_picker.filters = ["*.json", "*.csv"] file_picker.current_file = "" - file_picker.connect("file_selected", self, "import_option_sets_action_confirmed", [], CONNECT_ONESHOT) + file_picker.connect("file_selected", self, "import_option_sets_action_confirmed") file_picker.show_modal(true) file_picker.invalidate() @@ -68,9 +69,9 @@ func export_option_sets_action(): func clear_option_sets_action(): - confirm_action.dialog_text = "Do you want to delete all option sets?" - confirm_action.connect("confirmed", stage, "clear_option_sets", [], CONNECT_ONESHOT) - confirm_action.show_modal(true) + dialog.setup("Do you want to delete all option sets?", "Yes, delete.", "No") + dialog.connect("accepted", stage, "clear_option_sets") + popup.open_popup("Clear option sets?", dialog) func export_data_action(): @@ -84,20 +85,20 @@ func export_data_action(): func clear_data_action(): - confirm_action.dialog_text = "Do you want to delete all entries from the database?" - confirm_action.connect("confirmed", database, "clear_database", [], CONNECT_ONESHOT) - confirm_action.show_modal(true) + dialog.setup("Do you want to delete all entries from the database?", "Yes, delete.", "No") + dialog.connect("accepted", database, "clear_database") + popup.open_popup("Clear database?", dialog) func about_action(): - confirm_action.dialog_text = "Surgery Log\nversion 2022-02-27" - confirm_action.show_modal(true) + dialog.setup("Surgery Log\nversion 0.1", "", "") + popup.open_popup("About", dialog) # @DAM Hide this debug method before release. func test_fake_db_action(): - confirm_action.dialog_text = "Do you want to delete all entries from the database and replace by fake entries?" - confirm_action.connect("confirmed", database, "fake_database", [], CONNECT_ONESHOT) - confirm_action.show_modal(true) + dialog.setup("Do you want to delete all entries from the database and replace by fake entries?", "Yes, replace.", "No") + dialog.connect("accepted", database, "fake_database") + popup.open_popup("Fake DB?", dialog) diff --git a/option_set/option_set.gd b/option_set/option_set.gd index 637d033..0e8f90e 100644 --- a/option_set/option_set.gd +++ b/option_set/option_set.gd @@ -35,14 +35,10 @@ func show_options(options_array: Array): options.unselect() options.connect("item_selected", self, "popup_result", []) options.connect("nothing_selected", self, "popup_result", [-1, ""]) - popup.connect("dismissed", self, "popup_result", [selected_idx, input.text]) popup.open_popup(input.placeholder_text, options) func popup_result(index: int, text: String): - options.disconnect("item_selected", self, "popup_result") - options.disconnect("nothing_selected", self, "popup_result") - popup.disconnect("dismissed", self, "popup_result") selected_idx = index input.text = text input.caret_position = input.max_length diff --git a/option_set/option_set_list.gd b/option_set/option_set_list.gd index ea6b2d8..8aad1b1 100644 --- a/option_set/option_set_list.gd +++ b/option_set/option_set_list.gd @@ -5,6 +5,8 @@ const POINTER_VELOCITY_DECAYING_FACTOR: float = PI const POINTER_VELOCITY_BOOST_FACTOR: float = 1.25 const EXACT_SELECTION: bool = false +export var clear_signals_on_hide := true + signal item_selected # (idx: int, text: String) signal nothing_selected # () @@ -17,7 +19,7 @@ var pointer_drag_velocity := 0.0 var when_last_dragged := 0 var labels : Control -var labels_end_positions: Array +var labels_end_positions : Array var labels_sizes : Array var items : Array @@ -35,7 +37,8 @@ func _init(): self.anchor_right = 1.0 self.anchor_bottom = 1.0 self.rect_clip_content = true - + self.connect("hide", self, "_clear_signals") + labels = Control.new() labels.anchor_right = 1.0 labels.anchor_bottom = 1.0 @@ -219,6 +222,7 @@ func get_item_at_position(mouse_position: Vector2) -> int: var position := mouse_position.y + labels_offset var item_idx := labels_end_positions.bsearch(position) + # @DAM Fix this to return -1 if no item was selected. return int(min(item_idx, items.size()-1)) # Return last item when position is below it. @@ -227,6 +231,7 @@ func select(index: int): emit_signal("item_selected", selected_idx, items[selected_idx]) +# @DAM Do we really need this? We should have just one signal to the selection. func unselect(): selected_idx = -1 emit_signal("nothing_selected") @@ -256,10 +261,10 @@ func pointer_input_on_end_drag_handler(pointer: PointerInputSensor.PointerInputD func pointer_input_on_click_handler(pointer: PointerInputSensor.PointerInputData): - var selected_idx := get_item_at_position(pointer.current_position - rect_global_position) - if selected_idx >= 0: - select(selected_idx) - emit_signal("item_selected", selected_idx) + var item_idx := get_item_at_position(pointer.current_position - rect_global_position) + if item_idx >= 0: + select(item_idx) + emit_signal("item_selected", item_idx) else: unselect() emit_signal("nothing_selected") @@ -269,3 +274,12 @@ func pointer_input_on_scroll_handler(pointer: PointerInputSensor.PointerInputDat pointer_drag_velocity -= pointer.scroll * POINTER_VELOCITY_BOOST_FACTOR * screen_dpcm +func _clear_signals(): + if clear_signals_on_hide == false: + return + + for signal_name in ["item_selected", "nothing_selected"]: + for it in get_signal_connection_list(signal_name): + disconnect(it.signal, it.target, it.method) + + diff --git a/project.godot b/project.godot index 4a59943..4a3e1ed 100644 --- a/project.godot +++ b/project.godot @@ -25,6 +25,11 @@ _global_script_classes=[ { "path": "res://date_picker/date_picker.gd" }, { "base": "Control", +"class": "Dialog", +"language": "GDScript", +"path": "res://dialog/dialog.gd" +}, { +"base": "Control", "class": "ModalPopup", "language": "GDScript", "path": "res://logic/popup.gd" @@ -68,6 +73,7 @@ _global_script_class_icons={ "Database": "", "DatabaseEntry": "", "DatePicker": "", +"Dialog": "", "ModalPopup": "", "OptionSet": "", "OptionSetList": "", @@ -55,8 +55,11 @@ Surgery Log - [x] title; - [x] dismiss button; - [x] Hide dialogs title bar (appear in the top with 1 or 2 pixels height); -- [ ] Use popup to display confirmation messages; -- [ ] What to do when the optionset has no options available? +- [x] Fix automation to automatically disconnect acceptance signal handlers when reject is chosen on file_picker/confirm_action; +- [x] Use popup to display confirmation messages; +- [ ] Improve option sets: + - [ ] selecting outside optionset entry should select none + - [ ] if no options are available, show nothing instead of "--" - [ ] Fix back button: - on stage screen should show pop-up asking it changes are to be discarded; - on file-pickers screen should close them; diff --git a/theme_white.tres b/theme_dark.tres index 832b226..832b226 100644 --- a/theme_white.tres +++ b/theme_dark.tres |
