void delete_splinearrow(F_spline *spline, F_point *prev_point, F_point *selected_point) { if (closed_spline(spline)) return; if (prev_point == NULL) { /* selected_point is the first point */ if (!spline->back_arrow) return; draw_spline(spline, ERASE); saved_back_arrow=spline->back_arrow; if (saved_for_arrow && saved_for_arrow != spline->for_arrow) free((char *) saved_for_arrow); saved_for_arrow = NULL; spline->back_arrow = NULL; redisplay_spline(spline); } else if (selected_point->next == NULL) { /* forward arrow */ if (!spline->for_arrow) return; draw_spline(spline, ERASE); saved_for_arrow=spline->for_arrow; if (saved_back_arrow && saved_back_arrow != spline->back_arrow) free((char *) saved_back_arrow); saved_back_arrow = NULL; spline->for_arrow = NULL; redisplay_spline(spline); } else return; clean_up(); set_last_prevpoint(prev_point); set_last_selectedpoint(selected_point); set_latestspline(spline); set_action_object(F_DELETE_ARROW_HEAD, O_SPLINE); set_modifiedflag(); }
static void place_spline_x(int x, int y) { canvas_leftbut_proc = null_proc; canvas_middlebut_proc = null_proc; canvas_rightbut_proc = null_proc; canvas_locmove_proc = null_proc; canvas_ref_proc = null_proc; adjust_pos(x, y, fix_x, fix_y, &x, &y); translate_spline(new_s, x - fix_x, y - fix_y); if (return_proc == copy_selected) { add_spline(new_s); } else { list_add_spline(&objects.splines, new_s); clean_up(); set_lastposition(fix_x, fix_y); set_newposition(x, y); set_action_object(F_MOVE, O_SPLINE); set_latestspline(new_s); set_modifiedflag(); } redisplay_spline(new_s); /* turn back on all relevant markers */ update_markers(new_objmask); (*return_proc) (); draw_mousefun_canvas(); }
void undo_delete_arrowhead(void) { switch (last_object) { case O_POLYLINE: if (saved_for_arrow) saved_objects.lines->for_arrow = saved_for_arrow; if (saved_back_arrow) saved_objects.lines->back_arrow = saved_back_arrow; redisplay_line(saved_objects.lines); break; case O_SPLINE: if (saved_for_arrow) saved_objects.splines->for_arrow = saved_for_arrow; if (saved_back_arrow) saved_objects.splines->back_arrow = saved_back_arrow; redisplay_spline(saved_objects.splines); break; case O_ARC: if (saved_for_arrow) saved_objects.arcs->for_arrow = saved_for_arrow; if (saved_back_arrow) saved_objects.arcs->back_arrow = saved_back_arrow; redisplay_arc(saved_objects.arcs); break; default: return; } last_action = F_ADD_ARROW_HEAD; }
void splinepoint_deleting(F_spline *spline, F_point *previous_point, F_point *selected_point) { F_point *next_point; F_sfactor *s_prev_point, *selected_sfactor; next_point = selected_point->next; set_temp_cursor(wait_cursor); clean_up(); set_last_prevpoint(previous_point); /* delete it and redraw underlying objects */ list_delete_spline(&objects.splines, spline); draw_spline(spline, ERASE); redisplay_spline(spline); if (previous_point == NULL) { spline->points = next_point; if (open_spline(spline)) { selected_sfactor = spline->sfactors->next; spline->sfactors->next = selected_sfactor->next; } else { selected_sfactor = spline->sfactors; spline->sfactors = spline->sfactors->next; } } else { previous_point->next = next_point; if ((next_point == NULL) && (open_spline(spline))) previous_point = prev_point(spline->points, previous_point); s_prev_point = search_sfactor(spline,previous_point); selected_sfactor = s_prev_point->next; s_prev_point->next = s_prev_point->next->next; } /* put it back in the list and draw the new spline */ list_add_spline(&objects.splines, spline); /* redraw it and anything on top of it */ redisplay_spline(spline); set_action_object(F_DELETE_POINT, O_SPLINE); set_latestspline(spline); set_last_selectedpoint(selected_point); set_last_selectedsfactor(selected_sfactor); set_last_nextpoint(next_point); set_modifiedflag(); reset_cursor(); }
static void init_move(F_line *p, int type, int x, int y, int px, int py) { /* turn off all markers */ update_markers(0); switch (type) { case O_COMPOUND: set_cursor(wait_cursor); cur_c = (F_compound *) p; list_delete_compound(&objects.compounds, cur_c); redisplay_compound(cur_c); set_cursor(null_cursor); init_compounddragging(cur_c, px, py); break; case O_POLYLINE: set_cursor(wait_cursor); cur_l = (F_line *) p; list_delete_line(&objects.lines, cur_l); redisplay_line(cur_l); set_cursor(null_cursor); init_linedragging(cur_l, px, py); break; case O_TXT: set_cursor(wait_cursor); cur_t = (F_text *) p; list_delete_text(&objects.texts, cur_t); redisplay_text(cur_t); set_cursor(null_cursor); init_textdragging(cur_t, x, y); break; case O_ELLIPSE: set_cursor(wait_cursor); cur_e = (F_ellipse *) p; list_delete_ellipse(&objects.ellipses, cur_e); redisplay_ellipse(cur_e); set_cursor(null_cursor); init_ellipsedragging(cur_e, px, py); break; case O_ARC: set_cursor(wait_cursor); cur_a = (F_arc *) p; list_delete_arc(&objects.arcs, cur_a); redisplay_arc(cur_a); set_cursor(null_cursor); init_arcdragging(cur_a, px, py); break; case O_SPLINE: set_cursor(wait_cursor); cur_s = (F_spline *) p; list_delete_spline(&objects.splines, cur_s); redisplay_spline(cur_s); set_cursor(null_cursor); init_splinedragging(cur_s, px, py); break; default: return; } }
static void init_flipspline(F_spline *old_s, int px, int py) { F_spline *new_s; new_s = copy_spline(old_s); flip_spline(new_s, px, py, flip_axis); if (copy) { add_spline(new_s); } else { toggle_splinemarker(old_s); draw_spline(old_s, ERASE); change_spline(old_s, new_s); } /* redisplay objects under this object before it was rotated */ redisplay_spline(old_s); /* and this object and any other objects on top */ redisplay_spline(new_s); }
static void add_splinearrow(F_spline *spline, F_point *prev_point, F_point *selected_point) { if (prev_point == NULL) { /* add backward arrow */ if (spline->back_arrow) return; spline->back_arrow = backward_arrow(); redisplay_spline(spline); } else if (selected_point->next == NULL) { /* add forward arrow */ if (spline->for_arrow) return; spline->for_arrow = forward_arrow(); redisplay_spline(spline); } clean_up(); set_last_prevpoint(prev_point); set_last_selectedpoint(selected_point); set_latestspline(spline); set_action_object(F_ADD_ARROW_HEAD, O_SPLINE); set_modifiedflag(); }
static void fix_movedsplinepoint(int x, int y) { (*canvas_locmove_proc) (x, y); canvas_ref_proc = canvas_locmove_proc = null_proc; elastic_linelink(); /* erase last lengths if appres.showlengths is true */ erase_lengths(); old_s = copy_spline(cur_s); clean_up(); set_latestspline(old_s); set_action_object(F_EDIT, O_SPLINE); old_s->next = cur_s; relocate_splinepoint(cur_s, cur_x, cur_y, moved_point); /* redraw anything under the old spline */ redisplay_spline(old_s); /* and the new one */ redisplay_spline(cur_s); /* turn back on all relevant markers */ update_markers(new_objmask); wrapup_movepoint(); }
static void cancel_spline(void) { canvas_ref_proc = canvas_locmove_proc = null_proc; elastic_moveline(new_s->points); /* erase last lengths if appres.showlengths is true */ erase_lengths(); if (return_proc == copy_selected) { free_spline(&new_s); } else { list_add_spline(&objects.splines, new_s); redisplay_spline(new_s); } /* turn back on all relevant markers */ update_markers(new_objmask); (*return_proc) (); draw_mousefun_canvas(); }
void undo_delete(void) { int xmin, ymin, xmax, ymax; char ctemp[PATH_MAX]; switch (last_object) { case O_POLYLINE: list_add_line(&objects.lines, saved_objects.lines); redisplay_line(saved_objects.lines); break; case O_ELLIPSE: list_add_ellipse(&objects.ellipses, saved_objects.ellipses); redisplay_ellipse(saved_objects.ellipses); break; case O_TXT: list_add_text(&objects.texts, saved_objects.texts); redisplay_text(saved_objects.texts); break; case O_SPLINE: list_add_spline(&objects.splines, saved_objects.splines); redisplay_spline(saved_objects.splines); break; case O_ARC: list_add_arc(&objects.arcs, saved_objects.arcs); redisplay_arc(saved_objects.arcs); break; case O_COMPOUND: list_add_compound(&objects.compounds, saved_objects.compounds); redisplay_compound(saved_objects.compounds); break; case O_ALL_OBJECT: saved_objects.next = NULL; compound_bound(&saved_objects, &xmin, &ymin, &xmax, &ymax); tail(&objects, &object_tails); append_objects(&objects, &saved_objects, &object_tails); redisplay_zoomed_region(xmin, ymin, xmax, ymax); } last_action = F_ADD; }
void line_spline(F_line *l, int type_value) { F_spline *s; if (num_points(l->points) < CLOSED_SPLINE_MIN_NUM_POINTS) { put_msg("Not enough points for a spline"); beep(); return; } if ((s = create_spline()) == NULL) return; s->type = type_value; if (l->type == T_POLYGON) s->points = copy_points(l->points->next); else s->points = copy_points(l->points); s->style = l->style; s->thickness = l->thickness; s->pen_color = l->pen_color; s->fill_color = l->fill_color; s->depth = l->depth; s->style_val = l->style_val; s->cap_style = l->cap_style; s->pen_style = l->pen_style; s->fill_style = l->fill_style; s->sfactors = NULL; s->next = NULL; if (l->for_arrow) { s->for_arrow = create_arrow(); s->for_arrow->type = l->for_arrow->type; s->for_arrow->style = l->for_arrow->style; s->for_arrow->thickness = l->for_arrow->thickness; s->for_arrow->wd = l->for_arrow->wd; s->for_arrow->ht = l->for_arrow->ht; } else { s->for_arrow = NULL; } if (l->back_arrow) { s->back_arrow = create_arrow(); s->back_arrow->type = l->back_arrow->type; s->back_arrow->style = l->back_arrow->style; s->back_arrow->thickness = l->back_arrow->thickness; s->back_arrow->wd = l->back_arrow->wd; s->back_arrow->ht = l->back_arrow->ht; } else { s->back_arrow = NULL; } /* A spline must have an s parameter for each point */ if (!make_sfactors(s)) { free_spline(&s); return; } /* Get rid of the line and draw the new spline */ delete_line(l); /* now put back the new spline */ mask_toggle_splinemarker(s); list_add_spline(&objects.splines, s); redisplay_spline(s); set_action_object(F_CONVERT, O_POLYLINE); set_latestspline(s); set_modifiedflag(); }