Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20929
Modified Files: Tag: desiredata desire.c Log Message: more t_boxes
Index: desire.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/Attic/desire.c,v retrieving revision 1.1.2.217.2.221 retrieving revision 1.1.2.217.2.222 diff -C2 -d -r1.1.2.217.2.221 -r1.1.2.217.2.222 *** desire.c 18 Aug 2007 02:59:39 -0000 1.1.2.217.2.221 --- desire.c 18 Aug 2007 04:16:51 -0000 1.1.2.217.2.222 *************** *** 80,83 **** --- 80,84 ----
struct t_boxes : t_gobj { + typedef std::map<int,t_gobj *> M; typedef std::pair<int,t_gobj *> KV; private: *************** *** 90,101 **** size_t n=0; boxes_each(g,this) n++; ! //post("map size=%d list size=%d",map.size(),n); return n; } ! t_gobj *first() {return list;} t_gobj *last() { t_gobj *r = first(); if (!r) return 0; while (r->next()) r=r->next(); return r; } --- 91,109 ---- size_t n=0; boxes_each(g,this) n++; ! if (map.size()!=n) post("map size=%d list size=%d",map.size(),n); return n; } ! t_gobj *first() { ! if (list && list != map.begin()->second) post("list first=%p map begin=%p",list,map.begin()->second); ! return list; ! } t_gobj *last() { t_gobj *r = first(); if (!r) return 0; while (r->next()) r=r->next(); + M::iterator iter = map.end(); + iter--; + t_gobj *lasse = iter->second; + if (r != lasse) post("list last=%p, map last=%p",r,lasse); return r; } *************** *** 108,114 **** invariant(); } void remove_by_value(t_gobj *x) { ! if (list == x) list = x->next(); ! else boxes_each(g,this) if (g->next() == x) {g->g_next = x->next(); break;} invariant(); } --- 116,129 ---- invariant(); } + void remove(int i) { + map.erase(i); + if (list->dix->index == i) list = list->next(); + else boxes_each(g,this) if (g->next()->dix->index == i) {g->g_next = g->next()->next(); break;} + invariant(); + } void remove_by_value(t_gobj *x) { ! map.erase(x->dix->index); ! if (list == x) list = list->next(); ! else boxes_each(g,this) if (g->next() == x) {g->g_next = g->next()->next(); break;} invariant(); } *************** *** 506,516 **** /* --------------- traversing the set of lines in a canvas ----------- */
- /* get the index of a gobj in a canvas. If y is zero, return the total number of objects. */ - int canvas_getindex(t_canvas *x, t_gobj *y) { - int i=0; - canvas_each(y2,x) {if (y2==y) break; else i++;} - return i; - } - t_linetraverser::t_linetraverser(t_canvas *canvas) {linetraverser_start(this,canvas);}
--- 521,524 ---- *************** *** 1048,1056 **** }
- static t_gobj *canvas_nth(t_canvas *x, int n) { - canvas_each(y,x) if (!n) return y; else n--; - return 0; - } - //#define canvas_each2(CHILD,CANVAS) for(CHILD=&(CANVAS)->list; *CHILD; CHILD=&(*CHILD)->next()) /* just a raw remove, no other business */ --- 1056,1059 ---- *************** *** 1099,1118 **** }
/* recursively check for abstractions to reload as result of a save. Don't reload the one we just saved ("except") though. */ /* LATER try to do the same trick for externs. */ static void canvas_doreload(t_canvas *gl, t_symbol *name, t_symbol *dir, t_gobj *except) { ! int i=0, nobj = canvas_getindex(gl, 0); /* number of objects */ for (t_gobj *g = gl->boxes->first(); g && i < nobj; i++) { if (g != except && g->_class == canvas_class) { t_canvas *c = (t_canvas *)g; if (canvas_isabstraction(c) && c->name==name && canvas_getdir(c) == dir) { ! /* we're going to remake the object, so "g" will go stale. Get its index here, ! and afterward restore g. Also, the replacement will be at the end of the list, ! so we don't do g = g->next() in this case. */ ! int j = canvas_getindex(gl, g); int hadwindow = gl->havewindow; if (!hadwindow) canvas_vis(canvas_getcanvas(gl), 1); ! g = canvas_nth(gl, j); if (!hadwindow) canvas_vis(canvas_getcanvas(gl), 0); continue; --- 1102,1126 ---- }
+ static t_binbuf *canvas_cut_wires(t_canvas *x, t_gobj *o); + static void canvas_paste_wires(t_canvas *x, t_binbuf *buf); + /* recursively check for abstractions to reload as result of a save. Don't reload the one we just saved ("except") though. */ /* LATER try to do the same trick for externs. */ static void canvas_doreload(t_canvas *gl, t_symbol *name, t_symbol *dir, t_gobj *except) { ! int i=0, nobj = gl->boxes->size(); for (t_gobj *g = gl->boxes->first(); g && i < nobj; i++) { if (g != except && g->_class == canvas_class) { t_canvas *c = (t_canvas *)g; if (canvas_isabstraction(c) && c->name==name && canvas_getdir(c) == dir) { ! /* we're going to remake the object, so "g" will go stale. Get its index here, and afterwards restore g. ! Also, the replacement will be at the end of the list, so we don't do g = g->next() in this case. */ ! int j = g->dix->index; int hadwindow = gl->havewindow; if (!hadwindow) canvas_vis(canvas_getcanvas(gl), 1); ! t_binbuf *buf = canvas_cut_wires(gl,g); ! gl->boxes->remove(j); ! //MISSING: remake the object here. ! canvas_paste_wires(gl,buf); if (!hadwindow) canvas_vis(canvas_getcanvas(gl), 0); continue; *************** *** 2715,2724 **** }
static void canvas_saveto(t_canvas *x, t_binbuf *b) { canvas_savecontainerto(x,b); canvas_each(y,x) gobj_save(y, b); canvas_wires_each(oc,t,x) { ! int from = canvas_getindex(x,t.from); ! int to = canvas_getindex(x,t.to); binbuf_addv(b, "ttiiii;","#X","connect", from, t.outlet, to, t.inlet); appendix_save(oc,b); --- 2723,2739 ---- }
+ /* get the index of a gobj in a canvas. If y is zero, return the total number of objects. */ + int canvas_oldindex(t_canvas *x, t_gobj *y) { + int i=0; + canvas_each(y2,x) {if (y2==y) break; else i++;} + return i; + } + static void canvas_saveto(t_canvas *x, t_binbuf *b) { canvas_savecontainerto(x,b); canvas_each(y,x) gobj_save(y, b); canvas_wires_each(oc,t,x) { ! int from = canvas_oldindex(x,t.from); ! int to = canvas_oldindex(x,t.to); binbuf_addv(b, "ttiiii;","#X","connect", from, t.outlet, to, t.inlet); appendix_save(oc,b);