extends EditorProperty class_name InspectorPluginSheetIDFieldItem signal sheet_selected(sheet_id) var search_box_template = preload("res://addons/madtalk/components/DialogSearchSheet.tscn") var search_item_template = preload("res://addons/madtalk/components/DialogSearchSheetItem.tscn") var property_editor_object = preload("res://addons/madtalk/components/DialogSearchInspectorSheetIDField.tscn").instantiate() var dialog_data : Resource = preload("res://addons/madtalk/runtime/madtalk_data.tres") var updating = false func _init(): add_child(property_editor_object) # To remember focus when selected back: add_focusable(property_editor_object.get_node("ValueLineEdit")) property_editor_object.get_node("ValueLineEdit").connect("text_changed", Callable(self, "_on_text_changed")) property_editor_object.get_node("BtnSearch").connect("pressed", Callable(self, "_on_search_requested")) func _on_text_changed(text): if (updating): return emit_changed(get_edited_property(), text) func update_property(): var new_text = get_edited_object()[get_edited_property()] updating = true property_editor_object.get_node("ValueLineEdit").set_text(new_text) updating = false func _on_search_requested(): var text = get_edited_object()[get_edited_property()] var new_search_box = set_search_window(text) new_search_box.popup_centered() search(text, new_search_box) var result = await self.sheet_selected if result and (result is String): updating = true property_editor_object.get_node("ValueLineEdit").set_text(result) emit_changed(get_edited_property(), result) updating = false func set_search_window(text): var new_search_box = search_box_template.instantiate() add_child(new_search_box) new_search_box.get_node("Panel/BottomBar/BtnCancel").connect("pressed", Callable(self, "_on_BtnCancel_pressed").bind(new_search_box)) new_search_box.get_node("Panel/SearchEdit").connect("text_changed", Callable(self, "search").bind(new_search_box)) new_search_box.get_node("Panel/SearchEdit").text = text return new_search_box func add_item(sheet_id, window_object): if not sheet_id in dialog_data.sheets: return if not window_object: return var new_item = search_item_template.instantiate() window_object.get_node("Panel/SearchResultsPanel/Scroll/VBoxResults").add_child(new_item) new_item.get_node("SheetIDLabel").text = sheet_id new_item.get_node("DescLabel").text = dialog_data.sheets[sheet_id].sheet_description new_item.get_node("BtnPick").connect("pressed", Callable(self, "_on_SheetItem_pick").bind(sheet_id, window_object)) func _on_SheetItem_pick(sheet_id, window_object): if not window_object: return window_object.hide() emit_signal("sheet_selected", sheet_id) window_object.queue_free() func _on_BtnCancel_pressed(window_object): if not window_object: return window_object.hide() emit_signal("sheet_selected", null) window_object.queue_free() func search(search_term, window_object): var vbox_results = window_object.get_node("Panel/SearchResultsPanel/Scroll/VBoxResults") var old_items = vbox_results.get_children() for item in old_items: vbox_results.remove_child(item) item.queue_free() for this_sheet_id in dialog_data.sheets: var desc = dialog_data.sheets[this_sheet_id].sheet_description # If there is no search, or search shows up in eiter id or description: if (search_term == "") or (search_term.is_subsequence_ofi(this_sheet_id)) or (search_term.is_subsequence_ofi(desc)): add_item(this_sheet_id, window_object)