From cbde683348da9c13d87be9e47c77160f9a99f40e Mon Sep 17 00:00:00 2001 From: Yvette Carlisle Date: Fri, 15 May 2026 18:54:04 +0800 Subject: [PATCH] {"schema":"decodex/commit/1","summary":"Fix native selection size badge label","authority":"manual"} --- .../RsnapNativeHostKit/CaptureHostView.swift | 11 +++++--- .../src/overlay/rendering/affordances.rs | 24 +---------------- .../capture_affordances.rs | 26 ++++--------------- 3 files changed, 14 insertions(+), 47 deletions(-) diff --git a/native/macos-host/Sources/RsnapNativeHostKit/CaptureHostView.swift b/native/macos-host/Sources/RsnapNativeHostKit/CaptureHostView.swift index 644b9f7c..a90a3e6a 100644 --- a/native/macos-host/Sources/RsnapNativeHostKit/CaptureHostView.swift +++ b/native/macos-host/Sources/RsnapNativeHostKit/CaptureHostView.swift @@ -1928,8 +1928,7 @@ final class CaptureHostView: NSView { } private func drawSelectionSizeBadge(for rect: CGRect, in context: CGContext) { - let scale = window?.screen?.backingScaleFactor ?? 1 - let text = "\(Int(round(rect.width * scale)))x\(Int(round(rect.height * scale)))" + let text = selectionSizeText(for: rect) let font = Self.hudLayoutMetrics.font let textSize = text.size(using: font) let badgeFrame = CaptureChrome.selectionSizeBadgeFrame( @@ -3286,7 +3285,13 @@ final class CaptureHostView: NSView { private func selectionSizeText(for rect: CGRect) -> String { let scale = window?.screen?.backingScaleFactor ?? 1 - return "\(Int(round(rect.width * scale)))x\(Int(round(rect.height * scale)))" + let sizeText = "\(Int(round(rect.width * scale)))x\(Int(round(rect.height * scale)))px" + + if abs(scale - 1) <= 0.005 { + return sizeText + } + + return "\(sizeText) @\(String(format: "%g", Double(scale)))x" } private func currentPositionDisplay() -> LivePositionDisplay { diff --git a/packages/rsnap-overlay/src/overlay/rendering/affordances.rs b/packages/rsnap-overlay/src/overlay/rendering/affordances.rs index 1114d333..f6ee0aac 100644 --- a/packages/rsnap-overlay/src/overlay/rendering/affordances.rs +++ b/packages/rsnap-overlay/src/overlay/rendering/affordances.rs @@ -1269,30 +1269,8 @@ impl WindowRenderer { size_points: RectPoints, ) -> String { let size_pixels = monitor.local_rect_to_pixels(size_points); - let size_text = format!("{}x{} px", size_pixels.width, size_pixels.height); - if monitor.scale_factor_x1000 == 1_000 { - return size_text; - } - - format!("{} @{}x", size_text, Self::selection_size_badge_scale_text(monitor)) - } - - fn selection_size_badge_scale_text(monitor: MonitorRect) -> String { - let scale_integer = monitor.scale_factor_x1000 / 1_000; - let scale_fraction = monitor.scale_factor_x1000 % 1_000; - - if scale_fraction == 0 { - return scale_integer.to_string(); - } - - let mut scale_fraction_text = format!("{scale_fraction:03}"); - - while scale_fraction_text.ends_with('0') { - scale_fraction_text.pop(); - } - - format!("{scale_integer}.{scale_fraction_text}") + format!("{}x{}", size_pixels.width, size_pixels.height) } fn selection_size_badge_visual_overflow(pixels_per_point: f32) -> SelectionSizeBadgePadding { diff --git a/packages/rsnap-overlay/src/overlay/tests/rendering_behaviors/capture_affordances.rs b/packages/rsnap-overlay/src/overlay/tests/rendering_behaviors/capture_affordances.rs index 88632341..2ded0fda 100644 --- a/packages/rsnap-overlay/src/overlay/tests/rendering_behaviors/capture_affordances.rs +++ b/packages/rsnap-overlay/src/overlay/tests/rendering_behaviors/capture_affordances.rs @@ -306,34 +306,18 @@ fn selection_size_badge_reserved_rect_accepts_overlap_when_no_non_overlapping_sl #[test] fn selection_size_badge_text_uses_monitor_pixel_dimensions() { + let monitor = tests::test_monitor_with_scale(1_000, 800, 2_000); + assert_eq!( - WindowRenderer::selection_size_badge_text( - tests::test_monitor_with_scale(1_000, 800, 2_000), - RectPoints::new(10, 20, 120, 80), - ), - "240x160 px @2x" - ); - assert_eq!( - WindowRenderer::selection_size_badge_text( - tests::test_monitor_with_scale(1_000, 800, 1_500), - RectPoints::new(10, 20, 120, 80), - ), - "180x120 px @1.5x" - ); - assert_eq!( - WindowRenderer::selection_size_badge_text( - tests::test_monitor_with_scale(1_000, 800, 1_000), - RectPoints::new(10, 20, 120, 80), - ), - "120x80 px" + WindowRenderer::selection_size_badge_text(monitor, RectPoints::new(10, 20, 120, 80)), + "240x160" ); } #[test] fn selection_size_badge_layout_keeps_visual_bounds_inside_badge_rect() { let ctx = tests::test_egui_context(); - let layout = - WindowRenderer::selection_size_badge_layout(&ctx, "240x160 px @2x", HudTheme::Light, 1.0); + let layout = WindowRenderer::selection_size_badge_layout(&ctx, "240x160", HudTheme::Light, 1.0); let screen_rect = Rect::from_min_size(Pos2::ZERO, Vec2::new(800.0, 600.0)); for (label, capture_rect) in [