use client::{ChannelId, ChannelStore}; use editor::Editor; use gpui::{ elements::*, AnyViewHandle, AppContext, Entity, ModelHandle, View, ViewContext, ViewHandle, }; use menu::Cancel; use workspace::{item::ItemHandle, Modal}; pub fn init(cx: &mut AppContext) { cx.add_action(ChannelModal::cancel) } pub struct ChannelModal { has_focus: bool, filter_editor: ViewHandle, selection: usize, list_state: ListState, channel_store: ModelHandle, channel_id: ChannelId, } pub enum Event { Dismiss, } impl Entity for ChannelModal { type Event = Event; } impl ChannelModal { pub fn new( channel_id: ChannelId, channel_store: ModelHandle, cx: &mut ViewContext, ) -> Self { let input_editor = cx.add_view(|cx| { let mut editor = Editor::single_line(None, cx); editor.set_placeholder_text("Add a member", cx); editor }); let list_state = ListState::::new(0, Orientation::Top, 1000., move |this, ix, cx| { Empty::new().into_any() }); ChannelModal { has_focus: false, filter_editor: input_editor, selection: 0, list_state, channel_id, channel_store, } } pub fn cancel(&mut self, _: &Cancel, cx: &mut ViewContext) { self.dismiss(cx); } fn dismiss(&mut self, cx: &mut ViewContext) { cx.emit(Event::Dismiss) } } impl View for ChannelModal { fn ui_name() -> &'static str { "Channel Modal" } fn render(&mut self, cx: &mut gpui::ViewContext<'_, '_, Self>) -> gpui::AnyElement { let theme = theme::current(cx).clone(); let style = &theme.collab_panel.modal; let modal_container = theme::current(cx).picker.container.clone(); enum ChannelModal {} MouseEventHandler::::new(0, cx, |_, cx| { Flex::column() .with_child(ChildView::new(self.filter_editor.as_any(), cx)) .with_child( List::new(self.list_state.clone()) .constrained() .with_width(style.width) .flex(1., true) .into_any(), ) .contained() .with_style(modal_container) .constrained() .with_max_width(540.) .with_max_height(420.) }) .on_click(gpui::platform::MouseButton::Left, |_, _, _| {}) // Capture click and down events .on_down_out(gpui::platform::MouseButton::Left, |_, v, cx| v.dismiss(cx)) .into_any_named("channel modal") } fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { self.has_focus = true; if cx.is_self_focused() { cx.focus(&self.filter_editor); } } fn focus_out(&mut self, _: AnyViewHandle, _: &mut ViewContext) { self.has_focus = false; } } impl Modal for ChannelModal { fn has_focus(&self) -> bool { self.has_focus } fn dismiss_on_event(event: &Self::Event) -> bool { match event { Event::Dismiss => true, } } }