summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-06-05 08:33:59 -0400
committerMatthias Clasen <mclasen@redhat.com>2015-06-05 08:33:59 -0400
commitdee0da30b65cea3bf59fcbe1ff147dff266f09f7 (patch)
treea0babf9f8d1e11c7bf91bb46ffae78f55fd46fa1 /tests
parent245daa415edcdd91a525bc244cec2a2bd40567ec (diff)
downloadgtk+-dee0da30b65cea3bf59fcbe1ff147dff266f09f7.tar.gz
Add a tree dnd testcase
This shows a minimal setup for enabling non-row DND from a treeview.
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am5
-rw-r--r--tests/testtreednd.c135
2 files changed, 140 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c3bda57fce..d5c40b8448 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -116,6 +116,7 @@ noinst_PROGRAMS = $(TEST_PROGS) \
testtoolbar2 \
stresstest-toolbar \
testtreechanging \
+ testtreednd \
testtreeedit \
testtreemodel \
testtreeview \
@@ -258,6 +259,7 @@ testspinbutton_DEPENDENCIES = $(TEST_DEPS)
teststatusicon_DEPENDENCIES = $(TEST_DEPS)
teststockbuttonmenu_DEPENDENCIES = $(TEST_DEPS)
testtreechanging_DEPENDENCIES = $(DEPS)
+testtreednd_DEPENDENCIES = $(DEPS)
testtreeedit_DEPENDENCIES = $(DEPS)
testtreemodel_DEPENDENCIES = $(DEPS)
testtreeview_DEPENDENCIES = $(DEPS)
@@ -368,6 +370,9 @@ testgtk_SOURCES = \
testtreechanging_SOURCES = \
testtreechanging.c
+testtreednd_SOURCES = \
+ testtreednd.c
+
testtreeedit_SOURCES = \
testtreeedit.c
diff --git a/tests/testtreednd.c b/tests/testtreednd.c
new file mode 100644
index 0000000000..0a84ec3b8a
--- /dev/null
+++ b/tests/testtreednd.c
@@ -0,0 +1,135 @@
+#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, 0 }
+};
+
+static GtkWidget *
+get_dragsource (void)
+{
+ GtkTreeView *tv;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ 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 ());
+ gtk_tree_view_enable_model_drag_source (tv, GDK_BUTTON1_MASK, entries, G_N_ELEMENTS (entries), GDK_ACTION_COPY);
+
+ return GTK_WIDGET (tv);
+}
+
+static void
+data_received (GtkWidget *widget,
+ GdkDragContext *context,
+ gint x, gint y,
+ GtkSelectionData *selda,
+ guint info, 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;
+
+ label = gtk_label_new ("Drop here");
+ gtk_drag_dest_set (label, GTK_DEST_DEFAULT_ALL, entries, G_N_ELEMENTS (entries), GDK_ACTION_COPY);
+ g_signal_connect (label, "drag-data-received", G_CALLBACK (data_received), NULL);
+
+ return label;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GtkWidget *window;
+ GtkWidget *box;
+
+ gtk_init (NULL, NULL);
+
+ 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_all (window);
+
+ gtk_main ();
+
+ return 0;
+}