You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.9 KiB
109 lines
2.9 KiB
7 months ago
|
@tool
|
||
|
extends Control
|
||
|
|
||
|
var ListItem := load(DialogicUtil.get_module_path('StyleEditor').path_join("Components/StyleItem.tscn"))
|
||
|
enum Types {ALL, STYLES, LAYER, LAYOUT_BASE}
|
||
|
|
||
|
var current_type := Types.ALL
|
||
|
var style_part_info := []
|
||
|
var premade_scenes_reference := {}
|
||
|
|
||
|
signal activate_part(part_info:Dictionary)
|
||
|
|
||
|
var current_info := {}
|
||
|
|
||
|
# Called when the node enters the scene tree for the first time.
|
||
|
func _ready() -> void:
|
||
|
%Search.right_icon = get_theme_icon("Search", "EditorIcons")
|
||
|
collect_style_parts()
|
||
|
|
||
|
|
||
|
func collect_style_parts() -> void:
|
||
|
for indexer in DialogicUtil.get_indexers():
|
||
|
for layout_part in indexer._get_layout_parts():
|
||
|
style_part_info.append(layout_part)
|
||
|
if not layout_part.get('path', '').is_empty():
|
||
|
premade_scenes_reference[layout_part['path']] = layout_part
|
||
|
|
||
|
|
||
|
func is_premade_style_part(scene_path:String) -> bool:
|
||
|
return scene_path in premade_scenes_reference
|
||
|
|
||
|
|
||
|
func load_parts() -> void:
|
||
|
for i in %PartGrid.get_children():
|
||
|
i.queue_free()
|
||
|
|
||
|
%Search.placeholder_text = "Search for "
|
||
|
%Search.text = ""
|
||
|
match current_type:
|
||
|
Types.STYLES:
|
||
|
%Search.placeholder_text += "premade styles"
|
||
|
Types.LAYER:
|
||
|
%Search.placeholder_text += "layer scenes"
|
||
|
Types.LAYOUT_BASE:
|
||
|
%Search.placeholder_text += "layout base scenes"
|
||
|
Types.ALL:
|
||
|
%Search.placeholder_text += "styles or layout scenes"
|
||
|
|
||
|
for info in style_part_info:
|
||
|
var type: String = info.get('type', '_')
|
||
|
match current_type:
|
||
|
Types.STYLES:
|
||
|
if type != "Style":
|
||
|
continue
|
||
|
Types.LAYER:
|
||
|
if type != "Layer":
|
||
|
continue
|
||
|
Types.LAYOUT_BASE:
|
||
|
if type != "Layout Base":
|
||
|
continue
|
||
|
|
||
|
var style_item: Node = ListItem.instantiate()
|
||
|
style_item.load_info(info)
|
||
|
%PartGrid.add_child(style_item)
|
||
|
style_item.set_meta('info', info)
|
||
|
style_item.clicked.connect(_on_style_item_clicked.bind(style_item, info))
|
||
|
style_item.focused.connect(_on_style_item_clicked.bind(style_item, info))
|
||
|
style_item.double_clicked.connect(emit_signal.bind('activate_part', info))
|
||
|
|
||
|
await get_tree().process_frame
|
||
|
|
||
|
if %PartGrid.get_child_count() > 0:
|
||
|
%PartGrid.get_child(0).clicked.emit()
|
||
|
%PartGrid.get_child(0).grab_focus()
|
||
|
|
||
|
|
||
|
func _on_style_item_clicked(item:Node, info:Dictionary) -> void:
|
||
|
load_part_info(info)
|
||
|
|
||
|
|
||
|
func load_part_info(info:Dictionary) -> void:
|
||
|
current_info = info
|
||
|
%PartTitle.text = info.get('name', 'Unknown Part')
|
||
|
%PartAuthor.text = "by "+info.get('author', 'Anonymus')
|
||
|
%PartDescription.text = info.get('description', '')
|
||
|
|
||
|
if info.get('preview_image', null):
|
||
|
%PreviewImage.texture = load(info.get('preview_image')[0])
|
||
|
%PreviewImage.show()
|
||
|
else:
|
||
|
%PreviewImage.hide()
|
||
|
|
||
|
|
||
|
func _on_activate_button_pressed() -> void:
|
||
|
activate_part.emit(current_info)
|
||
|
|
||
|
|
||
|
func _on_search_text_changed(new_text: String) -> void:
|
||
|
for item in %PartGrid.get_children():
|
||
|
if new_text.is_empty():
|
||
|
item.show()
|
||
|
continue
|
||
|
|
||
|
if new_text.to_lower() in item.get_meta('info').name.to_lower():
|
||
|
item.show()
|
||
|
continue
|
||
|
|
||
|
item.hide()
|