static ObjectChange* bezierline_move_handle(Bezierline *bezierline, Handle *handle, Point *to, ConnectionPoint *cp, HandleMoveReason reason, ModifierKeys modifiers) { assert(bezierline!=NULL); assert(handle!=NULL); assert(to!=NULL); if (reason == HANDLE_MOVE_CREATE || reason == HANDLE_MOVE_CREATE_FINAL) { /* During creation, change the control points */ BezierConn *bez = &bezierline->bez; Point dist = bez->bezier.points[0].p1; point_sub(&dist, to); dist.y = 0; point_scale(&dist, 0.332); bezierconn_move_handle(bez, handle, to, cp, reason, modifiers); bez->bezier.points[1].p1 = bez->bezier.points[0].p1; point_sub(&bez->bezier.points[1].p1, &dist); bez->bezier.points[1].p2 = *to; point_add(&bez->bezier.points[1].p2, &dist); } else { bezierconn_move_handle(&bezierline->bez, handle, to, cp, reason, modifiers); } bezierline_update_data(bezierline); return NULL; }
static ObjectChange * bezierline_apply_properties(Bezierline *bezierline) { ObjectState *old_state; if (bezierline != bezierline_properties_dialog->bezierline) { g_message("Bezierline dialog problem: %p != %p", bezierline, bezierline_properties_dialog->bezierline); bezierline = bezierline_properties_dialog->bezierline; } old_state = (ObjectState *)bezierline_get_state(bezierline); bezierline->line_width = gtk_spin_button_get_value_as_float(bezierline_properties_dialog->line_width); dia_color_selector_get_color(bezierline_properties_dialog->color, &bezierline->line_color); dia_line_style_selector_get_linestyle(bezierline_properties_dialog->line_style, &bezierline->line_style, &bezierline->dashlength); bezierline->start_arrow = dia_arrow_selector_get_arrow(bezierline_properties_dialog->start_arrow); bezierline->end_arrow = dia_arrow_selector_get_arrow(bezierline_properties_dialog->end_arrow); bezierline_update_data(bezierline); return new_object_state_change((Object *)bezierline, old_state, (GetStateFunc)bezierline_get_state, (SetStateFunc)bezierline_set_state); }
static void bezierline_set_props(Bezierline *bezierline, GPtrArray *props) { object_set_props_from_offsets(&bezierline->bez.object, bezierline_offsets, props); bezierline_update_data(bezierline); }
static ObjectChange* bezierline_move(Bezierline *bezierline, Point *to) { bezierconn_move(&bezierline->bez, to); bezierline_update_data(bezierline); return NULL; }
static ObjectChange * bezierline_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data) { Bezierline *bezierline = (Bezierline*) obj; int segment; ObjectChange *change; segment = bezierline_closest_segment(bezierline, clicked); change = bezierconn_add_segment(&bezierline->bez, segment, clicked); bezierline_update_data(bezierline); return change; }
static DiaObject * bezierline_create(Point *startpoint, void *user_data, Handle **handle1, Handle **handle2) { Bezierline *bezierline; BezierConn *bez; DiaObject *obj; Point defaultlen = { .3, .3 }; bezierline = g_new0(Bezierline, 1); bezierline->bez.object.enclosing_box = g_new0 (Rectangle, 1); bez = &bezierline->bez; obj = &bez->object; obj->type = &bezierline_type; obj->ops = &bezierline_ops; if (user_data == NULL) { bezierconn_init(bez, 2); bez->bezier.points[0].p1 = *startpoint; bez->bezier.points[1].p1 = *startpoint; point_add(&bez->bezier.points[1].p1, &defaultlen); bez->bezier.points[1].p2 = bez->bezier.points[1].p1; point_add(&bez->bezier.points[1].p2, &defaultlen); bez->bezier.points[1].p3 = bez->bezier.points[1].p2; point_add(&bez->bezier.points[1].p3, &defaultlen); } else { BezierCreateData *bcd = (BezierCreateData*)user_data; bezierconn_init(bez, bcd->num_points); beziercommon_set_points (&bez->bezier, bcd->num_points, bcd->points); } bezierline->line_width = attributes_get_default_linewidth(); bezierline->line_color = attributes_get_foreground(); attributes_get_default_line_style(&bezierline->line_style, &bezierline->dashlength); bezierline->line_join = LINEJOIN_MITER; bezierline->line_caps = LINECAPS_BUTT; bezierline->start_arrow = attributes_get_default_start_arrow(); bezierline->end_arrow = attributes_get_default_end_arrow(); *handle1 = bez->object.handles[0]; *handle2 = bez->object.handles[3]; bezierline_update_data(bezierline); return &bezierline->bez.object; }
static gboolean bezierline_transform(Bezierline *bezierline, const DiaMatrix *m) { int i; g_return_val_if_fail (m != NULL, FALSE); for (i = 0; i < bezierline->bez.bezier.num_points; i++) transform_bezpoint (&bezierline->bez.bezier.points[i], m); bezierline_update_data(bezierline); return TRUE; }
static ObjectChange * bezierline_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data) { int seg_nr; Bezierline *bezierline = (Bezierline*) obj; ObjectChange *change; seg_nr = beziercommon_closest_segment(&bezierline->bez.bezier, clicked, bezierline->line_width); change = bezierconn_remove_segment(&bezierline->bez, seg_nr+1); bezierline_update_data(bezierline); return change; }
static ObjectChange * bezierline_set_corner_type_callback (DiaObject *obj, Point *clicked, gpointer data) { Handle *closest; Bezierline *bezierline = (Bezierline*) obj; ObjectChange *change; closest = bezierconn_closest_major_handle(&bezierline->bez, clicked); change = bezierconn_set_corner_type(&bezierline->bez, closest, GPOINTER_TO_INT(data)); bezierline_update_data(bezierline); return change; }
static void bezierline_set_state(Bezierline *bezierline, BezierlineState *state) { bezierline->line_color = state->line_color; bezierline->line_width = state->line_width; bezierline->line_style = state->line_style; bezierline->dashlength = state->dashlength; bezierline->start_arrow = state->start_arrow; bezierline->end_arrow = state->end_arrow; g_free(state); bezierline_update_data(bezierline); }
static Object * bezierline_create(Point *startpoint, void *user_data, Handle **handle1, Handle **handle2) { Bezierline *bezierline; BezierConn *bez; Object *obj; Point defaultlen = { .3, .3 }; /*bezierline_init_defaults();*/ bezierline = g_new(Bezierline, 1); bez = &bezierline->bez; obj = (Object *) bezierline; obj->type = &bezierline_type; obj->ops = &bezierline_ops; bezierconn_init(bez); bez->points[0].p1 = *startpoint; bez->points[1].p1 = *startpoint; point_add(&bez->points[1].p1, &defaultlen); bez->points[1].p2 = bez->points[1].p1; point_add(&bez->points[1].p2, &defaultlen); bez->points[1].p3 = bez->points[1].p2; point_add(&bez->points[1].p3, &defaultlen); bezierline_update_data(bezierline); bezierline->line_width = attributes_get_default_linewidth(); bezierline->line_color = attributes_get_foreground(); attributes_get_default_line_style(&bezierline->line_style, &bezierline->dashlength); bezierline->start_arrow = attributes_get_default_start_arrow(); bezierline->end_arrow = attributes_get_default_end_arrow(); *handle1 = bez->object.handles[0]; *handle2 = bez->object.handles[3]; return (Object *)bezierline; }
static void bezierline_move_handle(Bezierline *bezierline, Handle *handle, Point *to, HandleMoveReason reason, ModifierKeys modifiers) { assert(bezierline!=NULL); assert(handle!=NULL); assert(to!=NULL); bezierconn_move_handle(&bezierline->bez, handle, to, reason); if (reason == HANDLE_MOVE_CREATE || reason == HANDLE_MOVE_CREATE_FINAL) { BezierConn *bez = &bezierline->bez; Point delta = bez->points[1].p3; point_sub(&delta, &bez->points[0].p1); point_scale(&delta, 1.0/3); bez->points[1].p1 = bez->points[0].p1; point_add(&bez->points[1].p1, &delta); bez->points[1].p2 = bez->points[1].p1; point_add(&bez->points[1].p2, &delta); } bezierline_update_data(bezierline); }
static DiaObject * bezierline_load(ObjectNode obj_node, int version, DiaContext *ctx) { Bezierline *bezierline; BezierConn *bez; DiaObject *obj; AttributeNode attr; bezierline = g_new0(Bezierline, 1); bezierline->bez.object.enclosing_box = g_new0 (Rectangle, 1); bez = &bezierline->bez; obj = &bez->object; obj->type = &bezierline_type; obj->ops = &bezierline_ops; bezierconn_load(bez, obj_node, ctx); bezierline->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &bezierline->line_color, ctx); bezierline->line_width = 0.1; attr = object_find_attribute(obj_node, PROP_STDNAME_LINE_WIDTH); if (attr != NULL) bezierline->line_width = data_real(attribute_first_data(attr), ctx); bezierline->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) bezierline->line_style = data_enum(attribute_first_data(attr), ctx); bezierline->line_join = LINEJOIN_MITER; attr = object_find_attribute(obj_node, "line_join"); if (attr != NULL) bezierline->line_join = data_enum(attribute_first_data(attr), ctx); bezierline->line_caps = LINECAPS_BUTT; attr = object_find_attribute(obj_node, "line_caps"); if (attr != NULL) bezierline->line_caps = data_enum(attribute_first_data(attr), ctx); bezierline->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) bezierline->dashlength = data_real(attribute_first_data(attr), ctx); load_arrow(obj_node, &bezierline->start_arrow, "start_arrow", "start_arrow_length", "start_arrow_width", ctx); load_arrow(obj_node, &bezierline->end_arrow, "end_arrow", "end_arrow_length", "end_arrow_width", ctx); bezierline->absolute_start_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_start_gap"); if (attr != NULL) bezierline->absolute_start_gap = data_real(attribute_first_data(attr), ctx); bezierline->absolute_end_gap = 0.0; attr = object_find_attribute(obj_node, "absolute_end_gap"); if (attr != NULL) bezierline->absolute_end_gap = data_real(attribute_first_data(attr), ctx); /* if "screws up the bounding box if auto_gap" it must be fixed there * not by copying some meaningless bounding_box before this function call! * But the real fix is in connectionpoint.c(connpoint_is_autogap) */ bezierline_update_data(bezierline); return &bezierline->bez.object; }
static Object * bezierline_load(ObjectNode obj_node, int version, const char *filename) { Bezierline *bezierline; BezierConn *bez; Object *obj; AttributeNode attr; bezierline = g_new(Bezierline, 1); bez = &bezierline->bez; obj = (Object *) bezierline; obj->type = &bezierline_type; obj->ops = &bezierline_ops; bezierconn_load(bez, obj_node); bezierline->line_color = color_black; attr = object_find_attribute(obj_node, "line_color"); if (attr != NULL) data_color(attribute_first_data(attr), &bezierline->line_color); bezierline->line_width = 0.1; attr = object_find_attribute(obj_node, "line_width"); if (attr != NULL) bezierline->line_width = data_real(attribute_first_data(attr)); bezierline->line_style = LINESTYLE_SOLID; attr = object_find_attribute(obj_node, "line_style"); if (attr != NULL) bezierline->line_style = data_enum(attribute_first_data(attr)); bezierline->dashlength = DEFAULT_LINESTYLE_DASHLEN; attr = object_find_attribute(obj_node, "dashlength"); if (attr != NULL) bezierline->dashlength = data_real(attribute_first_data(attr)); bezierline->start_arrow.type = ARROW_NONE; bezierline->start_arrow.length = 0.8; bezierline->start_arrow.width = 0.8; attr = object_find_attribute(obj_node, "start_arrow"); if (attr != NULL) bezierline->start_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_length"); if (attr != NULL) bezierline->start_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "start_arrow_width"); if (attr != NULL) bezierline->start_arrow.width = data_real(attribute_first_data(attr)); bezierline->end_arrow.type = ARROW_NONE; bezierline->end_arrow.length = 0.8; bezierline->end_arrow.width = 0.8; attr = object_find_attribute(obj_node, "end_arrow"); if (attr != NULL) bezierline->end_arrow.type = data_enum(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_length"); if (attr != NULL) bezierline->end_arrow.length = data_real(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "end_arrow_width"); if (attr != NULL) bezierline->end_arrow.width = data_real(attribute_first_data(attr)); bezierline_update_data(bezierline); return (Object *)bezierline; }
static void bezierline_move(Bezierline *bezierline, Point *to) { bezierconn_move(&bezierline->bez, to); bezierline_update_data(bezierline); }