diff --git a/crates/nyaterm-desktop/src/features/pages/transfers/browser_columns.rs b/crates/nyaterm-desktop/src/features/pages/transfers/browser_columns.rs index c7a86cd1c..a85d88388 100644 --- a/crates/nyaterm-desktop/src/features/pages/transfers/browser_columns.rs +++ b/crates/nyaterm-desktop/src/features/pages/transfers/browser_columns.rs @@ -7,12 +7,9 @@ impl NyaTermApp { event: &MouseDownEvent, cx: &mut Context, ) { - self.transfer.browser.column_resize = Some(TransferBrowserColumnResizeState { - column, - start_x: event.position.x, - start_width: self.transfer.browser.column_widths.get(column), - }); - self.transfer.browser.status = format!("resizing {} column", column.label().to_lowercase()); + self.transfer + .browser + .start_column_resize(column, event.position.x); cx.notify(); } @@ -21,18 +18,9 @@ impl NyaTermApp { event: &MouseMoveEvent, cx: &mut Context, ) { - let Some(state) = self.transfer.browser.column_resize else { - return; - }; - let next_width = state.start_width + (event.position.x - state.start_x); - self.transfer - .browser - .column_widths - .set(state.column, next_width); - let width = f32::from(self.transfer.browser.column_widths.get(state.column)).round(); - self.transfer.browser.status = - format!("{} column: {width}px", state.column.label().to_lowercase()); - cx.notify(); + if self.transfer.browser.update_column_resize(event.position.x) { + cx.notify(); + } } pub(in crate::features) fn finish_transfer_browser_column_resize( @@ -40,8 +28,7 @@ impl NyaTermApp { _event: &MouseUpEvent, cx: &mut Context, ) { - if self.transfer.browser.column_resize.take().is_some() { - self.transfer.browser.status = "file column width updated".to_string(); + if self.transfer.browser.finish_column_resize() { cx.notify(); } } diff --git a/crates/nyaterm-desktop/src/features/pages/transfers/mod.rs b/crates/nyaterm-desktop/src/features/pages/transfers/mod.rs index ea6a01ccb..94c175ffb 100644 --- a/crates/nyaterm-desktop/src/features/pages/transfers/mod.rs +++ b/crates/nyaterm-desktop/src/features/pages/transfers/mod.rs @@ -14,7 +14,7 @@ use std::collections::{HashSet, VecDeque}; use std::time::Duration; use crate::models::{ - TransferBrowserColumnResizeState, TransferBrowserColumnWidths, TransferBrowserContextMenuState, + TransferBrowserColumnWidths, TransferBrowserContextMenuState, TransferBrowserDragSelectionState, TransferBrowserFavoritesMenuState, TransferBrowserPendingRenameState, TransferBrowserSessionCacheState, TransferBrowserSortColumn, TransferBrowserSortDirection, TransferBrowserUploadMenuState, TransferDeleteState, diff --git a/crates/nyaterm-desktop/src/features/transfers/state.rs b/crates/nyaterm-desktop/src/features/transfers/state.rs index 48b6eb2fc..fd656a440 100644 --- a/crates/nyaterm-desktop/src/features/transfers/state.rs +++ b/crates/nyaterm-desktop/src/features/transfers/state.rs @@ -9,7 +9,7 @@ use std::collections::{HashMap, HashSet, VecDeque}; use std::sync::mpsc; use std::time::Instant; -use gpui::{FocusHandle, WindowHandle}; +use gpui::{FocusHandle, Pixels, WindowHandle}; use nyaterm_transport::{SftpDuplicatePolicy, SftpFileEntry}; use crate::features::{TransferExternalSyncWindow, TransferJobResult}; @@ -268,3 +268,43 @@ impl TransferFeatureState { } } } + +/// Column resize is self-contained: it only reads and writes browser geometry. +/// +/// Keeping it here rather than on `NyaTermApp` means a drag cannot reach any +/// other app state; the page-level handlers are forwarders that own the redraw. +impl TransferBrowserState { + pub(in crate::features) fn start_column_resize( + &mut self, + column: TransferBrowserSortColumn, + position_x: Pixels, + ) { + self.column_resize = Some(TransferBrowserColumnResizeState { + column, + start_x: position_x, + start_width: self.column_widths.get(column), + }); + self.status = format!("resizing {} column", column.label().to_lowercase()); + } + + /// Returns false when no resize is in flight, so the caller can skip the redraw. + pub(in crate::features) fn update_column_resize(&mut self, position_x: Pixels) -> bool { + let Some(state) = self.column_resize else { + return false; + }; + let next_width = state.start_width + (position_x - state.start_x); + self.column_widths.set(state.column, next_width); + let width = f32::from(self.column_widths.get(state.column)).round(); + self.status = format!("{} column: {width}px", state.column.label().to_lowercase()); + true + } + + /// Returns false when no resize was in flight, so the caller can skip the redraw. + pub(in crate::features) fn finish_column_resize(&mut self) -> bool { + if self.column_resize.take().is_none() { + return false; + } + self.status = "file column width updated".to_string(); + true + } +}