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}