GtkDragSource

描述 [src]

final class Gtk.DragSource : Gtk.GestureSingle
{
  /* No available fields */
}

GtkDragSource 是一个事件控制器,可用于启动拖放操作。

可以使用 GdkContentProvider 等形式的数据源在时间范围内设置 GtkDragSource 以获取所需的 DND 操作材料,例如希望的动作和在拖放操作期间使用的图标。设置完之后,必须使用 gtk_widget_add_controller() 将拖放源作为一个事件控制器添加到窗口小部件。

static void
my_widget_init (MyWidget *self)
{
  GtkDragSource *drag_source = gtk_drag_source_new ();

  g_signal_connect (drag_source, "prepare", G_CALLBACK (on_drag_prepare), self);
  g_signal_connect (drag_source, "drag-begin", G_CALLBACK (on_drag_begin), self);

  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (drag_source));
}

只有当数据没有变化时,提前设置内容提供商和图标才合理。更常见的做法是在需要时临时设置它们。为此,GtkDragSourceGtkDragSource::prepareGtkDragSource::drag-begin 信号。

::prepare 信号在拖放开始之前发出,可以用来设置拖放应该开始的内容提供商和动作。

static GdkContentProvider *
on_drag_prepare (GtkDragSource *source,
                 double         x,
                 double         y,
                 MyWidget      *self)
{
  // This widget supports two types of content: GFile objects
  // and GdkPixbuf objects; GTK will handle the serialization
  // of these types automatically
  GFile *file = my_widget_get_file (self);
  GdkPixbuf *pixbuf = my_widget_get_pixbuf (self);

  return gdk_content_provider_new_union ((GdkContentProvider *[2]) {
      gdk_content_provider_new_typed (G_TYPE_FILE, file),
      gdk_content_provider_new_typed (GDK_TYPE_PIXBUF, pixbuf),
    }, 2);
}

::drag-begin 信号在创建了 GdkDrag 对象后发出,可以用来设置拖放图标。

static void
on_drag_begin (GtkDragSource *source,
               GdkDrag       *drag,
               MyWidget      *self)
{
  // Set the widget as the drag icon
  GdkPaintable *paintable = gtk_widget_paintable_new (GTK_WIDGET (self));
  gtk_drag_source_set_icon (source, paintable, 0, 0);
  g_object_unref (paintable);
}

DND 操作期间,GtkDragSource 会发出可以用来获取操作状态更新的信号,但是通常不需要连接到任何信号,除了一个情况:当支持的操作包括 GDK_ACTION_MOVE 时,你需要监听 GtkDragSource::drag-end 信号并在其传输后删除数据。

层次结构

hierarchy this GtkDragSource ancestor_0 GtkGestureSingle ancestor_0--this ancestor_1 GtkGesture ancestor_1--ancestor_0 ancestor_2 GtkEventController ancestor_2--ancestor_1 ancestor_3 GObject ancestor_3--ancestor_2

构造函数

gtk_drag_source_new

创建一个新的 GtkDragSource 对象。

实例方法

gtk_drag_source_drag_cancel

取消当前进行中的拖放操作。

gtk_drag_source_get_actions

获取当前设置的 GtkDragSource 上的动作。

gtk_drag_source_get_content

获取 GtkDragSource 的当前内容提供商。

gtk_drag_source_get_drag

返回正在进行的拖放操作的基本 GdkDrag 对象。

gtk_drag_source_set_actions

GtkDragSource 上设置动作。

gtk_drag_source_set_content

GtkDragSource 上设置内容提供商。

gtk_drag_source_set_icon

设置在 DND 操作时用作图标的可绘制图形。

GtkGestureSingle 继承的方法 (8)
gtk_gesture_single_get_button

返回 gesture 响应的按钮编号。

gtk_gesture_single_get_current_button

返回与 gesture 当前交互的按钮编号,如果无按钮编号,则返回 0。

gtk_gesture_single_get_current_sequence

返回与 gesture 当前交互的事件顺序。

gtk_gesture_single_get_exclusive

获取手势是否是排他性的。

gtk_gesture_single_get_touch_only

如果手势仅由触控事件触发,则返回 TRUE

gtk_gesture_single_set_button

设置 gesture 响应的按钮编号。

gtk_gesture_single_set_exclusive

设置 gesture 是否是排他性的。

gtk_gesture_single_set_touch_only

设置是否只处理触控事件。

GtkGesture 继承的方法 (17)
gtk_gesture_get_bounding_box

如果当前由 gesture 处理触控顺序,则返回 TRUE,并在 rect 中填充包含所有活动触摸的边界框。

gtk_gesture_get_bounding_box_center

如果当前由 gesture 处理触控顺序,则返回 TRUE,并在 xy 中填充包含所有活动触摸的边界框中心。

gtk_gesture_get_device

返回当前在 gesture 上操作的逻辑 GdkDevice

gtk_gesture_get_group

返回 gesture 组中的所有手势。

gtk_gesture_get_last_event

返回为 sequence 处理的最后一个事件。

gtk_gesture_get_last_updated_sequence

返回 gesture 上最后更新的 GdkEventSequence

gtk_gesture_get_point

如果 gesture 当前正在解释 sequence,则返回 TRUE,并在 xy 中填充为此事件顺序存储的最后坐标。

gtk_gesture_get_sequence_state

返回 gesture 查看的 sequence 状态。

gtk_gesture_get_sequences

返回当前由 gesture 解释的 GdkEventSequences 列表。

gtk_gesture_group

gesture 添加到与 group_gesture 相同的组中。

gtk_gesture_handles_sequence

如果 gesture 当前正在处理与 sequence 相对应的事件,则返回 TRUE

gtk_gesture_is_active

如果手势当前处于活动状态,则返回 TRUE

gtk_gesture_is_grouped_with

如果两个手势都属于同一个组,则返回 TRUE

gtk_gesture_is_recognized

如果手势当前被识别,则返回 TRUE

gtk_gesture_set_sequence_state

gesture 中设置 sequence 的状态。

已弃用:4.10。 

gtk_gesture_set_state

设置 gesture 当前正在交互的所有序列的状态。

gtk_gesture_ungroup

gesture 分隔成一个独立的组。

GtkEventController 继承的方法 (13)
gtk_event_controller_get_current_event

返回控制器当前处理的事件。

gtk_event_controller_get_current_event_device

返回控制器当前处理的事件的设备。

gtk_event_controller_get_current_event_state

返回控制器当前处理的事件的修饰符状态。

gtk_event_controller_get_current_event_time

返回控制器当前处理的事件的时间戳。

gtk_event_controller_get_name

获取 controller 的名称。

gtk_event_controller_get_propagation_limit

获取事件控制器的传播限制。

gtk_event_controller_get_propagation_phase

获取控制器处理事件的传播阶段。

gtk_event_controller_get_widget

返回此控制器相关的 GtkWidget

gtk_event_controller_reset

controller 重置为初始状态。

gtk_event_controller_set_name

为控制器设置一个名称,可用于调试。

gtk_event_controller_set_propagation_limit

设置事件控制器上的事件传播限制。

gtk_event_controller_set_propagation_phase

设置控制器处理事件的传播阶段。

gtk_event_controller_set_static_name

为控制器设置一个名称,可用于调试。

since: 4.8

GObject (43) 继承的方法

请参阅 GObject 以获得完整的方法列表。

属性

Gtk.DragSource:actions

从源进行拖拽操作支持的操作。

Gtk.DragSource:content

此来源的拖拽操作提供的数据。

GtkGestureSingle (3) 继承的属性
Gtk.GestureSingle:button

要侦听的鼠标按钮号,或 0 表示侦听任何按钮。

Gtk.GestureSingle:exclusive

表示手势是排他性的。

Gtk.GestureSingle:touch-only

手势仅处理触摸事件。

GtkGesture (1) 继承的属性
Gtk.Gesture:n-points

触发此手势识别的触摸点数量。

GtkEventController (4) 继承的属性
Gtk.EventController:name

此控制器的名称,通常用于调试目的。

Gtk.EventController:propagation-limit

此控制器将处理的事件限制。

Gtk.EventController:propagation-phase

此控制器将处理事件的传播阶段。

Gtk.EventController:widget

接收控制器将处理的 GdkEvents 的窗口小部件。

信号

Gtk.DragSource::drag-begin

当开始拖拽时在拖拽源上发出。

Gtk.DragSource::drag-cancel

当拖拽失败时在拖拽源上发出。

Gtk.DragSource::drag-end

当完成拖拽时在拖拽源上发出。

Gtk.DragSource::prepare

当即将启动拖拽时发出。

GtkGesture (5) 继承的信号
GtkGesture::begin

当识别出手势时发出。

GtkGesture::cancel

每当序列被取消时发出。

GtkGesture::end

手势 停止识别事件序列为需要处理的内容时发出,或者触摸序列的数量变得高于或低于 GtkGesture:n-points 时发出。

GtkGesture::sequence-state-changed

每当序列状态发生变化时发出。

GtkGesture::update

每当在识别手势时处理事件时发出。

GObject (1) 继承的信号
GObject::notify

当对象的一个属性通过 g_object_set_property()、g_object_set() 等设置其值时,会在该对象上发出 notify 信号。

类结构

struct GtkDragSourceClass {
  /* no available fields */
}

无可用描述。