Conversation
…ged or kept in sync. Mixed PDF/image embeds now resolve and display beneath the Markdown editor in Markdown order. Supported image formats: PNG, JPG, JPEG, and BMP (assuming “BNP” meant BMP). Images use a native Avalonia preview with aspect-ratio preservation, downscaled decoding, open-externally action, and safe missing/corrupt-file status. Typing or removing an embed refreshes previews after a short debounce. Existing PDF viewer and PDF import flow remain intact. Key implementation: [media model (line 11)](C:\\Projects\\NoteManager\\src\\NoteManager.App\\Models\\EmbeddedMediaReference.cs:11), [vault resolver (line 10)](C:\\Projects\\NoteManager\\src\\NoteManager.App\\Services\\EmbeddedMediaVaultIndex.cs:10), [image viewer (line 8)](C:\\Projects\\NoteManager\\src\\NoteManager.Desktop\\Controls\\ImageViewer.axaml.cs:8), and [Avalonia layout (line 337)](C:\\Projects\\NoteManager\\src\\NoteManager.Desktop\\MainWindow.axaml:337).
There was a problem hiding this comment.
Pull request overview
Implements the new Avalonia-based desktop UI, reorganizes the solution into a platform-neutral core plus a cross-platform desktop host, and adds/updates automated test coverage and packaging scripts to support the migration.
Changes:
- Added
NoteManager.Desktop(Avalonia UI) andNoteManager.Core(portable services/models/view-model) and updated the solution structure. - Expanded search, sorting, renaming, and embedded-media (PDF/image) behaviors with new/updated unit tests plus new Windows-only UI automation tests.
- Updated docs and installer tooling for .NET 10 and cross-platform packaging (macOS app bundle + Windows archives/installer).
Reviewed changes
Copilot reviewed 76 out of 78 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Run-UiTests.ps1 | Points UI test runner at new Desktop UI test project + Desktop app output. |
| tests/Run-AllTests.ps1 | Adjusts “all tests” script invocation of UI tests. |
| tests/NoteManager.Desktop.UiTests/SearchUiTests.cs | New Avalonia search UI automation scenarios (FlaUI/NUnit). |
| tests/NoteManager.Desktop.UiTests/README.md | Documents the Avalonia UI test suite and artifacts. |
| tests/NoteManager.Desktop.UiTests/NoteTitleEditingUiTests.cs | New UI automation test for inline title renaming behavior. |
| tests/NoteManager.Desktop.UiTests/NoteManager.Desktop.UiTests.csproj | New Windows-only UI test project definition. |
| tests/NoteManager.Desktop.UiTests/Infrastructure/UiWait.cs | UI polling/wait helper for automation stability. |
| tests/NoteManager.Desktop.UiTests/Infrastructure/UiTestPaths.cs | Resolves repo/app/artifact paths for UI tests. |
| tests/NoteManager.Desktop.UiTests/Infrastructure/UiTestBase.cs | Base fixture for disposable vault + failure artifacts. |
| tests/NoteManager.Desktop.UiTests/Infrastructure/SearchTestVault.cs | Disposable vault dataset builder for UI tests. |
| tests/NoteManager.Desktop.UiTests/Infrastructure/NoteManagerAppSession.cs | FlaUI session wrapper for interacting with the app. |
| tests/NoteManager.Desktop.UiTests/AssemblyInfo.cs | Forces serialized UI tests (non-parallel). |
| tests/NoteManager.App.Tests/UiAutomationServerTests.cs | Adds unit coverage for named-pipe automation server. |
| tests/NoteManager.App.Tests/PdfDropImportViewModelTests.cs | Refactors/extends PDF import test and adds media refresh ordering coverage. |
| tests/NoteManager.App.Tests/NoteSortingTests.cs | Adds unit coverage for sort defaults, persistence, and search/sort interaction. |
| tests/NoteManager.App.Tests/NoteSearchViewModelTests.cs | Adds unit coverage for search availability, busy state, and scope interaction. |
| tests/NoteManager.App.Tests/NoteSearchQueryParserTests.cs | Adds unit coverage for the new search query parser grammar. |
| tests/NoteManager.App.Tests/NoteSearchIndexServiceTests.cs | Extends index/search service tests and updates result assertions. |
| tests/NoteManager.App.Tests/NoteRenamingTests.cs | Adds unit coverage for note creation/rename collision handling. |
| tests/NoteManager.App.Tests/NoteManager.App.Tests.csproj | Moves tests to net10.0 and references NoteManager.Core. |
| tests/NoteManager.App.Tests/EmbeddedMediaReferenceTests.cs | Adds unit tests for embedded media parsing/resolution and ordering. |
| src/NoteManager.Desktop/Program.cs | New Avalonia app entry point. |
| src/NoteManager.Desktop/NoteManager.Desktop.csproj | New Avalonia desktop host project (packages + Core reference). |
| src/NoteManager.Desktop/MainWindow.axaml.cs | Desktop window code-behind: folder open, search submit, PDF import, rename, automation server wiring. |
| src/NoteManager.Desktop/MainWindow.axaml | New Avalonia three-pane UI layout + automation IDs for tests. |
| src/NoteManager.Desktop/Dialogs/ShareDialog.axaml.cs | Share dialog behavior (publish + clipboard + close semantics). |
| src/NoteManager.Desktop/Dialogs/ShareDialog.axaml | Share dialog UI. |
| src/NoteManager.Desktop/Dialogs/ConfirmDialog.axaml.cs | New confirm dialog window logic. |
| src/NoteManager.Desktop/Dialogs/ConfirmDialog.axaml | Confirm dialog UI. |
| src/NoteManager.Desktop/Dialogs/AssignTagsDialog.axaml.cs | New tag assignment dialog logic (filter + validate + persist selection). |
| src/NoteManager.Desktop/Dialogs/AssignTagsDialog.axaml | Tag assignment dialog UI. |
| src/NoteManager.Desktop/Converters.cs | Adds an inverse-boolean converter for bindings. |
| src/NoteManager.Desktop/Controls/PdfViewer.axaml.cs | Embedded PDF viewer control wrapper around native web view. |
| src/NoteManager.Desktop/Controls/PdfViewer.axaml | Embedded PDF viewer UI. |
| src/NoteManager.Desktop/Controls/ImageViewer.axaml.cs | Embedded image viewer with safe decode/dispose handling. |
| src/NoteManager.Desktop/Controls/ImageViewer.axaml | Embedded image viewer UI. |
| src/NoteManager.Desktop/Controls/EmbeddedMediaViewer.axaml.cs | Switches between PDF/image viewers based on embedded media kind. |
| src/NoteManager.Desktop/Controls/EmbeddedMediaViewer.axaml | Host control for embedded media viewers. |
| src/NoteManager.Desktop/app.manifest | Windows manifest for desktop host (DPI/compatibility). |
| src/NoteManager.Desktop/App.axaml.cs | Avalonia application initialization + option parsing. |
| src/NoteManager.Desktop/App.axaml | Avalonia theme/resources/styles. |
| src/NoteManager.Core/NoteManager.Core.csproj | New portable project linking models/services/view-model from legacy tree. |
| src/NoteManager.App/Services/UiAutomationServer.cs | Makes automation server public for Desktop host and tests. |
| src/NoteManager.App/Services/NoteSortPreferenceService.cs | Adds persisted per-folder sort preference service. |
| src/NoteManager.App/Services/NoteSearchQueryParser.cs | Adds typed search query parser (modes/operators/fields/phrases). |
| src/NoteManager.App/Services/MarkdownMetadataParser.cs | Generalizes inline embed parsing to PDF+images. |
| src/NoteManager.App/Services/MarkdownFolderService.cs | Loads folder metadata + embedded media references + exposes file size formatting. |
| src/NoteManager.App/Services/EmbeddedMediaVaultIndex.cs | New vault index for resolving embedded media targets to paths. |
| src/NoteManager.App/Models/NoteSortType.cs | New enum for sort modes. |
| src/NoteManager.App/Models/NoteItem.cs | Extends note model with file identity/metadata + embedded media references. |
| src/NoteManager.App/Models/EmbeddedMediaReference.cs | New model for resolved embedded media (kind/path/filename). |
| src/NoteManager.App/Infrastructure/ApplicationOptions.cs | Makes options public + tightens automation pipe-name validation. |
| spikes/AvaloniaPdfSpike/README.md | Adds spike documentation for native PDF-in-webview viability. |
| spikes/AvaloniaPdfSpike/Program.cs | Spike app entry point. |
| spikes/AvaloniaPdfSpike/MainWindow.axaml.cs | Spike window logic for loading/printing local PDF in native web views. |
| spikes/AvaloniaPdfSpike/MainWindow.axaml | Spike window UI. |
| spikes/AvaloniaPdfSpike/AvaloniaPdfSpike.csproj | Spike project definition and content packaging for sample PDF. |
| spikes/AvaloniaPdfSpike/app.manifest | Spike Windows manifest. |
| spikes/AvaloniaPdfSpike/App.axaml.cs | Spike app initialization. |
| spikes/AvaloniaPdfSpike/App.axaml | Spike theme setup. |
| search.md | Adds/updates the full-text search specification and acceptance criteria. |
| SampleNotes/untagged-note.md | Removes a sample note fixture file. |
| SampleNotes/projects/second-template.md | Removes a sample note fixture file. |
| SampleNotes/network-notes.md | Removes a sample note fixture file. |
| SampleNotes/command-template.md | Removes a sample note fixture file. |
| README.md | Updates top-level documentation for Avalonia, .NET 10, testing, packaging, and search behavior. |
| NoteManager.sln | Updates solution projects (Core + Desktop) and nesting. |
| installer/README.md | Updates installer documentation for cross-platform packaging. |
| installer/package-release.sh | Adds macOS-driven cross-platform “team sharing” packaging script. |
| installer/macos/Info.plist | Adds macOS app bundle plist template. |
| installer/build-macos.sh | Adds macOS app bundle build script. |
| installer/build-installer.ps1 | Updates Windows installer build to target Desktop project. |
| global.json | Updates pinned SDK to .NET 10.0.302. |
| design-qa.md | Updates design QA evidence text for Avalonia UI changes. |
| .gitignore | Adds ignores for installer publish outputs and macOS artifacts; updates SampleNotes handling. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+203
to
206
| var updatedReferences = _embeddedMediaReferences | ||
| .Concat(references) | ||
| .Where(reference => !string.IsNullOrWhiteSpace(reference.ResolvedPath)) | ||
| .ToArray(); |
Comment on lines
+22
to
+25
| <ItemGroup> | ||
| <Content Include="..\..\SampleNotes\documents\orbital-guide.pdf" | ||
| Link="Assets\orbital-guide.pdf" | ||
| CopyToOutputDirectory="PreserveNewest" /> |
Comment on lines
+9
to
+12
| - .NET SDK 8.0.423 | ||
| - Avalonia 12.0.0 | ||
| - `Avalonia.Controls.WebView` 12.0.0 | ||
| - Test document: `SampleNotes/documents/orbital-guide.pdf` |
Comment on lines
+15
to
29
| The repository pins the .NET 10 SDK through `global.json`. On startup, the application recursively loads the Obsidian vault at: | ||
|
|
||
| ```text | ||
| C:\Projects\Obsidian | ||
| SampleNotes | ||
| ``` | ||
|
|
||
| Use **File → Open folder…** or `Ctrl+O` to switch to another Markdown folder. | ||
| Use **File → Open folder…**, `Ctrl+O` on Windows, or `Command+O` on macOS to | ||
| switch to another Markdown folder. | ||
|
|
||
| For a dialog-free automated launch, inject the startup folder: | ||
|
|
||
| ```powershell | ||
| dotnet run --project .\src\NoteManager.App\NoteManager.App.csproj -- --folder .\SampleNotes | ||
| ```bash | ||
| dotnet run --project src/NoteManager.Desktop/NoteManager.Desktop.csproj -- \ | ||
| --folder SampleNotes | ||
| ``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.