1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
use strum_macros::{Display, EnumString};

use crate::event_exec::EventExec;
use crate::fm_error::FmResult;
use crate::status::Status;

/// Different kind of action which can be mapped to a key.
/// All those actions are mapped to a key and this enum
/// makes the junction between received Key events and
/// actions in the application.
#[derive(Clone, Debug, Display, EnumString)]
pub enum ActionMap {
    Back,
    BackTab,
    Backspace,
    Bulkrename,
    Chmod,
    ClearFlags,
    CopyFilename,
    CopyFilepath,
    CopyPaste,
    CutPaste,
    Delete,
    DeleteFile,
    DisplayFull,
    DragNDrop,
    End,
    Enter,
    Exec,
    Filter,
    FlagAll,
    FuzzyFind,
    Goto,
    Help,
    History,
    Home,
    Jump,
    KeyHome,
    MarksJump,
    MarksNew,
    ModeNormal,
    MoveDown,
    MoveLeft,
    MoveRight,
    MoveUp,
    NewDir,
    NewFile,
    Nothing,
    NvimFilepicker,
    OpenFile,
    PageDown,
    PageUp,
    Preview,
    Quit,
    RefreshView,
    RegexMatch,
    Rename,
    ReverseFlags,
    Search,
    SearchNext,
    Shell,
    Shortcut,
    Sort,
    Symlink,
    Tab,
    Thumbnail,
    ToggleDualPane,
    ToggleFlag,
    ToggleHidden,
    TrashMoveFile,
    TrashRestoreFile,
    TrashEmpty,
    TrashOpen,
}

impl ActionMap {
    /// Makes the junction between `Actions` and `Events`.
    /// Every Action links to a different `EventExec` method.
    pub fn matcher(&self, status: &mut Status) -> FmResult<()> {
        let current_tab = status.selected();
        match *self {
            ActionMap::Back => EventExec::event_back(current_tab),
            ActionMap::BackTab => EventExec::backtab(status),
            ActionMap::Backspace => EventExec::event_backspace(status),
            ActionMap::Bulkrename => EventExec::event_bulkrename(status),
            ActionMap::Chmod => EventExec::event_chmod(status),
            ActionMap::ClearFlags => EventExec::event_clear_flags(status),
            ActionMap::CopyFilename => EventExec::event_copy_filename(status),
            ActionMap::CopyFilepath => EventExec::event_copy_filepath(status),
            ActionMap::CopyPaste => EventExec::event_copy_paste(status),
            ActionMap::CutPaste => EventExec::event_cut_paste(status),
            ActionMap::Delete => EventExec::event_delete(status),
            ActionMap::DeleteFile => EventExec::event_delete_file(status),
            ActionMap::DisplayFull => EventExec::event_toggle_display_full(status),
            ActionMap::DragNDrop => EventExec::event_drag_n_drop(status),
            ActionMap::End => EventExec::event_end(status),
            ActionMap::Enter => EventExec::enter(status),
            ActionMap::Exec => EventExec::event_exec(current_tab),
            ActionMap::Filter => EventExec::event_filter(current_tab),
            ActionMap::FlagAll => EventExec::event_flag_all(status),
            ActionMap::FuzzyFind => EventExec::event_fuzzyfind(status),
            ActionMap::Goto => EventExec::event_goto(current_tab),
            ActionMap::Help => EventExec::event_help(status),
            ActionMap::History => EventExec::event_history(current_tab),
            ActionMap::Home => EventExec::event_home(current_tab),
            ActionMap::Jump => EventExec::event_jump(status),
            ActionMap::KeyHome => EventExec::event_key_home(status),
            ActionMap::MarksJump => EventExec::event_marks_jump(status),
            ActionMap::MarksNew => EventExec::event_marks_new(current_tab),
            ActionMap::ModeNormal => EventExec::event_normal(current_tab),
            ActionMap::MoveDown => EventExec::event_move_down(status),
            ActionMap::MoveLeft => EventExec::event_move_left(status),
            ActionMap::MoveRight => EventExec::event_move_right(status),
            ActionMap::MoveUp => EventExec::event_move_up(status),
            ActionMap::NewDir => EventExec::event_new_dir(current_tab),
            ActionMap::NewFile => EventExec::event_new_file(current_tab),
            ActionMap::NvimFilepicker => EventExec::event_nvim_filepicker(current_tab),
            ActionMap::OpenFile => EventExec::event_open_file(status),
            ActionMap::PageDown => EventExec::page_down(status),
            ActionMap::PageUp => EventExec::page_up(status),
            ActionMap::Preview => EventExec::event_preview(current_tab),
            ActionMap::Quit => EventExec::event_quit(current_tab),
            ActionMap::RefreshView => EventExec::event_refreshview(status),
            ActionMap::RegexMatch => EventExec::event_regex_match(current_tab),
            ActionMap::Rename => EventExec::event_rename(current_tab),
            ActionMap::ReverseFlags => EventExec::event_reverse_flags(status),
            ActionMap::Search => EventExec::event_search(current_tab),
            ActionMap::SearchNext => EventExec::event_search_next(current_tab),
            ActionMap::Shell => EventExec::event_shell(status),
            ActionMap::Shortcut => EventExec::event_shortcut(current_tab),
            ActionMap::Sort => EventExec::event_sort(current_tab),
            ActionMap::Symlink => EventExec::event_symlink(status),
            ActionMap::Tab => EventExec::tab(status),
            ActionMap::Thumbnail => EventExec::event_thumbnail(current_tab),
            ActionMap::ToggleDualPane => EventExec::event_toggle_dualpane(status),
            ActionMap::ToggleFlag => EventExec::event_toggle_flag(status),
            ActionMap::ToggleHidden => EventExec::event_toggle_hidden(current_tab),
            ActionMap::TrashMoveFile => EventExec::event_trash_move_file(status),
            ActionMap::TrashRestoreFile => EventExec::event_trash_restore_file(status),
            ActionMap::TrashEmpty => EventExec::exec_trash_empty(status),
            ActionMap::TrashOpen => EventExec::event_trash_open(status),

            ActionMap::Nothing => Ok(()),
        }
    }
}