Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28493
Modified Files: Tag: impd_0_37 g_canvas.c g_editor.c u_main.tk Log Message: wire creation outsourced to Tcl
Index: g_editor.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/g_editor.c,v retrieving revision 1.1.1.4.2.3.2.13 retrieving revision 1.1.1.4.2.3.2.14 diff -C2 -d -r1.1.1.4.2.3.2.13 -r1.1.1.4.2.3.2.14 *** g_editor.c 17 Apr 2004 04:04:23 -0000 1.1.1.4.2.3.2.13 --- g_editor.c 17 Apr 2004 06:04:01 -0000 1.1.1.4.2.3.2.14 *************** *** 18,21 **** --- 18,33 ---- char* inlet_tip(t_inlet* i,int num);
+ void post_atoms(const char *s, int ac, t_atom *av) { + char buf[1024]; + int n=0; + int i; + n+=sprintf(buf,"%s: ",s); + for (i=0; i<ac; i++) { + atom_string(av+i,buf+n,sizeof(buf)-1-n); + sprintf(buf+n,", "); + } + post("%s",buf); + } + /* ------------------ forward declarations --------------- */ static void canvas_doclear(t_canvas *x); *************** *** 978,982 **** return; } ! sys_vgui(".x%x.c delete x\n",x);
/* if not a runmode left click, fall here. */ --- 990,994 ---- return; } ! /* sys_vgui(".x%x.c delete x\n",x);*/
/* if not a runmode left click, fall here. */ *************** *** 1015,1019 **** if (ob && (noutlet = obj_noutlets(ob)) && ypos >= y2-4) { ! int width = x2-x1; int nout1 = noutlet>1 ? noutlet-1 : 1; int closest = ((xpos-x1) * nout1 + width/2)/width; --- 1027,1031 ---- if (ob && (noutlet = obj_noutlets(ob)) && ypos >= y2-4) { ! /* int width = x2-x1; int nout1 = noutlet>1 ? noutlet-1 : 1; int closest = ((xpos-x1) * nout1 + width/2)/width; *************** *** 1030,1034 **** } else if (doit) goto nooutletafterall; ! } /* look for an inlet */ --- 1042,1046 ---- } else if (doit) goto nooutletafterall; ! */ } /* look for an inlet */ *************** *** 1108,1180 **** }
! void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit) ! { ! int x11, y11, x12, y12; t_gobj *y1; ! int x21, y21, x22, y22; t_gobj *y2; ! int xwas = x->gl_editor->e_xwas, ! ywas = x->gl_editor->e_ywas; ! y1 = canvas_findhitbox(x, xwas, ywas, &x11, &y11, &x12, &y12); ! y2 = canvas_findhitbox(x, xpos, ypos, &x21, &y21, &x22, &y22); ! if (y1&&y2) { ! t_object *ob1 = pd_checkobject(&y1->g_pd); ! t_object *ob2 = pd_checkobject(&y2->g_pd); ! int noutlet1, ninlet2; ! if (ob1 && ob2 && ob1 != ob2 ! && (noutlet1 = obj_noutlets(ob1)) ! && (ninlet2 = obj_ninlets(ob2))) ! { ! int width1 = x12-x11, closest1, hotspot1; ! int width2 = x22-x21, closest2, hotspot2; ! t_outconnect *oc; ! ! if (noutlet1 > 1) ! { ! closest1 = ((xwas-x11) * (noutlet1-1) + width1/2)/width1; ! hotspot1 = x11 + (width1 - IOWIDTH) * closest1 / (noutlet1-1); ! } ! else closest1 = 0, hotspot1 = x11; ! ! if (ninlet2 > 1) ! { ! closest2 = ((xpos-x21) * (ninlet2-1) + width2/2)/width2; ! hotspot2 = x21 + (width2 - IOWIDTH) * closest2 / (ninlet2-1); ! } ! else closest2 = 0, hotspot2 = x21; ! ! if (closest1 >= noutlet1) closest1 = noutlet1-1; ! if (closest2 >= ninlet2) closest2 = ninlet2-1; ! ! if (canvas_isconnected (x, ob1, closest1, ob2, closest2)) ! { ! canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); ! return; ! } ! if (obj_issignaloutlet(ob1, closest1) && ! !obj_issignalinlet(ob2, closest2)) ! { ! if (doit) error("can't connect signal outlet to control inlet"); ! canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); ! return; ! } ! if (doit) ! { ! oc = obj_connect(ob1, closest1, ob2, closest2); ! sys_vgui("wire_update l%x {%x %d %x %d %d}\n", oc, y1, closest1, y2, closest2, ! obj_issignaloutlet(ob1, closest1)); sys_vgui("wire_draw2 l%x .x%x.c\n", oc, glist_getcanvas(x)); canvas_setundo(x, canvas_undo_connect, canvas_undo_set_connect(x, ! canvas_getindex(x, &ob1->ob_g), closest1, ! canvas_getindex(x, &ob2->ob_g), closest2), "connect"); ! } ! else { ! canvas_setcursor(x, CURSOR_EDITMODE_CONNECT); ! canvas_inlettip(x,ob2,closest2,xpos,ypos); ! } ! return; ! } ! } ! canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); }
--- 1120,1145 ---- }
! void canvas_add_wire(t_canvas *x, t_symbol *s, int ac, t_atom *av) { ! if (ac==4 && av[0].a_type == A_SYMBOL && av[1].a_type == A_FLOAT ! && av[2].a_type == A_SYMBOL && av[3].a_type == A_FLOAT) { ! t_object *obj1, *obj2; ! int port1, port2; ! t_symbol *obj1s, *obj2s; ! t_outconnect *oc; ! obj1s = atom_getsymbol(av+0); sscanf(obj1s->s_name,"%x",&obj1); port1 = atom_getint(av+1); ! obj2s = atom_getsymbol(av+2); sscanf(obj2s->s_name,"%x",&obj2); port2 = atom_getint(av+3); ! /* post("canvas_add_wire: .x%x.c %x %d %x %d",x,obj1,port1,obj2,port2); */ ! oc = obj_connect(obj1, port1, obj2, port2); ! sys_vgui("wire_update l%x {%x %d %x %d %d}\n", oc, obj1,port1,obj2,port2, ! obj_issignaloutlet(obj1,port1)); sys_vgui("wire_draw2 l%x .x%x.c\n", oc, glist_getcanvas(x)); canvas_setundo(x, canvas_undo_connect, canvas_undo_set_connect(x, ! canvas_getindex(x, &obj1->ob_g), port1, ! canvas_getindex(x, &obj2->ob_g), port2), "connect"); ! } else { ! post("BORK"); ! } }
*************** *** 1205,1209 **** else hiy = e->e_ywas, loy = ypos; canvas_selectinrect(x, lox, loy, hix, hiy); ! sys_vgui(".x%x.c delete x\n", x); e->e_onmotion = 0; } --- 1170,1174 ---- else hiy = e->e_ywas, loy = ypos; canvas_selectinrect(x, lox, loy, hix, hiy); ! /* sys_vgui(".x%x.c delete x\n", x);*/ e->e_onmotion = 0; } *************** *** 1224,1230 **** #endif
! if (x->gl_editor->e_onmotion == MA_CONNECT) canvas_doconnect(x, xpos, ypos, which, 1); ! else if (x->gl_editor->e_onmotion == MA_REGION) canvas_doregion(x, xpos, ypos, 1); else if (x->gl_editor->e_onmotion == MA_MOVE) --- 1189,1195 ---- #endif
! /* if (x->gl_editor->e_onmotion == MA_CONNECT) canvas_doconnect(x, xpos, ypos, which, 1); ! else */ if (x->gl_editor->e_onmotion == MA_REGION) canvas_doregion(x, xpos, ypos, 1); else if (x->gl_editor->e_onmotion == MA_MOVE) *************** *** 1378,1384 **** else if (x->gl_editor->e_onmotion == MA_REGION) canvas_doregion(x, xpos, ypos, 0); ! else if (x->gl_editor->e_onmotion == MA_CONNECT) canvas_doconnect(x, xpos, ypos, 0, 0); ! else if (x->gl_editor->e_onmotion == MA_PASSOUT) { if (!x->gl_editor->e_motionfn) --- 1343,1349 ---- else if (x->gl_editor->e_onmotion == MA_REGION) canvas_doregion(x, xpos, ypos, 0); ! else /* if (x->gl_editor->e_onmotion == MA_CONNECT) canvas_doconnect(x, xpos, ypos, 0, 0); ! else */ if (x->gl_editor->e_onmotion == MA_PASSOUT) { if (!x->gl_editor->e_motionfn) *************** *** 2037,2040 **** --- 2002,2006 ---- class_addmethod(c, (t_method)canvas_key, gensym("key"), A_GIMME, A_NULL); class_addmethod(c, (t_method)canvas_motion, gensym("motion"), A_FLOAT, A_FLOAT, A_FLOAT, A_NULL); + class_addmethod(c, (t_method)canvas_add_wire, gensym("add-wire"), A_GIMME, A_NULL); /* ------------------------ menu actions ---------------------------- */ class_addmethod(c, (t_method)canvas_menuclose, gensym("menuclose"), A_DEFFLOAT, 0);
Index: u_main.tk =================================================================== RCS file: /cvsroot/pure-data/pd/src/u_main.tk,v retrieving revision 1.1.1.4.2.7.4.41 retrieving revision 1.1.1.4.2.7.4.42 diff -C2 -d -r1.1.1.4.2.7.4.41 -r1.1.1.4.2.7.4.42 *** u_main.tk 17 Apr 2004 04:04:23 -0000 1.1.1.4.2.7.4.41 --- u_main.tk 17 Apr 2004 06:04:01 -0000 1.1.1.4.2.7.4.42 *************** *** 820,824 ****
proc pdtk_canvas_click {canvas x y b f} { ! global _ set self [canvastosym $canvas] set cx [$canvas canvasx $x] --- 820,824 ----
proc pdtk_canvas_click {canvas x y b f} { ! global _ wire_from set self [canvastosym $canvas] set cx [$canvas canvasx $x] *************** *** 831,834 **** --- 831,835 ---- pd "$self click-on-object $id $cx $cy $b $f;" if {$edit && [llength [$canvas bbox ${id}BASE]]} { + set wire_from [list $cx $cy] foreach {x1 y1 x2 y2} [$canvas bbox ${id}BASE] {} if {abs($y2-3-$cy)<=3} { *************** *** 840,843 **** --- 841,845 ---- wire_draw lnew $canvas 1 $cx $cy $cx $cy $canvas itemconfigure lnew -dash "4 4 4 4" + set wire_from [list $id $out] } } *************** *** 850,856 ****
set dehighlight {}
proc pdtk_canvas_motion {canvas x y mods} { ! global current_x current_y tooltip _ dehighlight look set self [canvastosym $canvas] set cx [$canvas canvasx $x] --- 852,859 ----
set dehighlight {} + set wire_from {}
proc pdtk_canvas_motion {canvas x y mods} { ! global current_x current_y tooltip _ dehighlight look wire_from wire_to set self [canvastosym $canvas] set cx [$canvas canvasx $x] *************** *** 872,887 **** object { if {$edit && [llength [$canvas bbox ${id}BASE]]} { foreach {x1 y1 x2 y2} [$canvas bbox ${id}BASE] {} - #post "id=$id cx=$cx cy=$cy x1=$x1 y1=$y1 x2=$x2 y2=$y2" if {abs($y2-3-$cy)<=3} { ! set outs 0 ! catch {set outs $_($id:outlets)} ! if {$outs==0} return ! set out [expr int(($cx-$x1)*$outs/($x2-$x1))] $canvas create rectangle \ ! [l+ [$canvas coords ${id}o${out}] {-4 -4 +4 +4}] \ ! -outline $look(outletfg) -width 1 -tags ${id}o${out}b ! set dehighlight "$canvas delete ${id}o${out}b" } } { #post "BASEless object?" --- 875,906 ---- object { if {$edit && [llength [$canvas bbox ${id}BASE]]} { + if {[llength $wire_from]} { + # may highlight an inlet + foreach {x1 y1 x2 y2} [$canvas bbox ${id}BASE] {} + if {abs($y1+3-$cy)<=3} { + set ports 0 + catch {set ports $_($id:inlets)} + if {$ports==0} return + set port [expr int(($cx-$x1)*$ports/($x2-$x1))] + $canvas create rectangle \ + [l+ [$canvas coords ${id}i${port}] {-4 -4 +4 +4}] \ + -outline $look(outletfg) -width 1 -tags ${id}i${port}b + set dehighlight "$canvas delete ${id}i${port}b; set wire_to {}" + set wire_to [list $id $port] + } + } { + # may highlight an outlet foreach {x1 y1 x2 y2} [$canvas bbox ${id}BASE] {} if {abs($y2-3-$cy)<=3} { ! set ports 0 ! catch {set ports $_($id:outlets)} ! if {$ports==0} return ! set port [expr int(($cx-$x1)*$ports/($x2-$x1))] $canvas create rectangle \ ! [l+ [$canvas coords ${id}o${port}] {-4 -4 +4 +4}] \ ! -outline $look(outletfg) -width 1 -tags ${id}o${port}b ! set dehighlight "$canvas delete ${id}o${port}b" } + } } { #post "BASEless object?" *************** *** 903,923 **** }
- #proc pdtk_start_wire {canvas x y b f} { - # if (ob && (noutlet = obj_noutlets(ob)) && ypos >= y2-4) {} {return} - # width = x2-x1 - # nout1 = noutlet>1 ? noutlet-1 : 1 - # closest = ((xpos-x1) * nout1 + width/2)/width - # hotspot = x1 + (width-IOWIDTH)*closest/nout1 - # if (closest < noutlet && xpos >= hotspot-1 && xpos <= hotspot + IOWIDTH+1) { - # if (doit) { - # issignal = obj_issignaloutlet(ob, closest) - # x->gl_editor->e_onmotion = MA_CONNECT - # x->gl_editor->e_xwas = xpos - # x->gl_editor->e_ywas = ypos - # wire_draw x .x%x.c %d %d %d %d %d\n", x, issignal?2:1, xpos, ypos, xpos, ypos - # } {canvas_setcursor(x, CURSOR_EDITMODE_CONNECT)} - # } {if (doit) goto nooutletafterall} - #} - set pdtk_canvas_mouseup(name) 0 set pdtk_canvas_mouseup(xmin) 0 --- 922,925 ---- *************** *** 930,935 **** # how to do it right. proc pdtk_canvas_mouseup {name x y b} { ! global pdtk_canvas_mouseup ! pd "[canvastosym $name] mouseup [$name canvasx $x] [$name canvasy $y] $b ;" set size [$name bbox all] if {$size != ""} { --- 932,942 ---- # how to do it right. proc pdtk_canvas_mouseup {name x y b} { ! global pdtk_canvas_mouseup wire_from wire_to ! set self [canvastosym $name] ! pd "$self mouseup [$name canvasx $x] [$name canvasy $y] $b ;" ! if {[llength $wire_from]} { ! pd "$self add-wire $wire_from $wire_to ;" ! set wire_from {} ! } set size [$name bbox all] if {$size != ""} {
Index: g_canvas.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/g_canvas.c,v retrieving revision 1.1.1.4.2.7.2.11 retrieving revision 1.1.1.4.2.7.2.12 diff -C2 -d -r1.1.1.4.2.7.2.11 -r1.1.1.4.2.7.2.12 *** g_canvas.c 17 Apr 2004 04:04:23 -0000 1.1.1.4.2.7.2.11 --- g_canvas.c 17 Apr 2004 06:04:01 -0000 1.1.1.4.2.7.2.12 *************** *** 281,288 **** --- 281,290 ---- t->tr_nout = obj_noutlets(ob); outno = 0; + #ifndef MATJU1 if (glist_isvisible(t->tr_x)) gobj_getrect(y, t->tr_x, &t->tr_x11, &t->tr_y11, &t->tr_x12, &t->tr_y12); else t->tr_x11 = t->tr_y11 = t->tr_x12 = t->tr_y12 = 0; + #endif /*MATJU1*/ } t->tr_nextoutno = outno + 1; *************** *** 294,297 **** --- 296,300 ---- t->tr_nin = obj_ninlets(t->tr_ob2); if (!t->tr_nin) bug("drawline"); + #ifndef MATJU1 if (glist_isvisible(t->tr_x)) { *************** *** 300,310 **** gobj_getrect(&t->tr_ob2->ob_g, t->tr_x, &t->tr_x21, &t->tr_y21, &t->tr_x22, &t->tr_y22); ! t->tr_lx1 = t->tr_x11 + ! ((t->tr_x12 - t->tr_x11 - IOWIDTH) * t->tr_outno) / ! outplus + IOMIDDLE; t->tr_ly1 = t->tr_y12; ! t->tr_lx2 = t->tr_x21 + ! ((t->tr_x22 - t->tr_x21 - IOWIDTH) * t->tr_inno)/inplus + ! IOMIDDLE; t->tr_ly2 = t->tr_y21; } --- 303,309 ---- gobj_getrect(&t->tr_ob2->ob_g, t->tr_x, &t->tr_x21, &t->tr_y21, &t->tr_x22, &t->tr_y22); ! t->tr_lx1 = t->tr_x11 + ((t->tr_x12 - t->tr_x11 - IOWIDTH) * t->tr_outno)/outplus + IOMIDDLE; t->tr_ly1 = t->tr_y12; ! t->tr_lx2 = t->tr_x21 + ((t->tr_x22 - t->tr_x21 - IOWIDTH) * t->tr_inno)/inplus + IOMIDDLE; t->tr_ly2 = t->tr_y21; } *************** *** 314,318 **** t->tr_lx1 = t->tr_ly1 = t->tr_lx2 = t->tr_ly2 = 0; } ! return (rval); } --- 313,317 ---- t->tr_lx1 = t->tr_ly1 = t->tr_lx2 = t->tr_ly2 = 0; } ! #endif /*MATJU1*/ return (rval); }