aboutsummaryrefslogtreecommitdiff
path: root/examples/statetracker/src/widgets/bufferview.rs
blob: c96f8d54acad12aa8b6316f97c88ed169fd96d3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
use std::sync::Arc;

use druid::widget::{Align, Label};
use druid::{lens, Lens, Point, WidgetPod};
use druid::{widget::Flex, Widget};

use libquassel::message::objects::BufferViewManager;

pub struct BufferViewWidget {
    inner: WidgetPod<Arc<BufferViewManager>, Box<dyn Widget<Arc<BufferViewManager>>>>,
}

impl BufferViewWidget {
    pub fn new() -> Self {
        let widget = WidgetPod::new(Flex::column()).boxed();

        BufferViewWidget { inner: widget }
    }
}

impl Widget<Arc<BufferViewManager>> for BufferViewWidget {
    fn event(
        &mut self,
        ctx: &mut druid::EventCtx,
        event: &druid::Event,
        data: &mut Arc<BufferViewManager>,
        env: &druid::Env,
    ) {
        self.inner.event(ctx, event, data, env)
    }

    fn lifecycle(
        &mut self,
        ctx: &mut druid::LifeCycleCtx,
        event: &druid::LifeCycle,
        data: &Arc<BufferViewManager>,
        env: &druid::Env,
    ) {
        self.inner.lifecycle(ctx, event, data, env)
    }

    fn update(
        &mut self,
        ctx: &mut druid::UpdateCtx,
        _old_data: &Arc<BufferViewManager>,
        data: &Arc<BufferViewManager>,
        _env: &druid::Env,
    ) {
        let buffer_view_configs = lens!(BufferViewManager, buffer_view_configs);

        let mut names: Flex<Arc<BufferViewManager>> = Flex::column();
        let mut buffers: Flex<Arc<BufferViewManager>> = Flex::column();
        // let mut expansions: Flex<Arc<BufferViewManager>> = Flex::column();

        // TODO optimise this whole thing
        buffer_view_configs.with(data, |configs| {
            for (_id, config) in configs {
                names.add_child(Label::new(config.buffer_view_name.clone()));
                buffers.add_child(Label::new(format!("{:?}", config.buffers)));
                // expansions.add_child(Align::left(Label::new(alias.expansion.clone())));
            }
        });

        let widget: Flex<Arc<BufferViewManager>> = Flex::row()
            .with_flex_child(names, 1.0)
            .with_flex_child(buffers, 1.0);
        //     .with_flex_child(expansions, 1.0);

        self.inner = WidgetPod::new(widget).boxed();

        ctx.children_changed();
        ctx.request_layout();
        ctx.request_paint();
    }

    fn layout(
        &mut self,
        ctx: &mut druid::LayoutCtx,
        bc: &druid::BoxConstraints,
        data: &Arc<BufferViewManager>,
        env: &druid::Env,
    ) -> druid::Size {
        let size = self.inner.layout(ctx, bc, data, env);
        self.inner.set_origin(ctx, data, env, Point::ZERO);
        return size;
    }

    fn paint(
        &mut self,
        ctx: &mut druid::PaintCtx,
        data: &Arc<BufferViewManager>,
        env: &druid::Env,
    ) {
        self.inner.paint(ctx, data, env)
    }
}