From 2854ee8d47ac860d3a9453a08eeabe5099464812 Mon Sep 17 00:00:00 2001 From: MRmlik12 Date: Sat, 8 Jun 2024 11:30:09 +0200 Subject: [PATCH] Specify extensions to file picker --- src/NoteSHR.Browser/AppBundle/fileUtils.js | 3 ++- src/NoteSHR.Browser/BrowserFileService.cs | 6 +++--- src/NoteSHR.Core/FileTypeFilters.cs | 11 +++++++++++ src/NoteSHR.Core/Services/IFileService.cs | 2 +- .../Components/Image/ImageComponentViewModel.cs | 3 ++- src/NoteSHR/ViewModels/BoardViewModel.cs | 11 +++++------ 6 files changed, 24 insertions(+), 12 deletions(-) create mode 100644 src/NoteSHR.Core/FileTypeFilters.cs diff --git a/src/NoteSHR.Browser/AppBundle/fileUtils.js b/src/NoteSHR.Browser/AppBundle/fileUtils.js index 7090257..de43318 100644 --- a/src/NoteSHR.Browser/AppBundle/fileUtils.js +++ b/src/NoteSHR.Browser/AppBundle/fileUtils.js @@ -1,7 +1,8 @@ -export function openFilePicker() { +export function openFilePicker(fileTypes) { return new Promise((resolve, reject) => { const input = document.createElement('input'); input.type = 'file'; + input.accept = fileTypes.join(','); input.addEventListener('change', () => { if (input.files.length > 0) { diff --git a/src/NoteSHR.Browser/BrowserFileService.cs b/src/NoteSHR.Browser/BrowserFileService.cs index a7c5c5a..8a2bb04 100644 --- a/src/NoteSHR.Browser/BrowserFileService.cs +++ b/src/NoteSHR.Browser/BrowserFileService.cs @@ -11,9 +11,9 @@ public BrowserFileService() Task.Run(async () => await JSHost.ImportAsync("FileUtils", "./fileUtils.js")); } - public async Task GetFileUrl() + public async Task GetFileUrl(string[] fileTypes) { - var url = await FileUtilsEmbed.OpenFilePicker(); + var url = await FileUtilsEmbed.OpenFilePicker(fileTypes); return url; } @@ -27,7 +27,7 @@ public async Task SaveFile(string fileName, byte[] content) internal partial class FileUtilsEmbed { [JSImport("openFilePicker", "FileUtils")] - public static partial Task OpenFilePicker(); + public static partial Task OpenFilePicker(string[] fileTypes); [JSImport("saveFile", "FileUtils")] public static partial Task SaveFile(string fileName, byte[] contents); diff --git a/src/NoteSHR.Core/FileTypeFilters.cs b/src/NoteSHR.Core/FileTypeFilters.cs new file mode 100644 index 0000000..09c55ba --- /dev/null +++ b/src/NoteSHR.Core/FileTypeFilters.cs @@ -0,0 +1,11 @@ +using Avalonia.Platform.Storage; + +namespace NoteSHR.Core; + +public class FileTypeFilters +{ + public static FilePickerFileType Board = new ("NoteSHR Board File") + { + Patterns = new[] { "*.shr" } + }; +} \ No newline at end of file diff --git a/src/NoteSHR.Core/Services/IFileService.cs b/src/NoteSHR.Core/Services/IFileService.cs index 4468126..167e161 100644 --- a/src/NoteSHR.Core/Services/IFileService.cs +++ b/src/NoteSHR.Core/Services/IFileService.cs @@ -2,6 +2,6 @@ namespace NoteSHR.Core.Services; public interface IFileService { - Task GetFileUrl(); + Task GetFileUrl(string[] fileTypes); Task SaveFile(string fileName, byte[] content); } \ No newline at end of file diff --git a/src/NoteSHR/Components/Image/ImageComponentViewModel.cs b/src/NoteSHR/Components/Image/ImageComponentViewModel.cs index 6c063e7..e09f13e 100644 --- a/src/NoteSHR/Components/Image/ImageComponentViewModel.cs +++ b/src/NoteSHR/Components/Image/ImageComponentViewModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Reactive; using Avalonia.Controls; using Avalonia.Interactivity; @@ -24,7 +25,7 @@ public ImageComponentViewModel() { if (OperatingSystem.IsBrowser()) { - var url = await App.FileService.GetFileUrl(); + var url = await App.FileService.GetFileUrl(FilePickerFileTypes.ImageAll.Patterns!.Select(x => x.Remove(0, 1)).ToArray()); if (string.IsNullOrEmpty(url)) return; Image = await HttpUtils.GetBitmapFromUrl(url); diff --git a/src/NoteSHR/ViewModels/BoardViewModel.cs b/src/NoteSHR/ViewModels/BoardViewModel.cs index 154bef2..ecc8a16 100644 --- a/src/NoteSHR/ViewModels/BoardViewModel.cs +++ b/src/NoteSHR/ViewModels/BoardViewModel.cs @@ -12,6 +12,7 @@ using NoteSHR.Components.List; using NoteSHR.Components.NoteNode.EventArgs; using NoteSHR.Components.Text; +using NoteSHR.Core; using NoteSHR.Core.EventArgs; using NoteSHR.Core.Helpers; using NoteSHR.Core.Models; @@ -31,7 +32,6 @@ public BoardViewModel() { CreateNoteCommand = ReactiveCommand.Create((BoardPointerEventArgs e) => { - LastMousePosition = e.Args.GetPosition(e.Source); if (e.Args.Source is not Canvas) { if (e.Args.Source is not Grid header) @@ -159,18 +159,19 @@ public BoardViewModel() ImportBoardCommand = ReactiveCommand.CreateFromTask(async (RoutedEventArgs args) => { - string path; - if (OperatingSystem.IsBrowser()) + string path; if (OperatingSystem.IsBrowser()) { - path = await App.FileService.GetFileUrl(); + path = await App.FileService.GetFileUrl(FileTypeFilters.Board.Patterns!.Select(x => x.Remove(0, 1)).ToArray()); if (string.IsNullOrEmpty(path)) return; } else { var topLevel = TopLevel.GetTopLevel(args.Source as Visual); + var openFilePickerOptions = new FilePickerOpenOptions() { Title = Translations.SelectFile, + FileTypeFilter = new [] { FileTypeFilters.Board }, AllowMultiple = false }; @@ -192,8 +193,6 @@ public BoardViewModel() [Reactive] public bool DeleteMode { get; set; } [Reactive] public bool EditMode { get; set; } - private Point LastMousePosition { get; set; } - public ReactiveCommand CreateNoteCommand { get; set; } public ReactiveCommand RemoveNote { get; set; } public ReactiveCommand UpdateNoteLocation { get; set; }