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

Commit 3527a0b

Browse files
committed
gtk/builder: manually implement several methods
This adds a manual implementation for all the GtkBuilder methods that are using unconventional (non gboolean) return codes.
1 parent 157fbc9 commit 3527a0b

File tree

1 file changed

+133
-1
lines changed

1 file changed

+133
-1
lines changed

gtk/src/builder.rs

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// Take a look at the license at the top of the repository in the LICENSE file.
22

3-
use crate::Builder;
3+
use crate::{Builder, Widget};
44
use glib::prelude::*;
55
use glib::translate::*;
66
use glib::GString;
77
use glib::Object;
88
use std::path::Path;
9+
use std::ptr;
910

1011
impl Builder {
1112
#[doc(alias = "gtk_builder_new_from_file")]
@@ -26,13 +27,36 @@ pub trait BuilderExtManual: 'static {
2627

2728
#[doc(alias = "gtk_builder_add_from_file")]
2829
fn add_from_file<T: AsRef<Path>>(&self, file_path: T) -> Result<(), glib::Error>;
30+
#[doc(alias = "gtk_builder_add_from_resource")]
31+
fn add_from_resource(&self, resource_path: &str) -> Result<(), glib::Error>;
32+
#[doc(alias = "gtk_builder_add_from_string")]
33+
fn add_from_string(&self, buffer: &str) -> Result<(), glib::Error>;
34+
35+
#[doc(alias = "gtk_builder_add_objects_from_resource")]
36+
fn add_objects_from_resource(
37+
&self,
38+
resource_path: &str,
39+
object_ids: &[&str],
40+
) -> Result<(), glib::Error>;
41+
#[doc(alias = "gtk_builder_add_objects_from_string")]
42+
fn add_objects_from_string(&self, buffer: &str, object_ids: &[&str])
43+
-> Result<(), glib::Error>;
44+
2945
#[doc(alias = "gtk_builder_connect_signals_full")]
3046
fn connect_signals<
3147
P: FnMut(&Builder, &str) -> Box<dyn Fn(&[glib::Value]) -> Option<glib::Value> + 'static>,
3248
>(
3349
&self,
3450
func: P,
3551
);
52+
53+
#[doc(alias = "gtk_builder_extend_with_template")]
54+
fn extend_with_template(
55+
&self,
56+
widget: &impl IsA<Widget>,
57+
template_type: glib::types::Type,
58+
buffer: &str,
59+
) -> Result<(), glib::Error>;
3660
}
3761

3862
impl<O: IsA<Builder>> BuilderExtManual for O {
@@ -62,6 +86,88 @@ impl<O: IsA<Builder>> BuilderExtManual for O {
6286
}
6387
}
6488

89+
fn add_from_resource(&self, resource_path: &str) -> Result<(), glib::Error> {
90+
unsafe {
91+
let mut error = ptr::null_mut();
92+
let exit_code = ffi::gtk_builder_add_from_resource(
93+
self.as_ref().to_glib_none().0,
94+
resource_path.to_glib_none().0,
95+
&mut error,
96+
);
97+
assert_eq!(exit_code == 0, !error.is_null());
98+
if error.is_null() {
99+
Ok(())
100+
} else {
101+
Err(from_glib_full(error))
102+
}
103+
}
104+
}
105+
106+
fn add_from_string(&self, buffer: &str) -> Result<(), glib::Error> {
107+
let length = buffer.len() as usize;
108+
unsafe {
109+
let mut error = ptr::null_mut();
110+
let exit_code = ffi::gtk_builder_add_from_string(
111+
self.as_ref().to_glib_none().0,
112+
buffer.to_glib_none().0,
113+
length,
114+
&mut error,
115+
);
116+
assert_eq!(exit_code == 0, !error.is_null());
117+
if error.is_null() {
118+
Ok(())
119+
} else {
120+
Err(from_glib_full(error))
121+
}
122+
}
123+
}
124+
125+
fn add_objects_from_resource(
126+
&self,
127+
resource_path: &str,
128+
object_ids: &[&str],
129+
) -> Result<(), glib::Error> {
130+
unsafe {
131+
let mut error = ptr::null_mut();
132+
let exit_code = ffi::gtk_builder_add_objects_from_resource(
133+
self.as_ref().to_glib_none().0,
134+
resource_path.to_glib_none().0,
135+
object_ids.to_glib_none().0,
136+
&mut error,
137+
);
138+
assert_eq!(exit_code == 0, !error.is_null());
139+
if error.is_null() {
140+
Ok(())
141+
} else {
142+
Err(from_glib_full(error))
143+
}
144+
}
145+
}
146+
147+
fn add_objects_from_string(
148+
&self,
149+
buffer: &str,
150+
object_ids: &[&str],
151+
) -> Result<(), glib::Error> {
152+
let length = buffer.len() as usize;
153+
unsafe {
154+
let mut error = ptr::null_mut();
155+
let exit_code = ffi::gtk_builder_add_objects_from_string(
156+
self.as_ref().to_glib_none().0,
157+
buffer.to_glib_none().0,
158+
length,
159+
object_ids.to_glib_none().0,
160+
&mut error,
161+
);
162+
assert_eq!(exit_code == 0, !error.is_null());
163+
if error.is_null() {
164+
Ok(())
165+
} else {
166+
Err(from_glib_full(error))
167+
}
168+
}
169+
}
170+
65171
fn connect_signals<
66172
P: FnMut(&Builder, &str) -> Box<dyn Fn(&[glib::Value]) -> Option<glib::Value> + 'static>,
67173
>(
@@ -110,4 +216,30 @@ impl<O: IsA<Builder>> BuilderExtManual for O {
110216
);
111217
}
112218
}
219+
220+
fn extend_with_template(
221+
&self,
222+
widget: &impl IsA<Widget>,
223+
template_type: glib::types::Type,
224+
buffer: &str,
225+
) -> Result<(), glib::Error> {
226+
let length = buffer.len() as usize;
227+
unsafe {
228+
let mut error = ptr::null_mut();
229+
let exit_code = ffi::gtk_builder_extend_with_template(
230+
self.as_ref().to_glib_none().0,
231+
widget.as_ref().to_glib_none().0,
232+
template_type.into_glib(),
233+
buffer.to_glib_none().0,
234+
length,
235+
&mut error,
236+
);
237+
assert_eq!(exit_code == 0, !error.is_null());
238+
if error.is_null() {
239+
Ok(())
240+
} else {
241+
Err(from_glib_full(error))
242+
}
243+
}
244+
}
113245
}

0 commit comments

Comments
 (0)