editor_pane.rs

 1use std::path::PathBuf;
 2
 3use gpui2::{Div, Render, View, VisualContext};
 4
 5use crate::prelude::*;
 6use crate::{
 7    hello_world_rust_editor_with_status_example, v_stack, Breadcrumb, Buffer, BufferSearch, Icon,
 8    IconButton, IconColor, Symbol, Tab, TabBar, Toolbar,
 9};
10
11#[derive(Clone)]
12pub struct EditorPane {
13    tabs: Vec<Tab>,
14    path: PathBuf,
15    symbols: Vec<Symbol>,
16    buffer: Buffer,
17    buffer_search: View<BufferSearch>,
18    is_buffer_search_open: bool,
19}
20
21impl EditorPane {
22    pub fn new(
23        cx: &mut ViewContext<Self>,
24        tabs: Vec<Tab>,
25        path: PathBuf,
26        symbols: Vec<Symbol>,
27        buffer: Buffer,
28    ) -> Self {
29        Self {
30            tabs,
31            path,
32            symbols,
33            buffer,
34            buffer_search: BufferSearch::view(cx),
35            is_buffer_search_open: false,
36        }
37    }
38
39    pub fn toggle_buffer_search(&mut self, cx: &mut ViewContext<Self>) {
40        self.is_buffer_search_open = !self.is_buffer_search_open;
41
42        cx.notify();
43    }
44
45    pub fn view(cx: &mut WindowContext) -> View<Self> {
46        cx.build_view(|cx| hello_world_rust_editor_with_status_example(cx))
47    }
48}
49
50impl Render for EditorPane {
51    type Element = Div<Self>;
52
53    fn render(&mut self, cx: &mut ViewContext<Self>) -> Div<Self> {
54        v_stack()
55            .w_full()
56            .h_full()
57            .flex_1()
58            .child(TabBar::new("editor-pane-tabs", self.tabs.clone()).can_navigate((false, true)))
59            .child(
60                Toolbar::new()
61                    .left_item(Breadcrumb::new(self.path.clone(), self.symbols.clone()))
62                    .right_items(vec![
63                        IconButton::new("toggle_inlay_hints", Icon::InlayHint),
64                        IconButton::<Self>::new("buffer_search", Icon::MagnifyingGlass)
65                            .when(self.is_buffer_search_open, |this| {
66                                this.color(IconColor::Accent)
67                            })
68                            .on_click(|editor, cx| {
69                                editor.toggle_buffer_search(cx);
70                            }),
71                        IconButton::new("inline_assist", Icon::MagicWand),
72                    ]),
73            )
74            .children(Some(self.buffer_search.clone()).filter(|_| self.is_buffer_search_open))
75            .child(self.buffer.clone())
76    }
77}