Wherry/src/ui/state/mod.rs
2026-07-06 01:06:43 +03:00

134 lines
5.5 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! Состояние UI: главная структура [`AppState`], её типы ([`types`]) и
//! начальные значения ([`defaults`]).
use std::sync::Arc;
use crate::domain::file_entry::FileEntry;
use crate::domain::transfer::TransferTask;
mod defaults;
mod types;
pub use types::*;
pub struct AppState {
pub tabs: Vec<ConnectionTab>,
pub active_tab: usize,
pub local_path: String,
pub local_entries: Vec<FileEntry>,
pub local_selected: Option<String>,
/// Панель, в которой был последний клик — New Folder/Rename/Delete в тулбаре
/// применяются к ней.
pub active_pane: Pane,
/// К какой стороне относится открытый сейчас диалог mkdir/rename/delete.
pub op_target: Pane,
pub show_connect_dialog: bool,
pub show_bookmarks: bool,
pub show_history: bool,
pub show_settings_dialog: bool,
/// Активный раздел открытого диалога Settings.
pub settings_section: SettingsSection,
/// Прошлый раздел + момент переключения (ui time) — для кросс-фейда
/// содержимого при смене раздела.
pub settings_prev_section: SettingsSection,
pub settings_section_changed_at: f64,
/// Видимость панелей — настраивается в Window (macOS) или в Settings.
pub show_toolbar: bool,
pub show_sidebar: bool,
pub show_status_bar: bool,
pub show_queue_panel: bool,
// ── Настройки, сохраняемые между запусками (Settings) ────────────────
/// Спрашивать подтверждение перед удалением файла/папки.
pub confirm_before_delete: bool,
/// Стартовая локальная папка; пусто — домашняя папка ОС.
pub default_local_folder: String,
/// Через сколько секунд автоматически убирать завершённые задачи из очереди
/// передач; 0 — никогда.
pub auto_clear_completed_secs: u32,
/// Сколько передач может выполняться параллельно — общий с воркером атомик,
/// чтобы Settings → Transfers менял параллелизм на лету.
pub max_concurrent: Arc<std::sync::atomic::AtomicU32>,
/// Инлайн-подтверждение "Clear All History" в разделе Settings → History.
pub history_clear_confirm: bool,
/// Фиксированные пункты быстрого доступа (Home/Desktop/...) — не удаляются, не хранятся в БД.
pub quick_access: Vec<QuickAccess>,
/// Закладки, добавленные пользователем — хранятся в БД, можно удалять.
pub bookmarks: Vec<Bookmark>,
pub history: Vec<HistoryEntry>,
pub connect_label: String,
pub connect_host: String,
pub connect_port: String,
pub connect_user: String,
pub connect_pass: String,
pub connect_key_path: String,
pub connect_protocol: usize,
pub connect_error: String,
pub connect_loading: bool,
pub show_queue: bool,
pub queue_tasks: Vec<TransferTask>,
pub status_message: String,
// action flags — выставляются тулбаром, обрабатываются в app.rs
pub pending_refresh: bool,
/// Клик по записи истории — переподключиться (новая вкладка, без диалога).
pub pending_history_reconnect: Option<HistoryEntry>,
/// ПКМ → "Save" на записи истории — сохранить как постоянный Site.
pub pending_history_save: Option<HistoryEntry>,
// диалоги операций над удалённой ФС
pub show_mkdir_dialog: bool,
pub show_delete_dialog: bool,
pub show_rename_dialog: bool,
pub mkdir_name: String,
pub delete_name: String,
pub rename_old_name: String,
pub rename_new_name: String,
pub pending_mkdir_result: Option<PendingResult<()>>,
pub pending_delete_result: Option<PendingResult<()>>,
pub pending_rename_result: Option<PendingResult<()>>,
pub pending_connect: Option<PendingConnect>,
pub pending_remote_list: Vec<PendingRemoteList>,
}
impl AppState {
pub fn active_tab_ref(&self) -> Option<&ConnectionTab> {
if self.tabs.is_empty() {
return None;
}
let idx = self.active_tab.min(self.tabs.len() - 1);
Some(&self.tabs[idx])
}
/// Перечитывает историю подключений из БД (после записи новой попытки).
pub fn reload_history(&mut self, db: &Arc<std::sync::Mutex<rusqlite::Connection>>) {
if let Ok(conn) = db.lock()
&& let Ok(rows) = crate::storage::db::get_history(&conn)
{
self.history = rows
.into_iter()
.map(
|(host, port, user, time, conn_id, protocol, key_path)| HistoryEntry {
host,
port,
user,
time,
conn_id,
protocol,
key_path,
},
)
.collect();
}
}
}