Add tooltips and actions for opening notes+call from chat

No keyboard shortcut yet.
This commit is contained in:
Max Brunsfeld 2023-09-14 18:38:37 -07:00
parent b75971196f
commit 6ce672fb32
2 changed files with 61 additions and 17 deletions

View file

@ -43,6 +43,7 @@ pub struct ChatPanel {
width: Option<f32>,
pending_serialization: Task<Option<()>>,
subscriptions: Vec<gpui::Subscription>,
workspace: WeakViewHandle<Workspace>,
has_focus: bool,
}
@ -58,11 +59,16 @@ pub enum Event {
Dismissed,
}
actions!(chat_panel, [LoadMoreMessages, ToggleFocus]);
actions!(
chat_panel,
[LoadMoreMessages, ToggleFocus, OpenChannelNotes, JoinCall]
);
pub fn init(cx: &mut AppContext) {
cx.add_action(ChatPanel::send);
cx.add_action(ChatPanel::load_more_messages);
cx.add_action(ChatPanel::open_notes);
cx.add_action(ChatPanel::join_call);
}
impl ChatPanel {
@ -93,7 +99,6 @@ impl ChatPanel {
ix,
item_type,
is_hovered,
&theme::current(cx).chat_panel,
workspace,
cx,
)
@ -131,6 +136,7 @@ impl ChatPanel {
local_timezone: cx.platform().local_timezone(),
has_focus: false,
subscriptions: Vec::new(),
workspace: workspace_handle,
width: None,
};
@ -371,22 +377,22 @@ impl ChatPanel {
ix: usize,
item_type: ItemType,
is_hovered: bool,
theme: &theme::ChatPanel,
workspace: WeakViewHandle<Workspace>,
cx: &mut ViewContext<Select>,
) -> AnyElement<Select> {
enum ChannelNotes {}
enum JoinCall {}
let theme = theme::current(cx);
let tooltip_style = &theme.tooltip;
let theme = &theme.chat_panel;
let style = match (&item_type, is_hovered) {
(ItemType::Header, _) => &theme.channel_select.header,
(ItemType::Selected, _) => &theme.channel_select.active_item,
(ItemType::Unselected, false) => &theme.channel_select.item,
(ItemType::Unselected, true) => &theme.channel_select.hovered_item,
};
let channel = &channel_store.read(cx).channel_at_index(ix).unwrap().1;
let channel_id = channel.id;
let style = &theme.channel_select;
let style = match (&item_type, is_hovered) {
(ItemType::Header, _) => &style.header,
(ItemType::Selected, _) => &style.active_item,
(ItemType::Unselected, false) => &style.item,
(ItemType::Unselected, true) => &style.hovered_item,
};
let mut row = Flex::row()
.with_child(
Label::new("#".to_string(), style.hash.text.clone())
@ -397,7 +403,7 @@ impl ChatPanel {
if matches!(item_type, ItemType::Header) {
row.add_children([
MouseEventHandler::new::<ChannelNotes, _>(0, cx, |mouse_state, _| {
MouseEventHandler::new::<OpenChannelNotes, _>(0, cx, |mouse_state, _| {
render_icon_button(
theme.icon_button.style_for(mouse_state),
"icons/radix/file.svg",
@ -408,8 +414,15 @@ impl ChatPanel {
ChannelView::deploy(channel_id, workspace, cx);
}
})
.with_tooltip::<OpenChannelNotes>(
channel_id as usize,
"Open Notes",
Some(Box::new(OpenChannelNotes)),
tooltip_style.clone(),
cx,
)
.flex_float(),
MouseEventHandler::new::<JoinCall, _>(0, cx, |mouse_state, _| {
MouseEventHandler::new::<ActiveCall, _>(0, cx, |mouse_state, _| {
render_icon_button(
theme.icon_button.style_for(mouse_state),
"icons/radix/speaker-loud.svg",
@ -420,6 +433,13 @@ impl ChatPanel {
.update(cx, |call, cx| call.join_channel(channel_id, cx))
.detach_and_log_err(cx);
})
.with_tooltip::<ActiveCall>(
channel_id as usize,
"Join Call",
Some(Box::new(JoinCall)),
tooltip_style.clone(),
cx,
)
.flex_float(),
]);
}
@ -523,6 +543,24 @@ impl ChatPanel {
})
})
}
fn open_notes(&mut self, _: &OpenChannelNotes, cx: &mut ViewContext<Self>) {
if let Some((chat, _)) = &self.active_chat {
let channel_id = chat.read(cx).channel().id;
if let Some(workspace) = self.workspace.upgrade(cx) {
ChannelView::deploy(channel_id, workspace, cx);
}
}
}
fn join_call(&mut self, _: &JoinCall, cx: &mut ViewContext<Self>) {
if let Some((chat, _)) = &self.active_chat {
let channel_id = chat.read(cx).channel().id;
ActiveCall::global(cx)
.update(cx, |call, cx| call.join_channel(channel_id, cx))
.detach_and_log_err(cx);
}
}
}
impl Entity for ChatPanel {