Add channel_modal file

Mikayla Maki created

Change summary

crates/collab_ui/src/panel/channel_modal.rs | 95 +++++++++++++++++++++++
1 file changed, 95 insertions(+)

Detailed changes

crates/collab_ui/src/panel/channel_modal.rs 🔗

@@ -0,0 +1,95 @@
+use editor::Editor;
+use gpui::{elements::*, AnyViewHandle, Entity, View, ViewContext, ViewHandle, AppContext};
+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,
+    input_editor: ViewHandle<Editor>,
+}
+
+pub enum Event {
+    Dismiss,
+}
+
+impl Entity for ChannelModal {
+    type Event = Event;
+}
+
+impl ChannelModal {
+    pub fn new(cx: &mut ViewContext<Self>) -> Self {
+        let input_editor = cx.add_view(|cx| {
+            let mut editor = Editor::single_line(None, cx);
+            editor.set_placeholder_text("Create or add a channel", cx);
+            editor
+        });
+
+        ChannelModal {
+            has_focus: false,
+            input_editor,
+        }
+    }
+
+    pub fn cancel(&mut self, _: &Cancel, cx: &mut ViewContext<Self>) {
+        self.dismiss(cx);
+    }
+
+    fn dismiss(&mut self, cx: &mut ViewContext<Self>) {
+        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<Self> {
+        let style = theme::current(cx).editor.hint_diagnostic.message.clone();
+        let modal_container = theme::current(cx).picker.container.clone();
+
+        enum ChannelModal {}
+        MouseEventHandler::<ChannelModal, _>::new(0, cx, |_, cx| {
+            Flex::column()
+                .with_child(ChildView::new(self.input_editor.as_any(), cx))
+                .with_child(Label::new("ADD OR BROWSE CHANNELS HERE", style))
+                .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>) {
+        self.has_focus = true;
+        if cx.is_self_focused() {
+            cx.focus(&self.input_editor);
+        }
+    }
+
+    fn focus_out(&mut self, _: AnyViewHandle, _: &mut ViewContext<Self>) {
+        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,
+        }
+    }
+}