mirror of
https://codeberg.org/StreamGraph/StreamGraph.git
synced 2024-11-13 19:49:55 +01:00
prompt to save dirty deck when closing it
This commit is contained in:
parent
2091b52e36
commit
bf9af8c996
4 changed files with 76 additions and 18 deletions
|
@ -12,7 +12,7 @@ const DEBUG_DECKS_LIST := preload("res://graph_node_renderer/debug_decks_list.ts
|
||||||
const PERSISTENCE_NAMESPACE := "default"
|
const PERSISTENCE_NAMESPACE := "default"
|
||||||
|
|
||||||
## Reference to the main windows [TabContainerCustom]
|
## Reference to the main windows [TabContainerCustom]
|
||||||
@onready var tab_container: TabContainerCustom = %TabContainerCustom as TabContainerCustom
|
@onready var tab_container := %TabContainerCustom as TabContainerCustom
|
||||||
## Reference to the [FileDialog] used for File operations through the program.
|
## Reference to the [FileDialog] used for File operations through the program.
|
||||||
@onready var file_dialog: FileDialog = $FileDialog
|
@onready var file_dialog: FileDialog = $FileDialog
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@ enum FileMenuId {
|
||||||
@onready var file_popup_menu: PopupMenu = %File as PopupMenu
|
@onready var file_popup_menu: PopupMenu = %File as PopupMenu
|
||||||
var max_recents := 4
|
var max_recents := 4
|
||||||
var recent_files := []
|
var recent_files := []
|
||||||
|
@onready var unsaved_changes_dialog_single_deck := $UnsavedChangesDialogSingleDeck as UnsavedChangesDialogSingleDeck
|
||||||
|
|
||||||
enum ConnectionsMenuId {
|
enum ConnectionsMenuId {
|
||||||
OBS,
|
OBS,
|
||||||
|
@ -43,10 +44,10 @@ enum ConnectionsMenuId {
|
||||||
## Weak Reference to the Deck that is currently going to be saved.
|
## Weak Reference to the Deck that is currently going to be saved.
|
||||||
var _deck_to_save: WeakRef
|
var _deck_to_save: WeakRef
|
||||||
|
|
||||||
@onready var no_obsws: NoOBSWS = %NoOBSWS as NoOBSWS
|
@onready var no_obsws := %NoOBSWS as NoOBSWS
|
||||||
|
|
||||||
@onready var obs_setup_dialog: OBSWebsocketSetupDialog = $OBSWebsocketSetupDialog as OBSWebsocketSetupDialog
|
@onready var obs_setup_dialog := $OBSWebsocketSetupDialog as OBSWebsocketSetupDialog
|
||||||
@onready var twitch_setup_dialog : TwitchSetupDialog = $Twitch_Setup_Dialog as TwitchSetupDialog
|
@onready var twitch_setup_dialog := $Twitch_Setup_Dialog as TwitchSetupDialog
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
@ -62,14 +63,11 @@ func _ready() -> void:
|
||||||
|
|
||||||
tab_container.tab_close_requested.connect(
|
tab_container.tab_close_requested.connect(
|
||||||
func(tab: int):
|
func(tab: int):
|
||||||
var groups := DeckHolder.close_deck(tab_container.get_tab_metadata(tab, "id"))
|
if tab_container.get_tab_metadata(tab, "dirty"):
|
||||||
# close tabs associated with this deck's groups
|
unsaved_changes_dialog_single_deck.set_meta("tab", tab)
|
||||||
for group in groups:
|
unsaved_changes_dialog_single_deck.show()
|
||||||
for c_tab in tab_container.get_tab_count():
|
return
|
||||||
if tab_container.get_tab_metadata(c_tab, "id") == group:
|
close_tab(tab)
|
||||||
tab_container.close_tab(tab)
|
|
||||||
await get_tree().process_frame
|
|
||||||
tab_container.close_tab(tab)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
file_dialog.canceled.connect(disconnect_file_dialog_signals)
|
file_dialog.canceled.connect(disconnect_file_dialog_signals)
|
||||||
|
@ -116,6 +114,17 @@ func add_empty_deck() -> void:
|
||||||
func close_current_tab() -> void:
|
func close_current_tab() -> void:
|
||||||
tab_container.close_tab(tab_container.get_current_tab())
|
tab_container.close_tab(tab_container.get_current_tab())
|
||||||
|
|
||||||
|
|
||||||
|
func close_tab(tab: int) -> void:
|
||||||
|
var groups := DeckHolder.close_deck(tab_container.get_tab_metadata(tab, "id"))
|
||||||
|
# close tabs associated with this deck's groups
|
||||||
|
for group in groups:
|
||||||
|
for c_tab in tab_container.get_tab_count():
|
||||||
|
if tab_container.get_tab_metadata(c_tab, "id") == group:
|
||||||
|
tab_container.close_tab(tab)
|
||||||
|
await get_tree().process_frame
|
||||||
|
tab_container.close_tab(tab)
|
||||||
|
|
||||||
## Opens [member file_dialog] with the mode [member FileDialog.FILE_MODE_SAVE_FILE]
|
## Opens [member file_dialog] with the mode [member FileDialog.FILE_MODE_SAVE_FILE]
|
||||||
## as well as getting a weakref to the active [Deck]
|
## as well as getting a weakref to the active [Deck]
|
||||||
func open_save_dialog(path: String) -> void:
|
func open_save_dialog(path: String) -> void:
|
||||||
|
@ -185,14 +194,21 @@ func get_active_deck() -> Deck:
|
||||||
|
|
||||||
## Saves the active [Deck] in [member tab_container]
|
## Saves the active [Deck] in [member tab_container]
|
||||||
func save_active_deck() -> void:
|
func save_active_deck() -> void:
|
||||||
if get_active_deck().save_path.is_empty():
|
save_tab(tab_container.get_current_tab())
|
||||||
|
|
||||||
|
|
||||||
|
func save_tab(tab: int) -> void:
|
||||||
|
var renderer := tab_container.get_content(tab) as DeckRendererGraphEdit
|
||||||
|
var deck := renderer.deck
|
||||||
|
if deck.save_path.is_empty():
|
||||||
open_save_dialog("res://")
|
open_save_dialog("res://")
|
||||||
else:
|
else:
|
||||||
var json := JSON.stringify(get_active_deck().to_dict(), "\t")
|
var json := JSON.stringify(deck.to_dict(), "\t")
|
||||||
var f := FileAccess.open(get_active_deck().save_path, FileAccess.WRITE)
|
var f := FileAccess.open(deck.save_path, FileAccess.WRITE)
|
||||||
f.store_string(json)
|
f.store_string(json)
|
||||||
add_recent_file(get_active_deck().save_path)
|
add_recent_file(deck.save_path)
|
||||||
(tab_container.get_content(tab_container.get_current_tab()) as DeckRendererGraphEdit).dirty = false
|
renderer.dirty = false
|
||||||
|
|
||||||
|
|
||||||
## Disconnects the [FileDialog] signals if they are already connected.
|
## Disconnects the [FileDialog] signals if they are already connected.
|
||||||
func disconnect_file_dialog_signals() -> void:
|
func disconnect_file_dialog_signals() -> void:
|
||||||
|
@ -281,6 +297,7 @@ func _on_deck_renderer_dirty_state_changed(renderer: DeckRendererGraphEdit) -> v
|
||||||
tab_container.set_tab_title(idx, "%s(*)" % title)
|
tab_container.set_tab_title(idx, "%s(*)" % title)
|
||||||
else:
|
else:
|
||||||
tab_container.set_tab_title(idx, title.trim_suffix("(*)"))
|
tab_container.set_tab_title(idx, title.trim_suffix("(*)"))
|
||||||
|
tab_container.set_tab_metadata(idx, "dirty", renderer.dirty)
|
||||||
|
|
||||||
|
|
||||||
func add_recent_file(path: String) -> void:
|
func add_recent_file(path: String) -> void:
|
||||||
|
@ -328,3 +345,13 @@ func add_recents_to_menu() -> void:
|
||||||
|
|
||||||
RendererPersistence.set_value(PERSISTENCE_NAMESPACE, "config", "recent_files", recent_files)
|
RendererPersistence.set_value(PERSISTENCE_NAMESPACE, "config", "recent_files", recent_files)
|
||||||
RendererPersistence.commit(PERSISTENCE_NAMESPACE)
|
RendererPersistence.commit(PERSISTENCE_NAMESPACE)
|
||||||
|
|
||||||
|
|
||||||
|
func _on_unsaved_changes_dialog_single_deck_confirmed() -> void:
|
||||||
|
save_tab(unsaved_changes_dialog_single_deck.get_meta("tab"))
|
||||||
|
close_tab(unsaved_changes_dialog_single_deck.get_meta("tab"))
|
||||||
|
|
||||||
|
|
||||||
|
func _on_unsaved_changes_dialog_single_deck_custom_action(action: StringName) -> void:
|
||||||
|
if action == &"force_close":
|
||||||
|
close_tab(unsaved_changes_dialog_single_deck.get_meta("tab"))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
[gd_scene load_steps=18 format=3 uid="uid://duaah5x0jhkn6"]
|
[gd_scene load_steps=19 format=3 uid="uid://duaah5x0jhkn6"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://graph_node_renderer/deck_holder_renderer.gd" id="1_67g2g"]
|
[ext_resource type="Script" path="res://graph_node_renderer/deck_holder_renderer.gd" id="1_67g2g"]
|
||||||
[ext_resource type="PackedScene" uid="uid://b84f2ngtcm5b8" path="res://graph_node_renderer/tab_container_custom.tscn" id="1_s3ug2"]
|
[ext_resource type="PackedScene" uid="uid://b84f2ngtcm5b8" path="res://graph_node_renderer/tab_container_custom.tscn" id="1_s3ug2"]
|
||||||
|
@ -7,6 +7,7 @@
|
||||||
[ext_resource type="Script" path="res://addons/no_twitch/twitch_connection.gd" id="5_3n36q"]
|
[ext_resource type="Script" path="res://addons/no_twitch/twitch_connection.gd" id="5_3n36q"]
|
||||||
[ext_resource type="PackedScene" uid="uid://eioso6jb42jy" path="res://graph_node_renderer/obs_websocket_setup_dialog.tscn" id="5_uo2gj"]
|
[ext_resource type="PackedScene" uid="uid://eioso6jb42jy" path="res://graph_node_renderer/obs_websocket_setup_dialog.tscn" id="5_uo2gj"]
|
||||||
[ext_resource type="PackedScene" uid="uid://bq2lxmbnic4lc" path="res://graph_node_renderer/twitch_setup_dialog.tscn" id="7_7rhap"]
|
[ext_resource type="PackedScene" uid="uid://bq2lxmbnic4lc" path="res://graph_node_renderer/twitch_setup_dialog.tscn" id="7_7rhap"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cuwou2aa7qfc2" path="res://graph_node_renderer/unsaved_changes_dialog_single_deck.tscn" id="8_qf6ve"]
|
||||||
|
|
||||||
[sub_resource type="InputEventKey" id="InputEventKey_giamc"]
|
[sub_resource type="InputEventKey" id="InputEventKey_giamc"]
|
||||||
device = -1
|
device = -1
|
||||||
|
@ -158,7 +159,11 @@ script = ExtResource("5_3n36q")
|
||||||
[node name="Twitch_Setup_Dialog" parent="." instance=ExtResource("7_7rhap")]
|
[node name="Twitch_Setup_Dialog" parent="." instance=ExtResource("7_7rhap")]
|
||||||
visible = false
|
visible = false
|
||||||
|
|
||||||
|
[node name="UnsavedChangesDialogSingleDeck" parent="." instance=ExtResource("8_qf6ve")]
|
||||||
|
|
||||||
[connection signal="id_pressed" from="MarginContainer/VSplitContainer/VBoxContainer/MenuBar/File" to="." method="_on_file_id_pressed"]
|
[connection signal="id_pressed" from="MarginContainer/VSplitContainer/VBoxContainer/MenuBar/File" to="." method="_on_file_id_pressed"]
|
||||||
[connection signal="id_pressed" from="MarginContainer/VSplitContainer/VBoxContainer/MenuBar/Connections" to="." method="_on_connections_id_pressed"]
|
[connection signal="id_pressed" from="MarginContainer/VSplitContainer/VBoxContainer/MenuBar/Connections" to="." method="_on_connections_id_pressed"]
|
||||||
[connection signal="id_pressed" from="MarginContainer/VSplitContainer/VBoxContainer/MenuBar/Debug" to="." method="_on_debug_id_pressed"]
|
[connection signal="id_pressed" from="MarginContainer/VSplitContainer/VBoxContainer/MenuBar/Debug" to="." method="_on_debug_id_pressed"]
|
||||||
[connection signal="connect_button_pressed" from="OBSWebsocketSetupDialog" to="." method="_on_obs_websocket_setup_dialog_connect_button_pressed"]
|
[connection signal="connect_button_pressed" from="OBSWebsocketSetupDialog" to="." method="_on_obs_websocket_setup_dialog_connect_button_pressed"]
|
||||||
|
[connection signal="confirmed" from="UnsavedChangesDialogSingleDeck" to="." method="_on_unsaved_changes_dialog_single_deck_confirmed"]
|
||||||
|
[connection signal="custom_action" from="UnsavedChangesDialogSingleDeck" to="." method="_on_unsaved_changes_dialog_single_deck_custom_action"]
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
extends ConfirmationDialog
|
||||||
|
class_name UnsavedChangesDialogSingleDeck
|
||||||
|
|
||||||
|
|
||||||
|
func _init() -> void:
|
||||||
|
add_button("Don't Save", true, "force_close")
|
20
graph_node_renderer/unsaved_changes_dialog_single_deck.tscn
Normal file
20
graph_node_renderer/unsaved_changes_dialog_single_deck.tscn
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[gd_scene load_steps=2 format=3 uid="uid://cuwou2aa7qfc2"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://graph_node_renderer/unsaved_changes_dialog_single_deck.gd" id="1_qpf7a"]
|
||||||
|
|
||||||
|
[node name="UnsavedChangesDialogSingleDeck" type="ConfirmationDialog"]
|
||||||
|
initial_position = 2
|
||||||
|
size = Vector2i(356, 206)
|
||||||
|
ok_button_text = "Save"
|
||||||
|
script = ExtResource("1_qpf7a")
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="."]
|
||||||
|
offset_left = 8.0
|
||||||
|
offset_top = 8.0
|
||||||
|
offset_right = 348.0
|
||||||
|
offset_bottom = 157.0
|
||||||
|
text = "This deck has unsaved changes. Closing it will discard any changes.
|
||||||
|
Save now?"
|
||||||
|
horizontal_alignment = 1
|
||||||
|
vertical_alignment = 1
|
||||||
|
autowrap_mode = 3
|
Loading…
Reference in a new issue