mirror of
https://github.com/Relintai/godot-resources-as-sheets-plugin.git
synced 2025-02-17 03:34:19 +01:00
Delegate data i/o to separate class
This commit is contained in:
parent
e4c025d869
commit
73b8d9cc41
@ -40,6 +40,7 @@ var edited_cells_text := []
|
|||||||
var edit_cursor_positions := []
|
var edit_cursor_positions := []
|
||||||
var inspector_resource : Resource
|
var inspector_resource : Resource
|
||||||
var search_cond : Reference
|
var search_cond : Reference
|
||||||
|
var io := SpreadsheetEditFormatTres.new()
|
||||||
|
|
||||||
var hidden_columns := {}
|
var hidden_columns := {}
|
||||||
var first_row := 0
|
var first_row := 0
|
||||||
@ -55,6 +56,8 @@ func _ready():
|
|||||||
get_node(path_hide_columns_button).get_popup()\
|
get_node(path_hide_columns_button).get_popup()\
|
||||||
.connect("id_pressed", self, "_on_VisibleCols_id_pressed")
|
.connect("id_pressed", self, "_on_VisibleCols_id_pressed")
|
||||||
|
|
||||||
|
io.editor_view = self
|
||||||
|
|
||||||
# Load saved recent paths
|
# Load saved recent paths
|
||||||
var file := File.new()
|
var file := File.new()
|
||||||
if file.file_exists(save_data_path):
|
if file.file_exists(save_data_path):
|
||||||
@ -94,15 +97,15 @@ func _on_filesystem_changed():
|
|||||||
func display_folder(folderpath : String, sort_by : String = "", sort_reverse : bool = false, force_rebuild : bool = false):
|
func display_folder(folderpath : String, sort_by : String = "", sort_reverse : bool = false, force_rebuild : bool = false):
|
||||||
if folderpath == "": return # Root folder resources tend to have MANY properties.
|
if folderpath == "": return # Root folder resources tend to have MANY properties.
|
||||||
$"HeaderContentSplit/MarginContainer/FooterContentSplit/Panel/Label".visible = false
|
$"HeaderContentSplit/MarginContainer/FooterContentSplit/Panel/Label".visible = false
|
||||||
if !folderpath.ends_with("/"):
|
if folderpath.ends_with(".tres"):
|
||||||
folderpath += "/"
|
folderpath = folderpath.get_base_dir() + "/"
|
||||||
|
|
||||||
if search_cond == null:
|
if search_cond == null:
|
||||||
_on_SearchCond_text_entered("true")
|
_on_SearchCond_text_entered("true")
|
||||||
|
|
||||||
|
_load_resources_from_folder(folderpath, sort_by, sort_reverse)
|
||||||
first_row = get_node(path_page_manager).first_row
|
first_row = get_node(path_page_manager).first_row
|
||||||
last_row = min(get_node(path_page_manager).last_row, rows.size())
|
last_row = min(get_node(path_page_manager).last_row, rows.size())
|
||||||
_load_resources_from_folder(folderpath, sort_by, sort_reverse)
|
|
||||||
if columns.size() == 0: return
|
if columns.size() == 0: return
|
||||||
|
|
||||||
get_node(path_folder_path).text = folderpath
|
get_node(path_folder_path).text = folderpath
|
||||||
@ -128,64 +131,22 @@ func refresh(force_rebuild : bool = true):
|
|||||||
|
|
||||||
|
|
||||||
func _load_resources_from_folder(folderpath : String, sort_by : String, sort_reverse : bool):
|
func _load_resources_from_folder(folderpath : String, sort_by : String, sort_reverse : bool):
|
||||||
var dir := Directory.new()
|
rows = io.import_from_path(folderpath, funcref(self, "insert_row_sorted"), sort_by, sort_reverse)
|
||||||
dir.open(folderpath)
|
|
||||||
dir.list_dir_begin()
|
|
||||||
|
|
||||||
rows.clear()
|
|
||||||
remembered_paths.clear()
|
|
||||||
var cur_dir_script : Script = null
|
|
||||||
|
|
||||||
var filepath = dir.get_next()
|
|
||||||
var res : Resource
|
|
||||||
|
|
||||||
while filepath != "":
|
|
||||||
if filepath.ends_with(".tres"):
|
|
||||||
filepath = folderpath + filepath
|
|
||||||
res = load(filepath)
|
|
||||||
if !is_instance_valid(cur_dir_script):
|
|
||||||
columns.clear()
|
|
||||||
column_types.clear()
|
|
||||||
column_hints.clear()
|
|
||||||
column_hint_strings.clear()
|
|
||||||
column_editors.clear()
|
|
||||||
var column_index = -1
|
|
||||||
for x in res.get_property_list():
|
|
||||||
if x["usage"] & PROPERTY_USAGE_EDITOR != 0 and x["name"] != "script":
|
|
||||||
column_index += 1
|
|
||||||
columns.append(x["name"])
|
|
||||||
column_types.append(x["type"])
|
|
||||||
column_hints.append(x["hint"])
|
|
||||||
column_hint_strings.append(x["hint_string"].split(","))
|
|
||||||
for y in all_cell_editors:
|
|
||||||
if y.can_edit_value(res.get(x["name"]), x["type"], x["hint"], column_index):
|
|
||||||
column_editors.append(y)
|
|
||||||
break
|
|
||||||
|
|
||||||
cur_dir_script = res.get_script()
|
|
||||||
if !(sort_by in res):
|
|
||||||
sort_by = "resource_path"
|
|
||||||
|
|
||||||
if res.get_script() == cur_dir_script:
|
|
||||||
_insert_row_sorted(res, rows, sort_by, sort_reverse)
|
|
||||||
remembered_paths[res.resource_path] = res
|
|
||||||
|
|
||||||
filepath = dir.get_next()
|
|
||||||
|
|
||||||
|
|
||||||
func _insert_row_sorted(res : Resource, rows : Array, sort_by : String, sort_reverse : bool):
|
func insert_row_sorted(res : Resource, rows : Array, sort_by : String, sort_reverse : bool):
|
||||||
if !search_cond.can_show(res, rows.size()):
|
if !search_cond.can_show(res, rows.size()):
|
||||||
return
|
return
|
||||||
|
|
||||||
for i in rows.size():
|
for i in rows.size():
|
||||||
if sort_reverse == _compare_values(res.get(sort_by), rows[i].get(sort_by)):
|
if sort_reverse == compare_values(io.get_value(res, sort_by), io.get_value(rows[i], sort_by)):
|
||||||
rows.insert(i, res)
|
rows.insert(i, res)
|
||||||
return
|
return
|
||||||
|
|
||||||
rows.append(res)
|
rows.append(res)
|
||||||
|
|
||||||
|
|
||||||
func _compare_values(a, b) -> bool:
|
func compare_values(a, b) -> bool:
|
||||||
if a == null or b == null: return b == null
|
if a == null or b == null: return b == null
|
||||||
if a is Color:
|
if a is Color:
|
||||||
return a.h > b.h if a.h != b.h else a.v > b.v
|
return a.h > b.h if a.h != b.h else a.v > b.v
|
||||||
@ -299,12 +260,12 @@ func _update_row(row_index : int, color_rows : bool = true):
|
|||||||
+ "Of " + rows[row_index].resource_path.get_file().get_basename()
|
+ "Of " + rows[row_index].resource_path.get_file().get_basename()
|
||||||
)
|
)
|
||||||
|
|
||||||
column_editors[i].set_value(current_node, rows[row_index].get(columns[i]))
|
column_editors[i].set_value(current_node, io.get_value(rows[row_index], columns[i]))
|
||||||
if columns[i] == "resource_path":
|
if columns[i] == "resource_path":
|
||||||
column_editors[i].set_value(current_node, current_node.text.get_file().get_basename())
|
column_editors[i].set_value(current_node, current_node.text.get_file().get_basename())
|
||||||
|
|
||||||
if color_rows and column_types[i] == TYPE_COLOR:
|
if color_rows and column_types[i] == TYPE_COLOR:
|
||||||
next_color = rows[row_index].get(columns[i])
|
next_color = io.get_value(rows[row_index], columns[i])
|
||||||
|
|
||||||
column_editors[i].set_color(current_node, next_color)
|
column_editors[i].set_color(current_node, next_color)
|
||||||
|
|
||||||
@ -477,7 +438,7 @@ func _try_open_docks(cell : Control):
|
|||||||
var column_index = _get_cell_column(cell)
|
var column_index = _get_cell_column(cell)
|
||||||
for x in get_node(path_property_editors).get_children():
|
for x in get_node(path_property_editors).get_children():
|
||||||
x.visible = x.try_edit_value(
|
x.visible = x.try_edit_value(
|
||||||
rows[_get_cell_row(cell)].get(columns[column_index]),
|
io.get_value(rows[_get_cell_row(cell)], columns[column_index]),
|
||||||
column_types[column_index],
|
column_types[column_index],
|
||||||
column_hints[column_index]
|
column_hints[column_index]
|
||||||
)
|
)
|
||||||
@ -533,13 +494,13 @@ func get_edited_cells_values() -> Array:
|
|||||||
var column_index := _get_cell_column(edited_cells[0])
|
var column_index := _get_cell_column(edited_cells[0])
|
||||||
var cell_editor = column_editors[column_index]
|
var cell_editor = column_editors[column_index]
|
||||||
for i in arr.size():
|
for i in arr.size():
|
||||||
arr[i] = rows[_get_cell_row(arr[i])].get(columns[column_index])
|
arr[i] = io.get_value(rows[_get_cell_row(arr[i])], columns[column_index])
|
||||||
|
|
||||||
return arr
|
return arr
|
||||||
|
|
||||||
|
|
||||||
func get_cell_value(cell : Control):
|
func get_cell_value(cell : Control):
|
||||||
return rows[_get_cell_row(cell)].get(columns[_get_cell_column(cell)])
|
return io.get_value(rows[_get_cell_row(cell)], columns[_get_cell_column(cell)])
|
||||||
|
|
||||||
|
|
||||||
func _can_select_cell(cell : Control) -> bool:
|
func _can_select_cell(cell : Control) -> bool:
|
||||||
@ -731,9 +692,13 @@ func _update_resources(update_rows : Array, update_cells : Array, update_column
|
|||||||
values[i] = _try_convert(values[i], column_types[update_column])
|
values[i] = _try_convert(values[i], column_types[update_column])
|
||||||
if values[i] == null:
|
if values[i] == null:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
update_rows[i].set(columns[update_column], convert(values[i], column_types[update_column]))
|
io.set_value(
|
||||||
ResourceSaver.save(update_rows[i].resource_path, update_rows[i])
|
update_rows[i],
|
||||||
|
columns[update_column],
|
||||||
|
convert(values[i], column_types[update_column])
|
||||||
|
)
|
||||||
|
io.save_entry(rows, i)
|
||||||
if column_types[update_column] == TYPE_COLOR:
|
if column_types[update_column] == TYPE_COLOR:
|
||||||
for j in columns.size() - update_column:
|
for j in columns.size() - update_column:
|
||||||
if j != 0 and column_types[j + update_column] == TYPE_COLOR:
|
if j != 0 and column_types[j + update_column] == TYPE_COLOR:
|
||||||
|
@ -172,7 +172,7 @@ __meta__ = {
|
|||||||
margin_left = 400.0
|
margin_left = 400.0
|
||||||
margin_right = 428.0
|
margin_right = 428.0
|
||||||
margin_bottom = 24.0
|
margin_bottom = 24.0
|
||||||
hint_tooltip = "Open Folder"
|
hint_tooltip = "Open Folder of Resources"
|
||||||
icon = SubResource( 2 )
|
icon = SubResource( 2 )
|
||||||
script = ExtResource( 4 )
|
script = ExtResource( 4 )
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
class_name SpreadsheetEditFormat
|
||||||
|
extends Reference
|
||||||
|
|
||||||
|
var editor_view : Control
|
||||||
|
|
||||||
|
## Override to define reading behaviour.
|
||||||
|
func get_value(entry, key : String):
|
||||||
|
pass
|
||||||
|
|
||||||
|
## Override to define writing behaviour. This is NOT supposed to save - use `save_entry`.
|
||||||
|
func set_value(entry, key : String, value):
|
||||||
|
pass
|
||||||
|
|
||||||
|
## Override to define how the data gets saved.
|
||||||
|
func save_entry(all_entries : Array, index : int):
|
||||||
|
pass
|
||||||
|
|
||||||
|
## Override to allow editing rows from the Inspector.
|
||||||
|
func create_resource(entry) -> Resource:
|
||||||
|
return Resource.new()
|
||||||
|
|
||||||
|
## Override to define
|
||||||
|
func import_from_path(folderpath : String, insert_func : FuncRef, sort_by : String, sort_reverse : bool = false) -> Array:
|
||||||
|
return []
|
@ -0,0 +1,66 @@
|
|||||||
|
class_name SpreadsheetEditFormatTres
|
||||||
|
extends SpreadsheetEditFormat
|
||||||
|
|
||||||
|
|
||||||
|
func get_value(entry, key : String):
|
||||||
|
return entry.get(key)
|
||||||
|
|
||||||
|
|
||||||
|
func set_value(entry, key : String, value):
|
||||||
|
entry.set(key, value)
|
||||||
|
|
||||||
|
|
||||||
|
func save_entry(all_entries : Array, index : int):
|
||||||
|
ResourceSaver.save(all_entries[index].resource_path, all_entries[index])
|
||||||
|
|
||||||
|
|
||||||
|
func create_resource(entry) -> Resource:
|
||||||
|
return entry
|
||||||
|
|
||||||
|
|
||||||
|
func import_from_path(folderpath : String, insert_func : FuncRef, sort_by : String, sort_reverse : bool = false) -> Array:
|
||||||
|
var rows := []
|
||||||
|
var dir := Directory.new()
|
||||||
|
dir.open(folderpath)
|
||||||
|
dir.list_dir_begin()
|
||||||
|
|
||||||
|
editor_view.remembered_paths.clear()
|
||||||
|
var cur_dir_script : Script = null
|
||||||
|
|
||||||
|
var filepath = dir.get_next()
|
||||||
|
var res : Resource
|
||||||
|
|
||||||
|
while filepath != "":
|
||||||
|
if filepath.ends_with(".tres"):
|
||||||
|
filepath = folderpath + filepath
|
||||||
|
res = load(filepath)
|
||||||
|
if !is_instance_valid(cur_dir_script):
|
||||||
|
editor_view.columns.clear()
|
||||||
|
editor_view.column_types.clear()
|
||||||
|
editor_view.column_hints.clear()
|
||||||
|
editor_view.column_hint_strings.clear()
|
||||||
|
editor_view.column_editors.clear()
|
||||||
|
var column_index = -1
|
||||||
|
for x in res.get_property_list():
|
||||||
|
if x["usage"] & PROPERTY_USAGE_EDITOR != 0 and x["name"] != "script":
|
||||||
|
column_index += 1
|
||||||
|
editor_view.columns.append(x["name"])
|
||||||
|
editor_view.column_types.append(x["type"])
|
||||||
|
editor_view.column_hints.append(x["hint"])
|
||||||
|
editor_view.column_hint_strings.append(x["hint_string"].split(","))
|
||||||
|
for y in editor_view.all_cell_editors:
|
||||||
|
if y.can_edit_value(get_value(res, x["name"]), x["type"], x["hint"], column_index):
|
||||||
|
editor_view.column_editors.append(y)
|
||||||
|
break
|
||||||
|
|
||||||
|
cur_dir_script = res.get_script()
|
||||||
|
if !(sort_by in res):
|
||||||
|
sort_by = "resource_path"
|
||||||
|
|
||||||
|
if res.get_script() == cur_dir_script:
|
||||||
|
insert_func.call_func(res, rows, sort_by, sort_reverse)
|
||||||
|
editor_view.remembered_paths[res.resource_path] = res
|
||||||
|
|
||||||
|
filepath = dir.get_next()
|
||||||
|
|
||||||
|
return rows
|
@ -30,6 +30,15 @@ _global_script_classes=[ {
|
|||||||
"path": "res://addons/resources_speadsheet_view/typed_editors/dock_base.gd"
|
"path": "res://addons/resources_speadsheet_view/typed_editors/dock_base.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "Reference",
|
"base": "Reference",
|
||||||
|
"class": "SpreadsheetEditFormat",
|
||||||
|
"language": "GDScript",
|
||||||
|
"path": "res://addons/resources_speadsheet_view/import_export/formats_edit/edit_base.gd"
|
||||||
|
}, {
|
||||||
|
"base": "SpreadsheetEditFormat",
|
||||||
|
"class": "SpreadsheetEditFormatTres",
|
||||||
|
"language": "GDScript",
|
||||||
|
"path": "res://addons/resources_speadsheet_view/import_export/formats_edit/edit_tres.gd"
|
||||||
|
}, {
|
||||||
"class": "TextEditingUtils",
|
"class": "TextEditingUtils",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://addons/resources_speadsheet_view/text_editing_utils.gd"
|
"path": "res://addons/resources_speadsheet_view/text_editing_utils.gd"
|
||||||
|
Loading…
Reference in New Issue
Block a user