forked from AuroraMiddleware/gtk
3f5178dc21
Instead of allowing people to pass a uint user-data, insist on them comparing mime types. The user data was a uint instead of a pointer anyway, so uniqueness could not be guaranteed and it caused more issues than it was worth. And that's ignoring the fact that it basically wasn't used.
142 lines
3.6 KiB
C
142 lines
3.6 KiB
C
#include <gtk/gtk.h>
|
|
|
|
typedef GtkListStore MyModel;
|
|
typedef GtkListStoreClass MyModelClass;
|
|
|
|
static void my_model_drag_source_init (GtkTreeDragSourceIface *iface);
|
|
|
|
G_DEFINE_TYPE_WITH_CODE (MyModel, my_model, GTK_TYPE_LIST_STORE,
|
|
G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
|
|
my_model_drag_source_init))
|
|
|
|
static void
|
|
my_model_class_init (MyModelClass *class)
|
|
{
|
|
}
|
|
|
|
static void
|
|
my_model_init (MyModel *object)
|
|
{
|
|
GType types[1] = { G_TYPE_STRING };
|
|
|
|
gtk_list_store_set_column_types (GTK_LIST_STORE (object), G_N_ELEMENTS (types), types);
|
|
}
|
|
|
|
static gboolean
|
|
my_model_drag_data_get (GtkTreeDragSource *source,
|
|
GtkTreePath *path,
|
|
GtkSelectionData *data)
|
|
{
|
|
GtkTreeIter iter;
|
|
gchar *text;
|
|
|
|
gtk_tree_model_get_iter (GTK_TREE_MODEL (source), &iter, path);
|
|
gtk_tree_model_get (GTK_TREE_MODEL (source), &iter, 0, &text, -1);
|
|
gtk_selection_data_set_text (data, text, -1);
|
|
g_free (text);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static void
|
|
my_model_drag_source_init (GtkTreeDragSourceIface *iface)
|
|
{
|
|
static GtkTreeDragSourceIface *parent;
|
|
|
|
parent = g_type_interface_peek_parent (iface);
|
|
|
|
iface->row_draggable = parent->row_draggable;
|
|
iface->drag_data_delete = parent->drag_data_delete;
|
|
iface->drag_data_get = my_model_drag_data_get;
|
|
}
|
|
|
|
static GtkTreeModel *
|
|
get_model (void)
|
|
{
|
|
MyModel *model;
|
|
|
|
model = g_object_new (my_model_get_type (), NULL);
|
|
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, -1, 0, "Item 1", -1);
|
|
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, -1, 0, "Item 2", -1);
|
|
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, -1, 0, "Item 3", -1);
|
|
|
|
return GTK_TREE_MODEL (model);
|
|
}
|
|
|
|
static GtkTargetEntry entries[] = {
|
|
{ "text/plain", 0 }
|
|
};
|
|
|
|
static GtkWidget *
|
|
get_dragsource (void)
|
|
{
|
|
GtkTreeView *tv;
|
|
GtkCellRenderer *renderer;
|
|
GtkTreeViewColumn *column;
|
|
GtkTargetList *targets;
|
|
|
|
tv = (GtkTreeView*) gtk_tree_view_new ();
|
|
renderer = gtk_cell_renderer_text_new ();
|
|
column = gtk_tree_view_column_new_with_attributes ("Text", renderer, "text", 0, NULL);
|
|
gtk_tree_view_append_column (tv, column);
|
|
|
|
gtk_tree_view_set_model (tv, get_model ());
|
|
targets = gtk_target_list_new (entries, G_N_ELEMENTS (entries));
|
|
gtk_tree_view_enable_model_drag_source (tv, GDK_BUTTON1_MASK, targets, GDK_ACTION_COPY);
|
|
gtk_target_list_unref (targets);
|
|
|
|
return GTK_WIDGET (tv);
|
|
}
|
|
|
|
static void
|
|
drag_data_received (GtkWidget *widget,
|
|
GdkDragContext *context,
|
|
gint x, gint y,
|
|
GtkSelectionData *selda,
|
|
guint time,
|
|
gpointer dada)
|
|
{
|
|
gchar *text;
|
|
|
|
text = (gchar*) gtk_selection_data_get_text (selda);
|
|
gtk_label_set_label (GTK_LABEL (widget), text);
|
|
g_free (text);
|
|
}
|
|
|
|
static GtkWidget *
|
|
get_droptarget (void)
|
|
{
|
|
GtkWidget *label;
|
|
GtkTargetList *targets;
|
|
|
|
label = gtk_label_new ("Drop here");
|
|
targets = gtk_target_list_new (entries, G_N_ELEMENTS (entries));
|
|
gtk_drag_dest_set (label, GTK_DEST_DEFAULT_ALL, targets, GDK_ACTION_COPY);
|
|
g_signal_connect (label, "drag-data-received", G_CALLBACK (drag_data_received), NULL);
|
|
gtk_target_list_unref (targets);
|
|
|
|
return label;
|
|
}
|
|
|
|
int
|
|
main (int argc, char *argv[])
|
|
{
|
|
GtkWidget *window;
|
|
GtkWidget *box;
|
|
|
|
gtk_init ();
|
|
|
|
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
|
|
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
|
gtk_container_add (GTK_CONTAINER (window), box);
|
|
gtk_container_add (GTK_CONTAINER (box), get_dragsource ());
|
|
gtk_container_add (GTK_CONTAINER (box), get_droptarget ());
|
|
|
|
gtk_widget_show (window);
|
|
|
|
gtk_main ();
|
|
|
|
return 0;
|
|
}
|