Fix return value of most callbacks (caused them to stop emission)
[gmodulargraph.git] / src / gtkgraph-demo.c
blobd6d2a51d3840836fc755af6b19eb15a9b7381e73
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * gtkgraph-demo.c
4 * Copyright (C) Nikita Zlobin 2011 <nick87720z@gmail.com>
5 *
6 * gtkgraph is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * gtkgraph is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include <goocanvas.h>
21 #include <math.h>
22 #include <stdint.h>
23 #include <stdlib.h>
25 static gboolean on_module_buttonPress_event (GooCanvasItem * item, GooCanvasItem * target, GdkEventButton * event, gpointer data);
26 static gboolean on_module_buttonRelease_event (GooCanvasItem * item, GooCanvasItem * target, GdkEventButton * event, gpointer data);
27 static gboolean on_module_dragged (GooCanvasItem * item, GooCanvasItem * target, GdkEventMotion * event, gpointer data);
29 static gboolean on_module_group_child_notify (GooCanvasItem * item, GParamSpec * event, gpointer data);
31 static gboolean wire_entered (GooCanvasItem * item, GooCanvasItem * target, GdkEventCrossing * event, gpointer data);
32 static gboolean wire_left (GooCanvasItem * item, GooCanvasItem * target, GdkEventCrossing * event, gpointer data);
34 GtkWidget * root_menu, obj_menu, port_menu;
35 GooCanvasItem * wire;
37 #define drag_button 1
39 typedef
40 struct {
41 GtkOrientation * orientation;
42 GooCanvasItem * box; /* Background */
43 GooCanvasItem * caption;
44 GooCanvasItem * group; /* Just a logical container, without any look */
45 GList * ports;
47 /* Dragging data */
48 double drag_hold_x, drag_hold_y;
49 unsigned drag_cb;
50 } GModularGraph_Module;
52 #define G_MODULAR_GRAPH_MODULE(p) ((GModularGraph_Module *) p)
54 typedef
55 struct {
56 GooCanvasItem * box;
57 GooCanvasItem * text;
59 double wire_x, wire_y;
60 double direction;
61 } GModularGraph_Port;
63 /* Canvas data */
64 GtkWidget * canvas;
65 GooCanvasItem * root_item;
66 static double rounding = 3;
68 static GModularGraph_Module * module[2] = {NULL, NULL};
70 GModularGraph_Module * g_modular_graph_module_new (GooCanvasItem * parent, char * caption, char * tooltip, int placing, int x, int y)
72 GModularGraph_Module * module;
74 module = calloc (1, sizeof (GModularGraph_Module));
75 module->group = goo_canvas_group_new (parent, "x", (double) x, "y", (double) y, "tooltip", tooltip, NULL);
77 module->box = goo_canvas_rect_new (module->group,
78 0.5, 0.5, 50, 20,
79 "radius-x", rounding,
80 "radius-y", rounding,
81 "stroke-color", "gray60",
82 "fill-color", "gray50",
83 NULL);
84 module->caption = goo_canvas_text_new (module->group, caption,
85 rounding, 0, -1, GTK_ANCHOR_NORTH_WEST,
86 "font", "sans 8", NULL);
87 g_signal_connect (G_OBJECT (module->group), "child-notify", G_CALLBACK (on_module_group_child_notify), NULL);
89 g_signal_connect (G_OBJECT (module->group), "button-press-event", G_CALLBACK (on_module_buttonPress_event), module);
90 g_signal_connect (G_OBJECT (module->group), "button-release-event", G_CALLBACK (on_module_buttonRelease_event), module);
92 return module;
95 int main( int argc, char ** argv )
97 GtkWidget * win;
98 GtkWidget * scroller;
100 gtk_init (& argc, & argv);
101 win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
102 g_signal_connect (G_OBJECT (win), "delete-event", G_CALLBACK (gtk_main_quit), NULL);
104 scroller = gtk_scrolled_window_new (NULL, NULL);
105 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroller), GTK_SHADOW_IN);
106 gtk_container_add (GTK_CONTAINER (win), scroller);
108 /* Create canvas widget */
109 canvas = goo_canvas_new ();
110 gtk_widget_set_size_request (canvas, 600, 450);
111 goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
112 g_object_set (G_OBJECT (canvas), "automatic-bounds", TRUE, NULL);
114 gtk_container_add (GTK_CONTAINER (scroller), canvas);
116 /* Root */
117 root_item = goo_canvas_get_root_item (GOO_CANVAS (canvas));
118 g_object_set (G_OBJECT (root_item), "antialias", CAIRO_ANTIALIAS_SUBPIXEL, NULL);
119 g_object_set (G_OBJECT (root_item), "line-join", CAIRO_LINE_JOIN_ROUND, NULL);
120 g_object_set (G_OBJECT (root_item), "line-cap", CAIRO_LINE_CAP_ROUND, NULL);
121 g_object_set (G_OBJECT (root_item), "line-width", 1.0, NULL);
123 module[0] = g_modular_graph_module_new (root_item, "Module 1", "Module 1 tip", 0, 50, 50);
124 module[1] = g_modular_graph_module_new (root_item, "Module 2", "Module 2 tip", 0, 200, 10);
126 /* 2. Connection */
127 char * wire_data = "M50,100 C100,100 50,200 100,200";
128 wire = goo_canvas_path_new (root_item,
129 wire_data,
130 "line-width", 3.0,
131 "stroke-color", "black", NULL);
132 wire = goo_canvas_path_new (root_item,
133 wire_data,
134 "line-width", 2.0,
135 "stroke-color", "violet", NULL);
136 g_signal_connect (G_OBJECT (wire), "enter-notify-event", G_CALLBACK (wire_entered), NULL);
137 g_signal_connect (G_OBJECT (wire), "leave-notify-event", G_CALLBACK (wire_left), NULL);
139 gtk_widget_set_has_tooltip (canvas, TRUE);
140 g_object_set (wire, "tooltip", "Wire Test", NULL);
142 gtk_widget_show_all (win);
143 gtk_main ();
144 return 0;
147 /* Helpers (nothing yet) */
149 /* Module callbacks */
150 #define DRAG_CB( mod ) (G_MODULAR_GRAPH_MODULE( mod )->drag_cb)
151 #define DRAG_HOLD_X( mod ) (G_MODULAR_GRAPH_MODULE( mod )->drag_hold_x)
152 #define DRAG_HOLD_Y( mod ) (G_MODULAR_GRAPH_MODULE( mod )->drag_hold_y)
154 static
155 gboolean on_module_buttonPress_event (GooCanvasItem * item, GooCanvasItem * target, GdkEventButton * event, gpointer data)
157 g_object_get (G_OBJECT (item),
158 "x", & DRAG_HOLD_X( data ),
159 "y", & DRAG_HOLD_Y( data ), NULL);
160 DRAG_HOLD_X( data ) = event->x - DRAG_HOLD_X( data );
161 DRAG_HOLD_Y( data ) = event->y - DRAG_HOLD_Y( data );
163 DRAG_CB( data ) = g_signal_connect (G_OBJECT (root_item), "motion-notify-event", G_CALLBACK (on_module_dragged), data);
164 return FALSE;
167 static
168 gboolean on_module_buttonRelease_event (GooCanvasItem * item, GooCanvasItem * target, GdkEventButton * event, gpointer data)
170 if (DRAG_CB( data ))
171 g_signal_handler_disconnect (G_OBJECT (root_item), DRAG_CB( data ));
172 return FALSE;
175 static
176 gboolean on_module_dragged (GooCanvasItem * item, GooCanvasItem * target, GdkEventMotion * event, gpointer data)
178 g_object_set (G_MODULAR_GRAPH_MODULE (data)->group, "x", event->x - DRAG_HOLD_X (data), NULL);
179 g_object_set (G_MODULAR_GRAPH_MODULE (data)->group, "y", event->y - DRAG_HOLD_Y (data), NULL);
181 return FALSE;
184 static gboolean on_module_group_child_notify (GooCanvasItem * item, GParamSpec * event, gpointer data)
186 return FALSE;
189 /* Wire callbacks */
191 static
192 gboolean wire_entered (GooCanvasItem *item,
193 GooCanvasItem *target,
194 GdkEventCrossing *event,
195 gpointer data)
197 g_object_set (item, "stroke-color", "white", NULL);
198 return FALSE;
201 static
202 gboolean wire_left (GooCanvasItem *item,
203 GooCanvasItem *target,
204 GdkEventCrossing *event,
205 gpointer data)
207 g_object_set (item, "stroke-color", "violet", NULL);
208 return FALSE;