|
|
|
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
|
|
|
|
|