Feature/screenshot beautifier#102
Merged
Merged
Conversation
Wraps a captured screenshot in a gradient or solid-color background with configurable padding, rounded corners, and drop shadow — producing share-ready images without leaving the app. - BeautifyBackground enum + BeautifyPresets gradient/solid brush registry - BeautifierRenderService: off-screen WPF visual tree → RenderTargetBitmap - BeautifierViewModel: ObservableObject with all controls + Export/Copy commands - BeautifierWindow: two-panel UI (live Viewbox preview + sidebar controls) - Beautify button wired into OverlayWindow action bar (full + compact) - Window lifecycle follows existing pending-window pattern (same as Pin)
|
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Pull request overview
This PR introduces a “Screenshot Beautifier” workflow and expands the capture/recording infrastructure (selection UI, recording pipeline, update download UI, telemetry, and supporting services), alongside a version bump.
Changes:
- Add a new Beautifier window + view model and wire it into the main overlay via a new Beautify action.
- Add/extend capture + recording infrastructure (selection session windows, screen capture/bitmap composition, recording services and helpers).
- Add/update supporting app services (telemetry, dialogs/message boxes, update download UI/service) and adjust tests/DI wiring.
Reviewed changes
Copilot reviewed 52 out of 126 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| version.json | Bump app version to 6.1. |
| Pointframe/Views/UpdateDownloadWindow.xaml.cs | New update download window code-behind (close on VM request). |
| Pointframe/Views/UpdateDownloadWindow.xaml | New update download progress UI. |
| Pointframe/Views/SettingsWindow.xaml.cs | Remove now-unneeded models using (global using). |
| Pointframe/Views/SelectionMonitorWindow.cs | New per-monitor selection UI for region snip. |
| Pointframe/Views/SelectionBackdropWindow.cs | New dimmed snapshot backdrop window for selection. |
| Pointframe/Views/RecordingOverlayWindow.xaml.cs | Recording overlay code-behind adjustments (namespace/usings). |
| Pointframe/Views/RecordingOverlayWindow.xaml | New/updated recording overlay UI with HUD and tool panel. |
| Pointframe/Views/PinnedScreenshotWindow.xaml.cs | New pinned screenshot window (custom resize/drag). |
| Pointframe/Views/PinnedScreenshotWindow.xaml | New pinned screenshot window UI. |
| Pointframe/Views/OverlayWindow.xaml.cs | Wire Beautify flow + factory into overlay lifetime. |
| Pointframe/Views/OverlayWindow.xaml | Add Beautify buttons to full + compact action bars. |
| Pointframe/Views/OverlayWindow.Selection.cs | Add helper for converting overlay rects to screen pixel bounds. |
| Pointframe/Views/OverlayWindow.RecordingHud.cs | New partial with recording HUD helpers/handlers (currently stubs). |
| Pointframe/Views/OverlayWindow.RecordingAnnotation.cs | Remove now-unneeded models using (global using). |
| Pointframe/Views/OverlayWindow.Recording.cs | Remove now-unneeded models using (global using). |
| Pointframe/Views/OverlayWindow.Layout.cs | New overlay layout/session hosting logic (opened image + backdrop + toolbar layout). |
| Pointframe/Views/OverlayWindow.ColorPicker.cs | Add loupe rendering + toolbar sync helpers for color picker. |
| Pointframe/Views/OverlayToolbarLayoutHelper.cs | New helper to compute tool/action bar placement. |
| Pointframe/Views/CountdownWindow.xaml.cs | New countdown window code-behind for delayed capture. |
| Pointframe/Views/CountdownWindow.xaml | New countdown window UI. |
| Pointframe/Views/BeautifierWindow.xaml.cs | New beautifier window code-behind + enum converter. |
| Pointframe/Views/BeautifierWindow.xaml | New beautifier UI (preview + presets + sliders + export/copy). |
| Pointframe/Views/AboutWindow.xaml.cs | New About window code-behind. |
| Pointframe/Views/AboutWindow.xaml | New About window UI. |
| Pointframe/ViewModels/SettingsViewModel.cs | Remove now-unneeded models using (global using). |
| Pointframe/ViewModels/OverlayViewModel.cs | Add Beautify command + event. |
| Pointframe/ViewModels/BeautifierViewModel.cs | New beautifier VM (render/export/copy + settings/telemetry). |
| Pointframe/ViewModels/AnnotationViewModel.cs | Remove now-unneeded models using (global using). |
| Pointframe/ViewModels/AnnotationStylePresetViewModel.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Update/UpdateDownloadWindowService.cs | New service to show download window and coordinate download lifecycle. |
| Pointframe/Services/Update/IUpdateService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Update/IUpdateDownloadService.cs | New interface for update download UI flow. |
| Pointframe/Services/Update/IAutoUpdateService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Update/GitHubUpdateService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Update/AutoUpdateService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Recording/VideoWriterFactory.cs | New factory for creating ffmpeg writer. |
| Pointframe/Services/Recording/ScreenRecordingService.cs | New screen recording capture/encode pipeline. |
| Pointframe/Services/Recording/RecordingOverlayNativeInterop.cs | New interop helpers for overlay transparency/window ops. |
| Pointframe/Services/Recording/RecordingMousePassthroughCoordinator.cs | New coordinator for mouse passthrough while recording. |
| Pointframe/Services/Recording/RecordingHudCoordinator.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Recording/RecordingCursorEffectsService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Recording/RecordingAnnotationSurfaceCoordinator.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Recording/IVideoWriterFactory.cs | New writer factory interface. |
| Pointframe/Services/Recording/IVideoWriter.cs | New writer abstraction. |
| Pointframe/Services/Recording/IScreenRecordingService.cs | New screen recording service abstraction. |
| Pointframe/Services/Recording/IGifExportService.cs | New gif export service interface. |
| Pointframe/Services/Recording/GifExportService.cs | New ffmpeg-based GIF export implementation. |
| Pointframe/Services/Recording/FFMpegVideoWriter.cs | Minor formatting change. |
| Pointframe/Services/Recording/FfmpegResolver.cs | New ffmpeg resolver utility. |
| Pointframe/Services/Recording/BeautifyPresets.cs | New preset background brush provider for beautifier. |
| Pointframe/Services/Recording/BeautifierRenderService.cs | New render-to-bitmap service for beautifier output. |
| Pointframe/Services/Messaging/UpdateAvailableMessage.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/WindowsOcrService.cs | New Windows OCR implementation. |
| Pointframe/Services/Infrastructure/UserSettingsService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/TrayIconManager.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/ThemeService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/TelemetryService.cs | New telemetry service (Azure Monitor OpenTelemetry exporter). |
| Pointframe/Services/Infrastructure/TelemetryHeartbeatService.cs | New background heartbeat telemetry service. |
| Pointframe/Services/Infrastructure/ProcessService.cs | New process-start abstraction. |
| Pointframe/Services/Infrastructure/MouseHookService.cs | New low-level mouse hook implementation. |
| Pointframe/Services/Infrastructure/MicrophoneDeviceService.cs | New microphone device enumeration/mute control service. |
| Pointframe/Services/Infrastructure/MessageBoxService.cs | New message box abstraction (WPF + native fallback). |
| Pointframe/Services/Infrastructure/IUserSettingsService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/ITrayIconManager.cs | New tray icon manager interface (currently has a namespace/type reference issue). |
| Pointframe/Services/Infrastructure/IThemeService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/ITelemetryService.cs | New telemetry interface. |
| Pointframe/Services/Infrastructure/IProcessService.cs | New process service interface. |
| Pointframe/Services/Infrastructure/IOcrService.cs | New OCR interface. |
| Pointframe/Services/Infrastructure/IMouseHookService.cs | New mouse hook interface + event args. |
| Pointframe/Services/Infrastructure/IMicrophoneDeviceService.cs | New microphone device service interface. |
| Pointframe/Services/Infrastructure/IMessageBoxService.cs | New message box service interface. |
| Pointframe/Services/Infrastructure/IGlobalHotkeyService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/IFileSystemService.cs | New file system abstraction. |
| Pointframe/Services/Infrastructure/IDialogService.cs | New dialog abstraction. |
| Pointframe/Services/Infrastructure/IAppVersionService.cs | New app version service interface. |
| Pointframe/Services/Infrastructure/IAppErrorHandler.cs | New app error handler interface. |
| Pointframe/Services/Infrastructure/GlobalHotkeyService.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Infrastructure/FileSystemService.cs | New file system service implementation. |
| Pointframe/Services/Infrastructure/DialogService.cs | New dialog service (OpenFile/Folder/Color). |
| Pointframe/Services/Infrastructure/AppVersionService.cs | New app version provider. |
| Pointframe/Services/Infrastructure/AppPaths.cs | New app path constants (logs/local app data). |
| Pointframe/Services/Infrastructure/AppErrorHandler.cs | New global error handling + recovery behavior. |
| Pointframe/Services/Capture/SelectionSession.cs | New selection session orchestration (per-monitor + whole screen). |
| Pointframe/Services/Capture/ScreenCaptureService.cs | New GDI-based screen capture service. |
| Pointframe/Services/Capture/OverlayBitmapCapture.cs | New overlay bitmap compositor (screen + annotations). |
| Pointframe/Services/Capture/OpenedImageBitmapCapture.cs | New opened-image bitmap compositor. |
| Pointframe/Services/Capture/IScreenCaptureService.cs | New screen capture interface. |
| Pointframe/Services/Capture/IOverlayBitmapCapture.cs | New overlay bitmap capture interface. |
| Pointframe/Services/Capture/ImageFileService.cs | New image file loader + validation. |
| Pointframe/Services/Capture/IImageFileService.cs | New image file service interface. |
| Pointframe/Services/Capture/IClipboardService.cs | New clipboard abstraction. |
| Pointframe/Services/Capture/ICaptureLaunchService.cs | New capture launch interface. |
| Pointframe/Services/Capture/ClipboardService.cs | New clipboard service implementation. |
| Pointframe/Services/Capture/CaptureLaunchService.cs | New service to launch snips/records with optional countdown. |
| Pointframe/Services/Annotation/IAnnotationGeometryService.cs | New annotation geometry service interface. |
| Pointframe/Services/Annotation/Handlers/TextShapeHandler.cs | New text tool handler. |
| Pointframe/Services/Annotation/Handlers/RectShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/PixelRulerShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/PenShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/NumberShapeHandler.cs | New number tool handler. |
| Pointframe/Services/Annotation/Handlers/LineShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/IAnnotationShapeHandler.cs | New shape handler interface. |
| Pointframe/Services/Annotation/Handlers/HighlightShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/EllipseShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/ColorPickerShapeHandler.cs | New no-op handler for color picker tool. |
| Pointframe/Services/Annotation/Handlers/CalloutShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/BlurShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/Handlers/ArrowShapeHandler.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/AnnotationGeometryService.cs | New geometry calculations for shapes/arrowheads. |
| Pointframe/Services/Annotation/AnnotationCanvasRenderer.cs | Remove now-unneeded models using (global using). |
| Pointframe/Services/Annotation/AnnotationCanvasInteractionController.cs | New interaction controller (drawing, text/number, color picker). |
| Pointframe/Native/NativeMethods.cs | New Win32 keyboard hook constants/interop. |
| Pointframe/Native/MonitorDpiHelper.cs | New monitor DPI helpers. |
| Pointframe/Native/DpiAwarenessScope.cs | New DPI awareness scope helper. |
| Pointframe/Models/SelectionSessionResult.cs | Move selection session types to Pointframe.Models. |
| Pointframe/Models/SelectionSessionMode.cs | Move selection session enum to Pointframe.Models. |
| Pointframe/Models/BeautifyBackground.cs | New background preset enum for beautifier. |
| Pointframe/Models/AnnotationTool.cs | Move annotation tool enum to Pointframe.Models. |
| Pointframe/GlobalUsings.cs | Add global using for Pointframe.Models. |
| Pointframe/App.xaml.cs | Register beautifier services/factory and update overlay DI wiring. |
| Pointframe.Tests/OverlayWindowRecordingFlowTests.cs | Update overlay ctor calls for new beautifier factory param. |
| Pointframe.Tests/OverlayWindowLayoutInteractionTests.cs | Update overlay ctor calls for new beautifier factory param. |
| Pointframe.Tests/OverlayWindowInteractionTests.cs | Update overlay ctor calls for new beautifier factory param. |
| Pointframe.Tests/GlobalUsings.cs | Add global using for Pointframe.Models in tests. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+155
to
+167
| [RelayCommand] | ||
| private void Beautify() | ||
| { | ||
| var bitmapCapture = _bitmapCapture; | ||
| if (bitmapCapture is null) | ||
| { | ||
| _logger.LogWarning("Beautify requested before overlay bitmap capture was attached"); | ||
| return; | ||
| } | ||
|
|
||
| _telemetry.TrackEvent("beautify_opened"); | ||
| BeautifyRequested?.Invoke(bitmapCapture.ComposeBitmap(restoreOverlayVisibilityAfterCapture: false)); | ||
| } |
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.
No description provided.