mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: fine-grained peek and watch (#2655)
This commit is contained in:
parent
8327826217
commit
7169e19ff0
16 changed files with 60 additions and 30 deletions
|
|
@ -1,5 +1,3 @@
|
||||||
use std::collections::HashSet;
|
|
||||||
|
|
||||||
use yazi_dds::Pubsub;
|
use yazi_dds::Pubsub;
|
||||||
use yazi_macro::render;
|
use yazi_macro::render;
|
||||||
use yazi_shared::{Id, event::{CmdCow, Data}, url::{Url, Urn}};
|
use yazi_shared::{Id, event::{CmdCow, Data}, url::{Url, Urn}};
|
||||||
|
|
@ -29,21 +27,8 @@ impl Mgr {
|
||||||
self.current_or_mut(opt.tab).arrow(0);
|
self.current_or_mut(opt.tab).arrow(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Repeek
|
|
||||||
self.peek(false);
|
|
||||||
|
|
||||||
// Refresh watcher
|
// Refresh watcher
|
||||||
let mut to_watch = HashSet::with_capacity(3 * self.tabs.len());
|
self.watch(());
|
||||||
for tab in self.tabs.iter() {
|
|
||||||
to_watch.insert(tab.cwd());
|
|
||||||
if let Some(ref p) = tab.parent {
|
|
||||||
to_watch.insert(&p.url);
|
|
||||||
}
|
|
||||||
if let Some(h) = tab.hovered().filter(|&h| h.is_dir()) {
|
|
||||||
to_watch.insert(&h.url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.watcher.watch(to_watch);
|
|
||||||
|
|
||||||
// Publish through DDS
|
// Publish through DDS
|
||||||
Pubsub::pub_from_hover(self.active().id, self.hovered().map(|h| &h.url));
|
Pubsub::pub_from_hover(self.active().id, self.hovered().map(|h| &h.url));
|
||||||
|
|
|
||||||
|
|
@ -25,5 +25,6 @@ yazi_macro::mod_flat!(
|
||||||
update_paged
|
update_paged
|
||||||
update_tasks
|
update_tasks
|
||||||
update_yanked
|
update_yanked
|
||||||
|
watch
|
||||||
yank
|
yank
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,8 @@ impl Mgr {
|
||||||
self.watcher.trigger_dirs(&[self.current()]);
|
self.watcher.trigger_dirs(&[self.current()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.hover(None);
|
self.watch(());
|
||||||
|
self.peek(false);
|
||||||
self.update_paged((), tasks);
|
self.update_paged((), tasks);
|
||||||
|
|
||||||
tasks.prework_sorted(&self.current().files);
|
tasks.prework_sorted(&self.current().files);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ impl Mgr {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let revision = self.current().files.revision;
|
||||||
let linked: Vec<_> = LINKED.read().from_dir(opt.op.cwd()).map(|u| opt.op.rebase(u)).collect();
|
let linked: Vec<_> = LINKED.read().from_dir(opt.op.cwd()).map(|u| opt.op.rebase(u)).collect();
|
||||||
for op in [opt.op].into_iter().chain(linked) {
|
for op in [opt.op].into_iter().chain(linked) {
|
||||||
self.yanked.apply_op(&op);
|
self.yanked.apply_op(&op);
|
||||||
|
|
@ -29,7 +30,12 @@ impl Mgr {
|
||||||
}
|
}
|
||||||
|
|
||||||
render!(self.yanked.catchup_revision(false));
|
render!(self.yanked.catchup_revision(false));
|
||||||
self.active_mut().apply_files_attrs();
|
if revision != self.current().files.revision {
|
||||||
|
self.active_mut().apply_files_attrs();
|
||||||
|
self.hover(None);
|
||||||
|
self.peek(false);
|
||||||
|
self.update_paged((), tasks);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update_tab(&mut self, op: FilesOp, tasks: &Tasks) {
|
fn update_tab(&mut self, op: FilesOp, tasks: &Tasks) {
|
||||||
|
|
@ -71,8 +77,6 @@ impl Mgr {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.hover(None); // Re-hover
|
|
||||||
self.update_paged((), tasks); // Update for paged files
|
|
||||||
if calc {
|
if calc {
|
||||||
tasks.prework_sorted(&self.current().files);
|
tasks.prework_sorted(&self.current().files);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ impl From<()> for Opt {
|
||||||
|
|
||||||
impl Mgr {
|
impl Mgr {
|
||||||
pub fn update_paged(&mut self, opt: impl TryInto<Opt>, tasks: &Tasks) {
|
pub fn update_paged(&mut self, opt: impl TryInto<Opt>, tasks: &Tasks) {
|
||||||
let Ok(opt) = opt.try_into() else {
|
let Ok(opt): Result<Opt, _> = opt.try_into() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -29,7 +29,9 @@ impl Mgr {
|
||||||
}
|
}
|
||||||
|
|
||||||
let targets = self.current().paginate(opt.page.unwrap_or(self.current().page));
|
let targets = self.current().paginate(opt.page.unwrap_or(self.current().page));
|
||||||
tasks.fetch_paged(targets, &self.mimetype);
|
if !targets.is_empty() {
|
||||||
tasks.preload_paged(targets, &self.mimetype);
|
tasks.fetch_paged(targets, &self.mimetype);
|
||||||
|
tasks.preload_paged(targets, &self.mimetype);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
31
yazi-core/src/mgr/commands/watch.rs
Normal file
31
yazi-core/src/mgr/commands/watch.rs
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
|
use yazi_shared::event::CmdCow;
|
||||||
|
|
||||||
|
use crate::mgr::Mgr;
|
||||||
|
|
||||||
|
struct Opt;
|
||||||
|
|
||||||
|
impl From<CmdCow> for Opt {
|
||||||
|
fn from(_: CmdCow) -> Self { Self }
|
||||||
|
}
|
||||||
|
impl From<()> for Opt {
|
||||||
|
fn from((): ()) -> Self { Self }
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Mgr {
|
||||||
|
#[yazi_codegen::command]
|
||||||
|
pub fn watch(&mut self, _: Opt) {
|
||||||
|
let mut to_watch = HashSet::with_capacity(3 * self.tabs.len());
|
||||||
|
for tab in self.tabs.iter() {
|
||||||
|
to_watch.insert(tab.cwd());
|
||||||
|
if let Some(ref p) = tab.parent {
|
||||||
|
to_watch.insert(&p.url);
|
||||||
|
}
|
||||||
|
if let Some(h) = tab.hovered().filter(|&h| h.is_dir()) {
|
||||||
|
to_watch.insert(&h.url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.watcher.watch(to_watch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -37,6 +37,7 @@ impl Tab {
|
||||||
}
|
}
|
||||||
|
|
||||||
MgrProxy::hover(None, self.id);
|
MgrProxy::hover(None, self.id);
|
||||||
|
MgrProxy::peek(false);
|
||||||
render!();
|
render!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ impl Tab {
|
||||||
self.current.repos(hovered.as_ref());
|
self.current.repos(hovered.as_ref());
|
||||||
if self.hovered().map(|f| f.urn()) != hovered.as_ref().map(|u| u.as_urn()) {
|
if self.hovered().map(|f| f.urn()) != hovered.as_ref().map(|u| u.as_urn()) {
|
||||||
MgrProxy::hover(None, self.id);
|
MgrProxy::hover(None, self.id);
|
||||||
|
MgrProxy::peek(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
render!();
|
render!();
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ impl Tab {
|
||||||
|
|
||||||
if hovered.as_ref() != self.hovered().map(|f| &f.url) {
|
if hovered.as_ref() != self.hovered().map(|f| &f.url) {
|
||||||
MgrProxy::hover(hovered, self.id);
|
MgrProxy::hover(hovered, self.id);
|
||||||
|
MgrProxy::peek(false);
|
||||||
} else if self.hovered().is_some_and(|f| f.is_dir()) {
|
} else if self.hovered().is_some_and(|f| f.is_dir()) {
|
||||||
MgrProxy::peek(true);
|
MgrProxy::peek(true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,9 @@ impl Tab {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.cd(parent.clone());
|
self.cd(parent.clone());
|
||||||
|
// TODO
|
||||||
FilesOp::Creating(parent, vec![File::from_dummy(opt.target.clone(), None)]).emit();
|
FilesOp::Creating(parent, vec![File::from_dummy(opt.target.clone(), None)]).emit();
|
||||||
MgrProxy::hover(Some(opt.target), self.id);
|
MgrProxy::hover(Some(opt.target), self.id);
|
||||||
|
MgrProxy::peek(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ impl Tab {
|
||||||
self.apply_files_attrs();
|
self.apply_files_attrs();
|
||||||
|
|
||||||
MgrProxy::hover(None, self.id);
|
MgrProxy::hover(None, self.id);
|
||||||
|
MgrProxy::peek(false);
|
||||||
MgrProxy::update_paged();
|
MgrProxy::update_paged();
|
||||||
|
|
||||||
tasks.prework_sorted(&self.current.files);
|
tasks.prework_sorted(&self.current.files);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ impl App {
|
||||||
|
|
||||||
self.cx.current_mut().sync_page(true);
|
self.cx.current_mut().sync_page(true);
|
||||||
self.cx.mgr.hover(None);
|
self.cx.mgr.hover(None);
|
||||||
|
self.cx.mgr.peek(false);
|
||||||
self.cx.mgr.parent_mut().map(|f| f.arrow(0));
|
self.cx.mgr.parent_mut().map(|f| f.arrow(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ impl<'a> Executor<'a> {
|
||||||
on!(MGR, update_paged, &self.app.cx.tasks);
|
on!(MGR, update_paged, &self.app.cx.tasks);
|
||||||
on!(MGR, update_yanked);
|
on!(MGR, update_yanked);
|
||||||
on!(MGR, hover);
|
on!(MGR, hover);
|
||||||
|
on!(MGR, watch);
|
||||||
on!(MGR, peek);
|
on!(MGR, peek);
|
||||||
on!(MGR, seek);
|
on!(MGR, seek);
|
||||||
on!(MGR, spot);
|
on!(MGR, spot);
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,6 @@ pub fn compose(lua: &Lua) -> mlua::Result<Value> {
|
||||||
b"Line" => super::Line::compose(lua)?,
|
b"Line" => super::Line::compose(lua)?,
|
||||||
b"List" => super::List::compose(lua)?,
|
b"List" => super::List::compose(lua)?,
|
||||||
b"Pad" => super::Pad::compose(lua, true)?,
|
b"Pad" => super::Pad::compose(lua, true)?,
|
||||||
// TODO: deprecate this
|
|
||||||
b"Padding" => super::Pad::compose(lua, false)?,
|
|
||||||
b"Pos" => super::Pos::compose(lua)?,
|
b"Pos" => super::Pos::compose(lua)?,
|
||||||
b"Rect" => super::Rect::compose(lua)?,
|
b"Rect" => super::Rect::compose(lua)?,
|
||||||
b"Row" => super::Row::compose(lua)?,
|
b"Row" => super::Row::compose(lua)?,
|
||||||
|
|
|
||||||
|
|
@ -71,11 +71,6 @@ impl UserData for Rect {
|
||||||
|
|
||||||
fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
|
fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
|
||||||
methods.add_method("pad", |_, me, pad: Pad| Ok(me.pad(pad)));
|
methods.add_method("pad", |_, me, pad: Pad| Ok(me.pad(pad)));
|
||||||
// TODO: deprecate this
|
|
||||||
methods.add_method("padding", |lua, me, pad: Pad| {
|
|
||||||
crate::deprecate!(lua, "The `padding()` method of `ui.Rect` has been deprecated, please use `pad()` instead, in your {}");
|
|
||||||
Ok(me.pad(pad))
|
|
||||||
});
|
|
||||||
methods.add_method("contains", |_, me, Rect(rect)| Ok(me.contains(rect.into())));
|
methods.add_method("contains", |_, me, Rect(rect)| Ok(me.contains(rect.into())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,11 @@ impl MgrProxy {
|
||||||
emit!(Call(Cmd::args("mgr:hover", &url.map_or_else(Vec::new, |u| vec![u])).with("tab", tab)));
|
emit!(Call(Cmd::args("mgr:hover", &url.map_or_else(Vec::new, |u| vec![u])).with("tab", tab)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn watch() {
|
||||||
|
emit!(Call(Cmd::new("mgr:watch")));
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn refresh() {
|
pub fn refresh() {
|
||||||
emit!(Call(Cmd::new("mgr:refresh")));
|
emit!(Call(Cmd::new("mgr:refresh")));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue