-
Notifications
You must be signed in to change notification settings - Fork 0
/
EditorState.gd
98 lines (81 loc) · 3.17 KB
/
EditorState.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
extends Node
## The sky editor's universal [UndoRedo] object.
var unredo: UndoRedo
enum ArrayChange {
APPEND,
REPLACE,
REMOVE
}
var loaded_sky_path = ""
## Most recent "version" of [member unredo] that was saved to disk by the user.[br]
## Used to determine whether the current version of the file is modified.
var saved_version = 0
var saved_up_to_date: bool:
get:
return unredo.get_version() == saved_version
func _init() -> void:
unredo = UndoRedo.new()
func _ready() -> void:
unredo.version_changed.connect(_update_window_title)
saved_version = unredo.get_version()
_update_window_title()
pass
## Update the window's title based on the current file's save status.
func _update_window_title() -> void:
var window = get_tree().root
if FezSky.sky_name != "":
window.title = "%s%s - Skywatcher" % [FezSky.sky_name, ("" if saved_up_to_date else " *")]
elif FezSky.sky_loaded:
window.title = "[unnamed]%s - Skywatcher" % [("" if saved_up_to_date else " *")]
else:
window.title = "[no sky loaded] - Skywatcher"
func new_sky():
FezSky.new_sky()
unredo.clear_history()
saved_version = unredo.get_version()
_update_window_title()
## Load a sky from disk, resetting the saved status and undo history.
func load_sky(path):
loaded_sky_path = path
FezSky.load_sky(path)
unredo.clear_history()
saved_version = unredo.get_version()
_update_window_title()
## Save a sky to disk, bringing the saved status up to date.
func save_sky(path):
loaded_sky_path = path
FezSky.save(path)
saved_version = unredo.get_version()
_update_window_title()
## Alter any property of the sky, adding that modification to the undo/redo list.
## Similar syntax to [method alter_object].
func alter_sky(action_name: String, prop: String, new_value: Variant, knockons: Array[Callable] = [], merges: UndoRedo.MergeMode = UndoRedo.MERGE_DISABLE):
alter_object(FezSky, action_name, prop, new_value, knockons, merges)
## Alter any object's property, adding that modification to the undo/redo list.[br]
## [param knockons] is an array of functions that should be called after the property modification, regardless of whether it's being done or undone.
func alter_object(object: Variant, action_name: String, prop: String, new_value: Variant, knockons: Array[Callable] = [], merges: UndoRedo.MergeMode = UndoRedo.MERGE_DISABLE):
unredo.create_action(action_name, merges)
# do
unredo.add_do_property(object, prop, new_value)
for effect in knockons:
unredo.add_do_method(effect)
# undo
unredo.add_undo_property(object, prop, object.get(prop))
for effect in knockons:
unredo.add_undo_method(effect)
unredo.commit_action()
func alter_with_methods(action_name: String, do: Callable, undo: Callable):
unredo.create_action(action_name)
# do
unredo.add_do_method(do)
# undo
unredo.add_undo_method(undo)
unredo.commit_action()
func append_in_skyarray(arrname: String, newval: Variant):
FezSky.get(arrname).push_back(newval)
func replace_in_array(arr: Array, newval: Variant, oldval: Variant):
arr[arr.find(oldval)] = newval
## When called, emits [signal FezSky.sky_changed].[br]
## Primarily intended for use as a knockon effect for certain types of properties.
func force_sky_changed() -> void:
FezSky.sky_changed.emit()