use std::borrow::Borrow;
use std::path;
use anyhow::{Context, Result};
use crate::app::Status;
use crate::app::Tab;
use crate::common::LAZYGIT;
use crate::common::NCDU;
use crate::common::{is_program_in_path, open_in_current_neovim};
use crate::common::{CONFIG_PATH, GIO};
use crate::config::Bindings;
use crate::config::START_FOLDER;
use crate::io::execute_without_output_with_path;
use crate::io::read_log;
use crate::log_info;
use crate::log_line;
use crate::modes::help_string;
use crate::modes::lsblk_and_cryptsetup_installed;
use crate::modes::open_tui_program;
use crate::modes::Content;
use crate::modes::Display;
use crate::modes::Edit;
use crate::modes::InputCompleted;
use crate::modes::InputSimple;
use crate::modes::LeaveMode;
use crate::modes::MarkAction;
use crate::modes::Mocp;
use crate::modes::Navigate;
use crate::modes::NeedConfirmation;
use crate::modes::Preview;
use crate::modes::RemovableDevices;
use crate::modes::Selectable;
use crate::modes::MOCP;
/// Links events from tuikit to custom actions.
/// It mutates `Status` or its children `Tab`.
pub struct EventAction {}
impl EventAction {
/// Once a quit event is received, we change a flag and break the main loop.
/// It's usefull to reset the cursor before leaving the application.
pub fn quit(status: &mut Status) -> Result<()> {
status.internal_settings.must_quit = true;
Ok(())
}
/// Refresh the current view, reloading the files. Move the selection to top.
pub fn refresh_view(status: &mut Status) -> Result<()> {
status.refresh_view()
}
/// Refresh the view if files were modified in current directory.
pub fn refresh_if_needed(tab: &mut Tab) -> Result<()> {
tab.refresh_if_needed()
}
pub fn resize(status: &mut Status, width: usize, height: usize) -> Result<()> {
status.resize(width, height)
}
/// Leave current mode to normal mode.
/// Reset the inputs and completion, reset the window, exit the preview.
pub fn reset_mode(status: &mut Status) -> Result<()> {
if !matches!(status.current_tab().edit_mode, Edit::Nothing) {
if status.reset_edit_mode()? {
status.tabs[status.index].refresh_view()?;
} else {
status.tabs[status.index].refresh_params()?;
}
} else if matches!(
status.current_tab().display_mode,
Display::Preview | Display::Flagged
) {
status.tabs[status.index].set_display_mode(Display::Directory);
status.tabs[status.index].refresh_view()?;
}
status.menu.input.reset();
status.menu.completion.reset();
Ok(())
}
/// Toggle between a full display (aka ls -lah) or a simple mode (only the
/// filenames).
pub fn toggle_display_full(status: &mut Status) -> Result<()> {
status.display_settings.toggle_metadata();