Restyle the music player bar
The bar is rounded and a little taller, with a round orange play button and a restart button that lights up orange under the mouse. The icons sit inside their buttons with room around them, and are one colour, cropped to their shape. Progress fills in orange, the volume slider gets a speaker icon, and the buttons say their shortcut keys in their tooltips. Buttons grow a little under the mouse and shrink while held down, and the play button pops when it switches between play and pause. ButtonBounce holds these animations so other buttons can use them too.
This commit is contained in:
1 parent
78e1facaf0
commit
4a934840f6
23 files changed
+1037
-247
No files matched your search
+273
-210
@@ -1056,71 +1056,80 @@
|
||||
"Quiz/MusicPlayer": {
|
||||
"rect": [
|
||||
64.0,
|
||||
992.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
71.0
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
64.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
1772.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicPlayerSlider": {
|
||||
"rect": [
|
||||
137.0,
|
||||
1000.0,
|
||||
1532.0,
|
||||
158.0,
|
||||
997.0,
|
||||
1402.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicTimeLabel": {
|
||||
"rect": [
|
||||
1673.0,
|
||||
996.0,
|
||||
79.0,
|
||||
23.0
|
||||
1570.0,
|
||||
992.0,
|
||||
120.0,
|
||||
26.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": {
|
||||
"rect": [
|
||||
101.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
114.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeIcon": {
|
||||
"rect": [
|
||||
1700.0,
|
||||
994.0,
|
||||
22.0,
|
||||
22.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeSlider": {
|
||||
"rect": [
|
||||
1756.0,
|
||||
1000.0,
|
||||
100.0,
|
||||
1732.0,
|
||||
997.0,
|
||||
110.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
@@ -4685,71 +4694,80 @@
|
||||
"Quiz/MusicPlayer": {
|
||||
"rect": [
|
||||
64.0,
|
||||
992.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
71.0
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
64.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
1772.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicPlayerSlider": {
|
||||
"rect": [
|
||||
137.0,
|
||||
1000.0,
|
||||
1514.0,
|
||||
158.0,
|
||||
997.0,
|
||||
1402.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicTimeLabel": {
|
||||
"rect": [
|
||||
1655.0,
|
||||
996.0,
|
||||
97.0,
|
||||
23.0
|
||||
1570.0,
|
||||
992.0,
|
||||
120.0,
|
||||
26.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": {
|
||||
"rect": [
|
||||
101.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
114.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeIcon": {
|
||||
"rect": [
|
||||
1700.0,
|
||||
994.0,
|
||||
22.0,
|
||||
22.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeSlider": {
|
||||
"rect": [
|
||||
1756.0,
|
||||
1000.0,
|
||||
100.0,
|
||||
1732.0,
|
||||
997.0,
|
||||
110.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
@@ -11482,71 +11500,80 @@
|
||||
"Quiz/MusicPlayer": {
|
||||
"rect": [
|
||||
64.0,
|
||||
992.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
71.0
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
64.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
1772.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicPlayerSlider": {
|
||||
"rect": [
|
||||
137.0,
|
||||
1000.0,
|
||||
1532.0,
|
||||
158.0,
|
||||
997.0,
|
||||
1402.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicTimeLabel": {
|
||||
"rect": [
|
||||
1673.0,
|
||||
996.0,
|
||||
79.0,
|
||||
23.0
|
||||
1570.0,
|
||||
992.0,
|
||||
120.0,
|
||||
26.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": {
|
||||
"rect": [
|
||||
101.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
114.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeIcon": {
|
||||
"rect": [
|
||||
1700.0,
|
||||
994.0,
|
||||
22.0,
|
||||
22.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeSlider": {
|
||||
"rect": [
|
||||
1756.0,
|
||||
1000.0,
|
||||
100.0,
|
||||
1732.0,
|
||||
997.0,
|
||||
110.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
@@ -15480,71 +15507,80 @@
|
||||
"Quiz/MusicPlayer": {
|
||||
"rect": [
|
||||
64.0,
|
||||
992.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
71.0
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
64.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
1772.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicPlayerSlider": {
|
||||
"rect": [
|
||||
137.0,
|
||||
1000.0,
|
||||
1514.0,
|
||||
158.0,
|
||||
997.0,
|
||||
1402.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicTimeLabel": {
|
||||
"rect": [
|
||||
1655.0,
|
||||
996.0,
|
||||
97.0,
|
||||
23.0
|
||||
1570.0,
|
||||
992.0,
|
||||
120.0,
|
||||
26.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": {
|
||||
"rect": [
|
||||
101.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
114.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeIcon": {
|
||||
"rect": [
|
||||
1700.0,
|
||||
994.0,
|
||||
22.0,
|
||||
22.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeSlider": {
|
||||
"rect": [
|
||||
1756.0,
|
||||
1000.0,
|
||||
100.0,
|
||||
1732.0,
|
||||
997.0,
|
||||
110.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
@@ -23540,71 +23576,80 @@
|
||||
"Quiz/MusicPlayer": {
|
||||
"rect": [
|
||||
64.0,
|
||||
992.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
71.0
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
64.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
1772.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicPlayerSlider": {
|
||||
"rect": [
|
||||
137.0,
|
||||
1000.0,
|
||||
1532.0,
|
||||
158.0,
|
||||
997.0,
|
||||
1402.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicTimeLabel": {
|
||||
"rect": [
|
||||
1673.0,
|
||||
996.0,
|
||||
79.0,
|
||||
23.0
|
||||
1570.0,
|
||||
992.0,
|
||||
120.0,
|
||||
26.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": {
|
||||
"rect": [
|
||||
101.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
114.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeIcon": {
|
||||
"rect": [
|
||||
1700.0,
|
||||
994.0,
|
||||
22.0,
|
||||
22.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeSlider": {
|
||||
"rect": [
|
||||
1756.0,
|
||||
1000.0,
|
||||
100.0,
|
||||
1732.0,
|
||||
997.0,
|
||||
110.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
@@ -36647,71 +36692,80 @@
|
||||
"Quiz/MusicPlayer": {
|
||||
"rect": [
|
||||
64.0,
|
||||
992.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
71.0
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
64.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
1772.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicPlayerSlider": {
|
||||
"rect": [
|
||||
137.0,
|
||||
1000.0,
|
||||
1514.0,
|
||||
158.0,
|
||||
997.0,
|
||||
1402.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicTimeLabel": {
|
||||
"rect": [
|
||||
1655.0,
|
||||
996.0,
|
||||
97.0,
|
||||
23.0
|
||||
1570.0,
|
||||
992.0,
|
||||
120.0,
|
||||
26.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": {
|
||||
"rect": [
|
||||
101.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
114.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeIcon": {
|
||||
"rect": [
|
||||
1700.0,
|
||||
994.0,
|
||||
22.0,
|
||||
22.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeSlider": {
|
||||
"rect": [
|
||||
1756.0,
|
||||
1000.0,
|
||||
100.0,
|
||||
1732.0,
|
||||
997.0,
|
||||
110.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
@@ -41243,71 +41297,80 @@
|
||||
"Quiz/MusicPlayer": {
|
||||
"rect": [
|
||||
64.0,
|
||||
992.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
71.0
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
64.0,
|
||||
984.0,
|
||||
1792.0,
|
||||
42.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
1791.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
1772.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicPlayerSlider": {
|
||||
"rect": [
|
||||
137.0,
|
||||
1000.0,
|
||||
1514.0,
|
||||
158.0,
|
||||
997.0,
|
||||
1402.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/MusicTimeLabel": {
|
||||
"rect": [
|
||||
1655.0,
|
||||
996.0,
|
||||
97.0,
|
||||
23.0
|
||||
1570.0,
|
||||
992.0,
|
||||
120.0,
|
||||
26.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": {
|
||||
"rect": [
|
||||
65.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
70.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": {
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": {
|
||||
"rect": [
|
||||
101.0,
|
||||
992.0,
|
||||
32.0,
|
||||
32.0
|
||||
114.0,
|
||||
988.0,
|
||||
34.0,
|
||||
34.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeIcon": {
|
||||
"rect": [
|
||||
1700.0,
|
||||
994.0,
|
||||
22.0,
|
||||
22.0
|
||||
],
|
||||
"visible": true
|
||||
},
|
||||
"Quiz/MusicPlayer/PlayerBar/MusicPlayerContainer/VolumeSlider": {
|
||||
"rect": [
|
||||
1756.0,
|
||||
1000.0,
|
||||
100.0,
|
||||
1732.0,
|
||||
997.0,
|
||||
110.0,
|
||||
16.0
|
||||
],
|
||||
"visible": true
|
||||
|
||||
@@ -446,6 +446,11 @@ func _freeze_music_player() -> void:
|
||||
music_player.sound_player.stop()
|
||||
music_player.progress_slider.value = 0
|
||||
music_player.music_time_label.text = "00:00 / 00:01"
|
||||
# The buttons' animations would otherwise be caught halfway, see ButtonBounce
|
||||
for button: Button in [music_player.play_button, music_player.restart_button]:
|
||||
if button.has_meta(&"button_bounce_tween"):
|
||||
(button.get_meta(&"button_bounce_tween") as Tween).kill()
|
||||
button.scale = Vector2.ONE
|
||||
|
||||
|
||||
## The log starts each row with the time of day; use a fixed time instead.
|
||||
|
||||
@@ -26,3 +26,129 @@ func _click(control: Control) -> void:
|
||||
|
||||
func test_empty_space_lets_clicks_through() -> void:
|
||||
assert_int(_player.mouse_filter).is_equal(Control.MOUSE_FILTER_IGNORE)
|
||||
|
||||
|
||||
func _song() -> AudioStreamMP3:
|
||||
var song: AudioStreamMP3 = AudioStreamMP3.new()
|
||||
song.data = FileAccess.get_file_as_bytes("res://tests/data/short.mp3")
|
||||
return song
|
||||
|
||||
|
||||
func _buttons() -> Array[Button]:
|
||||
return [_player.play_button, _player.restart_button]
|
||||
|
||||
|
||||
# Waits until the buttons' animations have finished
|
||||
func _settle() -> void:
|
||||
await await_millis(int(maxf(ButtonBounce.DURATION, ButtonBounce.POP_DURATION) * 1000) + 80)
|
||||
|
||||
|
||||
# Icons
|
||||
|
||||
func test_icons_sit_inside_their_buttons_with_room_around_them() -> void:
|
||||
await _runner.simulate_frames(1)
|
||||
for button: Button in _buttons():
|
||||
var style: StyleBox = button.get_theme_stylebox(&"normal")
|
||||
for side: Side in [SIDE_LEFT, SIDE_TOP, SIDE_RIGHT, SIDE_BOTTOM]:
|
||||
assert_float(style.get_content_margin(side)).override_failure_message(button.name) \
|
||||
.is_greater_equal(8.0)
|
||||
assert_bool(button.expand_icon).override_failure_message(button.name).is_true()
|
||||
assert_int(button.icon_alignment).is_equal(HORIZONTAL_ALIGNMENT_CENTER)
|
||||
# A square button, so the round background is a circle around the icon
|
||||
assert_float(button.size.x).override_failure_message(button.name) \
|
||||
.is_equal(button.size.y)
|
||||
var icon_room: Vector2 = button.size - style.get_minimum_size()
|
||||
assert_float(icon_room.x).override_failure_message(button.name).is_greater(12.0)
|
||||
|
||||
|
||||
func test_buttons_are_centred_in_the_bar() -> void:
|
||||
await _runner.simulate_frames(1)
|
||||
var bar: Rect2 = _player.get_node("PlayerBar").get_global_rect()
|
||||
for button: Button in _buttons():
|
||||
var rect: Rect2 = button.get_global_rect()
|
||||
assert_bool(bar.encloses(rect)).override_failure_message(button.name).is_true()
|
||||
assert_float(rect.get_center().y).override_failure_message(button.name) \
|
||||
.is_equal_approx(bar.get_center().y, 1.0)
|
||||
|
||||
|
||||
func test_play_button_stands_out_from_restart() -> void:
|
||||
assert_str(_player.play_button.theme_type_variation).is_equal("PlayerButtonPrimary")
|
||||
assert_str(_player.restart_button.theme_type_variation).is_equal("PlayerButton")
|
||||
assert_str(_player.progress_slider.theme_type_variation).is_equal("ProgressSlider")
|
||||
assert_str(_player.volume_slider.theme_type_variation).is_equal("VolumeBar")
|
||||
assert_str(_player.music_time_label.theme_type_variation).is_equal("PlayerTime")
|
||||
|
||||
|
||||
func test_buttons_have_tooltips_with_their_keys() -> void:
|
||||
assert_str(_player.play_button.tooltip_text).contains("Alt+X")
|
||||
assert_str(_player.restart_button.tooltip_text).contains("Alt+Z")
|
||||
|
||||
|
||||
# Play and pause
|
||||
|
||||
func test_play_button_shows_play_until_a_song_plays() -> void:
|
||||
assert_bool(_player.shows_playing()).is_false()
|
||||
|
||||
_player.play_song(_song())
|
||||
|
||||
assert_bool(_player.shows_playing()).is_true()
|
||||
assert_object(_player.play_button.icon).is_same(_player.pause_icon)
|
||||
|
||||
|
||||
func test_pausing_shows_play_again() -> void:
|
||||
await _runner.simulate_frames(1)
|
||||
_player.play_song(_song())
|
||||
|
||||
await _click(_player.play_button)
|
||||
|
||||
assert_bool(_player.audio_player.stream_paused).is_true()
|
||||
assert_bool(_player.shows_playing()).is_false()
|
||||
|
||||
|
||||
func test_play_button_pops_when_it_changes() -> void:
|
||||
await _runner.simulate_frames(1)
|
||||
|
||||
_player.play_song(_song())
|
||||
|
||||
assert_vector(_player.play_button.scale).is_equal(ButtonBounce.POP_SCALE)
|
||||
await _settle()
|
||||
assert_vector(_player.play_button.scale).is_equal_approx(Vector2.ONE, Vector2(0.01, 0.01))
|
||||
|
||||
|
||||
func test_play_button_does_not_pop_when_it_stays_the_same() -> void:
|
||||
_player.play_song(_song())
|
||||
await _settle()
|
||||
|
||||
_player.play_song(_song())
|
||||
|
||||
assert_vector(_player.play_button.scale).is_equal_approx(Vector2.ONE, Vector2(0.01, 0.01))
|
||||
|
||||
|
||||
# Hover
|
||||
|
||||
func test_buttons_grow_under_the_mouse_and_shrink_back() -> void:
|
||||
await _runner.simulate_frames(1)
|
||||
for button: Button in _buttons():
|
||||
_runner.set_mouse_position(_player.get_viewport().get_final_transform()
|
||||
* button.get_global_rect().get_center())
|
||||
await _runner.simulate_frames(2)
|
||||
await _settle()
|
||||
assert_vector(button.scale).override_failure_message(button.name) \
|
||||
.is_equal_approx(ButtonBounce.HOVER_SCALE, Vector2(0.01, 0.01))
|
||||
|
||||
_runner.set_mouse_position(Vector2.ZERO)
|
||||
await _runner.simulate_frames(2)
|
||||
await _settle()
|
||||
assert_vector(button.scale).override_failure_message(button.name) \
|
||||
.is_equal_approx(Vector2.ONE, Vector2(0.01, 0.01))
|
||||
|
||||
|
||||
func test_growing_keeps_the_button_in_place() -> void:
|
||||
await _runner.simulate_frames(1)
|
||||
var before: Vector2 = _player.restart_button.get_global_rect().get_center()
|
||||
|
||||
_player.restart_button.mouse_entered.emit()
|
||||
await _settle()
|
||||
|
||||
assert_vector(_player.restart_button.get_global_rect().get_center()) \
|
||||
.is_equal_approx(before, Vector2(0.5, 0.5))
|
||||
@@ -313,3 +313,15 @@ func test_alt_s_opens_search() -> void:
|
||||
await _press_keys([KEY_ALT, KEY_S])
|
||||
|
||||
assert_bool((_window.get_node("SearchPopup") as Control).visible).is_true()
|
||||
|
||||
|
||||
func test_music_player_fits_between_the_song_buttons_and_quiz_settings() -> void:
|
||||
var bar: Rect2 = _quiz.get_node("MusicPlayer/PlayerBar").get_global_rect()
|
||||
var above: Rect2 = _quiz.get_node("SongControls/NextButton").get_global_rect()
|
||||
var below: Rect2 = _quiz.get_node("QuizSettingsButton").get_global_rect()
|
||||
|
||||
assert_float(bar.position.y).is_greater_equal(above.end.y + 4)
|
||||
assert_float(bar.end.y).is_less_equal(below.position.y - 2)
|
||||
# As wide as the music list above it
|
||||
var list: Rect2 = _quiz.get_node("MusicListPanel").get_global_rect()
|
||||
assert_float(bar.position.x).is_equal(list.position.x)
|
||||
@@ -58,8 +58,8 @@ func test_buttons_do_what_the_list_says() -> void:
|
||||
var expected: Dictionary = {
|
||||
"SongControls/NextButton": "Next song",
|
||||
"SongControls/ShowAnswerButton": "Show answer",
|
||||
"MusicPlayer/PlayerBar/MusicPlayerContainer/PlayTextureButton": "Play or pause",
|
||||
"MusicPlayer/PlayerBar/MusicPlayerContainer/RestartTextureButton": "Restart song",
|
||||
"MusicPlayer/PlayerBar/MusicPlayerContainer/PlayButton": "Play or pause",
|
||||
"MusicPlayer/PlayerBar/MusicPlayerContainer/RestartButton": "Restart song",
|
||||
}
|
||||
for path: String in expected:
|
||||
var button: BaseButton = _quiz.get_node(path)
|
||||
|
||||
@@ -37,6 +37,12 @@ const STYLES: Dictionary = {
|
||||
"SongRowPlaying": "PanelContainer",
|
||||
"SongRowPictureLine": "HBoxContainer",
|
||||
"SongRowPictureLines": "VBoxContainer",
|
||||
"PlayerBar": "PanelContainer",
|
||||
"PlayerButton": "Button",
|
||||
"PlayerButtonPrimary": "Button",
|
||||
"PlayerTime": "Label",
|
||||
"ProgressSlider": "HSlider",
|
||||
"VolumeBar": "HSlider",
|
||||
"StatisticsCard": "PanelContainer",
|
||||
"StatisticsCardHover": "PanelContainer",
|
||||
"StatisticsGrid": "GridContainer",
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
extends GdUnitTestSuite
|
||||
## ButtonBounce: buttons grow under the mouse, shrink while held down, pop when asked to,
|
||||
## and always around their middle.
|
||||
|
||||
var _button: Button
|
||||
|
||||
|
||||
func before_test() -> void:
|
||||
_button = auto_free(Button.new())
|
||||
_button.size = Vector2(40, 40)
|
||||
add_child(_button)
|
||||
ButtonBounce.add_to(_button)
|
||||
|
||||
|
||||
func _settle() -> void:
|
||||
await await_millis(int(maxf(ButtonBounce.DURATION, ButtonBounce.POP_DURATION) * 1000) + 80)
|
||||
|
||||
|
||||
func test_starts_at_its_normal_size_scaled_around_its_middle() -> void:
|
||||
assert_vector(_button.scale).is_equal(Vector2.ONE)
|
||||
assert_vector(_button.pivot_offset).is_equal(Vector2(20, 20))
|
||||
|
||||
|
||||
func test_pivot_follows_the_size() -> void:
|
||||
_button.size = Vector2(60, 30)
|
||||
|
||||
assert_vector(_button.pivot_offset).is_equal(Vector2(30, 15))
|
||||
|
||||
|
||||
func test_grows_when_the_mouse_enters_and_shrinks_back_when_it_leaves() -> void:
|
||||
_button.mouse_entered.emit()
|
||||
await _settle()
|
||||
assert_vector(_button.scale).is_equal_approx(ButtonBounce.HOVER_SCALE, Vector2(0.01, 0.01))
|
||||
|
||||
_button.mouse_exited.emit()
|
||||
await _settle()
|
||||
assert_vector(_button.scale).is_equal_approx(Vector2.ONE, Vector2(0.01, 0.01))
|
||||
|
||||
|
||||
func test_shrinks_while_held_down() -> void:
|
||||
_button.button_down.emit()
|
||||
await _settle()
|
||||
|
||||
assert_vector(_button.scale).is_equal_approx(ButtonBounce.PRESSED_SCALE, Vector2(0.01, 0.01))
|
||||
|
||||
|
||||
func test_goes_back_to_normal_when_let_go_away_from_the_mouse() -> void:
|
||||
_button.button_down.emit()
|
||||
await _settle()
|
||||
|
||||
_button.button_up.emit()
|
||||
await _settle()
|
||||
|
||||
assert_vector(_button.scale).is_equal_approx(Vector2.ONE, Vector2(0.01, 0.01))
|
||||
|
||||
|
||||
func test_disabled_button_does_not_grow() -> void:
|
||||
_button.disabled = true
|
||||
|
||||
_button.mouse_entered.emit()
|
||||
await _settle()
|
||||
|
||||
assert_vector(_button.scale).is_equal(Vector2.ONE)
|
||||
|
||||
|
||||
func test_pop_starts_small_and_springs_back() -> void:
|
||||
ButtonBounce.pop(_button)
|
||||
|
||||
assert_vector(_button.scale).is_equal(ButtonBounce.POP_SCALE)
|
||||
await _settle()
|
||||
assert_vector(_button.scale).is_equal_approx(Vector2.ONE, Vector2(0.01, 0.01))
|
||||
|
||||
|
||||
func test_a_new_animation_stops_the_one_before() -> void:
|
||||
_button.mouse_entered.emit()
|
||||
_button.button_down.emit()
|
||||
await _settle()
|
||||
|
||||
# Only the last one ran to the end
|
||||
assert_vector(_button.scale).is_equal_approx(ButtonBounce.PRESSED_SCALE, Vector2(0.01, 0.01))
|
||||
@@ -0,0 +1 @@
|
||||
uid://b8tyllgau53y6
|
||||
Reference in new issue
Block a user