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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT
use crate::Box;
use crate::Buildable;
use crate::Container;
use crate::Orientable;
use crate::Stack;
use crate::Widget;
use glib::object::Cast;
use glib::object::IsA;
use glib::signal::connect_raw;
use glib::signal::SignalHandlerId;
use glib::translate::*;
use std::boxed::Box as Box_;
use std::fmt;
use std::mem::transmute;
glib::wrapper! {
/// The GtkStackSwitcher widget acts as a controller for a
/// [`Stack`][crate::Stack]; it shows a row of buttons to switch between
/// the various pages of the associated stack widget.
///
/// All the content for the buttons comes from the child properties
/// of the [`Stack`][crate::Stack]; the button visibility in a [`StackSwitcher`][crate::StackSwitcher]
/// widget is controlled by the visibility of the child in the
/// [`Stack`][crate::Stack].
///
/// It is possible to associate multiple [`StackSwitcher`][crate::StackSwitcher] widgets
/// with the same [`Stack`][crate::Stack] widget.
///
/// The GtkStackSwitcher widget was added in 3.10.
///
/// # CSS nodes
///
/// GtkStackSwitcher has a single CSS node named stackswitcher and
/// style class .stack-switcher.
///
/// When circumstances require it, GtkStackSwitcher adds the
/// .needs-attention style class to the widgets representing the
/// stack pages.
///
/// # Implements
///
/// [`StackSwitcherExt`][trait@crate::prelude::StackSwitcherExt], [`BoxExt`][trait@crate::prelude::BoxExt], [`ContainerExt`][trait@crate::prelude::ContainerExt], [`WidgetExt`][trait@crate::prelude::WidgetExt], [`trait@glib::ObjectExt`], [`BuildableExt`][trait@crate::prelude::BuildableExt], [`OrientableExt`][trait@crate::prelude::OrientableExt], [`StackSwitcherExtManual`][trait@crate::prelude::StackSwitcherExtManual], [`ContainerExtManual`][trait@crate::prelude::ContainerExtManual], [`WidgetExtManual`][trait@crate::prelude::WidgetExtManual], [`BuildableExtManual`][trait@crate::prelude::BuildableExtManual]
#[doc(alias = "GtkStackSwitcher")]
pub struct StackSwitcher(Object<ffi::GtkStackSwitcher, ffi::GtkStackSwitcherClass>) @extends Box, Container, Widget, @implements Buildable, Orientable;
match fn {
type_ => || ffi::gtk_stack_switcher_get_type(),
}
}
impl StackSwitcher {
pub const NONE: Option<&'static StackSwitcher> = None;
/// Create a new [`StackSwitcher`][crate::StackSwitcher].
///
/// # Returns
///
/// a new [`StackSwitcher`][crate::StackSwitcher].
#[doc(alias = "gtk_stack_switcher_new")]
pub fn new() -> StackSwitcher {
assert_initialized_main_thread!();
unsafe { Widget::from_glib_none(ffi::gtk_stack_switcher_new()).unsafe_cast() }
}
}
impl Default for StackSwitcher {
fn default() -> Self {
Self::new()
}
}
/// Trait containing all [`struct@StackSwitcher`] methods.
///
/// # Implementors
///
/// [`StackSwitcher`][struct@crate::StackSwitcher]
pub trait StackSwitcherExt: 'static {
/// Retrieves the stack.
/// See [`set_stack()`][Self::set_stack()].
///
/// # Returns
///
/// the stack, or [`None`] if
/// none has been set explicitly.
#[doc(alias = "gtk_stack_switcher_get_stack")]
#[doc(alias = "get_stack")]
fn stack(&self) -> Option<Stack>;
/// Sets the stack to control.
/// ## `stack`
/// a [`Stack`][crate::Stack]
#[doc(alias = "gtk_stack_switcher_set_stack")]
fn set_stack(&self, stack: Option<&impl IsA<Stack>>);
#[doc(alias = "stack")]
fn connect_stack_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
}
impl<O: IsA<StackSwitcher>> StackSwitcherExt for O {
fn stack(&self) -> Option<Stack> {
unsafe {
from_glib_none(ffi::gtk_stack_switcher_get_stack(
self.as_ref().to_glib_none().0,
))
}
}
fn set_stack(&self, stack: Option<&impl IsA<Stack>>) {
unsafe {
ffi::gtk_stack_switcher_set_stack(
self.as_ref().to_glib_none().0,
stack.map(|p| p.as_ref()).to_glib_none().0,
);
}
}
fn connect_stack_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
unsafe extern "C" fn notify_stack_trampoline<P: IsA<StackSwitcher>, F: Fn(&P) + 'static>(
this: *mut ffi::GtkStackSwitcher,
_param_spec: glib::ffi::gpointer,
f: glib::ffi::gpointer,
) {
let f: &F = &*(f as *const F);
f(StackSwitcher::from_glib_borrow(this).unsafe_cast_ref())
}
unsafe {
let f: Box_<F> = Box_::new(f);
connect_raw(
self.as_ptr() as *mut _,
b"notify::stack\0".as_ptr() as *const _,
Some(transmute::<_, unsafe extern "C" fn()>(
notify_stack_trampoline::<Self, F> as *const (),
)),
Box_::into_raw(f),
)
}
}
}
impl fmt::Display for StackSwitcher {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("StackSwitcher")
}
}