diff --git a/pd/nw/css/default.css b/pd/nw/css/default.css index d9d226b39710efd7f8de53c0ac0b2ea757ab1c76..2d6bb56838f0a217b7b183946d07324b88cbaf42 100644 --- a/pd/nw/css/default.css +++ b/pd/nw/css/default.css @@ -472,22 +472,12 @@ text { for every pixel we move inside an xlet. */ @-webkit-keyframes fizzle { 0% { - stroke-width: 1; - stroke-opacity: 1; - rx: 1; - ry: 1; - } - 33% { stroke-width: 12; stroke-opacity: 1; - rx: 1; - ry: 1; } - 66% { + 100% { stroke-width: 5; stroke-opacity: 1; - rx: 1; - ry: 1; } } @@ -496,7 +486,12 @@ text { stroke: #e87216; fill: #e87216; stroke-width: 5; - -webkit-animation: fizzle 0.4s ease-in 1; + -webkit-animation: fizzle 0.2s ease-in 1; +} + +.xlet_disabled { + stroke: gray !important; + fill: gray !important; } #canvas_find { diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index abc40f948994e87627418a4cf4b1c949a3a09133..9163fee7a169b4e815889792fcf3713e98d347cb 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -2225,12 +2225,17 @@ function gui_gobj_configure_io(cid, tag, is_iemgui, is_signal, width) { } e.classList.add(type); e.classList.remove("xlet_selected"); + e.classList.remove("xlet_disabled"); }); } -function gui_gobj_highlight_io(cid, tag) { +function gui_gobj_highlight_io(cid, tag, enabled) { gui(cid).get_elem(tag, function(e) { e.classList.add("xlet_selected"); + if (enabled == 0) + { + e.classList.add("xlet_disabled"); + } }); } diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c index cc98c265ebed858a603eaead924e56a07925b445..2e980bb254644ccbf0386d158ed81c406d9584b4 100644 --- a/pd/src/g_editor.c +++ b/pd/src/g_editor.c @@ -150,6 +150,7 @@ static void tooltip_erase (t_canvas *x) { } } +// removes highlight from an nlet static void canvas_nlet_conf (t_canvas *x, int type) { int isiemgui = type=='o' ? last_outlet_filter : last_inlet_filter; int issignal = type=='o' ? outlet_issignal : inlet_issignal; @@ -3389,14 +3390,19 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, x->gl_ymargin + x->gl_pixheight, &default_type); } + // if we have located an object under the mouse if (y) { + + // if we are right-clicking if (rightclick) canvas_rightclick(x, xpos, ypos, y); + // if we are holding shift and we are not above an outlet else if (shiftmod && x->gl_editor->canvas_cnct_outlet_tag[0] == 0) { - //selection (only if we are not hovering above an outlet) + // we are clicking and making a (de)selection + // (only if we are not hovering above an outlet) if (doit) { if (glist_isselected(x, y)) @@ -3406,7 +3412,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, } else { - /* look for an outlet we just clicked onto */ + /* look for other stuff */ int noutlet; int ninlet; /* resize? only for "true" text boxes, canvases, iemguis, @@ -3419,10 +3425,14 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, we have a virtual waterfall of conditionals flowing all the way to the GUI just handle resizing a stupid rectangle. */ + + // if we are inside a resizing hotspot of a text object... if (in_text_resizing_hotspot) { + // ...and we are clicking... if (doit) { + // ...select the object if (!glist_isselected(x, y) || x->gl_editor->e_selection->sel_next) { @@ -3473,20 +3483,20 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, (t_float)xpos, (t_float)ypos); } } + // we are in the resize hotspot but are not clicking yet else { canvas_setcursor(x, in_text_resizing_hotspot); canvas_check_nlet_highlights(x); } } - /* look for an outlet - if object is valid, has outlets, - and we are within the bottom area of an object - ico@vt.edu: 2020-06-05 added expanded hotspot for - nlets for easier pinpointing - */ - else if (ob && (noutlet = obj_noutlets(ob)) && - ypos >= y2-4-(x->gl_editor->canvas_cnct_inlet_tag[0] != 0 ? 2 : 0)) + /* look for an outlet + if object is valid, has outlets, + and we are within the bottom area of an object + ico@vt.edu: 2020-06-05 added expanded hotspot for + nlets for easier pinpointing + */ + else if (ob && (noutlet = obj_noutlets(ob)) && ypos >= y2-6) { int width = x2 - x1; int nout1 = (noutlet > 1 ? noutlet - 1 : 1); @@ -3496,52 +3506,67 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, // if we are within the boundaries of an nlet /* ico@vt.edu: account for enlarged nlet when already highlighted to make it easier to "hit" the nlet */ - int enlarged = 0; - if (x->gl_editor->canvas_cnct_inlet_tag[0] == closest) - enlarged = 5; + //int enlarged = 0; + //if (closest == last_outlet) + // enlarged = 5; + //post("xpos=%d closest=%d noutlet=%d \ + nout1=%d hotspot=%d IOWIDTH=%d enlarged=%d", + // xpos, closest, noutlet, nout1, hotspot, IOWIDTH, enlarged); + // if have found an outlet and are within its range... if (closest < noutlet && - xpos >= (hotspot-1-enlarged) && xpos <= hotspot + (IOWIDTH+1+enlarged)) + xpos >= (hotspot-6) && xpos <= (hotspot+IOWIDTH+6)) { + //post("Outlet found..."); + //...and we are clicking on it if (doit) { //fprintf(stderr,"start connection\n"); int issignal = obj_issignaloutlet(ob, closest); x->gl_editor->e_onmotion = MA_CONNECT; - x->gl_editor->e_xwas = xpos; - x->gl_editor->e_ywas = ypos; + x->gl_editor->e_xwas = hotspot + IOWIDTH / 2; + x->gl_editor->e_ywas = y2 - 2; /* This repetition of args needs to be pruned below */ gui_vmess("gui_canvas_line", "xssiiiiiiiiii", x, "newcord", (issignal ? "signal" : "control"), - xpos, - ypos, - xpos, - ypos, - xpos, - ypos, - xpos, - ypos, - xpos, - ypos); + hotspot + IOWIDTH / 2, + y2 - 2, + hotspot + IOWIDTH / 2, + y2 - 2, + hotspot + IOWIDTH / 2, + y2 - 2, + hotspot + IOWIDTH / 2, + y2 - 2, + hotspot + IOWIDTH / 2, + y2 - 2, + 1); } else - // jsarlo + // jsarlo (...or, we are *not* clicking on it) { t_rtext *yr = glist_findrtext(x, (t_text *)&ob->ob_g); + // I guess this removes highlight from an outlet, but why? + // Perhaps just to make sure in case we were just hitting on + // another nlet in a previous update? if (x->gl_editor->canvas_cnct_outlet_tag[0] != 0) canvas_nlet_conf(x,'o'); + + // if we have found an object's rtext which we + // will use to tag the highlighted nlet accordingly if (yr) { last_outlet_filter = gobj_filter_highlight_behavior( (t_text *)&ob->ob_g); + // fill the outlet_tag name with hte detected outlet sprintf(x->gl_editor->canvas_cnct_outlet_tag, "%so%d", rtext_gettag(yr), closest); - gui_vmess("gui_gobj_highlight_io", "xs", + gui_vmess("gui_gobj_highlight_io", "xsi", x, - x->gl_editor->canvas_cnct_outlet_tag); + x->gl_editor->canvas_cnct_outlet_tag, + 1); /* Might need a gui_vmess call here, but I haven't seen where this code is called yet... */ @@ -3556,7 +3581,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, x->gl_editor->canvas_cnct_outlet_tag); } } - // jsarlo + // jsarlo (get rid of the cord inspector here since we are + // not on a cord) if(x->gl_editor && x->gl_editor->gl_magic_glass) { magicGlass_unbind(x->gl_editor->gl_magic_glass); @@ -3567,20 +3593,23 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, } // end jsarlo } + // otherwise we are not hitting any outlet and are making sure + // the previously highlighted outlets are not anymore highlighted else { + //post("Comb the Desert!"); canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); canvas_check_nlet_highlights(x); if (doit) goto nooutletafterall; } } - /* look for an inlet (these are colored differently - since they are not connectable) - ico@vt.edu: 2020-06-05 added expanded hotspot for - nlets for easier pinpointing - */ + /* look for an inlet (these are colored differently + since they are not connectable) + ico@vt.edu: 2020-06-05 added expanded hotspot for + nlets for easier pinpointing + */ else if (ob && (ninlet = obj_ninlets(ob)) - && ypos <= y1+4+(x->gl_editor->canvas_cnct_inlet_tag[0] != 0 ? 2 : 0)) + && ypos <= y1+6) { canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); int width = x2 - x1; @@ -3590,11 +3619,9 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, (width - IOWIDTH) * closest / (nin1); /* ico@vt.edu: account for enlarged nlet when already highlighted to make it easier to "hit" the nlet */ - int enlarged = 0; - if (x->gl_editor->canvas_cnct_inlet_tag[0] == closest) - enlarged = 5; + // if have found an inlet and are within its range... if (closest < ninlet && - xpos >= (hotspot-1-enlarged) && xpos <= hotspot + (IOWIDTH+1+enlarged)) + xpos >= (hotspot-6) && xpos <= (hotspot+IOWIDTH+6)) { t_rtext *yr = glist_findrtext(x, (t_text *)&ob->ob_g); @@ -3607,9 +3634,10 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, gobj_filter_highlight_behavior((t_text *)&ob->ob_g); sprintf(x->gl_editor->canvas_cnct_inlet_tag, "%si%d", rtext_gettag(yr), closest); - gui_vmess("gui_gobj_highlight_io", "xs", + gui_vmess("gui_gobj_highlight_io", "xsi", x, - x->gl_editor->canvas_cnct_inlet_tag); + x->gl_editor->canvas_cnct_inlet_tag, + 0); inlet_issignal = obj_issignalinlet(ob,closest); if (tooltips) { @@ -3697,6 +3725,8 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which, } // end jsarlo } + // we mark last highlighted object here for nlet highlighting below + //post("Returning from the nlet crusade..."); return; } else if (in_text_resizing_hotspot) /* red gop rectangle */ @@ -4742,15 +4772,18 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit) "%si%d", rtext_gettag(y), closest2); - gui_vmess("gui_gobj_highlight_io", "xs", + inlet_issignal = obj_issignalinlet(ob2, closest2); + //post("o-sig=%d i-sig=%d", outlet_issignal, inlet_issignal); + gui_vmess("gui_gobj_highlight_io", "xsi", x, - x->gl_editor->canvas_cnct_inlet_tag); + x->gl_editor->canvas_cnct_inlet_tag, + (!outlet_issignal || + (outlet_issignal && inlet_issignal)) ? 1 : 0); /* Didn't I just see this code above? */ //sys_vgui(".x%x.c raise %s\n", // x, // x->gl_editor->canvas_cnct_inlet_tag); - inlet_issignal = obj_issignalinlet(ob2, closest2); if (tooltips) { objtooltip = 1;