Complete UI/UX & performance overhaul — cocoa brown theme (v2.1.0)#45
Merged
Conversation
UI/UX: - New Themes/CocoaTheme.xaml: single source of truth for the palette, control styles, and vector icon geometries. All four windows (Main, Editor, Settings, History) now share consistent, professional chrome with a custom title bar and proper caption buttons. - Emoji glyphs replaced with hand-drawn vector Path icons everywhere. - Region selector gains snipping-tool UX: dimmed surround, caramel selection outline, live W x H size badge, and an instruction hint. - Editor: zoom percentage indicator, keyboard tool shortcuts now move the active-tool highlight, themed text-label dialog with Enter/Esc. - Settings: capture-history controls (toggle, retention, clear, open folder) and a View Logs button (Opus-Speaks C & D). Fixed the default file format combo silently never saving. - About dialog reads the real assembly version instead of a hard-coded string. Performance: - All windows migrated off AllowsTransparency to WindowChrome (Opus-Speaks B). Layered windows forced software composition of the entire surface - the region selector paid this across every monitor on each capture. - Removed every DropShadowEffect/BlurEffect (per-element software rendering). - Pixelate tool no longer renders the full screenshot into a RenderTargetBitmap (~33 MB at 4K) with a CroppedBitmap per block; it now copies just the covered region once and block-averages in a single buffer. - Frozen shared brushes for selection chrome; HighQuality bitmap scaling on the editor image to kill zoom-out shimmer artifacts. Verified by rendering Editor/Settings/History windows through an offscreen harness; service tests still pass (95/95). Version bumped to 2.1.0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Security: - Auto-updater now targets the repository current name (Daolyap/Money-Shot). The old name only redirects until someone re-registers it, at which point they would own the update channel (repojacking). - Optional GitHub token properly wired to MONEYSHOT_GITHUB_TOKEN (the 401 guidance already referenced it; the read was a disabled empty-string stub). - SaveService system-directory check compares with a trailing separator so C:\Windows blocks C:\Windows\... but not C:\WindowsBackup siblings. - HistoryRetentionCount clamped to 0-500 during settings sanitization. Bugs: - Second app instance crashed on exit: OnExit called ReleaseMutex on the single-instance mutex it never owned (ApplicationException). - Hotkey actions that throw no longer propagate out of the WndProc hook (process-fatal); they are caught and logged. Registration failures (combination owned by another app) are now logged instead of silent. - Editor Save dialog now honours the configured default save folder and file format; previously both settings were ignored. - IsPointInElement used hand-rolled NaN guards instead of CanvasPosition (forbidden by the resize/drag design rules). Improvements: - MemoryTrimmer service shared by both editor-close paths; opening a capture from History now gets the same working-set trim as the capture flow (previously left ~hundreds of MB resident). - JPEG saves use QualityLevel 90 (default 75 smears screenshot text). - Logger includes full exception + stack trace at Error level. - Dead SetupToolbar() removed; App.xaml.cs unused usings dropped. - 14 new regression tests (SaveService path validation, retention clamp); 109/109 passing. Audit follow-ups recorded in Opus-Speaks.md: region-selector DPI accuracy at >100% scaling (E2), auto-update vs per-machine installs (E3). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Security & code audit — repojacking fix, crash fix, hardening
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
Full visual and performance overhaul of every window, as requested.
UI/UX
Themes/CocoaTheme.xaml— single source of truth: cocoa-brown palette (espresso surfaces + caramel accent), all control styles, and hand-drawn vector icon geometries. Replaces four copies of the per-window "glassmorphism" styles.W × Hsize badge, and an instruction hint.SelectedItemasstringwhen items areComboBoxItems).Performance
AllowsTransparencytoWindowChrome(Opus-Speaks section B). Layered windows are composed in software for the entire surface — this was the single biggest source of editor lag, and the region selector paid it across every monitor on every capture.DropShadowEffect/BlurEffect(incl. a strayBlurEffect Radius=0) — WPF bitmap effects force per-element software rendering.RenderTargetBitmap(~33 MB at 4K) and allocated aCroppedBitmapper 10-px block. Now copies only the covered region once and block-averages in a single buffer. Faster and a large RAM saving.HighQualitybitmap scaling on the editor image to remove zoom-out shimmer artifacts.Verification
dotnet buildclean,dotnet test95/95 passing.Notes
RegionSelectormaps mouse DIPs to bitmap pixels 1:1, which is only correct at 100 % display scaling — the app manifest declares PerMonitorV2.🤖 Generated with Claude Code