From fc2e01f1db5308a6dddd07ae7dfbf949f1fbfb9b Mon Sep 17 00:00:00 2001 From: Ivica Ico Bukvic <ico@vt.edu> Date: Thu, 23 May 2013 13:53:20 -0400 Subject: [PATCH] improved nlet highlighting (integrated it into glist), fixed bug with multiselect with mixed objects (accelerated and legacy) --- pd/src/g_canvas.c | 6 ++ pd/src/g_canvas.h | 4 ++ pd/src/g_editor.c | 178 +++++++++++++++++++++++++++++----------------- 3 files changed, 123 insertions(+), 65 deletions(-) diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index 1e4105ba5..be75e4673 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -461,6 +461,9 @@ t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv) x->move_offset_y = 0; x->move_vis = 0; + x->canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_outlet_tag[0] = 0; + x->u_queue = canvas_undo_init(x); return(x); @@ -680,6 +683,8 @@ void canvas_dirty(t_canvas *x, t_floatarg n) } } +extern void canvas_check_nlet_highlights(t_canvas *x); + /*********** dpsaha@vt.edu resize move hooks ****************/ void canvas_draw_gop_resize_hooks(t_canvas* x) { @@ -732,6 +737,7 @@ void canvas_draw_gop_resize_hooks(t_canvas* x) sys_vgui("destroy %s\n", mh->h_pathname); sys_vgui(".x%lx.c delete GOP_resblob ; .x%lx.c delete GOP_movblob ;\n", x, x); //delete the GOP_resblob and GOP_movblob } + canvas_check_nlet_highlights(x); } /*****************************************************************************/ diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h index 345b7a184..59eb0d5be 100644 --- a/pd/src/g_canvas.h +++ b/pd/src/g_canvas.h @@ -222,6 +222,10 @@ struct _glist //global preset array pointer t_preset_hub *gl_phub; + + //tags for currently highlighted nlets + char canvas_cnct_inlet_tag[4096]; + char canvas_cnct_outlet_tag[4096]; }; #define gl_gobj gl_obj.te_g diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index 776b7f13e..ad9381bb0 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -45,8 +45,6 @@ static void canvas_doarrange(t_canvas *x, t_float which, t_gobj *oldy, t_gobj *o static void canvas_paste_xyoffset(t_canvas *x); void canvas_setgraph(t_glist *x, int flag, int nogoprect); void canvas_mouseup(t_canvas *x, t_floatarg fxpos, t_floatarg fypos, t_floatarg fwhich); -static char canvas_cnct_inlet_tag[4096]; -static char canvas_cnct_outlet_tag[4096]; static int outlet_issignal = 0; static int inlet_issignal = 0; static int last_inlet_filter = 0; @@ -230,6 +228,43 @@ int gobj_click(t_gobj *x, struct _glist *glist, /* ------------------------ managing the selection ----------------- */ +void canvas_check_nlet_highlights(t_glist *x) +{ + if (x->canvas_cnct_inlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", + x, x->canvas_cnct_inlet_tag, + (last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")), + (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); + if (objtooltip) { + objtooltip = 0; + sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); + } + x->canvas_cnct_inlet_tag[0] = 0; + //if (x->gl_editor->e_onmotion == MA_CONNECT) { + x->gl_editor->e_onmotion = MA_NONE; + canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); + //} + } + + if (x->canvas_cnct_outlet_tag[0] != 0 && x->gl_editor->e_onmotion != MA_CONNECT) + { + sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", + x, x->canvas_cnct_outlet_tag, + (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), + (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); + if (objtooltip) { + objtooltip = 0; + sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); + } + x->canvas_cnct_outlet_tag[0] = 0; + //if (x->gl_editor->e_onmotion == MA_CONNECT) { + x->gl_editor->e_onmotion = MA_NONE; + canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); + //} + } +} + void glist_selectline(t_glist *x, t_outconnect *oc, int index1, int outno, int index2, int inno) { @@ -1871,6 +1906,7 @@ static char *cursorlist[] = { void canvas_setcursor(t_canvas *x, unsigned int cursornum) { + //fprintf(stderr,"canvas_setcursor %d\n", cursornum); static t_canvas *xwas; static unsigned int cursorwas; if (cursornum >= sizeof(cursorlist)/sizeof *cursorlist) @@ -2661,9 +2697,9 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, ob = pd_checkobject(&y->g_pd); if (rightclick) canvas_rightclick(x, xpos, ypos, y); - else if (shiftmod && canvas_cnct_outlet_tag[0] == 0) + else if (shiftmod && x->canvas_cnct_outlet_tag[0] == 0) { - //selection (only if we are not hovering above an nlet) + //selection (only if we are not hovering above an outlet) if (doit) { t_rtext *rt; @@ -2694,6 +2730,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, /* look for an outlet we just clicked onto */ int noutlet; int ninlet; + // if object is valid, has outlets, and we are within the bottom area of an object if (ob && (noutlet = obj_noutlets(ob)) && ypos >= y2-4) { int width = x2 - x1; @@ -2701,6 +2738,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, int closest = ((xpos-x1) * (nout1) + width/2)/width; int hotspot = x1 + (width - IOWIDTH) * closest / (nout1); + // if we are within the boundaries of an nlet if (closest < noutlet && xpos >= (hotspot-1) && xpos <= hotspot + (IOWIDTH+1)) { @@ -2722,31 +2760,31 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, { t_rtext *yr = glist_findrtext(x, (t_text *)&ob->ob_g); - if (canvas_cnct_outlet_tag[0] != 0) + if (x->canvas_cnct_outlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_outlet_tag, + x, x->canvas_cnct_outlet_tag, (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); } if (yr) { last_outlet_filter = gobj_filter_highlight_behavior(yr); - sprintf(canvas_cnct_outlet_tag, + sprintf(x->canvas_cnct_outlet_tag, "%so%d", rtext_gettag(yr), closest); sys_vgui(".x%x.c itemconfigure %s -outline $select_nlet_color -width $highlight_width\n", x, - canvas_cnct_outlet_tag); + x->canvas_cnct_outlet_tag); //sys_vgui(".x%x.c raise %s\n", // x, - // canvas_cnct_outlet_tag); + // x->canvas_cnct_outlet_tag); outlet_issignal = obj_issignaloutlet(ob,closest); if (tooltips) { objtooltip = 1; - sys_vgui("pdtk_canvas_enteritem .x%x.c %d %d %s -1\n;", x, xpos, ypos, canvas_cnct_outlet_tag); + sys_vgui("pdtk_canvas_enteritem .x%x.c %d %d %s -1\n;", x, xpos, ypos, x->canvas_cnct_outlet_tag); } } // jsarlo @@ -2759,8 +2797,11 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, } // end jsarlo } - else if (doit) - goto nooutletafterall; + else { + canvas_check_nlet_highlights(x); + if (doit) + goto nooutletafterall; + } } /* look for an inlet (these are colored differently since they are not connectable) */ else if (ob && (ninlet = obj_ninlets(ob)) && ypos <= y1+4) @@ -2775,10 +2816,10 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, { t_rtext *yr = glist_findrtext(x, (t_text *)&ob->ob_g); - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); } @@ -2786,23 +2827,28 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, if (yr) { last_inlet_filter = gobj_filter_highlight_behavior(yr); - sprintf(canvas_cnct_inlet_tag, + sprintf(x->canvas_cnct_inlet_tag, "%si%d", rtext_gettag(yr), closest); sys_vgui(".x%x.c itemconfigure %s -width $highlight_width\n", x, - canvas_cnct_inlet_tag); + x->canvas_cnct_inlet_tag); //sys_vgui(".x%x.c raise %s\n", // x, - // canvas_cnct_inlet_tag); + // x->canvas_cnct_inlet_tag); inlet_issignal = obj_issignalinlet(ob,closest); if (tooltips) { objtooltip = 1; - sys_vgui("pdtk_canvas_enteritem .x%x.c %d %d %s -1\n;", x, xpos, ypos, canvas_cnct_inlet_tag); + sys_vgui("pdtk_canvas_enteritem .x%x.c %d %d %s -1\n;", x, xpos, ypos, x->canvas_cnct_inlet_tag); } } + } else { + if (x->gl_editor->e_onmotion != MA_CONNECT) + canvas_check_nlet_highlights(x); + if (doit) + goto nooutletafterall; } } /* not in an outlet; select and move */ @@ -2833,7 +2879,9 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, //buf->u_redo = (t_undo_sel *)canvas_undo_set_selection(x); //canvas_undo_add(x, 11, "selection", buf); - } + } else { + canvas_check_nlet_highlights(x); + } //toggle_moving = 1; //sys_vgui("pdtk_update_xy_tooltip .x%lx %d %d\n", x, (int)xpos, (int)ypos); //sys_vgui("pdtk_toggle_xy_tooltip .x%lx %d\n", x, 1); @@ -2845,30 +2893,30 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, else // jsarlo { - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_inlet_tag[0] = 0; } - if (canvas_cnct_outlet_tag[0] != 0) + if (x->canvas_cnct_outlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_outlet_tag, + x, x->canvas_cnct_outlet_tag, (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_outlet_tag[0] = 0; + x->canvas_cnct_outlet_tag[0] = 0; } if(x->gl_magic_glass) { @@ -2950,29 +2998,29 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, magicGlass_moveText(x->gl_magic_glass, xpos, ypos); if (magicGlass_isOn(x->gl_magic_glass)) magicGlass_show(x->gl_magic_glass); - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_inlet_tag[0] = 0; } - if (canvas_cnct_outlet_tag[0] != 0) + if (x->canvas_cnct_outlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_outlet_tag, + x, x->canvas_cnct_outlet_tag, (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_outlet_tag[0] = 0; + x->canvas_cnct_outlet_tag[0] = 0; } // end jsarlo canvas_setcursor(x, CURSOR_EDITMODE_DISCONNECT); @@ -2980,30 +3028,30 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, } } } - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (inlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_inlet_tag[0] = 0; } // jsarlo - if (canvas_cnct_outlet_tag[0] != 0) + if (x->canvas_cnct_outlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_outlet_tag, + x, x->canvas_cnct_outlet_tag, (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_outlet_tag[0] = 0; + x->canvas_cnct_outlet_tag[0] = 0; } if(x->gl_magic_glass) { magicGlass_unbind(x->gl_magic_glass); @@ -3179,29 +3227,29 @@ int canvas_doconnect_doit(t_canvas *x, t_gobj *y1, t_gobj *y2, int closest1, int (issignal ? "$signal_cord" : "$msg_cord"), (issignal ? "$signal_cord_width" : "$msg_cord_width"), oc); - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (obj_issignaloutlet(ob1, closest1) ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_inlet_tag[0] = 0; } - if (canvas_cnct_outlet_tag[0] != 0) + if (x->canvas_cnct_outlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_outlet_tag, + x, x->canvas_cnct_outlet_tag, (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_outlet_tag[0] = 0; + x->canvas_cnct_outlet_tag[0] = 0; } // end jsarlo canvas_dirty(x, 1); @@ -3662,31 +3710,31 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit) // jsarlo { t_rtext *y = glist_findrtext(x, (t_text *)&ob2->ob_g); - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); } if (y) { last_inlet_filter = gobj_filter_highlight_behavior(y); - sprintf(canvas_cnct_inlet_tag, + sprintf(x->canvas_cnct_inlet_tag, "%si%d", rtext_gettag(y), closest2); sys_vgui(".x%x.c itemconfigure %s -outline $select_nlet_color -width $highlight_width\n", x, - canvas_cnct_inlet_tag); + x->canvas_cnct_inlet_tag); //sys_vgui(".x%x.c raise %s\n", // x, - // canvas_cnct_inlet_tag); + // x->canvas_cnct_inlet_tag); inlet_issignal = obj_issignalinlet(ob2, closest2); if (tooltips) { objtooltip = 1; sys_vgui("pdtk_canvas_enteritem .x%x.c %d %d %s -1;\n", - x, xpos, ypos, canvas_cnct_inlet_tag); + x, xpos, ypos, x->canvas_cnct_inlet_tag); } } canvas_setcursor(x, CURSOR_EDITMODE_CONNECT); @@ -3696,17 +3744,17 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit) } } // jsarlo - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); if (objtooltip) { objtooltip = 0; sys_vgui("pdtk_canvas_leaveitem .x%x.c;\n", x); } - canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_inlet_tag[0] = 0; } if(x->gl_magic_glass) { magicGlass_unbind(x->gl_magic_glass); @@ -3875,20 +3923,20 @@ void canvas_mouseup(t_canvas *x, sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x); } - if (canvas_cnct_outlet_tag[0] != 0) + if (x->canvas_cnct_outlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_outlet_tag, + x, x->canvas_cnct_outlet_tag, (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); } - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); - canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_inlet_tag[0] = 0; } if (!x->gl_editor->e_onmotion == MA_CONNECT || !glob_shift) @@ -3929,10 +3977,10 @@ static void canvas_displaceselection(t_canvas *x, int dx, int dy) else if (cl == voutlet_class) resortout = 1; } if (dx || dy) { - if (!old_displace) { + //if (!old_displace) { //fprintf(stderr,"move selected\n"); sys_vgui(".x%lx.c move selected %d %d\n", x, dx, dy); - } + //} if (resortin) canvas_resortinlets(x); if (resortout) canvas_resortoutlets(x); //sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x); @@ -5842,21 +5890,21 @@ void canvas_editmode(t_canvas *x, t_floatarg fyesplease) if (glist_isvisible(x) && glist_istoplevel(x)) { // jsarlo - if (canvas_cnct_inlet_tag[0] != 0) + if (x->canvas_cnct_inlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_inlet_tag, + x, x->canvas_cnct_inlet_tag, (last_inlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (inlet_issignal ? "$signal_nlet" : "$msg_nlet")); - canvas_cnct_inlet_tag[0] = 0; + x->canvas_cnct_inlet_tag[0] = 0; } - if (canvas_cnct_outlet_tag[0] != 0) + if (x->canvas_cnct_outlet_tag[0] != 0) { sys_vgui(".x%x.c itemconfigure %s -outline %s -fill %s -width 1\n", - x, canvas_cnct_outlet_tag, + x, x->canvas_cnct_outlet_tag, (last_outlet_filter ? "black" : (outlet_issignal ? "$signal_cord" : "$msg_cord")), (outlet_issignal ? "$signal_nlet" : "$msg_nlet")); - canvas_cnct_outlet_tag[0] = 0; + x->canvas_cnct_outlet_tag[0] = 0; } if(x->gl_magic_glass) { magicGlass_unbind(x->gl_magic_glass); -- GitLab