From 5a2f21c7c1a06791e0e7e67f75d91bb9a34c283a Mon Sep 17 00:00:00 2001 From: DonislawDev Date: Fri, 25 Sep 2026 00:11:49 +0200 Subject: [PATCH] Make the way off the overview a blue button, set the entry's name apart in the plan, and trim the row and Help menus - "Show the list" on the machine overview wears the primary action style, so the first screen has one clear way to the list. - The plan panel draws the entry's name in semibold in its title and in every step. The sentence is still put together by the language file and cut where the name stands. The title and the steps keep their full text as their automation name, because a TextBlock built from runs reports an empty Text. - The row menu no longer offers "Copy display name" and "Copy description". Both values are still in "Copy everything". - The Help menu offers only the query language page. The shortcut items, the project's website and the version item are gone, with the code only they used. - The overview card's look moved into the Overview theme as a named style. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 13 +- src/Bws.Gui/ExternalLinks.cs | 18 +-- src/Bws.Gui/HelpMenu.cs | 76 +++------- src/Bws.Gui/MainWindow.Help.cs | 18 +-- src/Bws.Gui/OverviewView.xaml | 17 +-- src/Bws.Gui/PlanView.xaml | 15 +- src/Bws.Gui/Release.cs | 38 ----- src/Bws.Gui/Resources/gui.en.json | 17 +-- src/Bws.Gui/RowMenu.cs | 19 ++- src/Bws.Gui/Themes/Overview.xaml | 16 +++ src/Bws.Gui/Themes/PlanLines.xaml | 17 ++- src/Bws.Gui/Themes/Text.xaml | 24 +++- src/Bws.Gui/ViewModels/Catalogue.Samples.cs | 10 ++ src/Bws.Gui/ViewModels/Catalogue.Specimens.cs | 4 +- src/Bws.Gui/ViewModels/Copying.cs | 17 +-- src/Bws.Gui/ViewModels/NamedSentence.cs | 69 +++++++++ src/Bws.Gui/ViewModels/Planned.Title.cs | 21 ++- src/Bws.Gui/ViewModels/Planned.cs | 43 +++--- tests/Bws.Gui.Tests/ActionBarGuards.cs | 2 +- tests/Bws.Gui.Tests/ButtonGuards.cs | 27 ++++ tests/Bws.Gui.Tests/CopyingAndPanelGuards.cs | 7 +- tests/Bws.Gui.Tests/HelpMenuGuards.cs | 108 ++------------ tests/Bws.Gui.Tests/PlanNameGuards.cs | 132 ++++++++++++++++++ tests/Bws.Gui.Tests/PlanReportGuards.cs | 4 +- tests/Bws.Gui.Tests/PlanViewGuards.cs | 4 +- tests/Bws.Gui.Tests/PluralGuards.cs | 2 +- tests/Bws.Gui.Tests/RowMenuGuards.cs | 9 +- tests/Bws.Gui.Tests/SelectionGuards.cs | 50 +------ tests/Bws.Gui.Tests/WindowGuards.cs | 2 - tests/Bws.Gui.Tests/WpfHost.cs | 8 ++ 30 files changed, 445 insertions(+), 362 deletions(-) delete mode 100644 src/Bws.Gui/Release.cs create mode 100644 src/Bws.Gui/ViewModels/NamedSentence.cs create mode 100644 tests/Bws.Gui.Tests/PlanNameGuards.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 43807ee..cb29594 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,9 +25,8 @@ is not part of this repository. restart of the machine. - The JSON of a plan carries `delayedAuto` next to `startType`, the same way `bws list --json` does, and `alsoStop` for a plan that also stops. -- A Help button in the top right corner, also opened with F1. It lists the keyboard shortcuts - - each item does what its key does - opens the query language page and the project's website in - your browser, and shows the version of the program, which you can copy. +- A Help button in the top right corner, also opened with F1. It opens the query language page + on the project's website in your browser. - After the list is exported, the foot of the window says how many entries went into which file. The sentence goes away as soon as you change the search. - "Set startup type" in the row menu, with the same four settings as the action bar. @@ -72,6 +71,14 @@ is not part of this repository. both, and rows narrow each other. The row labels no longer repeat the same tooltip. - The row menu names its actions the way the action bar does: "Stop...", "Start...", "Restart...", "Force stop..." and "Force restart...". Each still opens a plan first. +- "Show the list" on the machine overview is a blue button, so it is easy to find the first time + the window opens. +- In the plan panel, the name of the entry stands out in bold in the title and in every step. + +### Removed + +- "Copy display name" and "Copy description" from the row menu. Both are still copied by "Copy + everything". ### Fixed diff --git a/src/Bws.Gui/ExternalLinks.cs b/src/Bws.Gui/ExternalLinks.cs index 41aa6c4..e14c653 100644 --- a/src/Bws.Gui/ExternalLinks.cs +++ b/src/Bws.Gui/ExternalLinks.cs @@ -11,9 +11,9 @@ namespace Bws.Gui; /// -/// The addresses this window hands to a browser, and the two ways it hands them over. One until -/// 2026-09-24 - the support page - and three since the help menu (UX-GUI-014) offered the project's -/// website and its query language page. +/// The addresses this window hands to a browser, and the two ways it hands them over: the support +/// page and the query language page. The help menu (UX-GUI-014) offered the project's website as a +/// third for one day, 2026-09-24. /// /// THE SECOND FILE IN THIS WINDOW ALLOWED TO START SOMETHING, and that is the owner's decision /// of 2026-09-23 rather than an arrangement of mine. was the only one @@ -88,9 +88,6 @@ internal static class ExternalLinks /// internal static Task OpenSupportAsync() => Supporting.Ask(); - /// The project's website, from the help menu - UX-GUI-014, 2026-09-24. - internal const string ProjectPage = "https://betterwindowsservices.donislawdev.com/"; - /// /// The page describing the query language, from the help menu. The same address the README /// gives, so a person who found it there finds the same page here. @@ -98,19 +95,14 @@ internal static class ExternalLinks internal const string QueryLanguagePage = "https://betterwindowsservices.donislawdev.com/query-language/"; /// - /// The two pages the help menu offers, each with a hand-over of its own for the reason + /// The page the help menu offers, with a hand-over of its own for the reason /// has one: a second press while the shell still has the first joins /// it rather than starting another. THE SAME TWO WAYS AS THE SUPPORT PAGE AND NO THIRD - an /// elevated window hands the address to the desktop, and this adds no call into the shell. + /// The project's website had one beside it until 2026-09-24, when it left the menu. /// - private static readonly ShellHandover Project = Page(ProjectPage); - - /// private static readonly ShellHandover QueryLanguage = Page(QueryLanguagePage); - /// Hands the project's website to a browser, or says why it did not. - internal static Task OpenProjectPageAsync() => Project.Ask(); - /// Hands the query language page to a browser, or says why it did not. internal static Task OpenQueryLanguagePageAsync() => QueryLanguage.Ask(); diff --git a/src/Bws.Gui/HelpMenu.cs b/src/Bws.Gui/HelpMenu.cs index 32f56af..be3e9fc 100644 --- a/src/Bws.Gui/HelpMenu.cs +++ b/src/Bws.Gui/HelpMenu.cs @@ -1,72 +1,34 @@ namespace Bws.Gui; /// -/// What the Help button offers: the keyboard shortcuts, the two pages on the project's website, and -/// the version of this program. UX-GUI-014 with the shortcut half of UX-GUI-010, owner's decision -/// 2026-09-24 - until that day the window named Ctrl+F, Ctrl+C and Ctrl+A nowhere and said its own -/// version nowhere. +/// What the Help button offers: the query language page on the project's website, and nothing +/// else since 2026-09-24 - owner's decision. /// -/// A LIST OF DATA BUILT BY , NOT A SECOND MENU WRITTEN OUT - GUI -/// rules 2 and 8. An item here has exactly the shape of an item on a row: words, a key written -/// beside them, and what a press does. So it is the row menu's entry and the row menu's item style, -/// and the name "row" on them is the one place this reuse shows. +/// IT HELD NINE ITEMS FOR ONE DAY. UX-GUI-014 built it earlier the same day with the six +/// keyboard shortcuts, the project's website and the version of this program, and the owner cut it +/// to this one. The price is said rather than left for somebody to find: F5, Ctrl+F, +/// Ctrl+A and Esc are named in no text of the window again (the half of UX-GUI-010 this menu had +/// answered), and the window no longer says its own version - `bws --version` does. Ctrl+C and +/// Enter are still written beside their items in the row menu. +/// +/// STILL A MENU WITH ONE ITEM RATHER THAN A BUTTON THAT OPENS THE PAGE - owner's choice +/// between the two. A press on "Help" that leaves the program for a browser with nothing in between +/// would be a surprise, and a menu can take a second item back without the button changing what +/// it does. /// -/// EVERY SHORTCUT ITEM DOES WHAT IT NAMES, through the same the key -/// goes through. A menu that described the keys while a second road carried them out would be -/// two answers to one question, which this window was caught by on 2026-09-02. The one exception is -/// Ctrl+A, which is the grid's own key rather than one of ours, and the item asks the grid for the -/// same thing. +/// A LIST OF DATA BUILT BY , NOT A SECOND MENU WRITTEN OUT - GUI +/// rules 2 and 8, and the item is the row menu's entry for that reason. /// -/// The two pages go out through and nothing else, exactly as -/// Donate does - an elevated window hands the address to the desktop, and this program still -/// connects to nothing (`ADR-19`). +/// The page goes out through and nothing else, exactly as Donate +/// does - an elevated window hands the address to the desktop, and this program still connects to +/// nothing (`ADR-19`). /// internal static class HelpMenu { internal static IReadOnlyList> GroupsFor(MainWindow window) => [ [ - new RowMenuEntry("gui.help.find", "gui.help.find.gesture", () => Pressed(window, Shortcut.FocusQuery)), - new RowMenuEntry("gui.help.refresh", "gui.help.refresh.gesture", () => Pressed(window, Shortcut.Refresh)), - new RowMenuEntry("gui.help.details", "gui.menu.details.gesture", () => Pressed(window, Shortcut.OpenDetails)), - new RowMenuEntry("gui.help.copy", "gui.menu.copyAll.gesture", () => Pressed(window, Shortcut.CopyRow)), - new RowMenuEntry("gui.help.selectAll", "gui.help.selectAll.gesture", () => Task.FromResult(window.SelectEverything())), - new RowMenuEntry("gui.help.back", "gui.help.back.gesture", () => Pressed(window, Shortcut.Back)) - ], - [ - new RowMenuEntry("gui.help.queryLanguage", null, () => window.OpenPage(ExternalLinks.OpenQueryLanguagePageAsync)), - new RowMenuEntry("gui.help.projectPage", null, () => window.OpenPage(ExternalLinks.OpenProjectPageAsync)) - ], - [ - new RowMenuEntry("gui.help.version", null, () => Copied(window), () => VersionNumber) + new RowMenuEntry("gui.help.queryLanguage", null, () => window.OpenPage(ExternalLinks.OpenQueryLanguagePageAsync)) ] ]; - - /// - /// What the version item says and copies: the stamped number, or words saying there is none - - /// rule 8 of CLAUDE.md applied to one number rather than a guess that looks like one. - /// - internal static string VersionNumber => Release.Number ?? Texts.Of("gui.help.versionUnknown"); - - /// - /// A press of the key the item names. The work the key starts travels with it, so an item - /// that reads the machine again is awaited as the key's own press is. - /// - private static Task Pressed(MainWindow window, Shortcut shortcut) - { - window.Act(shortcut, out var work); - - return work; - } - - /// - /// The version on the clipboard, for somebody reporting a fault. A refusal from the clipboard is - /// said in the status line by , as it is for a copied row. - /// - private static Task Copied(MainWindow window) - { - window.Put(VersionNumber); - - return Task.CompletedTask; - } } diff --git a/src/Bws.Gui/MainWindow.Help.cs b/src/Bws.Gui/MainWindow.Help.cs index f834d73..c58a53c 100644 --- a/src/Bws.Gui/MainWindow.Help.cs +++ b/src/Bws.Gui/MainWindow.Help.cs @@ -3,8 +3,8 @@ namespace Bws.Gui; /// -/// The window's half of the Help button: the menu under it, F1, and the two things the menu does -/// that are not a key press already - UX-GUI-014, owner's decision 2026-09-24. +/// The window's half of the Help button: the menu under it, F1, and opening the page the menu +/// offers - UX-GUI-014, owner's decision 2026-09-24. /// /// A partial of its own because the constructor is at the analyser's length, the reason /// MainWindow.Overview.cs gives for the same shape: one line there, and the wiring here. What the @@ -15,8 +15,7 @@ public partial class MainWindow /// /// Hangs the help menu under its button. Called once, from the constructor. /// - /// Built with the row menu's builder and the row menu's item style, which is what makes - /// the key beside each shortcut appear - the style binds InputGestureText, and HelpMenu says why + /// Built with the row menu's builder and the row menu's item style, and HelpMenu says why /// the entry is the row's. /// private void IntroduceTheHelp() @@ -31,17 +30,6 @@ private void IntroduceTheHelp() /// internal bool OpenHelp() => ButtonMenu.OpenUnder(Scope.Help); - /// - /// Picks every entry in the list - what Ctrl+A does in the grid, asked of the grid rather than - /// done a second way, so the menu item and the key are the same act. - /// - internal bool SelectEverything() - { - Entries.SelectAll(); - - return true; - } - /// /// Hands one of the project's pages to a browser through , and says /// in the status line why it did not when it did not - the same shape as the Donate button. diff --git a/src/Bws.Gui/OverviewView.xaml b/src/Bws.Gui/OverviewView.xaml index f3b66c6..69e3bf6 100644 --- a/src/Bws.Gui/OverviewView.xaml +++ b/src/Bws.Gui/OverviewView.xaml @@ -109,12 +109,7 @@ ending at three heights read as a mistake rather than as three independent things. A row of equal cards is a row, a ragged one is a pile. --> - +