mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: send DDS message on tab-switch
Solves https://github.com/sxyazi/yazi/issues/1396
This commit is contained in:
parent
71d6b0d9f2
commit
4ad1479217
6 changed files with 56 additions and 2 deletions
|
|
@ -1,3 +1,4 @@
|
|||
use yazi_dds::Pubsub;
|
||||
use yazi_shared::{event::{Cmd, Data}, render};
|
||||
|
||||
use crate::manager::Tabs;
|
||||
|
|
@ -28,5 +29,8 @@ impl Tabs {
|
|||
|
||||
self.set_idx(idx);
|
||||
render!();
|
||||
|
||||
// Publish through DDS
|
||||
Pubsub::pub_from_tab_switch(self.active().idx);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use anyhow::{bail, Result};
|
|||
use mlua::{ExternalResult, IntoLua, Lua, Value};
|
||||
use serde::Serialize;
|
||||
|
||||
use super::{BodyBulk, BodyBye, BodyCd, BodyCustom, BodyDelete, BodyHey, BodyHi, BodyHover, BodyMove, BodyRename, BodyTrash, BodyYank};
|
||||
use super::{BodyBulk, BodyBye, BodyCd, BodyCustom, BodyDelete, BodyHey, BodyHi, BodyHover, BodyMove, BodyRename, BodyTabSwitch, BodyTrash, BodyYank};
|
||||
use crate::Payload;
|
||||
|
||||
#[derive(Debug, Serialize)]
|
||||
|
|
@ -13,6 +13,7 @@ pub enum Body<'a> {
|
|||
Bye(BodyBye),
|
||||
Cd(BodyCd<'a>),
|
||||
Hover(BodyHover<'a>),
|
||||
TabSwitch(BodyTabSwitch),
|
||||
Rename(BodyRename<'a>),
|
||||
Bulk(BodyBulk<'a>),
|
||||
Yank(BodyYank<'a>),
|
||||
|
|
@ -30,6 +31,7 @@ impl Body<'static> {
|
|||
"bye" => Self::Bye(serde_json::from_str(body)?),
|
||||
"cd" => Self::Cd(serde_json::from_str(body)?),
|
||||
"hover" => Self::Hover(serde_json::from_str(body)?),
|
||||
"tab-switch" => Self::TabSwitch(serde_json::from_str(body)?),
|
||||
"rename" => Self::Rename(serde_json::from_str(body)?),
|
||||
"bulk" => Self::Bulk(serde_json::from_str(body)?),
|
||||
"@yank" => Self::Yank(serde_json::from_str(body)?),
|
||||
|
|
@ -53,6 +55,7 @@ impl Body<'static> {
|
|||
| "bye"
|
||||
| "cd"
|
||||
| "hover"
|
||||
| "tab-switch"
|
||||
| "rename"
|
||||
| "bulk"
|
||||
| "@yank"
|
||||
|
|
@ -84,6 +87,7 @@ impl<'a> Body<'a> {
|
|||
Self::Bye(_) => "bye",
|
||||
Self::Cd(_) => "cd",
|
||||
Self::Hover(_) => "hover",
|
||||
Self::TabSwitch(_) => "tab-switch",
|
||||
Self::Rename(_) => "rename",
|
||||
Self::Bulk(_) => "bulk",
|
||||
Self::Yank(_) => "@yank",
|
||||
|
|
@ -111,6 +115,7 @@ impl IntoLua<'_> for Body<'static> {
|
|||
Self::Bye(b) => b.into_lua(lua),
|
||||
Self::Cd(b) => b.into_lua(lua),
|
||||
Self::Hover(b) => b.into_lua(lua),
|
||||
Self::TabSwitch(b) => b.into_lua(lua),
|
||||
Self::Rename(b) => b.into_lua(lua),
|
||||
Self::Bulk(b) => b.into_lua(lua),
|
||||
Self::Yank(b) => b.into_lua(lua),
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ mod hi;
|
|||
mod hover;
|
||||
mod move_;
|
||||
mod rename;
|
||||
mod tab;
|
||||
mod trash;
|
||||
mod yank;
|
||||
|
||||
|
|
@ -25,5 +26,6 @@ pub use hi::*;
|
|||
pub use hover::*;
|
||||
pub use move_::*;
|
||||
pub use rename::*;
|
||||
pub use tab::*;
|
||||
pub use trash::*;
|
||||
pub use yank::*;
|
||||
|
|
|
|||
30
yazi-dds/src/body/tab.rs
Normal file
30
yazi-dds/src/body/tab.rs
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
use mlua::{IntoLua, Lua, Value};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use super::Body;
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub struct BodyTabSwitch {
|
||||
/// The index of the tab
|
||||
pub tab: usize,
|
||||
}
|
||||
|
||||
impl<'a> BodyTabSwitch {
|
||||
#[inline]
|
||||
pub fn borrowed(tab: usize) -> Body<'a> { Self { tab }.into() }
|
||||
}
|
||||
|
||||
impl BodyTabSwitch {
|
||||
#[inline]
|
||||
pub fn dummy(tab: usize) -> Body<'static> { Self { tab }.into() }
|
||||
}
|
||||
|
||||
impl<'a> From<BodyTabSwitch> for Body<'a> {
|
||||
fn from(value: BodyTabSwitch) -> Self { Self::TabSwitch(value) }
|
||||
}
|
||||
|
||||
impl IntoLua<'_> for BodyTabSwitch {
|
||||
fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
|
||||
lua.create_table_from([("tab", self.tab)])?.into_lua(lua)
|
||||
}
|
||||
}
|
||||
|
|
@ -82,6 +82,7 @@ impl Display for Payload<'_> {
|
|||
Body::Bye(b) => serde_json::to_string(b),
|
||||
Body::Cd(b) => serde_json::to_string(b),
|
||||
Body::Hover(b) => serde_json::to_string(b),
|
||||
Body::TabSwitch(b) => serde_json::to_string(b),
|
||||
Body::Rename(b) => serde_json::to_string(b),
|
||||
Body::Bulk(b) => serde_json::to_string(b),
|
||||
Body::Yank(b) => serde_json::to_string(b),
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ use parking_lot::RwLock;
|
|||
use yazi_boot::BOOT;
|
||||
use yazi_shared::{fs::Url, RoCell};
|
||||
|
||||
use crate::{body::{Body, BodyBulk, BodyCd, BodyDelete, BodyHi, BodyHover, BodyMove, BodyMoveItem, BodyRename, BodyTrash, BodyYank}, Client, ID, PEERS};
|
||||
use crate::{body::{Body, BodyBulk, BodyCd, BodyDelete, BodyHi, BodyHover, BodyMove, BodyMoveItem, BodyRename, BodyTabSwitch, BodyTrash, BodyYank}, Client, ID, PEERS};
|
||||
|
||||
pub static LOCAL: RoCell<RwLock<HashMap<String, HashMap<String, Function<'static>>>>> =
|
||||
RoCell::new();
|
||||
|
|
@ -112,6 +112,18 @@ impl Pubsub {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn pub_from_tab_switch(tab: usize) {
|
||||
if LOCAL.read().contains_key("tab-switch") {
|
||||
Self::pub_(BodyTabSwitch::dummy(tab));
|
||||
}
|
||||
if PEERS.read().values().any(|p| p.able("tab-switch")) {
|
||||
Client::push(BodyTabSwitch::borrowed(tab));
|
||||
}
|
||||
if BOOT.local_events.contains("tab-switch") {
|
||||
BodyTabSwitch::borrowed(tab).with_receiver(*ID).flush();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn pub_from_rename(tab: usize, from: &Url, to: &Url) {
|
||||
if LOCAL.read().contains_key("rename") {
|
||||
Self::pub_(BodyRename::dummy(tab, from, to));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue