Popups: - All nine popups now extend a shared PopupWindow class with open(), close() and toggle(), instead of each copying its own close-on-click code. Popups that need cleanup override close(). - A click outside a popup closed it and also pressed whatever was underneath, e.g. Reset playlist. The closing click is now consumed. - Popups used Godot's see-through default panel, so the song list and titles showed through. They now use an opaque popup theme, and a backdrop dims the window behind them. - The main window root now fills the screen, so the backdrop covers it. Text and images: - Many labels and buttons forced nearest filtering, which made text and icons jagged when the window is not 1920x1080. They now use the default smooth filtering. Only the pixel-art "no character" picture keeps nearest filtering when the winner window enlarges it. Player list: - A long player name pushed that row's character and buttons to the right. Names now take the free space and shorten with an ellipsis, so all rows line up and use the full width of the panel.
579 lines
19 KiB
GDScript
579 lines
19 KiB
GDScript
extends Control
|
|
|
|
# 601 LOC 11/9 - 2023
|
|
# 628 LOC 15/9 - 2023
|
|
# 631 LOC 16/9 - 2023
|
|
# 554 LOC 30/5 - 2024
|
|
# 551 LOC 3/6 - 2024
|
|
# 386 LOC 12/6 - 2024
|
|
|
|
##TODO
|
|
# 15. Fix for local play
|
|
|
|
@onready
|
|
var open_button: Button = $Open
|
|
|
|
@onready
|
|
var fileDialog: FileDialog = $FileDialog
|
|
|
|
@onready
|
|
var inspiration_scroll: ScrollContainer = $ScrollContainer
|
|
|
|
@onready
|
|
var inspiration_list: VBoxContainer = $ScrollContainer/VBoxContainer
|
|
|
|
@onready
|
|
var soundtrack_label: Label = $VBoxContainer/SoundtrackLabel
|
|
|
|
@onready
|
|
var song_label: Label = $VBoxContainer/SongLabel
|
|
|
|
@onready
|
|
var add_player_container: HBoxContainer = $Players/VBoxContainer/AddPlayerContainer
|
|
|
|
@onready
|
|
var add_players_button: TextureButton = $Players/VBoxContainer/HBoxContainer/AddPlayersButton
|
|
|
|
@onready
|
|
var add_player_button: Button = $Players/VBoxContainer/AddPlayerContainer/AddPlayerButton
|
|
|
|
@onready
|
|
var new_player_name_field: TextEdit = $Players/VBoxContainer/AddPlayerContainer/PlayerNameField
|
|
|
|
@onready
|
|
var reset_playlist_button: Button = $ResetPlaylistButton
|
|
|
|
@onready
|
|
var reset_points_button: Button = $ResetPointsButton
|
|
|
|
@onready
|
|
var sound_test_button: Button = $SoundTestButton
|
|
|
|
@onready
|
|
var sync_button: Button = $SyncButton
|
|
|
|
@onready
|
|
var sync_window: Control = %SyncWindow
|
|
|
|
@onready
|
|
var settings_button: Button = $SettingsButton
|
|
|
|
@onready
|
|
var settings_window: Control = $SettingsWindow
|
|
|
|
@onready
|
|
var shortcuts_window: Control = %ShortcutsWindow
|
|
|
|
@onready
|
|
var qr_window: Control = %QRWindow
|
|
|
|
@onready
|
|
var winner_window: Control = %WinnerWindow
|
|
|
|
@onready
|
|
var qr_button: Button = $QRButton
|
|
|
|
@onready
|
|
var statistics_button: Button = $StatisticsButton
|
|
|
|
@onready
|
|
var statistic_popup: PopupPanel = $StatisticsPopupPanel
|
|
|
|
@onready
|
|
var statistic_label: Label = $StatisticsPopupPanel/StatisticsLabel
|
|
|
|
@onready
|
|
var shortcuts_button: Button = $ShortcutsButton
|
|
|
|
@onready
|
|
var about_button: Button = $AboutButton
|
|
|
|
@onready
|
|
var about_window: Control = %AboutWindow
|
|
|
|
@onready
|
|
var show_answer_button: Button = $ShowAnswerButton
|
|
|
|
@onready
|
|
var next_button: Button = $NextButton
|
|
|
|
@onready
|
|
var music_list_scroll: ScrollContainer = $MusicListPanel/ScrollContainer
|
|
|
|
@onready
|
|
var music_list: VBoxContainer = $MusicListPanel/ScrollContainer/MusicList
|
|
|
|
@onready
|
|
var player_container: VBoxContainer = $Players/VBoxContainer
|
|
|
|
@onready
|
|
var players_list_container: VBoxContainer = $Players/VBoxContainer/ScrollContainer/PlayersListVBoxContainer
|
|
|
|
@onready
|
|
var new_character_select: Control = %NewCharacterSelect
|
|
|
|
@onready
|
|
var search_button: Button = $SearchButton
|
|
|
|
@onready
|
|
var search_view: Control= $Search
|
|
|
|
@onready
|
|
var auto_repeat_song_button: CheckButton = $RepeatSongCheckButton
|
|
|
|
@onready
|
|
var music_player_container: PanelContainer = $MusicPlayer
|
|
|
|
@onready
|
|
var log_window: Control = %Log
|
|
|
|
@onready
|
|
var debug_label: Label = $DebugLabel
|
|
|
|
var player: PackedScene = preload("res://Player.tscn")
|
|
var song_list_object: PackedScene = preload("res://song_list_object.tscn")
|
|
|
|
var songs: Array= []
|
|
var soundtracks: Array = []
|
|
var current_player: Node
|
|
|
|
## True while statistics are off because a player won, until points are reset.
|
|
var stats_paused_by_win: bool = false
|
|
|
|
## Dims the window behind an open popup and keeps clicks from reaching the buttons under it.
|
|
var popup_backdrop: ColorRect
|
|
|
|
## Seconds to wait before retrying a song download step that failed.
|
|
var song_fetch_retry_seconds: float = 5.0
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
_setup_popup_backdrop()
|
|
var debug: bool = OS.has_feature("debug")
|
|
var is_mac: bool = OS.has_feature("macos")
|
|
if debug:
|
|
print("is_debug")
|
|
debug_label.visible = true
|
|
Settings.is_debug = true
|
|
settings_window.set_winning_score(5)
|
|
settings_window.set_selected_server(4)
|
|
if is_mac:
|
|
print("is_mac")
|
|
next_button.pressed.connect(play_next_song)
|
|
show_answer_button.pressed.connect(show_answer_pressed)
|
|
search_button.pressed.connect(show_search)
|
|
sync_button.pressed.connect(sync_soundtracks)
|
|
sound_test_button.pressed.connect(music_player_container.get_sound_test_song)
|
|
statistics_button.pressed.connect(get_statistics)
|
|
shortcuts_button.pressed.connect(show_shortcuts)
|
|
about_button.pressed.connect(show_about)
|
|
settings_button.pressed.connect(show_settings)
|
|
qr_button.pressed.connect(show_qr)
|
|
reset_playlist_button.pressed.connect(reset_playlist)
|
|
reset_points_button.pressed.connect(reset_points)
|
|
|
|
new_character_select.connect("new_new_character_selected", _on_new_character_selected)
|
|
new_player_name_field.connect("enter_key_pressed", add_player)
|
|
music_player_container.connect("play_next_song", play_next_song)
|
|
music_player_container.connect("update_song_list", update_song_list)
|
|
settings_window.connect("server_changed", server_updated)
|
|
settings_window.visibility_changed.connect(_on_settings_window_visibility_changed)
|
|
sync_window.connect("sync_started", _on_sync_started)
|
|
sync_window.connect("sync_finished", _on_sync_finished)
|
|
|
|
|
|
add_players_button.pressed.connect(add_players)
|
|
add_player_button.pressed.connect(add_player)
|
|
open_button.pressed.connect(open)
|
|
auto_repeat_song_button.pressed.connect(repeat_song)
|
|
|
|
get_suggestion_list()
|
|
fetch_song_list_at_start()
|
|
search_view.get_list_of_soundtracks()
|
|
new_character_select.load_characters()
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event is InputEventKey and event.pressed:
|
|
if event.alt_pressed && event.keycode == KEY_UP:
|
|
print("Alt + UP pressed")
|
|
music_player_container.change_volume(0.05)
|
|
if event.alt_pressed && event.keycode == KEY_DOWN:
|
|
print("Alt + DOWN pressed")
|
|
music_player_container.change_volume(-0.05)
|
|
if event.alt_pressed && event.ctrl_pressed && event.keycode == KEY_LEFT:
|
|
print("Ctrl + Alt + LEFT pressed")
|
|
music_player_container.restart()
|
|
elif event.alt_pressed && event.keycode == KEY_LEFT:
|
|
print("Alt + LEFT pressed")
|
|
music_player_container.seek(-5)
|
|
if event.alt_pressed && event.keycode == KEY_RIGHT:
|
|
print("Alt + RIGHT pressed")
|
|
music_player_container.seek(5)
|
|
if event.alt_pressed && event.keycode == KEY_ENTER:
|
|
print("Alt + Enter pressed")
|
|
Settings.fullscreen = !Settings.fullscreen
|
|
settings_window.fullscreen_button.button_pressed = Settings.fullscreen
|
|
if Settings.fullscreen == true:
|
|
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
|
|
if Settings.fullscreen == false:
|
|
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
|
|
if event.alt_pressed && event.keycode == KEY_K:
|
|
shortcuts_window.toggle()
|
|
if event.alt_pressed && event.keycode == KEY_L:
|
|
log_window.toggle()
|
|
|
|
func server_updated() -> void:
|
|
print("server_updated")
|
|
update_from_server()
|
|
reset_points()
|
|
|
|
func update_from_server() -> void:
|
|
print("update_from_server")
|
|
search_view.get_list_of_soundtracks()
|
|
get_suggestion_list()
|
|
reset_playlist()
|
|
new_character_select.load_characters()
|
|
|
|
func repeat_song() -> void:
|
|
Settings.auto_repeat_song = !Settings.auto_repeat_song
|
|
|
|
func show_answer_pressed() -> void:
|
|
print("show_answer_pressed")
|
|
Playlist.song_is_answered()
|
|
update_song_list()
|
|
|
|
# Loads the songs already in the server playlist, then starts preloading new ones.
|
|
# Preloading waits for the list, because loading the list clears the playlist.
|
|
func fetch_song_list_at_start() -> void:
|
|
print("fetch_song_list_at_start")
|
|
var fetch_song_list_at_start_done: Callable = func fetch_songs_at_start_done(data) -> void:
|
|
Playlist.clear_song_list()
|
|
if typeof(data) == TYPE_ARRAY:
|
|
for d: Dictionary in data:
|
|
var new_song_object: SongObject = SongObject.new()
|
|
new_song_object.song_number = d.SongNo
|
|
new_song_object.soundtrack_title = d.Soundtrack
|
|
new_song_object.song_title = d.Song
|
|
new_song_object.is_answered = true
|
|
new_song_object.has_played = true
|
|
Playlist.add_to_playlist(new_song_object)
|
|
elif data != null:
|
|
print("Unexpected data")
|
|
Playlist.update_last_played_song()
|
|
update_song_list()
|
|
if !Playlist.is_song_downloading:
|
|
fetch_song()
|
|
MusicServerClient.fetch_song_list(fetch_song_list_at_start_done,
|
|
_retry_later.bind(fetch_song_list_at_start))
|
|
|
|
func play_next_song() -> void:
|
|
print("play_next_song ", Playlist.latest_played_song)
|
|
if Playlist.first_song_played:
|
|
Playlist.set_latest_played_song()
|
|
Playlist.first_song_played = true
|
|
music_player_container.play_song_object(Playlist.latest_played_song)
|
|
if !(Playlist.get_preloaded_songs() > 0):
|
|
next_button.disabled = true
|
|
if !Playlist.is_song_downloading:
|
|
fetch_song()
|
|
|
|
#not first "/music/addPlayed"
|
|
#"/music/rand"
|
|
#"/music/addQue"
|
|
#"/music/info"
|
|
func _popups() -> Array[PopupWindow]:
|
|
return [search_view, sync_window, settings_window, qr_window, new_character_select,
|
|
shortcuts_window, about_window, winner_window, log_window]
|
|
|
|
# The backdrop sits above the main window and below every popup. Popups close
|
|
# themselves when clicked outside, and the backdrop keeps that click from reaching
|
|
# the buttons behind them.
|
|
func _setup_popup_backdrop() -> void:
|
|
popup_backdrop = ColorRect.new()
|
|
popup_backdrop.name = "PopupBackdrop"
|
|
popup_backdrop.color = Color(0, 0, 0, 0.55)
|
|
popup_backdrop.mouse_filter = Control.MOUSE_FILTER_STOP
|
|
add_child(popup_backdrop)
|
|
popup_backdrop.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
|
|
for popup: PopupWindow in _popups():
|
|
move_child(popup, -1)
|
|
popup.visibility_changed.connect(_update_popup_backdrop)
|
|
_update_popup_backdrop()
|
|
|
|
func _update_popup_backdrop() -> void:
|
|
popup_backdrop.visible = _popups().any(func(popup: PopupWindow) -> bool: return popup.visible)
|
|
|
|
# The cache size can be changed in the settings. Waiting until the settings are closed
|
|
# avoids starting downloads while the user is still clicking the number up and down.
|
|
func _on_settings_window_visibility_changed() -> void:
|
|
if !settings_window.visible && !Playlist.is_song_downloading && Playlist.should_preload_more_songs():
|
|
fetch_song()
|
|
|
|
func fetch_song() -> void:
|
|
print("fetch_song")
|
|
Playlist.is_song_downloading = true
|
|
_download_random_song(SongObject.new())
|
|
|
|
# Fetching a song takes three requests. If one fails, only that step is retried, so
|
|
# the server and the game keep the same songs in their playlists.
|
|
func _download_random_song(new_song_object: SongObject) -> void:
|
|
var song_downloaded: Callable = func song_downloaded(body: PackedByteArray) -> void:
|
|
print("song_downloaded")
|
|
var sound: AudioStream = AudioStreamMP3.new()
|
|
sound.data = body
|
|
new_song_object.song = sound
|
|
_add_song_to_queue(new_song_object)
|
|
MusicServerClient.fetch_random_song(Settings.use_low_played_mode, song_downloaded,
|
|
_retry_later.bind(_download_random_song.bind(new_song_object)))
|
|
|
|
func _add_song_to_queue(new_song_object: SongObject) -> void:
|
|
MusicServerClient.add_to_queue(_fetch_song_info.bind(new_song_object),
|
|
_retry_later.bind(_add_song_to_queue.bind(new_song_object)))
|
|
|
|
func _fetch_song_info(new_song_object: SongObject) -> void:
|
|
var song_info_fetched: Callable = func song_info_fetched(data_received: Dictionary) -> void:
|
|
print("song_info_fetched")
|
|
new_song_object.song_number = data_received.SongNo
|
|
new_song_object.soundtrack_title = data_received.Soundtrack
|
|
new_song_object.song_title = data_received.Song
|
|
print("new_song_object: ", new_song_object.to_string())
|
|
Playlist.add_to_playlist(new_song_object)
|
|
next_button.disabled = false
|
|
if Playlist.should_preload_more_songs():
|
|
fetch_song()
|
|
else:
|
|
Playlist.is_song_downloading = false
|
|
if Settings.is_debug:
|
|
update_song_list()
|
|
MusicServerClient.fetch_song_info(song_info_fetched,
|
|
_retry_later.bind(_fetch_song_info.bind(new_song_object)))
|
|
|
|
func _retry_later(step: Callable) -> void:
|
|
print("Song download failed, retrying in %s seconds" % song_fetch_retry_seconds)
|
|
get_tree().create_timer(song_fetch_retry_seconds).timeout.connect(step)
|
|
|
|
func update_song_list() -> void:
|
|
print("update_song_list")
|
|
if Playlist.currently_playing_song >= 0:
|
|
soundtrack_label.text = Playlist.get_current_soundtrack_title()
|
|
song_label.text = Playlist.get_current_song_title()
|
|
Settings.delete_children(music_list)
|
|
for s: SongObject in Playlist.get_playlist():
|
|
var new_song_list_object: SongListObject = song_list_object.instantiate()
|
|
new_song_list_object.song_object = s
|
|
new_song_list_object.gui_input.connect(song_object_clicked.bind(s.song_number))
|
|
music_list.add_child(new_song_list_object)
|
|
|
|
func song_object_clicked(event: InputEvent, song_no: int) -> void:
|
|
if (event is InputEventMouseButton && event.pressed && event.button_index == MOUSE_BUTTON_LEFT):
|
|
print("Clicked Song Object: ", Playlist.song_object_array[song_no].to_string())
|
|
if Settings.character_select_open == false:
|
|
if Playlist.get_song(song_no) == null:
|
|
print("has no song, need to download")
|
|
var song_downloaded: Callable = func song_downloaded(body: PackedByteArray) -> void:
|
|
var sound: AudioStream = AudioStreamMP3.new()
|
|
sound.data = body
|
|
Playlist.add_song_to_song_object(song_no, sound)
|
|
music_player_container.play_song_object(song_no)
|
|
MusicServerClient.fetch_song(song_no, song_downloaded)
|
|
else:
|
|
print("song already downloaded")
|
|
music_player_container.play_song_object(song_no)
|
|
|
|
func reset_playlist() -> void:
|
|
print("reset_playlist")
|
|
var playlist_reset_done: Callable = func playlist_reset_done() -> void:
|
|
Playlist.reset_playlist()
|
|
fetch_song_list_at_start()
|
|
|
|
MusicServerClient.reset_playlist(playlist_reset_done)
|
|
|
|
func reset_points() -> void:
|
|
print("reset_points")
|
|
for player_objects: PlayerObject in Settings.player_array:
|
|
player_objects.reset_points()
|
|
load_players()
|
|
# A new game starts, so turn statistics back on if winning turned them off
|
|
if stats_paused_by_win:
|
|
Settings.add_to_stats = true
|
|
stats_paused_by_win = false
|
|
|
|
func show_about() -> void:
|
|
print("show_about")
|
|
about_window.open()
|
|
|
|
func show_shortcuts() -> void:
|
|
print("show_shortcuts")
|
|
shortcuts_window.open()
|
|
|
|
func show_settings() -> void:
|
|
print("show_settings")
|
|
settings_window.open()
|
|
|
|
func show_qr() -> void:
|
|
print("show_qr")
|
|
qr_window.open()
|
|
|
|
func get_statistics() -> void:
|
|
print("get_statistics")
|
|
statistic_popup.visible = true
|
|
statistic_label.text = "Total amount of soundtracks in the playlist: " + str(soundtracks.size())
|
|
|
|
func sync_soundtracks() -> void:
|
|
print("sync_soundtracks")
|
|
sync_window.start_sync()
|
|
|
|
func _on_sync_started() -> void:
|
|
print("_on_sync_started")
|
|
sync_button.disabled = false
|
|
sound_test_button.disabled = true
|
|
reset_playlist_button.disabled = true
|
|
show_answer_button.disabled = true
|
|
next_button.disabled = true
|
|
|
|
func _on_sync_finished() -> void:
|
|
print("_on_sync_finished")
|
|
update_from_server()
|
|
sound_test_button.disabled = false
|
|
reset_playlist_button.disabled = false
|
|
show_answer_button.disabled = false
|
|
reset_points()
|
|
|
|
func get_suggestion_list() -> void:
|
|
print("get_suggestion_list")
|
|
var populate_list: Callable = func populate_list(array) -> void:
|
|
if typeof(array) == TYPE_ARRAY:
|
|
soundtracks = []
|
|
Settings.delete_children(inspiration_list)
|
|
soundtracks.append_array(array)
|
|
for soundtrack: String in soundtracks:
|
|
var inspiration_label: Label = Label.new()
|
|
inspiration_label.add_theme_font_size_override("font_size", 20)
|
|
inspiration_label.text = soundtrack
|
|
inspiration_label.autowrap_mode = TextServer.AUTOWRAP_WORD
|
|
inspiration_list.add_child(inspiration_label)
|
|
else:
|
|
print("Unexpected data")
|
|
MusicServerClient.fetch_all_soundtracks(populate_list)
|
|
|
|
func add_players() -> void:
|
|
print("add_players")
|
|
Settings.edit_players = !Settings.edit_players
|
|
add_player_container.visible = !add_player_container.visible
|
|
new_player_name_field.grab_focus()
|
|
|
|
func add_player() -> void:
|
|
print("add_player")
|
|
if new_player_name_field.text != "" && Settings.player_array.size() < Settings.MAX_NUMBER_OF_PLAYERS:
|
|
var new_player_object: PlayerObject = PlayerObject.new(new_player_name_field.text)
|
|
new_player_name_field.text = ""
|
|
Settings.player_array.append(new_player_object)
|
|
new_player_object.connect("first_point_triggerd", music_player_container._on_point_triggered.bind("first"))
|
|
new_player_object.connect("match_point_triggerd", music_player_container._on_point_triggered.bind("match"))
|
|
new_player_object.connect("winner_triggerd", _on_player_won.bind(new_player_object))
|
|
new_player_object.connect("point_given_sound", _on_make_point_given_sound)
|
|
new_player_object.connect("player_point_given", _on_point_given.bind(new_player_object))
|
|
new_player_object.connect("player_point_taken", _on_point_taken.bind(new_player_object))
|
|
load_players()
|
|
|
|
func load_players() -> void:
|
|
print("load_players")
|
|
Settings.delete_children(players_list_container)
|
|
var counter: int = 0
|
|
for player_object: PlayerObject in Settings.player_array:
|
|
print(player_object.player_name)
|
|
|
|
var new_player: Player = player.instantiate()
|
|
new_player.player_object = player_object
|
|
new_player.list_index = counter
|
|
|
|
new_player.connect("change_character_clicked", _on_player_change_character_clicked.bind(new_player, player_object.player_name))
|
|
new_player.connect("player_removed", _on_player_removed.bind(player_object))
|
|
|
|
players_list_container.add_child(new_player)
|
|
counter += 1
|
|
|
|
func _on_point_given(player_object: PlayerObject) -> void:
|
|
print("_on_point_given")
|
|
log_window.add_log_row(player_object.player_name + " got a point")
|
|
if Playlist.currently_playing_song >= 0:
|
|
Playlist.add_point(player_object.id)
|
|
update_song_list()
|
|
|
|
func _on_make_point_given_sound() -> void:
|
|
music_player_container.play_sound_effect(preload("res://sounds/itemopen.wav"))
|
|
|
|
func _on_point_taken(player_object: PlayerObject) -> void:
|
|
print("_on_point_taken")
|
|
log_window.add_log_row(player_object.player_name + " lost a point")
|
|
music_player_container.play_sound_effect(preload("res://sounds/itemequip.wav"))
|
|
if Playlist.currently_playing_song >= 0:
|
|
Playlist.remove_point(player_object.id)
|
|
update_song_list()
|
|
|
|
func _on_player_won(player_object: PlayerObject) -> void:
|
|
print("_on_player_won")
|
|
winner_window.show_winner(player_object)
|
|
music_player_container.play_song(preload("res://sounds/winning.mp3"))
|
|
# Songs played after the game is won don't count towards the statistics
|
|
if Settings.add_to_stats:
|
|
Settings.add_to_stats = false
|
|
stats_paused_by_win = true
|
|
|
|
func _on_player_removed(player_object: PlayerObject) -> void:
|
|
print("_on_player_removed ", player_object.player_name)
|
|
Settings.player_array.erase(player_object)
|
|
load_players()
|
|
Playlist.remove_player_from_list(player_object.id)
|
|
update_song_list()
|
|
|
|
func _on_player_change_character_clicked(new_player: Player, player_name: String) -> void:
|
|
print("_on_player_change_character_clicked")
|
|
current_player = new_player
|
|
print("Change character for: " + player_name)
|
|
new_character_select.show_grid(player_name)
|
|
|
|
func _on_new_character_selected(character_texture: ImageTexture) -> void:
|
|
print("_on_new_character_selected")
|
|
current_player.new_character_selected(character_texture)
|
|
|
|
func show_search() -> void:
|
|
print("show_search")
|
|
search_view.toggle()
|
|
|
|
|
|
###Local
|
|
|
|
var local_path: String = '/Users/sebastian/ResilioSync/Sorterat_test/Metal Gear Solid 4 - Guns of the Patriots/2-16 Metal Gear Saga.mp3'
|
|
|
|
func open() -> void:
|
|
fileDialog.popup()
|
|
|
|
func _on_file_dialog_dir_selected(path: String) -> void:
|
|
print(path)
|
|
dir_contents(path)
|
|
|
|
func dir_contents(path: String) -> void:
|
|
var dir: DirAccess = DirAccess.open(path)
|
|
if dir:
|
|
dir.list_dir_begin()
|
|
var file_name: String = dir.get_next()
|
|
songs.clear()
|
|
soundtracks = []
|
|
while file_name != "":
|
|
if dir.current_is_dir():
|
|
#print("Found directory: " + file_name)
|
|
soundtracks.append(file_name)
|
|
else:
|
|
#print("Found file: " + file_name)
|
|
if file_name.ends_with(".mp3"):
|
|
songs.append(path + "/" + file_name)
|
|
file_name = dir.get_next()
|
|
else:
|
|
print("An error occurred when trying to access the path.")
|
|
|
|
for soundtrack: String in soundtracks:
|
|
var local_inspiration_label: Label = Label.new()
|
|
local_inspiration_label.text = soundtrack
|
|
inspiration_list.add_child(local_inspiration_label)
|