fix some regressions (place wires/lines/polys/rectangles from context menu), restore selection when creating a new arc

This commit is contained in:
stefan schippers 2024-03-06 12:53:49 +01:00
parent c88a8334a5
commit 174d590ad1
3 changed files with 88 additions and 82 deletions

View File

@ -3066,14 +3066,14 @@ void change_layer()
if(modified) set_modify(1); if(modified) set_modify(1);
} }
void new_arc(int what, double sweep) void new_arc(int what, double sweep, double mousex_snap, double mousey_snap)
{ {
if(what & PLACE) { if(what & PLACE) {
xctx->nl_state=0; xctx->nl_state=0;
xctx->nl_r = -1.; xctx->nl_r = -1.;
xctx->nl_sweep_angle=sweep; xctx->nl_sweep_angle=sweep;
xctx->nl_xx1 = xctx->nl_xx2 = xctx->nl_x1 = xctx->nl_x2 = xctx->nl_x3 = xctx->mousex_snap; xctx->nl_xx1 = xctx->nl_xx2 = xctx->nl_x1 = xctx->nl_x2 = xctx->nl_x3 = mousex_snap;
xctx->nl_yy1 = xctx->nl_yy2 = xctx->nl_y1 = xctx->nl_y2 = xctx->nl_y3 = xctx->mousey_snap; xctx->nl_yy1 = xctx->nl_yy2 = xctx->nl_y1 = xctx->nl_y2 = xctx->nl_y3 = mousey_snap;
xctx->ui_state |= STARTARC; xctx->ui_state |= STARTARC;
} }
if(what & SET) { if(what & SET) {
@ -3081,6 +3081,7 @@ void new_arc(int what, double sweep)
xctx->nl_x2 = xctx->mousex_snap; xctx->nl_x2 = xctx->mousex_snap;
xctx->nl_y2 = xctx->mousey_snap; xctx->nl_y2 = xctx->mousey_snap;
drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
restore_selection(xctx->nl_xx1, xctx->nl_yy1, xctx->nl_xx2, xctx->nl_yy2);
xctx->nl_state=1; xctx->nl_state=1;
} else if(xctx->nl_state==1) { } else if(xctx->nl_state==1) {
xctx->nl_x3 = xctx->mousex_snap; xctx->nl_x3 = xctx->mousex_snap;
@ -3101,9 +3102,10 @@ void new_arc(int what, double sweep)
if(what & RUBBER) { if(what & RUBBER) {
if(xctx->nl_state==0) { if(xctx->nl_state==0) {
drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
restore_selection(xctx->nl_xx1, xctx->nl_yy1, xctx->nl_xx2, xctx->nl_yy2);
xctx->nl_x2 = xctx->mousex_snap;xctx->nl_y2 = xctx->mousey_snap;
xctx->nl_xx2 = xctx->mousex_snap; xctx->nl_xx2 = xctx->mousex_snap;
xctx->nl_yy2 = xctx->mousey_snap; xctx->nl_yy2 = xctx->mousey_snap;
xctx->nl_xx1 = xctx->nl_x1;xctx->nl_yy1 = xctx->nl_y1;
ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
drawtempline(xctx->gc[SELLAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); drawtempline(xctx->gc[SELLAYER], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
} }
@ -3114,6 +3116,9 @@ void new_arc(int what, double sweep)
drawtemparc(xctx->gctiled, NOW, xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b); drawtemparc(xctx->gctiled, NOW, xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b);
arc_3_points(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2, arc_3_points(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2,
xctx->nl_x3, xctx->nl_y3, &xctx->nl_x, &xctx->nl_y, &xctx->nl_r, &xctx->nl_a, &xctx->nl_b); xctx->nl_x3, xctx->nl_y3, &xctx->nl_x, &xctx->nl_y, &xctx->nl_r, &xctx->nl_a, &xctx->nl_b);
restore_selection(xctx->nl_xx1, xctx->nl_yy1, xctx->nl_xx2, xctx->nl_yy2);
arc_bbox(xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b,
&xctx->nl_xx1, &xctx->nl_yy1, &xctx->nl_xx2, &xctx->nl_yy2);
if(xctx->nl_sweep_angle==360.) xctx->nl_b=360.; if(xctx->nl_sweep_angle==360.) xctx->nl_b=360.;
if(xctx->nl_r>0.) drawtemparc(xctx->gc[xctx->rectcolor], NOW, if(xctx->nl_r>0.) drawtemparc(xctx->gc[xctx->rectcolor], NOW,
xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b); xctx->nl_x, xctx->nl_y, xctx->nl_r, xctx->nl_a, xctx->nl_b);
@ -3121,9 +3126,11 @@ void new_arc(int what, double sweep)
} }
} }
void new_line(int what) void new_line(int what, double mousex_snap, double mousey_snap)
{ {
int modified = 0; int modified = 0;
if( (what & PLACE) ) if( (what & PLACE) )
{ {
if( (xctx->nl_x1!=xctx->nl_x2 || xctx->nl_y1!=xctx->nl_y2) && (xctx->ui_state & STARTLINE) ) if( (xctx->nl_x1!=xctx->nl_x2 || xctx->nl_y1!=xctx->nl_y2) && (xctx->ui_state & STARTLINE) )
@ -3173,7 +3180,7 @@ void new_line(int what)
} }
if(modified) set_modify(1); if(modified) set_modify(1);
} }
xctx->nl_x1=xctx->nl_x2=xctx->mousex_snap;xctx->nl_y1=xctx->nl_y2=xctx->mousey_snap; xctx->nl_x1=xctx->nl_x2=mousex_snap;xctx->nl_y1=xctx->nl_y2=mousey_snap;
xctx->ui_state |= STARTLINE; xctx->ui_state |= STARTLINE;
} }
if( what & END) if( what & END)
@ -3184,16 +3191,16 @@ void new_line(int what)
if(what & RUBBER) if(what & RUBBER)
{ {
if(xctx->manhattan_lines==1) { if(xctx->manhattan_lines==1) {
xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; xctx->nl_xx1 = xctx->nl_x1;xctx->nl_yy1 = xctx->nl_y1;
xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; xctx->nl_xx2 = xctx->nl_x2;xctx->nl_yy2 = xctx->nl_y2;
ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1);
drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1); drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy1);
xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1; xctx->nl_xx1 = xctx->nl_x1;xctx->nl_yy1 = xctx->nl_y1;
xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; xctx->nl_xx2 = xctx->nl_x2;xctx->nl_yy2 = xctx->nl_y2;
ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); ORDER(xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
drawtempline(xctx->gctiled, NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); drawtempline(xctx->gctiled, NOW, xctx->nl_xx2,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2);
xctx->nl_x2 = xctx->mousex_snap; xctx->nl_y2 = xctx->mousey_snap; xctx->nl_x2 = mousex_snap; xctx->nl_y2 = mousey_snap;
if(!(what & CLEAR)) { if(!(what & CLEAR)) {
xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1;
xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2;
@ -3214,7 +3221,7 @@ void new_line(int what)
ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); ORDER(xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2);
drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2); drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy2,xctx->nl_xx2,xctx->nl_yy2);
restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2);
xctx->nl_x2 = xctx->mousex_snap; xctx->nl_y2 = xctx->mousey_snap; xctx->nl_x2 = mousex_snap; xctx->nl_y2 = mousey_snap;
if(!(what & CLEAR)) { if(!(what & CLEAR)) {
xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1;
xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2;
@ -3231,7 +3238,7 @@ void new_line(int what)
ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); ORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); drawtempline(xctx->gctiled, NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2);
xctx->nl_x2 = xctx->mousex_snap; xctx->nl_y2 = xctx->mousey_snap; xctx->nl_x2 = mousex_snap; xctx->nl_y2 = mousey_snap;
if(!(what & CLEAR)) { if(!(what & CLEAR)) {
xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1; xctx->nl_xx1 = xctx->nl_x1; xctx->nl_yy1 = xctx->nl_y1;
xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2; xctx->nl_xx2 = xctx->nl_x2; xctx->nl_yy2 = xctx->nl_y2;
@ -3242,7 +3249,7 @@ void new_line(int what)
} }
} }
void new_rect(int what) void new_rect(int what, double mousex_snap, double mousey_snap)
{ {
int modified = 0; int modified = 0;
if( (what & PLACE) ) if( (what & PLACE) )
@ -3261,7 +3268,7 @@ void new_rect(int what)
storeobject(-1, xctx->nl_x1,xctx->nl_y1,xctx->nl_x2,xctx->nl_y2,xRECT,xctx->rectcolor, 0, NULL); storeobject(-1, xctx->nl_x1,xctx->nl_y1,xctx->nl_x2,xctx->nl_y2,xRECT,xctx->rectcolor, 0, NULL);
modified = 1; modified = 1;
} }
xctx->nl_x1=xctx->nl_x2=xctx->mousex_snap;xctx->nl_y1=xctx->nl_y2=xctx->mousey_snap; xctx->nl_x1 = xctx->nl_x2 = mousex_snap;xctx->nl_y1 = xctx->nl_y2 = mousey_snap;
xctx->ui_state |= STARTRECT; xctx->ui_state |= STARTRECT;
if(modified) set_modify(1); if(modified) set_modify(1);
} }
@ -3271,19 +3278,19 @@ void new_rect(int what)
} }
if(what & RUBBER) if(what & RUBBER)
{ {
xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1;xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; xctx->nl_xx1 = xctx->nl_x1;xctx->nl_yy1 = xctx->nl_y1;xctx->nl_xx2 = xctx->nl_x2;xctx->nl_yy2 = xctx->nl_y2;
RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
drawtemprect(xctx->gctiled,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); drawtemprect(xctx->gctiled,NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2); restore_selection(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2);
xctx->nl_x2=xctx->mousex_snap;xctx->nl_y2=xctx->mousey_snap; xctx->nl_x2 = xctx->mousex_snap;xctx->nl_y2 = xctx->mousey_snap;
xctx->nl_xx1=xctx->nl_x1;xctx->nl_yy1=xctx->nl_y1;xctx->nl_xx2=xctx->nl_x2;xctx->nl_yy2=xctx->nl_y2; xctx->nl_xx1 = xctx->nl_x1;xctx->nl_yy1 = xctx->nl_y1;xctx->nl_xx2 = xctx->nl_x2;xctx->nl_yy2 = xctx->nl_y2;
RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); RECTORDER(xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
drawtemprect(xctx->gc[xctx->rectcolor], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2); drawtemprect(xctx->gc[xctx->rectcolor], NOW, xctx->nl_xx1,xctx->nl_yy1,xctx->nl_xx2,xctx->nl_yy2);
} }
} }
void new_polygon(int what) void new_polygon(int what, double mousex_snap, double mousey_snap)
{ {
if( what & PLACE ) xctx->nl_points=0; /* start new polygon placement */ if( what & PLACE ) xctx->nl_points=0; /* start new polygon placement */
@ -3295,14 +3302,14 @@ void new_polygon(int what)
if( what & PLACE ) if( what & PLACE )
{ {
/* fprintf(errfp, "new_poly: PLACE, nl_points=%d\n", xctx->nl_points); */ /* fprintf(errfp, "new_poly: PLACE, nl_points=%d\n", xctx->nl_points); */
xctx->nl_polyy[xctx->nl_points]=xctx->mousey_snap; xctx->nl_polyy[xctx->nl_points]=mousey_snap;
xctx->nl_polyx[xctx->nl_points]=xctx->mousex_snap; xctx->nl_polyx[xctx->nl_points]=mousex_snap;
xctx->nl_points++; xctx->nl_points++;
xctx->nl_polyx[xctx->nl_points]=xctx->nl_polyx[xctx->nl_points-1]; /* prepare next point for rubber */ xctx->nl_polyx[xctx->nl_points]=xctx->nl_polyx[xctx->nl_points-1]; /* prepare next point for rubber */
xctx->nl_polyy[xctx->nl_points] = xctx->nl_polyy[xctx->nl_points-1]; xctx->nl_polyy[xctx->nl_points] = xctx->nl_polyy[xctx->nl_points-1];
/* fprintf(errfp, "added point: %.16g %.16g\n", xctx->nl_polyx[xctx->nl_points-1], /* fprintf(errfp, "added point: %.16g %.16g\n", xctx->nl_polyx[xctx->nl_points-1],
xctx->nl_polyy[xctx->nl_points-1]); */ xctx->nl_polyy[xctx->nl_points-1]); */
xctx->nl_x1=xctx->nl_x2=xctx->mousex_snap;xctx->nl_y1=xctx->nl_y2=xctx->mousey_snap; xctx->nl_x1=xctx->nl_x2=mousex_snap;xctx->nl_y1=xctx->nl_y2=mousey_snap;
xctx->ui_state |= STARTPOLYGON; xctx->ui_state |= STARTPOLYGON;
set_modify(1); set_modify(1);
} }
@ -3568,7 +3575,7 @@ int create_text(int draw_text, double x, double y, int rot, int flip, const char
my_strdup(_ALLOC_ID_, &t->prop_ptr, props); my_strdup(_ALLOC_ID_, &t->prop_ptr, props);
/* debug ... */ /* debug ... */
/* t->prop_ptr=NULL; */ /* t->prop_ptr=NULL; */
dbg(1, "place_text(): done text input\n"); dbg(1, "create_text(): done text input\n");
set_text_flags(t); set_text_flags(t);
textlayer = t->layer; textlayer = t->layer;
if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER; if(textlayer < 0 || textlayer >= cadlayers) textlayer = TEXTLAYER;

View File

@ -79,18 +79,18 @@ void redraw_w_a_l_r_p_rubbers(void)
if(xctx->ui_state & STARTARC) { if(xctx->ui_state & STARTARC) {
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_arc(RUBBER, 0); new_arc(RUBBER, 0, xctx->mousex_snap, xctx->mousey_snap);
} }
if(xctx->ui_state & STARTLINE) { if(xctx->ui_state & STARTLINE) {
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER); new_line(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
} }
if(xctx->ui_state & STARTRECT) new_rect(RUBBER); if(xctx->ui_state & STARTRECT) new_rect(RUBBER,xctx->mousex_snap, xctx->mousey_snap);
if(xctx->ui_state & STARTPOLYGON) { if(xctx->ui_state & STARTPOLYGON) {
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_polygon(RUBBER); new_polygon(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
} }
} }
@ -103,7 +103,7 @@ void abort_operation(void)
constrained_move=0; constrained_move=0;
if(xctx->last_command && xctx->ui_state & (STARTWIRE | STARTLINE)) { if(xctx->last_command && xctx->ui_state & (STARTWIRE | STARTLINE)) {
if(xctx->ui_state & STARTWIRE) new_wire(RUBBER|CLEAR, xctx->mousex_snap, xctx->mousey_snap); if(xctx->ui_state & STARTWIRE) new_wire(RUBBER|CLEAR, xctx->mousex_snap, xctx->mousey_snap);
if(xctx->ui_state & STARTLINE) new_line(RUBBER|CLEAR); if(xctx->ui_state & STARTLINE) new_line(RUBBER|CLEAR, xctx->mousex_snap, xctx->mousey_snap);
if(tclgetboolvar("draw_crosshair")) draw_crosshair(2); if(tclgetboolvar("draw_crosshair")) draw_crosshair(2);
xctx->ui_state = 0; xctx->ui_state = 0;
return; return;
@ -137,7 +137,7 @@ void abort_operation(void)
draw(); draw();
} }
static void start_place_symbol(double mx, double my) static void start_place_symbol(void)
{ {
xctx->last_command = 0; xctx->last_command = 0;
rebuild_selected_array(); rebuild_selected_array();
@ -161,18 +161,18 @@ static void start_line(double mx, double my)
xctx->last_command = STARTLINE; xctx->last_command = STARTLINE;
if(xctx->ui_state & STARTLINE) { if(xctx->ui_state & STARTLINE) {
if(constrained_move != 2) { if(constrained_move != 2) {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=mx;
} }
if(constrained_move != 1) { if(constrained_move != 1) {
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=my;
} }
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) my = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) mx = xctx->mx_double_save;
} else { } else {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=mx;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=my;
} }
new_line(PLACE); new_line(PLACE, mx, my);
} }
static void start_wire(double mx, double my) static void start_wire(double mx, double my)
@ -180,19 +180,18 @@ static void start_wire(double mx, double my)
xctx->last_command = STARTWIRE; xctx->last_command = STARTWIRE;
if(xctx->ui_state & STARTWIRE) { if(xctx->ui_state & STARTWIRE) {
if(constrained_move != 2) { if(constrained_move != 2) {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save = mx;
} }
if(constrained_move != 1) { if(constrained_move != 1) {
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save = my;
} }
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) my = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) mx = xctx->mx_double_save;
} else { } else {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=mx;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=my;
} }
new_wire(PLACE,xctx->mousex_snap, xctx->mousey_snap); new_wire(PLACE,mx, my);
} }
static double interpolate_yval(int idx, int point_not_last) static double interpolate_yval(int idx, int point_not_last)
@ -1136,7 +1135,7 @@ static int end_place_move_copy_zoom(int constrained_move)
return 1; return 1;
} }
else if(xctx->ui_state & STARTARC) { else if(xctx->ui_state & STARTARC) {
new_arc(SET, 0); new_arc(SET, 0, xctx->mousex_snap, xctx->mousey_snap);
return 1; return 1;
} }
else if(xctx->ui_state & STARTLINE) { else if(xctx->ui_state & STARTLINE) {
@ -1149,22 +1148,22 @@ static int end_place_move_copy_zoom(int constrained_move)
} }
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(PLACE); new_line(PLACE, xctx->mousex_snap, xctx->mousey_snap);
} else { } else {
new_line(PLACE|END); new_line(PLACE|END, xctx->mousex_snap, xctx->mousey_snap);
} }
constrained_move=0; constrained_move=0;
tcleval("set constrained_move 0" ); tcleval("set constrained_move 0" );
return 1; return 1;
} }
else if(xctx->ui_state & STARTRECT) { else if(xctx->ui_state & STARTRECT) {
new_rect(PLACE|END); new_rect(PLACE|END,xctx->mousex_snap, xctx->mousey_snap);
return 1; return 1;
} }
else if(xctx->ui_state & STARTPOLYGON) { else if(xctx->ui_state & STARTPOLYGON) {
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_polygon(ADD); new_polygon(ADD, xctx->mousex_snap, xctx->mousey_snap);
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
constrained_move=0; constrained_move=0;
@ -1228,35 +1227,35 @@ static int check_menu_start_commands(double c_snap)
else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTLINE)) { else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTLINE)) {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
new_line(PLACE); new_line(PLACE, xctx->mousex_snap, xctx->mousey_snap);
xctx->ui_state &=~MENUSTART; xctx->ui_state &=~MENUSTART;
return 1; return 1;
} }
else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTRECT)) { else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTRECT)) {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
new_rect(PLACE); new_rect(PLACE,xctx->mousex_snap, xctx->mousey_snap);
xctx->ui_state &=~MENUSTART; xctx->ui_state &=~MENUSTART;
return 1; return 1;
} }
else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTPOLYGON)) { else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTPOLYGON)) {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
new_polygon(PLACE); new_polygon(PLACE, xctx->mousex_snap, xctx->mousey_snap);
xctx->ui_state &=~MENUSTART; xctx->ui_state &=~MENUSTART;
return 1; return 1;
} }
else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTARC)) { else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTARC)) {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
new_arc(PLACE, 180.); new_arc(PLACE, 180., xctx->mousex_snap, xctx->mousey_snap);
xctx->ui_state &=~MENUSTART; xctx->ui_state &=~MENUSTART;
return 1; return 1;
} }
else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTCIRCLE)) { else if((xctx->ui_state & MENUSTART) && (xctx->ui_state2 & MENUSTARTCIRCLE)) {
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
new_arc(PLACE, 360.); new_arc(PLACE, 360., xctx->mousex_snap, xctx->mousey_snap);
xctx->ui_state &=~MENUSTART; xctx->ui_state &=~MENUSTART;
return 1; return 1;
} }
@ -1454,8 +1453,7 @@ static int edit_polygon_point(int state)
return 0; return 0;
} }
/* Mouse wheel events */ static void context_menu_action(double mx, double my)
static void context_menu_action(int mx, int my)
{ {
int ret; int ret;
const char *status; const char *status;
@ -1467,7 +1465,7 @@ static void context_menu_action(int mx, int my)
ret = atoi(status); ret = atoi(status);
switch(ret) { switch(ret) {
case 1: case 1:
start_place_symbol(mx, my); start_place_symbol();
break; break;
case 2: case 2:
prev_state = xctx->ui_state; prev_state = xctx->ui_state;
@ -1489,19 +1487,19 @@ static void context_menu_action(int mx, int my)
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_rect(PLACE); new_rect(PLACE,mx, my);
break; break;
case 5: case 5:
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_polygon(PLACE); new_polygon(PLACE, mx, my);
break; break;
case 6: /* place text */ case 6: /* place text */
xctx->last_command = 0; xctx->last_command = 0;
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
if(place_text(0, xctx->mousex_snap, xctx->mousey_snap)) { /* 1 = draw text */ if(place_text(0, mx, my)) { /* 1 = draw text */
xctx->mousey_snap = xctx->my_double_save; xctx->mousey_snap = xctx->my_double_save;
xctx->mousex_snap = xctx->mx_double_save; xctx->mousex_snap = xctx->mx_double_save;
move_objects(START,0,0,0); move_objects(START,0,0,0);
@ -1563,13 +1561,13 @@ static void context_menu_action(int mx, int my)
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_arc(PLACE, 180.); new_arc(PLACE, 180., mx, my);
break; break;
case 20: /* place circle */ case 20: /* place circle */
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_arc(PLACE, 360.); new_arc(PLACE, 360., mx, my);
break; break;
case 21: /* abort & redraw */ case 21: /* abort & redraw */
abort_operation(); abort_operation();
@ -1579,6 +1577,7 @@ static void context_menu_action(int mx, int my)
} }
} }
/* Mouse wheel events */
static int handle_mouse_wheel(int event, int mx, int my, KeySym key, int button, int aux, int state) static int handle_mouse_wheel(int event, int mx, int my, KeySym key, int button, int aux, int state)
{ {
if(button==Button5 && state == 0 ) { if(button==Button5 && state == 0 ) {
@ -1966,10 +1965,10 @@ int rstate; /* (reduced state, without ShiftMask) */
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap); new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
} else if(xctx->ui_state==STARTLINE) { } else if(xctx->ui_state==STARTLINE) {
new_line(RUBBER|CLEAR); new_line(RUBBER|CLEAR, xctx->mousex_snap, xctx->mousey_snap);
xctx->manhattan_lines++; xctx->manhattan_lines++;
xctx->manhattan_lines %=3; xctx->manhattan_lines %=3;
new_line(RUBBER); new_line(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
} else { } else {
if(xctx->semaphore<2) { if(xctx->semaphore<2) {
rebuild_selected_array(); /* sets or clears xctx->ui_state SELECTION flag */ rebuild_selected_array(); /* sets or clears xctx->ui_state SELECTION flag */
@ -2077,7 +2076,7 @@ int rstate; /* (reduced state, without ShiftMask) */
if(xctx->ui_state & STARTLINE) { if(xctx->ui_state & STARTLINE) {
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER); new_line(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
} }
break; break;
} }
@ -2106,7 +2105,7 @@ int rstate; /* (reduced state, without ShiftMask) */
if(xctx->ui_state & STARTLINE) { if(xctx->ui_state & STARTLINE) {
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save; if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save; if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER); new_line(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
} }
break; break;
} }
@ -2210,7 +2209,7 @@ int rstate; /* (reduced state, without ShiftMask) */
{ {
int prev_state = xctx->ui_state; int prev_state = xctx->ui_state;
if(xctx->semaphore >= 2) break; if(xctx->semaphore >= 2) break;
start_wire(mx, my); start_wire(xctx->mousex_snap, xctx->mousey_snap);
if(prev_state == STARTWIRE) { if(prev_state == STARTWIRE) {
tcleval("set constrained_move 0" ); tcleval("set constrained_move 0" );
constrained_move=0; constrained_move=0;
@ -2218,7 +2217,7 @@ int rstate; /* (reduced state, without ShiftMask) */
break; break;
} }
if(key == XK_Return && (state == 0 ) && xctx->ui_state & STARTPOLYGON) { /* close polygon */ if(key == XK_Return && (state == 0 ) && xctx->ui_state & STARTPOLYGON) { /* close polygon */
new_polygon(ADD|END); new_polygon(ADD|END, xctx->mousex_snap, xctx->mousey_snap);
break; break;
} }
if(key == XK_Escape) /* abort & redraw */ if(key == XK_Escape) /* abort & redraw */
@ -2257,7 +2256,7 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_polygon(PLACE); new_polygon(PLACE, xctx->mousex_snap, xctx->mousey_snap);
break; break;
} }
if(key=='P' && rstate == 0) /* pan, other way to. */ if(key=='P' && rstate == 0) /* pan, other way to. */
@ -2391,7 +2390,7 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_rect(PLACE); new_rect(PLACE,xctx->mousex_snap, xctx->mousey_snap);
break; break;
} }
if(key=='V' && rstate == ControlMask) /* toggle spice/vhdl netlist */ if(key=='V' && rstate == ControlMask) /* toggle spice/vhdl netlist */
@ -2570,7 +2569,7 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_arc(PLACE, 180.); new_arc(PLACE, 180., xctx->mousex_snap, xctx->mousey_snap);
break; break;
} }
if(key=='C' /* && !xctx->ui_state */ && rstate == ControlMask) /* place circle */ if(key=='C' /* && !xctx->ui_state */ && rstate == ControlMask) /* place circle */
@ -2579,7 +2578,7 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->mx_double_save=xctx->mousex_snap; xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap; xctx->my_double_save=xctx->mousey_snap;
xctx->last_command = 0; xctx->last_command = 0;
new_arc(PLACE, 360.); new_arc(PLACE, 360., xctx->mousex_snap, xctx->mousey_snap);
break; break;
} }
if(key=='O' && rstate == ControlMask ) /* load most recent tile */ if(key=='O' && rstate == ControlMask ) /* load most recent tile */
@ -2658,7 +2657,7 @@ int rstate; /* (reduced state, without ShiftMask) */
if((key==XK_Insert && state == 0) || (key == 'I' && rstate == 0) ) /* insert sym */ if((key==XK_Insert && state == 0) || (key == 'I' && rstate == 0) ) /* insert sym */
{ {
if(xctx->semaphore >= 2) break; if(xctx->semaphore >= 2) break;
start_place_symbol(mx, my); start_place_symbol();
break; break;
} }
@ -2881,7 +2880,7 @@ int rstate; /* (reduced state, without ShiftMask) */
if(key=='l' /* && !xctx->ui_state */ && rstate == 0) /* start line */ if(key=='l' /* && !xctx->ui_state */ && rstate == 0) /* start line */
{ {
int prev_state = xctx->ui_state; int prev_state = xctx->ui_state;
start_line(mx, my); start_line(xctx->mousex_snap, xctx->mousey_snap);
if(prev_state == STARTLINE) { if(prev_state == STARTLINE) {
tcleval("set constrained_move 0" ); tcleval("set constrained_move 0" );
constrained_move=0; constrained_move=0;
@ -3335,7 +3334,7 @@ int rstate; /* (reduced state, without ShiftMask) */
if(sel.type) select_connected_nets(0); if(sel.type) select_connected_nets(0);
} }
else if(button == Button3 && state == 0 && xctx->semaphore <2) { else if(button == Button3 && state == 0 && xctx->semaphore <2) {
context_menu_action(mx, my); context_menu_action(xctx->mousex_snap, xctx->mousey_snap);
} }
/* Mouse wheel events */ /* Mouse wheel events */
else if(handle_mouse_wheel(event, mx, my, key, button, aux, state)) break; else if(handle_mouse_wheel(event, mx, my, key, button, aux, state)) break;
@ -3371,8 +3370,8 @@ int rstate; /* (reduced state, without ShiftMask) */
{ {
xctx->drag_elements = 0; xctx->drag_elements = 0;
if(tclgetboolvar("persistent_command") && xctx->last_command) { if(tclgetboolvar("persistent_command") && xctx->last_command) {
if(xctx->last_command == STARTLINE) start_line(mx, my); if(xctx->last_command == STARTLINE) start_line(xctx->mousex_snap, xctx->mousey_snap);
if(xctx->last_command == STARTWIRE) start_wire(mx, my); if(xctx->last_command == STARTWIRE) start_wire(xctx->mousex_snap, xctx->mousey_snap);
break; break;
} }
/* handle all object insertions started from Tools menu */ /* handle all object insertions started from Tools menu */
@ -3541,7 +3540,7 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->ui_state &= ~STARTLINE; xctx->ui_state &= ~STARTLINE;
} }
if( (xctx->ui_state & STARTPOLYGON) && (state ==0 ) ) { if( (xctx->ui_state & STARTPOLYGON) && (state ==0 ) ) {
new_polygon(SET); new_polygon(SET, xctx->mousex_snap, xctx->mousey_snap);
} }
} }
} }

View File

@ -1500,8 +1500,8 @@ extern void view_unzoom(double z);
extern void view_zoom(double z); extern void view_zoom(double z);
extern void draw_stuff(void); extern void draw_stuff(void);
extern void new_wire(int what, double mx_snap, double my_snap); extern void new_wire(int what, double mx_snap, double my_snap);
extern void new_line(int what); extern void new_line(int what, double mx_snap, double my_snap);
extern void new_arc(int what, double sweep); extern void new_arc(int what, double sweep, double mousex_snap, double mousey_snap);
extern void arc_3_points(double x1, double y1, double x2, double y2, double x3, double y3, extern void arc_3_points(double x1, double y1, double x2, double y2, double x3, double y3,
double *x, double *y, double *r, double *a, double *b); double *x, double *y, double *r, double *a, double *b);
extern void move_objects(int what,int merge, double dx, double dy); extern void move_objects(int what,int merge, double dx, double dy);
@ -1514,8 +1514,8 @@ extern void zoom_rectangle(int what);
extern void zoom_box(double x1, double y1, double x2, double y2, double factor); extern void zoom_box(double x1, double y1, double x2, double y2, double factor);
extern void save_restore_zoom(int save, Zoom_info *zi); extern void save_restore_zoom(int save, Zoom_info *zi);
extern void select_rect(int what, int select); extern void select_rect(int what, int select);
extern void new_rect(int what); extern void new_rect(int what, double mousex_snap, double mousey_snap);
extern void new_polygon(int what); extern void new_polygon(int what, double mousex_snap, double mousey_snap);
extern void compile_font(void); extern void compile_font(void);
extern void rebuild_selected_array(void); extern void rebuild_selected_array(void);