You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.7 KiB

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)
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):
$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 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, total_width / total_amount_of_judgments)
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,
# cursor + width,
grade_margin_right,
tween_duration,
tween_transition,
tween_ease,
tween_delay
)
$Tween.start()
grade_node.margin_top = 0
grade_node.margin_bottom = height
# grade_node.margin_left = cursor
# grade_node.margin_right = cursor + width
if width:
# cursor = width + gap_size
cursor = grade_margin_right + gap_size