use super::config_manager::AppConfig;
use crate::input::keyboard_mode::{KeyboardMode, MovementState};
use crate::lockscreen::{LockScreen, PinSetupDialog};
use crate::rendering::Charset;
use crate::ui::button::Button;
use crate::ui::config_window::ConfigWindow;
use crate::ui::context_menu::ContextMenu;
use crate::ui::error_dialog::ErrorDialog;
use crate::ui::info_window::InfoWindow;
use crate::ui::prompt::Prompt;
use crate::ui::slight_input::SlightInput;
use crate::ui::toast::Toast;
use crate::ui::ui_render::CalendarState;
use crate::ui::widgets::TopBar;
use std::time::Instant;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AutoScrollDirection {
Up,
Down,
}
pub struct AppState {
pub active_prompt: Option<Prompt>,
pub active_calendar: Option<CalendarState>,
pub active_config_window: Option<ConfigWindow>,
pub active_help_window: Option<InfoWindow>,
pub active_about_window: Option<InfoWindow>,
pub active_winmode_help_window: Option<InfoWindow>,
pub active_slight_input: Option<SlightInput>,
pub active_error_dialog: Option<ErrorDialog>,
pub active_toast: Option<Toast>,
pub context_menu: ContextMenu,
pub taskbar_menu: ContextMenu,
pub taskbar_menu_window_id: Option<u32>,
pub system_menu: ContextMenu,
#[allow(dead_code)]
pub new_terminal_button: Button,
pub paste_button: Button,
pub clear_clipboard_button: Button,
pub copy_button: Button,
pub clear_selection_button: Button,
pub exit_button: Button,
pub top_bar: TopBar,
pub battery_hovered: bool,
pub auto_tiling_button: Button,
pub auto_tiling_enabled: bool,
pub tint_terminal: bool,
pub selection_active: bool,
pub last_click_time: Option<Instant>,
pub last_click_pos: Option<(u16, u16)>,
pub click_count: u32,
pub auto_scroll_direction: Option<AutoScrollDirection>,
pub last_auto_scroll_time: Option<Instant>,
pub should_exit: bool,
pub should_kill_daemon: bool,
pub keyboard_mode: KeyboardMode,
pub move_state: MovementState,
pub resize_state: MovementState,
pub last_backtick_time: Option<Instant>,
pub show_window_number_overlay: bool,
pub lockscreen: LockScreen,
pub active_pin_setup: Option<PinSetupDialog>,
}
impl AppState {
pub fn new(cols: u16, rows: u16, config: &AppConfig, charset: &Charset) -> Self {
let auto_tiling_on_startup = config.auto_tiling_on_startup;
let tint_terminal = config.tint_terminal;
let new_terminal_button = Button::new(1, 0, "+New Terminal".to_string());
let paste_label = "Paste".to_string();
let paste_button_width = (paste_label.len() as u16) + 4; let paste_x = (cols.saturating_sub(paste_button_width + 5)) / 2; let paste_button = Button::new(paste_x, 0, paste_label);
let clear_label = "X".to_string();
let clear_clipboard_button = Button::new(paste_x + paste_button_width, 0, clear_label);
let copy_label = "Copy".to_string();
let copy_button = Button::new(0, 0, copy_label);
let clear_selection_label = "X".to_string();
let clear_selection_button = Button::new(0, 0, clear_selection_label);
let exit_button = Button::new(0, 0, "Exit".to_string());
let auto_tiling_text = if auto_tiling_on_startup {
"█ on] Auto Tiling"
} else {
"off ░] Auto Tiling"
};
let auto_tiling_button = Button::new(1, rows - 1, auto_tiling_text.to_string());
let context_menu = ContextMenu::new(0, 0);
let taskbar_menu = ContextMenu::new_taskbar_menu(0, 0);
let system_menu = ContextMenu::new_system_menu(0, 1, 10, charset);
Self {
active_prompt: None,
active_calendar: None,
active_config_window: None,
active_help_window: None,
active_about_window: None,
active_winmode_help_window: None,
active_slight_input: None,
active_error_dialog: None,
active_toast: None,
context_menu,
taskbar_menu,
taskbar_menu_window_id: None,
system_menu,
new_terminal_button,
paste_button,
clear_clipboard_button,
copy_button,
clear_selection_button,
exit_button,
top_bar: {
let mut tb = TopBar::new(config.show_date_in_clock);
tb.configure_network(&config.network_interface, config.network_widget_enabled);
tb
},
battery_hovered: false,
auto_tiling_button,
auto_tiling_enabled: auto_tiling_on_startup,
tint_terminal,
selection_active: false,
last_click_time: None,
last_click_pos: None,
click_count: 0,
auto_scroll_direction: None,
last_auto_scroll_time: None,
should_exit: false,
should_kill_daemon: false,
keyboard_mode: KeyboardMode::Normal,
move_state: MovementState::new(),
resize_state: MovementState::new(),
last_backtick_time: None,
show_window_number_overlay: false,
lockscreen: LockScreen::new_with_mode(
config.lockscreen_auth_mode,
config.lockscreen_pin_hash.clone(),
config.lockscreen_salt.clone(),
),
active_pin_setup: None,
}
}
pub fn start_pin_setup(&mut self, salt: String) {
self.active_pin_setup = Some(PinSetupDialog::new(salt));
}
pub fn update_lockscreen_auth(&mut self, config: &AppConfig) {
self.lockscreen.update_auth_mode(
config.lockscreen_auth_mode,
config.lockscreen_pin_hash.clone(),
config.lockscreen_salt.clone(),
);
}
pub fn update_button_states(
&mut self,
cols: u16,
has_clipboard_content: bool,
has_selection: bool,
) {
self.paste_button.enabled = has_clipboard_content;
self.clear_clipboard_button.enabled = has_clipboard_content;
self.copy_button.enabled = has_selection;
self.clear_selection_button.enabled = has_selection;
let exit_button_width = self.exit_button.width();
self.exit_button.x = cols.saturating_sub(exit_button_width + 34);
self.exit_button.y = 0;
let paste_width = self.paste_button.width();
let clear_clip_width = self.clear_clipboard_button.width();
let copy_width = self.copy_button.width();
let clear_sel_width = self.clear_selection_button.width();
let paste_clear_total_width = paste_width + clear_clip_width;
let paste_x = (cols.saturating_sub(paste_clear_total_width)) / 2;
self.paste_button.x = paste_x;
self.clear_clipboard_button.x = paste_x + paste_width;
if has_selection && has_clipboard_content {
let copy_clear_sel_width = copy_width + clear_sel_width;
let total_width = copy_clear_sel_width + 1 + paste_clear_total_width; let start_x = (cols.saturating_sub(total_width)) / 2;
self.copy_button.x = start_x;
self.clear_selection_button.x = start_x + copy_width;
self.paste_button.x = start_x + copy_clear_sel_width + 1;
self.clear_clipboard_button.x = self.paste_button.x + paste_width;
} else if has_selection {
let copy_clear_sel_width = copy_width + clear_sel_width;
let start_x = (cols.saturating_sub(copy_clear_sel_width)) / 2;
self.copy_button.x = start_x;
self.clear_selection_button.x = start_x + copy_width;
}
}
pub fn update_auto_tiling_button_position(&mut self, rows: u16) {
self.auto_tiling_button.y = rows - 1;
}
}