Commit a1fe3fb320c3404fb7beca1330fa1c8c3f97cd2b

Thomas de Grivel 2020-03-03T19:32:35

wip drag n drop

diff --git a/rtbuf_gtk.c b/rtbuf_gtk.c
index d95504b..ccda050 100644
--- a/rtbuf_gtk.c
+++ b/rtbuf_gtk.c
@@ -9,11 +9,57 @@ GtkWindow *modular = NULL;
 GtkLayout *modular_layout = NULL;
 GtkMenu *library_menu = NULL;
 
+void rtbuf_gtk_rtbuf_rename (RtbufWidget *widget)
+{
+  (void) widget;
+  printf("rtbuf-gtk rtbuf rename\n");
+}
+
+void rtbuf_gtk_rtbuf_menu (RtbufWidget *widget, GdkEventButton *event)
+{
+  GtkWidget *menu = gtk_menu_new();
+  GtkWidget *item = gtk_menu_item_new_with_label("Rename...");
+  gtk_container_add(GTK_CONTAINER(menu), item);
+  g_signal_connect_swapped(G_OBJECT(item), "activate",
+                           G_CALLBACK(rtbuf_gtk_rtbuf_rename),
+                           widget);
+  (void) event;
+  gtk_menu_popup(menu,
+                 NULL, NULL, NULL, NULL,
+                 event->button, event->time);
+}
+
+gboolean rtbuf_gtk_rtbuf_label_mouse_down (GtkWidget *widget,
+                                           GdkEventButton *event,
+                                           gpointer data)
+{
+  (void) widget;
+  (void) data;
+  if (event->type == GDK_BUTTON_PRESS) {
+    if (event->button == 1) {
+      printf("rtbuf-gtk rtbuf drag\n");
+      return TRUE;
+    }
+    else if (event->button == 3) {
+      printf("rtbuf-gtk rtbuf popup\n");
+      rtbuf_gtk_rtbuf_menu(RTBUF_WIDGET(widget), event);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+
 RtbufWidget * rtbuf_gtk_modular_layout_new (s_rtbuf *rtb,
                                             const gint x, const gint y)
 {
   RtbufWidget *widget = rtbuf_widget_new(rtb, "rtbuf");
+  GtkWidget *label;
   gtk_layout_put(modular_layout, GTK_WIDGET(widget), x, y);
+  label = rtbuf_widget_get_label_widget(widget);
+  g_signal_connect(G_OBJECT(label), "button-press-event",
+                   G_CALLBACK(rtbuf_gtk_rtbuf_label_mouse_down),
+                   NULL);
   return widget;
 }
 
diff --git a/rtbuf_widget.c b/rtbuf_widget.c
index b6354fa..16a1b26 100644
--- a/rtbuf_widget.c
+++ b/rtbuf_widget.c
@@ -20,9 +20,9 @@
 
 struct _RtbufWidgetPrivate {
   s_rtbuf *rtbuf;
-  GtkLabel *label;
-  GtkBox *inputs;
-  GtkBox *outputs;
+  GtkWidget *label;
+  GtkWidget *inputs;
+  GtkWidget *outputs;
 };
 
 enum {
@@ -145,6 +145,8 @@ rtbuf_widget_draw (GtkWidget *widget, cairo_t *cr, gpointer data)
   RtbufWidgetPrivate *priv = (RtbufWidgetPrivate*) data;
   cairo_set_source_rgb(cr, 1.0, 1.0, 0.7);
   cairo_paint(cr);
+  (void) widget;
+  (void) priv;
   return FALSE;
 }
 
@@ -164,7 +166,7 @@ void rtbuf_widget_set_label (RtbufWidget *widget,
   if (label) {
     RtbufWidgetPrivate *priv = rtbuf_widget_get_instance_private(widget);
     if (GTK_IS_LABEL(priv->label))
-      gtk_label_set_text(priv->label, label);
+      gtk_label_set_text(GTK_LABEL(priv->label), label);
   }
 }
 
@@ -175,7 +177,19 @@ rtbuf_widget_get_label (RtbufWidget *widget)
   g_return_val_if_fail(IS_RTBUF_WIDGET(widget), NULL);
   priv = rtbuf_widget_get_instance_private(widget);
   if (GTK_IS_LABEL(priv->label))
-    return gtk_label_get_text(priv->label);
+    return gtk_label_get_text(GTK_LABEL(priv->label));
+  else
+    return NULL;
+}
+
+GtkWidget *
+rtbuf_widget_get_label_widget (RtbufWidget *widget)
+{
+  RtbufWidgetPrivate *priv;
+  g_return_val_if_fail(IS_RTBUF_WIDGET(widget), NULL);
+  priv = rtbuf_widget_get_instance_private(widget);
+  if (GTK_IS_LABEL(priv->label))
+    return priv->label;
   else
     return NULL;
 }
diff --git a/rtbuf_widget.h b/rtbuf_widget.h
index 9a6dd41..ccff6af 100644
--- a/rtbuf_widget.h
+++ b/rtbuf_widget.h
@@ -19,12 +19,12 @@
 
 #include "rtbuf.h"
 
-#define RTBUF_WIDGET_TYPE            (rtbuf_widget_get_type ())
-#define RTBUF_WIDGET(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), RTBUF_WIDGET_TYPE, RtbufWidget))
-#define RTBUF_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), RTBUF_WIDGET_TYPE, RtbufWidgetClass))
-#define IS_RTBUF_WIDGET(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), RTBUF_WIDGET_TYPE))
-#define IS_RTBUF_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RTBUF_WIDGET_TYPE))
-#define RTBUF_WIDGET_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), RTBUF_WIDGET_TYPE, RtbufWidgetClass))
+#define RTBUF_WIDGET_TYPE            (rtbuf_widget_get_type())
+#define RTBUF_WIDGET(object)         (G_TYPE_CHECK_INSTANCE_CAST((object), RTBUF_WIDGET_TYPE, RtbufWidget))
+#define RTBUF_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), RTBUF_WIDGET_TYPE, RtbufWidgetClass))
+#define IS_RTBUF_WIDGET(object)      (G_TYPE_CHECK_INSTANCE_TYPE((object), RTBUF_WIDGET_TYPE))
+#define IS_RTBUF_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), RTBUF_WIDGET_TYPE))
+#define RTBUF_WIDGET_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), RTBUF_WIDGET_TYPE, RtbufWidgetClass))
 
 typedef struct _RtbufWidget RtbufWidget;
 typedef struct _RtbufWidgetClass RtbufWidgetClass;
@@ -38,8 +38,10 @@ struct _RtbufWidgetClass {
   GtkBoxClass parent_class;
 };
 
+GType rtbuf_widget_get_type (void) G_GNUC_CONST;
 RtbufWidget * rtbuf_widget_new (s_rtbuf *rtb, const gchar *label);
 void rtbuf_widget_set_label (RtbufWidget *widget, const gchar *label);
 const gchar * rtbuf_widget_get_label (RtbufWidget *widget);
+GtkWidget * rtbuf_widget_get_label_widget (RtbufWidget *widget);
 
 #endif