Module stuff is moved to structure; Add text caption; A little cleanup and refactoring;
[gmodulargraph.git] / src / gtkgraph-demo.c
blob76ec48a84af129ac6a82ee0375347be4f4c6637d
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 wire_entered (GooCanvasItem * item, GooCanvasItem * target, GdkEventCrossing * event, gpointer data);
30 static gboolean wire_left (GooCanvasItem * item, GooCanvasItem * target, GdkEventCrossing * event, gpointer data);
32 GtkWidget * root_menu, obj_menu, port_menu;
33 GooCanvasItem * wire;
35 #define drag_button 1
37 typedef
38 struct {
39 GtkOrientation * orientation;
40 GooCanvasItem * box; /* Background */
41 GooCanvasItem * caption;
42 GooCanvasItem * group; /* Just a logical container, without any look */
43 GList * ports;
45 /* Dragging data */
46 double drag_hold_x, drag_hold_y;
47 unsigned drag_cb;
48 } GModularGraph_Module;
50 typedef
51 struct {
52 GooCanvasItem * box;
53 GooCanvasItem * text;
55 double wire_x, wire_y;
56 double direction;
57 } GModularGraph_Port;
59 /* Canvas data */
60 GtkWidget * canvas;
61 GooCanvasItem * root_item;
62 double drag_hold_x = 0, drag_hold_y = 0;
63 static unsigned drag_cb[2] = {0, 0};
64 static double rounding = 3;
66 static GModularGraph_Module * module[2] = {NULL, NULL};
68 GModularGraph_Module * g_modular_graph_module_new
70 int main( int argc, char ** argv )
72 GtkWidget * win;
73 GtkWidget * scroller;
75 gtk_init (& argc, & argv);
76 win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
77 g_signal_connect (G_OBJECT (win), "delete-event", G_CALLBACK (gtk_main_quit), NULL);
79 scroller = gtk_scrolled_window_new (NULL, NULL);
80 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroller), GTK_SHADOW_IN);
81 gtk_container_add (GTK_CONTAINER (win), scroller);
83 /* Create canvas widget */
84 canvas = goo_canvas_new ();
85 gtk_widget_set_size_request (canvas, 600, 450);
86 goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
87 g_object_set (G_OBJECT (canvas), "automatic-bounds", TRUE, NULL);
89 gtk_container_add (GTK_CONTAINER (scroller), canvas);
91 /* Root */
92 root_item = goo_canvas_get_root_item (GOO_CANVAS (canvas));
93 g_object_set (G_OBJECT (root_item), "antialias", CAIRO_ANTIALIAS_SUBPIXEL, NULL);
94 g_object_set (G_OBJECT (root_item), "line-join", CAIRO_LINE_JOIN_ROUND, NULL);
95 g_object_set (G_OBJECT (root_item), "line-cap", CAIRO_LINE_CAP_ROUND, NULL);
96 g_object_set (G_OBJECT (root_item), "line-width", 1.0, NULL);
98 /* Object 1 */
100 module[0] = calloc (1, sizeof (GModularGraph_Module));
101 module[0]->group = goo_canvas_group_new (root_item, NULL);
102 g_object_set (module[0]->group, "tooltip", "Group Test", NULL);
104 module[0]->box = goo_canvas_rect_new (module[0]->group,
105 0.5, 0.5, 50, 20,
106 "radius-x", rounding,
107 "radius-y", rounding,
108 "stroke-color", "gray60",
109 "fill-color", "gray50",
110 NULL);
111 module[0]->caption = goo_canvas_text_new (module[0]->group, "Module 1",
112 rounding, 0, -1, GTK_ANCHOR_NORTH_WEST,
113 "font", "sans 8", NULL);
115 g_signal_connect (G_OBJECT (module[0]->group), "button-press-event", G_CALLBACK (on_module_buttonPress_event), drag_cb);
116 g_signal_connect (G_OBJECT (module[0]->group), "button-release-event", G_CALLBACK (on_module_buttonRelease_event), drag_cb);
118 g_object_set (module[0]->group, "x", 10.0, "y", 10.0, NULL);
120 /* Object 2 */
122 module[1] = calloc (1, sizeof (GModularGraph_Module));
123 module[1]->group = goo_canvas_group_new (root_item, NULL);
124 g_object_set (module[1]->group, "tooltip", "Group Test 2", NULL);
126 module[1]->box = goo_canvas_rect_new (module[1]->group,
127 0.5, 0.5, 50, 20,
128 "radius-x", rounding,
129 "radius-y", rounding,
130 "stroke-color", "gray60",
131 "fill-color", "gray50",
132 NULL);
133 module[1]->caption = goo_canvas_text_new (module[1]->group, "Module 2",
134 rounding, 0, -1, GTK_ANCHOR_NORTH_WEST,
135 "font", "sans 8", NULL);
137 g_signal_connect (G_OBJECT (module[1]->group), "button-press-event", G_CALLBACK (on_module_buttonPress_event), drag_cb);
138 g_signal_connect (G_OBJECT (module[1]->group), "button-release-event", G_CALLBACK (on_module_buttonRelease_event), drag_cb);
140 g_object_set (module[1]->group, "x", 200.0, "y", 10.0, NULL);
142 /* 2. Connection */
143 char * wire_data = "M50,100 C100,100 50,200 100,200";
144 wire = goo_canvas_path_new (root_item,
145 wire_data,
146 "line-width", 3.0,
147 "stroke-color", "black", NULL);
148 wire = goo_canvas_path_new (root_item,
149 wire_data,
150 "line-width", 2.0,
151 "stroke-color", "violet", NULL);
152 g_signal_connect (G_OBJECT (wire), "enter-notify-event", G_CALLBACK (wire_entered), NULL);
153 g_signal_connect (G_OBJECT (wire), "leave-notify-event", G_CALLBACK (wire_left), NULL);
155 gtk_widget_set_has_tooltip (canvas, TRUE);
156 g_object_set (wire, "tooltip", "Wire Test", NULL);
158 gtk_widget_show_all (win);
159 gtk_main ();
160 return 0;
163 /* Helpers (nothing yet) */
165 /* Module callbacks */
167 static
168 gboolean on_module_buttonPress_event (GooCanvasItem * item, GooCanvasItem * target, GdkEventButton * event, gpointer data)
170 g_object_get (G_OBJECT (item), "x", & drag_hold_x, "y", & drag_hold_y, NULL);
171 drag_hold_x = event->x - drag_hold_x;
172 drag_hold_y = event->y - drag_hold_y;
174 *(uint64_t *) data = g_signal_connect (G_OBJECT (root_item), "motion-notify-event", G_CALLBACK (on_module_dragged), item);
175 return TRUE;
178 static
179 gboolean on_module_buttonRelease_event (GooCanvasItem * item, GooCanvasItem * target, GdkEventButton * event, gpointer data)
181 if (*(uint64_t *) data)
182 g_signal_handler_disconnect (G_OBJECT (root_item), *(uint64_t *) data);
183 return TRUE;
186 static
187 gboolean on_module_dragged (GooCanvasItem * item, GooCanvasItem * target, GdkEventMotion * event, gpointer data)
189 //double lw;
190 //g_object_get (G_OBJECT (item), "line-width", & lw, NULL);
191 //lw /= 2.0;
192 //if (lw != trunc (lw))
193 //x[i] += 0.5, y[i] += 0.5;
197 //if (event->x < drag_hold_x)
198 //g_object_set (G_OBJECT (data), "x", 0.5, NULL);
199 //else
200 g_object_set (G_OBJECT (data), "x", event->x - drag_hold_x, NULL);
202 //if (event->y < drag_hold_y)
203 //g_object_set (G_OBJECT (data), "y", 0.5, NULL);
204 //else
205 g_object_set (G_OBJECT (data), "y", event->y - drag_hold_y, NULL);
207 return TRUE;
210 /* Wire callbacks */
212 static
213 gboolean wire_entered (GooCanvasItem *item,
214 GooCanvasItem *target,
215 GdkEventCrossing *event,
216 gpointer data)
218 g_object_set (item, "stroke-color", "white", NULL);
219 return TRUE;
222 static
223 gboolean wire_left (GooCanvasItem *item,
224 GooCanvasItem *target,
225 GdkEventCrossing *event,
226 gpointer data)
228 g_object_set (item, "stroke-color", "violet", NULL);
229 return TRUE;