Skip to content

Commit f4fdfef

Browse files
gtk: fix TreeView subclassing support
most of the vfuncs are signals and they don't necessarily have a parent implementation.
1 parent 28d551c commit f4fdfef

File tree

1 file changed

+90
-73
lines changed

1 file changed

+90
-73
lines changed

gtk4/src/subclass/tree_view.rs

Lines changed: 90 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
134134
unsafe {
135135
let data = T::type_data();
136136
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
137+
// columns-changed is a signal
137138
if let Some(f) = (*parent_class).columns_changed {
138139
f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0)
139140
}
@@ -144,6 +145,7 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
144145
unsafe {
145146
let data = T::type_data();
146147
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
148+
// cursor-changed is a sigal
147149
if let Some(f) = (*parent_class).cursor_changed {
148150
f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0)
149151
}
@@ -160,17 +162,17 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
160162
unsafe {
161163
let data = T::type_data();
162164
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
163-
164-
let f = (*parent_class)
165-
.expand_collapse_cursor_row
166-
.expect("No parent class impl for \"collapse_cursor_row\"");
167-
168-
from_glib(f(
169-
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
170-
logical.into_glib(),
171-
expand.into_glib(),
172-
open_all.into_glib(),
173-
))
165+
// expand-collapse-cursor-row is a signal
166+
if let Some(f) = (*parent_class).expand_collapse_cursor_row {
167+
from_glib(f(
168+
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
169+
logical.into_glib(),
170+
expand.into_glib(),
171+
open_all.into_glib(),
172+
))
173+
} else {
174+
false
175+
}
174176
}
175177
}
176178

@@ -185,17 +187,19 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
185187
unsafe {
186188
let data = T::type_data();
187189
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
188-
let f = (*parent_class)
189-
.move_cursor
190-
.expect("No parent class impl for \"move_cursor\"");
191-
192-
from_glib(f(
193-
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
194-
step.into_glib(),
195-
count,
196-
extend.into_glib(),
197-
modify.into_glib(),
198-
))
190+
// move-cursor is a signal
191+
if let Some(f) = (*parent_class).move_cursor {
192+
from_glib(f(
193+
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
194+
step.into_glib(),
195+
count,
196+
extend.into_glib(),
197+
modify.into_glib(),
198+
))
199+
} else {
200+
// return false if step is not supported
201+
false
202+
}
199203
}
200204
}
201205

@@ -208,6 +212,7 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
208212
unsafe {
209213
let data = T::type_data();
210214
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
215+
// row-activated is a signal
211216
if let Some(f) = (*parent_class).row_activated {
212217
f(
213218
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
@@ -222,6 +227,7 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
222227
unsafe {
223228
let data = T::type_data();
224229
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
230+
// row-collapsed is a signal
225231
if let Some(f) = (*parent_class).row_collapsed {
226232
f(
227233
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
@@ -236,6 +242,7 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
236242
unsafe {
237243
let data = T::type_data();
238244
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
245+
// row-expanded is a signal
239246
if let Some(f) = (*parent_class).row_expanded {
240247
f(
241248
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
@@ -250,50 +257,54 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
250257
unsafe {
251258
let data = T::type_data();
252259
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
253-
let f = (*parent_class)
254-
.select_all
255-
.expect("No parent class impl for \"select_all\"");
256-
257-
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
260+
// select-all is a signal
261+
if let Some(f) = (*parent_class).select_all {
262+
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
263+
} else {
264+
false
265+
}
258266
}
259267
}
260268

261269
fn parent_select_cursor_parent(&self, tree_view: &Self::Type) -> bool {
262270
unsafe {
263271
let data = T::type_data();
264272
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
265-
let f = (*parent_class)
266-
.select_cursor_parent
267-
.expect("No parent class impl for \"select_cursor_parent\"");
268-
269-
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
273+
// select-cursor-parent is a signal
274+
if let Some(f) = (*parent_class).select_cursor_parent {
275+
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
276+
} else {
277+
false
278+
}
270279
}
271280
}
272281

273282
fn parent_select_cursor_row(&self, tree_view: &Self::Type, start_editing: bool) -> bool {
274283
unsafe {
275284
let data = T::type_data();
276285
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
277-
let f = (*parent_class)
278-
.select_cursor_row
279-
.expect("No parent class impl for \"select_cursor_row\"");
280-
281-
from_glib(f(
282-
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
283-
start_editing.into_glib(),
284-
))
286+
// select-cursor-row is a signal
287+
if let Some(f) = (*parent_class).select_cursor_row {
288+
from_glib(f(
289+
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
290+
start_editing.into_glib(),
291+
))
292+
} else {
293+
false
294+
}
285295
}
286296
}
287297

288298
fn parent_start_interactive_search(&self, tree_view: &Self::Type) -> bool {
289299
unsafe {
290300
let data = T::type_data();
291301
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
292-
let f = (*parent_class)
293-
.start_interactive_search
294-
.expect("No parent class impl for \"start_interactive_search\"");
295-
296-
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
302+
// start-interactive-search is a signal
303+
if let Some(f) = (*parent_class).start_interactive_search {
304+
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
305+
} else {
306+
false
307+
}
297308
}
298309
}
299310

@@ -306,15 +317,17 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
306317
unsafe {
307318
let data = T::type_data();
308319
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
309-
let f = (*parent_class)
310-
.test_collapse_row
311-
.expect("No parent class impl for \"test_collapse_row\"");
312-
313-
from_glib(f(
314-
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
315-
iter.to_glib_none().0 as *mut _,
316-
path.to_glib_none().0 as *mut _,
317-
))
320+
// test-collapse-row is a signal
321+
if let Some(f) = (*parent_class).test_collapse_row {
322+
from_glib(f(
323+
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
324+
iter.to_glib_none().0 as *mut _,
325+
path.to_glib_none().0 as *mut _,
326+
))
327+
} else {
328+
// false to allow collapsing, true to reject it
329+
false
330+
}
318331
}
319332
}
320333

@@ -327,39 +340,43 @@ impl<T: TreeViewImpl> TreeViewImplExt for T {
327340
unsafe {
328341
let data = T::type_data();
329342
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
330-
let f = (*parent_class)
331-
.test_expand_row
332-
.expect("No parent class impl for \"test_expand_row\"");
333-
334-
from_glib(f(
335-
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
336-
iter.to_glib_none().0 as *mut _,
337-
path.to_glib_none().0 as *mut _,
338-
))
343+
// test-expand-row is a signal
344+
if let Some(f) = (*parent_class).test_expand_row {
345+
from_glib(f(
346+
tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0,
347+
iter.to_glib_none().0 as *mut _,
348+
path.to_glib_none().0 as *mut _,
349+
))
350+
} else {
351+
// false to allow expanding, true to reject it
352+
false
353+
}
339354
}
340355
}
341356

342357
fn parent_toggle_cursor_row(&self, tree_view: &Self::Type) -> bool {
343358
unsafe {
344359
let data = T::type_data();
345360
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
346-
let f = (*parent_class)
347-
.toggle_cursor_row
348-
.expect("No parent class impl for \"toggle_cursor_row\"");
349-
350-
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
361+
// toggle-cursor-row is a signal
362+
if let Some(f) = (*parent_class).toggle_cursor_row {
363+
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
364+
} else {
365+
false
366+
}
351367
}
352368
}
353369

354370
fn parent_unselect_all(&self, tree_view: &Self::Type) -> bool {
355371
unsafe {
356372
let data = T::type_data();
357373
let parent_class = data.as_ref().parent_class() as *mut ffi::GtkTreeViewClass;
358-
let f = (*parent_class)
359-
.unselect_all
360-
.expect("No parent class impl for \"unselect_all\"");
361-
362-
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
374+
// unselect-all is a signal
375+
if let Some(f) = (*parent_class).unselect_all {
376+
from_glib(f(tree_view.unsafe_cast_ref::<TreeView>().to_glib_none().0))
377+
} else {
378+
false
379+
}
363380
}
364381
}
365382
}

0 commit comments

Comments
 (0)