mirror of
https://github.com/Relintai/godot_data_editor.git
synced 2025-02-23 09:54:19 +01:00
Made handling of non-persistent data more robust
This commit is contained in:
parent
3931f324de
commit
f734e3233e
@ -21,8 +21,13 @@ func _ready():
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func get_class():
|
func get_class():
|
||||||
return self.get_script().get_path().get_file().basename()
|
if _class:
|
||||||
|
return _class
|
||||||
|
else:
|
||||||
|
_class = self.get_script().get_path().get_file().basename()
|
||||||
|
return _class
|
||||||
|
|
||||||
|
|
||||||
func get_class_name():
|
func get_class_name():
|
||||||
|
@ -46,14 +46,35 @@ func _init():
|
|||||||
|
|
||||||
|
|
||||||
func load_manager():
|
func load_manager():
|
||||||
|
store_unsaved_changes()
|
||||||
initialize_variables()
|
initialize_variables()
|
||||||
load_config()
|
load_config()
|
||||||
load_class_names()
|
load_class_names()
|
||||||
load_classes()
|
load_classes()
|
||||||
set_up_item_folders()
|
set_up_item_folders()
|
||||||
load_items()
|
load_items()
|
||||||
|
reload_unsaved_items()
|
||||||
Globals.set("item_manager", self)
|
Globals.set("item_manager", self)
|
||||||
|
|
||||||
|
# Try to keep unsaved changes when (re)loading the item_manager
|
||||||
|
var unsaved_items = []
|
||||||
|
func store_unsaved_changes():
|
||||||
|
for item_class in items:
|
||||||
|
for item in items[item_class].values():
|
||||||
|
if item._dirty or not item._persistent:
|
||||||
|
unsaved_items.append(item)
|
||||||
|
|
||||||
|
# Create a duplicate of the unsaved item because this will not mess up changed properties
|
||||||
|
func reload_unsaved_items():
|
||||||
|
for unsaved_item in unsaved_items:
|
||||||
|
print(unsaved_item._id)
|
||||||
|
duplicate_item(unsaved_item, unsaved_item._id, unsaved_item._display_name, true)
|
||||||
|
# new_item._dirty = true
|
||||||
|
|
||||||
|
pass
|
||||||
|
unsaved_items = []
|
||||||
|
|
||||||
|
|
||||||
func initialize_variables():
|
func initialize_variables():
|
||||||
items = {}
|
items = {}
|
||||||
class_names = []
|
class_names = []
|
||||||
@ -92,6 +113,8 @@ func load_class_names():
|
|||||||
class_names.sort()
|
class_names.sort()
|
||||||
|
|
||||||
|
|
||||||
|
# Loads the classes from disk
|
||||||
|
# TODO: Check if there is an issue with the class and display a warning instead of crashing the whole plugin...
|
||||||
func load_classes():
|
func load_classes():
|
||||||
classes = {}
|
classes = {}
|
||||||
for item_class in class_names:
|
for item_class in class_names:
|
||||||
@ -132,11 +155,12 @@ func load_items():
|
|||||||
items[item_class][id] = load_binary_item(item_class, file_name)
|
items[item_class][id] = load_binary_item(item_class, file_name)
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
items[item_class][id].set_name(items[item_class][id]._class + ":" + id)
|
||||||
file_name = directory.get_next()
|
file_name = directory.get_next()
|
||||||
pass
|
pass
|
||||||
pass
|
pass
|
||||||
|
|
||||||
#
|
# Loads a single item stored in the binary format
|
||||||
func load_binary_item(item_class, file_name):
|
func load_binary_item(item_class, file_name):
|
||||||
var file = File.new()
|
var file = File.new()
|
||||||
var id = file_name.basename()
|
var id = file_name.basename()
|
||||||
@ -155,7 +179,6 @@ func load_binary_item(item_class, file_name):
|
|||||||
var value = file.get_var()
|
var value = file.get_var()
|
||||||
item.set(property_name, value)
|
item.set(property_name, value)
|
||||||
pass
|
pass
|
||||||
# And now iterate over the rest of the variables and check if they have not yet been initialized
|
|
||||||
|
|
||||||
item._dirty = false
|
item._dirty = false
|
||||||
item._persistent = true
|
item._persistent = true
|
||||||
@ -164,7 +187,7 @@ func load_binary_item(item_class, file_name):
|
|||||||
file.close()
|
file.close()
|
||||||
return item
|
return item
|
||||||
|
|
||||||
|
# Loads a single item stored in the json format
|
||||||
func load_json_item(item_class, file_name):
|
func load_json_item(item_class, file_name):
|
||||||
var file = File.new()
|
var file = File.new()
|
||||||
var id = file_name.basename()
|
var id = file_name.basename()
|
||||||
@ -220,8 +243,15 @@ func parse_value(type, value):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
# Saves all items
|
||||||
|
func save_all_items():
|
||||||
|
for item_class in items:
|
||||||
|
for id in items[item_class]:
|
||||||
|
save_item(items[item_class][id])
|
||||||
|
pass
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Stores an item on the disk and updates the "last modified" property
|
||||||
func save_item(item):
|
func save_item(item):
|
||||||
if item:
|
if item:
|
||||||
item._last_modified= OS.get_unix_time()
|
item._last_modified= OS.get_unix_time()
|
||||||
@ -232,7 +262,7 @@ func save_item(item):
|
|||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Saves a single binary item
|
||||||
func save_binary_item(item):
|
func save_binary_item(item):
|
||||||
var file = File.new()
|
var file = File.new()
|
||||||
var status = 0
|
var status = 0
|
||||||
@ -255,6 +285,7 @@ func save_binary_item(item):
|
|||||||
pass #TODO: Handle
|
pass #TODO: Handle
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
|
# Saves a single json item
|
||||||
func save_json_item(item):
|
func save_json_item(item):
|
||||||
var file = File.new()
|
var file = File.new()
|
||||||
var status = 0
|
var status = 0
|
||||||
@ -290,6 +321,7 @@ func save_json_item(item):
|
|||||||
file.store_string(dict.to_json())
|
file.store_string(dict.to_json())
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
|
|
||||||
func sanitize_variant(value, type):
|
func sanitize_variant(value, type):
|
||||||
if type == TYPE_COLOR:
|
if type == TYPE_COLOR:
|
||||||
value = value.to_html()
|
value = value.to_html()
|
||||||
@ -298,33 +330,17 @@ func sanitize_variant(value, type):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
# Deletes a single item
|
||||||
func save_all_items():
|
|
||||||
for item_class in items:
|
|
||||||
for id in items[item_class]:
|
|
||||||
save_item(items[item_class][id])
|
|
||||||
pass
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
func delete_item(item):
|
func delete_item(item):
|
||||||
var path = get_item_path(item)
|
var path = get_item_path(item)
|
||||||
var directory = Directory.new()
|
var directory = Directory.new()
|
||||||
# TODO: Check why items[item._class].erase(item) doesn't work
|
# TODO: Check why items[item._class].erase(item) doesn't work
|
||||||
var items_of_class = items[item._class]
|
var items_of_class = items[item._class]
|
||||||
#items_of_class.erase(item.id)
|
|
||||||
#items[item._class] = items_of_class
|
|
||||||
var status = directory.remove(path)
|
var status = directory.remove(path)
|
||||||
load_manager()
|
load_manager()
|
||||||
|
|
||||||
|
|
||||||
|
# Gets all items of a specific class
|
||||||
func get_item(item_class, id):
|
|
||||||
if items.has(item_class) and items[item_class].has(id):
|
|
||||||
return items[item_class][id]
|
|
||||||
else:
|
|
||||||
return null
|
|
||||||
|
|
||||||
func get_items(item_class):
|
func get_items(item_class):
|
||||||
if items.has(item_class):
|
if items.has(item_class):
|
||||||
return items[item_class]
|
return items[item_class]
|
||||||
@ -332,6 +348,15 @@ func get_items(item_class):
|
|||||||
return null
|
return null
|
||||||
|
|
||||||
|
|
||||||
|
# Gets a single item
|
||||||
|
func get_item(item_class, id):
|
||||||
|
if items.has(item_class) and items[item_class].has(id):
|
||||||
|
return items[item_class][id]
|
||||||
|
else:
|
||||||
|
return null
|
||||||
|
|
||||||
|
|
||||||
|
# Creates a new item of a given class, adds it to the items dictionary and returns the newly created item
|
||||||
func create_and_add_new_item(item_class, id, display_name):
|
func create_and_add_new_item(item_class, id, display_name):
|
||||||
id = sanitize_string(id)
|
id = sanitize_string(id)
|
||||||
id = rename_id_if_exists(item_class, id)
|
id = rename_id_if_exists(item_class, id)
|
||||||
@ -348,19 +373,19 @@ func create_and_add_new_item(item_class, id, display_name):
|
|||||||
new_item._created = OS.get_unix_time()
|
new_item._created = OS.get_unix_time()
|
||||||
return new_item
|
return new_item
|
||||||
|
|
||||||
func duplicate_item(item, id, display_name):
|
func duplicate_item(item, id, display_name, overwrite = true):
|
||||||
id = sanitize_string(id)
|
id = sanitize_string(id)
|
||||||
id = rename_id_if_exists(item._class, id)
|
if not overwrite:
|
||||||
|
id = rename_id_if_exists(item._class, id)
|
||||||
if id == "" or id == null:
|
if id == "" or id == null:
|
||||||
emit_signal("item_duplication_failed", "Item duplication failed", "The item must haven an ID.")
|
emit_signal("item_duplication_failed", "Item duplication failed", "The item must haven an ID.")
|
||||||
return null
|
return null
|
||||||
if items[item._class].has(id):
|
if items[item._class].has(id) and not overwrite:
|
||||||
emit_signal("item_duplication_failed", "Item duplication failed", "The item could not be duplicated.")
|
emit_signal("item_duplication_failed", "Item duplication failed", "The item could not be duplicated because it already exists.")
|
||||||
return null
|
return null
|
||||||
|
|
||||||
var new_item = classes[item._class].new(id)
|
var new_item = classes[item._class].new(id)
|
||||||
# Copy all properties
|
# Copy all properties
|
||||||
|
|
||||||
for property in new_item.get_property_list():
|
for property in new_item.get_property_list():
|
||||||
if property["usage"] >= PROPERTY_USAGE_SCRIPT_VARIABLE:
|
if property["usage"] >= PROPERTY_USAGE_SCRIPT_VARIABLE:
|
||||||
new_item.set(property["name"], item.get(property["name"]))
|
new_item.set(property["name"], item.get(property["name"]))
|
||||||
@ -373,6 +398,7 @@ func duplicate_item(item, id, display_name):
|
|||||||
new_item._dirty = true
|
new_item._dirty = true
|
||||||
new_item._persistent = false
|
new_item._persistent = false
|
||||||
items[new_item._class][new_item._id] = new_item
|
items[new_item._class][new_item._id] = new_item
|
||||||
|
items[new_item._class][id].set_name(new_item._class + ":" + id)
|
||||||
return new_item
|
return new_item
|
||||||
|
|
||||||
# Rename the item, delete the old entry, overwrite the id and save anew
|
# Rename the item, delete the old entry, overwrite the id and save anew
|
||||||
|
Loading…
Reference in New Issue
Block a user