From 09a8cfafa342d8c9f3aacea89b7e324a93a852b6 Mon Sep 17 00:00:00 2001 From: netquick Date: Sun, 23 Aug 2026 12:16:09 +0200 Subject: [PATCH] Add settings, cloud places, and optional archive-content indexing. Keep official clients in charge of sync while Explorer can group locations, persist UI prefs, and list zip/rar/7z members without extracting them. Co-authored-by: Cursor --- .gitignore | 2 + Explorer.slnx | 2 + docs/ARCHITECTURE.md | 4 +- src/Explorer.Analysis/DuplicateAndHistory.cs | 6 + src/Explorer.App/App.xaml | 76 ++++++- src/Explorer.App/AppServices.cs | 7 + src/Explorer.App/Explorer.App.csproj | 2 + src/Explorer.App/MainWindow.xaml | 91 +++++++- src/Explorer.App/MainWindow.xaml.cs | 85 +++++++- src/Explorer.App/SettingsWindow.xaml | 49 +++++ src/Explorer.App/SettingsWindow.xaml.cs | 51 +++++ src/Explorer.Application/BrowseService.cs | 124 ++++++++++- src/Explorer.Application/CloudPlaceStore.cs | 14 +- src/Explorer.Application/IArchiveCatalog.cs | 8 + src/Explorer.Application/PathHistoryStore.cs | 3 +- src/Explorer.Application/SourceManager.cs | 93 +++++++- .../UiPreferencesStore.cs | 109 ++++++++++ .../Abstractions/IIndexStore.cs | 2 + src/Explorer.Domain/AppConstants.cs | 1 + src/Explorer.Domain/ArchiveFormats.cs | 71 +++++++ src/Explorer.Domain/Enums.cs | 5 + src/Explorer.Domain/LocationRoots.cs | 11 + src/Explorer.Domain/PathRules.cs | 12 ++ src/Explorer.Indexing/ArchiveCatalog.cs | 96 +++++++++ .../ArchiveContentsIndexer.cs | 111 ++++++++++ src/Explorer.Indexing/ArchiveTreeBuilder.cs | 139 ++++++++++++ .../Explorer.Indexing.csproj | 1 + src/Explorer.Indexing/FilesystemScanner.cs | 40 +++- src/Explorer.Indexing/FolderReconciler.cs | 62 +++++- src/Explorer.Indexing/UsnChangeApplier.cs | 49 ++++- .../ProviderContracts.cs | 33 ++- .../DriveFsPreferenceReader.cs | 143 +++++++++++++ .../Explorer.Plugin.GoogleDrive.csproj | 14 ++ .../GoogleDrivePlaceDiscovery.cs | 118 +++++++++++ .../GoogleDrivePlaceholderState.cs | 101 +++++++++ .../GoogleDriveStorageProvider.cs | 148 +++++++++++++ .../Explorer.Plugin.Nextcloud.csproj | 10 + .../NextcloudPlaceDiscovery.cs | 198 ++++++++++++++++++ .../NextcloudPlaceholderState.cs | 101 +++++++++ .../NextcloudStorageProvider.cs | 140 +++++++++++++ .../OneDrivePlaceDiscovery.cs | 9 +- .../OneDriveStorageProvider.cs | 13 +- .../ViewModels/ExplorerPaneViewModel.cs | 42 ++-- .../ViewModels/ExplorerTabViewModel.cs | 5 +- .../ViewModels/MainViewModel.cs | 153 ++++++++++++-- .../ViewModels/NavigationTreeViewModel.cs | 181 ++++++++++++---- src/Explorer.Storage.Sqlite/EntryStore.cs | 19 ++ .../Explorer.Storage.Sqlite.csproj | 1 + src/Explorer.Storage.Sqlite/SourceStore.cs | 20 ++ .../WindowsSyncRootDiscovery.cs | 59 ++++++ .../BrowseServiceTests.cs | 4 +- .../CloudProviderTests.cs | 107 ++++++++++ .../Explorer.Application.Tests.csproj | 2 + .../SourceManagerTests.cs | 62 ++++++ .../UiPreferencesStoreTests.cs | 69 ++++++ tests/Explorer.Domain.Tests/DomainTests.cs | 28 +++ tests/Explorer.Indexing.Tests/ScannerTests.cs | 143 +++++++++++++ 57 files changed, 3130 insertions(+), 119 deletions(-) create mode 100644 src/Explorer.App/SettingsWindow.xaml create mode 100644 src/Explorer.App/SettingsWindow.xaml.cs create mode 100644 src/Explorer.Application/IArchiveCatalog.cs create mode 100644 src/Explorer.Application/UiPreferencesStore.cs create mode 100644 src/Explorer.Domain/ArchiveFormats.cs create mode 100644 src/Explorer.Domain/LocationRoots.cs create mode 100644 src/Explorer.Indexing/ArchiveCatalog.cs create mode 100644 src/Explorer.Indexing/ArchiveContentsIndexer.cs create mode 100644 src/Explorer.Indexing/ArchiveTreeBuilder.cs create mode 100644 src/Explorer.Plugin.GoogleDrive/DriveFsPreferenceReader.cs create mode 100644 src/Explorer.Plugin.GoogleDrive/Explorer.Plugin.GoogleDrive.csproj create mode 100644 src/Explorer.Plugin.GoogleDrive/GoogleDrivePlaceDiscovery.cs create mode 100644 src/Explorer.Plugin.GoogleDrive/GoogleDrivePlaceholderState.cs create mode 100644 src/Explorer.Plugin.GoogleDrive/GoogleDriveStorageProvider.cs create mode 100644 src/Explorer.Plugin.Nextcloud/Explorer.Plugin.Nextcloud.csproj create mode 100644 src/Explorer.Plugin.Nextcloud/NextcloudPlaceDiscovery.cs create mode 100644 src/Explorer.Plugin.Nextcloud/NextcloudPlaceholderState.cs create mode 100644 src/Explorer.Plugin.Nextcloud/NextcloudStorageProvider.cs create mode 100644 src/Explorer.Windows/WindowsSyncRootDiscovery.cs create mode 100644 tests/Explorer.Application.Tests/UiPreferencesStoreTests.cs diff --git a/.gitignore b/.gitignore index 46e65c4..0ad16ec 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ TestResults/ *.coverage *.nupkg project.lock.json +publish/ ## IDE .idea/ @@ -35,3 +36,4 @@ Desktop.ini *.db-shm *.db-wal *.log + diff --git a/Explorer.slnx b/Explorer.slnx index 4563adf..3584075 100644 --- a/Explorer.slnx +++ b/Explorer.slnx @@ -8,6 +8,8 @@ + + diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index e5f9545..cce8051 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -353,7 +353,7 @@ Windows-NFS-Client (optional Feature) erscheint als Laufwerk oder Mount. Behande ### 5.4 Cloud (Plugin-Overlay) -Explorer **implementiert keine Synchronisation**. Offizielle Clients (OneDrive, später Google Drive / Dropbox) bleiben zuständig für Sync, Hydration, Konflikte und Anmeldung. +Explorer **implementiert keine Synchronisation**. Offizielle Clients (OneDrive, Google Drive, Nextcloud; später Dropbox) bleiben zuständig für Sync, Hydration, Konflikte und Anmeldung. Cloud-Ordner werden wie jedes andere gemountete Dateisystem über Win32 gelistet. `Explorer.Plugin.Abstractions` / `IStorageProvider` **reichern** Einträge an (Status, logische vs. allokierte Größe, Pin/Free-up), sie **ersetzen nicht** Enumeration, Watcher oder Source-Identität. @@ -763,7 +763,7 @@ Ziel-SLO (Richtwerte, kein Contract): - Historien-Charts (Schema ja) - Pause/Resume Transfers, Konflikt-UI, Undo - Icon-View, Treemap, Preview-Pane -- Weitere Cloud-Provider (Google Drive, Dropbox) und PluginHost/IPC +- Weitere Cloud-Provider (Dropbox) und PluginHost/IPC - Explorer.exe ersetzen - Volltext in Dateiinhalten diff --git a/src/Explorer.Analysis/DuplicateAndHistory.cs b/src/Explorer.Analysis/DuplicateAndHistory.cs index 4f5b351..069df3b 100644 --- a/src/Explorer.Analysis/DuplicateAndHistory.cs +++ b/src/Explorer.Analysis/DuplicateAndHistory.cs @@ -42,6 +42,12 @@ public sealed class DuplicateHashWorker : BackgroundService var path = PathRules.Combine(item.RootPath, item.PathRel); try { + if (!File.Exists(path)) + { + await _store.Hashes.MarkSkippedAsync(item.EntryId, cancellationToken).ConfigureAwait(false); + continue; + } + if (_hydration.WouldHydrateOnRead(item.Attributes, item.CloudAvailability) || await _hydration.WouldHydrateOnReadAsync(path, cancellationToken).ConfigureAwait(false)) { diff --git a/src/Explorer.App/App.xaml b/src/Explorer.App/App.xaml index 8348a16..0a31961 100644 --- a/src/Explorer.App/App.xaml +++ b/src/Explorer.App/App.xaml @@ -228,6 +228,15 @@ + + + + + + + -