From 06421bb63e53d3021946fbd3b241fc2e7f755507 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 14 Oct 2026 23:32:09 +0200 Subject: [PATCH] Change soundtrack covers from the app and show the cover with the answer Cover menu in the soundtrack popup ("Change cover"): - Choose picture uploads a JPEG, PNG or WebP picture (up to 10 MB). - Pick by ID uses a game's cover on SteamGridDB or an anime's on AniList. - Remove cover deletes it, so the server searches for a new one. - The server's reason is shown when it refuses a change. After a change the new cover time is fetched, and the popup, the statistics card and the quiz show the new cover. Quiz: once the answer is shown, the soundtrack's cover shows to the left of the titles. Cover and titles are centered together, left and right and up and down, and each title keeps to two lines. Cover times come from the soundtrack list, and songs keep their soundtrack's UUID, also in saves. Requests can now send any body with its content type, and every 2xx answer counts as success. Cover frames are 2:3 like the server's covers. Small copies of real covers are used by the tests and screenshots. Co-Authored-By: Claude Opus 5.5 --- common/cover_cache.gd | 49 + data/playlist.gd | 4 + data/song_object.gd | 9 + main/main_window.gd | 11 + popups/SoundtrackStatsPopup.tscn | 125 +- popups/search_popup.gd | 4 + popups/soundtrack_stats_popup.gd | 154 +- quiz/NowPlaying.tscn | 41 +- quiz/Quiz.tscn | 2 +- quiz/now_playing.gd | 105 +- quiz/quiz.gd | 2 +- quiz/song_loader.gd | 2 + server/http_transport.gd | 11 +- server/music_server_client.gd | 80 +- statistics/SoundtrackCard.tscn | 2 +- statistics/soundtrack_card.gd | 8 + statistics/statistics_view.gd | 9 + tests/data/covers/cover_0.jpg | Bin 0 -> 31676 bytes tests/data/covers/cover_1.jpg | Bin 0 -> 10541 bytes tests/data/covers/cover_2.jpg | Bin 0 -> 33128 bytes tests/data/covers/cover_3.jpg | Bin 0 -> 27243 bytes tests/data/covers/cover_4.jpg | Bin 0 -> 28109 bytes tests/data/layout_baseline.json | 3982 +++++++++++++++----- tests/fakes/fake_http_transport.gd | 15 +- tests/fakes/ui_tour.gd | 25 +- tests/integration/test_animations.gd | 2 +- tests/integration/test_continue_quiz.gd | 4 +- tests/integration/test_covers_and_names.gd | 209 +- tests/integration/test_main_window.gd | 4 +- tests/integration/test_now_playing.gd | 15 +- tests/integration/test_offline_mode.gd | 4 +- tests/integration/test_scene_split.gd | 4 +- tests/unit/test_music_server_client.gd | 4 +- 33 files changed, 3966 insertions(+), 920 deletions(-) create mode 100644 tests/data/covers/cover_0.jpg create mode 100644 tests/data/covers/cover_1.jpg create mode 100644 tests/data/covers/cover_2.jpg create mode 100644 tests/data/covers/cover_3.jpg create mode 100644 tests/data/covers/cover_4.jpg diff --git a/common/cover_cache.gd b/common/cover_cache.gd index dd83637..5d2f3bc 100644 --- a/common/cover_cache.gd +++ b/common/cover_cache.gd @@ -6,6 +6,13 @@ extends RefCounted ## ## Covers are downloaded a few at a time, in the order they are asked for, so opening the ## statistics doesn't send a request for every soundtrack at once. +## +## It also remembers each soundtrack's cover time from the soundtrack lists it is given, +## so [method fetch_cover_of] finds a cover by the soundtrack alone, e.g. in the quiz. + +## Emitted when the cover time of a soundtrack is new or changed, e.g. once the soundtrack +## list has loaded or a cover was changed. +signal cover_times_changed const FOLDER_NAME: String = "covers" ## How many covers are downloaded at the same time. @@ -18,6 +25,8 @@ var _waiting: Array[Array] = [] # Who is waiting for each cover that is asked for or downloading: uuid -> Array[Callable] var _callbacks: Dictionary = {} var _downloading: int = 0 +# The server's cover time of each soundtrack seen: uuid -> int, 0 for none +var _times: Dictionary = {} func _init() -> void: @@ -32,6 +41,7 @@ static func folder() -> String: ## Deletes the covers of soundtracks that are not in [param covers] (UUID -> cover ## time), and those whose soundtrack no longer has a cover. func keep_only(covers: Dictionary) -> void: + set_cover_times(covers) var kept: Dictionary = {} for uuid: String in covers: if int(covers[uuid]) > 0: @@ -39,6 +49,45 @@ func keep_only(covers: Dictionary) -> void: _files.keep_only(kept) +## Remembers the cover times in [param covers] (UUID -> cover time, 0 for no cover) and +## emits [signal cover_times_changed] when any is new or changed. +func set_cover_times(covers: Dictionary) -> void: + var changed: bool = false + for uuid: String in covers: + var modified: int = int(covers[uuid]) + if _times.get(uuid, -1) != modified: + _times[uuid] = modified + changed = true + if changed: + cover_times_changed.emit() + + +## The cover time of the soundtrack [param uuid], 0 when it has no cover or none is known. +func cover_time(uuid: String) -> int: + return _times.get(uuid, 0) + + +## Like [method fetch_cover], with the cover time remembered for the soundtrack. +func fetch_cover_of(uuid: String, on_done: Callable) -> void: + fetch_cover(uuid, cover_time(uuid), on_done) + + +## Asks the server for the cover time of the soundtrack [param uuid] again, e.g. after +## its cover was changed, then calls [param on_done] with the new time, 0 for no cover. +## A removed cover is deleted from disk too. When the server doesn't answer, it is called +## with the time it had. +func refresh(uuid: String, on_done: Callable) -> void: + var with_soundtrack: Callable = func with_soundtrack( + soundtrack: SoundtrackWithSongList) -> void: + if soundtrack.cover_modified <= 0: + _files.remove(uuid) + set_cover_times({uuid: soundtrack.cover_modified}) + on_done.call(soundtrack.cover_modified) + # Without an answer the cover is left as it was + MusicServerClient.fetch_soundtrack(uuid, with_soundtrack, + func() -> void: on_done.call(cover_time(uuid))) + + ## Calls [param on_done] with the cover of the soundtrack [param uuid] as an [Image]: ## from disk when the cached one has the server's time [param modified], otherwise once ## it has been downloaded. Nothing is called when the soundtrack has no cover diff --git a/data/playlist.gd b/data/playlist.gd index b419280..1f05775 100644 --- a/data/playlist.gd +++ b/data/playlist.gd @@ -108,6 +108,10 @@ func get_current_soundtrack_title() -> String: return song_object_array[currently_playing_song].get_soundtrack_title() +func get_current_soundtrack_uuid() -> String: + return song_object_array[currently_playing_song].get_soundtrack_uuid() + + func get_current_song_title() -> String: return song_object_array[currently_playing_song].get_song_title() diff --git a/data/song_object.gd b/data/song_object.gd index 7f9324d..df0c2db 100644 --- a/data/song_object.gd +++ b/data/song_object.gd @@ -5,6 +5,8 @@ class_name SongObject var song_number: int var song_title: String var soundtrack_title: String +## The UUID of the song's soundtrack on the server, empty for songs from a music folder. +var soundtrack_uuid: String = "" ## Ids of the players who got a point for this song. var players_given_point: Array[String] = [] @@ -36,6 +38,11 @@ func get_song_title() -> String: return "??????" +## The soundtrack's UUID once the answer is shown, otherwise empty. +func get_soundtrack_uuid() -> String: + return soundtrack_uuid if is_answered else "" + + func get_song_info() -> String: if Settings.is_debug: return "%d. %s | played: %s | answered: %s" % [(song_number + 1), _full_title(), @@ -71,6 +78,7 @@ func to_dict() -> Dictionary: "number": song_number, "soundtrack": soundtrack_title, "song": song_title, "points": players_given_point.duplicate(), "answered": is_answered, "played": has_played, "playing": is_playing, "path": song_path, + "soundtrack_uuid": soundtrack_uuid, } @@ -83,6 +91,7 @@ static func from_dict(data: Variant) -> SongObject: song_object.song_number = int(data.number) song_object.soundtrack_title = str(data.get("soundtrack", "")) song_object.song_title = str(data.get("song", "")) + song_object.soundtrack_uuid = str(data.get("soundtrack_uuid", "")) if data.get("points") is Array: for player_id: Variant in data.points: song_object.add_point(str(player_id)) diff --git a/main/main_window.gd b/main/main_window.gd index 879675d..9591934 100644 --- a/main/main_window.gd +++ b/main/main_window.gd @@ -48,11 +48,14 @@ func _ready() -> void: quiz.event_logged.connect(log_popup.add_log_row) statistics_view.soundtrack_selected.connect(soundtrack_stats_popup.show_soundtrack) soundtrack_stats_popup.covers = statistics_view.covers + quiz.now_playing.covers = statistics_view.covers + search_popup.soundtracks_loaded.connect(_remember_cover_times) # New alternative names are found by the statistics search and the Search popup soundtrack_stats_popup.alternative_names_changed.connect( statistics_view.update_alternative_names) soundtrack_stats_popup.alternative_names_changed.connect( func(_soundtrack: Soundtrack) -> void: search_popup.get_list_of_soundtracks()) + soundtrack_stats_popup.cover_changed.connect(statistics_view.update_cover) # A saved quiz may have been played from a music folder top_bar.update_offline_state() @@ -60,6 +63,14 @@ func _ready() -> void: show_about_if_new_version() +# The quiz finds a soundtrack's cover by the cover times in the soundtrack list +func _remember_cover_times(soundtracks: Array[Soundtrack]) -> void: + var times: Dictionary = {} + for soundtrack: Soundtrack in soundtracks: + times[soundtrack.uuid] = soundtrack.cover_modified + statistics_view.covers.set_cover_times(times) + + # After another server or a music folder was picked. Statistics need the server. func _on_music_source_changed() -> void: top_bar.update_offline_state() diff --git a/popups/SoundtrackStatsPopup.tscn b/popups/SoundtrackStatsPopup.tscn index 88cafed..1e6f247 100644 --- a/popups/SoundtrackStatsPopup.tscn +++ b/popups/SoundtrackStatsPopup.tscn @@ -36,8 +36,8 @@ clip_children = 2 layout_mode = 0 offset_left = 20.0 offset_top = 64.0 -offset_right = 164.0 -offset_bottom = 264.0 +offset_right = 160.0 +offset_bottom = 274.0 mouse_filter = 2 theme_type_variation = &"SoundtrackCover" @@ -90,13 +90,22 @@ autowrap_mode = 3 text_overrun_behavior = 3 max_lines_visible = 3 -[node name="EditNamesButton" type="Button" parent="StatsPanel/Info"] +[node name="InfoButtons" type="HBoxContainer" parent="StatsPanel/Info"] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="EditNamesButton" type="Button" parent="StatsPanel/Info/InfoButtons"] unique_name_in_owner = true layout_mode = 2 -size_flags_horizontal = 0 focus_mode = 0 text = "Edit names" +[node name="ChangeCoverButton" type="Button" parent="StatsPanel/Info/InfoButtons"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +text = "Change cover" + [node name="ScrollContainer" type="ScrollContainer" parent="StatsPanel" unique_id=1213000005] unique_name_in_owner = true layout_mode = 0 @@ -180,3 +189,111 @@ unique_name_in_owner = true layout_mode = 2 focus_mode = 0 text = "Save" + +[node name="CoverEditor" type="VBoxContainer" parent="StatsPanel"] +unique_name_in_owner = true +visible = false +layout_mode = 0 +offset_left = 20.0 +offset_top = 280.0 +offset_right = 680.0 +offset_bottom = 784.0 +theme_override_constants/separation = 10 + +[node name="CoverEditorTitle" type="Label" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +theme_type_variation = &"Title" +text = "Cover" + +[node name="CoverEditorHelp" type="Label" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +autowrap_mode = 3 +text = "The server finds covers by itself. When it found the wrong one, or none, choose a picture of your own or the cover of a game on SteamGridDB or an anime on AniList. The server keeps a cover set here until it is removed." + +[node name="PictureRow" type="HBoxContainer" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +theme_override_constants/separation = 12 + +[node name="ChoosePictureButton" type="Button" parent="StatsPanel/CoverEditor/PictureRow"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +text = "Choose picture…" + +[node name="RemoveCoverButton" type="Button" parent="StatsPanel/CoverEditor/PictureRow"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +text = "Remove cover" + +[node name="SourceTitle" type="Label" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +theme_type_variation = &"HighlightMedium" +text = "Pick by ID" + +[node name="SourceHelp" type="Label" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +theme_type_variation = &"TextMedium" +autowrap_mode = 3 +text = "The ID is the number in the game's or anime's web address." + +[node name="SourceRow" type="HBoxContainer" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="CoverSourceButton" type="OptionButton" parent="StatsPanel/CoverEditor/SourceRow"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +selected = 0 +item_count = 2 +popup/item_0/text = "SteamGridDB" +popup/item_0/id = 0 +popup/item_1/text = "AniList" +popup/item_1/id = 1 + +[node name="CoverIdField" type="LineEdit" parent="StatsPanel/CoverEditor/SourceRow"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "ID" +max_length = 50 + +[node name="UseSourceButton" type="Button" parent="StatsPanel/CoverEditor/SourceRow"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +text = "Use" + +[node name="CoverEditorSpace" type="Control" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +size_flags_vertical = 3 +mouse_filter = 2 + +[node name="CoverStatus" type="Label" parent="StatsPanel/CoverEditor"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +theme_type_variation = &"HighlightMedium" +autowrap_mode = 3 + +[node name="CoverEditorButtons" type="HBoxContainer" parent="StatsPanel/CoverEditor"] +layout_mode = 2 +alignment = 2 + +[node name="CloseCoverButton" type="Button" parent="StatsPanel/CoverEditor/CoverEditorButtons"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +text = "Done" + +[node name="PictureDialog" type="FileDialog" parent="."] +unique_name_in_owner = true +title = "Choose a cover picture" +initial_position = 2 +size = Vector2i(800, 500) +ok_button_text = "Open" +file_mode = 0 +access = 2 +filters = PackedStringArray("*.jpg, *.jpeg, *.png, *.webp ; Pictures") +use_native_dialog = true diff --git a/popups/search_popup.gd b/popups/search_popup.gd index 9417ee4..1842090 100644 --- a/popups/search_popup.gd +++ b/popups/search_popup.gd @@ -4,6 +4,9 @@ extends BasePopup ## highlights the letters that matched. Soundtracks are also found by their alternative ## names; the alternative name that matched is shown after the real name. +## Emitted with every soundtrack on the server when the list has loaded. +signal soundtracks_loaded(list: Array[Soundtrack]) + ## Every soundtrack on the server, sorted by name. var soundtracks: Array = [] @@ -98,6 +101,7 @@ func get_list_of_soundtracks() -> void: names.sort_custom(func(a: String, b: String) -> bool: return a.naturalnocasecmp_to(b) < 0) set_soundtracks(names, alternatives) + soundtracks_loaded.emit(list) MusicServerClient.fetch_soundtracks(with_names, _load_names_only) diff --git a/popups/soundtrack_stats_popup.gd b/popups/soundtrack_stats_popup.gd index 41fc257..2fe124f 100644 --- a/popups/soundtrack_stats_popup.gd +++ b/popups/soundtrack_stats_popup.gd @@ -5,9 +5,19 @@ extends BasePopup ## ## Edit names opens an editor for the alternative names in place of the song list. Saving ## sends them to the server, which search then finds the soundtrack by. +## +## Change cover opens the cover menu there instead: upload a picture, pick a game's or +## anime's cover by its ID on SteamGridDB or AniList, or remove the cover so the server +## looks for one again. ## Emitted when the alternative names of [param soundtrack] have been saved. signal alternative_names_changed(soundtrack: Soundtrack) +## Emitted when the cover of the soundtrack [param uuid] changed, with its new cover time +## [param modified], 0 when it was removed. +signal cover_changed(uuid: String, modified: int) + +## The largest picture the server takes as a cover. +const MAX_COVER_BYTES: int = 10 << 20 ## The covers on disk, shared with the statistics view. No cover is shown without it. var covers: CoverCache @@ -32,6 +42,16 @@ var _edited_names: Array[String] = [] @onready var editor_status: Label = %EditorStatus @onready var save_names_button: Button = %SaveNamesButton @onready var cancel_names_button: Button = %CancelNamesButton +@onready var change_cover_button: Button = %ChangeCoverButton +@onready var cover_editor: VBoxContainer = %CoverEditor +@onready var choose_picture_button: Button = %ChoosePictureButton +@onready var remove_cover_button: Button = %RemoveCoverButton +@onready var cover_source_button: OptionButton = %CoverSourceButton +@onready var cover_id_field: LineEdit = %CoverIdField +@onready var use_source_button: Button = %UseSourceButton +@onready var cover_status: Label = %CoverStatus +@onready var close_cover_button: Button = %CloseCoverButton +@onready var picture_dialog: FileDialog = %PictureDialog func _ready() -> void: @@ -40,6 +60,13 @@ func _ready() -> void: new_name_field.text_submitted.connect(func(_text: String) -> void: add_name()) save_names_button.pressed.connect(save_names) cancel_names_button.pressed.connect(stop_editing) + change_cover_button.pressed.connect(change_cover) + choose_picture_button.pressed.connect(picture_dialog.popup_centered) + picture_dialog.file_selected.connect(upload_picture) + remove_cover_button.pressed.connect(remove_cover) + use_source_button.pressed.connect(use_cover_source) + cover_id_field.text_submitted.connect(func(_text: String) -> void: use_cover_source()) + close_cover_button.pressed.connect(stop_editing) ## Shows [param shown] and opens the popup. @@ -57,10 +84,7 @@ func show_soundtrack(shown: SoundtrackWithSongs) -> void: _show_names() cover_placeholder.text = SoundtrackCard.initials(shown.soundtrack_name) - _show_cover(null) - if covers != null: - covers.fetch_cover(shown.soundtrack_uuid, shown.cover_modified, - _show_cover_of.bind(shown.soundtrack_uuid)) + _load_cover() Settings.delete_children(song_list) var songs: Array[SongInfoForStats] = SoundtrackCard.songs_by_plays(shown.songs) @@ -76,18 +100,71 @@ func edit_names() -> void: new_name_field.text = "" editor_status.visible = false _show_edited_names() - names_editor.visible = true - song_scroll.visible = false - edit_names_button.disabled = true + _show_editor(names_editor) new_name_field.grab_focus() -## Closes the editor without saving. +## Opens the cover menu, in place of the song list. +func change_cover() -> void: + cover_id_field.text = "" + cover_status.visible = false + _set_cover_busy(false) + _show_editor(cover_editor) + + +## Closes the editors, without saving the names. func stop_editing() -> void: - names_editor.visible = false - song_scroll.visible = true - edit_names_button.disabled = false + _show_editor(null) _set_saving(false) + _set_cover_busy(false) + + +## Uploads the picture at [param path] as the soundtrack's cover. +func upload_picture(path: String) -> void: + var picture: PackedByteArray = FileAccess.get_file_as_bytes(path) + var content_type: String = picture_type(picture) + if picture.size() > MAX_COVER_BYTES: + _show_cover_status("The picture is larger than %d MB." % (MAX_COVER_BYTES >> 20)) + return + if content_type.is_empty() || CharacterCard.image_from_bytes(picture) == null: + _show_cover_status("Only JPEG, PNG and WebP pictures can be used.") + return + _set_cover_busy(true, "Uploading the picture…") + MusicServerClient.upload_soundtrack_cover(soundtrack.soundtrack_uuid, picture, + content_type, _on_cover_saved.bind("The new cover is saved."), _on_cover_not_saved) + + +## Makes the cover of the game or anime with the ID in the field, on the site picked, +## the soundtrack's cover. +func use_cover_source() -> void: + var id: String = cover_id_field.text.strip_edges() + if id.is_empty() || use_source_button.disabled: + return + var source: String = MusicServerClient.COVER_SOURCES[cover_source_button.selected] + _set_cover_busy(true, "Getting the cover from %s…" + % cover_source_button.get_item_text(cover_source_button.selected)) + MusicServerClient.set_soundtrack_cover_source(soundtrack.soundtrack_uuid, source, id, + _on_cover_saved.bind("The new cover is saved."), _on_cover_not_saved) + + +## Removes the soundtrack's cover, so the server looks for one again. +func remove_cover() -> void: + _set_cover_busy(true, "Removing the cover…") + MusicServerClient.delete_soundtrack_cover(soundtrack.soundtrack_uuid, + _on_cover_saved.bind("The cover is removed. The server will look for a new one."), + _on_cover_not_saved) + + +## The type of [param picture] to upload it as, e.g. [code]"image/png"[/code], or empty +## when it is not a JPEG, PNG or WebP picture. +static func picture_type(picture: PackedByteArray) -> String: + if picture.size() >= 4 && picture.slice(0, 4) == PackedByteArray([0x89, 0x50, 0x4E, 0x47]): + return "image/png" + if picture.size() >= 3 && picture.slice(0, 3) == PackedByteArray([0xFF, 0xD8, 0xFF]): + return "image/jpeg" + if picture.size() >= 12 && picture.slice(8, 12).get_string_from_ascii() == "WEBP": + return "image/webp" + return "" ## Adds the name in the field to the edited names, unless it is empty, the soundtrack's @@ -162,6 +239,61 @@ func _show_edited_names() -> void: editor_names.add_child(list_row) +# Shows [param editor] in place of the song list, or the song list when it is null +func _show_editor(editor: Control) -> void: + names_editor.visible = editor == names_editor + cover_editor.visible = editor == cover_editor + song_scroll.visible = editor == null + edit_names_button.disabled = editor != null + change_cover_button.disabled = editor != null + + +# The cover changed on the server; its new time tells whether it has one and fetches it +func _on_cover_saved(message: String) -> void: + var uuid: String = soundtrack.soundtrack_uuid + var with_time: Callable = func with_time(modified: int) -> void: + if soundtrack == null || soundtrack.soundtrack_uuid != uuid: + return + soundtrack.cover_modified = modified + _load_cover() + _set_cover_busy(false) + _show_cover_status(message) + cover_changed.emit(uuid, modified) + if covers != null: + covers.refresh(uuid, with_time) + else: + with_time.call(soundtrack.cover_modified) + + +func _on_cover_not_saved() -> void: + _set_cover_busy(false) + var reason: String = MusicServerClient.last_error + _show_cover_status("Could not change the cover: %s." + % (reason if !reason.is_empty() else "the server could not be reached")) + + +func _set_cover_busy(busy: bool, message: String = "") -> void: + for button: Button in [choose_picture_button, use_source_button, close_cover_button]: + button.disabled = busy + remove_cover_button.disabled = busy || soundtrack == null \ + || soundtrack.cover_modified <= 0 + cover_source_button.disabled = busy + if busy: + _show_cover_status(message) + + +func _show_cover_status(message: String) -> void: + cover_status.text = message + cover_status.visible = true + + +func _load_cover() -> void: + _show_cover(null) + if covers != null: + covers.fetch_cover(soundtrack.soundtrack_uuid, soundtrack.cover_modified, + _show_cover_of.bind(soundtrack.soundtrack_uuid)) + + func _show_cover(cover: Image) -> void: cover_picture.texture = ImageTexture.create_from_image(cover) if cover != null else null cover_placeholder.visible = cover == null diff --git a/quiz/NowPlaying.tscn b/quiz/NowPlaying.tscn index 38d1c30..cb7a973 100644 --- a/quiz/NowPlaying.tscn +++ b/quiz/NowPlaying.tscn @@ -2,22 +2,57 @@ [ext_resource type="Script" path="res://quiz/now_playing.gd" id="part_script"] -[node name="NowPlaying" type="VBoxContainer" unique_id=42468498] +[node name="NowPlaying" type="HBoxContainer" unique_id=42468498] layout_mode = 3 offset_right = 1088.0 offset_bottom = 320.0 +theme_override_constants/separation = 32 +alignment = 1 script = ExtResource("part_script") -[node name="SoundtrackLabel" type="Label" parent="." unique_id=173147793] +[node name="CoverFrame" type="Panel" parent="."] +unique_name_in_owner = true +visible = false +clip_children = 2 +custom_minimum_size = Vector2(180, 270) +layout_mode = 2 +size_flags_vertical = 4 +mouse_filter = 2 +theme_type_variation = &"SoundtrackCover" + +[node name="CoverPicture" type="TextureRect" parent="CoverFrame"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +expand_mode = 1 +stretch_mode = 6 + +[node name="Titles" type="VBoxContainer" parent="."] +unique_name_in_owner = true +layout_mode = 2 +alignment = 1 + +[node name="SoundtrackLabel" type="Label" parent="Titles" unique_id=173147793] +unique_name_in_owner = true custom_minimum_size = Vector2(1, 1) layout_mode = 2 theme_type_variation = &"TitleLarge" horizontal_alignment = 1 autowrap_mode = 2 +text_overrun_behavior = 3 +max_lines_visible = 2 -[node name="SongLabel" type="Label" parent="." unique_id=1687490027] +[node name="SongLabel" type="Label" parent="Titles" unique_id=1687490027] +unique_name_in_owner = true custom_minimum_size = Vector2(1, 1) layout_mode = 2 theme_type_variation = &"TitleMedium" horizontal_alignment = 1 autowrap_mode = 2 +text_overrun_behavior = 3 +max_lines_visible = 2 diff --git a/quiz/Quiz.tscn b/quiz/Quiz.tscn index 230df88..6acfcb7 100644 --- a/quiz/Quiz.tscn +++ b/quiz/Quiz.tscn @@ -41,7 +41,7 @@ offset_bottom = 512.0 [node name="NowPlaying" parent="." unique_id=42468498 instance=ExtResource("scene_NowPlaying")] layout_mode = 0 offset_left = 64.0 -offset_top = 64.0 +offset_top = 56.0 offset_right = 1152.0 offset_bottom = 384.0 diff --git a/quiz/now_playing.gd b/quiz/now_playing.gd index 2c8167c..9ccaf6f 100644 --- a/quiz/now_playing.gd +++ b/quiz/now_playing.gd @@ -1,16 +1,105 @@ class_name NowPlaying -extends VBoxContainer +extends HBoxContainer ## The soundtrack and song that are playing, in large text at the top of the quiz. They -## fade in when they change. +## fade in when they change. Once the answer is shown, the soundtrack's cover shows on +## their left, when it has one, and the cover and titles are centered together. Both are +## centered up and down too, so the titles only move sideways when a cover comes. Each +## title has at most two lines. + +## The covers on disk. No cover is shown without it. +var covers: CoverCache: + set(value): + covers = value + if covers != null: + covers.cover_times_changed.connect(_load_cover) + _load_cover() + +# The soundtrack whose cover is shown or on its way, and the cover time asked for +var _cover_uuid: String = "" +var _cover_time: int = 0 + +@onready var soundtrack_label: Label = %SoundtrackLabel +@onready var song_label: Label = %SongLabel +@onready var cover_frame: Panel = %CoverFrame +@onready var cover_picture: TextureRect = %CoverPicture +@onready var titles: VBoxContainer = %Titles + + +func _ready() -> void: + resized.connect(_fit_titles) + _fit_titles() ## Shows [param soundtrack_title] and [param song_title]. The playlist hides them as -## question marks until the answer is shown. -func show_song(soundtrack_title: String, song_title: String) -> void: - var changed: bool = $SoundtrackLabel.text != soundtrack_title \ - || $SongLabel.text != song_title - $SoundtrackLabel.text = soundtrack_title - $SongLabel.text = song_title +## question marks until the answer is shown, and only then gives the +## [param soundtrack_uuid] whose cover is shown. +func show_song(soundtrack_title: String, song_title: String, + soundtrack_uuid: String = "") -> void: + var changed: bool = soundtrack_label.text != soundtrack_title \ + || song_label.text != song_title + soundtrack_label.text = soundtrack_title + song_label.text = song_title + _fit_titles() + if soundtrack_uuid != _cover_uuid: + _cover_uuid = soundtrack_uuid + _cover_time = 0 + _show_cover(null) + _load_cover() # A new song, or the answer being shown, fades in if changed: Anim.fade_in(self, Anim.SLOW) + + +## Whether a cover is shown. +func has_cover() -> bool: + return cover_frame.visible + + +# Asks for the cover, again when its time changed, e.g. once the soundtrack list loaded +func _load_cover() -> void: + if covers == null || _cover_uuid.is_empty() || !is_node_ready(): + return + var time: int = covers.cover_time(_cover_uuid) + if time == _cover_time: + return + _cover_time = time + if time <= 0: + _show_cover(null) + return + covers.fetch_cover(_cover_uuid, time, _show_cover_of.bind(_cover_uuid, time)) + + +# Covers arrive later; one for a song no longer shown is left out +func _show_cover_of(cover: Image, uuid: String, time: int) -> void: + if uuid == _cover_uuid && time == _cover_time: + _show_cover(cover) + + +func _show_cover(cover: Image) -> void: + var was_shown: bool = cover_frame.visible + cover_picture.texture = ImageTexture.create_from_image(cover) if cover != null else null + cover_frame.visible = cover != null + _fit_titles() + if cover_frame.visible && !was_shown: + Anim.fade_in(cover_frame, Anim.SLOW) + + +# The titles take the width of the longer one, so they stay next to the cover, but no +# more than there is room for; longer titles wrap. Beside a cover they line up with it +# on the left. +func _fit_titles() -> void: + var room: float = size.x + if cover_frame.visible: + room -= cover_frame.custom_minimum_size.x + get_theme_constant(&"separation") + var widest: float = maxf(_text_width(soundtrack_label), _text_width(song_label)) + titles.custom_minimum_size.x = clampf(ceilf(widest), 1.0, maxf(room, 1.0)) + var alignment: HorizontalAlignment = HORIZONTAL_ALIGNMENT_LEFT if cover_frame.visible \ + else HORIZONTAL_ALIGNMENT_CENTER + soundtrack_label.horizontal_alignment = alignment + song_label.horizontal_alignment = alignment + + +static func _text_width(label: Label) -> float: + var font: Font = label.get_theme_font(&"font") + return font.get_string_size(label.text, HORIZONTAL_ALIGNMENT_LEFT, -1, + label.get_theme_font_size(&"font_size")).x diff --git a/quiz/quiz.gd b/quiz/quiz.gd index b5a8639..2e8ddb9 100644 --- a/quiz/quiz.gd +++ b/quiz/quiz.gd @@ -171,7 +171,7 @@ func update_song_list() -> void: GameLog.debug("update_song_list") if Playlist.currently_playing_song >= 0: now_playing.show_song(Playlist.get_current_soundtrack_title(), - Playlist.get_current_song_title()) + Playlist.get_current_song_title(), Playlist.get_current_soundtrack_uuid()) music_list_panel.refresh() save_soon() diff --git a/quiz/song_loader.gd b/quiz/song_loader.gd index b0274b6..6857981 100644 --- a/quiz/song_loader.gd +++ b/quiz/song_loader.gd @@ -52,6 +52,7 @@ func load_song_list(saved: QuizSave = null) -> void: new_song_object.song_number = info.song_no new_song_object.soundtrack_title = info.soundtrack new_song_object.song_title = info.song + new_song_object.soundtrack_uuid = info.soundtrack_uuid new_song_object.is_answered = true new_song_object.has_played = true Playlist.add_to_playlist(new_song_object) @@ -139,6 +140,7 @@ func _fetch_song_info(new_song_object: SongObject) -> void: new_song_object.song_number = info.song_no new_song_object.soundtrack_title = info.soundtrack new_song_object.song_title = info.song + new_song_object.soundtrack_uuid = info.soundtrack_uuid GameLog.debug("new_song_object: ", new_song_object.to_string()) Playlist.add_to_playlist(new_song_object) if Playlist.should_preload_more_songs(): diff --git a/server/http_transport.gd b/server/http_transport.gd index 9908b15..d0621ef 100644 --- a/server/http_transport.gd +++ b/server/http_transport.gd @@ -18,14 +18,14 @@ func _init(owner: Node) -> void: ## Requests [param url] and calls [param on_complete] with ## [code](response_code: int, body: PackedByteArray, headers: PackedStringArray)[/code], ## the headers as [code]"Name: value"[/code] lines. Connection errors and timeouts are -## reported with response code 0 and no headers. [param headers] are sent as-is; a -## [param body] is sent as JSON. +## reported with response code 0 and no headers. [param headers], which name the +## [param body]'s type, are sent as-is. func request( url: String, method: int, on_complete: Callable, headers: PackedStringArray = PackedStringArray(), - body: String = "", + body: PackedByteArray = PackedByteArray(), ) -> void: var http_request: HTTPRequest = HTTPRequest.new() http_request.timeout = timeout_seconds @@ -43,10 +43,7 @@ func request( return on_complete.call(response_code, response_body, response_headers) ) - var all_headers: PackedStringArray = headers.duplicate() - if method == HTTPClient.METHOD_PUT || !body.is_empty(): - all_headers.append("Content-Type: application/json") - var error: int = http_request.request(url, all_headers, method, body) + var error: int = http_request.request_raw(url, headers, method, body) if error != OK: http_request.queue_free() push_error("Could not send request to %s (error %d)" % [url, error]) diff --git a/server/music_server_client.gd b/server/music_server_client.gd index 4b81e26..9030c6a 100644 --- a/server/music_server_client.gd +++ b/server/music_server_client.gd @@ -19,7 +19,7 @@ extends Node ## JSON objects are handed to [code]on_done[/code] as the classes generated from the ## server's OpenAPI spec (see [code]server/generated/[/code]), lists of them as typed ## Arrays. [code]on_failed[/code] is called with no arguments when a request fails, -## including when no token could be had. +## including when no token could be had; [member last_error] then has the server's reason. ## Path of the API on the server, added between [code]Settings.default_path[/code] and ## each endpoint. @@ -28,9 +28,17 @@ const API_PATH: String = "/api/v1" const CLIENT_TYPE: String = "godot" ## Header with the ID of the client's play queue, in requests and responses. const QUEUE_HEADER: String = "X-Queue-Id" +## The type of the JSON bodies sent. +const JSON_TYPE: String = "application/json" +## Where the cover of a soundtrack can be picked from, by the game's or anime's ID there. +const COVER_SOURCES: Array[String] = ["steamgriddb", "anilist"] ## Sends the actual HTTP requests. Swap it out in tests. var transport: HttpTransport +## The server's message for the request that failed last, e.g. [code]"covers are +## disabled"[/code], or empty when it gave none. Read it in an [code]on_failed[/code] +## callback, before another request can fail. +var last_error: String = "" var _token: String = "" # The server the token is for; switching server in the settings needs a new token @@ -135,7 +143,37 @@ func fetch_soundtracks(on_done: Callable, on_failed: Callable = Callable()) -> v ## PNG). The server answers 404 while it has no cover for it. func fetch_soundtrack_cover( uuid: String, on_done: Callable, on_failed: Callable = Callable()) -> void: - get_bytes("/soundtracks/%s/cover" % uuid.uri_encode(), on_done, on_failed) + get_bytes(_cover_path(uuid), on_done, on_failed) + + +## Stores [param image], a JPEG, PNG or WebP picture of [param content_type] such as +## [code]"image/png"[/code], as the cover of the soundtrack with [param uuid]. The +## server's automatic search never replaces it. +func upload_soundtrack_cover(uuid: String, image: PackedByteArray, content_type: String, + on_done: Callable, on_failed: Callable = Callable()) -> void: + _request(_cover_path(uuid), HTTPClient.METHOD_PUT, _call_ignoring_body.bind(on_done), + on_failed, true, image, content_type) + + +## Makes the cover of the game or anime with [param id] on [param source], one of +## [constant COVER_SOURCES], the cover of the soundtrack with [param uuid]. The server +## downloads it before answering. +func set_soundtrack_cover_source(uuid: String, source: String, id: String, + on_done: Callable, on_failed: Callable = Callable()) -> void: + var request: CoverSource = CoverSource.new() + request.source = source + request.id = id + _request(_cover_path(uuid) + "/source", HTTPClient.METHOD_PUT, + _call_ignoring_body.bind(on_done), on_failed, true, + JSON.stringify(request.to_dict()).to_utf8_buffer()) + + +## Deletes the cover of the soundtrack with [param uuid], also one set by hand, so the +## server's automatic search looks for a new one. +func delete_soundtrack_cover( + uuid: String, on_done: Callable, on_failed: Callable = Callable()) -> void: + _request(_cover_path(uuid), HTTPClient.METHOD_DELETE, _call_ignoring_body.bind(on_done), + on_failed) ## Replaces the alternative names of the soundtrack with [param uuid] with @@ -153,7 +191,7 @@ func set_alternative_names(uuid: String, names: Array[String], on_done: Callable return on_done.call(Soundtrack.from_dict(data)) _request(path, HTTPClient.METHOD_PUT, _parse_json.bind(path, saved, on_failed), on_failed, - true, JSON.stringify(request.to_dict())) + true, JSON.stringify(request.to_dict()).to_utf8_buffer()) ## Fetches a soundtrack and its songs as a [SoundtrackWithSongList]. @@ -444,25 +482,26 @@ func _parse_json( # Sends the request with the token, and once more with a new token if the server -# answers 401. A [param json_body] is sent as the request's body. +# answers 401. A [param body] of the type [param content_type] is sent with it. func _request( path: String, method: int, on_success: Callable, on_failed: Callable, may_retry: bool = true, - json_body: String = "", + body: PackedByteArray = PackedByteArray(), + content_type: String = JSON_TYPE, ) -> void: _with_token(func(token: String) -> void: - _send(path, method, token, func(response_code: int, body: PackedByteArray) -> void: + _send(path, method, token, func(response_code: int, response: PackedByteArray) -> void: if response_code == 401 && may_retry: GameLog.debug("Token refused by the server, getting a new one") if _token == token: clear_token() - _request(path, method, on_success, on_failed, false, json_body) + _request(path, method, on_success, on_failed, false, body, content_type) return - _handle_response(path, response_code, body, on_success, on_failed) - , json_body) + _handle_response(path, response_code, response, on_success, on_failed) + , body, content_type) , on_failed) @@ -476,12 +515,19 @@ func _send_once( func _send( - path: String, method: int, token: String, on_complete: Callable, body: String = "", + path: String, + method: int, + token: String, + on_complete: Callable, + body: PackedByteArray = PackedByteArray(), + content_type: String = JSON_TYPE, ) -> void: var server: String = Settings.default_path var headers: PackedStringArray = [] if !token.is_empty(): headers.append("Authorization: Bearer " + token) + if !body.is_empty() || method == HTTPClient.METHOD_PUT: + headers.append("Content-Type: " + content_type) var queue: String = Settings.queue_ids.get(server, "") if !queue.is_empty(): headers.append("%s: %s" % [QUEUE_HEADER, queue]) @@ -500,7 +546,9 @@ func _handle_response( on_success: Callable, on_failed: Callable, ) -> void: - if response_code != 200: + # Requests that change something may answer 204 No Content + if response_code < 200 || response_code >= 300: + last_error = _error_message(body).trim_prefix(": ") push_warning("Request to %s failed with response code %d%s" % [path, response_code, _error_message(body)]) _call_if_valid(on_failed) @@ -539,7 +587,7 @@ func _request_token() -> void: _token_server = server for waiter: Array in waiters: waiter[0].call(token) - , JSON.stringify(token_request.to_dict())) + , JSON.stringify(token_request.to_dict()).to_utf8_buffer()) func _read_token(response_code: int, body: PackedByteArray) -> String: @@ -568,6 +616,14 @@ static func _parse_or_null(body: PackedByteArray) -> Variant: return json.data if json.parse(body.get_string_from_utf8()) == OK else null +static func _cover_path(uuid: String) -> String: + return "/soundtracks/%s/cover" % uuid.uri_encode() + + +static func _call_ignoring_body(_body: PackedByteArray, callback: Callable) -> void: + _call_if_valid(callback) + + static func _call_if_valid(callback: Callable) -> void: if callback.is_valid(): callback.call() diff --git a/statistics/SoundtrackCard.tscn b/statistics/SoundtrackCard.tscn index e32cb92..21fc1ea 100644 --- a/statistics/SoundtrackCard.tscn +++ b/statistics/SoundtrackCard.tscn @@ -20,7 +20,7 @@ theme_override_constants/separation = 10 [node name="CoverFrame" type="Panel" parent="VBox/Header"] unique_name_in_owner = true clip_children = 2 -custom_minimum_size = Vector2(72, 100) +custom_minimum_size = Vector2(68, 102) layout_mode = 2 mouse_filter = 2 theme_type_variation = &"SoundtrackCover" diff --git a/statistics/soundtrack_card.gd b/statistics/soundtrack_card.gd index f089e7c..47ba9d1 100644 --- a/statistics/soundtrack_card.gd +++ b/statistics/soundtrack_card.gd @@ -80,6 +80,14 @@ func load_cover(covers: CoverCache) -> void: covers.fetch_cover(soundtrack.soundtrack_uuid, soundtrack.cover_modified, show_cover) +## Takes the soundtrack's new cover time [param modified], 0 when its cover was removed, +## and shows the initials until [method load_cover] fetches the new cover. +func set_cover_time(modified: int) -> void: + soundtrack.cover_modified = modified + show_cover(null) + _cover_asked = 0 + + ## Shows [param cover], or the initials when it is null. func show_cover(cover: Image) -> void: cover_picture.texture = ImageTexture.create_from_image(cover) if cover != null else null diff --git a/statistics/statistics_view.gd b/statistics/statistics_view.gd index 0965445..9a4f256 100644 --- a/statistics/statistics_view.gd +++ b/statistics/statistics_view.gd @@ -200,6 +200,15 @@ func update_alternative_names(updated: Soundtrack) -> void: apply_filter() +## Shows the new cover of the soundtrack [param uuid], with the cover time +## [param modified], or its initials when [param modified] is 0. +func update_cover(uuid: String, modified: int) -> void: + for card: SoundtrackCard in cards: + if card.soundtrack.soundtrack_uuid == uuid: + card.set_cover_time(modified) + load_covers_on_screen() + + func _update_search_names() -> void: var names: Array[String] = [] var alternatives: Dictionary = {} diff --git a/tests/data/covers/cover_0.jpg b/tests/data/covers/cover_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e507b1fcd6187141f68c2aca9eca9eeed4950f53 GIT binary patch literal 31676 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%0D#ztyqZw0rrtSk{{gZ-m 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 literal 0 HcmV?d00001 diff --git a/tests/data/covers/cover_1.jpg b/tests/data/covers/cover_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36bb15c23c942229f2b2372292fd9018c201bf09 GIT binary patch literal 10541 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 z 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 H@jw6BKDtZJ literal 0 HcmV?d00001 diff --git a/tests/data/covers/cover_4.jpg b/tests/data/covers/cover_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16bf280a1272a5620526593be9f9d29765d54b4b GIT binary patch literal 28109 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 DfgHNF literal 0 HcmV?d00001 diff --git a/tests/data/layout_baseline.json b/tests/data/layout_baseline.json index 06621c7..bd6fbca 100644 --- a/tests/data/layout_baseline.json +++ b/tests/data/layout_baseline.json @@ -1137,26 +1137,53 @@ "Quiz/NowPlaying": { "rect": [ 64.0, - 64.0, + 56.0, 1088.0, - 320.0 + 328.0 ], "visible": true }, - "Quiz/NowPlaying/SongLabel": { + "Quiz/NowPlaying/CoverFrame": { "rect": [ 64.0, - 137.0, - 1088.0, + 56.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/CoverFrame/CoverPicture": { + "rect": [ + 64.0, + 56.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/Titles": { + "rect": [ + 607.0, + 56.0, + 1.0, + 328.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles/SongLabel": { + "rect": [ + 607.0, + 232.0, + 1.0, 49.0 ], "visible": true }, - "Quiz/NowPlaying/SoundtrackLabel": { + "Quiz/NowPlaying/Titles/SoundtrackLabel": { "rect": [ - 64.0, - 64.0, - 1088.0, + 607.0, + 159.0, + 1.0, 69.0 ], "visible": true @@ -3150,6 +3177,15 @@ ], "visible": false }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -3159,12 +3195,156 @@ ], "visible": false }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -3172,8 +3352,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -3181,8 +3361,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -3195,7 +3375,25 @@ ], "visible": false }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 204.0, + 251.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 790.0, + 204.0, + 129.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 204.0, @@ -5126,26 +5324,53 @@ "Quiz/NowPlaying": { "rect": [ 64.0, - 64.0, + 56.0, 1088.0, - 320.0 + 328.0 ], "visible": true }, - "Quiz/NowPlaying/SongLabel": { + "Quiz/NowPlaying/CoverFrame": { "rect": [ - 64.0, - 137.0, - 1088.0, + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/CoverFrame/CoverPicture": { + "rect": [ + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/Titles": { + "rect": [ + 427.0, + 56.0, + 361.0, + 328.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles/SongLabel": { + "rect": [ + 427.0, + 232.0, + 361.0, 49.0 ], "visible": true }, - "Quiz/NowPlaying/SoundtrackLabel": { + "Quiz/NowPlaying/Titles/SoundtrackLabel": { "rect": [ - 64.0, - 64.0, - 1088.0, + 427.0, + 159.0, + 361.0, 69.0 ], "visible": true @@ -7634,6 +7859,15 @@ ], "visible": false }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -7643,12 +7877,156 @@ ], "visible": false }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 504.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 893.0, + 660.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 1225.0, + 893.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 465.0, + 660.0, + 75.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 704.0, + 660.0, + 179.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 660.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 550.0, + 660.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 550.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 796.0, + 550.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 627.0, + 660.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 663.0, + 660.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 783.0, + 663.0, + 446.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 663.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 1237.0, + 663.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 591.0, + 660.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -7656,8 +8034,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -7665,8 +8043,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -7679,7 +8057,25 @@ ], "visible": false }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 291.0, + 500.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 912.0, + 291.0, + 129.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 291.0, @@ -8079,7 +8475,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8088,7 +8484,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8097,43 +8493,43 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -8250,7 +8646,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -8259,7 +8655,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -8268,43 +8664,43 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 584.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 557.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -8421,7 +8817,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8430,7 +8826,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8439,43 +8835,43 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1350.0, + 1346.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/NameLabel": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/PlayedLabel": { "rect": [ - 1350.0, + 1346.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -8583,7 +8979,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8592,7 +8988,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8601,43 +8997,43 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -8745,7 +9141,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8754,7 +9150,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -8763,43 +9159,43 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -8898,7 +9294,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -8907,7 +9303,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -8916,43 +9312,43 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 228.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 201.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -9051,7 +9447,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -9060,7 +9456,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -9069,43 +9465,43 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -9195,7 +9591,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -9204,7 +9600,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -9213,43 +9609,43 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -9330,7 +9726,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -9339,7 +9735,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -9348,43 +9744,43 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1656.0, + 1652.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/NameLabel": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/PlayedLabel": { "rect": [ - 1656.0, + 1652.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -9457,7 +9853,7 @@ 44.0, 138.0, 266.0, - 100.0 + 102.0 ], "visible": false }, @@ -9465,8 +9861,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, @@ -9474,8 +9870,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, @@ -9483,23 +9879,23 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, - 100.0 + 188.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 138.0, 1.0, 23.0 @@ -9508,18 +9904,18 @@ }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -9536,7 +9932,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/LeastPlayedList": { "rect": [ 44.0, - 276.0, + 278.0, 266.0, 0.0 ], @@ -9545,7 +9941,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedHeader": { "rect": [ 44.0, - 242.0, + 244.0, 266.0, 26.0 ], @@ -9554,7 +9950,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedList": { "rect": [ 44.0, - 272.0, + 274.0, 266.0, 0.0 ], @@ -12715,26 +13111,53 @@ "Quiz/NowPlaying": { "rect": [ 64.0, - 64.0, + 56.0, 1088.0, - 320.0 + 328.0 ], "visible": true }, - "Quiz/NowPlaying/SongLabel": { + "Quiz/NowPlaying/CoverFrame": { "rect": [ 64.0, - 137.0, - 1088.0, + 56.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/CoverFrame/CoverPicture": { + "rect": [ + 64.0, + 56.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/Titles": { + "rect": [ + 607.0, + 56.0, + 1.0, + 328.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles/SongLabel": { + "rect": [ + 607.0, + 232.0, + 1.0, 49.0 ], "visible": true }, - "Quiz/NowPlaying/SoundtrackLabel": { + "Quiz/NowPlaying/Titles/SoundtrackLabel": { "rect": [ - 64.0, - 64.0, - 1088.0, + 607.0, + 159.0, + 1.0, 69.0 ], "visible": true @@ -14908,6 +15331,15 @@ ], "visible": false }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -14917,12 +15349,156 @@ ], "visible": false }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -14930,8 +15506,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -14939,8 +15515,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -14953,7 +15529,25 @@ ], "visible": false }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 204.0, + 251.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 790.0, + 204.0, + 129.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 204.0, @@ -17037,26 +17631,53 @@ "Quiz/NowPlaying": { "rect": [ 64.0, - 64.0, + 56.0, 1088.0, - 320.0 + 328.0 ], "visible": true }, - "Quiz/NowPlaying/SongLabel": { + "Quiz/NowPlaying/CoverFrame": { "rect": [ - 64.0, - 137.0, - 1088.0, + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": true + }, + "Quiz/NowPlaying/CoverFrame/CoverPicture": { + "rect": [ + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles": { + "rect": [ + 533.0, + 56.0, + 361.0, + 328.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles/SongLabel": { + "rect": [ + 533.0, + 232.0, + 361.0, 49.0 ], "visible": true }, - "Quiz/NowPlaying/SoundtrackLabel": { + "Quiz/NowPlaying/Titles/SoundtrackLabel": { "rect": [ - 64.0, - 64.0, - 1088.0, + 533.0, + 159.0, + 361.0, 69.0 ], "visible": true @@ -19230,6 +19851,15 @@ ], "visible": false }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -19239,12 +19869,156 @@ ], "visible": false }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -19252,8 +20026,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -19261,8 +20035,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -19275,7 +20049,25 @@ ], "visible": false }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 204.0, + 251.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 790.0, + 204.0, + 129.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 204.0, @@ -21650,7 +22442,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#7": { "rect": [ 408.0, - 497.0, + 458.0, 1104.0, 35.0 ], @@ -21659,7 +22451,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#7/#0": { "rect": [ 416.0, - 499.0, + 460.0, 1088.0, 31.0 ], @@ -21668,7 +22460,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#8": { "rect": [ 408.0, - 536.0, + 497.0, 1104.0, 35.0 ], @@ -21677,7 +22469,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#8/#0": { "rect": [ 416.0, - 538.0, + 499.0, 1088.0, 31.0 ], @@ -21686,7 +22478,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#9": { "rect": [ 408.0, - 575.0, + 536.0, 1104.0, 35.0 ], @@ -21695,7 +22487,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#9/#0": { "rect": [ 416.0, - 577.0, + 538.0, 1088.0, 31.0 ], @@ -23149,6 +23941,15 @@ ], "visible": true }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -23158,12 +23959,156 @@ ], "visible": true }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": true }, @@ -23171,8 +24116,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": true }, @@ -23180,8 +24125,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -23194,7 +24139,25 @@ ], "visible": true }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 291.0, + 500.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 912.0, + 291.0, + 129.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 291.0, @@ -23456,7 +24419,7 @@ "visible": true } }, - "popup_SoundtrackStats_names": { + "popup_SoundtrackStats_cover": { "SoundtrackStatsPopup": { "rect": [ 610.0, @@ -23466,6 +24429,15 @@ ], "visible": true }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -23475,12 +24447,156 @@ ], "visible": true }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 504.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 893.0, + 660.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 1225.0, + 893.0, + 65.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 465.0, + 660.0, + 75.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 704.0, + 660.0, + 179.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 660.0, + 35.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 550.0, + 660.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 550.0, + 154.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 796.0, + 550.0, + 133.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 627.0, + 660.0, + 26.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 663.0, + 660.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 783.0, + 663.0, + 446.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 663.0, + 145.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 1237.0, + 663.0, + 53.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 591.0, + 660.0, + 26.0 + ], + "visible": true + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": true }, @@ -23488,8 +24604,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": true }, @@ -23497,8 +24613,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -23511,7 +24627,585 @@ ], "visible": true }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 291.0, + 500.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 912.0, + 291.0, + 129.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { + "rect": [ + 790.0, + 291.0, + 110.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/NamesLabel": { + "rect": [ + 790.0, + 261.0, + 500.0, + 26.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/NamesTitle": { + "rect": [ + 790.0, + 231.0, + 500.0, + 26.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/SummaryLabel": { + "rect": [ + 790.0, + 204.0, + 500.0, + 23.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 504.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/AddRow": { + "rect": [ + 630.0, + 852.0, + 660.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/AddRow/AddNameButton": { + "rect": [ + 1235.0, + 852.0, + 55.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/AddRow/NewNameField": { + "rect": [ + 630.0, + 852.0, + 597.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorButtons": { + "rect": [ + 630.0, + 893.0, + 660.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorButtons/CancelNamesButton": { + "rect": [ + 1142.0, + 893.0, + 76.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorButtons/SaveNamesButton": { + "rect": [ + 1230.0, + 893.0, + 60.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorHelp": { + "rect": [ + 630.0, + 465.0, + 660.0, + 49.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll": { + "rect": [ + 630.0, + 524.0, + 660.0, + 318.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames": { + "rect": [ + 630.0, + 524.0, + 660.0, + 74.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#0": { + "rect": [ + 630.0, + 524.0, + 660.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#0/#0": { + "rect": [ + 638.0, + 526.0, + 644.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#0/#0/#0": { + "rect": [ + 638.0, + 530.0, + 553.0, + 23.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#0/#0/#1": { + "rect": [ + 1195.0, + 526.0, + 87.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#1": { + "rect": [ + 630.0, + 563.0, + 660.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#1/#0": { + "rect": [ + 638.0, + 565.0, + 644.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#1/#0/#0": { + "rect": [ + 638.0, + 569.0, + 553.0, + 23.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorScroll/EditorNames/#1/#0/#1": { + "rect": [ + 1195.0, + 565.0, + 87.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/NamesEditor/EditorTitle": { + "rect": [ + 630.0, + 420.0, + 660.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer": { + "rect": [ + 630.0, + 420.0, + 660.0, + 504.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList": { + "rect": [ + 630.0, + 420.0, + 660.0, + 176.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#0": { + "rect": [ + 630.0, + 420.0, + 660.0, + 32.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#0/#0": { + "rect": [ + 638.0, + 422.0, + 644.0, + 28.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#1": { + "rect": [ + 630.0, + 456.0, + 660.0, + 32.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#1/#0": { + "rect": [ + 638.0, + 458.0, + 644.0, + 28.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#2": { + "rect": [ + 630.0, + 492.0, + 660.0, + 32.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#2/#0": { + "rect": [ + 638.0, + 494.0, + 644.0, + 28.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#3": { + "rect": [ + 630.0, + 528.0, + 660.0, + 32.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#3/#0": { + "rect": [ + 638.0, + 530.0, + 644.0, + 28.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#4": { + "rect": [ + 630.0, + 564.0, + 660.0, + 32.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/ScrollContainer/SongList/#4/#0": { + "rect": [ + 638.0, + 566.0, + 644.0, + 28.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/TitleLabel": { + "rect": [ + 630.0, + 152.0, + 660.0, + 38.0 + ], + "visible": true + } + }, + "popup_SoundtrackStats_names": { + "SoundtrackStatsPopup": { + "rect": [ + 610.0, + 140.0, + 1920.0, + 1080.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel": { + "rect": [ + 610.0, + 140.0, + 700.0, + 800.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverFrame": { + "rect": [ + 630.0, + 204.0, + 140.0, + 210.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverFrame/CoverPicture": { + "rect": [ + 630.0, + 204.0, + 140.0, + 210.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/CoverFrame/CoverPlaceholder": { + "rect": [ + 630.0, + 204.0, + 140.0, + 210.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info": { + "rect": [ + 790.0, + 204.0, + 500.0, + 200.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 291.0, + 500.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 912.0, + 291.0, + 129.0, + 31.0 + ], + "visible": true + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 291.0, @@ -26269,26 +27963,53 @@ "Quiz/NowPlaying": { "rect": [ 64.0, - 64.0, + 56.0, 1088.0, - 320.0 + 328.0 ], "visible": true }, - "Quiz/NowPlaying/SongLabel": { + "Quiz/NowPlaying/CoverFrame": { "rect": [ 64.0, - 137.0, - 1088.0, + 56.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/CoverFrame/CoverPicture": { + "rect": [ + 64.0, + 56.0, + 180.0, + 270.0 + ], + "visible": false + }, + "Quiz/NowPlaying/Titles": { + "rect": [ + 607.0, + 56.0, + 1.0, + 328.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles/SongLabel": { + "rect": [ + 607.0, + 232.0, + 1.0, 49.0 ], "visible": true }, - "Quiz/NowPlaying/SoundtrackLabel": { + "Quiz/NowPlaying/Titles/SoundtrackLabel": { "rect": [ - 64.0, - 64.0, - 1088.0, + 607.0, + 159.0, + 1.0, 69.0 ], "visible": true @@ -28282,6 +30003,15 @@ ], "visible": false }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -28291,12 +30021,156 @@ ], "visible": false }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -28304,8 +30178,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -28313,8 +30187,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -28327,7 +30201,25 @@ ], "visible": false }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 204.0, + 251.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 790.0, + 204.0, + 129.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 204.0, @@ -29224,7 +31116,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": true @@ -29233,7 +31125,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": true @@ -29242,43 +31134,43 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 113.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 228.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 59.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 201.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -29377,7 +31269,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29386,7 +31278,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29395,43 +31287,43 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -29530,7 +31422,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29539,7 +31431,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29548,43 +31440,43 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -29692,7 +31584,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29701,7 +31593,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29710,43 +31602,43 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1350.0, + 1346.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/NameLabel": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/PlayedLabel": { "rect": [ - 1350.0, + 1346.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -29854,7 +31746,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29863,7 +31755,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29872,43 +31764,43 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1656.0, + 1652.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/NameLabel": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/PlayedLabel": { "rect": [ - 1656.0, + 1652.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -29989,7 +31881,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -29998,7 +31890,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -30007,43 +31899,43 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -30133,7 +32025,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -30142,7 +32034,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -30151,43 +32043,43 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -30268,7 +32160,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -30277,7 +32169,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true @@ -30286,43 +32178,43 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -30439,7 +32331,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": true @@ -30448,7 +32340,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": true @@ -30457,43 +32349,43 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 113.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 584.0, - 184.0, + 188.0, 23.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 59.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 557.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -30602,7 +32494,7 @@ 44.0, 138.0, 266.0, - 100.0 + 102.0 ], "visible": true }, @@ -30610,8 +32502,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": true }, @@ -30619,8 +32511,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": true }, @@ -30628,23 +32520,23 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, - 100.0 + 188.0, + 102.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 138.0, 1.0, 23.0 @@ -30653,18 +32545,18 @@ }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -30681,7 +32573,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/LeastPlayedList": { "rect": [ 44.0, - 276.0, + 278.0, 266.0, 0.0 ], @@ -30690,7 +32582,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedHeader": { "rect": [ 44.0, - 242.0, + 244.0, 266.0, 26.0 ], @@ -30699,7 +32591,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedList": { "rect": [ 44.0, - 272.0, + 274.0, 266.0, 0.0 ], @@ -31017,7 +32909,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -31026,7 +32918,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -31035,43 +32927,43 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 228.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 201.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -31170,7 +33062,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31179,7 +33071,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31188,43 +33080,43 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -31323,7 +33215,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31332,7 +33224,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31341,43 +33233,43 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -31485,7 +33377,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31494,7 +33386,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31503,43 +33395,43 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1350.0, + 1346.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/NameLabel": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/PlayedLabel": { "rect": [ - 1350.0, + 1346.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -31647,7 +33539,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31656,7 +33548,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31665,43 +33557,43 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1656.0, + 1652.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/NameLabel": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/PlayedLabel": { "rect": [ - 1656.0, + 1652.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -31782,7 +33674,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31791,7 +33683,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31800,43 +33692,43 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -31926,7 +33818,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31935,7 +33827,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -31944,43 +33836,43 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -32061,7 +33953,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -32070,7 +33962,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -32079,43 +33971,43 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -32232,7 +34124,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -32241,7 +34133,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -32250,43 +34142,43 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 584.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#9/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 557.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -32395,7 +34287,7 @@ 44.0, 138.0, 266.0, - 100.0 + 102.0 ], "visible": true }, @@ -32403,8 +34295,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": true }, @@ -32412,8 +34304,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": true }, @@ -32421,23 +34313,23 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, - 100.0 + 188.0, + 102.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 138.0, 1.0, 23.0 @@ -32446,18 +34338,18 @@ }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -32474,7 +34366,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/LeastPlayedList": { "rect": [ 44.0, - 276.0, + 278.0, 266.0, 0.0 ], @@ -32483,7 +34375,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedHeader": { "rect": [ 44.0, - 242.0, + 244.0, 266.0, 26.0 ], @@ -32492,7 +34384,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedList": { "rect": [ 44.0, - 272.0, + 274.0, 266.0, 0.0 ], @@ -32810,7 +34702,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -32819,7 +34711,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -32828,43 +34720,43 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -32981,7 +34873,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -32990,7 +34882,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -32999,43 +34891,43 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 584.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 557.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -33152,7 +35044,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33161,7 +35053,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33170,43 +35062,43 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1350.0, + 1346.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/NameLabel": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/PlayedLabel": { "rect": [ - 1350.0, + 1346.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -33314,7 +35206,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33323,7 +35215,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33332,43 +35224,43 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -33476,7 +35368,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33485,7 +35377,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33494,43 +35386,43 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -33629,7 +35521,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -33638,7 +35530,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -33647,43 +35539,43 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 228.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 201.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -33782,7 +35674,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33791,7 +35683,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33800,43 +35692,43 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -33926,7 +35818,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33935,7 +35827,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -33944,43 +35836,43 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -34061,7 +35953,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -34070,7 +35962,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -34079,43 +35971,43 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1656.0, + 1652.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/NameLabel": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/PlayedLabel": { "rect": [ - 1656.0, + 1652.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -34188,7 +36080,7 @@ 44.0, 138.0, 266.0, - 100.0 + 102.0 ], "visible": true }, @@ -34196,8 +36088,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": true }, @@ -34205,8 +36097,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": true }, @@ -34214,23 +36106,23 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, - 100.0 + 188.0, + 102.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 138.0, 1.0, 23.0 @@ -34239,18 +36131,18 @@ }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": true }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": true @@ -34267,7 +36159,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/LeastPlayedList": { "rect": [ 44.0, - 276.0, + 278.0, 266.0, 0.0 ], @@ -34276,7 +36168,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedHeader": { "rect": [ 44.0, - 242.0, + 244.0, 266.0, 26.0 ], @@ -34285,7 +36177,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedList": { "rect": [ 44.0, - 272.0, + 274.0, 266.0, 0.0 ], @@ -34603,7 +36495,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -34612,7 +36504,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -34621,43 +36513,43 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -34774,7 +36666,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -34783,7 +36675,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -34792,43 +36684,43 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 584.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 557.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -34945,7 +36837,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -34954,7 +36846,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -34963,43 +36855,43 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1350.0, + 1346.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/NameLabel": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/PlayedLabel": { "rect": [ - 1350.0, + 1346.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -35107,7 +36999,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35116,7 +37008,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35125,43 +37017,43 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -35269,7 +37161,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35278,7 +37170,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35287,43 +37179,43 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -35422,7 +37314,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -35431,7 +37323,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -35440,43 +37332,43 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 228.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 201.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -35575,7 +37467,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35584,7 +37476,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35593,43 +37485,43 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -35719,7 +37611,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35728,7 +37620,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35737,43 +37629,43 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -35854,7 +37746,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35863,7 +37755,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -35872,43 +37764,43 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1656.0, + 1652.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/NameLabel": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/PlayedLabel": { "rect": [ - 1656.0, + 1652.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -35981,7 +37873,7 @@ 44.0, 138.0, 266.0, - 100.0 + 102.0 ], "visible": false }, @@ -35989,8 +37881,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, @@ -35998,8 +37890,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, @@ -36007,23 +37899,23 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, - 100.0 + 188.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 138.0, 1.0, 23.0 @@ -36032,18 +37924,18 @@ }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -36060,7 +37952,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/LeastPlayedList": { "rect": [ 44.0, - 276.0, + 278.0, 266.0, 0.0 ], @@ -36069,7 +37961,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedHeader": { "rect": [ 44.0, - 242.0, + 244.0, 266.0, 26.0 ], @@ -36078,7 +37970,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedList": { "rect": [ 44.0, - 272.0, + 274.0, 266.0, 0.0 ], @@ -37701,7 +39593,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -37710,7 +39602,7 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -37719,43 +39611,43 @@ "rect": [ 656.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#0/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -37872,7 +39764,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -37881,7 +39773,7 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -37890,43 +39782,43 @@ "rect": [ 962.0, 494.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 584.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 494.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#1/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 557.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -38043,7 +39935,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38052,7 +39944,7 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38061,43 +39953,43 @@ "rect": [ 1268.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1350.0, + 1346.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/NameLabel": { "rect": [ - 1350.0, + 1346.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#2/VBox/Header/Info/PlayedLabel": { "rect": [ - 1350.0, + 1346.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -38205,7 +40097,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38214,7 +40106,7 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38223,43 +40115,43 @@ "rect": [ 962.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1044.0, + 1040.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/NameLabel": { "rect": [ - 1044.0, + 1040.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#3/VBox/Header/Info/PlayedLabel": { "rect": [ - 1044.0, + 1040.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -38367,7 +40259,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38376,7 +40268,7 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38385,43 +40277,43 @@ "rect": [ 656.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 738.0, + 734.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/NameLabel": { "rect": [ - 738.0, + 734.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#4/VBox/Header/Info/PlayedLabel": { "rect": [ - 738.0, + 734.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -38520,7 +40412,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -38529,7 +40421,7 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false @@ -38538,43 +40430,43 @@ "rect": [ 350.0, 138.0, - 72.0, + 68.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 113.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 228.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 138.0, - 184.0, + 188.0, 59.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#5/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 201.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -38673,7 +40565,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38682,7 +40574,7 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38691,43 +40583,43 @@ "rect": [ 44.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#6/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -38817,7 +40709,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38826,7 +40718,7 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38835,43 +40727,43 @@ "rect": [ 350.0, 494.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 432.0, + 428.0, 575.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/NameLabel": { "rect": [ - 432.0, + 428.0, 494.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#7/VBox/Header/Info/PlayedLabel": { "rect": [ - 432.0, + 428.0, 548.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -38952,7 +40844,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38961,7 +40853,7 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false @@ -38970,43 +40862,43 @@ "rect": [ 1574.0, 138.0, - 72.0, + 68.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 104.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 1656.0, + 1652.0, 219.0, - 184.0, + 188.0, 23.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/NameLabel": { "rect": [ - 1656.0, + 1652.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/#8/VBox/Header/Info/PlayedLabel": { "rect": [ - 1656.0, + 1652.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -39079,7 +40971,7 @@ 44.0, 138.0, 266.0, - 100.0 + 102.0 ], "visible": false }, @@ -39087,8 +40979,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, @@ -39096,8 +40988,8 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, @@ -39105,23 +40997,23 @@ "rect": [ 44.0, 138.0, - 72.0, - 100.0 + 68.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, - 100.0 + 188.0, + 102.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/LastPlayedLabel": { "rect": [ - 126.0, + 122.0, 138.0, 1.0, 23.0 @@ -39130,18 +41022,18 @@ }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/NameLabel": { "rect": [ - 126.0, + 122.0, 138.0, - 184.0, + 188.0, 50.0 ], "visible": false }, "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/Header/Info/PlayedLabel": { "rect": [ - 126.0, + 122.0, 192.0, - 184.0, + 188.0, 23.0 ], "visible": false @@ -39158,7 +41050,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/LeastPlayedList": { "rect": [ 44.0, - 276.0, + 278.0, 266.0, 0.0 ], @@ -39167,7 +41059,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedHeader": { "rect": [ 44.0, - 242.0, + 244.0, 266.0, 26.0 ], @@ -39176,7 +41068,7 @@ "StatisticsView/ScrollContainer/CardGrid/SoundtrackCard/VBox/MostPlayedList": { "rect": [ 44.0, - 272.0, + 274.0, 266.0, 0.0 ], @@ -41986,26 +43878,53 @@ "Quiz/NowPlaying": { "rect": [ 64.0, - 64.0, + 56.0, 1088.0, - 320.0 + 328.0 ], "visible": true }, - "Quiz/NowPlaying/SongLabel": { + "Quiz/NowPlaying/CoverFrame": { "rect": [ - 64.0, - 137.0, - 1088.0, + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": true + }, + "Quiz/NowPlaying/CoverFrame/CoverPicture": { + "rect": [ + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles": { + "rect": [ + 533.0, + 56.0, + 361.0, + 328.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles/SongLabel": { + "rect": [ + 533.0, + 232.0, + 361.0, 49.0 ], "visible": true }, - "Quiz/NowPlaying/SoundtrackLabel": { + "Quiz/NowPlaying/Titles/SoundtrackLabel": { "rect": [ - 64.0, - 64.0, - 1088.0, + 533.0, + 159.0, + 361.0, 69.0 ], "visible": true @@ -43102,7 +45021,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#6": { "rect": [ 408.0, - 224.0, + 458.0, 1104.0, 35.0 ], @@ -43111,7 +45030,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#6/#0": { "rect": [ 416.0, - 226.0, + 460.0, 1088.0, 31.0 ], @@ -43156,7 +45075,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#9": { "rect": [ 408.0, - 575.0, + 224.0, 1104.0, 35.0 ], @@ -43165,7 +45084,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#9/#0": { "rect": [ 416.0, - 577.0, + 226.0, 1088.0, 31.0 ], @@ -44242,6 +46161,15 @@ ], "visible": false }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -44251,12 +46179,156 @@ ], "visible": false }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -44264,8 +46336,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -44273,8 +46345,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -44287,7 +46359,25 @@ ], "visible": false }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 204.0, + 251.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 790.0, + 204.0, + 129.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 204.0, @@ -46906,26 +48996,53 @@ "Quiz/NowPlaying": { "rect": [ 64.0, - 64.0, + 56.0, 1088.0, - 320.0 + 328.0 ], "visible": true }, - "Quiz/NowPlaying/SongLabel": { + "Quiz/NowPlaying/CoverFrame": { "rect": [ - 64.0, - 137.0, - 1088.0, + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": true + }, + "Quiz/NowPlaying/CoverFrame/CoverPicture": { + "rect": [ + 321.0, + 85.0, + 180.0, + 270.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles": { + "rect": [ + 533.0, + 56.0, + 361.0, + 328.0 + ], + "visible": true + }, + "Quiz/NowPlaying/Titles/SongLabel": { + "rect": [ + 533.0, + 232.0, + 361.0, 49.0 ], "visible": true }, - "Quiz/NowPlaying/SoundtrackLabel": { + "Quiz/NowPlaying/Titles/SoundtrackLabel": { "rect": [ - 64.0, - 64.0, - 1088.0, + 533.0, + 159.0, + 361.0, 69.0 ], "visible": true @@ -48022,7 +50139,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#6": { "rect": [ 408.0, - 224.0, + 458.0, 1104.0, 35.0 ], @@ -48031,7 +50148,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#6/#0": { "rect": [ 416.0, - 226.0, + 460.0, 1088.0, 31.0 ], @@ -48076,7 +50193,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#9": { "rect": [ 408.0, - 575.0, + 224.0, 1104.0, 35.0 ], @@ -48085,7 +50202,7 @@ "SearchPopup/SearchPanel/ScrollContainer/SearchResults/#9/#0": { "rect": [ 416.0, - 577.0, + 226.0, 1088.0, 31.0 ], @@ -49162,6 +51279,15 @@ ], "visible": false }, + "SoundtrackStatsPopup/PictureDialog": { + "rect": [ + 0.0, + 0.0, + 800.0, + 500.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel": { "rect": [ 610.0, @@ -49171,12 +51297,156 @@ ], "visible": false }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor": { + "rect": [ + 630.0, + 420.0, + 660.0, + 6160.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorButtons/CloseCoverButton": { + "rect": [ + 630.0, + 420.0, + 65.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 4547.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorSpace": { + "rect": [ + 630.0, + 420.0, + 0.0, + 0.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverEditorTitle": { + "rect": [ + 630.0, + 420.0, + 70.0, + 35.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/CoverStatus": { + "rect": [ + 630.0, + 420.0, + 1.0, + 26.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow": { + "rect": [ + 630.0, + 420.0, + 299.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/ChoosePictureButton": { + "rect": [ + 630.0, + 420.0, + 154.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/PictureRow/RemoveCoverButton": { + "rect": [ + 630.0, + 420.0, + 133.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceHelp": { + "rect": [ + 630.0, + 420.0, + 1.0, + 1389.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow": { + "rect": [ + 630.0, + 420.0, + 283.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverIdField": { + "rect": [ + 630.0, + 420.0, + 68.5, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/CoverSourceButton": { + "rect": [ + 630.0, + 420.0, + 145.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceRow/UseSourceButton": { + "rect": [ + 630.0, + 420.0, + 53.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/CoverEditor/SourceTitle": { + "rect": [ + 630.0, + 420.0, + 85.0, + 26.0 + ], + "visible": false + }, "SoundtrackStatsPopup/StatsPanel/CoverFrame": { "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -49184,8 +51454,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -49193,8 +51463,8 @@ "rect": [ 630.0, 204.0, - 144.0, - 200.0 + 140.0, + 210.0 ], "visible": false }, @@ -49207,7 +51477,25 @@ ], "visible": false }, - "SoundtrackStatsPopup/StatsPanel/Info/EditNamesButton": { + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons": { + "rect": [ + 790.0, + 204.0, + 251.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/ChangeCoverButton": { + "rect": [ + 790.0, + 204.0, + 129.0, + 31.0 + ], + "visible": false + }, + "SoundtrackStatsPopup/StatsPanel/Info/InfoButtons/EditNamesButton": { "rect": [ 790.0, 204.0, diff --git a/tests/fakes/fake_http_transport.gd b/tests/fakes/fake_http_transport.gd index de850d5..ff0094c 100644 --- a/tests/fakes/fake_http_transport.gd +++ b/tests/fakes/fake_http_transport.gd @@ -25,9 +25,12 @@ var requested_paths: Array[String] = [] var requested_methods: Array[int] = [] ## Headers of each request, in the same order as [member requested_paths]. var requested_headers: Array[PackedStringArray] = [] -## The JSON body of each request, empty for none, in the same order as +## The body of each request as text, e.g. its JSON, empty for none, in the same order as ## [member requested_paths]. var requested_bodies: Array[String] = [] +## The body of each request as bytes, e.g. an uploaded picture, in the same order as +## [member requested_paths]. +var requested_raw_bodies: Array[PackedByteArray] = [] ## How many tokens have been asked for. var token_requests: int = 0 ## The JSON body of the last token request. @@ -110,20 +113,22 @@ func request( method: int, on_complete: Callable, headers: PackedStringArray = PackedStringArray(), - body: String = "", + body: PackedByteArray = PackedByteArray(), ) -> void: var path: String = url.trim_prefix(Settings.default_path + MusicServerClient.API_PATH) if path == "/token" && method == HTTPClient.METHOD_POST: token_requests += 1 if _held_paths.has(path): - _held_paths[path].append(_answer_token_request.bind(body, on_complete)) + _held_paths[path].append( + _answer_token_request.bind(body.get_string_from_utf8(), on_complete)) return - _answer_token_request(body, on_complete) + _answer_token_request(body.get_string_from_utf8(), on_complete) return requested_paths.append(path) requested_methods.append(method) requested_headers.append(headers) - requested_bodies.append(body) + requested_bodies.append(body.get_string_from_utf8()) + requested_raw_bodies.append(body) if !OPEN_PATHS.has(path.get_slice("?", 0)) && !_has_valid_token(headers): on_complete.call(401, JSON.stringify({"error": "Unauthorized"}).to_utf8_buffer(), PackedStringArray()) diff --git a/tests/fakes/ui_tour.gd b/tests/fakes/ui_tour.gd index ae493c6..0e93c47 100644 --- a/tests/fakes/ui_tour.gd +++ b/tests/fakes/ui_tour.gd @@ -15,7 +15,8 @@ const SOUNDTRACKS: Array[String] = [ "Donkey Kong Country 2", "Lufia II", "Illusion of Gaia", ] const SONG_INFO: Dictionary = { - "SongNo": 0, "Soundtrack": "Chrono Trigger", "Song": "Corridors of Time", + "SongNo": 0, "Soundtrack": "Chrono Trigger", "SoundtrackUuid": "soundtrack-0", + "Song": "Corridors of Time", } const SYNC_PROGRESS: Dictionary = {"progress": 40, "time_spent": "00:00:02"} const SYNC_RESULT: Dictionary = { @@ -48,6 +49,8 @@ const JAPANESE_SONGS: Array[String] = [ ## The character pictures the fake server hands out. const CHARACTERS_DIR: String = "res://characters" +## Small copies of covers from the MusicServer, 2:3 like all its covers. +const COVERS_DIR: String = "res://tests/data/covers" ## Popups in the order the tour opens them: the state name, then the popup's node. The ## state names are what the popups were first called, so screenshots taken before they @@ -91,12 +94,18 @@ static func make_server() -> FakeHttpTransport: server.respond_bytes("/sync", PackedByteArray()) server.respond_json("/sync/progress", SYNC_PROGRESS) server.respond_json("/statistics/soundtracks", soundtrack_statistics()) - # The character pictures stand in for covers - var pictures: Array[String] = character_names() - for i: int in SOUNDTRACKS.size(): + # Real covers from the server, made smaller, for every other soundtrack + for i: int in range(0, SOUNDTRACKS.size(), 2): server.respond_bytes("/soundtracks/soundtrack-%d/cover" % i, - FileAccess.get_file_as_bytes(CHARACTERS_DIR.path_join( - pictures[i % pictures.size()]))) + FileAccess.get_file_as_bytes(COVERS_DIR.path_join("cover_%d.jpg" % (i >> 1)))) + # The soundtrack list tells the quiz which soundtracks have covers + var soundtracks: Array[Dictionary] = [] + for soundtrack: Dictionary in soundtrack_statistics(): + soundtracks.append({"uuid": soundtrack.soundtrack_uuid, + "name": soundtrack.soundtrack_name, + "cover_modified": soundtrack.get("cover_modified", 0), + "alternative_names": soundtrack.get("alternative_names", [])}) + server.respond_json("/soundtracks", soundtracks) server.respond_json("/version/history", SERVER_HISTORY) return server @@ -307,6 +316,10 @@ func run(on_state: Callable) -> void: stats_popup.new_name_field.text = "Chrono" await _settle() await on_state.call("popup_SoundtrackStats_names", stats_popup) + stats_popup.change_cover() + stats_popup.cover_id_field.text = "5248061" + await _settle() + await on_state.call("popup_SoundtrackStats_cover", stats_popup) stats_popup.stop_editing() stats_popup.close() _main.show_tab(&"quiz") diff --git a/tests/integration/test_animations.gd b/tests/integration/test_animations.gd index 6c82f21..d5f48e6 100644 --- a/tests/integration/test_animations.gd +++ b/tests/integration/test_animations.gd @@ -206,7 +206,7 @@ func test_every_button_bounces() -> void: func test_helpers_do_nothing_with_reduced_animations() -> void: Settings.reduce_animations = true - var label: Label = _quiz.get_node("NowPlaying/SongLabel") + var label: Label = _quiz.get_node("NowPlaying/Titles/SongLabel") Anim.pop(label) Anim.fade_in(label) diff --git a/tests/integration/test_continue_quiz.gd b/tests/integration/test_continue_quiz.gd index 2d5e830..7c85481 100644 --- a/tests/integration/test_continue_quiz.gd +++ b/tests/integration/test_continue_quiz.gd @@ -55,8 +55,8 @@ func _play_a_little() -> Array[PlayerObject]: func _now_playing() -> Array[String]: var now_playing: Node = _quiz.get_node("NowPlaying") - return [(now_playing.get_node("SoundtrackLabel") as Label).text, - (now_playing.get_node("SongLabel") as Label).text] + return [(now_playing.get_node("Titles/SoundtrackLabel") as Label).text, + (now_playing.get_node("Titles/SongLabel") as Label).text] # Saving diff --git a/tests/integration/test_covers_and_names.gd b/tests/integration/test_covers_and_names.gd index f8234dc..0c6bd8f 100644 --- a/tests/integration/test_covers_and_names.gd +++ b/tests/integration/test_covers_and_names.gd @@ -1,6 +1,7 @@ extends MainWindowTestSuite -## Soundtrack covers on the statistics cards and in the popup, loaded for the cards on -## screen, and editing a soundtrack's alternative names, which search then finds it by. +## Soundtrack covers on the statistics cards, in the popup and next to the answer in the +## quiz, loaded for the cards on screen; changing a cover from the popup; and editing a +## soundtrack's alternative names, which search then finds it by. const STATISTICS: Array[Dictionary] = [ {"soundtrack_uuid": "st-1", "soundtrack_name": "Chrono Trigger", "soundtrack_played": 5, @@ -21,6 +22,13 @@ func _before_window_starts() -> void: var image: Image = Image.create(6, 8, false, Image.FORMAT_RGB8) _png = image.save_png_to_buffer() _server.respond_bytes("/soundtracks/st-1/cover", _png) + # The soundtrack list tells the quiz which soundtracks have covers + _server.respond_json("/soundtracks", [ + {"uuid": "st-1", "name": "Chrono Trigger", "cover_modified": 100}, + {"uuid": "st-2", "name": "Terranigma"}, + ]) + _next_song_is({"SongNo": 0, "Soundtrack": "Chrono Trigger", "SoundtrackUuid": "st-1", + "Song": "Corridors of Time"}) func before_test() -> void: @@ -185,3 +193,200 @@ func test_search_popup_finds_soundtracks_by_alternative_names() -> void: assert_array(search.shown_names()).contains(["Chrono Trigger"]) var row: PanelContainer = search.search_results.get_child(0) assert_str((row.get_child(0) as RichTextLabel).get_parsed_text()).contains("CT") + + +func _open_cover_menu() -> void: + await _open_statistics() + _popup.show_soundtrack(_card("Chrono Trigger").soundtrack) + _popup.change_cover() + + +# The server's answer for the soundtrack once its cover changed +func _cover_time_becomes(modified: int) -> void: + _server.respond_json("/soundtracks/st-1", {"uuid": "st-1", "name": "Chrono Trigger", + "cover_modified": modified, "songs": []}) + + +func _picture_file(bytes: PackedByteArray) -> String: + var path: String = create_temp_dir("pictures_%d" % randi()).path_join("cover.jpg") + var file: FileAccess = FileAccess.open(path, FileAccess.WRITE) + file.store_buffer(bytes) + file.close() + return path + + +func _downloads(path: String) -> int: + var count: int = 0 + for i: int in _server.requested_paths.size(): + if _server.requested_paths[i] == path \ + && _server.requested_methods[i] == HTTPClient.METHOD_GET: + count += 1 + return count + + +func _now_playing() -> NowPlaying: + return _quiz.get_node("NowPlaying") + + +func test_cover_menu_opens_in_place_of_the_songs() -> void: + await _open_cover_menu() + + assert_bool(_popup.cover_editor.visible).is_true() + assert_bool(_popup.song_scroll.visible).is_false() + assert_bool(_popup.edit_names_button.disabled).is_true() + assert_bool(_popup.remove_cover_button.disabled).is_false() + + _popup.stop_editing() + + assert_bool(_popup.cover_editor.visible).is_false() + assert_bool(_popup.song_scroll.visible).is_true() + + +func test_soundtrack_without_a_cover_has_nothing_to_remove() -> void: + await _open_statistics() + _popup.show_soundtrack(_card("Terranigma").soundtrack) + + _popup.change_cover() + + assert_bool(_popup.remove_cover_button.disabled).is_true() + + +func test_uploaded_picture_becomes_the_cover() -> void: + var bytes: PackedByteArray = FileAccess.get_file_as_bytes( + "res://tests/data/covers/cover_0.jpg") + _cover_time_becomes(200) + await _open_cover_menu() + + _popup.upload_picture(_picture_file(bytes)) + + var index: int = _server.requested_methods.find(HTTPClient.METHOD_PUT) + assert_str(_server.requested_paths[index]).is_equal("/soundtracks/st-1/cover") + assert_array(_server.requested_raw_bodies[index]).is_equal(bytes) + assert_array(_server.requested_headers[index]).contains(["Content-Type: image/jpeg"]) + # The new cover is downloaded again for the popup and the card + assert_int(_card("Chrono Trigger").soundtrack.cover_modified).is_equal(200) + await _runner.simulate_frames(2) + # Downloaded once more, for the popup and the card together + assert_int(_downloads("/soundtracks/st-1/cover")).is_equal(2) + assert_object(_card("Chrono Trigger").cover_picture.texture).is_not_null() + assert_str(_popup.cover_status.text).is_equal("The new cover is saved.") + + +func test_file_that_is_not_a_picture_is_not_uploaded() -> void: + await _open_cover_menu() + + _popup.upload_picture(_picture_file("not a picture".to_utf8_buffer())) + + assert_int(_server.requested_methods.count(HTTPClient.METHOD_PUT)).is_equal(0) + assert_str(_popup.cover_status.text).contains("JPEG, PNG and WebP") + + +func test_cover_picked_by_id() -> void: + _server.respond_bytes("/soundtracks/st-1/cover/source", PackedByteArray(), 204) + _cover_time_becomes(300) + await _open_cover_menu() + + _popup.cover_source_button.select(1) + _popup.cover_id_field.text = " 21 " + _popup.use_cover_source() + + var index: int = _server.requested_paths.find("/soundtracks/st-1/cover/source") + assert_int(_server.requested_methods[index]).is_equal(HTTPClient.METHOD_PUT) + var body: Dictionary = JSON.parse_string(_server.requested_bodies[index]) + assert_str(body.source).is_equal("anilist") + assert_str(body.id).is_equal("21") + assert_int(_popup.soundtrack.cover_modified).is_equal(300) + + +func test_no_id_asks_nothing() -> void: + await _open_cover_menu() + + _popup.use_cover_source() + + assert_int(_server.count("/soundtracks/st-1/cover/source")).is_equal(0) + + +func test_removed_cover_shows_the_initials() -> void: + _cover_time_becomes(0) + await _open_cover_menu() + + _popup.remove_cover() + + var index: int = _server.requested_methods.find(HTTPClient.METHOD_DELETE) + assert_str(_server.requested_paths[index]).is_equal("/soundtracks/st-1/cover") + assert_bool(_popup.cover_placeholder.visible).is_true() + assert_bool(_card("Chrono Trigger").cover_placeholder.visible).is_true() + assert_bool(FileAccess.file_exists(CoverCache.folder().path_join("st-1"))).is_false() + assert_bool(_popup.remove_cover_button.disabled).is_true() + + +func test_refused_change_shows_the_servers_reason() -> void: + _server.respond_json("/soundtracks/st-1/cover/source", + {"error": "covers are not enabled on this server"}, 503) + await _open_cover_menu() + _popup.cover_id_field.text = "21" + + _popup.use_cover_source() + + assert_str(_popup.cover_status.text).is_equal( + "Could not change the cover: covers are not enabled on this server.") + assert_bool(_popup.use_source_button.disabled).is_false() + + +func test_answer_shows_the_soundtracks_cover() -> void: + await _play_first_song() + + assert_bool(_now_playing().has_cover()).is_false() + + _press("SongControls/ShowAnswerButton") + + assert_bool(_now_playing().has_cover()).is_true() + await _runner.simulate_frames(1) + # The cover sits just left of the titles, and the two are centered together + var area: Rect2 = _now_playing().get_global_rect() + var cover: Rect2 = _now_playing().cover_frame.get_global_rect() + var titles: Rect2 = _now_playing().titles.get_global_rect() + assert_float(titles.position.x - cover.end.x).is_equal(32.0) + assert_float(absf((cover.position.x - area.position.x) - (area.end.x - titles.end.x))) \ + .is_less_equal(1.0) + # Up and down, the cover is centered between the top bar and the song list, and the + # titles on the cover + assert_float(absf((cover.position.y - area.position.y) - (area.end.y - cover.end.y))) \ + .is_less_equal(1.0) + var text_middle: float = (_now_playing().soundtrack_label.get_global_rect().position.y + + _now_playing().song_label.get_global_rect().end.y) / 2.0 + assert_float(absf(text_middle - cover.get_center().y)).is_less_equal(1.0) + + +func test_answer_without_a_cover_shows_only_the_titles() -> void: + _view.covers.set_cover_times({"st-1": 0}) + await _play_first_song() + + _press("SongControls/ShowAnswerButton") + + assert_bool(_now_playing().has_cover()).is_false() + assert_int(_server.count("/soundtracks/st-1/cover")).is_equal(0) + + +func test_next_song_hides_the_cover_until_its_answer() -> void: + await _play_first_song() + _press("SongControls/ShowAnswerButton") + + _press("SongControls/NextButton") + # The playing song is stopped first, which takes half a second + await await_millis(700) + + assert_int(Playlist.currently_playing_song).is_equal(1) + assert_bool(_now_playing().has_cover()).is_false() + + +func test_changed_cover_shows_in_the_quiz_too() -> void: + await _play_first_song() + _press("SongControls/ShowAnswerButton") + _cover_time_becomes(0) + _popup.show_soundtrack(SoundtrackWithSongs.from_dict(STATISTICS[0])) + _popup.change_cover() + + _popup.remove_cover() + + assert_bool(_now_playing().has_cover()).is_false() diff --git a/tests/integration/test_main_window.gd b/tests/integration/test_main_window.gd index aa5e2c3..b833d69 100644 --- a/tests/integration/test_main_window.gd +++ b/tests/integration/test_main_window.gd @@ -33,7 +33,7 @@ func test_next_plays_preloaded_song_and_fetches_another() -> void: func test_title_is_hidden_until_answer_is_shown() -> void: - var soundtrack_label: Label = _quiz.get_node("NowPlaying/SoundtrackLabel") + var soundtrack_label: Label = _quiz.get_node("NowPlaying/Titles/SoundtrackLabel") _press("SongControls/NextButton") await _runner.simulate_frames(2) @@ -224,7 +224,7 @@ func test_show_answer_before_first_song_does_not_reveal_next_song() -> void: await _play_first_song() - assert_str((_quiz.get_node("NowPlaying/SoundtrackLabel") as Label).text) \ + assert_str((_quiz.get_node("NowPlaying/Titles/SoundtrackLabel") as Label).text) \ .is_equal("????????") diff --git a/tests/integration/test_now_playing.gd b/tests/integration/test_now_playing.gd index f813dfd..26efb12 100644 --- a/tests/integration/test_now_playing.gd +++ b/tests/integration/test_now_playing.gd @@ -11,7 +11,7 @@ func before_test() -> void: func _label(label_name: String) -> Label: - return _now_playing.get_node(label_name) + return _now_playing.get_node("Titles/" + label_name) func test_starts_empty() -> void: @@ -32,3 +32,16 @@ func test_soundtrack_is_above_song() -> void: assert_float(_label("SoundtrackLabel").get_global_rect().end.y) \ .is_less_equal(_label("SongLabel").get_global_rect().position.y) + + +func test_long_titles_keep_to_two_lines_each() -> void: + _now_playing.size = Vector2(1088, 328) + _now_playing.show_song("Final Fantasy Dissidia 012 Duodecim (Sista Fantasin " + + "Meningsskiljaktigheter 012 Tolv) Final Mix Special Edition", + "Cosmos (Arrangement) - Main Theme of the Warriors of Light, Long Version") + await _runner.simulate_frames(2) + + for label_name: String in ["SoundtrackLabel", "SongLabel"]: + assert_int(_label(label_name).get_visible_line_count()).is_less_equal(2) + assert_float(_label("SongLabel").get_global_rect().end.y) \ + .is_less_equal(_now_playing.get_global_rect().end.y) diff --git a/tests/integration/test_offline_mode.gd b/tests/integration/test_offline_mode.gd index bb366b0..049a372 100644 --- a/tests/integration/test_offline_mode.gd +++ b/tests/integration/test_offline_mode.gd @@ -54,8 +54,8 @@ func _next() -> void: func _now_playing() -> Array[String]: var now_playing: Node = _quiz.get_node("NowPlaying") - return [(now_playing.get_node("SoundtrackLabel") as Label).text, - (now_playing.get_node("SongLabel") as Label).text] + return [(now_playing.get_node("Titles/SoundtrackLabel") as Label).text, + (now_playing.get_node("Titles/SongLabel") as Label).text] func test_picking_a_folder_makes_no_server_requests() -> void: diff --git a/tests/integration/test_scene_split.gd b/tests/integration/test_scene_split.gd index 74afe90..1f7d4a0 100644 --- a/tests/integration/test_scene_split.gd +++ b/tests/integration/test_scene_split.gd @@ -121,12 +121,12 @@ func test_clicking_quiz_buttons_plays_and_shows_answer() -> void: await _click_at(_center(_quiz.get_node("SongControls/NextButton"))) await _runner.simulate_frames(2) assert_int(Playlist.currently_playing_song).is_equal(0) - assert_str((_quiz.get_node("NowPlaying/SoundtrackLabel") as Label).text) \ + assert_str((_quiz.get_node("NowPlaying/Titles/SoundtrackLabel") as Label).text) \ .is_not_equal("Chrono Trigger") await _click_at(_center(_quiz.get_node("SongControls/ShowAnswerButton"))) - assert_str((_quiz.get_node("NowPlaying/SoundtrackLabel") as Label).text) \ + assert_str((_quiz.get_node("NowPlaying/Titles/SoundtrackLabel") as Label).text) \ .is_equal("Chrono Trigger") diff --git a/tests/unit/test_music_server_client.gd b/tests/unit/test_music_server_client.gd index 09805db..1ee329c 100644 --- a/tests/unit/test_music_server_client.gd +++ b/tests/unit/test_music_server_client.gd @@ -639,7 +639,7 @@ class _HeaderTransport: _method: int, on_complete: Callable, _request_headers: PackedStringArray = PackedStringArray(), - _body: String = "", + _body: PackedByteArray = PackedByteArray(), ) -> void: on_complete.call(200, JSON.stringify({"token": "t"} if _url.ends_with("/token") else []) .to_utf8_buffer(), _headers) @@ -659,7 +659,7 @@ class _RecordingTransport: _method: int, on_complete: Callable, _headers: PackedStringArray = PackedStringArray(), - _body: String = "", + _body: PackedByteArray = PackedByteArray(), ) -> void: _urls.append(url) if url.ends_with("/token"):