yazi/yazi-core/src/proxy.rs
2026-06-18 15:06:31 +08:00

59 lines
1.4 KiB
Rust

use mlua::ObjectLike;
use yazi_binding::Error;
use yazi_config::LAYOUT;
use yazi_macro::{emit, relay};
use yazi_runner::previewer::PeekJob;
use yazi_scheduler::TaskSummary;
use yazi_shared::url::AsUrl;
use yazi_widgets::Renderable;
use crate::{app::PluginOpt, tab::PreviewLock};
pub struct AppProxy;
impl AppProxy {
pub fn plugin(opt: PluginOpt) {
emit!(Call(relay!(app:plugin).with_any("opt", opt)));
}
pub fn plugin_peek(job: PeekJob) {
let name = job.previewer.name.clone();
Self::plugin(PluginOpt::new_callback(name, move |_, plugin| plugin.call_method("peek", job)));
}
pub fn update_progress(summary: TaskSummary) {
emit!(Call(relay!(app:update_progress).with_any("summary", summary)));
}
}
// --- Mgr
pub struct MgrProxy;
impl MgrProxy {
pub fn update_paged_by<U>(page: usize, only_if: U)
where
U: AsUrl,
{
emit!(Call(relay!(mgr:update_paged, [page]).with("only-if", only_if.as_url())));
}
pub fn update_peeked(lock: PreviewLock) {
emit!(Call(relay!(mgr:update_peeked).with_any("lock", lock)));
}
pub fn update_peeked_error(job: PeekJob, error: String) {
let area = LAYOUT.get().preview;
Self::update_peeked(PreviewLock {
url: job.file.url,
cha: job.file.cha,
mime: job.mime,
skip: job.skip,
area: area.into(),
data: vec![
Renderable::Clear(Default::default()).with_area(area),
Renderable::from(Error::custom(error)).with_area(area),
],
});
}
}