From 4ad1479217cc39fa0d8e62c829b5abe0dec67eda Mon Sep 17 00:00:00 2001 From: Mika Vilpas Date: Mon, 12 Aug 2024 19:21:22 +0300 Subject: [PATCH] feat: send DDS message on tab-switch Solves https://github.com/sxyazi/yazi/issues/1396 --- yazi-core/src/manager/commands/tab_switch.rs | 4 +++ yazi-dds/src/body/body.rs | 7 ++++- yazi-dds/src/body/mod.rs | 2 ++ yazi-dds/src/body/tab.rs | 30 ++++++++++++++++++++ yazi-dds/src/payload.rs | 1 + yazi-dds/src/pubsub.rs | 14 ++++++++- 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 yazi-dds/src/body/tab.rs diff --git a/yazi-core/src/manager/commands/tab_switch.rs b/yazi-core/src/manager/commands/tab_switch.rs index b07ee6bd..dd6a8fb3 100644 --- a/yazi-core/src/manager/commands/tab_switch.rs +++ b/yazi-core/src/manager/commands/tab_switch.rs @@ -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); } } diff --git a/yazi-dds/src/body/body.rs b/yazi-dds/src/body/body.rs index ff123996..d2eaccd8 100644 --- a/yazi-dds/src/body/body.rs +++ b/yazi-dds/src/body/body.rs @@ -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), diff --git a/yazi-dds/src/body/mod.rs b/yazi-dds/src/body/mod.rs index 549d31e0..4e4138bb 100644 --- a/yazi-dds/src/body/mod.rs +++ b/yazi-dds/src/body/mod.rs @@ -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::*; diff --git a/yazi-dds/src/body/tab.rs b/yazi-dds/src/body/tab.rs new file mode 100644 index 00000000..1a99657c --- /dev/null +++ b/yazi-dds/src/body/tab.rs @@ -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 for Body<'a> { + fn from(value: BodyTabSwitch) -> Self { Self::TabSwitch(value) } +} + +impl IntoLua<'_> for BodyTabSwitch { + fn into_lua(self, lua: &Lua) -> mlua::Result { + lua.create_table_from([("tab", self.tab)])?.into_lua(lua) + } +} diff --git a/yazi-dds/src/payload.rs b/yazi-dds/src/payload.rs index 3b385506..54e36b73 100644 --- a/yazi-dds/src/payload.rs +++ b/yazi-dds/src/payload.rs @@ -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), diff --git a/yazi-dds/src/pubsub.rs b/yazi-dds/src/pubsub.rs index 845df3e2..77e9e935 100644 --- a/yazi-dds/src/pubsub.rs +++ b/yazi-dds/src/pubsub.rs @@ -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>>>> = 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));