indent_guides.rs

 1use std::ops::Range;
 2
 3use gpui::{Entity, Render, div, uniform_list};
 4use gpui::{prelude::*, *};
 5use ui::{AbsoluteLength, Color, DefiniteLength, Label, LabelCommon, px, v_flex};
 6
 7use story::Story;
 8
 9const LENGTH: usize = 100;
10
11pub struct IndentGuidesStory {
12    depths: Vec<usize>,
13}
14
15impl IndentGuidesStory {
16    pub fn model(_window: &mut Window, cx: &mut App) -> Entity<Self> {
17        let mut depths = Vec::new();
18        depths.push(0);
19        depths.push(1);
20        depths.push(2);
21        for _ in 0..LENGTH - 6 {
22            depths.push(3);
23        }
24        depths.push(2);
25        depths.push(1);
26        depths.push(0);
27
28        cx.new(|_cx| Self { depths })
29    }
30}
31
32impl Render for IndentGuidesStory {
33    fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
34        Story::container(cx)
35            .child(Story::title("Indent guides", cx))
36            .child(
37                v_flex().size_full().child(
38                    uniform_list(
39                        "some-list",
40                        self.depths.len(),
41                        cx.processor(move |this, range: Range<usize>, _window, _cx| {
42                            this.depths
43                                .iter()
44                                .enumerate()
45                                .skip(range.start)
46                                .take(range.end - range.start)
47                                .map(|(i, depth)| {
48                                    div()
49                                        .pl(DefiniteLength::Absolute(AbsoluteLength::Pixels(px(
50                                            16. * (*depth as f32),
51                                        ))))
52                                        .child(Label::new(format!("Item {}", i)).color(Color::Info))
53                                })
54                                .collect()
55                        }),
56                    )
57                    .with_sizing_behavior(gpui::ListSizingBehavior::Infer)
58                    .with_decoration(ui::indent_guides(
59                        cx.entity().clone(),
60                        px(16.),
61                        ui::IndentGuideColors {
62                            default: Color::Info.color(cx),
63                            hover: Color::Accent.color(cx),
64                            active: Color::Accent.color(cx),
65                        },
66                        |this, range, _cx, _context| {
67                            this.depths
68                                .iter()
69                                .skip(range.start)
70                                .take(range.end - range.start)
71                                .cloned()
72                                .collect()
73                        },
74                    )),
75                ),
76            )
77    }
78}