From a2e3c333f919ddfa0344bea6fe1182b815f90a89 Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jon.w.wilkes@gmail.com> Date: Thu, 17 Sep 2015 22:43:16 -0400 Subject: [PATCH] first stab at changing [group] to [draw group] --- pd/src/g_canvas.c | 19 ++++++++----------- pd/src/g_readwrite.c | 12 ++++++++++-- pd/src/g_template.c | 12 +++++++++++- pd/src/g_text.c | 4 ++-- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c index 79dd8e171..d5b93ffd0 100644 --- a/pd/src/g_canvas.c +++ b/pd/src/g_canvas.c @@ -1106,15 +1106,18 @@ void canvas_objfor(t_glist *gl, t_text *x, int argc, t_atom *argv); void canvas_restore(t_canvas *x, t_symbol *s, int argc, t_atom *argv) { t_pd *z; + int is_draw_command = 0; //fprintf(stderr,"canvas_restore %lx\n", x); - /* for [group] we add an inlet to the svg attr proxy */ - if (argc > 2 && argv[2].a_w.w_symbol == gensym("group")) + /* for [draw group] we add an inlet to the svg attr proxy */ + if (argc > 2 && argv[2].a_w.w_symbol == gensym("draw")) { group_svginit(x); + is_draw_command = 1; } - if (argc > 3) + if (argc > 3 || (is_draw_command && argc > 4)) { - t_atom *ap=argv+3; + int offset = is_draw_command ? 4 : 3; + t_atom *ap=argv+offset; if (ap->a_type == A_SYMBOL) { t_canvasenvironment *e = canvas_getenv(canvas_getcurrent()); @@ -1348,7 +1351,7 @@ static void *subcanvas_new(t_symbol *s) return (x); } -static void *group_new(t_symbol *s) +void *group_new(t_symbol *s) { t_canvas *x = subcanvas_new(s); group_svginit(x); @@ -2335,7 +2338,6 @@ void g_canvas_setup(void) /* ----- subcanvases, which you get by typing "pd" in a box ---- */ class_addcreator((t_newmethod)subcanvas_new, gensym("pd"), A_DEFSYMBOL, 0); class_addcreator((t_newmethod)subcanvas_new, gensym("page"), A_DEFSYMBOL, 0); - class_addcreator((t_newmethod)group_new, gensym("group"), A_DEFSYM, 0); class_addmethod(canvas_class, (t_method)canvas_click, gensym("click"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); @@ -2353,11 +2355,6 @@ void g_canvas_setup(void) class_addcreator((t_newmethod)table_new, gensym("table"), A_DEFSYM, A_DEFFLOAT, 0); -/*--------------------------- svg groups ---------------------- */ - - class_addcreator((t_newmethod)group_new, gensym("group"), - A_DEFSYM, A_DEFFLOAT, 0); - /*---------------------------- declare ------------------- */ declare_class = class_new(gensym("declare"), (t_newmethod)declare_new, (t_method)declare_free, sizeof(t_declare), CLASS_NOINLET, A_GIMME, 0); diff --git a/pd/src/g_readwrite.c b/pd/src/g_readwrite.c index 63ca3bc1f..d46b25671 100644 --- a/pd/src/g_readwrite.c +++ b/pd/src/g_readwrite.c @@ -623,9 +623,17 @@ static void canvas_saveto(t_canvas *x, t_binbuf *b) /* have to go to original binbuf to find out how we were named. */ //fprintf(stderr,"saving subpatch\n"); t_binbuf *bz = binbuf_new(); - t_symbol *patchsym; + t_symbol *patchsym, *selector; + int name_index; binbuf_addbinbuf(bz, x->gl_obj.ob_binbuf); - patchsym = atom_getsymbolarg(1, binbuf_getnatom(bz), binbuf_getvec(bz)); + selector = atom_getsymbolarg(0, binbuf_getnatom(bz), binbuf_getvec(bz)); + /* For [draw group] we save the name as the third argument. This + is rather obscure but it might be handy if people want to + dynamically create objects inside a [draw group] */ + if (selector == gensym("draw")) name_index = 2; + else name_index = 1; + patchsym = atom_getsymbolarg(name_index, + binbuf_getnatom(bz), binbuf_getvec(bz)); binbuf_free(bz); binbuf_addv(b, "ssiiiisi;", gensym("#N"), gensym("canvas"), (int)(x->gl_screenx1), diff --git a/pd/src/g_template.c b/pd/src/g_template.c index 8b486bf6f..035cfe4f3 100644 --- a/pd/src/g_template.c +++ b/pd/src/g_template.c @@ -1388,7 +1388,7 @@ static int symbol_isdrawtype(t_symbol *s) s == gensym("line") || s == gensym("path") || s == gensym("polygon") || s == gensym("polyline") || s == gensym("rect") || s == gensym("image") || - s == gensym("sprite")) + s == gensym("sprite") || s == gensym("group")) { return 1; } @@ -1397,6 +1397,7 @@ static int symbol_isdrawtype(t_symbol *s) } static void *drawimage_new(t_symbol *classsym, int argc, t_atom *argv); +extern void *group_new(t_symbol *s); static void *draw_new(t_symbol *classsym, t_int argc, t_atom *argv) { @@ -1409,6 +1410,15 @@ static void *draw_new(t_symbol *classsym, t_int argc, t_atom *argv) have their own class and new function */ if (type == gensym("sprite") || type == gensym("image")) return (drawimage_new(type, argc, argv)); + else if (type == gensym("group")) + { + t_symbol *group_name; + if (argc > 0 && argv->a_type == A_SYMBOL) + group_name = atom_getsymbolarg(0, argc, argv); + else group_name = &s_; + post("group name is %s", group_name->s_name); + return (group_new(group_name)); + } } else { diff --git a/pd/src/g_text.c b/pd/src/g_text.c index 2cf2201b1..19afdc7a6 100644 --- a/pd/src/g_text.c +++ b/pd/src/g_text.c @@ -2466,8 +2466,8 @@ static int compare_subpatch_selectors(t_atom *a, t_atom *b) return (!strcmp(a[0].a_w.w_symbol->s_name, "pd") && !strcmp(b[0].a_w.w_symbol->s_name, "pd")) || - (!strcmp(a[0].a_w.w_symbol->s_name, "group") && - !strcmp(b[0].a_w.w_symbol->s_name, "group")); + (!strcmp(a[0].a_w.w_symbol->s_name, "draw") && + !strcmp(b[0].a_w.w_symbol->s_name, "draw")); } else return 0; -- GitLab