From 724f7f5a9f3fe1c5dc3ca29b607bc9ea5fe1e41b Mon Sep 17 00:00:00 2001 From: Lucy Date: Mon, 28 Feb 2022 14:45:38 -0500 Subject: [PATCH] Wrap `LabeledItem` in a newtype --- .../{labeled_item.rs => labeled_item/imp.rs} | 14 ++-- widgets/src/labeled_item/mod.rs | 74 +++++++++++++++++++ 2 files changed, 79 insertions(+), 9 deletions(-) rename widgets/src/{labeled_item.rs => labeled_item/imp.rs} (95%) create mode 100644 widgets/src/labeled_item/mod.rs diff --git a/widgets/src/labeled_item.rs b/widgets/src/labeled_item/imp.rs similarity index 95% rename from widgets/src/labeled_item.rs rename to widgets/src/labeled_item/imp.rs index 84563977..690febdf 100644 --- a/widgets/src/labeled_item.rs +++ b/widgets/src/labeled_item/imp.rs @@ -3,7 +3,7 @@ use relm4::{ComponentBuilder, ComponentParts, Sender, SimpleComponent}; use std::cell::RefCell; #[derive(Debug)] -pub enum LabeledItemMessage { +pub(crate) enum LabeledItemMessage { Title(String), Desc(Option), Align(Align), @@ -11,7 +11,7 @@ pub enum LabeledItemMessage { } #[track] -pub struct LabeledItem { +pub(crate) struct LabeledItem { _title: String, _desc: Option, _align: Align, @@ -23,16 +23,12 @@ pub struct LabeledItem { } impl LabeledItem { - pub fn new() -> ComponentBuilder { - Self::init() - } - pub fn title(&self) -> &str { &self._title } - pub fn description(&self) -> &str { - &self._title + pub fn description(&self) -> Option<&String> { + self._desc.as_ref() } pub fn alignment(&self) -> Align { @@ -68,7 +64,7 @@ impl LabeledItem { } } -#[component(pub)] +#[component(pub(crate))] impl SimpleComponent for LabeledItem { type Widgets = AppWidgets; type InitParams = (); diff --git a/widgets/src/labeled_item/mod.rs b/widgets/src/labeled_item/mod.rs new file mode 100644 index 00000000..694b3534 --- /dev/null +++ b/widgets/src/labeled_item/mod.rs @@ -0,0 +1,74 @@ +mod imp; + +use gtk4::{glib::IsA, prelude::*, Align, Orientation, Widget}; +use relm4::{Component, ComponentController, ComponentParts, Controller}; +use std::cell::Ref; + +pub struct LabeledItem { + root: gtk4::Box, + controller: Controller, +} + +impl LabeledItem { + fn inner(&self) -> Ref<'_, ComponentParts> { + self.controller.state().get() + } + + pub fn new() -> Self { + Self::default() + } + + pub fn widget(&self) -> gtk4::Box { + self.root.clone() + } + + pub fn title(&self) -> String { + self.inner().model.title().to_owned() + } + + pub fn description(&self) -> Option { + self.inner().model.description().cloned() + } + + pub fn alignment(&self) -> Align { + self.inner().model.alignment() + } + + pub fn child(&self) -> Option { + self.inner().model.child().cloned() + } + + pub fn set_title(&self, title: S) + where + S: ToString, + { + self.inner().model.set_title(title) + } + + pub fn set_description(&self, description: Option) + where + S: ToString, + { + self.inner().model.set_description(description) + } + + pub fn set_alignment(&self, align: Align) { + self.inner().model.set_alignment(align) + } + + pub fn set_child(&self, child: &impl IsA) { + let widget = child.upcast_ref(); + self.inner().model.set_child(widget.clone()); + } +} + +impl Default for LabeledItem { + fn default() -> Self { + let root = gtk4::Box::new(Orientation::Horizontal, 0); + let controller = imp::LabeledItem::init() + .attach_to(&root) + .launch(()) + .detach(); + Self { root, controller } + } +}