Repository navigation
Stage J8: DialogService, dialogs in Dialogs/, and a dialog redesign - #117
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DialogService now sets the XamlRoot, theme and DefaultContentDialogStyle and queues dialogs so only one is open at a time; a dialog closed while still queued (progress dialogs) is skipped. It builds the common message, confirmation, dangerous confirmation, error and text-input dialogs; the window's ShowMessageAsync, ShowConfirmAsync and PromptForTextAsync forward to it, and all 39 dialogs are shown by it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Control styles (text, status badges, buttons, the shortcut input) go to Styles/Controls.xaml and the page surfaces shared by several pages (card, page header, inset) to Styles/Pages.xaml; colours stay in Themes/Tokens.xaml. Styles only the window's own XAML uses (command surface, detail pane, sticky action, metric card and value, list views) move into its RootGrid resources. Five styles nothing used are removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pure move, same texts and behaviour: restarting a restored download, download options, an existing online installation, install conflicts, reading the existing file (Shortcuts overlay), menu-state variables, Mod updates available, what's new, and the Mod details pane shown as a dialog. Each is a class in Dialogs/ that gets the data and returns the answer; the window keeps what happens with it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pure move, same texts and behaviour: broken Mod links, restoring a state slot or a user.ini snapshot (with the shared "apply while running" option), importing a shared preset, restoring a combination preset (its row texts, the choice enum and the preview row record move with it) and installing a combination bundle. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pure move, same texts and behaviour: organized import (destination, preview, progress, undo, interrupted imports), local tags, character avatar binding, the overlay's single-Mod preset, batch Mod actions, the character region, update and replace, the download file picker, the download location, the category mapping, authors and saved Mods, batch downloads (reading and review) and the Endfield launch settings (J4 left it in the window). Each class gets its data, and a small Host record of window actions where the dialog itself triggers them; the window keeps what is saved and run afterwards. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Confirmation and name dialogs say what their main button does (Delete, Remove, Replace, Restore, Create, Rename, Save, Export, Install...) instead of OK or Confirm; the avatar binding says Bind. Delete, remove and overwrite confirmations (14: Mods, presets, state slots, repositories, external folders, tracking records, broken links, undo of a deployment or an import, writing Mod defaults, restoring a backup, replacing a Mod with its update) get a filled button in a fixed red that never follows the accent colour, and Cancel is the default button, so Enter and Esc cancel. The workspace's "Remove from target" uses the same red; "Deploy" keeps the accent. Other confirmations make their action the default. Text dialogs scroll after 400 px. New strings in zh-CN, en-US and ru-RU; Dialogs.Confirm is no longer used and removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previews before restoring a combination preset, installing a bundle and an organized import list their items in groups headed with a count: added, removed, kept and skipped (empty groups are left out), with the action under each item and its path as a tooltip, instead of one flat list. The import preview's list scrolls inside the dialog. New group headings in zh-CN, en-US and ru-RU. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Endfield launch settings group launch method, game and loader, and checks into cards like Windows Settings (DialogLayout.Section), with hints in the secondary text style; a launch profile that cannot be saved is reported beside the launch settings as well as in the result area. Validation messages of the tags, batch Mod actions and single-Mod preset dialogs, and a library folder that does not exist in the organized import, show in the critical colour right under their field. The organized import (3 dialogs) and batch downloads (2) show which step the dialog is, and their running steps show a progress bar. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An error notification of a failed action and the error dialogs of online actions now offer "View details": the exception type and code, its message and stack, and the path of app-errors.log, read-only and with a copy button for a report. The notification keeps its short message; the status service carries the failure along. New strings in zh-CN, en-US and ru-RU. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Results are grouped under Pages, Characters, Mods and Commands headings, each keeping the search ranking; the headings are not selectable and the arrow keys skip them. The panel casts the system ThemeShadow onto a transparent layer over the dimmed window (outside a popup a ThemeShadow needs such a receiver). New headings in zh-CN, en-US and ru-RU. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 1000 px and other widths below the compact navigation threshold the search box gives way to a search icon button with the same name and tooltip, which opens the command palette; turning the search off in Settings hides both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The queue behind DialogService moves to Core (DialogQueue) with unit tests: a second dialog waits until the first closes, one closed before its turn is skipped, and a dialog that fails to open does not block the next. A dangerous dialog also moves the keyboard focus to Cancel when it opens. UI test: deleting a combination preset opens with Cancel focused, and Esc or Enter close the dialog with the preset kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…etails The screenshots showed two things. ContentDialog draws its default button in the accent colour, so with Cancel as the default and a red system accent, Cancel looked like the red Delete button beside it. Dangerous dialogs now have no default button; Cancel takes the keyboard focus just after the dialog opens, so Enter and Esc both cancel. And the error details showed only their first line in a read-only TextBox; they are now selectable wrapped text that scrolls after 200 px. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The user saw step 2 (the path settings) open outside the window. The tip opened in the same pass that started scrolling its target into view, so it was placed against where the path settings had been, and Auto placement put it beside the full-width card, past the window's left edge. Now the page scrolls the target into view without animation, leaving at least a tip's height above it, the layout is brought up to date, and only then is the tip placed and opened. TipPlacementPolicy (Core, unit tested) opens it below the target when the whole target and the tip fit, above it when its top edge is visible (so the tall opened path settings are pointed at from above), and otherwise in the middle of the page pointing at nothing; never beside it. The tip is constrained to the window. UI tests: each step's text and buttons lie inside the window and step 2 sits next to the path settings, in zh-CN, en-US and ru-RU at 1000x800 (path settings folded and opened), in ru-RU at 1400x900 and maximized, and after real first installs (a game chosen or "later") at 1000x800, maximized and 1400x900. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A page switch ran ApplyLanguage, every page's refresh and a settings save before the new selection could render: 50-105 ms between the click and the selection on every switch. Now the page and the navigation selection change at once and the refreshes run right after that frame (a newer switch replaces a refresh that has not run yet, keeping a pending list refresh). The entrance animation starts mostly visible and is shorter: from 70 % opacity and 6 px over 110/130 ms instead of 25 %, 12 px and 170/210 ms; reduce motion still turns it off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 10, 2026
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.
Summary
Stage J8, done in one pass with design work (
docs/development/UI-Structure-Plan.md, J8;docs/development/UI-Fluent-Design-Plan.md, "对话框(J8)"). Before this there were 39 places that built aContentDialog, in 29 files. The inventory is in the plan.Structure (no change in behaviour or text)
ba0fd46:DialogService.52ba67e,DialogQueueTests).d80d38b:App.xamlsplit.Themes/Tokens.xaml; control styles go toStyles/Controls.xaml, shared page surfaces toStyles/Pages.xaml.Dialogs/:39c5cec9 short confirmations,32acfcf8 previews before a change,9eecc1c16 forms and multi-step flows, including the 363-line Endfield settings.Design (before → after)
c2e318d): 21 confirmations said "确定/Confirm" and 10 name prompts said "OK" → each main button names its action (Delete, Replace, Restore, Rename, Save, Install…).c2e318d,894c5a9):5d128e3): restoring a preset, installing a bundle and the organized import showed one flat list → groups with counts (will add / will remove / kept / skipped).7c9c212):e16d7ae,894c5a9): error notifications and error dialogs get "View details" (exception type and code, message, stack and log path) with a copy button.a10bc83): headings for pages, characters, Mods and commands, plus a shadow.dfb35db): below 1120 px wide the search box becomes an icon button that opens the palette.InfoBarorTeachingTip(Fluent plan item 4).Fixes from the maintainer's try of the package
e938a7a: step 2 of the getting-started tips opened outside the window. It opened while the page was still scrolling to the path settings and was placed beside that full-width card.TipPlacementPolicyTests) opens it below its target, else above, else in the middle of the page, never to the side, and keeps it inside the window.16d4c56: selection felt laggy. Every page switch re-applied all interface text, refreshed every page and saved settings before the new selection could show. The page and its selection now show first and the rest runs right after. The page-entrance animation is lighter (70% start opacity, 6 px, 110/130 ms); "Reduce motion" still turns it off.Median from a real mouse click until the selection shows:
A delayed settings save was tried and dropped because it made no measurable difference.
df0f391: a test that a setting changed just before closing is still there after a restart.MainWindowpartial files: 21,406 → 20,073 lines.Test plan
scripts\test-all.ps1: 1,753 Core tests, Release build 0 warnings, Core coverage 94.0% line / 88.3% branch-Application). New tests:DangerConfirm_CancelIsTheDefaultAndEscDoesNothing.🤖 Generated with Claude Code