Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
191 changes: 73 additions & 118 deletions packages/rsnap-overlay/src/overlay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1474,12 +1474,6 @@ impl OverlaySession {
&& self.inflight_freeze_capture.is_none()
}

fn should_force_pending_hud_and_loupe_moves(&self) -> bool {
matches!(self.state.mode, OverlayMode::Frozen)
&& self.state.monitor.is_some()
&& !self.frozen_final_capture_ready()
}

#[cfg(target_os = "macos")]
fn try_latest_live_freeze_preview(&mut self, monitor: MonitorRect) -> Option<RgbaImage> {
if self.state.live_bg_monitor == Some(monitor)
Expand All @@ -1505,7 +1499,6 @@ impl OverlaySession {

if let Some(cursor) = cursor {
self.update_cursor_state(monitor, cursor);
self.update_hud_window_position(monitor, cursor);
}
}

Expand Down Expand Up @@ -1566,26 +1559,11 @@ impl OverlaySession {
}
}

fn refresh_frozen_helper_windows_for_transition(
&mut self,
monitor: MonitorRect,
cursor: Option<GlobalPoint>,
) {
if let Some(cursor) = cursor {
self.update_hud_window_position(monitor, cursor);
}

if self.should_force_pending_hud_and_loupe_moves() {
self.force_apply_pending_hud_and_loupe_moves();
}

fn refresh_frozen_helper_windows_for_transition(&mut self, monitor: MonitorRect) {
self.force_apply_pending_toolbar_window_move();
self.schedule_egui_repaint_after(self.repaint_interval_for_monitor(Some(monitor)));
self.request_redraw_for_monitor(monitor);
self.request_redraw_hud_window();

if self.state.alt_held || self.loupe_window_visible {
self.request_redraw_loupe_window();
}
self.request_redraw_toolbar_window();
}

fn begin_frozen_capture_with_rect(
Expand All @@ -1604,12 +1582,13 @@ impl OverlaySession {
};

let capture_rect = rect.unwrap_or(RectPoints::new(0, 0, monitor.width, monitor.height));
let frozen_rgb = self.state.rgb;
let frozen_loupe = self.state.loupe.as_ref().map(|loupe| crate::state::LoupeSample {
center: loupe.center,
patch: loupe.patch.clone(),
});

self.state.alt_held = false;
self.loupe_activation_key_down = false;
self.state.rgb = None;
self.state.loupe = None;

self.set_alt_loupe_window_visible(None, false);
self.state.clear_error();
self.state.begin_freeze(monitor);

Expand Down Expand Up @@ -1650,8 +1629,6 @@ impl OverlaySession {
self.seed_frozen_toolbar_default_position(monitor, capture_rect);
self.request_redraw_toolbar_window();

self.state.rgb = frozen_rgb;
self.state.loupe = frozen_loupe;
self.pending_freeze_capture = Some(monitor);
self.pending_freeze_capture_armed = false;
self.inflight_freeze_capture = None;
Expand All @@ -1665,7 +1642,7 @@ impl OverlaySession {
self.left_mouse_button_down_monitor = None;
self.left_mouse_button_down_global = None;

self.refresh_frozen_helper_windows_for_transition(monitor, cursor);
self.refresh_frozen_helper_windows_for_transition(monitor);

#[cfg(target_os = "macos")]
{
Expand All @@ -1674,7 +1651,7 @@ impl OverlaySession {
self.state.live_bg_image = None;

self.commit_frozen_preview(monitor, image, cursor);
self.force_apply_pending_hud_and_loupe_moves();
self.force_apply_pending_toolbar_window_move();
} else {
self.state.live_bg_monitor = None;
self.state.live_bg_image = None;
Expand All @@ -1698,12 +1675,9 @@ impl OverlaySession {

if let Some(cursor) = cursor {
self.update_cursor_state(monitor, cursor);
self.update_hud_window_position(monitor, cursor);
}

if self.should_force_pending_hud_and_loupe_moves() {
self.force_apply_pending_hud_and_loupe_moves();
}
self.force_apply_pending_toolbar_window_move();
} else {
self.state.live_bg_monitor = None;
self.state.live_bg_image = None;
Expand All @@ -1715,6 +1689,8 @@ impl OverlaySession {
}

fn update_live_drag_rect(&mut self, monitor: MonitorRect, global: GlobalPoint) {
let was_active = self.live_drag_hides_auxiliary_windows();

if !matches!(self.state.mode, OverlayMode::Live) {
self.state.drag_rect = None;

Expand Down Expand Up @@ -1744,6 +1720,10 @@ impl OverlaySession {
}

self.state.drag_rect = Some(MonitorRectPoints { monitor_id: monitor.id, rect });

if !was_active {
self.hide_auxiliary_windows_for_live_drag();
}
}

fn frozen_capture_rect_drag_target(&self) -> Option<(MonitorRect, RectPoints)> {
Expand Down Expand Up @@ -2168,6 +2148,10 @@ impl OverlaySession {
matches!(self.state.mode, OverlayMode::Frozen) && self.frozen_selection_drag.active
}

pub(super) fn live_drag_hides_auxiliary_windows(&self) -> bool {
matches!(self.state.mode, OverlayMode::Live) && self.state.drag_rect.is_some()
}

fn hide_auxiliary_windows_for_frozen_selection_drag(&mut self) {
if let Some(hud_window) = self.hud_window.as_ref() {
hud_window.window.set_visible(false);
Expand Down Expand Up @@ -2198,6 +2182,24 @@ impl OverlaySession {
self.last_present_at = Instant::now();
}

fn hide_auxiliary_windows_for_live_drag(&mut self) {
if let Some(hud_window) = self.hud_window.as_ref() {
hud_window.window.set_visible(false);
}

self.hud_window_visible = false;

if let Some(loupe_window) = self.loupe_window.as_ref() {
loupe_window.window.set_visible(false);
}

self.loupe_window_visible = false;

self.reset_loupe_window_warmup_redraws();

self.last_present_at = Instant::now();
}

fn stop_frozen_selection_drag(&mut self) {
let was_active = self.frozen_selection_drag.active;

Expand Down Expand Up @@ -3934,33 +3936,12 @@ impl OverlaySession {
})
}

fn refresh_frozen_cursor_samples(&mut self, monitor: MonitorRect) {
if let Some(cursor) = self.state.cursor {
self.state.rgb =
image_helpers::frozen_rgb(&self.state.frozen_image, Some(monitor), cursor);
self.state.loupe = image_helpers::frozen_loupe_patch(
&self.state.frozen_image,
Some(monitor),
cursor,
self.loupe_patch_width_px,
self.loupe_patch_height_px,
)
.map(|patch| crate::state::LoupeSample { center: cursor, patch });
}
}

fn note_frozen_image_mutated(&mut self, monitor: MonitorRect) {
self.state.frozen_generation = self.state.frozen_generation.wrapping_add(1);

self.refresh_frozen_cursor_samples(monitor);
self.sync_frozen_toolbar_state();
self.request_redraw_for_monitor(monitor);
self.request_redraw_hud_window();
self.request_redraw_toolbar_window();

if self.state.alt_held || self.loupe_window_visible {
self.request_redraw_loupe_window();
}
}

fn push_frozen_mosaic_edit(&mut self, edit: FrozenMosaicEdit) {
Expand Down Expand Up @@ -4251,25 +4232,7 @@ impl OverlaySession {
}

if let Some(cursor) = self.state.cursor {
self.state.rgb =
image_helpers::frozen_rgb(&self.state.frozen_image, Some(monitor), cursor);
self.state.loupe = image_helpers::frozen_loupe_patch(
&self.state.frozen_image,
Some(monitor),
cursor,
self.loupe_patch_width_px,
self.loupe_patch_height_px,
)
.map(|patch| crate::state::LoupeSample { center: cursor, patch });

self.update_hud_window_position(monitor, cursor);
}

self.maybe_start_loupe_window_warmup_redraw();
self.request_redraw_hud_window();

if self.state.alt_held || self.loupe_window_visible {
self.request_redraw_loupe_window();
self.update_cursor_state(monitor, cursor);
}

self.request_redraw_toolbar_window();
Expand Down Expand Up @@ -4585,6 +4548,9 @@ impl OverlaySession {
if self.state.alt_held == alt {
return;
}
if alt && !matches!(self.state.mode, OverlayMode::Live) {
return;
}

self.state.alt_held = alt;

Expand All @@ -4593,6 +4559,13 @@ impl OverlaySession {

return;
}
if self.live_drag_hides_auxiliary_windows() {
self.state.loupe = None;

self.set_alt_loupe_window_visible(None, false);

return;
}

let Some((monitor, cursor)) = self.alt_activation_cursor_context() else {
return;
Expand All @@ -4604,10 +4577,7 @@ impl OverlaySession {
self.maybe_request_live_bg(monitor);
}

match self.state.mode {
OverlayMode::Live => self.request_live_alt_samples(monitor, cursor),
OverlayMode::Frozen => self.request_frozen_alt_samples(cursor),
}
self.request_live_alt_samples(monitor, cursor);
}

fn apply_loupe_activation_input(&mut self, pressed: bool, repeat: bool) -> bool {
Expand All @@ -4626,6 +4596,12 @@ impl OverlaySession {
}

fn apply_loupe_activation_key_event(&mut self, pressed: bool, repeat: bool) -> bool {
if !matches!(self.state.mode, OverlayMode::Live) {
self.loupe_activation_key_down = false;

return false;
}

self.loupe_activation_key_down = pressed;

if !pressed && !self.state.alt_held {
Expand Down Expand Up @@ -4673,14 +4649,6 @@ impl OverlaySession {
{
self.request_redraw_loupe_window();
}

return OverlayControl::Continue;
}

if let Some(monitor) = self.active_cursor_monitor() {
self.request_redraw_for_monitor(monitor);
} else {
self.request_redraw_all();
}

OverlayControl::Continue
Expand Down Expand Up @@ -4715,10 +4683,7 @@ impl OverlaySession {
OverlayMode::Live => {
self.update_cursor_for_live_move(old_monitor, old_cursor, monitor, cursor)
},
OverlayMode::Frozen => {
self.update_cursor_state(monitor, cursor);
self.update_hud_window_position(monitor, cursor);
},
OverlayMode::Frozen => self.update_cursor_state(monitor, cursor),
}
}

Expand All @@ -4731,16 +4696,22 @@ impl OverlaySession {

if matches!(self.state.mode, OverlayMode::Live) {
self.request_redraw_hud_window();

return;
}

if let Some(monitor) = self.active_cursor_monitor() {
self.request_redraw_for_monitor(monitor);
}
}

fn set_alt_loupe_window_visible(&mut self, monitor: Option<MonitorRect>, visible: bool) {
if !matches!(self.state.mode, OverlayMode::Live) {
self.loupe_window_visible = false;

self.reset_loupe_window_warmup_redraws();

if let Some(loupe_window) = self.loupe_window.as_ref() {
loupe_window.window.set_visible(false);
loupe_window.window.request_redraw();
}

return;
}
if self.live_loupe_uses_hud_window() {
self.loupe_window_visible = false;

Expand Down Expand Up @@ -4802,23 +4773,6 @@ impl OverlaySession {
}
}

fn request_frozen_alt_samples(&mut self, cursor: GlobalPoint) {
if let (Some(frozen_monitor), Some(_)) =
(self.state.monitor, self.state.frozen_image.as_ref())
{
self.state.loupe = image_helpers::frozen_loupe_patch(
&self.state.frozen_image,
Some(frozen_monitor),
cursor,
self.loupe_patch_width_px,
self.loupe_patch_height_px,
)
.map(|patch| crate::state::LoupeSample { center: cursor, patch });

self.request_redraw_for_monitor(frozen_monitor);
}
}

fn handle_resized(&mut self, window_id: WindowId, size: PhysicalSize<u32>) -> OverlayControl {
let window_scale_factor = self
.windows
Expand Down Expand Up @@ -6110,7 +6064,8 @@ impl OverlaySession {
}

fn loupe_activation_shortcut_available(&self) -> bool {
!self.keyboard_modifiers.shift_key()
matches!(self.state.mode, OverlayMode::Live)
&& !self.keyboard_modifiers.shift_key()
&& !self.keyboard_modifiers.alt_key()
&& !self.keyboard_modifiers.control_key()
&& !self.keyboard_modifiers.super_key()
Expand Down
6 changes: 0 additions & 6 deletions packages/rsnap-overlay/src/overlay/aux_window_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -352,12 +352,6 @@ impl OverlaySession {
self.last_hud_window_move_at = now;
}

pub(super) fn force_apply_pending_hud_and_loupe_moves(&mut self) {
self.force_apply_pending_hud_window_move();
self.force_apply_pending_loupe_window_move();
self.force_apply_pending_toolbar_window_move();
}

pub(super) fn maybe_apply_pending_loupe_window_move(&mut self, now: Instant) {
self.apply_pending_loupe_window_move(now, false);
}
Expand Down
Loading
Loading