xiandie/addons/project-statistics/nodes/TreeView.gd
2024-12-23 09:30:31 +08:00

80 lines
3.3 KiB
GDScript

@tool
extends "./StatisticsView.gd"
@onready var tree: Tree
@onready var summary_tree: Tree
func display(stats: ProjectStatistics) -> void:
#.display(stats)
super.display(stats)
update_tree(stats)
func update_tree(stats: ProjectStatistics) -> void:
pass
func _on_item_activated() -> void:
if tree.get_selected_column() == 0:
var path: String = tree.get_selected().get_metadata(0)
emit_signal("file_selected", path)
func _on_column_title_clicked(column: int, _mouse_button: int) -> void:
if stats:
stats = stats.duplicate()
_sort_by_column(column)
update_tree(stats)
update_icons()
func _sort_by_column(column: int) -> void:
pass
func sort_name(file1: FileStatistics, file2: FileStatistics) -> bool:
var result: int = file2.get_name().casecmp_to(file1.get_name())
return result == 1 if result != 0 else sort_path(file1, file2)
func sort_path(file1: FileStatistics, file2: FileStatistics) -> bool:
return file2.path.casecmp_to(file1.path) == 1
func sort_extension(file1: FileStatistics, file2: FileStatistics) -> bool:
var result: int = file2._get_extension().casecmp_to(file1._get_extension())
return result == 1 if result != 0 else sort_path(file1, file2)
func sort_resource_type(file1: FileStatistics, file2: FileStatistics) -> bool:
var result: int = file2.type.casecmp_to(file1.type)
return result == 1 if result != 0 else sort_path(file1, file2)
func sort_node_type(file1: FileStatistics, file2: FileStatistics) -> bool:
var result: int = file2.base_node_type.casecmp_to(file1.base_node_type)
return result == 1 if result != 0 else sort_path(file1, file2)
func sort_size(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.size > file2.size if file1.size != file2.size else sort_name(file1, file2)
func sort_total_lines(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.total_lines > file2.total_lines if file1.total_lines != file2.total_lines else sort_source_code_lines(file1, file2)
func sort_source_code_lines(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.source_code_lines > file2.source_code_lines if file1.source_code_lines != file2.source_code_lines else sort_comment_lines(file1, file2)
func sort_comment_lines(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.comment_lines > file2.comment_lines if file1.comment_lines != file2.comment_lines else sort_blank_lines(file1, file2)
func sort_blank_lines(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.blank_lines > file2.blank_lines if file1.blank_lines != file2.blank_lines else sort_size(file1, file2)
func sort_node_count(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.node_count > file2.node_count if file1.node_count != file2.node_count else sort_connection_count(file1, file2)
func sort_connection_count(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.connection_count > file2.connection_count if file1.connection_count != file2.connection_count else sort_name(file1, file2)
func sort_local_to_scene(file1: FileStatistics, file2: FileStatistics) -> bool:
return file1.local_to_scene if not file1.local_to_scene and file2.local_to_scene else sort_name(file1, file2)
func _notification(what: int) -> void:
match what:
NOTIFICATION_PREDELETE:
if is_instance_valid(tree):
tree.clear()
if is_instance_valid(tree):
summary_tree.clear()