1use crate::{Buffer, GutterLines, GutterRenderer, View, prelude::*};
7use glib::translate::*;
8use gtk::subclass::prelude::*;
9
10pub trait GutterRendererImpl: WidgetImpl + ObjectSubclass<Type: IsA<gtk::Widget>> {
11 fn query_data(&self, lines: &GutterLines, line: u32) {
12 self.parent_query_data(lines, line)
13 }
14
15 fn begin(&self, lines: &GutterLines) {
16 self.parent_begin(lines)
17 }
18
19 fn end(&self) {
20 self.parent_end()
21 }
22
23 fn change_buffer(&self, old_buffer: Option<&Buffer>) {
24 self.parent_change_buffer(old_buffer)
25 }
26
27 fn change_view(&self, old_view: Option<&View>) {
28 self.parent_change_view(old_view)
29 }
30
31 fn query_activatable(&self, iter: >k::TextIter, area: &gdk::Rectangle) -> bool {
32 self.parent_query_activatable(iter, area)
33 }
34
35 fn activate(
36 &self,
37 iter: >k::TextIter,
38 area: &gdk::Rectangle,
39 button: u32,
40 state: gdk::ModifierType,
41 n_presses: i32,
42 ) {
43 self.parent_activate(iter, area, button, state, n_presses)
44 }
45
46 fn snapshot_line(&self, snapshot: >k::Snapshot, lines: &GutterLines, line: u32) {
47 self.parent_snapshot_line(snapshot, lines, line)
48 }
49}
50
51pub trait GutterRendererImplExt: GutterRendererImpl {
52 fn parent_query_data(&self, lines: &GutterLines, line: u32) {
53 unsafe {
54 let data = Self::type_data();
55 let parent_class =
56 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
57 if let Some(f) = (*parent_class).query_data {
58 f(
59 self.obj()
60 .unsafe_cast_ref::<GutterRenderer>()
61 .to_glib_none()
62 .0,
63 lines.to_glib_none().0,
64 line,
65 )
66 }
67 }
68 }
69
70 fn parent_begin(&self, lines: &GutterLines) {
71 unsafe {
72 let data = Self::type_data();
73 let parent_class =
74 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
75 if let Some(f) = (*parent_class).begin {
76 f(
77 self.obj()
78 .unsafe_cast_ref::<GutterRenderer>()
79 .to_glib_none()
80 .0,
81 lines.to_glib_none().0,
82 )
83 }
84 }
85 }
86
87 fn parent_end(&self) {
88 unsafe {
89 let data = Self::type_data();
90 let parent_class =
91 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
92 if let Some(f) = (*parent_class).end {
93 f(self
94 .obj()
95 .unsafe_cast_ref::<GutterRenderer>()
96 .to_glib_none()
97 .0)
98 }
99 }
100 }
101
102 fn parent_change_buffer(&self, old_buffer: Option<&Buffer>) {
103 unsafe {
104 let data = Self::type_data();
105 let parent_class =
106 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
107 if let Some(f) = (*parent_class).change_buffer {
108 f(
109 self.obj()
110 .unsafe_cast_ref::<GutterRenderer>()
111 .to_glib_none()
112 .0,
113 old_buffer.to_glib_none().0,
114 )
115 }
116 }
117 }
118
119 fn parent_change_view(&self, old_view: Option<&View>) {
120 unsafe {
121 let data = Self::type_data();
122 let parent_class =
123 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
124 if let Some(f) = (*parent_class).change_view {
125 f(
126 self.obj()
127 .unsafe_cast_ref::<GutterRenderer>()
128 .to_glib_none()
129 .0,
130 old_view.to_glib_none().0,
131 )
132 }
133 }
134 }
135
136 fn parent_query_activatable(&self, iter: >k::TextIter, area: &gdk::Rectangle) -> bool {
137 unsafe {
138 let data = Self::type_data();
139 let parent_class =
140 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
141 if let Some(f) = (*parent_class).query_activatable {
142 from_glib(f(
143 self.obj()
144 .unsafe_cast_ref::<GutterRenderer>()
145 .to_glib_none()
146 .0,
147 mut_override(iter.to_glib_none().0),
148 mut_override(area.to_glib_none().0),
149 ))
150 } else {
151 false
152 }
153 }
154 }
155
156 fn parent_activate(
157 &self,
158 iter: >k::TextIter,
159 area: &gdk::Rectangle,
160 button: u32,
161 state: gdk::ModifierType,
162 n_presses: i32,
163 ) {
164 unsafe {
165 let data = Self::type_data();
166 let parent_class =
167 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
168 if let Some(f) = (*parent_class).activate {
169 f(
170 self.obj()
171 .unsafe_cast_ref::<GutterRenderer>()
172 .to_glib_none()
173 .0,
174 mut_override(iter.to_glib_none().0),
175 mut_override(area.to_glib_none().0),
176 button,
177 state.into_glib(),
178 n_presses,
179 )
180 }
181 }
182 }
183
184 fn parent_snapshot_line(&self, snapshot: >k::Snapshot, lines: &GutterLines, line: u32) {
185 unsafe {
186 let data = Self::type_data();
187 let parent_class =
188 data.as_ref().parent_class() as *mut ffi::GtkSourceGutterRendererClass;
189 if let Some(f) = (*parent_class).snapshot_line {
190 f(
191 self.obj()
192 .unsafe_cast_ref::<GutterRenderer>()
193 .to_glib_none()
194 .0,
195 snapshot.to_glib_none().0,
196 lines.to_glib_none().0,
197 line,
198 )
199 }
200 }
201 }
202}
203
204impl<T: GutterRendererImpl> GutterRendererImplExt for T {}
205
206unsafe impl<T: GutterRendererImpl> IsSubclassable<T> for GutterRenderer {
207 fn class_init(class: &mut glib::Class<Self>) {
208 Self::parent_class_init::<T>(class);
209
210 let klass = class.as_mut();
211 klass.query_data = Some(gutter_renderer_query_data::<T>);
212 klass.begin = Some(gutter_renderer_begin::<T>);
213 klass.end = Some(gutter_renderer_end::<T>);
214 klass.change_buffer = Some(gutter_renderer_change_buffer::<T>);
215 klass.change_view = Some(gutter_renderer_change_view::<T>);
216 klass.query_activatable = Some(gutter_renderer_query_activatable::<T>);
217 klass.activate = Some(gutter_renderer_activate::<T>);
218 klass.snapshot_line = Some(gutter_renderer_snapshot_line::<T>);
219 }
220}
221
222unsafe extern "C" fn gutter_renderer_query_data<T: GutterRendererImpl>(
223 ptr: *mut ffi::GtkSourceGutterRenderer,
224 lines: *mut ffi::GtkSourceGutterLines,
225 line: u32,
226) {
227 unsafe {
228 let instance = &*(ptr as *mut T::Instance);
229 let imp = instance.imp();
230 imp.query_data(&from_glib_borrow(lines), line);
231 }
232}
233
234unsafe extern "C" fn gutter_renderer_begin<T: GutterRendererImpl>(
235 ptr: *mut ffi::GtkSourceGutterRenderer,
236 lines: *mut ffi::GtkSourceGutterLines,
237) {
238 unsafe {
239 let instance = &*(ptr as *mut T::Instance);
240 let imp = instance.imp();
241 imp.begin(&from_glib_borrow(lines));
242 }
243}
244
245unsafe extern "C" fn gutter_renderer_end<T: GutterRendererImpl>(
246 ptr: *mut ffi::GtkSourceGutterRenderer,
247) {
248 unsafe {
249 let instance = &*(ptr as *mut T::Instance);
250 let imp = instance.imp();
251 imp.end();
252 }
253}
254
255unsafe extern "C" fn gutter_renderer_change_buffer<T: GutterRendererImpl>(
256 ptr: *mut ffi::GtkSourceGutterRenderer,
257 buffer: *mut ffi::GtkSourceBuffer,
258) {
259 unsafe {
260 let instance = &*(ptr as *mut T::Instance);
261 let imp = instance.imp();
262 let buffer: Borrowed<Option<Buffer>> = from_glib_borrow(buffer);
263 imp.change_buffer(buffer.as_ref().as_ref());
264 }
265}
266
267unsafe extern "C" fn gutter_renderer_change_view<T: GutterRendererImpl>(
268 ptr: *mut ffi::GtkSourceGutterRenderer,
269 view: *mut ffi::GtkSourceView,
270) {
271 unsafe {
272 let instance = &*(ptr as *mut T::Instance);
273 let imp = instance.imp();
274 let view: Borrowed<Option<View>> = from_glib_borrow(view);
275 imp.change_view(view.as_ref().as_ref());
276 }
277}
278
279unsafe extern "C" fn gutter_renderer_query_activatable<T: GutterRendererImpl>(
280 ptr: *mut ffi::GtkSourceGutterRenderer,
281 iter: *mut gtk::ffi::GtkTextIter,
282 rect: *mut gdk::ffi::GdkRectangle,
283) -> glib::ffi::gboolean {
284 unsafe {
285 let instance = &*(ptr as *mut T::Instance);
286 let imp = instance.imp();
287 imp.query_activatable(&from_glib_borrow(iter), &from_glib_borrow(rect))
288 .into_glib()
289 }
290}
291
292unsafe extern "C" fn gutter_renderer_activate<T: GutterRendererImpl>(
293 ptr: *mut ffi::GtkSourceGutterRenderer,
294 iter: *mut gtk::ffi::GtkTextIter,
295 rect: *mut gdk::ffi::GdkRectangle,
296 button: u32,
297 state: gdk::ffi::GdkModifierType,
298 n_presses: i32,
299) {
300 unsafe {
301 let instance = &*(ptr as *mut T::Instance);
302 let imp = instance.imp();
303 imp.activate(
304 &from_glib_borrow(iter),
305 &from_glib_borrow(rect),
306 button,
307 from_glib(state),
308 n_presses,
309 )
310 }
311}
312
313unsafe extern "C" fn gutter_renderer_snapshot_line<T: GutterRendererImpl>(
314 ptr: *mut ffi::GtkSourceGutterRenderer,
315 snapshot: *mut gtk::ffi::GtkSnapshot,
316 lines: *mut ffi::GtkSourceGutterLines,
317 line: u32,
318) {
319 unsafe {
320 let instance = &*(ptr as *mut T::Instance);
321 let imp = instance.imp();
322 imp.snapshot_line(&from_glib_borrow(snapshot), &from_glib_borrow(lines), line)
323 }
324}