1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files.git)
// DO NOT EDIT

use crate::Accessible;
use crate::Buildable;
use crate::ConstraintTarget;
use crate::Native;
use crate::Root;
use crate::Widget;
use glib::object::IsA;
use glib::object::ObjectType as ObjectType_;
use glib::signal::connect_raw;
use glib::signal::SignalHandlerId;
use glib::translate::*;
use std::boxed::Box as Box_;
use std::fmt;
use std::mem::transmute;

glib::wrapper! {
    /// [`DragIcon`][crate::DragIcon] is a [`Root`][crate::Root] implementation for drag icons.
    ///
    /// A drag icon moves with the pointer during a Drag-and-Drop operation
    /// and is destroyed when the drag ends.
    ///
    /// To set up a drag icon and associate it with an ongoing drag operation,
    /// use [`for_drag()`][Self::for_drag()] to get the icon for a drag. You can
    /// then use it like any other widget and use [`set_child()`][Self::set_child()]
    /// to set whatever widget should be used for the drag icon.
    ///
    /// Keep in mind that drag icons do not allow user input.
    ///
    /// # Implements
    ///
    /// [`WidgetExt`][trait@crate::prelude::WidgetExt], [`trait@glib::ObjectExt`], [`AccessibleExt`][trait@crate::prelude::AccessibleExt], [`BuildableExt`][trait@crate::prelude::BuildableExt], [`ConstraintTargetExt`][trait@crate::prelude::ConstraintTargetExt], [`NativeExt`][trait@crate::prelude::NativeExt], [`RootExt`][trait@crate::prelude::RootExt], [`WidgetExtManual`][trait@crate::prelude::WidgetExtManual], [`AccessibleExtManual`][trait@crate::prelude::AccessibleExtManual]
    #[doc(alias = "GtkDragIcon")]
    pub struct DragIcon(Object<ffi::GtkDragIcon, ffi::GtkDragIconClass>) @extends Widget, @implements Accessible, Buildable, ConstraintTarget, Native, Root;

    match fn {
        type_ => || ffi::gtk_drag_icon_get_type(),
    }
}

impl DragIcon {
    /// Gets the widget currently used as drag icon.
    ///
    /// # Returns
    ///
    /// The drag icon
    #[doc(alias = "gtk_drag_icon_get_child")]
    #[doc(alias = "get_child")]
    pub fn child(&self) -> Option<Widget> {
        unsafe { from_glib_none(ffi::gtk_drag_icon_get_child(self.to_glib_none().0)) }
    }

    /// Sets the widget to display as the drag icon.
    /// ## `child`
    /// a [`Widget`][crate::Widget]
    #[doc(alias = "gtk_drag_icon_set_child")]
    pub fn set_child(&self, child: Option<&impl IsA<Widget>>) {
        unsafe {
            ffi::gtk_drag_icon_set_child(
                self.to_glib_none().0,
                child.map(|p| p.as_ref()).to_glib_none().0,
            );
        }
    }

    /// Creates a widget that can be used as a drag icon for the given
    /// @value.
    ///
    /// Supported types include strings, [`gdk::RGBA`][crate::gdk::RGBA] and [`TextBuffer`][crate::TextBuffer].
    /// If GTK does not know how to create a widget for a given value,
    /// it will return [`None`].
    ///
    /// This method is used to set the default drag icon on drag-and-drop
    /// operations started by [`DragSource`][crate::DragSource], so you don't need to set
    /// a drag icon using this function there.
    /// ## `value`
    /// a `GValue`
    ///
    /// # Returns
    ///
    /// A new [`Widget`][crate::Widget]
    ///   for displaying @value as a drag icon.
    #[doc(alias = "gtk_drag_icon_create_widget_for_value")]
    pub fn create_widget_for_value(value: &glib::Value) -> Option<Widget> {
        assert_initialized_main_thread!();
        unsafe {
            from_glib_full(ffi::gtk_drag_icon_create_widget_for_value(
                value.to_glib_none().0,
            ))
        }
    }

    /// Gets the [`DragIcon`][crate::DragIcon] in use with @drag.
    ///
    /// If no drag icon exists yet, a new one will be created
    /// and shown.
    /// ## `drag`
    /// a [`gdk::Drag`][crate::gdk::Drag]
    ///
    /// # Returns
    ///
    /// the [`DragIcon`][crate::DragIcon]
    #[doc(alias = "gtk_drag_icon_get_for_drag")]
    #[doc(alias = "get_for_drag")]
    pub fn for_drag(drag: &gdk::Drag) -> Widget {
        assert_initialized_main_thread!();
        unsafe { from_glib_none(ffi::gtk_drag_icon_get_for_drag(drag.to_glib_none().0)) }
    }

    /// Creates a [`DragIcon`][crate::DragIcon] that shows @paintable, and associates
    /// it with the drag operation.
    ///
    /// The hotspot position on the paintable is aligned with the
    /// hotspot of the cursor.
    /// ## `drag`
    /// a [`gdk::Drag`][crate::gdk::Drag]
    /// ## `paintable`
    /// a [`gdk::Paintable`][crate::gdk::Paintable] to display
    /// ## `hot_x`
    /// X coordinate of the hotspot
    /// ## `hot_y`
    /// Y coordinate of the hotspot
    #[doc(alias = "gtk_drag_icon_set_from_paintable")]
    pub fn set_from_paintable(
        drag: &gdk::Drag,
        paintable: &impl IsA<gdk::Paintable>,
        hot_x: i32,
        hot_y: i32,
    ) {
        assert_initialized_main_thread!();
        unsafe {
            ffi::gtk_drag_icon_set_from_paintable(
                drag.to_glib_none().0,
                paintable.as_ref().to_glib_none().0,
                hot_x,
                hot_y,
            );
        }
    }

    #[doc(alias = "child")]
    pub fn connect_child_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn notify_child_trampoline<F: Fn(&DragIcon) + 'static>(
            this: *mut ffi::GtkDragIcon,
            _param_spec: glib::ffi::gpointer,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(&from_glib_borrow(this))
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"notify::child\0".as_ptr() as *const _,
                Some(transmute::<_, unsafe extern "C" fn()>(
                    notify_child_trampoline::<F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}

impl fmt::Display for DragIcon {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.write_str("DragIcon")
    }
}