diff --git a/crates/channel/src/channel_store/channel_index.rs b/crates/channel/src/channel_store/channel_index.rs index 1d01d33050740dc4ea5db930f9fd3e763195ac8a..31115854670842e23d276b2f1f4b8229dc68b927 100644 --- a/crates/channel/src/channel_store/channel_index.rs +++ b/crates/channel/src/channel_store/channel_index.rs @@ -134,7 +134,7 @@ impl<'a> ChannelPathsEditGuard<'a> { ix += 2; } else if path.get(0) == Some(&channel_id) { // Clear out any paths that have this chahnnel as their root - self.paths.remove(ix); + self.paths.swap_remove(ix); } else { ix += 1; } diff --git a/crates/collab_ui/src/collab_panel.rs b/crates/collab_ui/src/collab_panel.rs index 4e889d35d49288615f082947a1138083aa9a898f..60372a16375e5436d11522a8adcd762d72ebb357 100644 --- a/crates/collab_ui/src/collab_panel.rs +++ b/crates/collab_ui/src/collab_panel.rs @@ -95,19 +95,19 @@ struct OpenChannelBuffer { channel_id: ChannelId, } -#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] -struct LinkChannel { +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +struct StartMoveChannel { channel_id: ChannelId, + parent_id: Option, } #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] -struct MoveChannel { - channel_id: ChannelId, - parent_id: Option, +struct LinkChannel { + to: ChannelId, } #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] -struct PutChannel { +struct MoveChannel { to: ChannelId, } @@ -141,8 +141,8 @@ impl_actions!( JoinChannelCall, OpenChannelBuffer, LinkChannel, + StartMoveChannel, MoveChannel, - PutChannel, UnlinkChannel ] ); @@ -198,42 +198,40 @@ pub fn init(cx: &mut AppContext) { cx.add_action(CollabPanel::open_channel_buffer); cx.add_action( - |panel: &mut CollabPanel, action: &LinkChannel, _: &mut ViewContext| { - panel.link_or_move = Some(ChannelCopy::Link(action.channel_id)); + |panel: &mut CollabPanel, action: &StartMoveChannel, _: &mut ViewContext| { + dbg!(action); + panel.channel_move = Some(*action); }, ); cx.add_action( - |panel: &mut CollabPanel, action: &MoveChannel, _: &mut ViewContext| { - panel.link_or_move = Some(ChannelCopy::Move { - channel_id: action.channel_id, - parent_id: action.parent_id, - }); + |panel: &mut CollabPanel, action: &LinkChannel, cx: &mut ViewContext| { + if let Some(move_start) = panel.channel_move.take() { + dbg!(action.to, &move_start); + panel.channel_store.update(cx, |channel_store, cx| { + channel_store + .link_channel(move_start.channel_id, action.to, cx) + .detach_and_log_err(cx) + }) + } }, ); cx.add_action( - |panel: &mut CollabPanel, action: &PutChannel, cx: &mut ViewContext| { - if let Some(copy) = panel.link_or_move.take() { - match copy { - ChannelCopy::Move { - channel_id, - parent_id: Some(parent_id), - } => panel.channel_store.update(cx, |channel_store, cx| { + |panel: &mut CollabPanel, action: &MoveChannel, cx: &mut ViewContext| { + if let Some(move_start) = panel.channel_move.take() { + dbg!(&move_start, action.to); + panel.channel_store.update(cx, |channel_store, cx| { + if let Some(parent) = move_start.parent_id { channel_store - .move_channel(channel_id, parent_id, action.to, cx) + .move_channel(move_start.channel_id, parent, action.to, cx) .detach_and_log_err(cx) - }), - ChannelCopy::Link(channel) - | ChannelCopy::Move { - channel_id: channel, - parent_id: None, - } => panel.channel_store.update(cx, |channel_store, cx| { + } else { channel_store - .link_channel(channel, action.to, cx) + .link_channel(move_start.channel_id, action.to, cx) .detach_and_log_err(cx) - }), - } + } + }) } }, ); @@ -270,36 +268,11 @@ impl ChannelEditingState { } } -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -enum ChannelCopy { - Move { - channel_id: u64, - parent_id: Option, - }, - Link(u64), -} - -impl ChannelCopy { - fn channel_id(&self) -> u64 { - match self { - ChannelCopy::Move { channel_id, .. } => *channel_id, - ChannelCopy::Link(channel_id) => *channel_id, - } - } - - fn is_move(&self) -> bool { - match self { - ChannelCopy::Move { .. } => true, - ChannelCopy::Link(_) => false, - } - } -} - pub struct CollabPanel { width: Option, fs: Arc, has_focus: bool, - link_or_move: Option, + channel_move: Option, pending_serialization: Task>, context_menu: ViewHandle, filter_editor: ViewHandle, @@ -562,7 +535,7 @@ impl CollabPanel { let mut this = Self { width: None, has_focus: false, - link_or_move: None, + channel_move: None, fs: workspace.app_state().fs.clone(), pending_serialization: Task::ready(None), context_menu: cx.add_view(|cx| ContextMenu::new(view_id, cx)), @@ -2071,13 +2044,13 @@ impl CollabPanel { ) { self.context_menu_on_selected = position.is_none(); - let operation_details = self.link_or_move.as_ref().and_then(|link_or_move| { + let channel_name = self.channel_move.as_ref().and_then(|channel| { let channel_name = self .channel_store .read(cx) - .channel_for_id(link_or_move.channel_id()) + .channel_for_id(channel.channel_id) .map(|channel| channel.name.clone())?; - Some((channel_name, link_or_move.is_move())) + Some(channel_name) }); self.context_menu.update(cx, |context_menu, cx| { @@ -2089,14 +2062,16 @@ impl CollabPanel { let mut items = Vec::new(); - if let Some((channel_name, is_move)) = operation_details { + if let Some(channel_name) = channel_name { items.push(ContextMenuItem::action( - format!( - "{} '#{}' here", - if is_move { "Move" } else { "Link" }, - channel_name - ), - PutChannel { + format!("Move '#{}' here", channel_name), + MoveChannel { + to: location.channel, + }, + )); + items.push(ContextMenuItem::action( + format!("Link '#{}' here", channel_name), + LinkChannel { to: location.channel, }, )); @@ -2155,15 +2130,9 @@ impl CollabPanel { } items.extend([ - ContextMenuItem::action( - "Link this channel", - LinkChannel { - channel_id: location.channel, - }, - ), ContextMenuItem::action( "Move this channel", - MoveChannel { + StartMoveChannel { channel_id: location.channel, parent_id, },