Skip to content
This repository was archived by the owner on Mar 4, 2024. It is now read-only.

Commit 5d8b895

Browse files
committed
Add ToggleButton subclass
1 parent 6f27d77 commit 5d8b895

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

gtk/src/subclass/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ pub mod scrolled_window;
3030
#[cfg(any(gdk_backend = "x11", feature = "dox"))]
3131
pub mod socket;
3232
pub mod stack;
33+
pub mod toggle_button;
3334
pub mod tree_view;
3435
pub mod widget;
3536
pub mod window;
@@ -70,6 +71,7 @@ pub mod prelude {
7071
#[cfg(any(gdk_backend = "x11", feature = "dox"))]
7172
pub use super::socket::{SocketImpl, SocketImplExt};
7273
pub use super::stack::StackImpl;
74+
pub use super::toggle_button::ToggleButtonImpl;
7375
pub use super::tree_view::TreeViewImpl;
7476
pub use super::widget::{
7577
CompositeTemplate, TemplateChild, WidgetClassSubclassExt, WidgetImpl, WidgetImplExt,

gtk/src/subclass/toggle_button.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Take a look at the license at the top of the repository in the LICENSE file.
2+
3+
use glib::subclass::prelude::*;
4+
use glib::translate::*;
5+
use glib::Cast;
6+
7+
use super::button::ButtonImpl;
8+
use crate::ToggleButton;
9+
10+
pub trait ToggleButtonImpl: ToggleButtonImplExt + ButtonImpl {
11+
fn toggled(&self) {
12+
self.parent_toggled()
13+
}
14+
}
15+
16+
pub trait ToggleButtonImplExt: ObjectSubclass {
17+
fn parent_toggled(&self);
18+
}
19+
20+
impl<T: ToggleButtonImpl> ToggleButtonImplExt for T {
21+
fn parent_toggled(&self) {
22+
unsafe {
23+
let data = T::type_data();
24+
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkToggleButtonClass;
25+
if let Some(f) = (*parent_class).toggled {
26+
f(self
27+
.obj()
28+
.unsafe_cast_ref::<ToggleButton>()
29+
.to_glib_none()
30+
.0)
31+
}
32+
}
33+
}
34+
}
35+
36+
unsafe impl<T: ToggleButtonImpl> IsSubclassable<T> for ToggleButton {
37+
fn class_init(class: &mut glib::Class<Self>) {
38+
Self::parent_class_init::<T>(class);
39+
40+
let klass = class.as_mut();
41+
klass.toggled = Some(button_toggled::<T>);
42+
}
43+
}
44+
45+
unsafe extern "C" fn button_toggled<T: ToggleButtonImpl>(ptr: *mut ffi::GtkToggleButton) {
46+
let instance = &*(ptr as *mut T::Instance);
47+
let imp = instance.imp();
48+
49+
imp.toggled()
50+
}

0 commit comments

Comments
 (0)