Skip to main content

sourceview5/subclass/
gutter_renderer.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3// rustdoc-stripper-ignore-next
4//! Traits intended for subclassing [`GutterRenderer`](crate::GutterRenderer).
5
6use 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: &gtk::TextIter, area: &gdk::Rectangle) -> bool {
32        self.parent_query_activatable(iter, area)
33    }
34
35    fn activate(
36        &self,
37        iter: &gtk::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: &gtk::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: &gtk::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: &gtk::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: &gtk::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}