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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from
// from gir-files (https://github.com/gtk-rs/gir-files.git)
// DO NOT EDIT

use crate::ffi;
use glib::{
    prelude::*,
    signal::{connect_raw, SignalHandlerId},
    translate::*,
};
use std::boxed::Box as Box_;

glib::wrapper! {
    /// A paintable showing a loading spinner.
    ///
    /// <picture>
    ///   <source srcset="spinner-dark.png" media="(prefers-color-scheme: dark)">
    ///   <img src="spinner.png" alt="spinner">
    /// </picture>
    ///
    /// [`SpinnerPaintable`][crate::SpinnerPaintable] size varies depending on the available space, but is
    /// capped at 64×64 pixels.
    ///
    /// To be able to animate, [`SpinnerPaintable`][crate::SpinnerPaintable] needs a widget. It will be
    /// animated according to that widget's frame clock, and only if that widget is
    /// mapped. Ideally it should be the same widget the paintable is displayed in,
    /// but that's not a requirement.
    ///
    /// Most applications should be using [`Spinner`][crate::Spinner] instead.
    /// [`SpinnerPaintable`][crate::SpinnerPaintable] is provided for the cases where using a widget is
    /// impractical or impossible, such as [`paintable`][struct@crate::StatusPage#paintable]:
    ///
    /// ```xml
    /// <object class="AdwStatusPage" id="status_page">
    ///   <property name="paintable">
    ///     <object class="AdwSpinnerPaintable">
    ///       <property name="widget">status_page</property>
    ///     </object>
    ///   </property>
    ///   <!-- ... -->
    /// </object>
    /// ```
    ///
    /// ## Properties
    ///
    ///
    /// #### `widget`
    ///  The widget the spinner uses for frame clock.
    ///
    /// Readable | Writeable
    ///
    /// # Implements
    ///
    /// [`trait@glib::ObjectExt`], [`trait@gdk::prelude::PaintableExt`]
    #[doc(alias = "AdwSpinnerPaintable")]
    pub struct SpinnerPaintable(Object<ffi::AdwSpinnerPaintable, ffi::AdwSpinnerPaintableClass>) @implements gdk::Paintable;

    match fn {
        type_ => || ffi::adw_spinner_paintable_get_type(),
    }
}

impl SpinnerPaintable {
    /// Creates a new [`SpinnerPaintable`][crate::SpinnerPaintable] for @widget.
    /// ## `widget`
    /// the widget used for frame clock
    ///
    /// # Returns
    ///
    /// the newly created [`SpinnerPaintable`][crate::SpinnerPaintable]
    #[doc(alias = "adw_spinner_paintable_new")]
    pub fn new(widget: Option<&impl IsA<gtk::Widget>>) -> SpinnerPaintable {
        assert_initialized_main_thread!();
        unsafe {
            from_glib_full(ffi::adw_spinner_paintable_new(
                widget.map(|p| p.as_ref()).to_glib_none().0,
            ))
        }
    }

    /// Gets the widget used for frame clock.
    ///
    /// # Returns
    ///
    /// the widget
    #[doc(alias = "adw_spinner_paintable_get_widget")]
    #[doc(alias = "get_widget")]
    pub fn widget(&self) -> Option<gtk::Widget> {
        unsafe { from_glib_none(ffi::adw_spinner_paintable_get_widget(self.to_glib_none().0)) }
    }

    /// Sets the widget used for frame clock.
    /// ## `widget`
    /// the widget to use for frame clock
    #[doc(alias = "adw_spinner_paintable_set_widget")]
    #[doc(alias = "widget")]
    pub fn set_widget(&self, widget: Option<&impl IsA<gtk::Widget>>) {
        unsafe {
            ffi::adw_spinner_paintable_set_widget(
                self.to_glib_none().0,
                widget.map(|p| p.as_ref()).to_glib_none().0,
            );
        }
    }

    #[cfg(feature = "v1_6")]
    #[cfg_attr(docsrs, doc(cfg(feature = "v1_6")))]
    #[doc(alias = "widget")]
    pub fn connect_widget_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn notify_widget_trampoline<F: Fn(&SpinnerPaintable) + 'static>(
            this: *mut ffi::AdwSpinnerPaintable,
            _param_spec: glib::ffi::gpointer,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(&from_glib_borrow(this))
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"notify::widget\0".as_ptr() as *const _,
                Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
                    notify_widget_trampoline::<F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}