gtk/subclass/
icon_view.rs1use libc::c_int;
4
5use glib::subclass::prelude::*;
6use glib::translate::*;
7use glib::Cast;
8
9use super::container::ContainerImpl;
10
11use crate::IconView;
12use crate::MovementStep;
13use crate::TreePath;
14
15pub trait IconViewImpl: IconViewImplExt + ContainerImpl {
16 fn item_activated(&self, path: &TreePath) {
20 self.parent_item_activated(path)
21 }
22 fn selection_changed(&self) {
23 self.parent_selection_changed()
24 }
25 fn select_all(&self) {
28 self.parent_select_all()
29 }
30 fn unselect_all(&self) {
32 self.parent_unselect_all()
33 }
34 fn select_cursor_item(&self) {
35 self.parent_select_cursor_item()
36 }
37 fn toggle_cursor_item(&self) {
38 self.parent_toggle_cursor_item()
39 }
40 fn move_cursor(&self, step: MovementStep, count: i32) -> bool {
41 self.parent_move_cursor(step, count)
42 }
43 fn activate_cursor_item(&self) -> bool {
44 self.parent_activate_cursor_item()
45 }
46}
47
48mod sealed {
49 pub trait Sealed {}
50 impl<T: super::IconViewImpl> Sealed for T {}
51}
52
53pub trait IconViewImplExt: ObjectSubclass + sealed::Sealed {
54 fn parent_item_activated(&self, path: &TreePath) {
55 unsafe {
56 let data = Self::type_data();
57 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
58 if let Some(f) = (*parent_class).item_activated {
59 f(
60 self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0,
61 mut_override(path.to_glib_none().0),
62 )
63 }
64 }
65 }
66 fn parent_selection_changed(&self) {
67 unsafe {
68 let data = Self::type_data();
69 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
70 if let Some(f) = (*parent_class).selection_changed {
71 f(self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0)
72 }
73 }
74 }
75 fn parent_select_all(&self) {
76 unsafe {
77 let data = Self::type_data();
78 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
79 if let Some(f) = (*parent_class).select_all {
80 f(self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0)
81 }
82 }
83 }
84 fn parent_unselect_all(&self) {
85 unsafe {
86 let data = Self::type_data();
87 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
88 if let Some(f) = (*parent_class).unselect_all {
89 f(self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0)
90 }
91 }
92 }
93 fn parent_select_cursor_item(&self) {
94 unsafe {
95 let data = Self::type_data();
96 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
97 if let Some(f) = (*parent_class).select_cursor_item {
98 f(self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0)
99 }
100 }
101 }
102 fn parent_toggle_cursor_item(&self) {
103 unsafe {
104 let data = Self::type_data();
105 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
106 if let Some(f) = (*parent_class).toggle_cursor_item {
107 f(self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0)
108 }
109 }
110 }
111 fn parent_move_cursor(&self, step: MovementStep, count: i32) -> bool {
112 unsafe {
113 let data = Self::type_data();
114 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
115 if let Some(f) = (*parent_class).move_cursor {
116 from_glib(f(
117 self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0,
118 step.into_glib(),
119 count,
120 ))
121 } else {
122 false
123 }
124 }
125 }
126 fn parent_activate_cursor_item(&self) -> bool {
127 unsafe {
128 let data = Self::type_data();
129 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkIconViewClass;
130 if let Some(f) = (*parent_class).activate_cursor_item {
131 from_glib(f(self.obj().unsafe_cast_ref::<IconView>().to_glib_none().0))
132 } else {
133 false
134 }
135 }
136 }
137}
138
139impl<T: IconViewImpl> IconViewImplExt for T {}
140
141unsafe impl<T: IconViewImpl> IsSubclassable<T> for IconView {
142 fn class_init(class: &mut ::glib::Class<Self>) {
143 Self::parent_class_init::<T>(class);
144
145 if !crate::rt::is_initialized() {
146 panic!("GTK has to be initialized first");
147 }
148
149 let klass = class.as_mut();
150 klass.item_activated = Some(icon_view_item_activated::<T>);
151 klass.selection_changed = Some(icon_view_selection_changed::<T>);
152 klass.select_all = Some(icon_view_select_all::<T>);
153 klass.unselect_all = Some(icon_view_unselect_all::<T>);
154 klass.select_cursor_item = Some(icon_view_select_cursor_item::<T>);
155 klass.toggle_cursor_item = Some(icon_view_toggle_cursor_item::<T>);
156 klass.move_cursor = Some(icon_view_move_cursor::<T>);
157 klass.activate_cursor_item = Some(icon_view_activate_cursor_item::<T>);
158 }
159}
160
161unsafe extern "C" fn icon_view_item_activated<T: IconViewImpl>(
162 ptr: *mut ffi::GtkIconView,
163 path: *mut ffi::GtkTreePath,
164) {
165 let instance = &*(ptr as *mut T::Instance);
166 let imp = instance.imp();
167 let path = from_glib_borrow(path);
168
169 imp.item_activated(&path)
170}
171
172unsafe extern "C" fn icon_view_selection_changed<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
173 let instance = &*(ptr as *mut T::Instance);
174 let imp = instance.imp();
175
176 imp.selection_changed()
177}
178
179unsafe extern "C" fn icon_view_select_all<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
180 let instance = &*(ptr as *mut T::Instance);
181 let imp = instance.imp();
182
183 imp.select_all()
184}
185
186unsafe extern "C" fn icon_view_unselect_all<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
187 let instance = &*(ptr as *mut T::Instance);
188 let imp = instance.imp();
189
190 imp.unselect_all()
191}
192
193unsafe extern "C" fn icon_view_select_cursor_item<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
194 let instance = &*(ptr as *mut T::Instance);
195 let imp = instance.imp();
196
197 imp.select_cursor_item()
198}
199
200unsafe extern "C" fn icon_view_toggle_cursor_item<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
201 let instance = &*(ptr as *mut T::Instance);
202 let imp = instance.imp();
203
204 imp.toggle_cursor_item()
205}
206
207unsafe extern "C" fn icon_view_move_cursor<T: IconViewImpl>(
208 ptr: *mut ffi::GtkIconView,
209 step: ffi::GtkMovementStep,
210 count: c_int,
211) -> glib::ffi::gboolean {
212 let instance = &*(ptr as *mut T::Instance);
213 let imp = instance.imp();
214
215 imp.move_cursor(from_glib(step), count).into_glib()
216}
217
218unsafe extern "C" fn icon_view_activate_cursor_item<T: IconViewImpl>(
219 ptr: *mut ffi::GtkIconView,
220) -> glib::ffi::gboolean {
221 let instance = &*(ptr as *mut T::Instance);
222 let imp = instance.imp();
223
224 imp.activate_cursor_item().into_glib()
225}