[gegl/soc-2012-editor: 2/36] More experimentation with Cairo and GTK+. Added mouse input, simple drawing



commit c29b0c794b21200835223500897b6e2aa16aca43
Author: Isaac Wagner <isaacbw src gnome org>
Date:   Tue Jun 5 21:16:35 2012 -0400

    More experimentation with Cairo and GTK+. Added mouse input, simple drawing

 bin/editor/build              |    2 +-
 bin/editor/gegl-editor.c      |   14 ++++--
 bin/editor/gegl-node-widget.c |  121 ++++++++++++++++++++++++++++++++++++++++-
 bin/editor/gegl-node-widget.h |   29 ++++++----
 4 files changed, 147 insertions(+), 19 deletions(-)
---
diff --git a/bin/editor/build b/bin/editor/build
index 1ed29dd..ed50483 100755
--- a/bin/editor/build
+++ b/bin/editor/build
@@ -1 +1 @@
-gcc gegl-editor.c -o editor `pkg-config --cflags --libs gtk+-3.0`
\ No newline at end of file
+gcc gegl-editor.c gegl-node-widget.c -o editor `pkg-config --cflags --libs gtk+-2.0`
\ No newline at end of file
diff --git a/bin/editor/gegl-editor.c b/bin/editor/gegl-editor.c
index 19d4d09..9b9125a 100644
--- a/bin/editor/gegl-editor.c
+++ b/bin/editor/gegl-editor.c
@@ -1,20 +1,26 @@
 #include <glib.h>
 #include <gtk/gtk.h>
-#include <cairio.h>
+#include <cairo.h>
+#include "gegl-node-widget.h"
 
 
 gint
-main (gint argc,
-      gchar **argv)
+main (gint	  argc,
+      gchar	**argv)
 {
-  GtkWidget *window;
+  GtkWidget	*window;
+  GtkWidget	*editor;
 
   gtk_init(&argc, &argv);
 
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
+  editor = gegl_node_widget_new ();
+  gtk_container_add(GTK_CONTAINER(window), editor);
+
   g_signal_connect (window, "destroy", G_CALLBACK( gtk_main_quit), NULL);
 
+  gtk_widget_show(editor);
   gtk_widget_show(window);
 
   gtk_main();
diff --git a/bin/editor/gegl-node-widget.c b/bin/editor/gegl-node-widget.c
index b3b9dfd..d6b8c6f 100644
--- a/bin/editor/gegl-node-widget.c
+++ b/bin/editor/gegl-node-widget.c
@@ -1,5 +1,122 @@
 #include "gegl-node-widget.h"
 
-G_DEFINE_TYPE (NodeWidget, nodewidget, GtkWidget);
+G_DEFINE_TYPE (GeglNodeWidget, gegl_node_widget, GTK_TYPE_DRAWING_AREA);
+
+enum {
+  PROP_0,
+  N_PROPERTIES,
+};
+
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+
+static void
+gegl_node_widget_set_property (GObject	*object,
+			 guint		 property_id,
+			 const GValue	*value,
+			 GParamSpec	*pspec)
+{
+  GeglNodeWidget	*self = GEGL_NODE_WIDGET(object);
+
+  switch (property_id)
+    {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+gegl_node_widget_get_property (GObject	*object,
+			 guint		 property_id,
+			 GValue		*value,
+			 GParamSpec	*pspec)
+{
+  GeglNodeWidget*	self = GEGL_NODE_WIDGET(object);
+  
+  switch(property_id)
+    {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
+      break;
+    }
+}
+
+static gboolean
+gegl_node_widget_draw(GtkWidget *widget, cairo_t *cr)
+{
+  GeglNodeWidget*	editor = GEGL_NODE_WIDGET(widget);
+
+  cairo_set_source_rgb(cr, 0, 0, 0);
+  cairo_paint(cr);
+
+  cairo_arc(cr, editor->p_x, editor->p_y, 30, 0, 2*3.14159);
+  cairo_set_source_rgb(cr, 1, 1, 1);
+  cairo_stroke(cr);
+
+  return FALSE;
+}
+
+#if GTK_MAJOR_VERSION == (2)
+static gboolean
+gegl_node_widget_expose (GtkWidget *widget, GdkEventExpose *event)
+{
+  cairo_t	*cr = gdk_cairo_create(widget->window);
+
+  gegl_node_widget_draw(widget, cr);
+  cairo_destroy(cr);
+
+  return FALSE;
+}
+#endif
+
+static gboolean
+gegl_node_widget_motion(GtkWidget* widget, GdkEventMotion* event)
+{
+  GeglNodeWidget*	editor = GEGL_NODE_WIDGET(widget);
+  editor->p_x		       = (gint)event->x;
+  editor->p_y		       = (gint)event->y;
+
+  /* redraw */
+  gtk_widget_queue_draw(widget);
+
+  return FALSE;
+}
+
+static gboolean
+gegl_node_widget_button_press(GtkWidget* widget, GdkEventButton* event)
+{
+  g_print("button_press\n");
+  return FALSE;
+}
+
+static void
+gegl_node_widget_class_init(GeglNodeWidgetClass *klass)
+{
+  GtkWidgetClass	*widget_class = GTK_WIDGET_CLASS(klass);
+#if GTK_MAJOR_VERSION == (3)
+  widget_class->draw		      = gegl_node_widget_draw;
+#else
+  widget_class->expose_event	      = gegl_node_widget_expose;
+#endif
+  widget_class->motion_notify_event   = gegl_node_widget_motion;
+  widget_class->button_press_event    = gegl_node_widget_button_press;
+}
+
+
+
+static void
+gegl_node_widget_init(GeglNodeWidget* self)
+{
+  gtk_widget_add_events (GTK_WIDGET(self),
+			 GDK_POINTER_MOTION_MASK |
+			 GDK_BUTTON_PRESS_MASK   |
+			 GDK_BUTTON_RELEASE_MASK );
+}
+
+GtkWidget* 
+gegl_node_widget_new ( void )
+{
+  return g_object_new (GEGL_TYPE_NODE_WIDGET, NULL);
+}
+
 
-void nodewidget_class_init(NodeWidgetClass *klass);
diff --git a/bin/editor/gegl-node-widget.h b/bin/editor/gegl-node-widget.h
index 746fcbf..10b7e4e 100644
--- a/bin/editor/gegl-node-widget.h
+++ b/bin/editor/gegl-node-widget.h
@@ -4,27 +4,32 @@
 #define __NODEWIDGET_H__
 
 #include	<gtk/gtk.h>
+#include <glib-object.h>
 
-#define NODEWIDGET(obj)		GTK_CHECK_CAST (obj, nodewidget_get_type(), NodeWidget)
-#define NODEWIDGET_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, nodewidget_get_type(), NodeWidgetClass)
-#define IS_NODEWIDGET(obj)	GTK_CHECK_TYPE(obj, nodewidget_get_type())
+#define GEGL_TYPE_NODE_WIDGET			(gegl_node_widget_get_type())
+#define GEGL_NODE_WIDGET(obj)			(G_TYPE_CHECK_INSTANCE_CAST(obj, GEGL_TYPE_NODE_WIDGET, GeglNodeWidget))
+#define GEGL_NODE_WIDGET_CLASS(klass)		(G_TYPE_CHECK_CLASS_CAST (klass, GEGL_TYPE_NODE_WIDGET, GeglNodeWidgetClass))
+#define GEGL_IS_NODE_WIDGET(obj)		(G_TYPE_CHECK_INSTANCE_TYPE(obj, GEGL_TYPE_NODE_WIDGET))
+#define GEGL_IS_NODE_WIDGET_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE((klass), GEGL_TYPE_NODE_WIDGET))
+#define GEGL_NODE_WIDGET_GET_CLASS(obj)		(G_TYPE_INSTANCE_GET_CLASS((obj), GEGL_TYPE_NODE_WIDGET, NodeWidgetClass))
 
-typedef struct _NodeWidget NodeWidget;
-typedef struct _NodeWidgetClass NodeWidgetClass;
+typedef struct _GeglNodeWidget		GeglNodeWidget;
+typedef struct _GeglNodeWidgetClass	GeglNodeWidgetClass;
 
-struct _NodeWidget
+struct _GeglNodeWidget
 {
-  GtkWidget widget;
+  GtkDrawingArea	parent;
 
-  
+  /* private */
+  gint	p_x, p_y;
 };
 
-struct _NodeWidgetClass
+struct _GeglNodeWidgetClass
 {
-  GtkWidgetClass parent_class;
+  GtkDrawingAreaClass	parent_class;
 };
 
-GtkType nodewidget_get_type(void);
-NodeWidget* nodewdiget_new();
+GType		gegl_node_widget_get_type(void);
+GtkWidget*	gegl_node_widget_new(void);
 
 #endif



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