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 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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 tree = self
  11. var timeline_icon = load("res://addons/dialogic/Images/timeline.svg")
  12. var character_icon = load("res://addons/dialogic/Images/character.svg")
  13. var timelines_tree
  14. var characters_tree
  15. var definitions_tree
  16. var themes_tree
  17. var settings_tree
  18. signal editor_selected(selected)
  19. func _ready():
  20. allow_rmb_select = true
  21. var root = tree.create_item()
  22. tree.set_hide_root(true)
  23. # Creating the parents
  24. timelines_tree = tree.create_item(root)
  25. timelines_tree.set_selectable(0, false)
  26. timelines_tree.set_text(0, "Timelines")
  27. #timelines_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  28. characters_tree = tree.create_item(root)
  29. characters_tree.set_selectable(0, false)
  30. characters_tree.set_text(0, "Characters")
  31. #characters_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  32. definitions_tree = tree.create_item(root)
  33. definitions_tree.set_selectable(0, false)
  34. definitions_tree.set_text(0, "Definitions")
  35. #definitions_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  36. themes_tree = tree.create_item(root)
  37. themes_tree.set_selectable(0, false)
  38. themes_tree.set_text(0, "Themes")
  39. #themes_tree.set_icon(0, get_icon("Folder", "EditorIcons"))
  40. settings_tree = tree.create_item(root)
  41. settings_tree.set_selectable(0, true)
  42. settings_tree.set_text(0, "Settings")
  43. settings_tree.set_icon(0, get_icon("GDScript", "EditorIcons"))
  44. settings_tree.set_metadata(0, {'editor': 'Settings'})
  45. connect('item_selected', self, '_on_item_selected')
  46. connect('item_rmb_selected', self, '_on_item_rmb_selected')
  47. connect('gui_input', self, '_on_gui_input')
  48. connect('item_edited', self, '_on_item_edited')
  49. $RenamerReset.connect("timeout", self, '_on_renamer_reset_timeout')
  50. #var subchild1 = tree.create_item(timelines_tree)
  51. #subchild1.set_text(0, "Subchild1")
  52. # Adding timelines
  53. build_timelines()
  54. # Adding characters
  55. build_characters()
  56. # Adding Definitions
  57. build_definitions()
  58. # Adding Themes
  59. build_themes()
  60. # Default empty screen.
  61. hide_all_editors()
  62. # AutoSave timer
  63. $AutoSave.connect("timeout", self, '_on_autosave_timeout')
  64. $AutoSave.start(0.5)
  65. func _clear_tree_children(parent: TreeItem):
  66. while parent.get_children() != null:
  67. parent.get_children().free()
  68. func build_timelines(selected_item: String=''):
  69. _clear_tree_children(timelines_tree)
  70. for t in DialogicUtil.get_sorted_timeline_list():
  71. _add_timeline(t, not selected_item.empty() and t['file'] == selected_item)
  72. func _add_timeline(timeline, select = false):
  73. var item = tree.create_item(timelines_tree)
  74. item.set_icon(0, timeline_icon)
  75. if timeline.has('name'):
  76. item.set_text(0, timeline['name'])
  77. else:
  78. item.set_text(0, timeline['file'])
  79. timeline['editor'] = 'Timeline'
  80. item.set_metadata(0, timeline)
  81. #item.set_editable(0, true)
  82. if select: # Auto selecting
  83. item.select(0)
  84. func build_themes(selected_item: String=''):
  85. _clear_tree_children(themes_tree)
  86. for t in DialogicUtil.get_sorted_theme_list():
  87. _add_theme(t, not selected_item.empty() and t['file'] == selected_item)
  88. func _add_theme(theme_item, select = false):
  89. var item = tree.create_item(themes_tree)
  90. item.set_icon(0, get_icon("StyleBoxTexture", "EditorIcons"))
  91. item.set_text(0, theme_item['name'])
  92. theme_item['editor'] = 'Theme'
  93. item.set_metadata(0, theme_item)
  94. #item.set_editable(0, true)
  95. if select: # Auto selecting
  96. item.select(0)
  97. func build_characters(selected_item: String=''):
  98. _clear_tree_children(characters_tree)
  99. for t in DialogicUtil.get_sorted_character_list():
  100. _add_character(t, not selected_item.empty() and t['file'] == selected_item)
  101. func _add_character(character, select = false):
  102. var item = tree.create_item(characters_tree)
  103. item.set_icon(0, character_icon)
  104. if character.has('name'):
  105. item.set_text(0, character['name'])
  106. else:
  107. item.set_text(0, character['file'])
  108. character['editor'] = 'Character'
  109. item.set_metadata(0, character)
  110. #item.set_editable(0, true)
  111. if character.has('color'):
  112. item.set_icon_modulate(0, character['color'])
  113. # Auto selecting
  114. if select:
  115. item.select(0)
  116. func build_definitions(selected_item: String=''):
  117. _clear_tree_children(definitions_tree)
  118. for t in DialogicUtil.get_sorted_default_definitions_list():
  119. _add_definition(t, not selected_item.empty() and t['id'] == selected_item)
  120. func _add_definition(definition, select = false):
  121. var item = tree.create_item(definitions_tree)
  122. item.set_text(0, definition['name'])
  123. item.set_icon(0, get_icon("Variant", "EditorIcons"))
  124. if definition['type'] == 1:
  125. item.set_icon(0, get_icon("ScriptCreateDialog", "EditorIcons"))
  126. definition['editor'] = 'Definition'
  127. item.set_metadata(0, definition)
  128. if select: # Auto selecting
  129. item.select(0)
  130. func _on_item_selected():
  131. # TODO: Ideally I would perform a "save" here before opening the next
  132. # resource. Unfortunately there has been so many bugs doing that
  133. # that I'll revisit it in the future.
  134. # save_current_resource()
  135. var item = get_selected()
  136. var metadata = item.get_metadata(0)
  137. if metadata['editor'] == 'Timeline':
  138. timeline_editor.load_timeline(metadata['file'])
  139. show_timeline_editor()
  140. if metadata['editor'] == 'Character':
  141. if not character_editor.is_selected(metadata['file']):
  142. character_editor.load_character(metadata['file'])
  143. show_character_editor()
  144. if metadata['editor'] == 'Definition':
  145. if not definition_editor.is_selected(metadata['id']):
  146. definition_editor.visible = true
  147. definition_editor.load_definition(metadata['id'])
  148. show_definition_editor()
  149. if metadata['editor'] == 'Theme':
  150. theme_editor.load_theme(metadata['file'])
  151. show_theme_editor()
  152. if metadata['editor'] == 'Settings':
  153. settings_editor.update_data()
  154. show_settings_editor()
  155. func show_character_editor():
  156. emit_signal("editor_selected", 'character')
  157. character_editor.visible = true
  158. timeline_editor.visible = false
  159. definition_editor.visible = false
  160. theme_editor.visible = false
  161. settings_editor.visible = false
  162. empty_editor.visible = false
  163. func show_timeline_editor():
  164. emit_signal("editor_selected", 'timeline')
  165. character_editor.visible = false
  166. timeline_editor.visible = true
  167. definition_editor.visible = false
  168. theme_editor.visible = false
  169. settings_editor.visible = false
  170. empty_editor.visible = false
  171. func show_definition_editor():
  172. emit_signal("editor_selected", 'definition')
  173. character_editor.visible = false
  174. timeline_editor.visible = false
  175. definition_editor.visible = true
  176. theme_editor.visible = false
  177. settings_editor.visible = false
  178. empty_editor.visible = false
  179. func show_theme_editor():
  180. emit_signal("editor_selected", 'theme')
  181. character_editor.visible = false
  182. timeline_editor.visible = false
  183. definition_editor.visible = false
  184. theme_editor.visible = true
  185. settings_editor.visible = false
  186. empty_editor.visible = false
  187. func show_settings_editor():
  188. emit_signal("editor_selected", 'theme')
  189. character_editor.visible = false
  190. timeline_editor.visible = false
  191. definition_editor.visible = false
  192. theme_editor.visible = false
  193. settings_editor.visible = true
  194. empty_editor.visible = false
  195. func hide_all_editors():
  196. emit_signal("editor_selected", 'none')
  197. character_editor.visible = false
  198. timeline_editor.visible = false
  199. definition_editor.visible = false
  200. theme_editor.visible = false
  201. settings_editor.visible = false
  202. empty_editor.visible = true
  203. func _on_item_rmb_selected(position):
  204. var item = get_selected().get_metadata(0)
  205. if item['editor'] == 'Timeline':
  206. editor_reference.get_node('TimelinePopupMenu').rect_position = get_viewport().get_mouse_position()
  207. editor_reference.get_node('TimelinePopupMenu').popup()
  208. if item['editor'] == 'Character':
  209. editor_reference.get_node("CharacterPopupMenu").rect_position = get_viewport().get_mouse_position()
  210. editor_reference.get_node("CharacterPopupMenu").popup()
  211. if item['editor'] == 'Theme':
  212. editor_reference.get_node("ThemePopupMenu").rect_position = get_viewport().get_mouse_position()
  213. editor_reference.get_node("ThemePopupMenu").popup()
  214. if item['editor'] == 'Definition':
  215. editor_reference.get_node("DefinitionPopupMenu").rect_position = get_viewport().get_mouse_position()
  216. editor_reference.get_node("DefinitionPopupMenu").popup()
  217. func remove_selected():
  218. var item = get_selected()
  219. item.free()
  220. timelines_tree.select(0)
  221. settings_editor.update_data()
  222. func refresh_timeline_list():
  223. print('update timeline list')
  224. func _on_renamer_reset_timeout():
  225. get_selected().set_editable(0, false)
  226. func _on_gui_input(event):
  227. if event is InputEventMouseButton and event.button_index == 1:
  228. if event.is_pressed() and event.doubleclick:
  229. var item = get_selected()
  230. var metadata = item.get_metadata(0)
  231. item.set_editable(0, true)
  232. $RenamerReset.start(0.5)
  233. func _on_item_edited():
  234. print('edited')
  235. var item = get_selected()
  236. var metadata = item.get_metadata(0)
  237. if metadata['editor'] == 'Timeline':
  238. timeline_editor.timeline_name = item.get_text(0)
  239. save_current_resource()
  240. build_timelines(metadata['file'])
  241. if metadata['editor'] == 'Theme':
  242. DialogicResources.set_theme_value(metadata['file'], 'settings', 'name', item.get_text(0))
  243. build_themes(metadata['file'])
  244. if metadata['editor'] == 'Character':
  245. character_editor.nodes['name'].text = item.get_text(0)
  246. save_current_resource()
  247. build_characters(metadata['file'])
  248. if metadata['editor'] == 'Definition':
  249. definition_editor.nodes['name'].text = item.get_text(0)
  250. # Not sure why this signal doesn't triggers
  251. definition_editor._on_name_changed(item.get_text(0))
  252. save_current_resource()
  253. build_definitions(metadata['id'])
  254. func _on_autosave_timeout():
  255. save_current_resource()
  256. func save_current_resource():
  257. var root = get_node('../..') # This is the same as the editor_reference
  258. if root.visible: #Only save if the editor is open
  259. var item: TreeItem = get_selected()
  260. var metadata: Dictionary
  261. if item != null:
  262. metadata = item.get_metadata(0)
  263. if metadata['editor'] == 'Timeline':
  264. timeline_editor.save_timeline()
  265. if metadata['editor'] == 'Character':
  266. character_editor.save_character()
  267. if metadata['editor'] == 'Definition':
  268. definition_editor.save_definition()
  269. # Note: Theme files auto saves on change