@@ -18,14 +18,21 @@ const MAX_WAIT = 4
1818const MIN_SIZE = 8
1919const MAX_SIZE = 128
2020
21- var _index = LEVELS .find (GlobalScene .get_param ("level" ))
21+ var _index = LEVELS .find (GlobalScene .get_param ("level" , LEVELS [ 0 ] ))
2222var _level : ComparisonSort
2323var _size = GlobalScene .get_param ("size" , ArrayModel .DEFAULT_SIZE )
2424var _data_type = GlobalScene .get_param (
2525 "data_type" , ArrayModel .DATA_TYPES .RANDOM_UNIQUE )
2626
2727func _ready ():
28- var types = $ Level/Right/Display/TypesContainer/Types
28+ _load_types ($ Level/Right/Display/TypesContainer )
29+ _load_types ($ BigDisplay/TypesContainer )
30+ _reload ()
31+
32+ func _load_types (node ):
33+ var types = VBoxContainer .new ()
34+ types .name = "Types"
35+ node .add_child (types )
2936 for type in ArrayModel .DATA_TYPES :
3037 var button = Button .new ()
3138 button .text = type .replace ("_" , " " )
@@ -35,23 +42,34 @@ func _ready():
3542 var bottom = types .get_child (types .get_child_count () - 1 )
3643 top .focus_neighbour_top = bottom .get_path ()
3744 bottom .focus_neighbour_bottom = top .get_path ()
38- _reload ()
3945
4046func _reload ():
41- $ NamesContainer/Names/Current .grab_focus ()
42- if _index == - 1 :
43- _index = 0
44- _level = LEVELS [_index ].new (ArrayModel .new (_size , _data_type ))
45- _level .connect ("done" , self , "_on_ComparisonSort_done" )
47+ # Load everything from scratch
48+ _restart ()
4649 _load_scores (_level )
47- # Load level information
4850 $ NamesContainer/Names/Current .text = _level .NAME
4951 $ Level/Left/Code .text = _level .DESCRIPTION
5052 $ Level/Right/Info/ControlsContainer/Controls .text = _level .CONTROLS
51- var view = $ Level/Right/Display/HBoxContainer
52- view .get_parent ().remove_child (view )
53- view .queue_free ()
54- $ Level/Right/Display .add_child (ArrayView .new (_level ), true )
53+
54+ func _restart ():
55+ set_process_input (true )
56+ # Only load in a restarted simulation
57+ $ NamesContainer/Names/Current .grab_focus ()
58+ _level = LEVELS [_index ].new (ArrayModel .new (_size , _data_type ))
59+ _level .connect ("done" , self , "_on_ComparisonSort_done" )
60+ var view = $ Level/Right/Display if $ Level .visible else $ BigDisplay
61+ var other = $ BigDisplay if $ Level .visible else $ Level/Right/Display
62+ # Delete both ArrayViews if they exist
63+ if other .get_node_or_null ("HBoxContainer" ) != null :
64+ other .get_node ("HBoxContainer" ).queue_free ()
65+ var array_view = view .get_node_or_null ("HBoxContainer" )
66+ if array_view != null :
67+ # XXX: remove_child is needed in order to ensure that the added
68+ # child will be named "HBoxContainer" and not "HBoxContainer2"
69+ # because the other ArrayView hasn't been queue_free'd yet
70+ view .remove_child (array_view )
71+ array_view .queue_free ()
72+ view .add_child (ArrayView .new (_level ), true )
5573 $ Timer .start ()
5674
5775func _load_scores (level ):
@@ -91,16 +109,21 @@ func _input(event):
91109 $ Timer .wait_time = min ($ Timer .wait_time * 4 , MAX_WAIT )
92110 if event .is_action_pressed ("change_data" ):
93111 AudioServer .set_bus_mute (AudioServer .get_bus_index ("Master" ), true )
94- $ Level/Right/Display/HBoxContainer .hide ()
95- $ Level/Right/Display/TypesContainer .show ()
112+ var display = $ Level/Right/Display if $ Level .visible else $ BigDisplay
113+ display .get_node ("HBoxContainer" ).hide ()
114+ display .get_node ("TypesContainer" ).show ()
96115 $ Timer .stop ()
97- $ Level/Right/Display/TypesContainer/Types .get_child (0 ).grab_focus ()
116+ display .get_node ("TypesContainer/Types" ).get_child (0 ).grab_focus ()
117+ if event .is_action_pressed ("big_preview" ):
118+ $ Level .visible = not $ Level .visible
119+ $ BigDisplay .visible = not $ BigDisplay .visible
120+ _restart ()
98121
99122func _on_ComparisonSort_done ():
123+ set_process_input (false )
100124 $ Timer .stop ()
101125 yield (get_tree ().create_timer (1 ), "timeout" )
102- if _level .array .is_sorted ():
103- _reload ()
126+ _restart ()
104127
105128func _on_Timer_timeout ():
106129 _level .next (null )
@@ -111,8 +134,9 @@ func _on_Current_pressed():
111134
112135func _on_Button_pressed (data_type ):
113136 AudioServer .set_bus_mute (AudioServer .get_bus_index ("Master" ), false )
114- $ Level/Right/Display/TypesContainer .hide ()
115- $ Level/Right/Display/HBoxContainer .show ()
137+ var display = $ Level/Right/Display if $ Level .visible else $ BigDisplay
138+ display .get_node ("TypesContainer" ).hide ()
139+ display .get_node ("HBoxContainer" ).show ()
116140 $ Timer .start ()
117141 _data_type = ArrayModel .DATA_TYPES [data_type ]
118- _reload ()
142+ _restart ()
0 commit comments