@@ -3,25 +3,30 @@ Visualization of an array as rectangles of varying heights.
33"""
44
55class_name ArrayView
6- extends HBoxContainer
6+ extends ViewportContainer
77
8- const SWAP_DURATION = 0.1
8+ const ANIM_DURATION = 0.1
99
1010var _tween = Tween .new ()
1111var _level : ComparisonSort
1212var _rects = []
1313var _positions = []
1414var _unit_width : int
1515var _unit_height : int
16+ var _viewport = Viewport .new ()
1617onready var _separation = 128 / _level .array .size
1718
1819func _init (level ):
1920 _level = level
21+ stretch = true
22+ _viewport .usage = Viewport .USAGE_2D
2023 add_child (_level ) # NOTE: This is necessary for it to read input
2124 add_child (_tween ) # NOTE: This is necessary for it to animate
25+ add_child (_viewport )
2226
2327func _ready ():
2428 yield (get_tree (), "idle_frame" )
29+ _viewport .size = rect_size
2530 _unit_width = rect_size .x / _level .array .size
2631 _unit_height = rect_size .y / _level .array .size
2732 # Keep track of accumulated pixel error from integer division
@@ -45,16 +50,17 @@ func _ready():
4550 _positions .append (x )
4651 x += _unit_width
4752 _rects .append (rect )
48- add_child (rect )
53+ _viewport . add_child (rect )
4954 _level .array .connect ("swapped" , self , "_on_ArrayModel_swapped" )
55+ _level .array .connect ("sorted" , self , "_on_ArrayModel_sorted" )
5056
5157func _process (delta ):
5258 for i in range (_rects .size ()):
5359 _rects [i ].color = _level .get_effect (i )
5460 _rects [i ].scale .y = - float (_level .array .at (i )) / _level .array .size
5561
5662func _on_ArrayModel_swapped (i , j ):
57- var time = SWAP_DURATION * (1 + float (j - i ) / _level .array .size )
63+ var time = ANIM_DURATION * (1 + float (j - i ) / _level .array .size )
5864 _tween .interpolate_property (
5965 _rects [i ], "position:x" , null , _positions [j ], time )
6066 _tween .interpolate_property (
@@ -63,3 +69,11 @@ func _on_ArrayModel_swapped(i, j):
6369 _rects [i ] = _rects [j ]
6470 _rects [j ] = temp
6571 _tween .start ()
72+
73+ func _on_ArrayModel_sorted (i , j ):
74+ for x in range (i , j ):
75+ _rects [x ].position .y = 0
76+ for x in range (i , j ):
77+ _tween .interpolate_property (
78+ _rects [x ], "position:y" , null , rect_size .y , ANIM_DURATION )
79+ _tween .start ()
0 commit comments