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.

MasterTree.gd 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. tool
  2. extends Tree
  3. onready var editor_reference = get_node('../../../')
  4. onready var timeline_editor = get_node('../../TimelineEditor')
  5. onready var character_editor = get_node('../../CharacterEditor')
  6. onready var definition_editor = get_node('../../DefinitionEditor')
  7. onready var settings_editor = get_node('../../SettingsEditor')
  8. onready var theme_editor = get_node('../../ThemeEditor')
  9. onready var empty_editor = get_node('../../Empty')
  10. onready var filter_tree_edit = get_node('../FilterMasterTreeEdit')
  11. onready var tree = self
  12. var timeline_icon
  13. var character_icon
  14. var theme_icon
  15. var definition_icon
  16. var glossary_icon
  17. var timelines_tree
  18. var characters_tree
  19. var definitions_tree
  20. var themes_tree
  21. var settings_tree
  22. var filter_tree_term = ''
  23. signal editor_selected(selected)
  24. func _ready():
  25. allow_rmb_select = true
  26. var root = tree.create_item()
  27. tree.set_hide_root(true)
  28. var modifier = ''
  29. var _scale = get_constant("inspector_margin", "Editor")
  30. _scale = _scale * 0.125
  31. rect_min_size.x = 150
  32. if _scale == 1.25:
  33. modifier = '-1.25'
  34. rect_min_size.x = 180
  35. if _scale == 1.5:
  36. modifier = '-1.25'
  37. rect_min_size.x = 250
  38. if _scale == 1.75:
  39. modifier = '-1.25'
  40. rect_min_size.x = 250
  41. if _scale == 2:
  42. modifier = '-2'
  43. rect_min_size.x = 360
  44. rect_size.x = 0
  45. timeline_icon = load("res://addons/dialogic/Images/Resources/timeline" + modifier + ".svg")
  46. character_icon = load("res://addons/dialogic/Images/Resources/character" + modifier + ".svg")
  47. theme_icon = load("res://addons/dialogic/Images/Resources/theme" + modifier + ".svg")
  48. definition_icon = load("res://addons/dialogic/Images/Resources/definition" + modifier + ".svg")
  49. glossary_icon = load("res://addons/dialogic/Images/Resources/glossary" + modifier + ".svg")
  50. # Creating the parents
  51. timelines_tree = tree.create_item(root)
  52. timelines_tree.set_selectable(0, false)
  53. timelines_tree.set_text(0, "Timelines")
  54. timelines_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  55. characters_tree = tree.create_item(root)
  56. characters_tree.set_selectable(0, false)
  57. characters_tree.set_text(0, "Characters")
  58. characters_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  59. definitions_tree = tree.create_item(root)
  60. definitions_tree.set_selectable(0, false)
  61. definitions_tree.set_text(0, "Definitions")
  62. definitions_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  63. themes_tree = tree.create_item(root)
  64. themes_tree.set_selectable(0, false)
  65. themes_tree.set_text(0, "Themes")
  66. themes_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  67. settings_tree = tree.create_item(root)
  68. settings_tree.set_selectable(0, true)
  69. settings_tree.set_text(0, "Settings")
  70. settings_tree.set_icon(0, get_icon("GDScript", "EditorIcons"))
  71. settings_tree.set_metadata(0, {'editor': 'Settings'})
  72. connect('item_selected', self, '_on_item_selected')
  73. connect('item_rmb_selected', self, '_on_item_rmb_selected')
  74. connect('gui_input', self, '_on_gui_input')
  75. connect('item_edited', self, '_on_item_edited')
  76. $RenamerReset.connect("timeout", self, '_on_renamer_reset_timeout')
  77. filter_tree_edit.connect("text_changed", self, '_on_filter_tree_edit_changed')
  78. #var subchild1 = tree.create_item(timelines_tree)
  79. #subchild1.set_text(0, "Subchild1")
  80. # Adding timelines
  81. build_timelines()
  82. # Adding characters
  83. build_characters()
  84. # Adding Definitions
  85. build_definitions()
  86. # Adding Themes
  87. build_themes()
  88. # Default empty screen.
  89. hide_all_editors()
  90. # AutoSave timer
  91. $AutoSave.connect("timeout", self, '_on_autosave_timeout')
  92. $AutoSave.start(0.5)
  93. func _clear_tree_children(parent: TreeItem):
  94. while parent.get_children() != null:
  95. parent.get_children().free()
  96. func build_timelines(selected_item: String=''):
  97. _clear_tree_children(timelines_tree)
  98. for t in DialogicUtil.get_sorted_timeline_list():
  99. if (filter_tree_term != ''):
  100. if (filter_tree_term.to_lower() in t['file'].to_lower() or filter_tree_term.to_lower() in t['name'].to_lower()):
  101. _add_timeline(t, not selected_item.empty() and t['file'] == selected_item)
  102. else:
  103. _add_timeline(t, not selected_item.empty() and t['file'] == selected_item)
  104. # force redraw control
  105. update()
  106. func _add_timeline(timeline, select = false):
  107. var item = tree.create_item(timelines_tree)
  108. item.set_icon(0, timeline_icon)
  109. if timeline.has('name'):
  110. item.set_text(0, timeline['name'])
  111. else:
  112. item.set_text(0, timeline['file'])
  113. timeline['editor'] = 'Timeline'
  114. item.set_metadata(0, timeline)
  115. if not get_constant("dark_theme", "Editor"):
  116. item.set_icon_modulate(0, get_color("property_color", "Editor"))
  117. #item.set_editable(0, true)
  118. if select: # Auto selecting
  119. item.select(0)
  120. func build_themes(selected_item: String=''):
  121. _clear_tree_children(themes_tree)
  122. for t in DialogicUtil.get_sorted_theme_list():
  123. if (filter_tree_term != ''):
  124. if (filter_tree_term.to_lower() in t['file'].to_lower() or filter_tree_term.to_lower() in t['name'].to_lower()):
  125. _add_theme(t, not selected_item.empty() and t['file'] == selected_item)
  126. else:
  127. _add_theme(t, not selected_item.empty() and t['file'] == selected_item)
  128. # force redraw tree
  129. update()
  130. func _add_theme(theme_item, select = false):
  131. var item = tree.create_item(themes_tree)
  132. item.set_icon(0, theme_icon)
  133. item.set_text(0, theme_item['name'])
  134. theme_item['editor'] = 'Theme'
  135. item.set_metadata(0, theme_item)
  136. if not get_constant("dark_theme", "Editor"):
  137. item.set_icon_modulate(0, get_color("property_color", "Editor"))
  138. if select: # Auto selecting
  139. item.select(0)
  140. func build_characters(selected_item: String=''):
  141. _clear_tree_children(characters_tree)
  142. for t in DialogicUtil.get_sorted_character_list():
  143. if (filter_tree_term != ''):
  144. if (filter_tree_term.to_lower() in t['file'].to_lower() or filter_tree_term.to_lower() in t['name'].to_lower()):
  145. _add_character(t, not selected_item.empty() and t['file'] == selected_item)
  146. else:
  147. _add_character(t, not selected_item.empty() and t['file'] == selected_item)
  148. # force redraw tree
  149. update()
  150. func _add_character(character, select = false):
  151. var item = tree.create_item(characters_tree)
  152. item.set_icon(0, character_icon)
  153. if character.has('name'):
  154. item.set_text(0, character['name'])
  155. else:
  156. item.set_text(0, character['file'])
  157. character['editor'] = 'Character'
  158. item.set_metadata(0, character)
  159. #item.set_editable(0, true)
  160. if character.has('color'):
  161. item.set_icon_modulate(0, character['color'])
  162. # Auto selecting
  163. if select:
  164. item.select(0)
  165. func build_definitions(selected_item: String=''):
  166. _clear_tree_children(definitions_tree)
  167. for t in DialogicUtil.get_sorted_default_definitions_list():
  168. if (filter_tree_term != ''):
  169. if (filter_tree_term.to_lower() in t['name'].to_lower()):
  170. _add_definition(t, not selected_item.empty() and t['id'] == selected_item)
  171. else:
  172. _add_definition(t, not selected_item.empty() and t['id'] == selected_item)
  173. # force redraw tree
  174. update()
  175. func _add_definition(definition, select = false):
  176. var item = tree.create_item(definitions_tree)
  177. item.set_text(0, definition['name'])
  178. item.set_icon(0, definition_icon)
  179. if definition['type'] == 1:
  180. item.set_icon(0, glossary_icon)
  181. definition['editor'] = 'Definition'
  182. item.set_metadata(0, definition)
  183. if not get_constant("dark_theme", "Editor"):
  184. item.set_icon_modulate(0, get_color("property_color", "Editor"))
  185. if select: # Auto selecting
  186. item.select(0)
  187. func _on_item_selected():
  188. # TODO: Ideally I would perform a "save" here before opening the next
  189. # resource. Unfortunately there has been so many bugs doing that
  190. # that I'll revisit it in the future.
  191. # save_current_resource()
  192. var item = get_selected()
  193. var metadata = item.get_metadata(0)
  194. if metadata['editor'] == 'Timeline':
  195. timeline_editor.load_timeline(metadata['file'])
  196. show_timeline_editor()
  197. if metadata['editor'] == 'Character':
  198. if not character_editor.is_selected(metadata['file']):
  199. character_editor.load_character(metadata['file'])
  200. show_character_editor()
  201. if metadata['editor'] == 'Definition':
  202. if not definition_editor.is_selected(metadata['id']):
  203. definition_editor.visible = true
  204. definition_editor.load_definition(metadata['id'])
  205. show_definition_editor()
  206. if metadata['editor'] == 'Theme':
  207. theme_editor.load_theme(metadata['file'])
  208. show_theme_editor()
  209. if metadata['editor'] == 'Settings':
  210. settings_editor.update_data()
  211. show_settings_editor()
  212. func show_character_editor():
  213. emit_signal("editor_selected", 'character')
  214. character_editor.visible = true
  215. timeline_editor.visible = false
  216. definition_editor.visible = false
  217. theme_editor.visible = false
  218. settings_editor.visible = false
  219. empty_editor.visible = false
  220. func show_timeline_editor():
  221. emit_signal("editor_selected", 'timeline')
  222. character_editor.visible = false
  223. timeline_editor.visible = true
  224. definition_editor.visible = false
  225. theme_editor.visible = false
  226. settings_editor.visible = false
  227. empty_editor.visible = false
  228. func show_definition_editor():
  229. emit_signal("editor_selected", 'definition')
  230. character_editor.visible = false
  231. timeline_editor.visible = false
  232. definition_editor.visible = true
  233. theme_editor.visible = false
  234. settings_editor.visible = false
  235. empty_editor.visible = false
  236. func show_theme_editor():
  237. emit_signal("editor_selected", 'theme')
  238. character_editor.visible = false
  239. timeline_editor.visible = false
  240. definition_editor.visible = false
  241. theme_editor.visible = true
  242. settings_editor.visible = false
  243. empty_editor.visible = false
  244. func show_settings_editor():
  245. emit_signal("editor_selected", 'theme')
  246. character_editor.visible = false
  247. timeline_editor.visible = false
  248. definition_editor.visible = false
  249. theme_editor.visible = false
  250. settings_editor.visible = true
  251. empty_editor.visible = false
  252. func hide_all_editors():
  253. emit_signal("editor_selected", 'none')
  254. character_editor.visible = false
  255. timeline_editor.visible = false
  256. definition_editor.visible = false
  257. theme_editor.visible = false
  258. settings_editor.visible = false
  259. empty_editor.visible = true
  260. func _on_item_rmb_selected(position):
  261. var item = get_selected().get_metadata(0)
  262. if item['editor'] == 'Timeline':
  263. editor_reference.get_node('TimelinePopupMenu').rect_position = get_viewport().get_mouse_position()
  264. editor_reference.get_node('TimelinePopupMenu').popup()
  265. if item['editor'] == 'Character':
  266. editor_reference.get_node("CharacterPopupMenu").rect_position = get_viewport().get_mouse_position()
  267. editor_reference.get_node("CharacterPopupMenu").popup()
  268. if item['editor'] == 'Theme':
  269. editor_reference.get_node("ThemePopupMenu").rect_position = get_viewport().get_mouse_position()
  270. editor_reference.get_node("ThemePopupMenu").popup()
  271. if item['editor'] == 'Definition':
  272. editor_reference.get_node("DefinitionPopupMenu").rect_position = get_viewport().get_mouse_position()
  273. editor_reference.get_node("DefinitionPopupMenu").popup()
  274. func remove_selected():
  275. var item = get_selected()
  276. item.free()
  277. timelines_tree.select(0)
  278. settings_editor.update_data()
  279. func refresh_timeline_list():
  280. #print('update timeline list')
  281. pass
  282. func _on_renamer_reset_timeout():
  283. get_selected().set_editable(0, false)
  284. func _on_gui_input(event):
  285. if event is InputEventMouseButton and event.button_index == 1:
  286. if event.is_pressed() and event.doubleclick:
  287. var item = get_selected()
  288. var metadata = item.get_metadata(0)
  289. item.set_editable(0, true)
  290. $RenamerReset.start(0.5)
  291. func _on_item_edited():
  292. var item = get_selected()
  293. var metadata = item.get_metadata(0)
  294. if metadata['editor'] == 'Timeline':
  295. timeline_editor.timeline_name = item.get_text(0)
  296. save_current_resource()
  297. build_timelines(metadata['file'])
  298. if metadata['editor'] == 'Theme':
  299. DialogicResources.set_theme_value(metadata['file'], 'settings', 'name', item.get_text(0))
  300. build_themes(metadata['file'])
  301. if metadata['editor'] == 'Character':
  302. character_editor.nodes['name'].text = item.get_text(0)
  303. save_current_resource()
  304. build_characters(metadata['file'])
  305. if metadata['editor'] == 'Definition':
  306. definition_editor.nodes['name'].text = item.get_text(0)
  307. # Not sure why this signal doesn't triggers
  308. definition_editor._on_name_changed(item.get_text(0))
  309. save_current_resource()
  310. build_definitions(metadata['id'])
  311. func _on_autosave_timeout():
  312. save_current_resource()
  313. func _on_filter_tree_edit_changed(value):
  314. filter_tree_term = value
  315. build_timelines()
  316. build_themes()
  317. build_characters()
  318. build_definitions()
  319. func save_current_resource():
  320. var root = get_node('../..') # This is the same as the editor_reference
  321. if root.visible: #Only save if the editor is open
  322. var item: TreeItem = get_selected()
  323. var metadata: Dictionary
  324. if item != null:
  325. metadata = item.get_metadata(0)
  326. if metadata['editor'] == 'Timeline':
  327. timeline_editor.save_timeline()
  328. if metadata['editor'] == 'Character':
  329. character_editor.save_character()
  330. if metadata['editor'] == 'Definition':
  331. definition_editor.save_definition()
  332. # Note: Theme files auto saves on change
  333. func select_timeline_item(timeline_name):
  334. if (timeline_name == ''):
  335. return
  336. var main_item = tree.get_root().get_children()
  337. # wow, godots tree traversal is extremly odd, or I just don't get it
  338. while (main_item):
  339. if (main_item == null):
  340. break
  341. if (main_item.has_method("get_text") && main_item.get_text(0) == "Timelines"):
  342. var item = main_item.get_children()
  343. while (item):
  344. if (not item.has_method("get_metadata")):
  345. item = item.get_next()
  346. continue
  347. var meta = item.get_metadata(0)
  348. if (meta == null):
  349. item = item.get_next()
  350. continue
  351. if (not meta.has("editor") or meta["editor"] != "Timeline"):
  352. item = item.get_next()
  353. continue
  354. # search for filename
  355. if (meta.has("file") and meta["file"] == timeline_name):
  356. # select this one
  357. item.select(0)
  358. return;
  359. # search for name
  360. if (meta.has("name") and meta["name"] == timeline_name):
  361. # select this one
  362. item.select(0)
  363. return;
  364. item = item.get_next()
  365. break
  366. else:
  367. main_item = main_item.get_next()
  368. # fallback
  369. hide_all_editors()
  370. pass