mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
42 lines
1.1 KiB
Rust
42 lines
1.1 KiB
Rust
use anyhow::Result;
|
|
use yazi_dds::Pubsub;
|
|
use yazi_macro::{err, render, succ, tab};
|
|
use yazi_parser::mgr::HoverOpt;
|
|
use yazi_shared::{data::Data, url::UrlLike};
|
|
|
|
use crate::{Actor, Ctx};
|
|
|
|
pub struct Hover;
|
|
|
|
impl Actor for Hover {
|
|
type Options = HoverOpt;
|
|
|
|
const NAME: &str = "hover";
|
|
|
|
fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
|
|
let tab = tab!(cx);
|
|
|
|
// Parent should always track CWD
|
|
if let Some(p) = &mut tab.parent {
|
|
render!(p.repos(tab.current.url.try_strip_prefix(&p.url).ok()));
|
|
}
|
|
|
|
// Repos CWD
|
|
render!(tab.current.repos(opt.urn.as_ref().map(Into::into)));
|
|
|
|
// Turn on tracing
|
|
if let (Some(h), Some(u)) = (tab.hovered(), opt.urn)
|
|
&& h.urn() == u
|
|
{
|
|
// `hover(Some)` occurs after user actions, such as create, rename, reveal, etc.
|
|
// At this point, it's intuitive to track the file location regardless.
|
|
tab.current.trace = Some(u.clone());
|
|
// cx.tasks.scheduler.batch.next();// FIXME: clear user action
|
|
}
|
|
|
|
// Publish through DDS
|
|
let tab = tab!(cx);
|
|
err!(Pubsub::pub_after_hover(tab.id, tab.hovered().map(|h| &h.url)));
|
|
succ!();
|
|
}
|
|
}
|