refactor(desktop): move transfer browser column resize onto its state

The three resize handlers only read and wrote self.transfer.browser, so
they now take &mut TransferBrowserState and the NyaTermApp methods are
forwarders that own the redraw. The update and finish helpers return
whether anything changed so the forwarder can skip a needless notify.

TransferBrowserColumnResizeState no longer leaks into the transfers page
module, which is what the narrower receiver buys.
This commit is contained in:
Kang
2026-07-26 17:37:32 +08:00
parent c814de10bd
commit fe10089034
3 changed files with 49 additions and 22 deletions
@@ -7,12 +7,9 @@ impl NyaTermApp {
event: &MouseDownEvent,
cx: &mut Context<Self>,
) {
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<Self>,
) {
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<Self>,
) {
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();
}
}
@@ -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,
@@ -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
}
}