extends Control const GradeNode = preload("res://addons/majority_judgment/nodes/MajorityJudgmentLinearGradeNode.tscn") export(Resource) var poll setget set_poll, get_poll # MajorityJudgmentPoll #export(Resource) var merit_profile # MajorityJudgmentCandidateMeritProfile export var gap_size := 4 # pixels export var total_width := 300 # pixels var _grades_nodes := Array() #func _ready(): # assert(self.merit_profile, "Inject a merit profile first") # craft_nodes() # refresh() func set_poll(__poll:MajorityJudgmentPoll) -> void: poll = __poll func get_poll() -> MajorityJudgmentPoll: return poll func craft_nodes(grading_size): assert(0 == _grades_nodes.size()) # or queue_free() them for grade_index in range(grading_size): var grade_node = GradeNode.instance() grade_node.name = "GradeNode%d" % [grade_index] grade_node.color = get_poll().get_grading().get_color_of_grade(grade_index) grade_node.set_grade_icon(load("res://sprites/grades/number_%d.png" % [grade_index%10])) add_child(grade_node) _grades_nodes.append(grade_node) func compute_height(): var gold = 2.0 / (sqrt(5.0) + 1.0) assert(1.0/gold == 1.0+gold) var amount_of_grades : int = poll.grading.grades.size() return int(round(total_width / float(amount_of_grades)) * gold) func refresh(merit_profile:MajorityJudgmentCandidateMeritProfile): if not $Tween.is_inside_tree(): yield($Tween, "tree_entered") $Tween.remove_all() var total_amount_of_judgments : int = merit_profile.count_judgments() var amount_of_grades_with_judgments : int = merit_profile.count_grades_with_judgments() var amount_of_grades : int = merit_profile.grades.size() var grades_step : int = total_width / total_amount_of_judgments var height : int = compute_height() var cursor := 0 for grade_index in range(amount_of_grades): var grade_node = _grades_nodes[grade_index] var amount_of_judgments_for_grade = merit_profile.grades[grade_index] var width = ( (total_width - (amount_of_grades_with_judgments-1) * gap_size) * amount_of_judgments_for_grade / total_amount_of_judgments ) var grade_margin_right = stepify(cursor + width, grades_step) if 0 == width: grade_margin_right = cursor var tween_transition = Tween.TRANS_SINE var tween_ease = Tween.EASE_IN_OUT var tween_duration = 0.9 var tween_delay = 0 $Tween.interpolate_property( grade_node, "margin_left", grade_node.margin_left, cursor, tween_duration, tween_transition, tween_ease, tween_delay ) $Tween.interpolate_property( grade_node, "margin_right", grade_node.margin_right, grade_margin_right, tween_duration, tween_transition, tween_ease, tween_delay ) $Tween.start() grade_node.margin_top = 0 grade_node.margin_bottom = height if width: cursor = grade_margin_right + gap_size