grx/gtk_components/
expander_row.rs1use std::rc::Rc;
7
8use glib::prelude::Cast;
9use grx_macros::gtk_component;
10use gtk::glib;
11use gtk::prelude::ListBoxRowExt;
12use libadwaita::prelude::{ExpanderRowExt, PreferencesRowExt};
13
14use crate::{default_clear, default_remove, new_gc, props, Component, ComponentExt, ContainerExt};
15
16use super::gtk_props::apply;
17
18#[props]
19#[derive(Default, Debug)]
20pub struct Props {
21 pub title: String,
22 pub subtitle: String,
23 pub selectable: Option<bool>,
24 pub activatable: Option<bool>,
25 pub expanded: Option<bool>,
26}
27
28pub fn expander_row(mut props: Props) -> Rc<ExpanderRow> {
29 let row = libadwaita::ExpanderRow::builder()
30 .title(&props.title)
31 .subtitle(&props.subtitle)
32 .build();
33 if let Some(b) = props.activatable {
34 row.set_activatable(b)
35 }
36 if let Some(b) = props.selectable {
37 row.set_selectable(b)
38 }
39 if let Some(b) = props.expanded {
40 row.set_expanded(b)
41 }
42 let comp = new_gc!(ExpanderRow { row, props });
43
44 for c in comp.children().iter() {
45 if c.annotations().contains_key("prefix") {
46 comp.add_prefix(c.clone())
47 } else if c.annotations().contains_key("suffix") {
48 comp.add_suffix(c.clone())
49 } else {
50 comp.append(c.clone());
51 }
52 }
53
54 apply(comp.clone());
55 comp
56}
57
58#[gtk_component(libadwaita::ExpanderRow)]
59#[derive(Debug)]
60pub struct ExpanderRow {}
61
62impl ExpanderRow {
63 pub fn set_expanded(self: &Rc<Self>, expanded: bool) {
65 self.widget.set_expanded(expanded);
66 }
67
68 pub fn set_title(self: &Rc<Self>, title: &str) {
69 self.widget.set_title(title);
70 }
71
72 pub fn set_subtitle(self: &Rc<Self>, subtitle: &str) {
73 self.widget.set_subtitle(subtitle);
74 }
75
76 pub fn add_prefix(self: &Rc<Self>, component: Component) {
77 let widget: Rc<gtk::Widget> = component.inner().downcast().unwrap();
78 self.widget.add_prefix(widget.as_ref());
79 }
80
81 pub fn add_suffix(self: &Rc<Self>, component: Component) {
82 let widget: Rc<gtk::Widget> = component.inner().downcast().unwrap();
83 self.widget.add_action(widget.as_ref());
84 }
85}
86
87impl ContainerExt for ExpanderRow {
88 fn append<W>(self: &Rc<Self>, child: Rc<W>)
89 where
90 W: crate::ComponentExt + ?Sized,
91 {
92 let inner = child.inner();
93 let w: >k::Widget = inner.downcast_ref().unwrap();
94 self.widget.add_row(w);
95 }
96 default_clear! {}
97
98 default_remove! {}
99}