aboutsummaryrefslogtreecommitdiff
path: root/examples/statetracker/src/widgets/aliasmanager.rs
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2021-11-29 14:27:27 +0100
committerMax Audron <audron@cocaine.farm>2021-11-29 14:28:02 +0100
commit9df7c5c0e6d03579fa90735adf316d7e563340d7 (patch)
tree43118348a34a8f1715aaa384cc8e966c3af97506 /examples/statetracker/src/widgets/aliasmanager.rs
parentadd feature list to readme (diff)
statetracker: add bufferview widget and do some reorganization
Diffstat (limited to 'examples/statetracker/src/widgets/aliasmanager.rs')
-rw-r--r--examples/statetracker/src/widgets/aliasmanager.rs91
1 files changed, 91 insertions, 0 deletions
diff --git a/examples/statetracker/src/widgets/aliasmanager.rs b/examples/statetracker/src/widgets/aliasmanager.rs
new file mode 100644
index 0000000..afa8c91
--- /dev/null
+++ b/examples/statetracker/src/widgets/aliasmanager.rs
@@ -0,0 +1,91 @@
+use std::sync::Arc;
+
+use druid::widget::{Align, Label};
+use druid::{lens, Lens, Point, WidgetPod};
+use druid::{widget::Flex, Widget};
+
+use libquassel::message::objects::AliasManager;
+
+pub struct AliasManagerWidget {
+ inner: WidgetPod<Arc<AliasManager>, Box<dyn Widget<Arc<AliasManager>>>>,
+}
+
+impl AliasManagerWidget {
+ pub fn new() -> Self {
+ let widget = WidgetPod::new(Flex::column()).boxed();
+
+ AliasManagerWidget { inner: widget }
+ }
+}
+
+impl Widget<Arc<AliasManager>> for AliasManagerWidget {
+ fn event(
+ &mut self,
+ ctx: &mut druid::EventCtx,
+ event: &druid::Event,
+ data: &mut Arc<AliasManager>,
+ env: &druid::Env,
+ ) {
+ self.inner.event(ctx, event, data, env)
+ }
+
+ fn lifecycle(
+ &mut self,
+ ctx: &mut druid::LifeCycleCtx,
+ event: &druid::LifeCycle,
+ data: &Arc<AliasManager>,
+ env: &druid::Env,
+ ) {
+ self.inner.lifecycle(ctx, event, data, env)
+ }
+
+ fn update(
+ &mut self,
+ ctx: &mut druid::UpdateCtx,
+ _old_data: &Arc<AliasManager>,
+ data: &Arc<AliasManager>,
+ _env: &druid::Env,
+ ) {
+ let aliases = lens!(AliasManager, aliases);
+
+ let mut names: Flex<Arc<AliasManager>> = Flex::column();
+ let mut sign: Flex<Arc<AliasManager>> = Flex::column();
+ let mut expansions: Flex<Arc<AliasManager>> = Flex::column();
+
+ // TODO optimise this whole thing
+ aliases.with(data, |aliases| {
+ for alias in aliases {
+ names.add_child(Align::right(Label::new(alias.name.clone())));
+ sign.add_child(Label::new("=>"));
+ expansions.add_child(Align::left(Label::new(alias.expansion.clone())));
+ }
+ });
+
+ let widget: Flex<Arc<AliasManager>> = Flex::row()
+ .with_flex_child(names, 1.0)
+ .with_flex_child(sign, 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<AliasManager>,
+ 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<AliasManager>, env: &druid::Env) {
+ self.inner.paint(ctx, data, env)
+ }
+}