gtk4/auto/cell_editable.rs
1// This file was generated by gir (https://github.com/gtk-rs/gir)
2// from gir-files (https://github.com/gtk-rs/gir-files)
3// DO NOT EDIT
4#![allow(deprecated)]
5
6#[cfg(feature = "v4_10")]
7#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
8use crate::Accessible;
9use crate::{Buildable, ConstraintTarget, Widget, ffi};
10use glib::{
11 object::ObjectType as _,
12 prelude::*,
13 signal::{SignalHandlerId, connect_raw},
14 translate::*,
15};
16use std::boxed::Box as Box_;
17
18#[cfg(feature = "v4_10")]
19#[cfg_attr(docsrs, doc(cfg(feature = "v4_10")))]
20glib::wrapper! {
21 /// List views use widgets for displaying their
22 /// contents. See [`Editable`][crate::Editable] for editable text widgets
23 /// Interface for widgets that can be used for editing cells
24 ///
25 /// The [`CellEditable`][crate::CellEditable] interface must be implemented for widgets to be usable
26 /// to edit the contents of a [`TreeView`][crate::TreeView] cell. It provides a way to specify how
27 /// temporary widgets should be configured for editing, get the new value, etc.
28 ///
29 /// ## Properties
30 ///
31 ///
32 /// #### `editing-canceled`
33 /// Indicates whether editing on the cell has been canceled.
34 ///
35 /// Readable | Writable
36 /// <details><summary><h4>Widget</h4></summary>
37 ///
38 ///
39 /// #### `can-focus`
40 /// Whether the widget or any of its descendents can accept
41 /// the input focus.
42 ///
43 /// This property is meant to be set by widget implementations,
44 /// typically in their instance init function.
45 ///
46 /// Readable | Writable
47 ///
48 ///
49 /// #### `can-target`
50 /// Whether the widget can receive pointer events.
51 ///
52 /// Readable | Writable
53 ///
54 ///
55 /// #### `css-classes`
56 /// A list of css classes applied to this widget.
57 ///
58 /// Readable | Writable
59 ///
60 ///
61 /// #### `css-name`
62 /// The name of this widget in the CSS tree.
63 ///
64 /// This property is meant to be set by widget implementations,
65 /// typically in their instance init function.
66 ///
67 /// Readable | Writable | Construct Only
68 ///
69 ///
70 /// #### `cursor`
71 /// The cursor used by @widget.
72 ///
73 /// Readable | Writable
74 ///
75 ///
76 /// #### `focus-on-click`
77 /// Whether the widget should grab focus when it is clicked with the mouse.
78 ///
79 /// This property is only relevant for widgets that can take focus.
80 ///
81 /// Readable | Writable
82 ///
83 ///
84 /// #### `focusable`
85 /// Whether this widget itself will accept the input focus.
86 ///
87 /// Readable | Writable
88 ///
89 ///
90 /// #### `halign`
91 /// How to distribute horizontal space if widget gets extra space.
92 ///
93 /// Readable | Writable
94 ///
95 ///
96 /// #### `has-default`
97 /// Whether the widget is the default widget.
98 ///
99 /// Readable
100 ///
101 ///
102 /// #### `has-focus`
103 /// Whether the widget has the input focus.
104 ///
105 /// Readable
106 ///
107 ///
108 /// #### `has-tooltip`
109 /// Enables or disables the emission of the [`query-tooltip`][struct@crate::Widget#query-tooltip]
110 /// signal on @widget.
111 ///
112 /// A true value indicates that @widget can have a tooltip, in this case
113 /// the widget will be queried using [`query-tooltip`][struct@crate::Widget#query-tooltip] to
114 /// determine whether it will provide a tooltip or not.
115 ///
116 /// Readable | Writable
117 ///
118 ///
119 /// #### `height-request`
120 /// Overrides for height request of the widget.
121 ///
122 /// If this is -1, the natural request will be used.
123 ///
124 /// Readable | Writable
125 ///
126 ///
127 /// #### `hexpand`
128 /// Whether to expand horizontally.
129 ///
130 /// Readable | Writable
131 ///
132 ///
133 /// #### `hexpand-set`
134 /// Whether to use the `hexpand` property.
135 ///
136 /// Readable | Writable
137 ///
138 ///
139 /// #### `layout-manager`
140 /// The [`LayoutManager`][crate::LayoutManager] instance to use to compute
141 /// the preferred size of the widget, and allocate its children.
142 ///
143 /// This property is meant to be set by widget implementations,
144 /// typically in their instance init function.
145 ///
146 /// Readable | Writable
147 ///
148 ///
149 /// #### `limit-events`
150 /// Makes this widget act like a modal dialog, with respect to
151 /// event delivery.
152 ///
153 /// Global event controllers will not handle events with targets
154 /// inside the widget, unless they are set up to ignore propagation
155 /// limits. See [`EventControllerExt::set_propagation_limit()`][crate::prelude::EventControllerExt::set_propagation_limit()].
156 ///
157 /// Readable | Writable
158 ///
159 ///
160 /// #### `margin-bottom`
161 /// Margin on bottom side of widget.
162 ///
163 /// This property adds margin outside of the widget's normal size
164 /// request, the margin will be added in addition to the size from
165 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
166 ///
167 /// Readable | Writable
168 ///
169 ///
170 /// #### `margin-end`
171 /// Margin on end of widget, horizontally.
172 ///
173 /// This property supports left-to-right and right-to-left text
174 /// directions.
175 ///
176 /// This property adds margin outside of the widget's normal size
177 /// request, the margin will be added in addition to the size from
178 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
179 ///
180 /// Readable | Writable
181 ///
182 ///
183 /// #### `margin-start`
184 /// Margin on start of widget, horizontally.
185 ///
186 /// This property supports left-to-right and right-to-left text
187 /// directions.
188 ///
189 /// This property adds margin outside of the widget's normal size
190 /// request, the margin will be added in addition to the size from
191 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
192 ///
193 /// Readable | Writable
194 ///
195 ///
196 /// #### `margin-top`
197 /// Margin on top side of widget.
198 ///
199 /// This property adds margin outside of the widget's normal size
200 /// request, the margin will be added in addition to the size from
201 /// [`WidgetExt::set_size_request()`][crate::prelude::WidgetExt::set_size_request()] for example.
202 ///
203 /// Readable | Writable
204 ///
205 ///
206 /// #### `name`
207 /// The name of the widget.
208 ///
209 /// Readable | Writable
210 ///
211 ///
212 /// #### `opacity`
213 /// The requested opacity of the widget.
214 ///
215 /// Readable | Writable
216 ///
217 ///
218 /// #### `overflow`
219 /// How content outside the widget's content area is treated.
220 ///
221 /// This property is meant to be set by widget implementations,
222 /// typically in their instance init function.
223 ///
224 /// Readable | Writable
225 ///
226 ///
227 /// #### `parent`
228 /// The parent widget of this widget.
229 ///
230 /// Readable
231 ///
232 ///
233 /// #### `receives-default`
234 /// Whether the widget will receive the default action when it is focused.
235 ///
236 /// Readable | Writable
237 ///
238 ///
239 /// #### `root`
240 /// The [`Root`][crate::Root] widget of the widget tree containing this widget.
241 ///
242 /// This will be `NULL` if the widget is not contained in a root widget.
243 ///
244 /// Readable
245 ///
246 ///
247 /// #### `scale-factor`
248 /// The scale factor of the widget.
249 ///
250 /// Readable
251 ///
252 ///
253 /// #### `sensitive`
254 /// Whether the widget responds to input.
255 ///
256 /// Readable | Writable
257 ///
258 ///
259 /// #### `tooltip-markup`
260 /// Sets the text of tooltip to be the given string, which is marked up
261 /// with Pango markup.
262 ///
263 /// Also see [`Tooltip::set_markup()`][crate::Tooltip::set_markup()].
264 ///
265 /// This is a convenience property which will take care of getting the
266 /// tooltip shown if the given string is not `NULL`:
267 /// [`has-tooltip`][struct@crate::Widget#has-tooltip] will automatically be set to true
268 /// and there will be taken care of [`query-tooltip`][struct@crate::Widget#query-tooltip] in
269 /// the default signal handler.
270 ///
271 /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and
272 /// [`tooltip-markup`][struct@crate::Widget#tooltip-markup] are set, the last one wins.
273 ///
274 /// Readable | Writable
275 ///
276 ///
277 /// #### `tooltip-text`
278 /// Sets the text of tooltip to be the given string.
279 ///
280 /// Also see [`Tooltip::set_text()`][crate::Tooltip::set_text()].
281 ///
282 /// This is a convenience property which will take care of getting the
283 /// tooltip shown if the given string is not `NULL`:
284 /// [`has-tooltip`][struct@crate::Widget#has-tooltip] will automatically be set to true
285 /// and there will be taken care of [`query-tooltip`][struct@crate::Widget#query-tooltip] in
286 /// the default signal handler.
287 ///
288 /// Note that if both [`tooltip-text`][struct@crate::Widget#tooltip-text] and
289 /// [`tooltip-markup`][struct@crate::Widget#tooltip-markup] are set, the last one wins.
290 ///
291 /// Readable | Writable
292 ///
293 ///
294 /// #### `valign`
295 /// How to distribute vertical space if widget gets extra space.
296 ///
297 /// Readable | Writable
298 ///
299 ///
300 /// #### `vexpand`
301 /// Whether to expand vertically.
302 ///
303 /// Readable | Writable
304 ///
305 ///
306 /// #### `vexpand-set`
307 /// Whether to use the `vexpand` property.
308 ///
309 /// Readable | Writable
310 ///
311 ///
312 /// #### `visible`
313 /// Whether the widget is visible.
314 ///
315 /// Readable | Writable
316 ///
317 ///
318 /// #### `width-request`
319 /// Overrides for width request of the widget.
320 ///
321 /// If this is -1, the natural request will be used.
322 ///
323 /// Readable | Writable
324 /// </details>
325 /// <details><summary><h4>Accessible</h4></summary>
326 ///
327 ///
328 /// #### `accessible-role`
329 /// The accessible role of the given [`Accessible`][crate::Accessible] implementation.
330 ///
331 /// The accessible role cannot be changed once set.
332 ///
333 /// Readable | Writable
334 /// </details>
335 ///
336 /// ## Signals
337 ///
338 ///
339 /// #### `editing-done`
340 /// This signal is a sign for the cell renderer to update its
341 /// value from the @cell_editable.
342 ///
343 /// Implementations of [`CellEditable`][crate::CellEditable] are responsible for
344 /// emitting this signal when they are done editing, e.g.
345 /// [`Entry`][crate::Entry] emits this signal when the user presses Enter. Typical things to
346 /// do in a handler for ::editing-done are to capture the edited value,
347 /// disconnect the @cell_editable from signals on the [`CellRenderer`][crate::CellRenderer], etc.
348 ///
349 /// gtk_cell_editable_editing_done() is a convenience method
350 /// for emitting `GtkCellEditable::editing-done`.
351 ///
352 ///
353 ///
354 ///
355 /// #### `remove-widget`
356 /// This signal is meant to indicate that the cell is finished
357 /// editing, and the @cell_editable widget is being removed and may
358 /// subsequently be destroyed.
359 ///
360 /// Implementations of [`CellEditable`][crate::CellEditable] are responsible for
361 /// emitting this signal when they are done editing. It must
362 /// be emitted after the `GtkCellEditable::editing-done` signal,
363 /// to give the cell renderer a chance to update the cell's value
364 /// before the widget is removed.
365 ///
366 /// gtk_cell_editable_remove_widget() is a convenience method
367 /// for emitting `GtkCellEditable::remove-widget`.
368 ///
369 ///
370 /// <details><summary><h4>Widget</h4></summary>
371 ///
372 ///
373 /// #### `destroy`
374 /// Signals that all holders of a reference to the widget should release
375 /// the reference that they hold.
376 ///
377 /// May result in finalization of the widget if all references are released.
378 ///
379 /// This signal is not suitable for saving widget state.
380 ///
381 ///
382 ///
383 ///
384 /// #### `direction-changed`
385 /// Emitted when the text direction of a widget changes.
386 ///
387 ///
388 ///
389 ///
390 /// #### `hide`
391 /// Emitted when @widget is hidden.
392 ///
393 ///
394 ///
395 ///
396 /// #### `keynav-failed`
397 /// Emitted if keyboard navigation fails.
398 ///
399 /// See [`WidgetExt::keynav_failed()`][crate::prelude::WidgetExt::keynav_failed()] for details.
400 ///
401 ///
402 ///
403 ///
404 /// #### `map`
405 /// Emitted when @widget is going to be mapped.
406 ///
407 /// A widget is mapped when the widget is visible (which is controlled with
408 /// [`visible`][struct@crate::Widget#visible]) and all its parents up to the toplevel widget
409 /// are also visible.
410 ///
411 /// The `::map` signal can be used to determine whether a widget will be drawn,
412 /// for instance it can resume an animation that was stopped during the
413 /// emission of [`unmap`][struct@crate::Widget#unmap].
414 ///
415 ///
416 ///
417 ///
418 /// #### `mnemonic-activate`
419 /// Emitted when a widget is activated via a mnemonic.
420 ///
421 /// The default handler for this signal activates @widget if @group_cycling
422 /// is false, or just makes @widget grab focus if @group_cycling is true.
423 ///
424 ///
425 ///
426 ///
427 /// #### `move-focus`
428 /// to move backward.
429 ///
430 /// Action
431 ///
432 ///
433 /// #### `query-tooltip`
434 /// s tooltip is about to be shown.
435 ///
436 /// This happens when the [`has-tooltip`][struct@crate::Widget#has-tooltip] property
437 /// is true and the hover timeout has expired with the cursor hovering
438 /// above @widget; or emitted when @widget got focus in keyboard mode.
439 ///
440 /// Using the given coordinates, the signal handler should determine
441 /// whether a tooltip should be shown for @widget. If this is the case
442 /// true should be returned, false otherwise. Note that if @keyboard_mode
443 /// is true, the values of @x and @y are undefined and should not be used.
444 ///
445 /// The signal handler is free to manipulate @tooltip with the therefore
446 /// destined function calls.
447 ///
448 ///
449 ///
450 ///
451 /// #### `realize`
452 /// Emitted when @widget is associated with a [`gdk::Surface`][crate::gdk::Surface].
453 ///
454 /// This means that [`WidgetExt::realize()`][crate::prelude::WidgetExt::realize()] has been called
455 /// or the widget has been mapped (that is, it is going to be drawn).
456 ///
457 ///
458 ///
459 ///
460 /// #### `show`
461 /// Emitted when @widget is shown.
462 ///
463 ///
464 ///
465 ///
466 /// #### `state-flags-changed`
467 /// Emitted when the widget state changes.
468 ///
469 /// See [`WidgetExt::state_flags()`][crate::prelude::WidgetExt::state_flags()].
470 ///
471 ///
472 ///
473 ///
474 /// #### `unmap`
475 /// Emitted when @widget is going to be unmapped.
476 ///
477 /// A widget is unmapped when either it or any of its parents up to the
478 /// toplevel widget have been set as hidden.
479 ///
480 /// As `::unmap` indicates that a widget will not be shown any longer,
481 /// it can be used to, for example, stop an animation on the widget.
482 ///
483 ///
484 ///
485 ///
486 /// #### `unrealize`
487 /// Emitted when the [`gdk::Surface`][crate::gdk::Surface] associated with @widget is destroyed.
488 ///
489 /// This means that [`WidgetExt::unrealize()`][crate::prelude::WidgetExt::unrealize()] has been called
490 /// or the widget has been unmapped (that is, it is going to be hidden).
491 ///
492 ///
493 /// </details>
494 ///
495 /// # Implements
496 ///
497 /// [`CellEditableExt`][trait@crate::prelude::CellEditableExt], [`WidgetExt`][trait@crate::prelude::WidgetExt], [`trait@glib::ObjectExt`], [`AccessibleExt`][trait@crate::prelude::AccessibleExt], [`BuildableExt`][trait@crate::prelude::BuildableExt], [`ConstraintTargetExt`][trait@crate::prelude::ConstraintTargetExt], [`WidgetExtManual`][trait@crate::prelude::WidgetExtManual], [`AccessibleExtManual`][trait@crate::prelude::AccessibleExtManual]
498 #[doc(alias = "GtkCellEditable")]
499 pub struct CellEditable(Interface<ffi::GtkCellEditable, ffi::GtkCellEditableIface>) @requires Widget, Accessible, Buildable, ConstraintTarget;
500
501 match fn {
502 type_ => || ffi::gtk_cell_editable_get_type(),
503 }
504}
505
506#[cfg(not(feature = "v4_10"))]
507glib::wrapper! {
508 #[doc(alias = "GtkCellEditable")]
509 pub struct CellEditable(Interface<ffi::GtkCellEditable, ffi::GtkCellEditableIface>) @requires Widget, Buildable, ConstraintTarget;
510
511 match fn {
512 type_ => || ffi::gtk_cell_editable_get_type(),
513 }
514}
515
516impl CellEditable {
517 pub const NONE: Option<&'static CellEditable> = None;
518}
519
520/// Trait containing all [`struct@CellEditable`] methods.
521///
522/// # Implementors
523///
524/// [`CellEditable`][struct@crate::CellEditable], [`ComboBoxText`][struct@crate::ComboBoxText], [`ComboBox`][struct@crate::ComboBox], [`Entry`][struct@crate::Entry], [`SpinButton`][struct@crate::SpinButton]
525pub trait CellEditableExt: IsA<CellEditable> + 'static {
526 /// Emits the `GtkCellEditable::editing-done` signal.
527 ///
528 /// # Deprecated since 4.10
529 ///
530 #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
531 #[allow(deprecated)]
532 #[doc(alias = "gtk_cell_editable_editing_done")]
533 fn editing_done(&self) {
534 unsafe {
535 ffi::gtk_cell_editable_editing_done(self.as_ref().to_glib_none().0);
536 }
537 }
538
539 /// Emits the `GtkCellEditable::remove-widget` signal.
540 ///
541 /// # Deprecated since 4.10
542 ///
543 #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
544 #[allow(deprecated)]
545 #[doc(alias = "gtk_cell_editable_remove_widget")]
546 fn remove_widget(&self) {
547 unsafe {
548 ffi::gtk_cell_editable_remove_widget(self.as_ref().to_glib_none().0);
549 }
550 }
551
552 /// Begins editing on a @self.
553 ///
554 /// The [`CellRenderer`][crate::CellRenderer] for the cell creates and returns a [`CellEditable`][crate::CellEditable] from
555 /// gtk_cell_renderer_start_editing(), configured for the [`CellRenderer`][crate::CellRenderer] type.
556 ///
557 /// gtk_cell_editable_start_editing() can then set up @self suitably for
558 /// editing a cell, e.g. making the Esc key emit `GtkCellEditable::editing-done`.
559 ///
560 /// Note that the @self is created on-demand for the current edit; its
561 /// lifetime is temporary and does not persist across other edits and/or cells.
562 ///
563 /// # Deprecated since 4.10
564 ///
565 /// ## `event`
566 /// The [`gdk::Event`][crate::gdk::Event] that began the editing process, or
567 /// [`None`] if editing was initiated programmatically
568 #[cfg_attr(feature = "v4_10", deprecated = "Since 4.10")]
569 #[allow(deprecated)]
570 #[doc(alias = "gtk_cell_editable_start_editing")]
571 fn start_editing(&self, event: Option<impl AsRef<gdk::Event>>) {
572 unsafe {
573 ffi::gtk_cell_editable_start_editing(
574 self.as_ref().to_glib_none().0,
575 event.as_ref().map(|p| p.as_ref()).to_glib_none().0,
576 );
577 }
578 }
579
580 /// Indicates whether editing on the cell has been canceled.
581 #[doc(alias = "editing-canceled")]
582 fn is_editing_canceled(&self) -> bool {
583 ObjectExt::property(self.as_ref(), "editing-canceled")
584 }
585
586 /// Indicates whether editing on the cell has been canceled.
587 #[doc(alias = "editing-canceled")]
588 fn set_editing_canceled(&self, editing_canceled: bool) {
589 ObjectExt::set_property(self.as_ref(), "editing-canceled", editing_canceled)
590 }
591
592 /// This signal is a sign for the cell renderer to update its
593 /// value from the @cell_editable.
594 ///
595 /// Implementations of [`CellEditable`][crate::CellEditable] are responsible for
596 /// emitting this signal when they are done editing, e.g.
597 /// [`Entry`][crate::Entry] emits this signal when the user presses Enter. Typical things to
598 /// do in a handler for ::editing-done are to capture the edited value,
599 /// disconnect the @cell_editable from signals on the [`CellRenderer`][crate::CellRenderer], etc.
600 ///
601 /// gtk_cell_editable_editing_done() is a convenience method
602 /// for emitting `GtkCellEditable::editing-done`.
603 #[doc(alias = "editing-done")]
604 fn connect_editing_done<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
605 unsafe extern "C" fn editing_done_trampoline<P: IsA<CellEditable>, F: Fn(&P) + 'static>(
606 this: *mut ffi::GtkCellEditable,
607 f: glib::ffi::gpointer,
608 ) {
609 unsafe {
610 let f: &F = &*(f as *const F);
611 f(CellEditable::from_glib_borrow(this).unsafe_cast_ref())
612 }
613 }
614 unsafe {
615 let f: Box_<F> = Box_::new(f);
616 connect_raw(
617 self.as_ptr() as *mut _,
618 c"editing-done".as_ptr(),
619 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
620 editing_done_trampoline::<Self, F> as *const (),
621 )),
622 Box_::into_raw(f),
623 )
624 }
625 }
626
627 /// This signal is meant to indicate that the cell is finished
628 /// editing, and the @cell_editable widget is being removed and may
629 /// subsequently be destroyed.
630 ///
631 /// Implementations of [`CellEditable`][crate::CellEditable] are responsible for
632 /// emitting this signal when they are done editing. It must
633 /// be emitted after the `GtkCellEditable::editing-done` signal,
634 /// to give the cell renderer a chance to update the cell's value
635 /// before the widget is removed.
636 ///
637 /// gtk_cell_editable_remove_widget() is a convenience method
638 /// for emitting `GtkCellEditable::remove-widget`.
639 #[doc(alias = "remove-widget")]
640 fn connect_remove_widget<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
641 unsafe extern "C" fn remove_widget_trampoline<P: IsA<CellEditable>, F: Fn(&P) + 'static>(
642 this: *mut ffi::GtkCellEditable,
643 f: glib::ffi::gpointer,
644 ) {
645 unsafe {
646 let f: &F = &*(f as *const F);
647 f(CellEditable::from_glib_borrow(this).unsafe_cast_ref())
648 }
649 }
650 unsafe {
651 let f: Box_<F> = Box_::new(f);
652 connect_raw(
653 self.as_ptr() as *mut _,
654 c"remove-widget".as_ptr(),
655 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
656 remove_widget_trampoline::<Self, F> as *const (),
657 )),
658 Box_::into_raw(f),
659 )
660 }
661 }
662
663 #[doc(alias = "editing-canceled")]
664 fn connect_editing_canceled_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
665 unsafe extern "C" fn notify_editing_canceled_trampoline<
666 P: IsA<CellEditable>,
667 F: Fn(&P) + 'static,
668 >(
669 this: *mut ffi::GtkCellEditable,
670 _param_spec: glib::ffi::gpointer,
671 f: glib::ffi::gpointer,
672 ) {
673 unsafe {
674 let f: &F = &*(f as *const F);
675 f(CellEditable::from_glib_borrow(this).unsafe_cast_ref())
676 }
677 }
678 unsafe {
679 let f: Box_<F> = Box_::new(f);
680 connect_raw(
681 self.as_ptr() as *mut _,
682 c"notify::editing-canceled".as_ptr(),
683 Some(std::mem::transmute::<*const (), unsafe extern "C" fn()>(
684 notify_editing_canceled_trampoline::<Self, F> as *const (),
685 )),
686 Box_::into_raw(f),
687 )
688 }
689 }
690}
691
692impl<O: IsA<CellEditable>> CellEditableExt for O {}