static ObjectChange * constraint_apply_properties(Constraint *constraint) { ConstraintDialog *prop_dialog; char *str; ObjectState *old_state; prop_dialog = constraint->properties_dialog; old_state = (ObjectState *)constraint_get_state(constraint); /* Read from dialog and put in object: */ g_free(constraint->text); str = strdup(gtk_entry_get_text(prop_dialog->text)); constraint->text = g_malloc(sizeof(char)*strlen(str)+2+1); strcpy(constraint->text, "{"); strcat(constraint->text, str); strcat(constraint->text, "}"); constraint->text_width = font_string_width(constraint->text, constraint_font, CONSTRAINT_FONTHEIGHT); constraint_update_data(constraint); return new_object_state_change((Object *)constraint, old_state, (GetStateFunc)constraint_get_state, (SetStateFunc)constraint_set_state); }
static ObjectChange* constraint_move_handle(Constraint *constraint, Handle *handle, Point *to, ConnectionPoint *cp, HandleMoveReason reason, ModifierKeys modifiers) { Point p1, p2; Point *endpoints; assert(constraint!=NULL); assert(handle!=NULL); assert(to!=NULL); if (handle->id == HANDLE_MOVE_TEXT) { constraint->text_pos = *to; } else { endpoints = &constraint->connection.endpoints[0]; p1.x = 0.5*(endpoints[0].x + endpoints[1].x); p1.y = 0.5*(endpoints[0].y + endpoints[1].y); connection_move_handle(&constraint->connection, handle->id, to, cp, reason, modifiers); connection_adjust_for_autogap(&constraint->connection); p2.x = 0.5*(endpoints[0].x + endpoints[1].x); p2.y = 0.5*(endpoints[0].y + endpoints[1].y); point_sub(&p2, &p1); point_add(&constraint->text_pos, &p2); } constraint_update_data(constraint); return NULL; }
static void constraint_set_props(Constraint *constraint, GPtrArray *props) { object_set_props_from_offsets(&constraint->connection.object, constraint_offsets, props); g_free(constraint->brtext); constraint->brtext = NULL; constraint_update_data(constraint); }
static DiaObject * constraint_create(Point *startpoint, void *user_data, Handle **handle1, Handle **handle2) { Constraint *constraint; Connection *conn; DiaObject *obj; Point defaultlen = { 1.0, 1.0 }; constraint = g_malloc0(sizeof(Constraint)); /* old defaults */ constraint->font_height = 0.8; constraint->font = dia_font_new_from_style (DIA_FONT_MONOSPACE, constraint->font_height); constraint->line_width = 0.1; conn = &constraint->connection; conn->endpoints[0] = *startpoint; conn->endpoints[1] = *startpoint; point_add(&conn->endpoints[1], &defaultlen); obj = &conn->object; obj->type = &constraint_type; obj->ops = &constraint_ops; connection_init(conn, 3, 0); constraint->text_color = color_black; constraint->line_color = attributes_get_foreground(); constraint->text = g_strdup(""); constraint->text_pos.x = 0.5*(conn->endpoints[0].x + conn->endpoints[1].x); constraint->text_pos.y = 0.5*(conn->endpoints[0].y + conn->endpoints[1].y) - 0.2; constraint->text_handle.id = HANDLE_MOVE_TEXT; constraint->text_handle.type = HANDLE_MINOR_CONTROL; constraint->text_handle.connect_type = HANDLE_NONCONNECTABLE; constraint->text_handle.connected_to = NULL; obj->handles[2] = &constraint->text_handle; constraint->brtext = NULL; constraint_update_data(constraint); *handle1 = obj->handles[0]; *handle2 = obj->handles[1]; return &constraint->connection.object; }
static Object * constraint_create(Point *startpoint, void *user_data, Handle **handle1, Handle **handle2) { Constraint *constraint; Connection *conn; Object *obj; Point defaultlen = { 1.0, 1.0 }; if (constraint_font == NULL) constraint_font = font_getfont("Courier"); constraint = g_malloc(sizeof(Constraint)); conn = &constraint->connection; conn->endpoints[0] = *startpoint; conn->endpoints[1] = *startpoint; point_add(&conn->endpoints[1], &defaultlen); obj = (Object *) constraint; obj->type = &constraint_type; obj->ops = &constraint_ops; connection_init(conn, 3, 0); constraint->text = strdup("{}"); constraint->text_width = font_string_width(constraint->text, constraint_font, CONSTRAINT_FONTHEIGHT); constraint->text_width = 0.0; constraint->text_pos.x = 0.5*(conn->endpoints[0].x + conn->endpoints[1].x); constraint->text_pos.y = 0.5*(conn->endpoints[0].y + conn->endpoints[1].y); constraint->text_handle.id = HANDLE_MOVE_TEXT; constraint->text_handle.type = HANDLE_MINOR_CONTROL; constraint->text_handle.connect_type = HANDLE_NONCONNECTABLE; constraint->text_handle.connected_to = NULL; obj->handles[2] = &constraint->text_handle; constraint->properties_dialog = NULL; constraint_update_data(constraint); *handle1 = obj->handles[0]; *handle2 = obj->handles[1]; return (Object *)constraint; }
static void constraint_set_state(Constraint *constraint, ConstraintState *state) { g_free(constraint->text); constraint->text = state->text; constraint->text_width = 0.0; if (constraint->text != NULL) { constraint->text_width = font_string_width(constraint->text, constraint_font, CONSTRAINT_FONTHEIGHT); } g_free(state); constraint_update_data(constraint); }
static Object * constraint_load(ObjectNode obj_node, int version, const char *filename) { Constraint *constraint; AttributeNode attr; Connection *conn; Object *obj; if (constraint_font == NULL) constraint_font = font_getfont("Courier"); constraint = g_malloc(sizeof(Constraint)); conn = &constraint->connection; obj = (Object *) constraint; obj->type = &constraint_type; obj->ops = &constraint_ops; connection_load(conn, obj_node); connection_init(conn, 3, 0); constraint->text = NULL; attr = object_find_attribute(obj_node, "text"); if (attr != NULL) constraint->text = data_string(attribute_first_data(attr)); attr = object_find_attribute(obj_node, "text_pos"); if (attr != NULL) data_point(attribute_first_data(attr), &constraint->text_pos); constraint->text_width = font_string_width(constraint->text, constraint_font, CONSTRAINT_FONTHEIGHT); constraint->text_handle.id = HANDLE_MOVE_TEXT; constraint->text_handle.type = HANDLE_MINOR_CONTROL; constraint->text_handle.connect_type = HANDLE_NONCONNECTABLE; constraint->text_handle.connected_to = NULL; obj->handles[2] = &constraint->text_handle; constraint->properties_dialog = NULL; constraint_update_data(constraint); return (Object *)constraint; }
static void constraint_move(Constraint *constraint, Point *to) { Point start_to_end; Point *endpoints = &constraint->connection.endpoints[0]; Point delta; delta = *to; point_sub(&delta, &endpoints[0]); start_to_end = endpoints[1]; point_sub(&start_to_end, &endpoints[0]); endpoints[1] = endpoints[0] = *to; point_add(&endpoints[1], &start_to_end); point_add(&constraint->text_pos, &delta); constraint_update_data(constraint); }