mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: auto hover the file after it created (#10)
This commit is contained in:
parent
a42da833fe
commit
f01e1a272f
4 changed files with 26 additions and 12 deletions
|
|
@ -4,7 +4,7 @@ use anyhow::Result;
|
||||||
use crossterm::event::KeyEvent;
|
use crossterm::event::KeyEvent;
|
||||||
use tokio::sync::{mpsc::UnboundedSender, oneshot};
|
use tokio::sync::{mpsc::UnboundedSender, oneshot};
|
||||||
|
|
||||||
use super::{files::FilesOp, input::InputOpt, manager::PreviewData, select::SelectOpt};
|
use super::{files::{File, FilesOp}, input::InputOpt, manager::PreviewData, select::SelectOpt};
|
||||||
use crate::config::{keymap::{Control, KeymapLayer}, open::Opener};
|
use crate::config::{keymap::{Control, KeymapLayer}, open::Opener};
|
||||||
|
|
||||||
static mut TX: Option<UnboundedSender<Event>> = None;
|
static mut TX: Option<UnboundedSender<Event>> = None;
|
||||||
|
|
@ -24,7 +24,7 @@ pub enum Event {
|
||||||
Files(FilesOp),
|
Files(FilesOp),
|
||||||
Pages(usize),
|
Pages(usize),
|
||||||
Mimetype(BTreeMap<PathBuf, String>),
|
Mimetype(BTreeMap<PathBuf, String>),
|
||||||
Hover,
|
Hover(Option<File>),
|
||||||
Preview(PathBuf, PreviewData),
|
Preview(PathBuf, PreviewData),
|
||||||
|
|
||||||
// Input
|
// Input
|
||||||
|
|
@ -88,6 +88,12 @@ macro_rules! emit {
|
||||||
(Mimetype($mimes:expr)) => {
|
(Mimetype($mimes:expr)) => {
|
||||||
$crate::core::Event::Mimetype($mimes).emit();
|
$crate::core::Event::Mimetype($mimes).emit();
|
||||||
};
|
};
|
||||||
|
(Hover) => {
|
||||||
|
$crate::core::Event::Hover(None).emit();
|
||||||
|
};
|
||||||
|
(Hover($file:expr)) => {
|
||||||
|
$crate::core::Event::Hover(Some($file)).emit();
|
||||||
|
};
|
||||||
(Preview($path:expr, $data:expr)) => {
|
(Preview($path:expr, $data:expr)) => {
|
||||||
$crate::core::Event::Preview($path, $data).emit();
|
$crate::core::Event::Preview($path, $data).emit();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -146,19 +146,16 @@ impl Folder {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hover(&mut self, path: &Path) -> bool {
|
pub fn hover(&mut self, path: &Path) -> bool {
|
||||||
if matches!(self.hovered, Some(ref h) if h.path == path) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let new = self.position(path).unwrap_or(self.cursor);
|
let new = self.position(path).unwrap_or(self.cursor);
|
||||||
if new > self.cursor { self.next(new - self.cursor) } else { self.prev(self.cursor - new) }
|
if new > self.cursor { self.next(new - self.cursor) } else { self.prev(self.cursor - new) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hover_force(&mut self, file: File) -> bool {
|
pub fn hover_force(&mut self, file: File) -> bool {
|
||||||
if !self.hover(&file.path) && self.files.is_empty() {
|
if self.hover(&file.path) {
|
||||||
self.hovered = Some(file);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.hovered = Some(file);
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use std::{collections::{BTreeMap, BTreeSet, HashMap, HashSet}, env, mem, path::PathBuf};
|
use std::{collections::{BTreeMap, BTreeSet, HashMap, HashSet}, env, mem, path::PathBuf};
|
||||||
|
|
||||||
|
use anyhow::Error;
|
||||||
use tokio::fs;
|
use tokio::fs;
|
||||||
|
|
||||||
use super::{PreviewData, Tab, Tabs, Watcher};
|
use super::{PreviewData, Tab, Tabs, Watcher};
|
||||||
|
|
@ -179,13 +180,21 @@ impl Manager {
|
||||||
|
|
||||||
if let Ok(name) = result.await {
|
if let Ok(name) = result.await {
|
||||||
let path = cwd.join(&name);
|
let path = cwd.join(&name);
|
||||||
|
let hovered = path.components().take(cwd.components().count() + 1).collect::<PathBuf>();
|
||||||
|
|
||||||
if name.ends_with('/') {
|
if name.ends_with('/') {
|
||||||
fs::create_dir_all(path).await.ok();
|
fs::create_dir_all(path).await?;
|
||||||
} else {
|
} else {
|
||||||
fs::create_dir_all(path.parent().unwrap()).await.ok();
|
fs::create_dir_all(path.parent().unwrap()).await.ok();
|
||||||
fs::File::create(path).await.ok();
|
fs::File::create(path).await?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Ok(file) = File::from(&hovered).await {
|
||||||
|
emit!(Hover(file));
|
||||||
|
emit!(Refresh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Ok::<(), Error>(())
|
||||||
});
|
});
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -125,8 +125,10 @@ impl App {
|
||||||
emit!(Render);
|
emit!(Render);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::Hover => {
|
Event::Hover(file) => {
|
||||||
if manager.preview() {
|
let mut b = file.map(|f| manager.current_mut().hover_force(f)).unwrap_or(false);
|
||||||
|
b |= manager.preview();
|
||||||
|
if b {
|
||||||
emit!(Render);
|
emit!(Render);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue