From 909043d38f604236cff548ee4e0bdd2135e4d76b Mon Sep 17 00:00:00 2001 From: Balazs Perlaki-Horvath Date: Thu, 10 Apr 2025 23:27:21 +0200 Subject: [PATCH] Multi select improvements --- ViewModel/LibraryViewModel.swift | 23 +++++++++++++++++++++-- Views/Library/Library.swift | 3 --- Views/Library/ZimFilesOpened.swift | 4 ---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/ViewModel/LibraryViewModel.swift b/ViewModel/LibraryViewModel.swift index ede68260..2af2ed49 100644 --- a/ViewModel/LibraryViewModel.swift +++ b/ViewModel/LibraryViewModel.swift @@ -44,8 +44,27 @@ enum LibraryState { } final class LibraryViewModel: ObservableObject { - @Published var selectedZimFile: ZimFile? - @Published var multiSelectedZimFiles = Set() + @Published var selectedZimFile: ZimFile? { + didSet { + if let selectedZimFile { + multiSelectedZimFiles = Set([selectedZimFile]) + } else { + multiSelectedZimFiles.removeAll() + } + } + } + @Published var multiSelectedZimFiles = Set() { + didSet { + switch multiSelectedZimFiles.count { + case 0 where selectedZimFile != nil: + selectedZimFile = nil + case 1 where selectedZimFile == nil: + selectedZimFile = multiSelectedZimFiles.first + default: + break + } + } + } @MainActor @Published private(set) var error: Error? /// Note: due to multiple instances of LibraryViewModel, /// this `state` should not be changed directly, modify the `process.state` instead diff --git a/Views/Library/Library.swift b/Views/Library/Library.swift index 92106d88..ec0b2f67 100644 --- a/Views/Library/Library.swift +++ b/Views/Library/Library.swift @@ -149,9 +149,6 @@ struct LibraryZimFileContext: View { content .gesture(TapGesture().modifiers(.command).onEnded({ value in viewModel.toggleMultiSelect(of: zimFile) - if viewModel.multiSelectedZimFiles.count > 0 { - viewModel.selectedZimFile = nil - } })) .gesture(TapGesture().onEnded({ _ in viewModel.selectedZimFile = zimFile diff --git a/Views/Library/ZimFilesOpened.swift b/Views/Library/ZimFilesOpened.swift index 586a4d79..22410975 100644 --- a/Views/Library/ZimFilesOpened.swift +++ b/Views/Library/ZimFilesOpened.swift @@ -63,10 +63,6 @@ struct ZimFilesOpened: View { } .onChange(of: zimFiles.count) { _ in viewModel.selectedZimFile = zimFiles.first // makes sure we also nil out, if all ZIMs were unlinked - viewModel.multiSelectedZimFiles.removeAll() - } - .onDisappear { - viewModel.multiSelectedZimFiles.removeAll() } // not using OpenFileButton here, because it does not work on iOS/iPadOS 15 when this view is in a modal .fileImporter(