gtk/auto/
text_tag_table.rs1use glib::object::Cast;
6use glib::object::IsA;
7use glib::signal::connect_raw;
8use glib::signal::SignalHandlerId;
9use glib::translate::*;
10use glib_sys;
11use gtk_sys;
12use std::boxed::Box as Box_;
13use std::fmt;
14use std::mem::transmute;
15use Buildable;
16use TextTag;
17
18glib_wrapper! {
19 pub struct TextTagTable(Object<gtk_sys::GtkTextTagTable, gtk_sys::GtkTextTagTableClass, TextTagTableClass>) @implements Buildable;
20
21 match fn {
22 get_type => || gtk_sys::gtk_text_tag_table_get_type(),
23 }
24}
25
26impl TextTagTable {
27 pub fn new() -> TextTagTable {
28 assert_initialized_main_thread!();
29 unsafe { from_glib_full(gtk_sys::gtk_text_tag_table_new()) }
30 }
31}
32
33impl Default for TextTagTable {
34 fn default() -> Self {
35 Self::new()
36 }
37}
38
39pub const NONE_TEXT_TAG_TABLE: Option<&TextTagTable> = None;
40
41pub trait TextTagTableExt: 'static {
42 fn add<P: IsA<TextTag>>(&self, tag: &P) -> bool;
43
44 fn foreach<P: FnMut(&TextTag)>(&self, func: P);
45
46 fn get_size(&self) -> i32;
47
48 fn lookup(&self, name: &str) -> Option<TextTag>;
49
50 fn remove<P: IsA<TextTag>>(&self, tag: &P);
51
52 fn connect_tag_added<F: Fn(&Self, &TextTag) + 'static>(&self, f: F) -> SignalHandlerId;
53
54 fn connect_tag_changed<F: Fn(&Self, &TextTag, bool) + 'static>(&self, f: F) -> SignalHandlerId;
55
56 fn connect_tag_removed<F: Fn(&Self, &TextTag) + 'static>(&self, f: F) -> SignalHandlerId;
57}
58
59impl<O: IsA<TextTagTable>> TextTagTableExt for O {
60 fn add<P: IsA<TextTag>>(&self, tag: &P) -> bool {
61 unsafe {
62 from_glib(gtk_sys::gtk_text_tag_table_add(
63 self.as_ref().to_glib_none().0,
64 tag.as_ref().to_glib_none().0,
65 ))
66 }
67 }
68
69 fn foreach<P: FnMut(&TextTag)>(&self, func: P) {
70 let func_data: P = func;
71 unsafe extern "C" fn func_func<P: FnMut(&TextTag)>(
72 tag: *mut gtk_sys::GtkTextTag,
73 data: glib_sys::gpointer,
74 ) {
75 let tag = from_glib_borrow(tag);
76 let callback: *mut P = data as *const _ as usize as *mut P;
77 (*callback)(&tag);
78 }
79 let func = Some(func_func::<P> as _);
80 let super_callback0: &P = &func_data;
81 unsafe {
82 gtk_sys::gtk_text_tag_table_foreach(
83 self.as_ref().to_glib_none().0,
84 func,
85 super_callback0 as *const _ as usize as *mut _,
86 );
87 }
88 }
89
90 fn get_size(&self) -> i32 {
91 unsafe { gtk_sys::gtk_text_tag_table_get_size(self.as_ref().to_glib_none().0) }
92 }
93
94 fn lookup(&self, name: &str) -> Option<TextTag> {
95 unsafe {
96 from_glib_none(gtk_sys::gtk_text_tag_table_lookup(
97 self.as_ref().to_glib_none().0,
98 name.to_glib_none().0,
99 ))
100 }
101 }
102
103 fn remove<P: IsA<TextTag>>(&self, tag: &P) {
104 unsafe {
105 gtk_sys::gtk_text_tag_table_remove(
106 self.as_ref().to_glib_none().0,
107 tag.as_ref().to_glib_none().0,
108 );
109 }
110 }
111
112 fn connect_tag_added<F: Fn(&Self, &TextTag) + 'static>(&self, f: F) -> SignalHandlerId {
113 unsafe extern "C" fn tag_added_trampoline<P, F: Fn(&P, &TextTag) + 'static>(
114 this: *mut gtk_sys::GtkTextTagTable,
115 tag: *mut gtk_sys::GtkTextTag,
116 f: glib_sys::gpointer,
117 ) where
118 P: IsA<TextTagTable>,
119 {
120 let f: &F = &*(f as *const F);
121 f(
122 &TextTagTable::from_glib_borrow(this).unsafe_cast(),
123 &from_glib_borrow(tag),
124 )
125 }
126 unsafe {
127 let f: Box_<F> = Box_::new(f);
128 connect_raw(
129 self.as_ptr() as *mut _,
130 b"tag-added\0".as_ptr() as *const _,
131 Some(transmute(tag_added_trampoline::<Self, F> as usize)),
132 Box_::into_raw(f),
133 )
134 }
135 }
136
137 fn connect_tag_changed<F: Fn(&Self, &TextTag, bool) + 'static>(&self, f: F) -> SignalHandlerId {
138 unsafe extern "C" fn tag_changed_trampoline<P, F: Fn(&P, &TextTag, bool) + 'static>(
139 this: *mut gtk_sys::GtkTextTagTable,
140 tag: *mut gtk_sys::GtkTextTag,
141 size_changed: glib_sys::gboolean,
142 f: glib_sys::gpointer,
143 ) where
144 P: IsA<TextTagTable>,
145 {
146 let f: &F = &*(f as *const F);
147 f(
148 &TextTagTable::from_glib_borrow(this).unsafe_cast(),
149 &from_glib_borrow(tag),
150 from_glib(size_changed),
151 )
152 }
153 unsafe {
154 let f: Box_<F> = Box_::new(f);
155 connect_raw(
156 self.as_ptr() as *mut _,
157 b"tag-changed\0".as_ptr() as *const _,
158 Some(transmute(tag_changed_trampoline::<Self, F> as usize)),
159 Box_::into_raw(f),
160 )
161 }
162 }
163
164 fn connect_tag_removed<F: Fn(&Self, &TextTag) + 'static>(&self, f: F) -> SignalHandlerId {
165 unsafe extern "C" fn tag_removed_trampoline<P, F: Fn(&P, &TextTag) + 'static>(
166 this: *mut gtk_sys::GtkTextTagTable,
167 tag: *mut gtk_sys::GtkTextTag,
168 f: glib_sys::gpointer,
169 ) where
170 P: IsA<TextTagTable>,
171 {
172 let f: &F = &*(f as *const F);
173 f(
174 &TextTagTable::from_glib_borrow(this).unsafe_cast(),
175 &from_glib_borrow(tag),
176 )
177 }
178 unsafe {
179 let f: Box_<F> = Box_::new(f);
180 connect_raw(
181 self.as_ptr() as *mut _,
182 b"tag-removed\0".as_ptr() as *const _,
183 Some(transmute(tag_removed_trampoline::<Self, F> as usize)),
184 Box_::into_raw(f),
185 )
186 }
187 }
188}
189
190impl fmt::Display for TextTagTable {
191 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
192 write!(f, "TextTagTable")
193 }
194}