static void connect_revert(struct ConnectChange *change, Diagram *dia) { object_unconnect(change->obj, change->handle); object_add_updates(change->obj, dia); change->obj->ops->move_handle(change->obj, change->handle , &change->handle_pos, NULL, HANDLE_MOVE_CONNECTED, 0); object_add_updates(change->obj, dia); }
ObjectChange * beziershape_remove_segment(BezierShape *bezier, int pos) { Handle *old_handle1, *old_handle2, *old_handle3; ConnectionPoint *old_cp1, *old_cp2; BezPoint old_point; BezCornerType old_ctype; int next = pos+1; g_assert(pos > 0); g_assert(bezier->numpoints > 2); g_assert(pos < bezier->numpoints); if (pos == bezier->numpoints - 1) next = 1; old_handle1 = bezier->object.handles[3*pos-3]; old_handle2 = bezier->object.handles[3*pos-2]; old_handle3 = bezier->object.handles[3*pos-1]; old_point = bezier->points[pos]; /* remember the old contro point of following bezpoint */ old_point.p1 = bezier->points[next].p1; old_ctype = bezier->corner_types[pos]; old_cp1 = bezier->object.connections[2*pos-2]; old_cp2 = bezier->object.connections[2*pos-1]; object_unconnect((DiaObject *)bezier, old_handle1); object_unconnect((DiaObject *)bezier, old_handle2); object_unconnect((DiaObject *)bezier, old_handle3); remove_handles(bezier, pos); beziershape_update_data(bezier); return beziershape_create_point_change(bezier, TYPE_REMOVE_POINT, &old_point, old_ctype, pos, old_handle1, old_handle2, old_handle3, old_cp1, old_cp2); }
static void bus_change_apply(struct PointChange *change, DiaObject *obj) { change->applied = 1; switch (change->type) { case TYPE_ADD_POINT: bus_add_handle((Bus *)obj, &change->point, change->handle); break; case TYPE_REMOVE_POINT: object_unconnect(obj, change->handle); bus_remove_handle((Bus *)obj, change->handle); break; } bus_update_data((Bus *)obj); }
static void polyconn_change_apply(struct PointChange *change, DiaObject *obj) { change->applied = 1; switch (change->type) { case TYPE_ADD_POINT: add_handle((PolyConn *)obj, change->pos, &change->point, change->handle); break; case TYPE_REMOVE_POINT: object_unconnect(obj, change->handle); remove_handle((PolyConn *)obj, change->pos); break; } }
ObjectChange * polyconn_remove_point(PolyConn *poly, int pos) { Handle *old_handle; ConnectionPoint *connectionpoint; Point old_point; old_handle = poly->object.handles[pos]; old_point = poly->points[pos]; connectionpoint = old_handle->connected_to; object_unconnect((DiaObject *)poly, old_handle); remove_handle(poly, pos); polyconn_update_data(poly); return polyconn_create_change(poly, TYPE_REMOVE_POINT, &old_point, pos, old_handle, connectionpoint); }
/** * Add or remove handles, so that comp->object.num_handles will equal to * the specified value. When there have been no changes done 0 is * returned, otherwise the number of handles removed (negative value) or * the number of added handles (positive value) will be returned. */ static gint adjust_handle_count_to (Compound * comp, gint to) { DiaObject * obj = &comp->object; gint old_count = obj->num_handles; gint new_count = to; Handle * h; gint i; gint diff = 0; /* we require to have always at least two arms! */ g_assert (new_count >= 3); if (new_count == old_count) return diff; /* every thing is ok */ obj->handles = g_realloc (obj->handles, new_count * sizeof(Handle *)); obj->num_handles = new_count; comp->num_arms = new_count-1; if (new_count < old_count) /* removing */ { for (i = new_count; i < old_count; i++) object_unconnect (obj, &comp->handles[i]); comp->handles = g_realloc (comp->handles, sizeof(Handle) * new_count); } else /* adding */ { comp->handles = g_realloc (comp->handles, sizeof(Handle) * new_count); for (i = old_count; i < new_count; i++) { h = &comp->handles[i]; setup_handle (h, HANDLE_ARM, HANDLE_MINOR_CONTROL, HANDLE_CONNECTABLE_NOBREAK); } } for (i = 0; i < new_count; i++) obj->handles[i] = &comp->handles[i]; return new_count - old_count; }
static ObjectChange * bus_delete_handle_callback (DiaObject *obj, Point *clicked, gpointer data) { Bus *bus = (Bus *) obj; Handle *handle; int handle_num; ConnectionPoint *connectionpoint; Point p; handle_num = bus_point_near_handle(bus, clicked); handle = bus->handles[handle_num]; p = handle->pos; connectionpoint = handle->connected_to; object_unconnect(obj, handle); bus_remove_handle(bus, handle ); bus_update_data(bus); return bus_create_change(bus, TYPE_REMOVE_POINT, &p, handle, connectionpoint); }
ObjectChange * polyshape_remove_point(PolyShape *poly, int pos) { Handle *old_handle; ConnectionPoint *old_cp1, *old_cp2; Point old_point; old_handle = poly->object.handles[pos]; old_point = poly->points[pos]; old_cp1 = poly->object.connections[2*pos]; old_cp2 = poly->object.connections[2*pos+1]; object_unconnect((DiaObject *)poly, old_handle); remove_handle(poly, pos); polyshape_update_data(poly); return polyshape_create_change(poly, TYPE_REMOVE_POINT, &old_point, pos, old_handle, old_cp1, old_cp2); }
static ObjectChange * compound_flip_arms_cb (DiaObject *obj, Point *pos, gpointer data) { Compound * comp = (Compound *) obj; gint direction = GPOINTER_TO_INT (data); Point * mppos = &comp->mount_point.pos; CompoundState * state; Handle * h; Point * p; gint num_handles, i; state = compound_state_new (comp); num_handles = obj->num_handles; for (i = 1; i < num_handles; i++) { h = obj->handles[i]; object_unconnect (obj, h); p = &h->pos; if (direction == FLIP_VERTICAL) { p->y -= mppos->y; p->y *= -1.0; p->y += mppos->y; } else { p->x -= mppos->x; p->x *= -1.0; p->x += mppos->x; } } compound_update_data (comp); compound_sanity_check (comp, "After flipping sides"); return (ObjectChange *) compound_change_new (comp, state); }