Skip to content

Commit

Permalink
Change the Elmish music player example to use IStorageProvider instea…
Browse files Browse the repository at this point in the history
…d of the obsoleted OpenFileDialog/OpenFolderDialog
  • Loading branch information
Numpsy committed Mar 24, 2024
1 parent ad77e06 commit b58e48c
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 40 deletions.
47 changes: 23 additions & 24 deletions src/Examples/Elmish Examples/Examples.Elmish.MusicPlayer/Dialogs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,32 @@ namespace Examples.MusicPlayer


module Dialogs =
open System
open Avalonia.Controls
open Avalonia
open Avalonia.Platform.Storage

let getMusicFilesDialog (filters: FileDialogFilter seq option) =
let dialog = OpenFileDialog()
let showMusicFilesDialog(provider: IStorageProvider, filters: FilePickerFileType List option) =

let filters =
match filters with
| Some filter -> filter
| None ->
let filter = FileDialogFilter()
filter.Extensions <-
Collections.Generic.List
(seq {
"mp3"
"wav" })
filter.Name <- "Music"
seq { filter }

dialog.AllowMultiple <- true
dialog.Directory <- Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)
dialog.Title <- "Select Your Music Files"
dialog.Filters <- System.Collections.Generic.List(filters)
dialog

let getFolderDialog =
let dialog = OpenFolderDialog()
dialog.Directory <- Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)
dialog.Title <- "Choose where to look up for music"
dialog
let patterns = [ "*.mp3"; "*.wav" ]
let filter = FilePickerFileType("Music", Patterns = patterns)
List.singleton filter

let options = FilePickerOpenOptions(AllowMultiple = true, Title = "Select Your Music Files", FileTypeFilter = filters)

task {
let! musicFolder = provider.TryGetWellKnownFolderAsync Platform.Storage.WellKnownFolder.Music
options.SuggestedStartLocation <- musicFolder

return! provider.OpenFilePickerAsync options
}

let showMusicFolderDialog(provider: IStorageProvider) =
task {
let! musicFolder = provider.TryGetWellKnownFolderAsync Platform.Storage.WellKnownFolder.Music
let options = FolderPickerOpenOptions(Title = "Choose where to look up for music", SuggestedStartLocation = musicFolder)

return! provider.OpenFolderPickerAsync options
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ module Shell =
open Avalonia.Controls
open Avalonia.Input
open Avalonia.Layout
open Avalonia.Platform.Storage
open Avalonia.FuncUI.Elmish
open Avalonia.FuncUI.Hosts
open Avalonia.FuncUI.DSL
open LibVLCSharp.Shared
open Examples.MusicPlayer
open System.Collections.Generic

type State =
{ title: string
Expand All @@ -24,8 +26,8 @@ module Shell =
| SetTitle of string
| OpenFiles
| OpenFolder
| AfterSelectFolder of string
| AfterSelectFiles of string array
| AfterSelectFolder of IReadOnlyList<IStorageFolder>
| AfterSelectFiles of IReadOnlyList<IStorageFile>
(* Handle Media Player Events *)
| Playing
| Paused
Expand Down Expand Up @@ -122,15 +124,13 @@ module Shell =
window.Title <- title
{ state with title = title }, Cmd.none
| OpenFiles ->
let dialog = Dialogs.getMusicFilesDialog None
let showDialog window = dialog.ShowAsync(window) |> Async.AwaitTask
state, Cmd.OfAsync.perform showDialog window AfterSelectFiles
let showDialog storageProvider = Dialogs.showMusicFilesDialog (storageProvider, None) |> Async.AwaitTask
state, Cmd.OfAsync.perform showDialog window.StorageProvider AfterSelectFiles
| OpenFolder ->
let dialog = Dialogs.getFolderDialog
let showDialog window = dialog.ShowAsync(window) |> Async.AwaitTask
state, Cmd.OfAsync.perform showDialog window AfterSelectFolder
let showDialog storageProvider = Dialogs.showMusicFolderDialog storageProvider |> Async.AwaitTask
state, Cmd.OfAsync.perform showDialog window.StorageProvider AfterSelectFolder
| AfterSelectFolder path ->
let songs = Songs.populateFromDirectory path |> Array.toList
let songs = Songs.populateFromFolders path |> Array.toList
state, Cmd.map PlaylistMsg (Cmd.ofMsg (Playlist.Msg.AddFiles songs))
| AfterSelectFiles paths ->
let songs = Songs.populateSongs paths |> Array.toList
Expand Down
19 changes: 12 additions & 7 deletions src/Examples/Elmish Examples/Examples.Elmish.MusicPlayer/Songs.fs
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
namespace Examples.MusicPlayer


module Songs =
open System
open System.IO
open Types
open Avalonia.Platform.Storage

let populateSongs (paths: string array): Types.SongRecord array =
let populateSongs (paths: IStorageFile seq): Types.SongRecord array =
paths
|> Array.Parallel.map FileInfo
|> Array.Parallel.map (fun info -> info.Name, info.FullName)
|> Array.Parallel.map (fun (name, path) ->
|> Seq.map (fun storageFile ->
{ id = Guid.NewGuid()
name = name
path = path
name = storageFile.Name
path = storageFile.Path.LocalPath
createdAt = DateTime.Now })
|> Array.ofSeq

let populateFromDirectory (path: string): Types.SongRecord array =
match String.IsNullOrEmpty path with
Expand All @@ -29,3 +28,9 @@ module Songs =
name = name
path = path
createdAt = DateTime.Now })

let populateFromFolders(folders: IStorageFolder seq) =
folders
|> Seq.map _.Path.LocalPath
|> Seq.map populateFromDirectory
|> Array.concat

0 comments on commit b58e48c

Please sign in to comment.