1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) Nikita Zlobin 2011 <nick87720z@gmail.com>
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>
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
;
39 GtkOrientation
* orientation
;
40 GooCanvasItem
* box
; /* Background */
41 GooCanvasItem
* caption
;
42 GooCanvasItem
* group
; /* Just a logical container, without any look */
46 double drag_hold_x
, drag_hold_y
;
48 } GModularGraph_Module
;
55 double wire_x
, wire_y
;
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
)
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
);
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
);
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
,
106 "radius-x", rounding
,
107 "radius-y", rounding
,
108 "stroke-color", "gray60",
109 "fill-color", "gray50",
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
);
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
,
128 "radius-x", rounding
,
129 "radius-y", rounding
,
130 "stroke-color", "gray60",
131 "fill-color", "gray50",
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
);
143 char * wire_data
= "M50,100 C100,100 50,200 100,200";
144 wire
= goo_canvas_path_new (root_item
,
147 "stroke-color", "black", NULL
);
148 wire
= goo_canvas_path_new (root_item
,
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
);
163 /* Helpers (nothing yet) */
165 /* Module callbacks */
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
);
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
);
187 gboolean
on_module_dragged (GooCanvasItem
* item
, GooCanvasItem
* target
, GdkEventMotion
* event
, gpointer data
)
190 //g_object_get (G_OBJECT (item), "line-width", & lw, NULL);
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);
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);
205 g_object_set (G_OBJECT (data
), "y", event
->y
- drag_hold_y
, NULL
);
213 gboolean
wire_entered (GooCanvasItem
*item
,
214 GooCanvasItem
*target
,
215 GdkEventCrossing
*event
,
218 g_object_set (item
, "stroke-color", "white", NULL
);
223 gboolean
wire_left (GooCanvasItem
*item
,
224 GooCanvasItem
*target
,
225 GdkEventCrossing
*event
,
228 g_object_set (item
, "stroke-color", "violet", NULL
);