setlist/docs/playlistmanager-add-map.md

3.6 KiB

For reference, the source code is in ~/src/rithik-b/PlaylistManager.

Here is how “add this map to a playlist” is wired in this repo.

1. User clicks Add (opens the picker)

The Add button on the level detail screen calls AddPlaylistModalController.ShowModal():

        [UIAction("add-button-click")]
        private void OpenAddModal()
        {
            addPlaylistController.ShowModal();
        }

ShowModal parses the BSML if needed, opens the modal, and lists playlists from the default lib manager:

        internal void ShowModal()
        {
            Parse();
            parserParams.EmitEvent("close-modal");
            parserParams.EmitEvent("open-modal");
            ShowPlaylistsForManager(PlaylistLibUtils.playlistManager);
        }

2. User picks a playlist row — that is where the map is actually added

The real work is in AddPlaylistModalController.OnCellSelect: after navigating folders, choosing a playlist calls IPlaylist.Add(...) from BeatSaberPlaylistsLib, then persists and notifies:

        [UIAction("select-cell")]
        private void OnCellSelect(TableView tableView, int index)
        {
            playlistTableData.TableView.ClearSelection();
            // Folder Selected
            if (index < childManagers.Count)
            {
                ShowPlaylistsForManager(childManagers[index]);
            }
            else
            {
                index -= childManagers.Count;
                var selectedPlaylist = childPlaylists[index];
                IPlaylistSong playlistSong;
                if (HighlightDifficulty)
                {
                    playlistSong = selectedPlaylist.Add(standardLevelDetailViewController.beatmapLevel, standardLevelDetailViewController.beatmapKey);
                }
                else
                {
                    playlistSong = selectedPlaylist.Add(standardLevelDetailViewController.beatmapLevel);
                }
                try
                {
                    selectedPlaylist.RaisePlaylistChanged();
                    parentManager.StorePlaylist(selectedPlaylist);
                    popupModalsController.ShowOkModal(modalTransform, string.Format("Song successfully added to {0}", selectedPlaylist.Title), null, animateParentCanvas: false);
                    // TODO: Doesn't refresh the sprite.
                    Events.RaisePlaylistSongAdded(playlistSong, selectedPlaylist);
                }
                catch (Exception e)
                {
                    popupModalsController.ShowOkModal(modalTransform, "An error occured while adding song to playlist.", null, animateParentCanvas: false);
                    Plugin.Log.Critical(string.Format("An exception was thrown while adding a song to a playlist.\nException Message: {0}", e.Message));
                }
                finally
                {
                    ShowPlaylistsForManager(parentManager);
                }
            }
        }

So:

  • PlaylistManager code: AddPlaylistModalController.OnCellSelect (orchestration, UI, StorePlaylist, Events.RaisePlaylistSongAdded).
  • Library code: selectedPlaylist.Add(...) — implementation of how the entry is stored lives in BeatSaberPlaylistsLib (IPlaylist), not in this repository.

There is no other .Add( on a playlist for this flow in the grep results; removing a song is the parallel path in LevelDetailButtonsViewController.RemoveSong().