static ObjectChange* bus_move(Bus *bus, Point *to) { Point delta; Point *endpoints = &bus->connection.endpoints[0]; DiaObject *obj = &bus->connection.object; int i; delta = *to; point_sub(&delta, &obj->position); for (i=0;i<2;i++) { point_add(&endpoints[i], &delta); point_add(&bus->real_ends[i], &delta); } for (i=0;i<bus->num_handles;i++) { if (bus->handles[i]->connected_to == NULL) { point_add(&bus->handles[i]->pos, &delta); } } bus_update_data(bus); return NULL; }
static void bus_set_props(Bus *bus, GPtrArray *props) { object_set_props_from_offsets(&bus->connection.object, bus_offsets, props); bus_update_data(bus); }
static DiaObject * bus_load(ObjectNode obj_node, int version, const char *filename) { Bus *bus; Connection *conn; LineBBExtras *extra; DiaObject *obj; AttributeNode attr; DataNode data; int i; bus = g_malloc0(sizeof(Bus)); conn = &bus->connection; obj = &conn->object; extra = &conn->extra_spacing; obj->type = &bus_type; obj->ops = &bus_ops; connection_load(conn, obj_node); attr = object_find_attribute(obj_node, "bus_handles"); bus->num_handles = 0; if (attr != NULL) bus->num_handles = attribute_num_data(attr); connection_init(conn, 2 + bus->num_handles, 0); data = attribute_first_data(attr); bus->handles = g_malloc(sizeof(Handle *)*bus->num_handles); bus->parallel_points = g_malloc(sizeof(Point)*bus->num_handles); for (i=0;i<bus->num_handles;i++) { bus->handles[i] = g_new0(Handle,1); bus->handles[i]->id = HANDLE_BUS; bus->handles[i]->type = HANDLE_MINOR_CONTROL; bus->handles[i]->connect_type = HANDLE_CONNECTABLE_NOBREAK; bus->handles[i]->connected_to = NULL; data_point(data, &bus->handles[i]->pos); obj->handles[2+i] = bus->handles[i]; data = data_next(data); } bus->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &bus->line_color); extra->start_trans = extra->end_trans = extra->start_long = extra->end_long = LINE_WIDTH/2.0; bus_update_data(bus); return &bus->connection.object; }
static DiaObject * bus_create(Point *startpoint, void *user_data, Handle **handle1, Handle **handle2) { Bus *bus; Connection *conn; LineBBExtras *extra; DiaObject *obj; Point defaultlen = { 5.0, 0.0 }; int i; bus = g_malloc0(sizeof(Bus)); conn = &bus->connection; conn->endpoints[0] = *startpoint; conn->endpoints[1] = *startpoint; point_add(&conn->endpoints[1], &defaultlen); obj = &conn->object; extra = &conn->extra_spacing; obj->type = &bus_type; obj->ops = &bus_ops; bus->num_handles = DEFAULT_NUMHANDLES; connection_init(conn, 2+bus->num_handles, 0); bus->line_color = attributes_get_foreground(); bus->handles = g_malloc(sizeof(Handle *)*bus->num_handles); bus->parallel_points = g_malloc(sizeof(Point)*bus->num_handles); for (i=0;i<bus->num_handles;i++) { bus->handles[i] = g_new0(Handle,1); bus->handles[i]->id = HANDLE_BUS; bus->handles[i]->type = HANDLE_MINOR_CONTROL; bus->handles[i]->connect_type = HANDLE_CONNECTABLE_NOBREAK; bus->handles[i]->connected_to = NULL; bus->handles[i]->pos = *startpoint; bus->handles[i]->pos.x += 5*((real)i+1)/(bus->num_handles+1); bus->handles[i]->pos.y += (i%2==0)?1.0:-1.0; obj->handles[2+i] = bus->handles[i]; } extra->start_trans = extra->end_trans = extra->start_long = extra->end_long = LINE_WIDTH/2.0; bus_update_data(bus); *handle1 = obj->handles[0]; *handle2 = obj->handles[1]; return &bus->connection.object; }
static ObjectChange * bus_add_handle_callback (DiaObject *obj, Point *clicked, gpointer data) { Bus *bus = (Bus *) obj; Handle *handle; handle = g_new0(Handle,1); bus_add_handle(bus, clicked, handle); bus_update_data(bus); return bus_create_change(bus, TYPE_ADD_POINT, clicked, handle, NULL); }
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 bus_change_revert(struct PointChange *change, DiaObject *obj) { switch (change->type) { case TYPE_ADD_POINT: bus_remove_handle((Bus *)obj, change->handle); break; case TYPE_REMOVE_POINT: bus_add_handle((Bus *)obj, &change->point, change->handle); if (change->connected_to) { object_connect(obj, change->handle, change->connected_to); } break; } bus_update_data((Bus *)obj); change->applied = 0; }
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); }
static ObjectChange* bus_move_handle(Bus *bus, Handle *handle, Point *to, ConnectionPoint *cp, HandleMoveReason reason, ModifierKeys modifiers) { Connection *conn = &bus->connection; Point *endpoints; static real *parallel=NULL; static real *perp=NULL; static int max_num=0; Point vhat, vhatperp; Point u; real vlen, vlen2; real len_scale; int i; if (bus->num_handles>max_num) { if (parallel!=NULL) { g_free(parallel); g_free(perp); } parallel = g_malloc(sizeof(real)*bus->num_handles); perp = g_malloc(sizeof(real)*bus->num_handles); max_num = bus->num_handles; } if (handle->id == HANDLE_BUS) { handle->pos = *to; } else { endpoints = &conn->endpoints[0]; vhat = endpoints[1]; point_sub(&vhat, &endpoints[0]); if ((fabs(vhat.x) == 0.0) && (fabs(vhat.y)==0.0)) { vhat.x += 0.01; } vlen = sqrt(point_dot(&vhat, &vhat)); point_scale(&vhat, 1.0/vlen); vhatperp.x = -vhat.y; vhatperp.y = vhat.x; for (i=0;i<bus->num_handles;i++) { u = bus->handles[i]->pos; point_sub(&u, &endpoints[0]); parallel[i] = point_dot(&vhat, &u); perp[i] = point_dot(&vhatperp, &u); } connection_move_handle(&bus->connection, handle->id, to, cp, reason, modifiers); vhat = endpoints[1]; point_sub(&vhat, &endpoints[0]); if ((fabs(vhat.x) == 0.0) && (fabs(vhat.y)==0.0)) { vhat.x += 0.01; } vlen2 = sqrt(point_dot(&vhat, &vhat)); len_scale = vlen2 / vlen; point_normalize(&vhat); vhatperp.x = -vhat.y; vhatperp.y = vhat.x; for (i=0;i<bus->num_handles;i++) { if (bus->handles[i]->connected_to == NULL) { u = vhat; point_scale(&u, parallel[i]*len_scale); point_add(&u, &endpoints[0]); bus->parallel_points[i] = u; u = vhatperp; point_scale(&u, perp[i]); point_add(&u, &bus->parallel_points[i]); bus->handles[i]->pos = u; } } } bus_update_data(bus); return NULL; }
static ObjectChange* bus_move_handle(Bus *bus, Handle *handle, Point *to, ConnectionPoint *cp, HandleMoveReason reason, ModifierKeys modifiers) { Connection *conn = &bus->connection; Point *endpoints; real *parallel=NULL; real *perp=NULL; Point vhat, vhatperp; Point u; real vlen, vlen2; real len_scale; int i; const int num_handles = bus->num_handles; /* const to help scan-build */ /* code copied to Misc/tree.c */ parallel = (real *)g_alloca (num_handles * sizeof(real)); perp = (real *)g_alloca (num_handles * sizeof(real)); if (handle->id == HANDLE_BUS) { handle->pos = *to; } else { endpoints = &conn->endpoints[0]; vhat = endpoints[1]; point_sub(&vhat, &endpoints[0]); if ((fabs(vhat.x) == 0.0) && (fabs(vhat.y)==0.0)) { vhat.x += 0.01; } vlen = sqrt(point_dot(&vhat, &vhat)); point_scale(&vhat, 1.0/vlen); vhatperp.x = -vhat.y; vhatperp.y = vhat.x; for (i=0;i<num_handles;i++) { u = bus->handles[i]->pos; point_sub(&u, &endpoints[0]); parallel[i] = point_dot(&vhat, &u); perp[i] = point_dot(&vhatperp, &u); } connection_move_handle(&bus->connection, handle->id, to, cp, reason, modifiers); vhat = endpoints[1]; point_sub(&vhat, &endpoints[0]); if ((fabs(vhat.x) == 0.0) && (fabs(vhat.y)==0.0)) { vhat.x += 0.01; } vlen2 = sqrt(point_dot(&vhat, &vhat)); len_scale = vlen2 / vlen; point_normalize(&vhat); vhatperp.x = -vhat.y; vhatperp.y = vhat.x; for (i=0;i<num_handles;i++) { if (bus->handles[i]->connected_to == NULL) { u = vhat; point_scale(&u, parallel[i]*len_scale); point_add(&u, &endpoints[0]); bus->parallel_points[i] = u; u = vhatperp; point_scale(&u, perp[i]); point_add(&u, &bus->parallel_points[i]); bus->handles[i]->pos = u; } } } bus_update_data(bus); return NULL; }