153 lines
4.8 KiB
GDScript
153 lines
4.8 KiB
GDScript
extends Node
|
|
|
|
var library_path : String = ""
|
|
var library_name : String = ""
|
|
var library_items : Array = []
|
|
var library_items_by_name : Dictionary = {}
|
|
var library_icons : Dictionary = {}
|
|
var read_only : bool = false
|
|
|
|
func _ready():
|
|
pass
|
|
|
|
func create_library(path : String, name : String) -> void:
|
|
library_path = path
|
|
library_name = name
|
|
library_items = []
|
|
library_items_by_name = {}
|
|
library_icons = {}
|
|
read_only = false
|
|
|
|
func load_library(path : String, ro : bool = false) -> bool:
|
|
var file : File = File.new()
|
|
if OS.get_name() == "Android":
|
|
path = path.replace("root://", "res://material_maker/")
|
|
else:
|
|
path = path.replace("root://", OS.get_executable_path().get_base_dir()+"/")
|
|
if ! file.open(path, File.READ) == OK:
|
|
print("Failed to open "+path)
|
|
return false
|
|
var data = parse_json(file.get_as_text())
|
|
library_path = path
|
|
library_name = data.name if data.has("name") else ""
|
|
library_items = data.lib
|
|
read_only = ro
|
|
for i in data.lib:
|
|
library_items_by_name[i.tree_item] = i
|
|
var texture : ImageTexture = ImageTexture.new()
|
|
var image : Image = Image.new()
|
|
if i.has("icon_data"):
|
|
image.load_png_from_buffer(Marshalls.base64_to_raw(i.icon_data))
|
|
elif i.has("icon"):
|
|
image.load(path.get_basename()+"/"+i.icon+".png")
|
|
i.icon_data = Marshalls.raw_to_base64(image.save_png_to_buffer())
|
|
else:
|
|
library_icons[i.tree_item] = null
|
|
continue
|
|
texture.create_from_image(image)
|
|
library_icons[i.tree_item] = texture
|
|
return true
|
|
|
|
func get_items(filter : String, disabled_sections : Array, aliased_items : Array) -> Array:
|
|
var array : Array = []
|
|
for i in library_items:
|
|
if filter == "" or i.tree_item.to_lower().find(filter) != -1 or aliased_items.find(i.tree_item) != -1:
|
|
var slash_pos = i.tree_item.find("/")
|
|
var section_name = i.tree_item.left(slash_pos) if slash_pos != -1 else i.tree_item
|
|
if disabled_sections.find(section_name) == -1:
|
|
array.push_back({ name=i.tree_item, item=i, icon=library_icons[i.tree_item] })
|
|
return array
|
|
|
|
func generate_node_sections(node_sections : Dictionary) -> void:
|
|
for i in library_items:
|
|
var section = i.tree_item
|
|
var slash_position = section.find("/")
|
|
if slash_position != -1:
|
|
section = i.tree_item.left(slash_position)
|
|
if !i.has("type"):
|
|
continue
|
|
var node_name = ""
|
|
if mm_loader.predefined_generators.has(i.type):
|
|
node_name = i.type
|
|
i = mm_loader.predefined_generators[i.type]
|
|
elif i.has("shader_model"):
|
|
if i.shader_model.has("name"):
|
|
node_name = i.shader_model.name
|
|
elif i.has("label"):
|
|
node_name = i.label
|
|
elif i.has("type"):
|
|
node_name = i.type
|
|
if node_name != "":
|
|
if not node_sections.has(node_name):
|
|
node_sections[node_name] = section
|
|
# else:
|
|
# print(node_name+" already defined in "+section)
|
|
|
|
|
|
func get_sections() -> Array:
|
|
var sections : Array = Array()
|
|
for i in library_items:
|
|
var section_name = i.tree_item.left(i.tree_item.find("/"))
|
|
if sections.find(section_name) == -1:
|
|
sections.push_back(section_name)
|
|
return Array(sections)
|
|
|
|
func save_library() -> void:
|
|
Directory.new().make_dir_recursive(library_path.get_base_dir())
|
|
var file = File.new()
|
|
if file.open(library_path, File.WRITE) == OK:
|
|
file.store_string(JSON.print({name=library_name, lib=library_items}, "\t", true))
|
|
file.close()
|
|
|
|
func add_item(item_name : String, image : Image, data : Dictionary) -> void:
|
|
if read_only:
|
|
return
|
|
data.tree_item = item_name
|
|
data.icon_data = Marshalls.raw_to_base64(image.save_png_to_buffer())
|
|
var new_library_items = []
|
|
var inserted = false
|
|
for i in library_items:
|
|
if i.tree_item != item_name:
|
|
new_library_items.push_back(i)
|
|
elif !inserted:
|
|
new_library_items.push_back(data)
|
|
inserted = true
|
|
if !inserted:
|
|
new_library_items.push_back(data)
|
|
library_items = new_library_items
|
|
library_items_by_name[item_name] = data
|
|
var texture : ImageTexture = ImageTexture.new()
|
|
texture.create_from_image(image)
|
|
library_icons[item_name] = texture
|
|
save_library()
|
|
|
|
func remove_item(item_name : String) -> void:
|
|
if read_only:
|
|
return
|
|
var new_library_items = []
|
|
for i in library_items:
|
|
if i.tree_item != item_name:
|
|
new_library_items.push_back(i)
|
|
library_items = new_library_items
|
|
library_items_by_name.erase(item_name)
|
|
library_icons.erase(item_name)
|
|
save_library()
|
|
|
|
func rename_item(old_name : String, new_name : String) -> void:
|
|
if read_only or library_items_by_name.has(new_name):
|
|
return
|
|
library_items_by_name[new_name] = library_items_by_name[old_name]
|
|
library_icons[new_name] = library_icons[old_name]
|
|
library_items_by_name[new_name].tree_item = new_name
|
|
library_items_by_name.erase(old_name)
|
|
library_icons.erase(old_name)
|
|
save_library()
|
|
|
|
func update_item_icon(name : String, icon : Image) -> void:
|
|
if read_only:
|
|
return
|
|
var data = library_items_by_name[name]
|
|
data.icon_data = Marshalls.raw_to_base64(icon.save_png_to_buffer())
|
|
library_icons[name].create_from_image(icon)
|
|
save_library()
|