aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordam <dam@gudinoff>2022-03-31 16:05:54 +0000
committerdam <dam@gudinoff>2022-03-31 16:05:54 +0000
commit9b619b8c5f117e53b121c2d868b024c7c7d08f4c (patch)
tree0dde86709240834ba3acb078b605af1b76a8cb18
parent6089eeb29382598d69c6b77be88d8ca4b1a3adf5 (diff)
downloadsurgery-log-9b619b8c5f117e53b121c2d868b024c7c7d08f4c.tar.zst
surgery-log-9b619b8c5f117e53b121c2d868b024c7c7d08f4c.zip
Fixed signals on popup and modal_dialog to make those usable.
-rw-r--r--dialog/dialog.gd77
-rw-r--r--file_picker.gd18
-rw-r--r--logic/database.gd10
-rw-r--r--logic/popup.gd36
-rw-r--r--logic/stage.gd11
-rw-r--r--main.gd10
-rw-r--r--main.tscn25
-rw-r--r--menu/menu.gd33
-rw-r--r--option_set/option_set.gd4
-rw-r--r--option_set/option_set_list.gd26
-rw-r--r--project.godot6
-rw-r--r--readme.md7
-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()
diff --git a/main.gd b/main.gd
index 6171409..5612e01 100644
--- a/main.gd
+++ b/main.gd
@@ -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)
-
-
diff --git a/main.tscn b/main.tscn
index 83bcaf8..d388cb5 100644
--- a/main.tscn
+++ b/main.tscn
@@ -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": "",
diff --git a/readme.md b/readme.md
index c32faf9..5d48eff 100644
--- a/readme.md
+++ b/readme.md
@@ -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