No Description
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.

story_editor.gd 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753
  1. tool
  2. extends Control
  3. signal changed_story
  4. signal close_pressed
  5. signal dialog_edit_pressed(story, did)
  6. onready var _Dialog_Record_Root = self.get_node("VBoxContainer/HBoxContainer3/Panel/VScrollBar/Dialog_Record_Root")
  7. onready var _Dir = Directory.new()
  8. onready var _Filename_LBL = self.get_node("VBoxContainer/HBoxContainer2/Filename_LBL")
  9. onready var _Filter_Menu = self.get_node("VBoxContainer/HBoxContainer2/Filter_MenuButton")
  10. onready var _Group_List = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager/Group_ItemList")
  11. onready var _Group_Manager_Panel = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager")
  12. onready var _Group_Selector = self.get_node("VBoxContainer/HBoxContainer/Group_Selector_BTN")
  13. onready var _New_Group_LineEdit = self.get_node("VBoxContainer/HBoxContainer3/Group_Manager/HBoxContainer/Add_Group_LineEdit")
  14. onready var _Search_LineEdit = self.get_node("VBoxContainer/HBoxContainer2/Search_LineEdit")
  15. onready var _Search_Option_BTN = self.get_node("VBoxContainer/HBoxContainer2/Search_OptionButton")
  16. onready var _Story_Menu = self.get_node("VBoxContainer/HBoxContainer/Story")
  17. var _Dialog_Record = preload("res://addons/EXP-System-Dialog/Story Editor/Dialog Record/Dialog_Record.tscn")
  18. var _EXP_Baked_Story = preload("res://addons/EXP-System-Dialog/Resource_BakedStory/EXP_BakedStory.gd")
  19. var _EXP_Story = preload("res://addons/EXP-System-Dialog/Resource_EditorStory/EXP_EditorStory.gd")
  20. var _Record_Rename_Box_TSCN = preload("res://addons/EXP-System-Dialog/Story Editor/Rename Record Box/Rename_Record_Box.tscn")
  21. var _available_dids : Array
  22. var _Bake_Story_As : EditorFileDialog
  23. var _checked_dialogs : Array = []
  24. var _groups : Array
  25. var _Load_CSV : EditorFileDialog
  26. var _Load_Story : EditorFileDialog
  27. var _record_names : Dictionary
  28. var _Record_Rename_Box
  29. var _Save_CSV_As : EditorFileDialog
  30. var _Save_Story_As : EditorFileDialog
  31. var _story : Dictionary
  32. #Virtual Methods
  33. func _ready():
  34. self._create_rename_box()
  35. self._populate_story_menu()
  36. self._setup_dialogs()
  37. self._Filter_Menu.get_popup().connect("index_pressed", self, "_on_Filter_Menu_index_pressed")
  38. self._Filter_Menu.get_popup().hide_on_checkable_item_selection = false
  39. self._populate_filter_menu()
  40. self._populate_searchby_menu()
  41. #Callback Methods
  42. func _on_Add_Group_BTN_pressed():
  43. self._add_group()
  44. func _on_Add_Group_LineEdit_text_entered(new_text):
  45. self._add_group()
  46. func _on_Apply_Group_BTN_pressed():
  47. var id = self._Group_Selector.get_selected_id()
  48. if id == -1:
  49. return
  50. var idx = self._Group_Selector.get_item_index(id)
  51. var group = self._Group_Selector.get_popup().get_item_text(idx)
  52. for record in self._checked_dialogs.duplicate():
  53. var did = record.get_did()
  54. self._dialog_apply_group(did, group)
  55. record.uncheck()
  56. self.emit_signal("changed_story")
  57. func _on_Bake_Story_As_file_selected(filename : String):
  58. self._bake_data_to(filename)
  59. func _on_Bake_Story_BTN_pressed():
  60. self._Bake_Story_As.popup_centered_ratio(0.7)
  61. func _on_Check_All_BTN_pressed():
  62. var records = self._Dialog_Record_Root.get_children()
  63. for record in records:
  64. if record.visible:
  65. record.check()
  66. func _on_Close_BTN_pressed():
  67. self.emit_signal("close_pressed")
  68. func _on_Create_Dialog_BTN_pressed():
  69. self._create_dialog_record()
  70. func _on_Delete_Dialog_BTN_pressed():
  71. self._delete_checked_dialogs()
  72. func _on_Delete_Group_BTN_pressed():
  73. var idxs = self._Group_List.get_selected_items()
  74. var group
  75. for idx in idxs:
  76. group = self._Group_List.get_item_text(idx)
  77. self._Group_List.remove_item(idx)
  78. self._delete_group(group)
  79. self._populate_group_selector()
  80. self._populate_filter_menu()
  81. func _on_Dialog_changed_human_readable_text(did : int, new_text : String):
  82. self.set_dialog_property(did, "human_readable_description", new_text)
  83. self.emit_signal("changed_story")
  84. func _on_Dialog_checked(dialog):
  85. self._checked_dialogs.push_front(dialog)
  86. func _on_Dialog_edit_pressed(did : int):
  87. self.emit_signal("dialog_edit_pressed", self, did)
  88. func _on_Dialog_unchecked(dialog):
  89. self._checked_dialogs.erase(dialog)
  90. func _on_Filter_Menu_index_pressed(idx):
  91. var checked = self._Filter_Menu.get_popup().is_item_checked(idx)
  92. if not checked:
  93. self._Filter_Menu.get_popup().set_item_checked(idx, true)
  94. else:
  95. self._Filter_Menu.get_popup().set_item_checked(idx, false)
  96. self._update_filter()
  97. func _on_Group_Manager_BTN_toggled(button_pressed : bool):
  98. if button_pressed:
  99. self._Group_Manager_Panel.visible = true
  100. else:
  101. self._Group_Manager_Panel.visible = false
  102. func _on_Group_Selector_BTN_pressed():
  103. self._populate_group_selector()
  104. func _on_Load_CSV_BTN_pressed():
  105. self._Load_CSV.popup_centered_ratio(0.7)
  106. func _on_Load_CSV_file_selected(filepath : String):
  107. var csv_file = File.new()
  108. var status = csv_file.open(filepath, File.READ)
  109. if not status == OK:
  110. print_debug("EXP_Story_Editor: Error loading file \"" + filepath + "\".")
  111. return
  112. csv_file.get_csv_line()
  113. while not csv_file.eof_reached():
  114. var line = csv_file.get_csv_line()
  115. if line.empty():
  116. continue
  117. var did = int(line[0])
  118. var nid = int(line[1])
  119. var dialog = String(line[2])
  120. if not self._story.has(did):
  121. continue
  122. if not self._story[did]["nodes"].has(nid):
  123. continue
  124. self._story[did]["nodes"][nid]["text"] = dialog
  125. csv_file.close()
  126. func _on_Load_Story_BTN_pressed():
  127. self._Load_Story.popup_centered_ratio(0.7)
  128. func _on_Load_Story_file_selected(filename : String):
  129. var file_data = load(filename)
  130. if not file_data.TYPE == "EXP_Story_editor":
  131. return
  132. self._clear_story()
  133. self._load_data_from(file_data)
  134. self._Filename_LBL.text = filename.get_file()
  135. for group in self._groups:
  136. self._Group_List.add_item(group)
  137. self._populate_filter_menu()
  138. for did in self.get_dids():
  139. var new_dialog_record = _Dialog_Record.instance()
  140. self._Dialog_Record_Root.add_child(new_dialog_record)
  141. new_dialog_record.set_story_editor(self)
  142. new_dialog_record.connect("checked", self, "_on_Dialog_checked")
  143. new_dialog_record.connect("unchecked", self, "_on_Dialog_unchecked")
  144. new_dialog_record.connect("changed_human_readable_text", self,
  145. "_on_Dialog_changed_human_readable_text")
  146. new_dialog_record.connect("edit_pressed", self, "_on_Dialog_edit_pressed")
  147. new_dialog_record.connect("rename_pressed", self, "_on_Record_Rename_pressed")
  148. new_dialog_record.set_did(did)
  149. var human_readable_description = self.get_dialog_property(did, "human_readable_description")
  150. new_dialog_record.update_human_readable_description(human_readable_description)
  151. if self._story[did].has("name"):
  152. var record_name = self._story[did]["name"]
  153. new_dialog_record.set_record_name(record_name)
  154. func _on_New_Story_BTN_pressed():
  155. self._clear_story()
  156. func _on_Record_Rename_pressed(record):
  157. self._Record_Rename_Box.set_target_record(record)
  158. self._Record_Rename_Box.visible = true
  159. func _on_Remove_Group_BTN_pressed():
  160. var id = self._Group_Selector.get_selected_id()
  161. if id == -1:
  162. return
  163. var idx = self._Group_Selector.get_item_index(id)
  164. var group = self._Group_Selector.get_popup().get_item_text(idx)
  165. for record in self._checked_dialogs.duplicate():
  166. var did = record.get_did()
  167. self._dialog_remove_group(did, group)
  168. record.uncheck()
  169. self.emit_signal("changed_story")
  170. func _on_Rename_Box_Rename(rename : String):
  171. var record = self._Record_Rename_Box.get_target_record()
  172. var old_name = record.get_record_name()
  173. var record_did = record.get_did()
  174. if rename.empty() or rename == "NAME":
  175. record.set_record_name("NAME")
  176. self._story[record_did].erase("name")
  177. self._record_names.erase(old_name)
  178. return
  179. if self._record_names.has(rename):
  180. return
  181. self._record_names.erase(old_name)
  182. self._record_names[rename] = record_did
  183. self._story[record_did]["name"] = rename
  184. record.set_record_name(rename)
  185. func _on_Save_CSV_BTN_pressed():
  186. self._Save_CSV_As.popup_centered_ratio(0.7)
  187. func _on_Save_CVS_As_file_selected(filepath : String):
  188. var csv_file = File.new()
  189. var status = csv_file.open(filepath, File.WRITE)
  190. if not status == OK:
  191. print_debug("EXP_Story_Editor: Error saving csv file \"" + filepath + "\".")
  192. return
  193. csv_file.store_csv_line(["DID", "NID", "Dialog"], ",")
  194. for did in self._story.keys():
  195. for nid in self._story[did]["nodes"].keys():
  196. var dialog = self._story[did]["nodes"][nid]["text"]
  197. csv_file.store_csv_line([did, nid, dialog], ",")
  198. csv_file.close()
  199. func _on_Save_Story_As_file_selected(filename : String):
  200. self._save_data_to(filename)
  201. self._Filename_LBL.text = filename.get_file()
  202. func _on_Save_Story_BTN_pressed():
  203. self._Save_Story_As.popup_centered_ratio(0.7)
  204. func _on_Search_LineEdit_text_changed(new_text : String):
  205. self._update_filter()
  206. func _on_Search_OptionButton_item_selected(id):
  207. self._update_filter()
  208. func _on_story_menu_option_pressed(id):
  209. match id:
  210. 0:
  211. self._on_New_Story_BTN_pressed()
  212. 1:
  213. self._on_Load_Story_BTN_pressed()
  214. 2:
  215. self._on_Save_Story_BTN_pressed()
  216. 3:
  217. self._on_Bake_Story_BTN_pressed()
  218. 4:
  219. self._on_Save_CSV_BTN_pressed()
  220. 5:
  221. self._on_Load_CSV_BTN_pressed()
  222. func _on_Uncheck_All_BTN_pressed():
  223. var records = self._Dialog_Record_Root.get_children()
  224. for record in records:
  225. if record.visible:
  226. record.uncheck()
  227. #Public Methods
  228. func create_node(did : int, type : String) -> int:
  229. var new_nid = self._generate_nid(did)
  230. var node_data = {"type": type, "text": "", "graph_offset": Vector2(40, 40),
  231. "rect_size": Vector2(0,0) ,"links": {}, "slot_amount": 1}
  232. self._story[did]["nodes"][new_nid] = node_data
  233. return new_nid
  234. func dialog_get_groups(did : int):
  235. return self._story[did]["groups"]
  236. func erase_all_links(did: int, nid : int):
  237. self._story[did]["nodes"][nid]["links"].clear()
  238. func erase_dialog(did : int):
  239. self._story.erase(did)
  240. self._make_did_available(did)
  241. func erase_link(did : int, nid : int, slot : int):
  242. self._story[did]["nodes"][nid]["links"].erase(slot)
  243. func erase_node(did :int, nid :int):
  244. self._story[did]["nodes"].erase(nid)
  245. self._make_nid_available(did, nid)
  246. func get_dialog_property(did : int, property: String):
  247. return self._story[did][property]
  248. func get_dids():
  249. return self._story.keys()
  250. func get_link_slots(did : int, nid : int):
  251. return self._story[did]["nodes"][nid]["links"].keys()
  252. func get_nid_link_from(did : int, nid: int, slot : int):
  253. return self._story[did]["nodes"][nid]["links"][slot]
  254. func get_nids(did : int):
  255. return self._story[did]["nodes"].keys()
  256. func get_node_property(did : int, nid : int, property: String):
  257. return self._story[did]["nodes"][nid][property]
  258. func set_dialog_property(did : int, property : String , data):
  259. self._story[did][property] = data
  260. func set_link(did : int, this_nid : int, slot : int, that_nid : int):
  261. self._story[did]["nodes"][this_nid]["links"][slot] = that_nid
  262. func set_node_property(did : int, nid : int, property : String , data):
  263. self._story[did]["nodes"][nid][property] = data
  264. func set_node_slot_count(did : int, nid : int, amount : int):
  265. self._story[did]["nodes"][nid]["slot_amount"] = amount
  266. #Private Methods
  267. func _add_group():
  268. var new_group_name = self._New_Group_LineEdit.text
  269. if new_group_name == "" or self._groups.has(new_group_name):
  270. return
  271. self._groups.push_back(new_group_name)
  272. self._New_Group_LineEdit.text = ""
  273. self._Group_List.add_item(new_group_name)
  274. self._populate_filter_menu()
  275. var sort_list : Array
  276. for idx in range(self._Group_List.get_item_count()):
  277. var group = self._Group_List.get_item_text(idx)
  278. sort_list.push_back(group)
  279. sort_list.sort()
  280. self._Group_List.clear()
  281. for group in sort_list:
  282. self._Group_List.add_item(group)
  283. func _bake_data() :
  284. var baked_story = self._story.duplicate(true)
  285. for did in baked_story.keys():
  286. baked_story[did].erase("name")
  287. baked_story[did].erase("groups")
  288. baked_story[did].erase("available_nid")
  289. baked_story[did].erase("human_readable_description")
  290. for nid in baked_story[did]["nodes"].keys():
  291. baked_story[did]["nodes"][nid].erase("type")
  292. baked_story[did]["nodes"][nid].erase("graph_offset")
  293. baked_story[did]["nodes"][nid].erase("rect_size")
  294. baked_story[did]["nodes"][nid].erase("slot_amount")
  295. return baked_story.duplicate(true)
  296. func _bake_data_to(filename):
  297. var file_data
  298. if self._Dir.file_exists(filename):
  299. file_data = load(filename)
  300. if file_data.TYPE == "EXP_Baked_Story":
  301. file_data.story = self._bake_data()
  302. file_data.names = self._record_names.duplicate(true)
  303. ResourceSaver.save(filename, file_data)
  304. else:
  305. file_data = _EXP_Baked_Story.new()
  306. file_data.story = self._bake_data()
  307. file_data.names = self._record_names.duplicate(true)
  308. ResourceSaver.save(filename, file_data)
  309. func _clear_group_manager():
  310. self._groups.clear()
  311. for idx in range(self._Group_List.get_item_count()):
  312. self._Group_List.remove_item(0)
  313. self._populate_group_selector()
  314. self._Filter_Menu.get_popup().clear()
  315. func _clear_story():
  316. self._remove_all_records()
  317. self._clear_group_manager()
  318. self._populate_filter_menu()
  319. self._story.clear()
  320. self._available_dids.clear()
  321. self._checked_dialogs.clear()
  322. self._record_names.clear()
  323. self._Filename_LBL.text = "Unsaved Story"
  324. self.emit_signal("changed_story")
  325. func _create_dialog() -> int:
  326. var new_did = self._generate_did()
  327. var dialog_data = {"human_readable_description":
  328. "New Dialog - Enter Human Readable Description",
  329. "groups": [],
  330. "available_nid": [],
  331. "nodes": {}}
  332. self._story[new_did] = dialog_data
  333. return new_did
  334. func _create_dialog_record():
  335. var new_did = self._create_dialog()
  336. var new_dialog_record = _Dialog_Record.instance()
  337. self._Dialog_Record_Root.add_child(new_dialog_record)
  338. new_dialog_record.set_story_editor(self)
  339. new_dialog_record.connect("checked", self, "_on_Dialog_checked")
  340. new_dialog_record.connect("unchecked", self, "_on_Dialog_unchecked")
  341. new_dialog_record.connect("changed_human_readable_text", self,
  342. "_on_Dialog_changed_human_readable_text")
  343. new_dialog_record.connect("edit_pressed", self, "_on_Dialog_edit_pressed")
  344. new_dialog_record.connect("rename_pressed", self, "_on_Record_Rename_pressed")
  345. new_dialog_record.set_did(new_did)
  346. new_dialog_record.update_human_readable_description(
  347. "New Dialog - Enter Human Readable Description.")
  348. func _create_rename_box():
  349. self._Record_Rename_Box = _Record_Rename_Box_TSCN.instance()
  350. self._Record_Rename_Box.connect("rename_BTN_pressed", self, "_on_Rename_Box_Rename")
  351. self.add_child(self._Record_Rename_Box)
  352. func _delete_checked_dialogs():
  353. for dialog in self._checked_dialogs:
  354. self._delete_dialog(dialog)
  355. self._checked_dialogs.clear()
  356. self.emit_signal("changed_story")
  357. func _delete_dialog(dialog):
  358. var did = dialog.get_did()
  359. self.erase_dialog(did)
  360. self._remove_record(dialog)
  361. func _delete_group(group):
  362. self._groups.erase(group)
  363. self._remove_group_from_story(group)
  364. func _dialog_apply_group(did : int, group : String):
  365. if not self._story[did]["groups"].has(group):
  366. self._story[did]["groups"].push_back(group)
  367. func _dialog_remove_group(did : int, group : String):
  368. if self._story[did]["groups"].has(group):
  369. self._story[did]["groups"].erase(group)
  370. func _generate_did() -> int:
  371. if not self._available_dids.empty():
  372. return self._available_dids.pop_front()
  373. else:
  374. return self._story.size() + 1
  375. func _generate_nid(did : int) -> int:
  376. if not self._story[did]["available_nid"].empty():
  377. return self._story[did]["available_nid"].pop_front()
  378. else:
  379. return self._story[did]["nodes"].size() + 1
  380. func _load_data_from(new_story):
  381. self._story = new_story.story.duplicate(true)
  382. self._available_dids = new_story.available_dids.duplicate(true)
  383. self._groups = new_story.groups.duplicate(true)
  384. self._record_names = new_story.names.duplicate(true)
  385. func _make_did_available(did : int):
  386. self._available_dids.push_front(did)
  387. self._available_dids.sort()
  388. func _make_nid_available(did : int, nid : int):
  389. self._story[did]["available_nid"].push_front(nid)
  390. self._story[did]["available_nid"].sort()
  391. func _make_records_visible():
  392. var children = self._Dialog_Record_Root.get_children()
  393. for child in children:
  394. child.visible = true
  395. func _populate_filter_menu():
  396. self._Filter_Menu.get_popup().clear()
  397. self._Filter_Menu.get_popup().add_check_item("-No Tags-")
  398. for group in self._groups:
  399. self._Filter_Menu.get_popup().add_check_item(group)
  400. for idx in range(self._Filter_Menu.get_popup().get_item_count()):
  401. self._Filter_Menu.get_popup().set_item_checked(idx, true)
  402. func _populate_group_selector():
  403. self._Group_Selector.clear()
  404. self._Group_Selector.text = "Tags"
  405. for group in self._groups:
  406. self._Group_Selector.get_popup().add_item(group)
  407. func _populate_searchby_menu():
  408. self._Search_Option_BTN.clear()
  409. self._Search_Option_BTN.get_popup().add_item("Human Readable LBL", 0)
  410. self._Search_Option_BTN.get_popup().add_item("DID", 1)
  411. self._Search_Option_BTN.get_popup().add_item("Record Name", 2)
  412. self._Search_Option_BTN.select(0)
  413. func _populate_story_menu():
  414. self._Story_Menu.get_popup().clear()
  415. self._Story_Menu.get_popup().add_item("New Story", 0)
  416. self._Story_Menu.get_popup().add_item("Load Story", 1)
  417. self._Story_Menu.get_popup().add_item("Save Story As", 2)
  418. self._Story_Menu.get_popup().add_item("Bake Story As", 3)
  419. self._Story_Menu.get_popup().add_item("Save CSV As", 4)
  420. self._Story_Menu.get_popup().add_item("Load CSV", 5)
  421. self._Story_Menu.get_popup().connect("id_pressed", self, "_on_story_menu_option_pressed")
  422. func _remove_all_records():
  423. var dialog_records = self._Dialog_Record_Root.get_children()
  424. for record in dialog_records:
  425. self._remove_record(record)
  426. func _remove_group_from_story(group : String):
  427. for did in self._story:
  428. if self._story[did]["groups"].has(group):
  429. self._story[did]["groups"].erase(group)
  430. func _remove_record(dialog_record):
  431. dialog_record.disconnect("checked", self, "_on_Dialog_checked")
  432. dialog_record.disconnect("unchecked", self, "_on_Dialog_unchecked")
  433. dialog_record.disconnect("changed_human_readable_text", self,
  434. "_on_Dialog_changed_human_readable_text")
  435. dialog_record.disconnect("rename_pressed", self, "_on_Record_Rename_pressed")
  436. var record_name = dialog_record.get_record_name()
  437. if not record_name == "NAME":
  438. self._record_names.erase(record_name)
  439. dialog_record.free()
  440. func _save_data_to(filename):
  441. var file_data
  442. if self._Dir.file_exists(filename):
  443. file_data = load(filename)
  444. if file_data.TYPE == "EXP_Story_editor":
  445. file_data.names = self._record_names.duplicate(true)
  446. file_data.story = self._story.duplicate(true)
  447. file_data.available_dids = self._available_dids.duplicate(true)
  448. file_data.groups = self._groups.duplicate(true)
  449. ResourceSaver.save(filename, file_data)
  450. else:
  451. file_data = _EXP_Story.new()
  452. file_data.names = self._record_names.duplicate(true)
  453. file_data.story = self._story.duplicate(true)
  454. file_data.available_dids = self._available_dids.duplicate(true)
  455. file_data.groups = self._groups.duplicate(true)
  456. ResourceSaver.save(filename, file_data)
  457. func _setup_dialogs():
  458. self._Load_Story = EditorFileDialog.new()
  459. self._Load_Story.mode = EditorFileDialog.MODE_OPEN_FILE
  460. self._Load_Story.add_filter("*.tres ; Story files")
  461. self._Load_Story.resizable = true
  462. self._Load_Story.access = EditorFileDialog.ACCESS_RESOURCES
  463. self._Load_Story.current_dir = "res://"
  464. self._Load_Story.connect("file_selected", self, "_on_Load_Story_file_selected")
  465. self.add_child(self._Load_Story)
  466. self._Save_Story_As = EditorFileDialog.new()
  467. self._Save_Story_As.mode = EditorFileDialog.MODE_SAVE_FILE
  468. self._Save_Story_As.add_filter("*.tres ; Story files")
  469. self._Save_Story_As.resizable = true
  470. self._Save_Story_As.access = EditorFileDialog.ACCESS_RESOURCES
  471. self._Save_Story_As.current_dir = "res://"
  472. self._Save_Story_As.connect("file_selected", self, "_on_Save_Story_As_file_selected")
  473. self.add_child(self._Save_Story_As)
  474. self._Bake_Story_As = EditorFileDialog.new()
  475. self._Bake_Story_As.mode = EditorFileDialog.MODE_SAVE_FILE
  476. self._Bake_Story_As.add_filter("*.tres ; Baked Story files")
  477. self._Bake_Story_As.resizable = true
  478. self._Bake_Story_As.access = EditorFileDialog.ACCESS_RESOURCES
  479. self._Bake_Story_As.current_dir = "res://"
  480. self._Bake_Story_As.connect("file_selected", self, "_on_Bake_Story_As_file_selected")
  481. self.add_child(self._Bake_Story_As)
  482. self._Save_CSV_As = EditorFileDialog.new()
  483. self._Save_CSV_As.mode = EditorFileDialog.MODE_SAVE_FILE
  484. self._Save_CSV_As.add_filter("*.csv ; CSV files")
  485. self._Save_CSV_As.resizable = true
  486. self._Save_CSV_As.access = EditorFileDialog.ACCESS_FILESYSTEM
  487. self._Save_CSV_As.current_dir = "res://"
  488. self._Save_CSV_As.connect("file_selected", self, "_on_Save_CVS_As_file_selected")
  489. self.add_child(self._Save_CSV_As)
  490. self._Load_CSV = EditorFileDialog.new()
  491. self._Load_CSV .mode = EditorFileDialog.MODE_OPEN_FILE
  492. self._Load_CSV .add_filter("*.csv ; CSV files")
  493. self._Load_CSV .resizable = true
  494. self._Load_CSV .access = EditorFileDialog.ACCESS_FILESYSTEM
  495. self._Load_CSV .current_dir = "res://"
  496. self._Load_CSV .connect("file_selected", self, "_on_Load_CSV_file_selected")
  497. self.add_child(self._Load_CSV)
  498. func _update_filter():
  499. var new_text = self._Search_LineEdit.text
  500. self._make_records_visible()
  501. var filter_groups : Array
  502. for idx in range(self._Filter_Menu.get_popup().get_item_count()):
  503. if self._Filter_Menu.get_popup().is_item_checked(idx):
  504. var group = self._Filter_Menu.get_popup().get_item_text(idx)
  505. filter_groups.push_back(group)
  506. var children = self._Dialog_Record_Root.get_children()
  507. var search_option = self._Search_Option_BTN.selected
  508. match search_option:
  509. 0: #Human Readable Search
  510. for child in children:
  511. var did = child.get_did()
  512. var human_readable_description = self.get_dialog_property(did, "human_readable_description")
  513. if human_readable_description.find(new_text) == -1 and not new_text.empty():
  514. child.visible = false
  515. else:
  516. child.visible = false
  517. if self._Filter_Menu.get_popup().get_item_count() == 0:
  518. child.visible = true
  519. var dialog_groups = self.dialog_get_groups(did)
  520. if dialog_groups.empty() and filter_groups.has("-No Tags-"):
  521. child.visible = true
  522. for group in dialog_groups:
  523. if filter_groups.has(group):
  524. child.visible = true
  525. 1: #DID Search
  526. for child in children:
  527. var did = child.get_did()
  528. if not new_text == str(did) and not new_text.empty():
  529. child.visible = false
  530. else:
  531. child.visible = false
  532. if self._Filter_Menu.get_popup().get_item_count() == 0:
  533. child.visible = true
  534. var dialog_groups = self.dialog_get_groups(did)
  535. if dialog_groups.empty() and filter_groups.has("-No Tags-"):
  536. child.visible = true
  537. for group in dialog_groups:
  538. if filter_groups.has(group):
  539. child.visible = true
  540. 2: #Record Name Search
  541. for child in children:
  542. var did = child.get_did()
  543. var record_name = child.get_record_name()
  544. if record_name.find(new_text) == -1 and not new_text.empty():
  545. child.visible = false
  546. else:
  547. child.visible = false
  548. if self._Filter_Menu.get_popup().get_item_count() == 0:
  549. child.visible = true
  550. var dialog_groups = self.dialog_get_groups(did)
  551. if dialog_groups.empty() and filter_groups.has("-No Tags-"):
  552. child.visible = true
  553. for group in dialog_groups:
  554. if filter_groups.has(group):
  555. child.visible = true