static void create_demo_table (GooCanvasItemModel *root, gdouble x, gdouble y, gdouble width, gdouble height) { GooCanvasItemModel *table, *square, *circle, *triangle; GooCanvasItem *item; table = goo_canvas_table_model_new (root, "row-spacing", 4.0, "column-spacing", 4.0, "width", width, "height", height, NULL); goo_canvas_item_model_translate (table, x, y); square = goo_canvas_rect_model_new (table, 0.0, 0.0, 50.0, 50.0, "fill-color", "red", NULL); goo_canvas_item_model_set_child_properties (table, square, "row", 0, "column", 0, "x-shrink", TRUE, NULL); item = goo_canvas_get_item (canvas, square); g_object_set_data (G_OBJECT (item), "id", "Red square"); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), NULL); circle = goo_canvas_ellipse_model_new (table, 0.0, 0.0, 25.0, 25.0, "fill-color", "blue", NULL); goo_canvas_item_model_set_child_properties (table, circle, "row", 0, "column", 1, "x-shrink", TRUE, NULL); item = goo_canvas_get_item (canvas, circle); g_object_set_data (G_OBJECT (item), "id", "Blue circle"); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), NULL); triangle = goo_canvas_polyline_model_new (table, TRUE, 3, 25.0, 0.0, 0.0, 50.0, 50.0, 50.0, "fill-color", "yellow", NULL); goo_canvas_item_model_set_child_properties (table, triangle, "row", 0, "column", 2, "x-shrink", TRUE, NULL); item = goo_canvas_get_item (canvas, triangle); g_object_set_data (G_OBJECT (item), "id", "Yellow triangle"); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), NULL); }
static GooCanvasItemModel* create_model (GdkPixbuf *pixbuf) { GooCanvasItemModel *root; GooCanvasItemModel *item; GooCanvasItemModel* child; root = goo_canvas_group_model_new (NULL, NULL); /* Test clipping of GooCanvasGroup: We put the rectangle and the ellipse into * a group with width=200 and height=200. */ item = goo_canvas_group_model_new (root, "x", 50.0, "y", 350.0, "width", 200.0, "height", 200.0, NULL); /*goo_canvas_item_model_rotate(item, 45.0, 150.0, 450.0);*/ child = goo_canvas_rect_model_new (item, 0.0, 0.0, 100, 100, "fill-color", "blue", NULL); g_object_set_data (G_OBJECT (child), "setup-dnd-signals", "TRUE"); goo_canvas_item_model_rotate(child, 45.0, 50.0, 50.0); child = goo_canvas_ellipse_model_new (item, 150, 00, 50, 50, "fill-color", "red", NULL); g_object_set_data (G_OBJECT (child), "setup-dnd-signals", "TRUE"); item = goo_canvas_polyline_model_new (root, FALSE, 5.0, 250.0, 350.0, 275.0, 400.0, 300.0, 350.0, 325.0, 400.0, 350.0, 350.0, "stroke-color", "cyan", "line-width", 5.0, NULL); g_object_set_data (G_OBJECT (item), "setup-dnd-signals", "TRUE"); item = goo_canvas_path_model_new (root, "M20,500 C20,450 100,450 100,500", "stroke-color", "green", "line-width", 5.0, NULL); g_object_set_data (G_OBJECT (item), "setup-dnd-signals", "TRUE"); item = goo_canvas_image_model_new (root, pixbuf, 150, 450, /*"fill-color", "yellow", */NULL); g_object_unref (pixbuf); g_object_set_data (G_OBJECT (item), "setup-dnd-signals", "TRUE"); item = goo_canvas_text_model_new (root, "Hello, World!", 250, 450, -1, GOO_CANVAS_ANCHOR_NW, "fill-color", "magenta", "wrap", PANGO_WRAP_WORD_CHAR, NULL); g_object_set_data (G_OBJECT (item), "setup-dnd-signals", "TRUE"); item = goo_canvas_table_model_new (root, "horz-grid-line-width", 2.0, "vert-grid-line-width", 2.0, "row-spacing", 2.0, "column-spacing", 2.0, NULL); goo_canvas_item_model_translate (item, 10.0, 10.0); g_object_set_data (G_OBJECT (item), "setup-dnd-signals", "TRUE"); child = goo_canvas_rect_model_new (item, 10.0, 10.0, 50.0, 50.0, "fill-color", "blue", "x", 10.0, "y", 25.0, NULL); g_object_set_data (G_OBJECT (child), "setup-dnd-signals", "TRUE"); goo_canvas_item_model_set_child_properties (item, child, "column", 0, "row", 0, "columns", 1, "rows", 1, NULL); /*goo_canvas_item_model_translate (child, 10.0, 10.0);*/ child = goo_canvas_rect_model_new (item, 0.0, 0.0, 50.0, 50.0, "fill-color", "red", NULL); g_object_set_data (G_OBJECT (child), "setup-dnd-signals", "TRUE"); goo_canvas_item_model_set_child_properties (item, child, "column", 1, "row", 0, "columns", 1, "rows", 1, NULL); child = goo_canvas_rect_model_new (item, 0.0, 0.0, 50.0, 50.0, "fill-color", "green", NULL); g_object_set_data (G_OBJECT (child), "setup-dnd-signals", "TRUE"); goo_canvas_item_model_set_child_properties(item, child, "column", 0, "row", 1, "columns", 1, "rows", 1, NULL); child = goo_canvas_rect_model_new (item, 0.0, 0.0, 50.0, 50.0, "fill-color", "yellow", NULL); g_object_set_data (G_OBJECT (child), "setup-dnd-signals", "TRUE"); goo_canvas_item_model_set_child_properties (item, child, "column", 1, "row", 1, "columns", 1, "rows", 1, NULL); return root; }
static void create_width_for_height_table (GooCanvasItemModel *root, gdouble x, gdouble y, gdouble width, gdouble height, gdouble rotation) { GooCanvasItemModel *table, *model; GooCanvasItem *item; gchar *text = "This is a long paragraph that will have to be split over a few lines so we can see if its allocated height changes when its allocated width is changed."; table = goo_canvas_table_model_new (root, #if 1 "width", width, "height", height, #endif NULL); goo_canvas_item_model_translate (table, x, y); goo_canvas_item_model_rotate (table, rotation, 0, 0); model = goo_canvas_rect_model_new (table, 0.0, 0.0, width - 2, 10.0, "fill-color", "red", NULL); goo_canvas_item_model_set_child_properties (table, model, "row", 0, "column", 0, "x-shrink", TRUE, NULL); #if 1 model = goo_canvas_text_model_new (table, text, 0, 0, -1, GTK_ANCHOR_NW, NULL); goo_canvas_item_model_set_child_properties (table, model, "row", 1, "column", 0, "x-expand", TRUE, "x-fill", TRUE, "x-shrink", TRUE, "y-expand", TRUE, "y-fill", TRUE, NULL); item = goo_canvas_get_item (canvas, model); g_object_set_data (G_OBJECT (item), "id", "Text Item"); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), NULL); #endif model = goo_canvas_rect_model_new (table, 0.0, 0.0, width - 2, 10.0, "fill-color", "red", NULL); goo_canvas_item_model_set_child_properties (table, model, "row", 2, "column", 0, "x-shrink", TRUE, NULL); }
static void scramble (GObject *object, gpointer data) { GooCanvas *canvas; GooCanvasItemModel **board; int i; int pos, oldpos; int dir; int x, y; srand (time (NULL)); canvas = data; board = g_object_get_data (G_OBJECT (canvas), "board"); /* First, find the blank spot */ for (pos = 0; pos < 16; pos++) if (board[pos] == NULL) break; /* "Move the blank spot" around in order to scramble the pieces */ for (i = 0; i < SCRAMBLE_MOVES; i++) { retry_scramble: dir = rand () % 4; x = y = 0; if ((dir == 0) && (pos > 3)) /* up */ y = -1; else if ((dir == 1) && (pos < 12)) /* down */ y = 1; else if ((dir == 2) && ((pos % 4) != 0)) /* left */ x = -1; else if ((dir == 3) && ((pos % 4) != 3)) /* right */ x = 1; else goto retry_scramble; oldpos = pos + y * 4 + x; board[pos] = board[oldpos]; board[oldpos] = NULL; g_object_set_data (G_OBJECT (board[pos]), "piece_pos", GINT_TO_POINTER (pos)); goo_canvas_item_model_translate (board[pos], -x * PIECE_SIZE, -y * PIECE_SIZE); pos = oldpos; } }
static void setup_canvas (GooCanvas *canvas) { GooCanvasItemModel *root, *model, *table; GooCanvasItem *item; root = goo_canvas_group_model_new (NULL, NULL); goo_canvas_set_root_item_model (canvas, root); g_object_unref (root); /* Plain items without clip path. */ model = goo_canvas_ellipse_model_new (root, 0, 0, 50, 30, "fill-color", "blue", NULL); goo_canvas_item_model_translate (model, 100, 100); goo_canvas_item_model_rotate (model, 30, 0, 0); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Blue ellipse (unclipped)"); model = goo_canvas_rect_model_new (root, 200, 50, 100, 100, "fill-color", "red", "clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD, NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Red rectangle (unclipped)"); model = goo_canvas_rect_model_new (root, 380, 50, 100, 100, "fill-color", "yellow", NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Yellow rectangle (unclipped)"); model = goo_canvas_text_model_new (root, "Sample Text", 520, 100, -1, GOO_CANVAS_ANCHOR_NW, NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Text (unclipped)"); /* Clipped items. */ model = goo_canvas_ellipse_model_new (root, 0, 0, 50, 30, "fill-color", "blue", "clip-path", "M 0 0 h 100 v 100 h -100 Z", NULL); goo_canvas_item_model_translate (model, 100, 300); goo_canvas_item_model_rotate (model, 30, 0, 0); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Blue ellipse"); model = goo_canvas_rect_model_new (root, 200, 250, 100, 100, "fill-color", "red", "clip-path", "M 250 300 h 100 v 100 h -100 Z", "clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD, NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Red rectangle"); model = goo_canvas_rect_model_new (root, 380, 250, 100, 100, "fill-color", "yellow", "clip-path", "M480,230 l40,100 l-80 0 z", NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Yellow rectangle"); model = goo_canvas_text_model_new (root, "Sample Text", 520, 300, -1, GOO_CANVAS_ANCHOR_NW, "clip-path", "M535,300 h75 v40 h-75 z", NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Text (unclipped)"); /* Table with clipped items. */ table = goo_canvas_table_model_new (root, NULL); goo_canvas_item_model_translate (table, 200, 400); goo_canvas_item_model_rotate (table, 30, 0, 0); model = goo_canvas_ellipse_model_new (table, 0, 0, 50, 30, "fill-color", "blue", "clip-path", "M 0 0 h 100 v 100 h -100 Z", NULL); goo_canvas_item_model_translate (model, 100, 300); goo_canvas_item_model_rotate (model, 30, 0, 0); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Blue ellipse"); model = goo_canvas_rect_model_new (table, 200, 250, 100, 100, "fill-color", "red", "clip-path", "M 250 300 h 100 v 100 h -100 Z", "clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD, NULL); goo_canvas_item_model_set_child_properties (table, model, "column", 1, NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Red rectangle"); model = goo_canvas_rect_model_new (table, 380, 250, 100, 100, "fill-color", "yellow", "clip-path", "M480,230 l40,100 l-80 0 z", NULL); goo_canvas_item_model_set_child_properties (table, model, "column", 2, NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Yellow rectangle"); model = goo_canvas_text_model_new (table, "Sample Text", 520, 300, -1, GOO_CANVAS_ANCHOR_NW, "clip-path", "M535,300 h75 v40 h-75 z", NULL); goo_canvas_item_model_set_child_properties (table, model, "column", 3, NULL); item = goo_canvas_get_item (canvas, model); g_signal_connect (item, "button_press_event", G_CALLBACK (on_button_press), "Text (unclipped)"); }
static GooCanvasItemModel* create_table (GooCanvasItemModel *parent, gint row, gint column, gint embedding_level, gdouble x, gdouble y, gdouble rotation, gdouble scale, gint demo_item_type) { GooCanvasItemModel *table; /* Add a few simple items. */ table = goo_canvas_table_model_new (parent, "row-spacing", 4.0, "column-spacing", 4.0, NULL); goo_canvas_item_model_translate (table, x, y); #if 1 goo_canvas_item_model_rotate (table, rotation, 0, 0); #endif #if 1 goo_canvas_item_model_scale (table, scale, scale); #endif if (row != -1) goo_canvas_item_model_set_child_properties (parent, table, "row", row, "column", column, #if 1 "x-expand", TRUE, "x-fill", TRUE, #endif #if 0 "y-expand", TRUE, "y-fill", TRUE, #endif NULL); if (embedding_level) { gint level = embedding_level - 1; create_table (table, 0, 0, level, 50, 50, 0, 0.7, demo_item_type); create_table (table, 0, 1, level, 50, 50, 45, 1.0, demo_item_type); create_table (table, 0, 2, level, 50, 50, 90, 1.0, demo_item_type); create_table (table, 1, 0, level, 50, 50, 135, 1.0, demo_item_type); create_table (table, 1, 1, level, 50, 50, 180, 1.5, demo_item_type); create_table (table, 1, 2, level, 50, 50, 225, 1.0, demo_item_type); create_table (table, 2, 0, level, 50, 50, 270, 1.0, demo_item_type); create_table (table, 2, 1, level, 50, 50, 315, 1.0, demo_item_type); create_table (table, 2, 2, level, 50, 50, 360, 2.0, demo_item_type); } else { create_demo_item (table, demo_item_type, 0, 0, 1, 1, "(0,0)"); create_demo_item (table, demo_item_type, 0, 1, 1, 1, "(1,0)"); create_demo_item (table, demo_item_type, 0, 2, 1, 1, "(2,0)"); create_demo_item (table, demo_item_type, 1, 0, 1, 1, "(0,1)"); create_demo_item (table, demo_item_type, 1, 1, 1, 1, "(1,1)"); create_demo_item (table, demo_item_type, 1, 2, 1, 1, "(2,1)"); create_demo_item (table, demo_item_type, 2, 0, 1, 1, "(0,2)"); create_demo_item (table, demo_item_type, 2, 1, 1, 1, "(1,2)"); create_demo_item (table, demo_item_type, 2, 2, 1, 1, "(2,2)"); } return table; }
GtkWidget * create_canvas_fifteen (void) { GtkWidget *vbox; GtkWidget *frame; GtkWidget *canvas; GtkWidget *button; GooCanvasItemModel **board; GooCanvasItemModel *root, *rect G_GNUC_UNUSED, *text; int i, x, y; char buf[20]; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4); g_object_set (vbox, "margin", 4, NULL); gtk_widget_show (vbox); frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE); gtk_widget_show (frame); g_object_set (frame, "halign", GTK_ALIGN_CENTER, "valign", GTK_ALIGN_CENTER, NULL); /* Create the canvas and board */ canvas = goo_canvas_new (); g_signal_connect (canvas, "item_created", G_CALLBACK (on_item_created), NULL); root = goo_canvas_group_model_new (NULL, NULL); goo_canvas_set_root_item_model (GOO_CANVAS (canvas), root); g_object_unref (root); gtk_widget_set_size_request (canvas, PIECE_SIZE * 4 + 1, PIECE_SIZE * 4 + 1); goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, PIECE_SIZE * 4 + 1, PIECE_SIZE * 4 + 1); gtk_container_add (GTK_CONTAINER (frame), canvas); gtk_widget_show (canvas); board = g_new (GooCanvasItemModel *, 16); g_object_set_data (G_OBJECT (canvas), "board", board); g_signal_connect (canvas, "destroy", G_CALLBACK (free_stuff), board); for (i = 0; i < 15; i++) { y = i / 4; x = i % 4; board[i] = goo_canvas_group_model_new (root, NULL); goo_canvas_item_model_translate (board[i], x * PIECE_SIZE, y * PIECE_SIZE); rect = goo_canvas_rect_model_new (board[i], 0, 0, PIECE_SIZE, PIECE_SIZE, "fill_color", get_piece_color (i), "stroke_color", "black", "line-width", 1.0, NULL); sprintf (buf, "%d", i + 1); text = goo_canvas_text_model_new (board[i], buf, PIECE_SIZE / 2.0, PIECE_SIZE / 2.0, -1, GOO_CANVAS_ANCHOR_CENTER, "font", "Sans bold 24", "fill_color", "black", NULL); g_object_set_data (G_OBJECT (board[i]), "text", text); g_object_set_data (G_OBJECT (board[i]), "piece_num", GINT_TO_POINTER (i)); g_object_set_data (G_OBJECT (board[i]), "piece_pos", GINT_TO_POINTER (i)); } board[15] = NULL; /* Scramble button */ button = gtk_button_new_with_label ("Scramble"); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE); g_object_set_data (G_OBJECT (button), "board", board); g_signal_connect (button, "clicked", G_CALLBACK (scramble), canvas); gtk_widget_show (button); return vbox; }
static gboolean piece_button_press (GooCanvasItem *item, GooCanvasItem *target, GdkEventButton *event, gpointer data) { GooCanvas *canvas; GooCanvasItemModel **board; GooCanvasItemModel *model, *text G_GNUC_UNUSED; int num G_GNUC_UNUSED, pos, newpos; int x, y; double dx = 0.0, dy = 0.0; int move; model = goo_canvas_item_get_model (item); canvas = goo_canvas_item_get_canvas (item); board = g_object_get_data (G_OBJECT (canvas), "board"); num = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "piece_num")); pos = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (model), "piece_pos")); text = g_object_get_data (G_OBJECT (model), "text"); #if 0 g_print ("In piece_event pos: %i,%i num: %i\n", pos % 4, pos / 4, num + 1); #endif y = pos / 4; x = pos % 4; move = TRUE; if ((y > 0) && (board[(y - 1) * 4 + x] == NULL)) { dx = 0.0; dy = -1.0; y--; } else if ((y < 3) && (board[(y + 1) * 4 + x] == NULL)) { dx = 0.0; dy = 1.0; y++; } else if ((x > 0) && (board[y * 4 + x - 1] == NULL)) { dx = -1.0; dy = 0.0; x--; } else if ((x < 3) && (board[y * 4 + x + 1] == NULL)) { dx = 1.0; dy = 0.0; x++; } else move = FALSE; if (move) { newpos = y * 4 + x; board[pos] = NULL; board[newpos] = model; g_object_set_data (G_OBJECT (model), "piece_pos", GINT_TO_POINTER (newpos)); goo_canvas_item_model_translate (model, dx * PIECE_SIZE, dy * PIECE_SIZE); test_win (board); } return FALSE; }
void create_table1 (GtkWidget *canvas, GooCanvasItemModel *parent, gdouble x, gdouble y, gdouble width, gdouble height, gboolean with_grid_lines) { GooCanvasItemModel *table, *items[9]; GooCanvasItem *item; GooCanvasBounds bounds; gint i = 0; table = goo_canvas_table_model_new (parent, "width", width, "height", height, NULL); goo_canvas_item_model_translate (table, x, y); if (with_grid_lines) { g_object_set (G_OBJECT (table), "row-spacing", 2.0, "column-spacing", 2.0, "x-border-spacing", 1.0, "y-border-spacing", 1.0, "horz-grid-line-width", 1.0, "vert-grid-line-width", 2.0, NULL); } items[i++] = create_item (table, 17.3, 12.9, 0, 0, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 33.1, 17.2, 1, 0, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 41.6, 23.9, 2, 0, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 7.1, 5.7, 0, 1, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 13.5, 18.2, 1, 1, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 25.2, 22.1, 2, 1, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 11.3, 11.7, 0, 2, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 21.7, 18.8, 1, 2, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); items[i++] = create_item (table, 22.2, 13.8, 2, 2, 1, 1, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE); for (i = 0; i < 9; i++) { item = goo_canvas_get_item (GOO_CANVAS (canvas), items[i]); goo_canvas_item_get_bounds (item, &bounds); g_print ("Item %i: %g,%g - %g,%g\n", i, bounds.x1 - x, bounds.y1 - y, bounds.x2 - x, bounds.y2 - y); } }
GtkWidget * create_canvas_features (void) { GtkWidget *vbox; GtkWidget *w; GtkWidget *frame; GtkWidget *canvas; GooCanvasItemModel *root, *item; GooCanvasItemModel *parent1; GooCanvasItemModel *parent2; GooCanvasItemModel *group; vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 4); g_object_set (vbox, "margin", 4, NULL); gtk_widget_show (vbox); /* Instructions */ w = gtk_label_new ("Reparent test: click on the items to switch them between parents"); gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE); gtk_widget_show (w); /* Frame and canvas */ frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE); gtk_widget_show (frame); g_object_set (frame, "halign", GTK_ALIGN_CENTER, "valign", GTK_ALIGN_CENTER, NULL); canvas = goo_canvas_new (); g_signal_connect (canvas, "item_created", G_CALLBACK (on_item_created), NULL); root = goo_canvas_group_model_new (NULL, NULL); gtk_widget_set_size_request (canvas, 400, 200); goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 400, 200); gtk_container_add (GTK_CONTAINER (frame), canvas); gtk_widget_show (canvas); /* First parent and box */ parent1 = goo_canvas_group_model_new (root, NULL); goo_canvas_rect_model_new (parent1, 0, 0, 200, 200, "fill_color", "tan", NULL); /* Second parent and box */ parent2 = goo_canvas_group_model_new (root, NULL); goo_canvas_item_model_translate (parent2, 200, 0); goo_canvas_rect_model_new (parent2, 0, 0, 200, 200, "fill_color", "#204060", NULL); /* Big circle to be reparented */ item = goo_canvas_ellipse_model_new (parent1, 100, 100, 90, 90, "stroke_color", "black", "fill_color", "mediumseagreen", "line-width", 3.0, NULL); g_object_set_data (G_OBJECT (item), "parent1", parent1); g_object_set_data (G_OBJECT (item), "parent2", parent2); #if 0 g_signal_connect (G_OBJECT (item), "event", G_CALLBACK (item_event), NULL); #endif /* A group to be reparented */ group = goo_canvas_group_model_new (parent2, NULL); goo_canvas_item_model_translate (group, 100, 100); goo_canvas_ellipse_model_new (group, 0, 0, 50, 50, "stroke_color", "black", "fill_color", "wheat", "line_width", 3.0, NULL); goo_canvas_ellipse_model_new (group, 0, 0, 25, 25, "fill_color", "steelblue", NULL); g_object_set_data (G_OBJECT (group), "parent1", parent1); g_object_set_data (G_OBJECT (group), "parent2", parent2); #if 0 g_signal_connect (G_OBJECT (group), "event", G_CALLBACK (item_event), NULL); #endif goo_canvas_set_root_item_model (GOO_CANVAS (canvas), root); g_object_unref (root); /* Done */ return vbox; }