static void wire_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) { WireItem *wire_item = WIRE_ITEM (object); wire_item = WIRE_ITEM (object); switch (arg_id) { case WIRE_ITEM_ARG_NAME: break; } }
static void wire_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) { WireItem *wire_item = WIRE_ITEM (object); wire_item = WIRE_ITEM (object); switch (arg_id) { case WIRE_ITEM_ARG_NAME: break; default: //arg->type = G_TYPE_INVALID; break; } }
static void wire_rotated_callback (ItemData *data, int angle, SheetItem *sheet_item) { WireItem *wire_item; GooCanvasPoints *points; Coords start_pos, length; g_return_if_fail (sheet_item != NULL); g_return_if_fail (IS_WIRE_ITEM (sheet_item)); wire_item = WIRE_ITEM (sheet_item); wire_get_pos_and_length (WIRE (data), &start_pos, &length); points = goo_canvas_points_new (2); points->coords[0] = 0; points->coords[1] = 0; points->coords[2] = length.x; points->coords[3] = length.y; g_object_set (wire_item->priv->line, "points", points, NULL); goo_canvas_points_unref (points); g_object_set (wire_item, "x", start_pos.x, "y", start_pos.y, NULL); g_object_set (wire_item->priv->resize2, "x", length.x - RESIZER_SIZE, "y", length.y - RESIZER_SIZE, NULL); // Invalidate the bounding box cache. wire_item->priv->cache_valid = FALSE; }
static void wire_flipped_callback (ItemData *data, IDFlip direction, SheetItem *sheet_item) { GooCanvasPoints *points; WireItem *item; WireItemPriv *priv; Coords start_pos, length; g_return_if_fail (sheet_item != NULL); g_return_if_fail (IS_WIRE_ITEM (sheet_item)); item = WIRE_ITEM (sheet_item); priv = item->priv; wire_get_pos_and_length (WIRE (data), &start_pos, &length); points = goo_canvas_points_new (2); points->coords[0] = 0; points->coords[1] = 0; points->coords[2] = length.x; points->coords[3] = length.y; g_object_set (item->priv->line, "points", points, NULL); goo_canvas_points_unref (points); g_object_set (item, "x", start_pos.x, "y", start_pos.y, NULL); // Invalidate the bounding box cache. priv->cache_valid = FALSE; }
static void wire_item_destroy (GtkObject *object) { WireItem *wire; WireItemPriv *priv; g_return_if_fail (object != NULL); g_return_if_fail (IS_WIRE_ITEM (object)); wire = WIRE_ITEM (object); priv = wire->priv; if (priv) { if (priv->line) { /* TODO Check if destroy or unref have to be used for * GnomeCanvasItem */ gtk_object_destroy (GTK_OBJECT (priv->line)); priv->line = NULL; } g_free (priv); wire->priv = NULL; } if (GTK_OBJECT_CLASS(wire_item_parent_class)->destroy){ GTK_OBJECT_CLASS(wire_item_parent_class)->destroy(object); } }
static void wire_item_dispose (GObject *object) { WireItemPriv *priv; priv = WIRE_ITEM (object)->priv; g_clear_object (&(priv->line)); g_clear_object (&(priv->resize1)); g_clear_object (&(priv->resize2)); G_OBJECT_CLASS (wire_item_parent_class)->dispose (object); }
// "moved" signal handler. Invalidates the bounding box cache. static void wire_item_moved (SheetItem *object) { WireItem *item; WireItemPriv *priv; item = WIRE_ITEM (object); priv = item->priv; priv->cache_valid = FALSE; }
static void wire_item_finalize (GObject *object) { WireItemPriv *priv; priv = WIRE_ITEM (object)->priv; if (priv != NULL) { g_free (priv); } G_OBJECT_CLASS (wire_item_parent_class)->finalize (object); }
static gboolean is_in_area (SheetItem *object, Coords *p1, Coords *p2) { WireItem *item; Coords bbox_start, bbox_end; item = WIRE_ITEM (object); get_boundingbox (item, &bbox_start, &bbox_end); if (p1->x < bbox_start.x && p2->x > bbox_end.x && p1->y < bbox_start.y && p2->y > bbox_end.y) { return TRUE; } return FALSE; }
static gboolean is_in_area (SheetItem *object, SheetPos *p1, SheetPos *p2) { WireItem *item; SheetPos bbox_start, bbox_end; item = WIRE_ITEM (object); get_bbox (item, &bbox_start, &bbox_end); if (p1->x < bbox_start.x && p2->x > bbox_end.x && p1->y < bbox_start.y && p2->y > bbox_end.y) return TRUE; return FALSE; }
static void wire_rotated_callback (ItemData *data, int angle, SheetItem *sheet_item) { WireItem *wire_item; GnomeCanvasPoints *points; SheetPos start_pos, length; g_return_if_fail (sheet_item != NULL); g_return_if_fail (IS_WIRE_ITEM (sheet_item)); wire_item = WIRE_ITEM (sheet_item); wire_get_pos_and_length (WIRE (data), &start_pos, &length); points = gnome_canvas_points_new (2); points->coords[0] = 0; points->coords[1] = 0; points->coords[2] = length.x; points->coords[3] = length.y; gnome_canvas_item_set (GNOME_CANVAS_ITEM (wire_item->priv->line), "points", points, NULL); gnome_canvas_points_unref (points); gnome_canvas_item_set (GNOME_CANVAS_ITEM (wire_item), "x", start_pos.x, "y", start_pos.y, NULL); gnome_canvas_item_set ( GNOME_CANVAS_ITEM (wire_item-> priv->resize2), "x1", length.x-RESIZER_SIZE, "y1", length.y-RESIZER_SIZE, "x2", length.x+RESIZER_SIZE, "y2", length.y+RESIZER_SIZE, NULL ); /* * Invalidate the bounding box cache. */ wire_item->priv->cache_valid = FALSE; }
/** * This is called when the wire data was moved. Update the view accordingly. */ static void wire_moved_callback (ItemData *data, SheetPos *pos, SheetItem *item) { WireItem *wire_item; g_return_if_fail (data != NULL); g_return_if_fail (IS_ITEM_DATA (data)); g_return_if_fail (item != NULL); g_return_if_fail (IS_WIRE_ITEM (item)); if (pos == NULL) return; wire_item = WIRE_ITEM (item); /* * Move the canvas item and invalidate the bbox cache. */ gnome_canvas_item_move (GNOME_CANVAS_ITEM (item), pos->x, pos->y); wire_item->priv->cache_valid = FALSE; }
static void wire_flipped_callback (ItemData *data, gboolean horizontal, SheetItem *sheet_item) { GnomeCanvasPoints *points; WireItem *item; WireItemPriv *priv; SheetPos start_pos, length; g_return_if_fail (sheet_item != NULL); g_return_if_fail (IS_WIRE_ITEM (sheet_item)); item = WIRE_ITEM (sheet_item); priv = item->priv; wire_get_pos_and_length (WIRE (data), &start_pos, &length); points = gnome_canvas_points_new (2); points->coords[0] = 0; points->coords[1] = 0; points->coords[2] = length.x; points->coords[3] = length.y; gnome_canvas_item_set (GNOME_CANVAS_ITEM (item->priv->line), "points", points, NULL); gnome_canvas_points_unref (points); gnome_canvas_item_set (GNOME_CANVAS_ITEM (item), "x", start_pos.x, "y", start_pos.y, NULL); /* * Invalidate the bounding box cache. */ priv->cache_valid = FALSE; }
// This is called when the wire data was moved. Update the view accordingly. static void wire_moved_callback (ItemData *data, SheetPos *pos, SheetItem *item) { WireItem *wire_item; g_return_if_fail (data != NULL); g_return_if_fail (IS_ITEM_DATA (data)); g_return_if_fail (item != NULL); g_return_if_fail (IS_WIRE_ITEM (item)); if (pos == NULL) return; wire_item = WIRE_ITEM (item); // Move the canvas item and invalidate the bbox cache. goo_canvas_item_set_simple_transform (GOO_CANVAS_ITEM (item), pos->x, pos->y, 1.0, 0.0); wire_item->priv->cache_valid = FALSE; }
static void wire_item_place (SheetItem *item, Sheet *sheet) { wire_item_signal_connect_placed (WIRE_ITEM (item), sheet); }
WireItem * wire_item_new (Sheet *sheet, Wire *wire) { GooCanvasItem *item; WireItem *wire_item; GooCanvasPoints *points; WireItemPriv *priv; SheetPos start_pos, length; g_return_val_if_fail (sheet != NULL, NULL); g_return_val_if_fail (IS_SHEET (sheet), NULL); wire_get_pos_and_length (wire, &start_pos, &length); item = g_object_new (TYPE_WIRE_ITEM, NULL); g_object_set (item, "parent", sheet->object_group, NULL); wire_item = WIRE_ITEM (item); g_object_set (wire_item, "data", wire, NULL); priv = wire_item->priv; priv->resize1 = GOO_CANVAS_RECT (goo_canvas_rect_new ( GOO_CANVAS_ITEM (wire_item), -RESIZER_SIZE, -RESIZER_SIZE, 2 * RESIZER_SIZE, 2 * RESIZER_SIZE, "stroke-color", "blue", "fill-color", "green", "line-width", 1.0, NULL)); g_object_set (priv->resize1, "visibility", GOO_CANVAS_ITEM_INVISIBLE, NULL); priv->resize2 = GOO_CANVAS_RECT (goo_canvas_rect_new ( GOO_CANVAS_ITEM (wire_item), length.x - RESIZER_SIZE, length.y - RESIZER_SIZE, 2 * RESIZER_SIZE, 2 * RESIZER_SIZE, "stroke-color", "blue", "fill-color", "green", "line-width", 1.0, NULL)); g_object_set (priv->resize2, "visibility", GOO_CANVAS_ITEM_INVISIBLE, NULL); points = goo_canvas_points_new (2); points->coords[0] = 0; points->coords[1] = 0; points->coords[2] = length.x; points->coords[3] = length.y; priv->line = GOO_CANVAS_POLYLINE (goo_canvas_polyline_new ( GOO_CANVAS_ITEM (wire_item), FALSE, 0, "points", points, "stroke-color", "blue", "line-width", 1.0, NULL)); goo_canvas_points_unref (points); ITEM_DATA (wire)->rotated_handler_id = g_signal_connect_data (wire, "rotated", G_CALLBACK (wire_rotated_callback), G_OBJECT (wire_item), NULL, 0); g_signal_connect_data (wire, "flipped", G_CALLBACK (wire_flipped_callback), G_OBJECT (wire_item), NULL, 0); ITEM_DATA (wire)->moved_handler_id = g_signal_connect_object (wire, "moved", G_CALLBACK (wire_moved_callback), G_OBJECT (wire_item), 0); g_signal_connect (wire, "changed", G_CALLBACK (wire_changed_callback), wire_item); g_signal_connect (wire, "delete", G_CALLBACK (wire_delete_callback), wire_item); wire_update_bbox (wire); return wire_item; }
WireItem * wire_item_new (Sheet *sheet, Wire *wire) { WireItem *item; GnomeCanvasPoints *points; WireItemPriv *priv; SheetPos start_pos, length; g_return_val_if_fail (sheet != NULL, NULL); g_return_val_if_fail (IS_SHEET (sheet), NULL); //g_object_ref (G_OBJECT(wire)); /* XXX Ver si hay equivalente gtk_object_sink (GTK_OBJECT (wire)); */ wire_get_pos_and_length (wire, &start_pos, &length); /* * Because of the GnomeCanvasGroup inheritance, a small hack is needed * here. The group starts at the startpoint of the wire, and the line * goes from (0,0) to (length.x, length.y). */ item = WIRE_ITEM (gnome_canvas_item_new ( sheet->object_group, wire_item_get_type (), "data", wire, "x", (double) start_pos.x, "y", (double) start_pos.y, NULL)); priv = item->priv; priv->resize1 = GNOME_CANVAS_RECT (gnome_canvas_item_new ( GNOME_CANVAS_GROUP (item), gnome_canvas_rect_get_type (), "x1", -RESIZER_SIZE, "y1", -RESIZER_SIZE, "x2", RESIZER_SIZE, "y2", RESIZER_SIZE, "fill_color", "red", "fill_color_rgba", 0x3cb37180, "outline_color", "blue", "width_pixels", 1, NULL)); priv->resize2 = GNOME_CANVAS_RECT (gnome_canvas_item_new ( GNOME_CANVAS_GROUP (item), gnome_canvas_rect_get_type (), "x1", length.x-RESIZER_SIZE, "y1", length.y-RESIZER_SIZE, "x2", length.x+RESIZER_SIZE, "y2", length.y+RESIZER_SIZE, "fill_color", "red", "fill_color_rgba", 0x3cb37180, "outline_color", "blue", "width_pixels", 1, NULL)); gnome_canvas_item_hide (GNOME_CANVAS_ITEM (priv->resize1)); gnome_canvas_item_hide (GNOME_CANVAS_ITEM (priv->resize2)); points = gnome_canvas_points_new (2); points->coords[0] = 0; points->coords[1] = 0; points->coords[2] = length.x; points->coords[3] = length.y; priv->line = GNOME_CANVAS_LINE (gnome_canvas_item_new ( GNOME_CANVAS_GROUP (item), gnome_canvas_line_get_type (), "points", points, "fill_color", "blue", "width_pixels", 1, NULL)); gnome_canvas_points_free (points); g_signal_connect_object(G_OBJECT(wire), "rotated", G_CALLBACK(wire_rotated_callback), G_OBJECT(item), 0); g_signal_connect_object(G_OBJECT(wire), "flipped", G_CALLBACK(wire_flipped_callback), G_OBJECT(item), 0); g_signal_connect_object(G_OBJECT(wire), "moved", G_CALLBACK(wire_moved_callback), G_OBJECT(item), 0); g_signal_connect (G_OBJECT (wire), "changed", G_CALLBACK (wire_changed_callback), item); g_signal_connect (G_OBJECT (wire), "delete", G_CALLBACK (wire_delete_callback), item); wire_update_bbox (wire); return item; }
WireItem *wire_item_new (Sheet *sheet, Wire *wire) { GooCanvasItem *item; WireItem *wire_item; ItemData *item_data; GooCanvasPoints *points; WireItemPriv *priv; Coords start_pos, length; g_return_val_if_fail (sheet != NULL, NULL); g_return_val_if_fail (IS_SHEET (sheet), NULL); wire_get_pos_and_length (wire, &start_pos, &length); item = g_object_new (TYPE_WIRE_ITEM, NULL); g_object_set (item, "parent", sheet->object_group, NULL); wire_item = WIRE_ITEM (item); g_object_set (wire_item, "data", wire, NULL); priv = wire_item->priv; const int random_color_count = 9; const char *random_color[] = {"blue", "red", "green" /*, "yellow"*/, "orange", "brown", "purple", "pink", "lightblue", "lightgreen"}; priv->resize1 = GOO_CANVAS_RECT ( goo_canvas_rect_new (GOO_CANVAS_ITEM (wire_item), -RESIZER_SIZE, -RESIZER_SIZE, 2 * RESIZER_SIZE, 2 * RESIZER_SIZE, "stroke-color", oregano_options_debug_wires () ? random_color[g_random_int_range (0, random_color_count - 1)] : "blue", "fill-color", "green", "line-width", 1.0, NULL)); g_object_set (priv->resize1, "visibility", GOO_CANVAS_ITEM_INVISIBLE, NULL); priv->resize2 = GOO_CANVAS_RECT (goo_canvas_rect_new ( GOO_CANVAS_ITEM (wire_item), length.x - RESIZER_SIZE, length.y - RESIZER_SIZE, 2 * RESIZER_SIZE, 2 * RESIZER_SIZE, "stroke-color", oregano_options_debug_wires () ? random_color[g_random_int_range (0, random_color_count - 1)] : "blue", "fill-color", "green", "line-width", 1.0, NULL)); g_object_set (priv->resize2, "visibility", GOO_CANVAS_ITEM_INVISIBLE, NULL); points = goo_canvas_points_new (2); points->coords[0] = 0; points->coords[1] = 0; points->coords[2] = length.x; points->coords[3] = length.y; priv->line = GOO_CANVAS_POLYLINE (goo_canvas_polyline_new ( GOO_CANVAS_ITEM (wire_item), FALSE, 0, "points", points, "stroke-color", oregano_options_debug_wires () ? random_color[g_random_int_range (0, random_color_count - 1)] : "blue", "line-width", 1.0, "start-arrow", oregano_options_debug_wires () ? TRUE : FALSE, "end-arrow", oregano_options_debug_wires () ? TRUE : FALSE, NULL)); goo_canvas_points_unref (points); item_data = ITEM_DATA (wire); item_data->rotated_handler_id = g_signal_connect_object ( G_OBJECT (wire), "rotated", G_CALLBACK (wire_rotated_callback), G_OBJECT (wire_item), 0); item_data->flipped_handler_id = g_signal_connect_object ( G_OBJECT (wire), "flipped", G_CALLBACK (wire_flipped_callback), G_OBJECT (wire_item), 0); item_data->moved_handler_id = g_signal_connect_object ( G_OBJECT (wire), "moved", G_CALLBACK (wire_moved_callback), G_OBJECT (wire_item), 0); item_data->changed_handler_id = g_signal_connect_object ( G_OBJECT (wire), "changed", G_CALLBACK (wire_changed_callback), G_OBJECT (wire_item), 0); g_signal_connect (wire, "delete", G_CALLBACK (wire_delete_callback), wire_item); wire_update_bbox (wire); return wire_item; }
static void wire_item_place (SheetItem *item, SchematicView *sv) { wire_item_signal_connect_placed (WIRE_ITEM (item), sv); }