74 lines
1.8 KiB
GDScript3
74 lines
1.8 KiB
GDScript3
|
@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()
|