static ObjectChange * lifeline_create_change(Lifeline *lifeline, LifelineChangeType changetype, Point *clicked) { LifelineChange *vc; vc = g_new0(LifelineChange,1); vc->obj_change.apply = (ObjectChangeApplyFunc)lifeline_change_apply; vc->obj_change.revert = (ObjectChangeRevertFunc)lifeline_change_revert; vc->obj_change.free = (ObjectChangeFreeFunc)lifeline_change_free; vc->type = changetype; switch( vc->type ) { case LIFELINE_CHANGE_ADD: if (lifeline_point_above_mid (lifeline, clicked)) { vc->east = connpointline_add_point(lifeline->northeast,clicked); vc->west = connpointline_add_point(lifeline->northwest,clicked); } else { vc->east = connpointline_add_point(lifeline->southeast,clicked); vc->west = connpointline_add_point(lifeline->southwest,clicked); } break; case LIFELINE_CHANGE_DEL: if (lifeline_point_above_mid (lifeline, clicked)) { vc->east = connpointline_remove_point(lifeline->northeast,clicked); vc->west = connpointline_remove_point(lifeline->northwest,clicked); } else { vc->east = connpointline_remove_point(lifeline->southeast,clicked); vc->west = connpointline_remove_point(lifeline->southwest,clicked); } break; case LIFELINE_CHANGE_INC: vc->cp_distance_change = LIFELINE_CP_DISTANCE_INCREASE_FACTOR; lifeline->cp_distance += vc->cp_distance_change; break; case LIFELINE_CHANGE_DEC: vc->cp_distance_change = -1 * LIFELINE_CP_DISTANCE_INCREASE_FACTOR; lifeline->cp_distance += vc->cp_distance_change; break; case LIFELINE_CHANGE_DEF: vc->cp_distance_change = LIFELINE_CP_DEFAULT_DISTANCE*2 - lifeline->cp_distance; lifeline->cp_distance += vc->cp_distance_change; break; } lifeline_update_data(lifeline); return (ObjectChange *)vc; }
/*! * \brief Add a connection point to the line * * \memberof Line */ static ObjectChange * line_add_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data) { ObjectChange *oc; oc = connpointline_add_point(((Line *)obj)->cpl,clicked); line_update_data((Line *)obj); return oc; }
static ObjectChange * other_add_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data) { ObjectChange *change; ConnPointLine *cpl; Other *other = (Other *)obj; cpl = other_get_clicked_border(other,clicked); change = connpointline_add_point(cpl, clicked); other_update_data((Other *)obj,ANCHOR_MIDDLE, ANCHOR_MIDDLE); return other_create_change(other,change,cpl); }