xiandie/addons/project-statistics/nodes/charts/PieChart.gd

74 lines
1.8 KiB
GDScript3
Raw Normal View History

2024-12-23 01:30:31 +00:00
@tool
extends Control
const ChartData: Script = preload("./ChartData.gd")
@export var radius := 50.0
var series: Dictionary
func _init() -> void:
#rect_clip_content = true
clip_contents = true
func clear() -> void:
series.clear()
queue_redraw()
func add_data(data: ChartData) -> void:
series[data.name] = data
queue_redraw()
func remove_data(name: String) -> void:
series.erase(name)
queue_redraw()
func set_radius(value: float) -> void:
radius = max(0, value)
self.rect_min_size = Vector2.ONE * radius * 2
func draw_filled_arc(center: Vector2, radius: float, start_angle: float, end_angle: float,
point_count: int, color: Color, antialiased: bool = false
) -> void:
var points: PackedVector2Array = []
points.push_back(center)
for i in range(point_count + 1):
var angle_point: float = start_angle + i * (end_angle - start_angle) / point_count
points.push_back(center + Vector2(cos(angle_point), sin(angle_point)) * radius)
#draw_polygon(points, [color], [], null, null, antialiased)
draw_polygon(points, [color])
func _draw() -> void:
var charts_data: Array = series.values()
var total: float = 0.0
for data in charts_data:
total += data.value
var center: Vector2 = get_rect().size / 2.0
var start_angle: float = 0.0
var i: int
for data in charts_data:
var percent: float = data.value / total
var end_angle: float = start_angle - percent * 2 * PI
draw_filled_arc(
center,
radius,
start_angle,
end_angle,
30 * percent + 2,
data.color,
true
)
start_angle = end_angle
var outline_width: float = 1.2
if not get_theme_constant("dark_theme", "Editor"):
draw_arc(center, radius - outline_width / 2, 0.0, 2 * PI, 32, Color.LIGHT_SLATE_GRAY, 1.5, true)
func _notification(what: int) -> void:
match what:
NOTIFICATION_THEME_CHANGED:
queue_redraw()