more flexibility in constrained move operations (draw wires, lines, copy/move), pressing h/v again toggles constrained / unsonstrained move
This commit is contained in:
parent
8eb2147b18
commit
ef1f297290
151
src/callback.c
151
src/callback.c
|
|
@ -25,24 +25,24 @@
|
|||
void redraw_w_a_l_r_p_rubbers(void)
|
||||
{
|
||||
if(xctx->ui_state & STARTWIRE) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
|
||||
}
|
||||
if(xctx->ui_state & STARTARC) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_arc(RUBBER, 0);
|
||||
}
|
||||
if(xctx->ui_state & STARTLINE) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_line(RUBBER);
|
||||
}
|
||||
if(xctx->ui_state & STARTRECT) new_rect(RUBBER);
|
||||
if(xctx->ui_state & STARTPOLYGON) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_polygon(RUBBER);
|
||||
}
|
||||
}
|
||||
|
|
@ -51,16 +51,16 @@ void start_line(double mx, double my)
|
|||
{
|
||||
xctx->last_command = STARTLINE;
|
||||
if(xctx->ui_state & STARTLINE) {
|
||||
if(!vertical_move) {
|
||||
if(constrained_move != 2) {
|
||||
xctx->mx_save = mx;
|
||||
xctx->mx_double_save=xctx->mousex_snap;
|
||||
}
|
||||
if(!horizontal_move) {
|
||||
if(constrained_move != 1) {
|
||||
xctx->my_save = my;
|
||||
xctx->my_double_save=xctx->mousey_snap;
|
||||
}
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
} else {
|
||||
xctx->mx_save = mx; xctx->my_save = my;
|
||||
xctx->mx_double_save=xctx->mousex_snap;
|
||||
|
|
@ -73,16 +73,16 @@ void start_wire(double mx, double my)
|
|||
{
|
||||
xctx->last_command = STARTWIRE;
|
||||
if(xctx->ui_state & STARTWIRE) {
|
||||
if(!vertical_move) {
|
||||
if(constrained_move != 2) {
|
||||
xctx->mx_save = mx;
|
||||
xctx->mx_double_save=xctx->mousex_snap;
|
||||
}
|
||||
if(!horizontal_move) {
|
||||
if(constrained_move != 1) {
|
||||
xctx->my_save = my;
|
||||
xctx->my_double_save=xctx->mousey_snap;
|
||||
}
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
} else {
|
||||
xctx->mx_save = mx; xctx->my_save = my;
|
||||
xctx->mx_double_save=xctx->mousex_snap;
|
||||
|
|
@ -247,13 +247,13 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
}
|
||||
|
||||
if(xctx->ui_state & STARTMOVE) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
move_objects(RUBBER,0,0,0);
|
||||
}
|
||||
if(xctx->ui_state & STARTCOPY) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
copy_objects(RUBBER);
|
||||
}
|
||||
|
||||
|
|
@ -400,44 +400,46 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
}
|
||||
if(key == 'h' && state == 0) {
|
||||
/* horizontally constrained drag 20171023 */
|
||||
if ( horizontal_move ) {
|
||||
tcleval("set horizontal_move 0" );
|
||||
if ( constrained_move == 1 ) {
|
||||
tcleval("set constrained_move 0" );
|
||||
constrained_move = 0;
|
||||
} else {
|
||||
tcleval("set horizontal_move 1" );
|
||||
tcleval("xschem set horizontal_move");
|
||||
tcleval("set constrained_move 1" );
|
||||
constrained_move = 1;
|
||||
}
|
||||
if(xctx->ui_state & STARTWIRE) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
|
||||
}
|
||||
if(xctx->ui_state & STARTLINE) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_line(RUBBER);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(key=='H' && state==ShiftMask) { /* attach labels to selected instances */
|
||||
attach_labels_to_inst();
|
||||
break;
|
||||
attach_labels_to_inst();
|
||||
break;
|
||||
}
|
||||
if(key == 'v' && state==0) {
|
||||
/* vertically constrained drag 20171023 */
|
||||
if ( vertical_move ) {
|
||||
tcleval("set vertical_move 0" );
|
||||
if ( constrained_move == 2 ) {
|
||||
tcleval("set constrained_move 0" );
|
||||
constrained_move = 0;
|
||||
} else {
|
||||
tcleval("set vertical_move 1" );
|
||||
tcleval("xschem set vertical_move");
|
||||
tcleval("set constrained_move 2" );
|
||||
constrained_move = 2;
|
||||
}
|
||||
if(xctx->ui_state & STARTWIRE) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
|
||||
}
|
||||
if(xctx->ui_state & STARTLINE) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_line(RUBBER);
|
||||
}
|
||||
break;
|
||||
|
|
@ -534,15 +536,20 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y);
|
||||
new_wire(RUBBER, x, y);
|
||||
new_wire(PLACE|END, x, y);
|
||||
horizontal_move = vertical_move=0;
|
||||
tcleval("set vertical_move 0; set horizontal_move 0" );
|
||||
constrained_move=0;
|
||||
tcleval("set constrained_move 0" );
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(key == 'w'&& state==0) /* place wire. */
|
||||
if(key == 'w' && state==0) /* place wire. */
|
||||
{
|
||||
int prev_state = xctx->ui_state;
|
||||
if(xctx->semaphore >= 2) break;
|
||||
start_wire(mx, my);
|
||||
if(prev_state == STARTWIRE) {
|
||||
tcleval("set constrained_move 0" );
|
||||
constrained_move=0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(key == XK_Return && (state == 0 ) && xctx->ui_state & STARTPOLYGON) { /* close polygon */
|
||||
|
|
@ -553,10 +560,10 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
{
|
||||
no_draw = 0;
|
||||
if(xctx->semaphore >= 2) break;
|
||||
tcleval("set vertical_move 0; set horizontal_move 0" );
|
||||
tcleval("set constrained_move 0" );
|
||||
constrained_move=0;
|
||||
xctx->last_command=0;
|
||||
manhattan_lines = 0;
|
||||
horizontal_move = vertical_move = 0;
|
||||
dbg(1, "callback(): Escape: ui_state=%ld\n", xctx->ui_state);
|
||||
if(xctx->ui_state & STARTMOVE)
|
||||
{
|
||||
|
|
@ -1076,25 +1083,29 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
break;
|
||||
}
|
||||
if(key=='l' && state == ControlMask) { /* create schematic from selected symbol 20171004 */
|
||||
|
||||
if(xctx->semaphore >= 2) break;
|
||||
create_sch_from_sym();
|
||||
break;
|
||||
}
|
||||
if(key=='l' && state == 0) /* start line */
|
||||
{
|
||||
start_line(mx, my);
|
||||
break;
|
||||
int prev_state = xctx->ui_state;
|
||||
start_line(mx, my);
|
||||
if(prev_state == STARTLINE) {
|
||||
tcleval("set constrained_move 0" );
|
||||
constrained_move=0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(key=='l' && state == Mod1Mask) { /* add pin label*/
|
||||
place_net_label(1);
|
||||
break;
|
||||
place_net_label(1);
|
||||
break;
|
||||
}
|
||||
if(key >= '0' && key <= '3' && state == 0) { /* Toggle pin logic level */
|
||||
if(xctx->semaphore >= 2) break;
|
||||
if(key == '3') logic_set(-1, 1);
|
||||
else logic_set(key - '0', 1);
|
||||
break;
|
||||
if(xctx->semaphore >= 2) break;
|
||||
if(key == '3') logic_set(-1, 1);
|
||||
else logic_set(key - '0', 1);
|
||||
break;
|
||||
}
|
||||
if(key=='L' && state == (Mod1Mask | ShiftMask)) { /* add pin label*/
|
||||
place_net_label(0);
|
||||
|
|
@ -1480,10 +1491,6 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
if(xctx->last_command == STARTWIRE) start_wire(mx, my);
|
||||
break;
|
||||
}
|
||||
if(!(xctx->ui_state & STARTPOLYGON) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) {
|
||||
horizontal_move = vertical_move=0;
|
||||
tcleval("set vertical_move 0; set horizontal_move 0" );
|
||||
}
|
||||
if(xctx->ui_state & MENUSTARTTEXT) {
|
||||
place_text(1, xctx->mousex_snap, xctx->mousey_snap);
|
||||
xctx->ui_state &=~MENUSTARTTEXT;
|
||||
|
|
@ -1567,21 +1574,23 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
}
|
||||
if(xctx->ui_state & STARTWIRE) {
|
||||
if(persistent_command) {
|
||||
if(!vertical_move) {
|
||||
if(constrained_move != 2) {
|
||||
xctx->mx_save = mx;
|
||||
xctx->mx_double_save=xctx->mousex_snap;
|
||||
}
|
||||
if(!horizontal_move) {
|
||||
if(constrained_move != 1) {
|
||||
xctx->my_save = my;
|
||||
xctx->my_double_save=xctx->mousey_snap;
|
||||
}
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_wire(PLACE, xctx->mousex_snap, xctx->mousey_snap);
|
||||
|
||||
} else {
|
||||
new_wire(PLACE|END, xctx->mousex_snap, xctx->mousey_snap);
|
||||
}
|
||||
constrained_move=0;
|
||||
tcleval("set constrained_move 0" );
|
||||
break;
|
||||
}
|
||||
if(xctx->ui_state & STARTARC) {
|
||||
|
|
@ -1590,20 +1599,22 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
}
|
||||
if(xctx->ui_state & STARTLINE) {
|
||||
if(persistent_command) {
|
||||
if(!vertical_move) {
|
||||
if(constrained_move != 2) {
|
||||
xctx->mx_save = mx;
|
||||
xctx->mx_double_save=xctx->mousex_snap;
|
||||
}
|
||||
if(!horizontal_move) {
|
||||
if(constrained_move == 1) {
|
||||
xctx->my_save = my;
|
||||
xctx->my_double_save=xctx->mousey_snap;
|
||||
}
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_line(PLACE);
|
||||
} else {
|
||||
new_line(PLACE|END);
|
||||
}
|
||||
constrained_move=0;
|
||||
tcleval("set constrained_move 0" );
|
||||
break;
|
||||
}
|
||||
if(xctx->ui_state & STARTRECT) {
|
||||
|
|
@ -1611,22 +1622,26 @@ int callback(int event, int mx, int my, KeySym key,
|
|||
break;
|
||||
}
|
||||
if(xctx->ui_state & STARTPOLYGON) {
|
||||
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
|
||||
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
|
||||
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
|
||||
new_polygon(ADD);
|
||||
xctx->mx_double_save=xctx->mousex_snap;
|
||||
xctx->my_double_save=xctx->mousey_snap;
|
||||
horizontal_move = vertical_move=0;
|
||||
tcleval("set vertical_move 0; set horizontal_move 0" );
|
||||
constrained_move=0;
|
||||
tcleval("set constrained_move 0" );
|
||||
break;
|
||||
}
|
||||
if(xctx->ui_state & STARTMOVE) {
|
||||
move_objects(END,0,0,0);
|
||||
xctx->ui_state &=~START_SYMPIN;
|
||||
constrained_move=0;
|
||||
tcleval("set constrained_move 0" );
|
||||
break;
|
||||
}
|
||||
if(xctx->ui_state & STARTCOPY) {
|
||||
copy_objects(END);
|
||||
constrained_move=0;
|
||||
tcleval("set constrained_move 0" );
|
||||
break;
|
||||
}
|
||||
if( !(xctx->ui_state & STARTSELECT) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) {
|
||||
|
|
|
|||
|
|
@ -211,9 +211,8 @@ int do_waves=0;
|
|||
int netlist_count=0; /* netlist counter incremented at any cell being netlisted */
|
||||
char hiersep[20]=".";
|
||||
char bus_char[3] = {0, 0, 0};
|
||||
int horizontal_move=0;
|
||||
int vertical_move=0;
|
||||
int pending_fullzoom=0;
|
||||
int constrained_move = 0;
|
||||
double color_dim=0.0;
|
||||
int no_undo=0;
|
||||
int enable_drill=0; /* pass net hilights through components with 'propag=' property set on pins */
|
||||
|
|
|
|||
|
|
@ -2277,6 +2277,9 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
change_layer();
|
||||
}
|
||||
}
|
||||
else if(!strcmp(argv[2],"constrained_move")) {
|
||||
constrained_move = atoi(argv[3]);
|
||||
}
|
||||
else if(!strcmp(argv[2],"change_lw")) {
|
||||
change_lw=atoi(argv[3]);
|
||||
}
|
||||
|
|
@ -2292,28 +2295,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
|
|||
}
|
||||
}
|
||||
|
||||
else if(!strcmp(argv[1],"set") && argc==3)
|
||||
{
|
||||
cmd_found = 1;
|
||||
if(!strcmp(argv[2],"horizontal_move")) {
|
||||
horizontal_move = atoi(tclgetvar("horizontal_move"));
|
||||
if(horizontal_move) {
|
||||
vertical_move=0;
|
||||
tcleval("set vertical_move 0" );
|
||||
}
|
||||
}
|
||||
else if(!strcmp(argv[2],"vertical_move")) {
|
||||
vertical_move = atoi(tclgetvar("vertical_move"));
|
||||
if(vertical_move) {
|
||||
horizontal_move=0;
|
||||
tcleval("set horizontal_move 0" );
|
||||
}
|
||||
}
|
||||
else {
|
||||
fprintf(errfp, "xschem set %s : invalid command.\n", argv[2]);
|
||||
}
|
||||
}
|
||||
|
||||
else if(!strcmp(argv[1],"set_different_tok") )
|
||||
{
|
||||
char *s = NULL;
|
||||
|
|
|
|||
|
|
@ -763,9 +763,8 @@ extern int depth;
|
|||
extern int *fill_type; /* 20171117 for every layer: 0: no fill, 1, solid fill, 2: stipple fill */
|
||||
extern Tcl_Interp *interp;
|
||||
extern double cadsnap;
|
||||
extern int horizontal_move;
|
||||
extern int vertical_move;
|
||||
extern double *character[256];
|
||||
extern int constrained_move;
|
||||
extern int netlist_show;
|
||||
extern int flat_netlist;
|
||||
extern int netlist_type;
|
||||
|
|
|
|||
|
|
@ -3470,8 +3470,7 @@ set_ne line_width 0
|
|||
set_ne draw_window 0
|
||||
set_ne incr_hilight 1
|
||||
set_ne enable_stretch 0
|
||||
set_ne horizontal_move 0 ; # 20171023
|
||||
set_ne vertical_move 0 ; # 20171023
|
||||
set_ne constrained_move 0
|
||||
set_ne draw_grid 1
|
||||
set_ne big_grid_points 0
|
||||
set_ne snap 10
|
||||
|
|
@ -3864,10 +3863,12 @@ if { ( $::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ]
|
|||
toolbar_create EditMove "xschem move_objects" "Move objects"
|
||||
.menubar.edit.menu add command -label "Flip selected objects" -command "xschem flip" -accelerator {Alt-F}
|
||||
.menubar.edit.menu add command -label "Rotate selected objects" -command "xschem rotate" -accelerator {Alt-R}
|
||||
.menubar.edit.menu add checkbutton -label "Constrained Horizontal move" -variable horizontal_move \
|
||||
-command "xschem set horizontal_move" -accelerator H
|
||||
.menubar.edit.menu add checkbutton -label "Constrained Vertical move" -variable vertical_move \
|
||||
-command "xschem set vertical_move" -accelerator V
|
||||
.menubar.edit.menu add radiobutton -label "Unconstrained move" -variable constrained_move \
|
||||
-value 0 -command {xschem set constrained_move 0}
|
||||
.menubar.edit.menu add radiobutton -label "Constrained Horizontal move" -variable constrained_move \
|
||||
-value 1 -accelerator H -command {xschem set constrained_move 1}
|
||||
.menubar.edit.menu add radiobutton -label "Constrained Vertical move" -variable constrained_move \
|
||||
-value 2 -accelerator V -command {xschem set constrained_move 2}
|
||||
.menubar.edit.menu add command -label "Push schematic" -command "xschem descend" -accelerator E
|
||||
toolbar_create EditPushSch "xschem move_objects" "Push schematic"
|
||||
.menubar.edit.menu add command -label "Push symbol" -command "xschem descend_symbol" -accelerator I
|
||||
|
|
|
|||
Loading…
Reference in New Issue