int sheet_event_callback (GtkWidget *widget, GdkEvent *event, Sheet *sheet) { switch (event->type) { case GDK_3BUTTON_PRESS: // We don't not care about triple clicks on the sheet. return FALSE; case GDK_2BUTTON_PRESS: // The sheet does not care about double clicks, but invoke the // canvas event handler and see if an item picks up the event. if ((*GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->button_press_event) (widget, (GdkEventButton *)event)) return TRUE; else return FALSE; case GDK_BUTTON_PRESS: // If we are in the middle of something else, don't interfere // with that. if (sheet->state != SHEET_STATE_NONE) { return FALSE; } if ((* GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->button_press_event) (widget, (GdkEventButton *) event)) { return TRUE; } if (event->button.button == 3) { run_context_menu ( schematic_view_get_schematicview_from_sheet (sheet), (GdkEventButton *) event); return TRUE; } if (event->button.button == 1) { if (!(event->button.state & GDK_SHIFT_MASK)) sheet_select_all (sheet, FALSE); rubberband_start (sheet, event); return TRUE; } break; case GDK_BUTTON_RELEASE: if (event->button.button == 4 || event->button.button == 5) return TRUE; if (event->button.button == 1 && sheet->priv->rubberband_info->state == RUBBERBAND_ACTIVE) { rubberband_finish (sheet, event); return TRUE; } if (GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)->button_release_event != NULL) { return GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->button_release_event (widget, (GdkEventButton *) event); } break; case GDK_SCROLL: if (((GdkEventScroll *)event)->direction == GDK_SCROLL_UP) { double zoom; sheet_get_zoom (sheet, &zoom); if (zoom < ZOOM_MAX) sheet_change_zoom (sheet, 1.1); } else if (((GdkEventScroll *)event)->direction == GDK_SCROLL_DOWN) { double zoom; sheet_get_zoom (sheet, &zoom); if (zoom > ZOOM_MIN) sheet_change_zoom (sheet, 0.9); } break; case GDK_MOTION_NOTIFY: if (sheet->priv->rubberband_info->state == RUBBERBAND_ACTIVE) { rubberband_update (sheet, event); return TRUE; } if (GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->motion_notify_event != NULL) { return GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->motion_notify_event (widget, (GdkEventMotion *) event); } case GDK_ENTER_NOTIFY: GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->enter_notify_event (widget, (GdkEventCrossing *) event); case GDK_KEY_PRESS: switch (event->key.keyval) { case GDK_KEY_R: case GDK_KEY_r: if (sheet->state == SHEET_STATE_NONE) sheet_rotate_selection (sheet); break; case GDK_KEY_Home: case GDK_KEY_End: break; case GDK_KEY_Left: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, -20, 0); break; case GDK_KEY_Up: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, -20); break; case GDK_KEY_Right: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 20, 0); break; case GDK_KEY_Down: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, 20); break; case GDK_KEY_Page_Up: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, -120); break; case GDK_KEY_Page_Down: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, 120); break; case GDK_KEY_Escape: g_signal_emit_by_name (G_OBJECT (sheet), "cancel"); break; case GDK_KEY_Delete: sheet_delete_selection (sheet); break; default: return FALSE; } default: return FALSE; } return TRUE; }
gboolean wire_item_event (WireItem *wire_item, GooCanvasItem *sheet_target_item, GdkEvent *event, Sheet *sheet) { SheetPos start_pos, length; Wire *wire; GooCanvas *canvas; static double last_x, last_y; double dx, dy, zoom; // The selected group's bounding box in window resp. canvas coordinates. double snapped_x, snapped_y; SheetPos pos; canvas = GOO_CANVAS (sheet); g_object_get (G_OBJECT (wire_item), "data", &wire, NULL); wire_get_pos_and_length (WIRE (wire), &start_pos, &length); sheet_get_zoom (sheet, &zoom); switch (event->type) { case GDK_BUTTON_PRESS: switch (event->button.button) { case 1: { double x, y; g_signal_stop_emission_by_name (wire_item, "button_press_event"); sheet_get_pointer (sheet, &x, &y); x = x - start_pos.x; y = y - start_pos.y; if ((x > -RESIZER_SIZE) && (x < RESIZER_SIZE) && (y > -RESIZER_SIZE) && (y < RESIZER_SIZE)) { gtk_widget_grab_focus (GTK_WIDGET (sheet)); sheet->state = SHEET_STATE_DRAG_START; wire_item->priv->resize_state = WIRE_RESIZER_1; sheet_get_pointer (sheet, &x, &y); last_x = x; last_y = y; item_data_unregister (ITEM_DATA (wire)); return TRUE; } if ((x > (length.x-RESIZER_SIZE)) && (x < (length.x+RESIZER_SIZE)) && (y > (length.y-RESIZER_SIZE)) && (y < (length.y+RESIZER_SIZE))) { gtk_widget_grab_focus (GTK_WIDGET (sheet)); sheet->state = SHEET_STATE_DRAG_START; wire_item->priv->resize_state = WIRE_RESIZER_2; sheet_get_pointer (sheet, &x, &y); last_x = x; last_y = y; item_data_unregister (ITEM_DATA (wire)); return TRUE; } } break; } break; case GDK_MOTION_NOTIFY: if (sheet->state != SHEET_STATE_DRAG && sheet->state != SHEET_STATE_DRAG_START) break; if (wire_item->priv->resize_state == WIRE_RESIZER_NONE) break; if (sheet->state == SHEET_STATE_DRAG_START || sheet->state == SHEET_STATE_DRAG) { g_signal_stop_emission_by_name (wire_item, "motion-notify-event"); sheet->state = SHEET_STATE_DRAG; sheet_get_pointer (sheet, &snapped_x, &snapped_y); dx = snapped_x - last_x; dy = snapped_y - last_y; last_x = snapped_x; last_y = snapped_y; wire_get_pos_and_length (wire, &pos, &length); if (wire_item->priv->resize_state == WIRE_RESIZER_1) { switch (wire->priv->direction) { case WIRE_DIR_VERT: /* Vertical Wire */ pos.y = last_y; length.y -= dy; break; case WIRE_DIR_HORIZ: /* Horizontal Wire */ pos.x = last_x; length.x -= dx; break; default: pos.y = last_y; length.y -= dy; pos.x = last_x; length.x -= dx; } } else { switch (wire->priv->direction) { case WIRE_DIR_VERT: /* Vertical Wire */ length.y += dy; break; case WIRE_DIR_HORIZ: /* Horizontal Wire */ length.x += dx; break; default: length.y += dy; length.x += dx; } } snap_to_grid (sheet->grid, &length.x, &length.y); item_data_set_pos (sheet_item_get_data (SHEET_ITEM (wire_item)), &pos); wire_set_length (wire, &length); return TRUE; } break; case GDK_BUTTON_RELEASE: switch (event->button.button) { case 1: if (sheet->state != SHEET_STATE_DRAG && sheet->state != SHEET_STATE_DRAG_START) { break; } if (wire_item->priv->resize_state == WIRE_RESIZER_NONE) { break; } g_signal_stop_emission_by_name (wire_item, "button-release-event"); goo_canvas_pointer_ungrab (canvas, GOO_CANVAS_ITEM (wire_item), event->button.time); wire_item->priv->resize_state = WIRE_RESIZER_NONE; sheet->state = SHEET_STATE_NONE; item_data_register (ITEM_DATA (wire)); return TRUE; } break; default: return sheet_item_event (GOO_CANVAS_ITEM (wire_item), GOO_CANVAS_ITEM (wire_item), event, sheet); } return sheet_item_event (GOO_CANVAS_ITEM (wire_item), GOO_CANVAS_ITEM (wire_item), event, sheet); }
static int wire_item_event (WireItem *wire_item, const GdkEvent *event, SchematicView *sv) { SheetPos start_pos, length; Wire *wire; Sheet *sheet; GnomeCanvas *canvas; static double last_x, last_y; double dx, dy, zoom; /* The selected group's bounding box in window resp. canvas coordinates. */ double x1, y1, x2, y2; static double bb_x1, bb_y1, bb_x2, bb_y2; int cx1, cy1, cx2, cy2; double snapped_x, snapped_y; int sheet_width, sheet_height; SheetPos pos; sheet = schematic_view_get_sheet (sv); canvas = GNOME_CANVAS (sheet); g_object_get (G_OBJECT (wire_item), "data", &wire, NULL); wire_get_pos_and_length (WIRE (wire), &start_pos, &length); sheet_get_zoom (sheet, &zoom); switch (event->type) { case GDK_BUTTON_PRESS: switch (event->button.button) { case 1: { g_signal_stop_emission_by_name (G_OBJECT (sheet), "event"); double x, y; x = event->button.x - start_pos.x; y = event->button.y - start_pos.y; if ((x > -RESIZER_SIZE) && (x < RESIZER_SIZE) && (y > -RESIZER_SIZE) && (y < RESIZER_SIZE)) { gtk_widget_grab_focus (GTK_WIDGET (sheet)); sheet->state = SHEET_STATE_DRAG_START; wire_item->priv->resize_state = WIRE_RESIZER_1; last_x = event->button.x; last_y = event->button.y; item_data_unregister (ITEM_DATA (wire)); return TRUE; } if ((x > (length.x-RESIZER_SIZE)) && (x < (length.x+RESIZER_SIZE)) && (y > (length.y-RESIZER_SIZE)) && (y < (length.y+RESIZER_SIZE))) { gtk_widget_grab_focus (GTK_WIDGET (sheet)); sheet->state = SHEET_STATE_DRAG_START; wire_item->priv->resize_state = WIRE_RESIZER_2; last_x = event->button.x; last_y = event->button.y; item_data_unregister (ITEM_DATA (wire)); return TRUE; } } break; } break; case GDK_MOTION_NOTIFY: if (sheet->state != SHEET_STATE_DRAG && sheet->state != SHEET_STATE_DRAG_START) break; if (wire_item->priv->resize_state == WIRE_RESIZER_NONE) break; if (sheet->state == SHEET_STATE_DRAG_START || sheet->state == SHEET_STATE_DRAG) { sheet->state = SHEET_STATE_DRAG; snapped_x = event->motion.x; snapped_y = event->motion.y; snap_to_grid (sheet->grid, &snapped_x, &snapped_y); dx = snapped_x - last_x; dy = snapped_y - last_y; last_x = snapped_x; last_y = snapped_y; wire_get_pos_and_length (wire, &pos, &length); if (wire_item->priv->resize_state == WIRE_RESIZER_1) { switch (wire->priv->direction) { case WIRE_DIR_VERT: /* Vertical Wire */ pos.y = last_y; length.y -= dy; break; case WIRE_DIR_HORIZ: /* Horizontal Wire */ pos.x = last_x; length.x -= dx; break; default: pos.y = last_y; length.y -= dy; pos.x = last_x; length.x -= dx; } } else { switch (wire->priv->direction) { case WIRE_DIR_VERT: /* Vertical Wire */ length.y += dy; break; case WIRE_DIR_HORIZ: /* Horizontal Wire */ length.x += dx; break; default: length.y += dy; length.x += dx; } } snap_to_grid (sheet->grid, &length.x, &length.y); item_data_set_pos (sheet_item_get_data (SHEET_ITEM (wire_item)), &pos); wire_set_length (wire, &length); return TRUE; } break; case GDK_BUTTON_RELEASE: switch (event->button.button) { case 1: if (sheet->state != SHEET_STATE_DRAG && sheet->state != SHEET_STATE_DRAG_START) break; if (wire_item->priv->resize_state == WIRE_RESIZER_NONE) break; g_signal_stop_emission_by_name (G_OBJECT (wire_item), "event"); //gtk_timeout_remove (priv->scroll_timeout_id); // Esto no esta bien. sheet->state = SHEET_STATE_NONE; gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM (wire_item), event->button.time); wire_item->priv->resize_state = WIRE_RESIZER_NONE; sheet->state = SHEET_STATE_NONE; item_data_register (ITEM_DATA (wire)); return TRUE; } break; default: return sheet_item_event (SHEET_ITEM (wire_item), event, sv); } return sheet_item_event (SHEET_ITEM (wire_item), event, sv); }