grx/gtk_components/
expander_row.rs

1// SPDX-License-Identifier: GPL-3.0-or-later
2
3//! A row element that can have title, subtitle, prefix and suffix children.
4//! Should be placed in a `list`.
5
6use 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    /// Set whether the row is expanded or collapsed.
64    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: &gtk::Widget = inner.downcast_ref().unwrap();
94        self.widget.add_row(w);
95    }
96    default_clear! {}
97
98    default_remove! {}
99}