when doing a select by area with shift pressed the object under the mouse will not be unselected if it was already selected (xctx->already_selected)

This commit is contained in:
stefan schippers 2023-10-23 23:41:39 +02:00
parent 512b297e35
commit 0819211bb0
4 changed files with 19 additions and 10 deletions

View File

@ -1260,7 +1260,7 @@ int rstate; /* (reduced state, without ShiftMask) */
}
redraw_w_a_l_r_p_rubbers();
/* start of a mouse area select */
/* start of a mouse area select. No shift pressed */
if(!(xctx->ui_state & STARTPOLYGON) && (state&Button1Mask) && !(xctx->ui_state & STARTWIRE) &&
!(xctx->ui_state & STARTPAN) && !(SET_MODMASK) &&
!(state & ShiftMask) && !(xctx->ui_state & (PLACE_SYMBOL | PLACE_TEXT)))
@ -1280,6 +1280,7 @@ int rstate; /* (reduced state, without ShiftMask) */
}
}
}
/* Unselect by area */
if((state & Button1Mask) && (SET_MODMASK) && !(state & ShiftMask) &&
!(xctx->ui_state & STARTPAN) &&
!(xctx->ui_state & (PLACE_SYMBOL | PLACE_TEXT))) { /* unselect area */
@ -1287,6 +1288,7 @@ int rstate; /* (reduced state, without ShiftMask) */
select_rect(START,0);
}
}
/* Select by area. Shift pressed */
else if((state&Button1Mask) && (state & ShiftMask) &&
!(xctx->ui_state & (PLACE_SYMBOL | PLACE_TEXT)) &&
!(xctx->ui_state & STARTPAN) ) {
@ -1296,8 +1298,10 @@ int rstate; /* (reduced state, without ShiftMask) */
}
if(abs(mx-xctx->mx_save) > 8 ||
abs(my-xctx->my_save) > 8 ) { /* set reasonable threshold before unsel */
select_object(X_TO_XSCHEM(xctx->mx_save),
Y_TO_XSCHEM(xctx->my_save), 0, 0); /* remove near obj if dragging */
if(!xctx->already_selected) {
select_object(X_TO_XSCHEM(xctx->mx_save),
Y_TO_XSCHEM(xctx->my_save), 0, 0); /* remove near obj if dragging */
}
rebuild_selected_array();
}
}
@ -2714,17 +2718,12 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->yorigin-=-CADMOVESTEP*xctx->zoom/2.;
draw();
}
/* Alt - Button1 click to unselect */
else if(button==Button1 && (SET_MODMASK) ) {
xctx->last_command = 0;
xctx->mx_save = mx; xctx->my_save = my;
xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap;
/* useless code ? 20200905 */
/* if(xctx->semaphore<2) {
rebuild_selected_array();
} */
select_object(xctx->mousex, xctx->mousey, 0, 0);
rebuild_selected_array(); /* sets or clears xctx->ui_state SELECTION flag */
}
@ -2902,6 +2901,7 @@ int rstate; /* (reduced state, without ShiftMask) */
tcleval("set constrained_move 0" );
break;
}
/* Button1Press to select objects */
if( !(xctx->ui_state & STARTSELECT) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) {
Selected sel;
int prev_last_sel = xctx->lastsel;

View File

@ -1224,31 +1224,38 @@ void select_line(int c, int i, unsigned short select_mode, int fast )
Selected select_object(double mx,double my, unsigned short select_mode, int override_lock)
{
Selected sel;
xctx->already_selected = 0;
sel = find_closest_obj(mx, my, override_lock);
dbg(1, "select_object(): sel.n=%d, sel.col=%d, sel.type=%d\n", sel.n, sel.col, sel.type);
switch(sel.type)
{
case WIRE:
if(xctx->wire[sel.n].sel) xctx->already_selected = 1;
select_wire(sel.n, select_mode, 0);
break;
case xTEXT:
if(xctx->text[sel.n].sel) xctx->already_selected = 1;
select_text(sel.n, select_mode, 0);
break;
case LINE:
if(xctx->line[sel.col][sel.n].sel) xctx->already_selected = 1;
select_line(sel.col, sel.n, select_mode,0);
break;
case POLYGON:
if(xctx->poly[sel.col][sel.n].sel) xctx->already_selected = 1;
select_polygon(sel.col, sel.n, select_mode,0);
break;
case xRECT:
if(xctx->rect[sel.col][sel.n].sel) xctx->already_selected = 1;
select_box(sel.col,sel.n, select_mode,0, override_lock);
break;
case ARC:
if(xctx->arc[sel.col][sel.n].sel) xctx->already_selected = 1;
select_arc(sel.col,sel.n, select_mode,0);
break;
case ELEMENT:
if(xctx->inst[sel.n].sel) xctx->already_selected = 1;
select_element(sel.n,select_mode,0, override_lock);
break;
default:

View File

@ -613,6 +613,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path)
xctx->only_probes = 0;
xctx->menu_removed = 0; /* fullscreen previous setting */
xctx->save_lw = 0.0; /* used to save linewidth when selecting 'only_probes' view */
xctx->already_selected = 0;
xctx->onetime = 0; /* callback() static var */
xctx->save_netlist_type = 0;
xctx->some_nets_added = 0;

View File

@ -972,6 +972,7 @@ typedef struct {
int *node_mult;
int node_mult_size;
/* callback.c */
int already_selected; /* when clicking on an object that is already selected this will be 1 */
int mx_save, my_save, last_command;
char sel_or_clip[PATH_MAX];
int onetime;