Skip to content

Remember folded filters, start in the search box, move the description last, add Help - #18

Merged
donislawdev merged 3 commits into
mainfrom
feat/window-layout-focus-help
Sep 24, 2026
Merged

donislawdev merged 3 commits into
mainfrom
feat/window-layout-focus-help

Conversation

@donislawdev

@donislawdev donislawdev commented Sep 24, 2026 •

Copy link
Copy Markdown
Owner

Summary

Package 6 of the window UX audit: items UX-GUI-007, 010, 013 and 014, each on the owner's decision. The first commit is a follow-up to #17: the "Also stop it" offer is now drawn in the red of "Force stop...", chosen from photographs of both styles.

  • Filters (007): folding the filter chips is remembered. The preferences file grows one key, filtersFolded, written only when true, so it becomes schema 5 and a version 4 file reads as "open". A first run still shows the filters. On a live window at 1650 x 1050 the list gains about 187 pixels (about 19 rows visible instead of 13).
  • Keyboard (010): the window starts with the keyboard in the search box, and so does the list after "Show the list". The hand-over is quiet, so the suggestions do not open by themselves. The row menu writes Ctrl+C beside "Copy everything".
  • Columns (013): Description is the last of the usual columns, so the state stands next to the name in a maximised window, not about 2800 pixels away. A saved layout keeps its order. "Restore the usual columns" gives the new one.
  • Help (014): a Help button ends the top row, with Donate beside it, and F1 opens the same menu. It holds the keyboard shortcuts (each item does what its key does), the query language page, the project's website and the version with a way to copy it. Both pages open through the same hand-over as Donate, and the tool itself still connects to nothing.

Contract change

  • The preferences file (bws-preferences.json) is now schema 5. The change is additive: one optional key, written only when true. This build reads schemas 1 to 5 and writes 5.

Verification

  • Window tests in the touched classes: 224 of 225. The one red test is a known failure in a session without administrator rights. Architecture 182/182, site 26/26, integration runs=anywhere 24/24.
  • New guards: FoldedFiltersGuards (written, read back, window opens as left, first run open, key order) and HelpMenuGuards (menu content with keys read from the items, F1, version, an item doing what its key does, select all, pages over https). Existing guards updated where the behaviour changed on purpose (schema number, column order, Donate's position).
  • Keyboard focus cannot be read in the test host, because its window is never shown. A new UI Automation probe checks it on a live window: the build before this change fails on both paths, and this build passes on both.
  • Mutation registry: every new entry caught, none stale.
  • Live window photographs at three sizes, plus one with a folded profile.

Not in this change

  • Whether keyboard focus in the grid should hold the list still (the second half of an older open question).
  • The first run at the smallest window size still shows the filters.
  • The Help menu was not photographed open. Its content is guarded by a test on the real menu.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a Help button and F1 shortcut with keyboard shortcuts, project links, and the app version.
    • The search box receives focus when the app opens or returns to the list, without automatically opening suggestions.
    • Filter visibility is remembered between sessions.
    • Added a Ctrl+C label to the “Copy everything” menu item.
  • Changes

    • Reordered the initially visible columns, moving Description to the end.
    • Updated the “Also stop it” offer with a red outline.
  • Documentation

    • Documented Help menu contents, search behavior, filter persistence, and column order.

donislawdev and others added 2 commits September 24, 2026 16:24
The offer under "keeps running" was drawn in the quiet outline of Copy. It
now uses the red outline of "Force stop...", chosen from photographs of both.
The offer's style is based on the force stop's rather than a copy of it, and
keeps its own name so the two can part again without touching the template.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n last, add Help

Four items of the window's UX audit, each on the owner's decision.

The filters (UX-GUI-007): folding the filter chips away is remembered, so
the window opens the way it was left. The preferences file grows one key,
filtersFolded, written only when true, which makes it schema 5 and makes a
version 4 file read as "open" - what the window has always done. A first run
still opens with the filters showing. Measured on a live window at 1650 x
1050: the list gains about 187 pixels, about six rows.

The keyboard (UX-GUI-010): the window starts with the keyboard in the search
box, and so does the list after "Show the list" on the overview. The hand-over
is quiet, so the suggestions under the box do not open by themselves, and it
waits for layout at input priority - a plain Focus() at the moment the
overview went was measured doing nothing. A new probe checks both paths, since
a window the test host builds is never shown and has no focus to read. The
row menu writes Ctrl+C beside "Copy everything".

The columns (UX-GUI-013): the description is the last of the columns shown at
the start. As the one star column it took all the spare width of a maximised
window and pushed the state about 2800 pixels right of the name. A saved
layout keeps its own order, and "Restore the usual columns" gives the new
one.

Help (UX-GUI-014): a Help button ends the top row, with Donate beside it, and
F1 opens the same menu. It lists the keyboard shortcuts - each item does what
its key does, through the same act - opens the query language page and the
project's website the way Donate opens its page, and shows the version with a
way to copy it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 24, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 17c4f64b-a9ac-4a01-8062-6eeb0f141f83

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 36737b98-2caa-4496-890c-09bc264684bf

📥 Commits

Reviewing files that changed from the base of the PR and between e005e9e and b67953c.

📒 Files selected for processing (27)
  • CHANGELOG.md
  • src/Bws.Gui/ExternalLinks.cs
  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/HelpMenu.cs
  • src/Bws.Gui/KeptColumns.cs
  • src/Bws.Gui/MainWindow.Filters.cs
  • src/Bws.Gui/MainWindow.Help.cs
  • src/Bws.Gui/MainWindow.Keyboard.cs
  • src/Bws.Gui/MainWindow.Overview.cs
  • src/Bws.Gui/MainWindow.Suggesting.cs
  • src/Bws.Gui/MainWindow.xaml.cs
  • src/Bws.Gui/Release.cs
  • src/Bws.Gui/Resources/gui.en.json
  • src/Bws.Gui/RowMenu.cs
  • src/Bws.Gui/ScopeBar.xaml
  • src/Bws.Gui/ScopeBar.xaml.cs
  • src/Bws.Gui/Shortcuts.cs
  • src/Bws.Gui/Themes/PlanOffers.xaml
  • src/Bws.Gui/ViewModels/ColumnLayout.cs
  • src/Bws.Gui/ViewModels/Columns.cs
  • tests/Bws.Architecture.Tests/DeadCodeGuards.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/RowMenuGuards.cs
💤 Files with no reviewable changes (1)
  • tests/Bws.Architecture.Tests/DeadCodeGuards.cs

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: build and the tests that do not need this machine
  • GitHub Check: Semgrep
  • GitHub Check: Analyse csharp
  • GitHub Check: Analyse actions
  • GitHub Check: submit-nuget
🧰 Additional context used
📓 Path-based instructions (12)
Applies to text shown to the user (labels, buttons, tooltips, placeholders, dialogs, errors, status messages, empty states, translations).

⚙️ CodeRabbit configuration file

Files:

  • src/Bws.Gui/MainWindow.Keyboard.cs
  • src/Bws.Gui/Shortcuts.cs
  • src/Bws.Gui/MainWindow.Overview.cs
  • tests/Bws.Gui.Tests/RowMenuGuards.cs
  • src/Bws.Gui/ScopeBar.xaml.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/RowMenu.cs
  • src/Bws.Gui/ViewModels/Columns.cs
  • src/Bws.Gui/Release.cs
  • src/Bws.Gui/ScopeBar.xaml
  • src/Bws.Gui/Resources/gui.en.json
  • src/Bws.Gui/MainWindow.Filters.cs
  • src/Bws.Gui/MainWindow.xaml.cs
  • src/Bws.Gui/Themes/PlanOffers.xaml
  • src/Bws.Gui/MainWindow.Suggesting.cs
  • src/Bws.Gui/ExternalLinks.cs
  • src/Bws.Gui/HelpMenu.cs
  • src/Bws.Gui/ViewModels/ColumnLayout.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • src/Bws.Gui/KeptColumns.cs
  • src/Bws.Gui/MainWindow.Help.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
Verify tests check real behavior and would fail if the implementation were broken.

⚙️ CodeRabbit configuration file

Files:

  • tests/Bws.Gui.Tests/RowMenuGuards.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
Performance is a known weak spot of these projects.

⚙️ CodeRabbit configuration file

Files:

  • src/Bws.Gui/MainWindow.Keyboard.cs
  • src/Bws.Gui/Shortcuts.cs
  • src/Bws.Gui/MainWindow.Overview.cs
  • tests/Bws.Gui.Tests/RowMenuGuards.cs
  • src/Bws.Gui/ScopeBar.xaml.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/RowMenu.cs
  • src/Bws.Gui/ViewModels/Columns.cs
  • src/Bws.Gui/Release.cs
  • src/Bws.Gui/ScopeBar.xaml
  • src/Bws.Gui/MainWindow.Filters.cs
  • src/Bws.Gui/MainWindow.xaml.cs
  • src/Bws.Gui/Themes/PlanOffers.xaml
  • src/Bws.Gui/MainWindow.Suggesting.cs
  • src/Bws.Gui/ExternalLinks.cs
  • src/Bws.Gui/HelpMenu.cs
  • src/Bws.Gui/ViewModels/ColumnLayout.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • src/Bws.Gui/KeptColumns.cs
  • src/Bws.Gui/MainWindow.Help.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
Applies only to code that builds or styles a GUI.

⚙️ CodeRabbit configuration file

Files:

  • src/Bws.Gui/MainWindow.Keyboard.cs
  • src/Bws.Gui/Shortcuts.cs
  • src/Bws.Gui/MainWindow.Overview.cs
  • tests/Bws.Gui.Tests/RowMenuGuards.cs
  • src/Bws.Gui/ScopeBar.xaml.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/RowMenu.cs
  • src/Bws.Gui/ViewModels/Columns.cs
  • src/Bws.Gui/Release.cs
  • src/Bws.Gui/ScopeBar.xaml
  • src/Bws.Gui/MainWindow.Filters.cs
  • src/Bws.Gui/MainWindow.xaml.cs
  • src/Bws.Gui/Themes/PlanOffers.xaml
  • src/Bws.Gui/MainWindow.Suggesting.cs
  • src/Bws.Gui/ExternalLinks.cs
  • src/Bws.Gui/HelpMenu.cs
  • src/Bws.Gui/ViewModels/ColumnLayout.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • src/Bws.Gui/KeptColumns.cs
  • src/Bws.Gui/MainWindow.Help.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
User-facing changelog.

⚙️ CodeRabbit configuration file

Files:

  • CHANGELOG.md
SECURITY, HIGH PRIORITY.

⚙️ CodeRabbit configuration file

Files:

  • src/Bws.Gui/MainWindow.Keyboard.cs
  • src/Bws.Gui/Shortcuts.cs
  • src/Bws.Gui/MainWindow.Overview.cs
  • tests/Bws.Gui.Tests/RowMenuGuards.cs
  • src/Bws.Gui/ScopeBar.xaml.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • src/Bws.Gui/RowMenu.cs
  • src/Bws.Gui/ViewModels/Columns.cs
  • src/Bws.Gui/Release.cs
  • src/Bws.Gui/MainWindow.Filters.cs
  • src/Bws.Gui/MainWindow.xaml.cs
  • src/Bws.Gui/MainWindow.Suggesting.cs
  • src/Bws.Gui/ExternalLinks.cs
  • src/Bws.Gui/HelpMenu.cs
  • src/Bws.Gui/ViewModels/ColumnLayout.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • src/Bws.Gui/KeptColumns.cs
  • src/Bws.Gui/MainWindow.Help.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
C# / .NET code.

⚙️ CodeRabbit configuration file

Files:

  • src/Bws.Gui/MainWindow.Keyboard.cs
  • src/Bws.Gui/Shortcuts.cs
  • src/Bws.Gui/MainWindow.Overview.cs
  • tests/Bws.Gui.Tests/RowMenuGuards.cs
  • src/Bws.Gui/ScopeBar.xaml.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/RowMenu.cs
  • src/Bws.Gui/ViewModels/Columns.cs
  • src/Bws.Gui/Release.cs
  • src/Bws.Gui/ScopeBar.xaml
  • src/Bws.Gui/MainWindow.Filters.cs
  • src/Bws.Gui/MainWindow.xaml.cs
  • src/Bws.Gui/Themes/PlanOffers.xaml
  • src/Bws.Gui/MainWindow.Suggesting.cs
  • src/Bws.Gui/ExternalLinks.cs
  • src/Bws.Gui/HelpMenu.cs
  • src/Bws.Gui/ViewModels/ColumnLayout.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • src/Bws.Gui/KeptColumns.cs
  • src/Bws.Gui/MainWindow.Help.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
Check that documentation matches the actual code in this PR: commands, flags, config keys, file paths, build steps and examples must exist.

⚙️ CodeRabbit configuration file

Files:

  • CHANGELOG.md
All code in this repository is written by an AI coding agent (Claude Code).

⚙️ CodeRabbit configuration file

Files:

  • src/Bws.Gui/MainWindow.Keyboard.cs
  • src/Bws.Gui/Shortcuts.cs
  • src/Bws.Gui/MainWindow.Overview.cs
  • tests/Bws.Gui.Tests/RowMenuGuards.cs
  • src/Bws.Gui/ScopeBar.xaml.cs
  • tests/Bws.Gui.Tests/ColumnGuards.cs
  • tests/Bws.Gui.Tests/ColumnLayoutGuards.cs
  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/RowMenu.cs
  • src/Bws.Gui/ViewModels/Columns.cs
  • src/Bws.Gui/Release.cs
  • src/Bws.Gui/ScopeBar.xaml
  • src/Bws.Gui/Resources/gui.en.json
  • src/Bws.Gui/MainWindow.Filters.cs
  • CHANGELOG.md
  • src/Bws.Gui/MainWindow.xaml.cs
  • src/Bws.Gui/Themes/PlanOffers.xaml
  • src/Bws.Gui/MainWindow.Suggesting.cs
  • src/Bws.Gui/ExternalLinks.cs
  • src/Bws.Gui/HelpMenu.cs
  • src/Bws.Gui/ViewModels/ColumnLayout.cs
  • tests/Bws.Gui.Tests/ExternalLinksGuards.cs
  • src/Bws.Gui/KeptColumns.cs
  • src/Bws.Gui/MainWindow.Help.cs
  • tests/Bws.Gui.Tests/HelpMenuGuards.cs
  • tests/Bws.Gui.Tests/FoldedFiltersGuards.cs
No hardcoded UI styling: Only if the PR adds or changes GUI code (XAML, Slint, Fyne, Tkinter, WPF code-behind): warn if new or changed UI code sets colors, fonts, font sizes, margins, paddings, sizes or corner radii as literal values on ind...

📄 CodeRabbit inference engine (Custom checks)

Files:

  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/ScopeBar.xaml
Source excerpt: **No view invents an appearance value of its own.**

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Files:

  • src/Bws.Gui/FilterRow.xaml
  • src/Bws.Gui/ScopeBar.xaml
Scope, duplication and docs: Warn if any of these is true: the PR contains significant changes not mentioned in the title/description, or mixes unrelated refactors with a feature or fix; the PR adds functionality, helpers, UI components, st...

📄 CodeRabbit inference engine (Custom checks)

Files:

  • CHANGELOG.md
🪛 LanguageTool
CHANGELOG.md

[grammar] ~49-~49: Use a hyphen to join words.
Context: ... - The "Also stop it" offer in a startup type plan is drawn in red, like "Force s...

(QB_NEW_EN_HYPHEN)

🔇 Additional comments (1)
src/Bws.Gui/Resources/gui.en.json (1)

374-374: 🎯 Functional Correctness

No additional language file ships with the GUI. The project embeds only gui.en.json, so the new keys do not require changes to another shipped language file.


📝 Walkthrough

Walkthrough

The GUI adds a Help menu and F1 shortcut, persists filter visibility, changes search-box focus and the default column order, and updates offer-button styling. The changelog and tests reflect these changes.

Changes

GUI updates

Layer / File(s) Summary
Help menu, links, and shortcuts
src/Bws.Gui/HelpMenu.cs, src/Bws.Gui/MainWindow.Help.cs, src/Bws.Gui/ExternalLinks.cs, src/Bws.Gui/Shortcuts.cs, src/Bws.Gui/Release.cs, src/Bws.Gui/ScopeBar.*, src/Bws.Gui/RowMenu.cs, src/Bws.Gui/Resources/gui.en.json, tests/Bws.Gui.Tests/HelpMenuGuards.cs, tests/Bws.Gui.Tests/ExternalLinksGuards.cs, tests/Bws.Gui.Tests/RowMenuGuards.cs, CHANGELOG.md
The Help menu provides shortcut actions, project and query-language links, and a copyable version value. F1 opens the menu. The copy-all row-menu entry displays Ctrl+C.
Persisted filter visibility
src/Bws.Gui/ViewModels/ColumnLayout.cs, src/Bws.Gui/KeptColumns.cs, src/Bws.Gui/MainWindow.Filters.cs, src/Bws.Gui/MainWindow.xaml.cs, src/Bws.Gui/FilterRow.xaml, tests/Bws.Gui.Tests/FoldedFiltersGuards.cs, tests/Bws.Gui.Tests/ColumnLayoutGuards.cs, tests/Bws.Architecture.Tests/DeadCodeGuards.cs
The version 5 layout stores whether filters are folded. The window loads that state and saves toggle changes. Tests cover defaults, serialization, and window behavior.
Search focus and screen presentation
src/Bws.Gui/MainWindow.Suggesting.cs, src/Bws.Gui/MainWindow.Overview.cs, src/Bws.Gui/ViewModels/Columns.cs, src/Bws.Gui/Themes/PlanOffers.xaml, tests/Bws.Gui.Tests/ColumnGuards.cs, CHANGELOG.md
The window focuses the search box on load and when the list returns from the overview. The Description column moves to the end of the initially visible columns. The offer button now inherits PlanForceButton styling.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  actor User
  participant MainWindow
  participant Shortcuts
  participant HelpMenu
  participant ExternalLinks
  User->>Shortcuts: Press F1
  Shortcuts->>MainWindow: Map key to Shortcut.Help
  MainWindow->>HelpMenu: Open Help menu
  User->>HelpMenu: Select a page
  HelpMenu->>MainWindow: Run page action
  MainWindow->>ExternalLinks: Open page asynchronously
Loading

Suggested labels: enhancement, ui

Merge Risk: ⚪ Minimal · up to b6795

The Help and saved-filter behaviors are consistent with their intended actions; the change is mergeable after normal checks.

🚥 Pre-merge checks | ✅ 9 | ❌ 5

❌ Failed checks (5 warnings)

Check name Status Explanation Resolution
No Obvious Performance Problems ⚠️ Warning The new filter toggle handlers run on the WPF UI thread and call KeptColumns.TheFiltersWere, which synchronously calls _file.Write. PreferencesFile.Write performs Directory.CreateDirectory, JS… Queue or debounce preference writes off the UI thread. Serialize queued snapshots so writes preserve the latest state, and marshal write errors back to the dispatcher before updating the status line. Keep the toggle handlers limited to upda…
Desktop Robustness ⚠️ Warning The Help menu adds two new page handovers that can outlive the window. HelpMenu calls OpenPage, which calls the new static ExternalLinks.Project and QueryLanguage ShellHandover instances. `S… Make the new page handovers window-scoped and lifetime-aware. Reject new requests after MainWindow.Closed, pass a cancellation or disposal signal into ShellHandover, cancel pending work during close, and suppress any completion that wou…
Clear User-Facing Text ⚠️ Warning The new Help page links can display a raw exception message. ExternalLinks.Page routes both new links through Open(..., Start, ...), while Start returns Win32Exception.Message directly. `MainW… Replace the direct failure.Message hand-off with a controlled, localized message such as “Windows could not open the page in a browser. Open this address manually: {1}.” If an error code is needed for support, show the code separately ins…
No Resource Leaks ⚠️ Warning The Help menu adds two new paths that call ShellHandover.Ask(): ExternalLinks.Project and ExternalLinks.QueryLanguage in src/Bws.Gui/ExternalLinks.cs. ShellHandover.OnItsOwnThread() creates … Add cancellation and shutdown handling to ShellHandover. On timeout or window close, cancel the handover, ensure the STA worker exits, and release any COM objects used by HandToDesktop in finally blocks. Apply this to the Project an…
Scope, Duplication And Docs ⚠️ Warning The PR is scoped and documents the user-facing changes in CHANGELOG.md, and the schema-5 preference change has an explicit fallback for older files. However, it adds duplicated version-reading funct… Centralize informational-version extraction in one shared helper that accepts the target Assembly, then have the CLI and GUI wrappers call it. Keep the GUI wrapper's nullable result and localized unknown-version handling, and keep each bi…
✅ Passed checks (9 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main user-facing changes: persisted folded filters, search-box focus, column reordering, and the new Help feature. It is specific, plain-language, and 85 characters lo…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Tests For Changed Behavior ✅ Passed PASS. The non-UI persistence changes are covered by the new FoldedFiltersGuards tests, including read/write state, schema-5 rendering, first-run behavior, and window toggle wiring. Help and external…
No Secrets Or Debug Leftovers ✅ Passed No explicit secret or debug-leftover condition was introduced. The authoritative diff adds no CLAUDE.md, CLAUDE.local.md, AGENTS.md, .claude/, or .env path. Added-line scans found no credentials, toke…
No Hardcoded Ui Styling ✅ Passed PASS: The PR changes WPF UI, but it does not add hardcoded styling. The new Donate spacing uses {StaticResource MarginBetweenControls}, and PlanOfferButton reuses `{StaticResource PlanForceButton}…
Safe File Parsing ✅ Passed No unsafe file-parsing behavior is introduced. The PR adds only a boolean filtersFolded to the existing JsonNode.Parse preference path and writes it through JsonObject/ToJsonString; `Preferenc…
System Changes Are Reversible ✅ Passed The check is not applicable. The diff adds GUI behavior, an app preference for folded filters, Help shortcuts, and visual styling. The new page links reuse the existing user-triggered browser handoff;…
Full details: No Obvious Performance Problems

Explanation

The new filter toggle handlers run on the WPF UI thread and call KeptColumns.TheFiltersWere, which synchronously calls _file.Write. PreferencesFile.Write performs Directory.CreateDirectory, JSON rendering, File.WriteAllText, and File.Move through AtomicFile.Write. This adds blocking disk I/O to every filter toggle, including profiles on slow or unavailable storage.

Resolution

Queue or debounce preference writes off the UI thread. Serialize queued snapshots so writes preserve the latest state, and marshal write errors back to the dispatcher before updating the status line. Keep the toggle handlers limited to updating in-memory state and scheduling the persistence operation.

Full details: Desktop Robustness

Explanation

The Help menu adds two new page handovers that can outlive the window. HelpMenu calls OpenPage, which calls the new static ExternalLinks.Project and QueryLanguage ShellHandover instances. ShellHandover starts an STA thread with IsBackground = true, and MainWindow.Closed stops refresh work but does not cancel or dispose these handovers. A slow shell call can therefore continue after the window closes. The page destinations are user-disclosed in the Help UI, and the handover has a timeout and double-execution guard, so those conditions do not fail this check.

Resolution

Make the new page handovers window-scoped and lifetime-aware. Reject new requests after MainWindow.Closed, pass a cancellation or disposal signal into ShellHandover, cancel pending work during close, and suppress any completion that would update the closed window. Ensure the shell operation itself cannot remain active after the window lifetime ends.

Full details: Clear User-Facing Text

Explanation

The new Help page links can display a raw exception message. ExternalLinks.Page routes both new links through Open(..., Start, ...), while Start returns Win32Exception.Message directly. MainWindow.OpenPage then sends that value to the user through gui.link.failed and the status line. The message identifies the failure and URL, but {0} can be an unprocessed exception message.

Resolution

Replace the direct failure.Message hand-off with a controlled, localized message such as “Windows could not open the page in a browser. Open this address manually: {1}.” If an error code is needed for support, show the code separately instead of the raw exception text.

Full details: No Resource Leaks

Explanation

The Help menu adds two new paths that call ShellHandover.Ask(): ExternalLinks.Project and ExternalLinks.QueryLanguage in src/Bws.Gui/ExternalLinks.cs. ShellHandover.OnItsOwnThread() creates a background STA Thread and Ask() only returns a slow result after Task.Delay; it never cancels or stops the worker. If HandToDesktop hangs, the thread and its incomplete task remain indefinitely. The PR therefore exposes this resource leak through both new page actions.

Resolution

Add cancellation and shutdown handling to ShellHandover. On timeout or window close, cancel the handover, ensure the STA worker exits, and release any COM objects used by HandToDesktop in finally blocks. Apply this to the Project and QueryLanguage handovers, and preserve the same cleanup for Supporting.

Full details: Scope, Duplication And Docs

Explanation

The PR is scoped and documents the user-facing changes in CHANGELOG.md, and the schema-5 preference change has an explicit fallback for older files. However, it adds duplicated version-reading functionality. src/Bws.Gui/Release.cs repeats the same informational-version lookup and +-suffix removal already implemented in src/Bws.Cli/Release.cs and similarly present in src/Bws.Core/CoreAssembly.cs. The GUI file explicitly describes itself as a copy of the CLI implementation. This duplication is introduced by the PR for the new Help version item.

Resolution

Centralize informational-version extraction in one shared helper that accepts the target Assembly, then have the CLI and GUI wrappers call it. Keep the GUI wrapper's nullable result and localized unknown-version handling, and keep each binary's own assembly as the input so the Help behavior remains unchanged.

✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
✨ Simplify code
  • Commit to this branch
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot added enhancement New feature or request ui labels Sep 24, 2026
The text key guard counts a key as said when it stands as a literal inside a
call that reads it, or as a named constant. Passing the failure key as a
parameter took both failure sentences out of its sight, and CI went red on
them. They are named constants now, and the guard sees them again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@donislawdev
donislawdev merged commit a4271d5 into main Sep 24, 2026
8 checks passed
@donislawdev
donislawdev deleted the feat/window-layout-focus-help branch September 24, 2026 17:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request ui

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant