Skip to content

Implemented Avalonia user interface - #1

Merged
mzagozda merged 11 commits into
mainfrom
avalon
Aug 1, 2026
Merged

Implemented Avalonia user interface#1
mzagozda merged 11 commits into
mainfrom
avalon

Conversation

@mzagozda

@mzagozda mzagozda commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

No description provided.

mzagozda added 11 commits July 27, 2026 21:52
…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).
Copilot AI review requested due to automatic review settings August 1, 2026 08:04
@mzagozda
mzagozda merged commit 9c0f0a6 into main Aug 1, 2026
1 check passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) and NoteManager.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 thread README.md
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
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants