mirror of
https://github.com/nyakang/nyaterm.git
synced 2026-10-04 08:00:50 +00:00
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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user