use std::collections::HashSet;
use crate::engine::{cache, viewer_async::ViewerAsyncState};
use crate::utils::ClipboardCopyCommand;
use super::modes::{MainMode, RightPaneMode, SpaceMenuKind};
use super::overlays::{
EnhancePolicyMenuState, FileDeleteConfirmState, LensConfirmState, LensMenuState,
MultiselectState, OpenMenuState, QAMenuState, SearchState, StartupPromptState, ThemeState,
ToastState, ViewerChrome, ViewerFindState,
};
use super::panels::PanelState;
use super::session::{
BackgroundSnapshot, DuplicateLoadGate, LensExportGate, SessionFlow, ZahirExportGate,
};
use super::settings::SettingsPaneState;
use super::view::{RightPaneAsync, ViewerDiskContentCache};
use super::viewer::ViewerImageState;
pub struct UblxState {
pub main_mode: MainMode,
pub right_pane_mode: RightPaneMode,
pub panels: PanelState,
pub search: SearchState,
pub viewer_find: ViewerFindState,
pub theme: ThemeState,
pub toasts: ToastState,
pub open_menu: OpenMenuState,
pub lens_menu: LensMenuState,
pub qa_menu: QAMenuState,
pub enhance_policy_menu: EnhancePolicyMenuState,
pub lens_confirm: LensConfirmState,
pub file_rename_input: Option<(String, String)>,
pub file_delete_confirm: FileDeleteConfirmState,
pub multiselect: MultiselectState,
pub chrome: ViewerChrome,
pub cached_tree: Option<(String, String)>,
pub viewer_disk_cache: Option<ViewerDiskContentCache>,
pub viewer_text_cache: Option<cache::ViewerTextCacheEntry>,
pub viewer_preview_source: Option<(String, cache::ViewerContentIdentity)>,
pub csv_table_text_lru:
cache::LruCache<cache::ViewerTableCacheKey, cache::ViewerTextCacheEntry>,
pub viewer_async: ViewerAsyncState,
pub viewer_image: ViewerImageState,
pub last_key_for_double: Option<char>,
pub snapshot_bg: BackgroundSnapshot,
pub duplicate_load: DuplicateLoadGate,
pub zahir_export_load: ZahirExportGate,
pub lens_export_load: LensExportGate,
pub duplicate_ignored_paths: HashSet<String>,
pub config_written_by_us_at: Option<std::time::Instant>,
pub session: SessionFlow,
pub clipboard_copy: Option<ClipboardCopyCommand>,
pub startup_prompt: Option<StartupPromptState>,
pub settings: SettingsPaneState,
pub right_pane_async: RightPaneAsync,
}
impl Default for UblxState {
fn default() -> Self {
Self::new()
}
}
impl UblxState {
#[must_use]
pub fn new() -> Self {
Self {
main_mode: MainMode::default(),
right_pane_mode: RightPaneMode::default(),
panels: PanelState::new(),
search: SearchState::default(),
viewer_find: ViewerFindState::default(),
theme: ThemeState::default(),
toasts: ToastState::default(),
open_menu: OpenMenuState::default(),
lens_menu: LensMenuState::default(),
qa_menu: QAMenuState::default(),
enhance_policy_menu: EnhancePolicyMenuState::default(),
lens_confirm: LensConfirmState::default(),
file_rename_input: None,
file_delete_confirm: FileDeleteConfirmState::default(),
multiselect: MultiselectState::default(),
chrome: ViewerChrome::default(),
cached_tree: None,
viewer_disk_cache: None,
viewer_text_cache: None,
viewer_preview_source: None,
csv_table_text_lru: cache::LruCache::default(),
viewer_async: ViewerAsyncState::default(),
viewer_image: ViewerImageState::default(),
last_key_for_double: None,
snapshot_bg: BackgroundSnapshot::default(),
duplicate_load: DuplicateLoadGate::default(),
zahir_export_load: ZahirExportGate::default(),
lens_export_load: LensExportGate::default(),
duplicate_ignored_paths: HashSet::new(),
config_written_by_us_at: None,
session: SessionFlow::default(),
clipboard_copy: ClipboardCopyCommand::detect(),
startup_prompt: None,
settings: SettingsPaneState::default(),
right_pane_async: RightPaneAsync::default(),
}
}
pub fn close_open_menu(&mut self) {
self.open_menu.visible = false;
self.open_menu.path = None;
self.open_menu.can_terminal = false;
}
pub fn open_open_menu(&mut self, path: String, can_open_in_terminal: bool) {
self.open_menu.visible = true;
self.open_menu.path = Some(path);
self.open_menu.can_terminal = can_open_in_terminal;
self.open_menu.selected_index = 0;
}
pub fn close_lens_menu(&mut self) {
self.lens_menu.visible = false;
self.lens_menu.paths.clear();
self.lens_menu.selected_index = 0;
}
pub fn close_qa_menu(&mut self) {
self.qa_menu.visible = false;
self.qa_menu.selected_index = 0;
self.qa_menu.kind = None;
}
pub fn close_enhance_policy_menu(&mut self) {
self.enhance_policy_menu.visible = false;
self.enhance_policy_menu.path = None;
self.enhance_policy_menu.selected_index = 0;
}
pub fn close_lens_delete_confirm(&mut self) {
self.lens_confirm.delete_visible = false;
self.lens_confirm.delete_lens_name = None;
self.lens_confirm.delete_selected = 0;
}
pub fn open_lens_menu(&mut self, paths: Vec<String>, exclude_current_lens: Option<String>) {
if paths.is_empty() {
return;
}
self.lens_menu.visible = true;
self.lens_menu.paths = paths;
self.lens_menu.exclude_lens_name = exclude_current_lens;
self.lens_menu.selected_index = 0;
}
pub fn open_qa_menu(&mut self, kind: SpaceMenuKind) {
self.qa_menu.visible = true;
self.qa_menu.selected_index = 0;
self.qa_menu.kind = Some(kind);
}
pub fn open_lens_delete_confirm(&mut self, lens_name: String) {
self.lens_confirm.delete_visible = true;
self.lens_confirm.delete_lens_name = Some(lens_name);
self.lens_confirm.delete_selected = 0;
}
pub fn open_file_rename_input(&mut self, rel_path: String) {
let base = std::path::Path::new(&rel_path)
.file_name()
.and_then(|s| s.to_str())
.unwrap_or("")
.to_string();
self.file_rename_input = Some((rel_path, base));
}
pub fn close_file_delete_confirm(&mut self) {
self.file_delete_confirm.visible = false;
self.file_delete_confirm.rel_path = None;
self.file_delete_confirm.bulk_paths = None;
self.file_delete_confirm.selected_index = 0;
}
pub fn open_file_delete_confirm(&mut self, rel_path: String) {
self.file_delete_confirm.visible = true;
self.file_delete_confirm.rel_path = Some(rel_path);
self.file_delete_confirm.bulk_paths = None;
self.file_delete_confirm.selected_index = 0;
}
pub fn open_file_delete_confirm_bulk(&mut self, paths: Vec<String>) {
self.file_delete_confirm.visible = true;
self.file_delete_confirm.rel_path = None;
self.file_delete_confirm.bulk_paths = Some(paths);
self.file_delete_confirm.selected_index = 0;
}
}