module UI.Playlists.ContextMenu exposing (listMenu) import ContextMenu exposing (..) import Coordinates exposing (Coordinates) import Html.Events.Extra.Mouse import Material.Icons.Round as Icons import Playlists exposing (Playlist) import Playlists.Matching import Tracks exposing (IdentifiedTrack) import UI.Page import UI.Playlists.Page import UI.Queue.Types as Queue import UI.Tracks.Types as Tracks import UI.Types exposing (Msg(..)) import Url -- 🔱 listMenu : Playlist -> List IdentifiedTrack -> Maybe String -> Coordinates -> ContextMenu Msg listMenu playlist allTracks confirmation coordinates = let identifiedTracksFromPlaylist = case playlist.autoGenerated of Just _ -> List.filter (Tuple.second >> Tracks.matchesAutoGeneratedPlaylist playlist) allTracks Nothing -> allTracks |> Playlists.Matching.match playlist |> Tuple.first tracksFromPlaylist = identifiedTracksFromPlaylist |> (if playlist.collection then identity else Tracks.sortByIndexInPlaylist ) |> List.map Tuple.second menuMsg = ShowPlaylistListMenu playlist { button = Html.Events.Extra.Mouse.MainButton , clientPos = Coordinates.toTuple coordinates , keys = { alt = False, ctrl = False, shift = False } , offsetPos = ( 0, 0 ) , pagePos = ( 0, 0 ) , screenPos = ( 0, 0 ) } in case playlist.autoGenerated of Just _ -> ContextMenu [ addToQueue identifiedTracksFromPlaylist , convertToRegularCollection tracksFromPlaylist playlist , downloadAsZip tracksFromPlaylist playlist , storeInCache tracksFromPlaylist ] coordinates Nothing -> ContextMenu [ addToQueue identifiedTracksFromPlaylist , downloadAsZip tracksFromPlaylist playlist , removePlaylist menuMsg confirmation playlist , renamePlaylist playlist , storeInCache tracksFromPlaylist , convert playlist ] coordinates -- ITEMS addToQueue identifiedTracks = Item { icon = Icons.update , label = "Add to queue" , msg = { inFront = False, tracks = identifiedTracks } |> Queue.AddTracks |> QueueMsg -- , active = False } convert playlist = Item { icon = Icons.waves , label = if playlist.collection then "Convert to playlist" else "Convert to collection" , msg = if playlist.collection then ConvertCollectionToPlaylist { name = playlist.name } else ConvertPlaylistToCollection { name = playlist.name } -- , active = False } convertToRegularCollection tracksFromPlaylist playlist = Item { icon = Icons.waves , label = "Save as regular collection" , msg = AddTracksToPlaylist { collection = True , playlistName = playlist.name , tracks = List.map Tracks.playlistTrackFromTrack tracksFromPlaylist } -- , active = False } downloadAsZip tracksFromPlaylist playlist = Item { icon = Icons.archive , label = "Download as zip file" , msg = tracksFromPlaylist |> Tracks.Download { prefixTrackNumber = not playlist.collection , zipName = playlist.name } |> TracksMsg -- , active = False } removePlaylist menuMsg confirmation playlist = let playlistId = "Playlist - " ++ playlist.name askForConfirmation = confirmation == Just playlistId in Item { icon = Icons.delete , label = if askForConfirmation then "Are you sure?" else "Remove playlist" , msg = if askForConfirmation then DeletePlaylist { playlistName = playlist.name } else ContextMenuConfirmation playlistId menuMsg , active = askForConfirmation } renamePlaylist playlist = Item { icon = Icons.font_download , label = "Rename playlist" , msg = playlist.name |> Url.percentEncode |> UI.Playlists.Page.Edit |> UI.Page.Playlists |> ChangeUrlUsingPage -- , active = False } storeInCache tracksFromPlaylist = Item { icon = Icons.offline_bolt , label = "Store in cache" , msg = TracksMsg (Tracks.StoreInCache tracksFromPlaylist) , active = False }