Add user-defined context actions

This commit is contained in:
darkfated 2026-04-06 06:16:27 +03:00
parent 23b5d98dcc
commit 39281a6336
8 changed files with 305 additions and 9 deletions

View file

@ -45,7 +45,7 @@ use crate::{
Action, ContextPage, Message as AppMessage, PreviewItem, PreviewKind, REPLACE_BUTTON_ID,
},
config::{Config, DialogConfig, Favorite, TIME_CONFIG_ID, ThumbCfg, TimeConfig, TypeToSearch},
fl, home_dir,
context_action, fl, home_dir,
key_bind::key_binds,
localize::LANGUAGE_SORTER,
menu,
@ -441,8 +441,17 @@ impl<M: Send + 'static> Dialog<M> {
#[derive(Clone, Debug)]
enum DialogPage {
NewFolder { parent: PathBuf, name: String },
Replace { filename: String },
NewFolder {
parent: PathBuf,
name: String,
},
RunContextAction {
action: usize,
paths: Box<[PathBuf]>,
},
Replace {
filename: String,
},
}
#[derive(Clone, Debug)]
@ -1203,6 +1212,21 @@ impl Application for App {
.spacing(space_xxs),
)
}
DialogPage::RunContextAction { action, paths } => {
let name = context_action::action_name(&self.flags.config.context_actions, *action)
.unwrap_or_else(|| fl!("context-action"));
widget::dialog()
.title(fl!("context-action-confirm-title", name = name))
.body(fl!("context-action-confirm-warning", items = paths.len()))
.icon(widget::icon::from_name("dialog-error").size(64))
.primary_action(
widget::button::suggested(fl!("run")).on_press(Message::DialogComplete),
)
.secondary_action(
widget::button::standard(fl!("cancel")).on_press(Message::DialogCancel),
)
}
DialogPage::Replace { filename } => widget::dialog()
.title(fl!("replace-title", filename = filename.as_str()))
.icon(widget::icon::from_name("dialog-question").size(64))
@ -1425,6 +1449,9 @@ impl Application for App {
}
}
}
DialogPage::RunContextAction { action, paths } => {
context_action::run(&self.flags.config.context_actions, action, &paths);
}
DialogPage::Replace { .. } => {
return self.update(Message::Save(true));
}
@ -1831,6 +1858,7 @@ impl Application for App {
&app.key_binds,
&app.modifiers,
false, // Paste not used in dialogs
&app.flags.config.context_actions,
)
.map(Message::TabMessage)
.map(cosmic::Action::App),
@ -1851,6 +1879,28 @@ impl Application for App {
}
}
}
tab::Command::RunContextAction(action) => {
let paths: Box<[_]> = self
.tab
.selected_locations()
.into_iter()
.filter_map(Location::into_path_opt)
.collect();
if let Some(preset) = self.flags.config.context_actions.get(action) {
if preset.confirm {
self.dialog_pages
.push_back(DialogPage::RunContextAction { action, paths });
} else {
context_action::run(
&self.flags.config.context_actions,
action,
&paths,
);
}
} else {
log::warn!("invalid context action index `{action}`");
}
}
tab::Command::Iced(iced_command) => {
commands.push(iced_command.0.map(|tab_message| {
cosmic::action::app(Message::TabMessage(tab_message))
@ -2024,7 +2074,12 @@ impl Application for App {
col = col.push(
self.tab
.view(&self.key_binds, &self.modifiers, false)
.view(
&self.key_binds,
&self.modifiers,
false,
&self.flags.config.context_actions,
)
.map(Message::TabMessage),
);