gtk/subclass/
icon_view.rs1use libc::c_int;
4
5use glib::object::Cast;
6use glib::subclass::prelude::*;
7use glib::translate::*;
8
9use super::container::ContainerImpl;
10
11use crate::MovementStep;
12use crate::TreePath;
13use crate::{IconView, ffi};
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 unsafe {
166 let instance = &*(ptr as *mut T::Instance);
167 let imp = instance.imp();
168 let path = from_glib_borrow(path);
169
170 imp.item_activated(&path)
171 }
172}
173
174unsafe extern "C" fn icon_view_selection_changed<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
175 unsafe {
176 let instance = &*(ptr as *mut T::Instance);
177 let imp = instance.imp();
178
179 imp.selection_changed()
180 }
181}
182
183unsafe extern "C" fn icon_view_select_all<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
184 unsafe {
185 let instance = &*(ptr as *mut T::Instance);
186 let imp = instance.imp();
187
188 imp.select_all()
189 }
190}
191
192unsafe extern "C" fn icon_view_unselect_all<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
193 unsafe {
194 let instance = &*(ptr as *mut T::Instance);
195 let imp = instance.imp();
196
197 imp.unselect_all()
198 }
199}
200
201unsafe extern "C" fn icon_view_select_cursor_item<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
202 unsafe {
203 let instance = &*(ptr as *mut T::Instance);
204 let imp = instance.imp();
205
206 imp.select_cursor_item()
207 }
208}
209
210unsafe extern "C" fn icon_view_toggle_cursor_item<T: IconViewImpl>(ptr: *mut ffi::GtkIconView) {
211 unsafe {
212 let instance = &*(ptr as *mut T::Instance);
213 let imp = instance.imp();
214
215 imp.toggle_cursor_item()
216 }
217}
218
219unsafe extern "C" fn icon_view_move_cursor<T: IconViewImpl>(
220 ptr: *mut ffi::GtkIconView,
221 step: ffi::GtkMovementStep,
222 count: c_int,
223) -> glib::ffi::gboolean {
224 unsafe {
225 let instance = &*(ptr as *mut T::Instance);
226 let imp = instance.imp();
227
228 imp.move_cursor(from_glib(step), count).into_glib()
229 }
230}
231
232unsafe extern "C" fn icon_view_activate_cursor_item<T: IconViewImpl>(
233 ptr: *mut ffi::GtkIconView,
234) -> glib::ffi::gboolean {
235 unsafe {
236 let instance = &*(ptr as *mut T::Instance);
237 let imp = instance.imp();
238
239 imp.activate_cursor_item().into_glib()
240 }
241}