[gtk+] Start a dnd demo



commit 2a49371e070d9303b1410ee986b1245552cb6e18
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Dec 5 16:22:06 2017 -0800

    Start a dnd demo
    
    Nothing to see yet.

 demos/gtk-demo/demo.gresource.xml |    4 +
 demos/gtk-demo/dnd.c              |  114 +++++++++++++++++++++++++++++++++++++
 demos/gtk-demo/dnd.css            |    6 ++
 demos/gtk-demo/meson.build        |    1 +
 4 files changed, 125 insertions(+), 0 deletions(-)
---
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index c3aef04..4539b40 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -151,6 +151,7 @@
     <file>cursors.c</file>
     <file>dialog.c</file>
     <file>drawingarea.c</file>
+    <file>dnd.c</file>
     <file>editable_cells.c</file>
     <file>entry_buffer.c</file>
     <file>entry_completion.c</file>
@@ -246,4 +247,7 @@
   <gresource prefix="/modelbutton">
     <file>modelbutton.ui</file>
   </gresource>
+  <gresource prefix="/dnd">
+    <file>dnd.css</file>
+  </gresource>
 </gresources>
diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c
new file mode 100644
index 0000000..85a4937
--- /dev/null
+++ b/demos/gtk-demo/dnd.c
@@ -0,0 +1,114 @@
+/* Drag-and-Drop
+ *
+ * I can't believe its not glade!
+ */
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <string.h>
+
+#define GTK_TYPE_DEMO_WIDGET (gtk_demo_widget_get_type ())
+
+G_DECLARE_FINAL_TYPE (GtkDemoWidget, gtk_demo_widget, GTK, DEMO_WIDGET, GtkWidget)
+
+static GtkWidget *gtk_demo_widget_new (void);
+
+struct _GtkDemoWidget
+{
+  GtkWidget parent_instance;
+};
+
+G_DEFINE_TYPE (GtkDemoWidget, gtk_demo_widget, GTK_TYPE_WIDGET)
+
+static void
+gtk_demo_widget_finalize (GObject *object)
+{
+  G_OBJECT_CLASS (gtk_demo_widget_parent_class)->finalize (object);
+}
+
+static void
+gtk_demo_widget_init (GtkDemoWidget *demo)
+{
+  gtk_widget_set_has_window (GTK_WIDGET (demo), FALSE);
+
+}
+
+static void
+gtk_demo_widget_class_init (GtkDemoWidgetClass *class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+  object_class->finalize = gtk_demo_widget_finalize;
+
+  gtk_widget_class_set_css_name (widget_class, "demo");
+}
+
+static GtkWidget *
+gtk_demo_widget_new (void)
+{
+  return g_object_new (GTK_TYPE_DEMO_WIDGET, NULL);
+}
+
+static void
+pressed_cb (GtkGesture *gesture,
+            int         n_press,
+            double      x,
+            double      y,
+            gpointer    data)
+{
+  GtkWidget *widget;
+
+  if (n_press < 2)
+    return;
+
+  widget = gtk_demo_widget_new ();
+
+  gtk_fixed_put (GTK_FIXED (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture))), widget, x, y);
+}
+
+static GtkWidget *window = NULL;
+
+GtkWidget *
+do_dnd (GtkWidget *do_widget)
+{
+  if (!window)
+    {
+      GtkWidget *vbox, *fixed;
+      GtkGesture *multipress;
+      GtkCssProvider *provider;
+
+      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      gtk_window_set_display (GTK_WINDOW (window),
+                              gtk_widget_get_display (do_widget));
+      gtk_window_set_title (GTK_WINDOW (window), "Drag-and-drop");
+
+      g_signal_connect (window, "destroy",
+                        G_CALLBACK (gtk_widget_destroyed), &window);
+
+      vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+      gtk_container_add (GTK_CONTAINER (window), vbox);
+
+      fixed = gtk_fixed_new ();
+      gtk_box_pack_start (GTK_BOX (vbox), fixed);
+      gtk_widget_set_hexpand (fixed, TRUE);
+      gtk_widget_set_vexpand (fixed, TRUE);
+
+      multipress = gtk_gesture_multi_press_new (fixed);
+      gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (multipress), 0);
+      g_signal_connect (multipress, "pressed", G_CALLBACK (pressed_cb), NULL);
+
+      provider = gtk_css_provider_new ();
+      gtk_css_provider_load_from_resource (provider, "/dnd/dnd.css");
+      gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+                                                  GTK_STYLE_PROVIDER (provider),
+                                                  800);
+    }
+
+  if (!gtk_widget_get_visible (window))
+    gtk_widget_show (window);
+  else
+    gtk_widget_destroy (window);
+
+  return window;
+}
diff --git a/demos/gtk-demo/dnd.css b/demos/gtk-demo/dnd.css
new file mode 100644
index 0000000..e9cfd56
--- /dev/null
+++ b/demos/gtk-demo/dnd.css
@@ -0,0 +1,6 @@
+demo {
+  background: red;
+  border: 1px solid black;
+  min-width: 30px;
+  min-height: 30px;
+}
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index ea34ee3..0d57447 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -18,6 +18,7 @@ demos = files([
   'cursors.c',
   'dialog.c',
   'drawingarea.c',
+  'dnd.c',
   'editable_cells.c',
   'entry_buffer.c',
   'entry_completion.c',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]