feat: add new prepend_preloaders, append_preloaders, prepend_previewers, append_previewers config options

This commit is contained in:
sxyazi 2024-01-06 12:58:42 +08:00
parent ac4afaf44e
commit 93c8d90a51
No known key found for this signature in database
4 changed files with 43 additions and 11 deletions

View file

@ -31,23 +31,51 @@ pub struct PluginRule {
impl Default for Plugin {
fn default() -> Self {
#[derive(Deserialize)]
struct Outer {
plugin: Plugin,
struct Shadow {
preloaders: Vec<PluginRule>,
#[serde(default)]
prepend_preloaders: Vec<PluginRule>,
#[serde(default)]
append_preloaders: Vec<PluginRule>,
previewers: Vec<PluginRule>,
#[serde(default)]
prepend_previewers: Vec<PluginRule>,
#[serde(default)]
append_previewers: Vec<PluginRule>,
}
let mut plugin = toml::from_str::<Outer>(&MERGED_YAZI).unwrap().plugin;
if plugin.preloaders.len() > MAX_PRELOADERS as usize {
#[derive(Deserialize)]
struct Outer {
plugin: Shadow,
}
let mut shadow = toml::from_str::<Outer>(&MERGED_YAZI).unwrap().plugin;
shadow.preloaders = shadow
.prepend_preloaders
.into_iter()
.chain(shadow.preloaders)
.chain(shadow.append_preloaders)
.collect();
shadow.previewers = shadow
.prepend_previewers
.into_iter()
.chain(shadow.previewers)
.chain(shadow.append_previewers)
.collect();
if shadow.preloaders.len() > MAX_PRELOADERS as usize {
panic!("Too many preloaders");
}
for (i, preloader) in plugin.preloaders.iter_mut().enumerate() {
for (i, preloader) in shadow.preloaders.iter_mut().enumerate() {
if preloader.sync {
panic!("Preloaders cannot be synchronous");
}
preloader.id = i as u8;
}
plugin
Self { preloaders: shadow.preloaders, previewers: shadow.previewers }
}
}

View file

@ -24,5 +24,7 @@ impl Manager {
self.hover(None);
self.update_paged((), tasks);
tasks.preload_sorted(&self.current().files);
}
}

View file

@ -3,10 +3,10 @@ use std::str::FromStr;
use yazi_config::manager::SortBy;
use yazi_shared::event::Exec;
use crate::{manager::Manager, tab::Tab};
use crate::{manager::Manager, tab::Tab, tasks::Tasks};
impl Tab {
pub fn sort(&mut self, e: &Exec) {
pub fn sort(&mut self, e: &Exec, tasks: &Tasks) {
if let Some(by) = e.args.first() {
self.conf.sort_by = SortBy::from_str(by).unwrap_or_default();
}
@ -16,5 +16,7 @@ impl Tab {
self.apply_files_attrs();
Manager::_update_paged();
tasks.preload_sorted(&self.current.files);
}
}

View file

@ -94,9 +94,9 @@ impl<'a> Executor<'a> {
return self.app.cx.manager.$name(exec, $($args),*);
}
};
(ACTIVE, $name:ident) => {
(ACTIVE, $name:ident $(,$args:expr)*) => {
if exec.cmd == stringify!($name) {
return self.app.cx.manager.active_mut().$name(exec);
return self.app.cx.manager.active_mut().$name(exec, $($args),*);
}
};
(TABS, $name:ident) => {
@ -159,7 +159,7 @@ impl<'a> Executor<'a> {
on!(ACTIVE, find_arrow);
// Sorting
on!(ACTIVE, sort);
on!(ACTIVE, sort, &self.app.cx.tasks);
// Tabs
on!(TABS, create);