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.

Dock.gd 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. tool
  2. extends Control
  3. #signal tree_built # used for debugging
  4. const Project := preload("res://addons/Todo_Manager/Project.gd")
  5. const Current := preload("res://addons/Todo_Manager/Current.gd")
  6. const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
  7. const TodoItem := preload("res://addons/Todo_Manager/todoItem_class.gd")
  8. const ColourPicker := preload("res://addons/Todo_Manager/UI/ColourPicker.tscn")
  9. const Pattern := preload("res://addons/Todo_Manager/UI/Pattern.tscn")
  10. const DEFAULT_PATTERNS := [["\\bTODO\\b", Color("96f1ad")], ["\\bHACK\\b", Color("d5bc70")], ["\\bFIXME\\b", Color("d57070")]]
  11. const DEFAULT_SCRIPT_COLOUR := Color("ccced3")
  12. const DEFAULT_SCRIPT_NAME := false
  13. const DEFAULT_SORT := true
  14. var plugin : EditorPlugin
  15. var todo_items : Array
  16. var script_colour := Color("ccced3")
  17. var ignore_paths := []
  18. var full_path := false
  19. var sort_alphabetical := true
  20. var auto_refresh := true
  21. var patterns := [["\\bTODO\\b", Color("96f1ad")], ["\\bHACK\\b", Color("d5bc70")], ["\\bFIXME\\b", Color("d57070")]]
  22. onready var tabs := $VBoxContainer/TabContainer as TabContainer
  23. onready var project := $VBoxContainer/TabContainer/Project as Project
  24. onready var current := $VBoxContainer/TabContainer/Current as Current
  25. onready var project_tree := $VBoxContainer/TabContainer/Project/Tree as Tree
  26. onready var current_tree := $VBoxContainer/TabContainer/Current/Tree as Tree
  27. onready var settings_panel := $VBoxContainer/TabContainer/Settings as Panel
  28. onready var colours_container := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer3/Colours as VBoxContainer
  29. onready var pattern_container := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns as VBoxContainer
  30. onready var ignore_textbox := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths/TextEdit as LineEdit
  31. func _ready() -> void:
  32. load_config()
  33. populate_settings()
  34. func build_tree() -> void:
  35. if tabs:
  36. match tabs.current_tab:
  37. 0:
  38. project.build_tree(todo_items, ignore_paths, patterns, sort_alphabetical, full_path)
  39. create_config_file()
  40. 1:
  41. current.build_tree(get_active_script(), patterns)
  42. create_config_file()
  43. 2:
  44. pass
  45. _:
  46. pass
  47. func get_active_script() -> TodoItem:
  48. var current_script : Script = plugin.get_editor_interface().get_script_editor().get_current_script()
  49. if current_script:
  50. var script_path = current_script.resource_path
  51. for todo_item in todo_items:
  52. if todo_item.script_path == script_path:
  53. return todo_item
  54. # nothing found
  55. var todo_item := TodoItem.new()
  56. todo_item.script_path = script_path
  57. return todo_item
  58. else:
  59. # not a script
  60. var todo_item := TodoItem.new()
  61. todo_item.script_path = "res://Documentation"
  62. return todo_item
  63. func go_to_script(script_path: String, line_number : int = 0) -> void:
  64. var script := load(script_path)
  65. plugin.get_editor_interface().edit_resource(script)
  66. plugin.get_editor_interface().get_script_editor().goto_line(line_number - 1)
  67. func sort_alphabetical(a, b) -> bool:
  68. if a.script_path > b.script_path:
  69. return true
  70. else:
  71. return false
  72. func sort_backwards(a, b) -> bool:
  73. if a.script_path < b.script_path:
  74. return true
  75. else:
  76. return false
  77. func populate_settings() -> void:
  78. for i in patterns.size():
  79. ## Create Colour Pickers
  80. var colour_picker := ColourPicker.instance()
  81. colour_picker.colour = patterns[i][1]
  82. colour_picker.title = patterns[i][0]
  83. colour_picker.index = i
  84. colours_container.add_child(colour_picker)
  85. colour_picker.colour_picker.connect("color_changed", self, "change_colour", [i])
  86. ## Create Patterns
  87. var pattern_edit := Pattern.instance()
  88. pattern_edit.text = patterns[i][0]
  89. pattern_edit.index = i
  90. pattern_container.add_child(pattern_edit)
  91. pattern_edit.line_edit.connect("text_changed", self, "change_pattern", [i, colour_picker])
  92. pattern_edit.remove_button.connect("pressed", self, "remove_pattern", [i, pattern_edit, colour_picker])
  93. $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns/AddPatternButton.raise()
  94. # path filtering
  95. var ignore_paths_field := ignore_textbox
  96. if !ignore_paths_field.is_connected("text_changed", self, "_on_ignore_paths_changed"):
  97. ignore_paths_field.connect("text_changed", self, "_on_ignore_paths_changed")
  98. var ignore_paths_text := ""
  99. for path in ignore_paths:
  100. ignore_paths_text += path + ", "
  101. ignore_paths_text.rstrip(' ').rstrip(',')
  102. ignore_paths_field.text = ignore_paths_text
  103. func rebuild_settings() -> void:
  104. for node in colours_container.get_children():
  105. node.queue_free()
  106. for node in pattern_container.get_children():
  107. if node is Button:
  108. continue
  109. node.queue_free()
  110. populate_settings()
  111. #### CONFIG FILE ####
  112. func create_config_file() -> void:
  113. var config = ConfigFile.new()
  114. config.set_value("scripts", "full_path", full_path)
  115. config.set_value("scripts", "sort_alphabetical", sort_alphabetical)
  116. config.set_value("scripts", "script_colour", script_colour)
  117. config.set_value("scripts", "ignore_paths", ignore_paths)
  118. config.set_value("patterns", "patterns", patterns)
  119. config.set_value("config", "auto_refresh", auto_refresh)
  120. var err = config.save("res://addons/Todo_Manager/todo.cfg")
  121. func load_config() -> void:
  122. var config := ConfigFile.new()
  123. if config.load("res://addons/Todo_Manager/todo.cfg") == OK:
  124. full_path = config.get_value("scripts", "full_path", DEFAULT_SCRIPT_NAME)
  125. sort_alphabetical = config.get_value("scripts", "sort_alphabetical", DEFAULT_SORT)
  126. script_colour = config.get_value("scripts", "script_colour", DEFAULT_SCRIPT_COLOUR)
  127. ignore_paths = config.get_value("scripts", "ignore_paths", [])
  128. patterns = config.get_value("patterns", "patterns", DEFAULT_PATTERNS)
  129. auto_refresh = config.get_value("config", "auto_refresh", true)
  130. else:
  131. create_config_file()
  132. #### Events ####
  133. func _on_SettingsButton_toggled(button_pressed: bool) -> void:
  134. settings_panel.visible = button_pressed
  135. if button_pressed == false:
  136. create_config_file()
  137. # plugin.find_tokens_from_path(plugin.script_cache)
  138. if auto_refresh:
  139. plugin.rescan_files()
  140. func _on_Tree_item_activated() -> void:
  141. var item : TreeItem
  142. match tabs.current_tab:
  143. 0:
  144. item = project_tree.get_selected()
  145. 1:
  146. item = current_tree.get_selected()
  147. if item.get_metadata(0) is Todo:
  148. var todo : Todo = item.get_metadata(0)
  149. call_deferred("go_to_script", todo.script_path, todo.line_number)
  150. else:
  151. var todo_item = item.get_metadata(0)
  152. call_deferred("go_to_script", todo_item.script_path)
  153. func _on_FullPathCheckBox_toggled(button_pressed: bool) -> void:
  154. full_path = button_pressed
  155. func _on_ScriptColourPickerButton_color_changed(color: Color) -> void:
  156. script_colour = color
  157. func _on_TODOColourPickerButton_color_changed(color: Color) -> void:
  158. patterns[0][1] = color
  159. func _on_RescanButton_pressed() -> void:
  160. plugin.rescan_files()
  161. func change_colour(colour: Color, index: int) -> void:
  162. patterns[index][1] = colour
  163. func change_pattern(value: String, index: int, this_colour: Node) -> void:
  164. patterns[index][0] = value
  165. this_colour.title = value
  166. func remove_pattern(index: int, this: Node, this_colour: Node) -> void:
  167. patterns.remove(index)
  168. this.queue_free()
  169. this_colour.queue_free()
  170. func _on_DefaultButton_pressed() -> void:
  171. patterns = DEFAULT_PATTERNS.duplicate(true)
  172. sort_alphabetical = DEFAULT_SORT
  173. script_colour = DEFAULT_SCRIPT_COLOUR
  174. full_path = DEFAULT_SCRIPT_NAME
  175. rebuild_settings()
  176. func _on_AlphSortCheckBox_toggled(button_pressed: bool) -> void:
  177. sort_alphabetical = button_pressed
  178. func _on_AddPatternButton_pressed() -> void:
  179. patterns.append(["\\bplaceholder\\b", Color.white])
  180. rebuild_settings()
  181. func _on_RefreshCheckButton_toggled(button_pressed: bool) -> void:
  182. auto_refresh = button_pressed
  183. func _on_Timer_timeout() -> void:
  184. plugin.refresh_lock = false
  185. func _on_ignore_paths_changed(new_text: String) -> void:
  186. var text = ignore_textbox.text
  187. var split: Array = text.split(',')
  188. ignore_paths.clear()
  189. for elem in split:
  190. if elem == " " || elem == "":
  191. continue
  192. ignore_paths.push_front(elem.lstrip(' ').rstrip(' '))
  193. # validate so no empty string slips through (all paths ignored)
  194. var i := 0
  195. for path in ignore_paths:
  196. if (path == "" || path == " "):
  197. ignore_paths.remove(i)
  198. i += 1
  199. func _on_TabContainer_tab_changed(tab: int) -> void:
  200. build_tree()