static void gv_point_tool_button_press(GvTool *tool, GdkEventButton *event) { if (event->button == 1) { GvVertex vertex; if (!gv_point_tool_configure(tool)) return; /* Get pointer location */ gv_view_area_map_pointer(GV_TOOL(tool)->view, event->x, event->y, &vertex.x, &vertex.y); if( !gv_tool_check_bounds( GV_TOOL(tool), vertex.x, vertex.y ) ) return; /* Add a new point */ if( GV_IS_POINT_LAYER(GV_POINT_TOOL(tool)->layer) ) { gv_point_layer_select_new_point( GV_POINT_LAYER(GV_POINT_TOOL(tool)->layer), &vertex); } else { GvShape *new_point; new_point = gv_shape_new( GVSHAPE_POINT ); gv_shape_set_xyz( new_point, 0, 0, vertex.x, vertex.y, 0.0 ); gv_shapes_layer_select_new_shape( GV_SHAPES_LAYER(GV_POINT_TOOL(tool)->layer), new_point ); } } }
static gint gv_rotate_tool_layer_destroy( GtkObject *layer, gpointer data ) { GvRotateTool *tool = (GvRotateTool *) data; if( tool->layer == GV_SHAPES_LAYER(layer) ) gv_rotate_tool_set_layer( tool, NULL ); return 0; }
static gboolean gv_rect_tool_button_release(GvTool *r_tool, GdkEventButton *event) { GvRectTool *tool = GV_RECT_TOOL(r_tool); if (event->button == 1 && tool->drawing ) { GvShape *shape; if (!gv_rect_tool_configure(tool)) return FALSE; /* Map pointer position to tail vertex */ gv_view_area_map_pointer(GV_TOOL(tool)->view, event->x, event->y, &tool->v_tail.x, &tool->v_tail.y); gv_tool_clamp_to_bounds( GV_TOOL(tool), &tool->v_tail.x, &tool->v_tail.y ); if( tool->v_tail.x != tool->v_head.x && tool->v_tail.y != tool->v_head.y ) { /* create the new rectangle */ shape = gv_shape_new( GVSHAPE_AREA ); gv_shape_add_node( shape, 0, tool->v_tail.x, tool->v_tail.y, 0 ); gv_shape_add_node( shape, 0, tool->v_tail.x, tool->v_head.y, 0 ); gv_shape_add_node( shape, 0, tool->v_head.x, tool->v_head.y, 0 ); gv_shape_add_node( shape, 0, tool->v_head.x, tool->v_tail.y, 0 ); gv_shape_add_node( shape, 0, tool->v_tail.x, tool->v_tail.y, 0 ); gv_shapes_layer_select_new_shape( GV_SHAPES_LAYER(tool->layer), shape ); } tool->drawing = FALSE; return FALSE; } if (event->button == 1 && tool->reshaping ) { if (!gv_rect_tool_configure(tool)) return FALSE; /* Reopen undo. Push a memento describing the ring addition */ gv_undo_enable(); gv_undo_open(); /* Map pointer position to tail vertex */ gv_view_area_map_pointer(GV_TOOL(tool)->view, event->x, event->y, &tool->v_tail.x, &tool->v_tail.y); gv_rect_tool_reshape( tool, tool->v_tail.x, tool->v_tail.y ); tool->reshaping = FALSE; } return FALSE; }
void gv_rotate_tool_set_layer(GvRotateTool *tool, GvShapeLayer *layer) { if (GV_TOOL(tool)->view == NULL) { g_warning("gv_rotate_tool_set_layer(): inactive tool"); return; } if( layer != NULL && gv_data_is_read_only( GV_DATA(layer) ) ) { g_warning( "gv_rotate_tool_set_layer(): layer is read-only" ); return; } gv_rotate_tool_terminate( tool ); tool->shape_id = -1; /* Disconnect from the previous layer (for draw) */ if (tool->layer) { tool->rrmode = RRMODE_DISPLAY; /** TODO: Not sure that we need to unselect ... try to remove later */ gv_shape_layer_clear_selection(GV_SHAPE_LAYER(tool->layer)); gtk_signal_disconnect_by_data(GTK_OBJECT(tool->layer), (gpointer)tool); gv_view_area_queue_draw(GV_TOOL(tool)->view); } if( layer == NULL ) tool->layer = NULL; else tool->layer = GV_SHAPES_LAYER(layer); if (layer) { gv_view_area_set_active_layer(GV_TOOL(tool)->view, GTK_OBJECT(layer)); /* Redraw when the layer draws */ gtk_signal_connect_object_after(GTK_OBJECT(layer), "draw", GTK_SIGNAL_FUNC(gv_rotate_tool_draw), GTK_OBJECT(tool)); /* Recover if layer destroyed */ gtk_signal_connect( GTK_OBJECT(layer), "destroy", GTK_SIGNAL_FUNC(gv_rotate_tool_layer_destroy), GTK_OBJECT(tool)); } }
void gv_rect_tool_set_layer(GvRectTool *tool, GvShapeLayer *layer) { if (GV_TOOL(tool)->view == NULL) { g_warning("gv_rect_tool_set_layer(): inactive tool"); return; } if( layer != NULL && gv_data_is_read_only( GV_DATA(layer) ) ) { g_warning( "gv_rect_tool_set_layer(): layer is read-only" ); return; } /* Disconnect from the previous layer (for draw) */ if (tool->layer) { if (tool->drawing) tool->drawing = FALSE; gv_shape_layer_clear_selection(GV_SHAPE_LAYER(tool->layer)); g_signal_handlers_disconnect_matched (tool->layer, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, tool); gv_view_area_queue_draw(GV_TOOL(tool)->view); } if( layer == NULL ) tool->layer = NULL; else tool->layer = GV_SHAPES_LAYER(layer); if (layer) { gv_view_area_set_active_layer(GV_TOOL(tool)->view, G_OBJECT(layer)); /* Redraw when the layer draws */ g_signal_connect_object(layer, "draw", G_CALLBACK(gv_rect_tool_draw), GV_TOOL(tool), G_CONNECT_SWAPPED | G_CONNECT_AFTER); /* recover if layer destroyed */ g_signal_connect_swapped(layer, "teardown", G_CALLBACK(gv_rect_tool_layer_destroy), tool); } }