The bug marker root node is now placed directly in the scene tree, as it was once before. Not only does this now work correctly when switching nodes, this makes them interactible, allowing them to give information about the bug that was clicked on, currently printed to the console.
177 lines
11 KiB
GDScript
177 lines
11 KiB
GDScript
@tool
|
|
extends EditorPlugin
|
|
|
|
enum BugbotMenuItems {
|
|
SHOW_BUG_MARKERS,
|
|
HIDE_BUG_MARKERS
|
|
}
|
|
|
|
var __bugbot_menu_button : BugbotMenuButton
|
|
var __bugbot_marker_containers : Dictionary
|
|
var __editor_server_api : BugbotServerAPI
|
|
var __current_edited_scene_path : String
|
|
|
|
|
|
func _enter_tree() -> void:
|
|
scene_changed.connect(__on_editor_tab_switched)
|
|
ProjectSettings.settings_changed.connect(__on_project_settings_changed)
|
|
|
|
__initialise_project_settings()
|
|
|
|
__bugbot_menu_button = preload("res://addons/Bugbot/bugbot_menu_button.tscn").instantiate() as BugbotMenuButton
|
|
add_control_to_container(CustomControlContainer.CONTAINER_SPATIAL_EDITOR_MENU, __bugbot_menu_button)
|
|
|
|
# Setup popup menu
|
|
var bugbot_menu : PopupMenu = __bugbot_menu_button.get_popup()
|
|
bugbot_menu.add_item("Show Bug Markers", BugbotMenuItems.SHOW_BUG_MARKERS)
|
|
bugbot_menu.add_item("Hide Bug Markers", BugbotMenuItems.HIDE_BUG_MARKERS)
|
|
bugbot_menu.id_pressed.connect(__on_bugbot_menu_item_pressed)
|
|
|
|
# Set selection responses for bug markers
|
|
var selection : EditorSelection = get_editor_interface().get_selection()
|
|
selection.selection_changed.connect(__on_marker_selection_changed)
|
|
|
|
func _exit_tree() -> void:
|
|
remove_control_from_container(CustomControlContainer.CONTAINER_SPATIAL_EDITOR_MENU, __bugbot_menu_button)
|
|
__bugbot_menu_button.queue_free()
|
|
|
|
|
|
func __initialise_project_settings() -> void:
|
|
#region Placement
|
|
__add_project_setting("bugbot/bug_placement/precise_placement_distance", TYPE_FLOAT, Bugbot.DEFAULT_PRECISE_PLACEMENT_DISTANCE, PROPERTY_HINT_RANGE, "0.0,100.0,0.1,or_greater")
|
|
__add_project_setting("bugbot/bug_placement/arbitrary_placement_distance", TYPE_FLOAT, Bugbot.DEFAULT_ARBITRARY_PLACEMENT_DISTANCE, PROPERTY_HINT_RANGE, "0.0,100.0,0.1,or_greater")
|
|
#endregion
|
|
|
|
#region Reporting
|
|
__add_project_setting("bugbot/reporting/bug_report_platform", TYPE_INT, BugReportPlatform.BUGZILLA, PROPERTY_HINT_ENUM, "Bugzilla,Gitea,Jira")
|
|
__add_project_setting("bugbot/reporting/bug_report_widget_depth", TYPE_INT, 10000)
|
|
|
|
#region Bugzilla
|
|
__add_project_setting("bugbot/reporting/bugzilla/server", TYPE_STRING, BugbotServerBugzillaAPI.DEFAULT_SERVER)
|
|
__add_project_setting("bugbot/reporting/bugzilla/REST_URI", TYPE_STRING, BugbotServerBugzillaAPI.DEFAULT_REST_URI)
|
|
__add_project_setting("bugbot/reporting/bugzilla/product_name", TYPE_STRING, BugbotServerBugzillaAPI.DEFAULT_PRODUCT_NAME)
|
|
__add_project_setting("bugbot/reporting/bugzilla/API_key", TYPE_STRING, BugbotServerBugzillaAPI.DEFAULT_API_KEY)
|
|
__add_project_setting("bugbot/reporting/bugzilla/default_status", TYPE_STRING, BugbotServerBugzillaAPI.DEFAULT_POST_STATUS)
|
|
__add_project_setting("bugbot/reporting/bugzilla/map_name_field", TYPE_STRING, BugbotServerBugzillaAPI.DEFAULT_MAP_NAME_FIELD)
|
|
__add_project_setting("bugbot/reporting/bugzilla/marker_location_field", TYPE_STRING, BugbotServerBugzillaAPI.DEFAULT_MARKER_LOCATION_FIELD)
|
|
__add_project_setting("bugbot/reporting/bugzilla/status_labels/unresolved_statuses", TYPE_ARRAY, BugbotServerBugzillaAPI.DEFAULT_UNRESOLVED_STATUSES, PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/bugzilla/status_labels/in_progress_statuses", TYPE_ARRAY, BugbotServerBugzillaAPI.DEFAULT_IN_PROGRESS_STATUSES, PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/bugzilla/status_labels/resolved_statuses", TYPE_ARRAY, BugbotServerBugzillaAPI.DEFAULT_RESOLVED_STATUSES, PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
#endregion
|
|
#region Gitea
|
|
__add_project_setting("bugbot/reporting/gitea/server", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_SERVER)
|
|
__add_project_setting("bugbot/reporting/gitea/base_URL", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_BASE_URL)
|
|
__add_project_setting("bugbot/reporting/gitea/owner_name", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_OWNER_NAME)
|
|
__add_project_setting("bugbot/reporting/gitea/repo_name", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_REPO_NAME)
|
|
__add_project_setting("bugbot/reporting/gitea/API_key", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_API_KEY)
|
|
__add_project_setting("bugbot/reporting/gitea/bug_label", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_BUG_LABEL)
|
|
__add_project_setting("bugbot/reporting/gitea/default_status_label", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_STATUS_LABEL)
|
|
__add_project_setting("bugbot/reporting/gitea/status_labels/unresolved_statuses", TYPE_ARRAY, Array(), PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/gitea/status_labels/in_progress_statuses", TYPE_ARRAY, Array(), PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/gitea/status_labels/resolved_statuses", TYPE_ARRAY, Array(), PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/gitea/status_labels/priority_label_prefix", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_PRIORITY_LABEL_PREFIX)
|
|
__add_project_setting("bugbot/reporting/gitea/status_labels/show_assigned_as_in_progress", TYPE_BOOL, BugbotServerGiteaAPI.DEFAULT_SHOW_ASSIGNED_AS_IN_PROGRESS)
|
|
__add_project_setting("bugbot/reporting/gitea/optional_labels/version_label_prefix", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_VERSION_LABEL_PREFIX)
|
|
__add_project_setting("bugbot/reporting/gitea/optional_labels/hardware_label_prefix", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_HARDWARE_LABEL_PREFIX)
|
|
__add_project_setting("bugbot/reporting/gitea/optional_labels/os_label_prefix", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_OS_LABEL_PREFIX)
|
|
__add_project_setting("bugbot/reporting/gitea/optional_labels/component_label_prefix", TYPE_STRING, BugbotServerGiteaAPI.DEFAULT_COMPONENT_LABEL_PREFIX)
|
|
#endregion
|
|
#region Jira
|
|
__add_project_setting("bugbot/reporting/jira/server", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_SERVER)
|
|
__add_project_setting("bugbot/reporting/jira/REST_URI", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_REST_URI)
|
|
__add_project_setting("bugbot/reporting/jira/project_name", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_PROJECT_NAME)
|
|
__add_project_setting("bugbot/reporting/jira/email", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_EMAIL)
|
|
__add_project_setting("bugbot/reporting/jira/API_key", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_API_KEY)
|
|
__add_project_setting("bugbot/reporting/jira/bug_issue_type", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_BUG_ISSUE_TYPE)
|
|
__add_project_setting("bugbot/reporting/jira/map_name_field", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_MAP_NAME_FIELD)
|
|
__add_project_setting("bugbot/reporting/jira/marker_location_field", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_MARKER_LOCATION_FIELD)
|
|
__add_project_setting("bugbot/reporting/jira/status_labels/unresolved_statuses", TYPE_ARRAY, BugbotServerJiraAPI.DEFAULT_UNRESOLVED_STATUSES, PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/jira/status_labels/in_progress_statuses", TYPE_ARRAY, BugbotServerJiraAPI.DEFAULT_IN_PROGRESS_STATUSES, PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/jira/status_labels/resolved_statuses", TYPE_ARRAY, BugbotServerJiraAPI.DEFAULT_RESOLVED_STATUSES, PROPERTY_HINT_ARRAY_TYPE, &"21/:")
|
|
__add_project_setting("bugbot/reporting/jira/status_labels/severity_field", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_SEVERITY_FIELD)
|
|
__add_project_setting("bugbot/reporting/jira/optional_fields/department_field", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_DEPARTMENT_FIELD)
|
|
__add_project_setting("bugbot/reporting/jira/optional_fields/platform_field", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_PLATFORM_FIELD)
|
|
__add_project_setting("bugbot/reporting/jira/optional_fields/os_field", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_OS_FIELD)
|
|
__add_project_setting("bugbot/reporting/jira/optional_fields/version_field", TYPE_STRING, BugbotServerJiraAPI.DEFAULT_VERSION_FIELD)
|
|
#endregion
|
|
#endregion
|
|
|
|
#region Bug Markers
|
|
__add_project_setting("bugbot/markers/unresolved/show_unresolved_bugs", TYPE_BOOL, true)
|
|
__add_project_setting("bugbot/markers/unresolved/tint", TYPE_COLOR, BugMarker.UNRESOLVED_TINT)
|
|
|
|
__add_project_setting("bugbot/markers/in_progress/show_in_progress_bugs", TYPE_BOOL, true)
|
|
__add_project_setting("bugbot/markers/in_progress/tint", TYPE_COLOR, BugMarker.IN_PROGRESS_TINT)
|
|
|
|
__add_project_setting("bugbot/markers/resolved/show_resolved_bugs", TYPE_BOOL, false)
|
|
__add_project_setting("bugbot/markers/resolved/tint", TYPE_COLOR, BugMarker.RESOLVED_TINT)
|
|
#endregion
|
|
|
|
#region Batch Loading
|
|
__add_project_setting("bugbot/markers/display/load_markers_batch", TYPE_INT, 10)
|
|
__add_project_setting("bugbot/markers/display/unload_markers_batch", TYPE_INT, 25)
|
|
#endregion
|
|
|
|
func __on_bugbot_menu_item_pressed(id:int) -> void:
|
|
match id:
|
|
BugbotMenuItems.SHOW_BUG_MARKERS:
|
|
__show_editor_bug_markers()
|
|
BugbotMenuItems.HIDE_BUG_MARKERS:
|
|
var scene : String = EditorInterface.get_edited_scene_root().scene_file_path
|
|
if __bugbot_marker_containers.has(scene) and __bugbot_marker_containers[scene]:
|
|
__bugbot_marker_containers[scene].queue_free()
|
|
__bugbot_marker_containers.erase(scene)
|
|
|
|
func __show_editor_bug_markers() -> void:
|
|
var scene_root : Node = EditorInterface.get_edited_scene_root()
|
|
var scene : String = scene_root.scene_file_path
|
|
if __marker_root_exists(scene):
|
|
__bugbot_marker_containers[scene].queue_free()
|
|
__editor_server_api = BugbotServerAPI._create_new_server_api()
|
|
__editor_server_api._return_list_of_bugs(scene, __show_bug_markers_response)
|
|
func __show_bug_markers_response(bug_list:Array) -> void:
|
|
var scene_root : Node = EditorInterface.get_edited_scene_root()
|
|
var marker_container : Node3D = Node3D.new()
|
|
marker_container.name = "BugMarkerContainer"
|
|
__bugbot_marker_containers[scene_root.scene_file_path] = marker_container
|
|
scene_root.add_child(marker_container)
|
|
Bugbot.load_bug_markers(marker_container, bug_list)
|
|
|
|
func __marker_root_exists(scene_path:String) -> bool:
|
|
return __bugbot_marker_containers.has(scene_path) and is_instance_valid(__bugbot_marker_containers[scene_path])
|
|
|
|
func __on_marker_selection_changed() -> void:
|
|
var selected : Array = get_editor_interface().get_selection().get_selected_nodes()
|
|
if selected.size() == 1:
|
|
var selected_marker : Node = selected[0]
|
|
if selected_marker is BugMarker:
|
|
print(selected_marker.bug_info.title)
|
|
|
|
|
|
func __on_editor_tab_switched(new_scene:Node) -> void:
|
|
if __marker_root_exists(__current_edited_scene_path):
|
|
var scene_root : Node = (__bugbot_marker_containers[__current_edited_scene_path] as Node).get_parent()
|
|
if scene_root:
|
|
scene_root.remove_child(__bugbot_marker_containers[__current_edited_scene_path])
|
|
if new_scene:
|
|
__current_edited_scene_path = new_scene.scene_file_path
|
|
if __marker_root_exists(__current_edited_scene_path):
|
|
new_scene.add_child(__bugbot_marker_containers[new_scene.scene_file_path])
|
|
|
|
func __on_project_settings_changed() -> void:
|
|
Bugbot.adjust_bug_marker_colours()
|
|
|
|
|
|
func __add_project_setting(_setting:String, _type:int, _default_value:Variant, _hint:int = PropertyHint.PROPERTY_HINT_NONE, _hint_string:String = "") -> void:
|
|
var setting_info: Dictionary = {
|
|
"name": _setting,
|
|
"type": _type,
|
|
"hint": _hint,
|
|
"hint_string": _hint_string
|
|
}
|
|
|
|
if not ProjectSettings.has_setting(_setting):
|
|
ProjectSettings.set_setting(_setting, _default_value)
|
|
ProjectSettings.add_property_info(setting_info)
|
|
ProjectSettings.set_initial_value(_setting, _default_value)
|