diff options
Diffstat (limited to 'toxy/widget.c')
-rw-r--r-- | toxy/widget.c | 225 |
1 files changed, 136 insertions, 89 deletions
diff --git a/toxy/widget.c b/toxy/widget.c index 253b649..a7a983a 100644 --- a/toxy/widget.c +++ b/toxy/widget.c @@ -23,7 +23,7 @@ static t_class *makeshift_class; //#define WIDGET_DEBUG //#define TOW_DEBUG -enum { WIDGET_NOUPDATE = 0, WIDGET_RECONFIG, WIDGET_REVIS }; +enum { WIDGET_NOVIS = 0, WIDGET_PUSHVIS, WIDGET_REVIS }; typedef struct _towentry { @@ -62,9 +62,9 @@ typedef struct _widget int x_height; t_symbol *x_background; int x_hasstate; - int x_update; /* see widget_update() */ - int x_selected; int x_disabled; + int x_selected; + int x_update; /* see widget_update() */ int x_vised; t_clock *x_transclock; t_towentry *x_towlist; @@ -95,10 +95,12 @@ static t_symbol *widgetps_motion; static t_symbol *widgetps_atbang; static t_symbol *widgetps_atfloat; static t_symbol *widgetps_atsymbol; +static t_symbol *widgetps_atstore; +static t_symbol *widgetps_atrestore; -static char *widget_propsresolver(t_pd *z, int ac, t_atom *av) +static char *widget_propsresolver(t_pd *owner, int ac, t_atom *av) { - t_widget *x = (t_widget *)z; + t_widget *x = (t_widget *)owner; int len; scriptlet_reset(x->x_auxscript); if (scriptlet_add(x->x_auxscript, 1, 0, ac, av)) @@ -107,9 +109,9 @@ static char *widget_propsresolver(t_pd *z, int ac, t_atom *av) return (0); } -static t_canvas *widget_cvhook(t_pd *z) +static t_canvas *widget_cvhook(t_pd *caller) { - return (glist_getcanvas(((t_widget *)z)->x_glist)); + return (glist_getcanvas(((t_widget *)caller)->x_glist)); } /* LATER move to scriptlet.c, use the scriptlet interface (.^) */ @@ -165,14 +167,14 @@ static void widget_transedit(t_widget *x) { t_text *newt, *oldt = (t_text *)x; t_binbuf *bb = binbuf_new(); - int nopt, nbnd, narg; + int nopt, nhnd, narg; t_atom *opt = props_getall(x->x_options, &nopt); - t_atom *bnd = props_getall(x->x_handlers, &nbnd); + t_atom *hnd = props_getall(x->x_handlers, &nhnd); t_atom *arg = props_getall(x->x_arguments, &narg); binbuf_addv(bb, "sss", gensym("widget"), x->x_type, x->x_name); if (narg) binbuf_add(bb, narg, arg); if (nopt) binbuf_add(bb, nopt, opt); - if (nbnd) binbuf_add(bb, nbnd, bnd); + if (nhnd) binbuf_add(bb, nhnd, hnd); canvas_setcurrent(x->x_glist); newt = (t_text *)pd_new(makeshift_class); newt->te_width = 0; @@ -211,6 +213,10 @@ static void widget_displace(t_gobj *z, t_glist *glist, int dx, int dy) { t_widget *x = (t_widget *)z; t_text *t = (t_text *)z; +#if 0 + post("displace %d %d (%d %d -> %d %d)", + dx, dy, t->te_xpix, t->te_ypix, t->te_xpix + dx, t->te_ypix + dy); +#endif t->te_xpix += dx; t->te_ypix += dy; if (glist_isvisible(glist)) @@ -219,11 +225,11 @@ static void widget_displace(t_gobj *z, t_glist *glist, int dx, int dy) canvas_fixlinesfor(glist_getcanvas(glist), t); } -static void widget_select(t_gobj *z, t_glist *glist, int state) +static void widget_select(t_gobj *z, t_glist *glist, int flag) { t_widget *x = (t_widget *)z; char *mypathname = widget_getmypathname(x, glist)->s_name; - if (state) + if (flag) { sys_vgui("%s config -bg blue %s\n", mypathname, (x->x_hasstate ? "-state disabled" : "")); @@ -235,7 +241,7 @@ static void widget_select(t_gobj *z, t_glist *glist, int state) sys_vgui("%s config -bg %s\n", mypathname, (x->x_background ? x->x_background->s_name : "gray")); else - sys_vgui("%s config -bg %s\n", mypathname, + sys_vgui("%s config -bg %s %s\n", mypathname, (x->x_background ? x->x_background->s_name : "gray"), (x->x_hasstate ? "-state normal" : "")); x->x_selected = 0; @@ -290,13 +296,20 @@ static void widget_pushinits(t_widget *x) bug("widget_pushinits (instance)"); } +static void widget_getconfig(t_widget *x) +{ + sys_vgui("::toxy::itemgetconfig %s %s\n", + widget_getmypathname(x, x->x_glist)->s_name, + x->x_cbtarget->s_name); +} + static void widget_vis(t_gobj *z, t_glist *glist, int vis) { t_widget *x = (t_widget *)z; t_text *t = (t_text *)z; char *cvpathname = widget_getcvpathname(x, glist)->s_name; char *mypathname = widget_getmypathname(x, glist)->s_name; - x->x_update = WIDGET_NOUPDATE; + x->x_update = WIDGET_NOVIS; if (vis) { float px1 = text_xpix((t_text *)x, glist); @@ -318,11 +331,7 @@ static void widget_vis(t_gobj *z, t_glist *glist, int vis) t_rtext *rt = glist_findrtext(glist, t); if (rt) rtext_free(rt); #endif - if (x->x_vised) - { - sys_vgui("destroy %s\n", mypathname); - x->x_vised = 0; - } + x->x_vised = 0; } } @@ -330,16 +339,16 @@ static void widget_save(t_gobj *z, t_binbuf *bb) { t_widget *x = (t_widget *)z; t_text *t = (t_text *)x; - int nopt, nbnd, narg; + int nopt, nhnd, narg; t_atom *opt = props_getall(x->x_options, &nopt); - t_atom *bnd = props_getall(x->x_handlers, &nbnd); + t_atom *hnd = props_getall(x->x_handlers, &nhnd); t_atom *arg = props_getall(x->x_arguments, &narg); binbuf_addv(bb, "ssiisss", gensym("#X"), gensym("obj"), (int)t->te_xpix, (int)t->te_ypix, gensym("widget"), x->x_type, x->x_name); if (narg) binbuf_add(bb, narg, arg); if (nopt) binbuf_add(bb, nopt, opt); - if (nbnd) binbuf_add(bb, nbnd, bnd); + if (nhnd) binbuf_add(bb, nhnd, hnd); binbuf_addsemi(bb); } @@ -405,27 +414,37 @@ static t_widgetbehavior widget_behavior = FORKY_WIDGETPADDING }; -static void widget_update(t_widget *x) +static void widget_update(t_widget *x, t_props *op) { - t_atom *ap; - int ac; - scriptlet_reset(x->x_optscript); - ap = props_getall(widgettype_getoptions(x->x_typedef), &ac); - if (ac) scriptlet_add(x->x_optscript, 0, 0, ac, ap); - ap = props_getall(x->x_options, &ac); - if (ac) scriptlet_add(x->x_optscript, 0, 0, ac, ap); - if (x->x_update && - glist_isvisible(x->x_glist)) /* FIXME the condition */ + if (op == x->x_options) { - if (x->x_update == WIDGET_REVIS) + t_atom *ap; + int ac; + scriptlet_reset(x->x_optscript); + ap = props_getall(widgettype_getoptions(x->x_typedef), &ac); + if (ac) scriptlet_add(x->x_optscript, 0, 0, ac, ap); + ap = props_getall(x->x_options, &ac); + if (ac) scriptlet_add(x->x_optscript, 0, 0, ac, ap); + if (x->x_update && + glist_isvisible(x->x_glist)) /* FIXME the condition */ { - widget_vis((t_gobj *)x, x->x_glist, 0); - widget_vis((t_gobj *)x, x->x_glist, 1); + if (x->x_update == WIDGET_REVIS) + { + widget_vis((t_gobj *)x, x->x_glist, 0); + widget_vis((t_gobj *)x, x->x_glist, 1); + } + else if (x->x_update == WIDGET_PUSHVIS) + { + widget_pushoptions(x, 1); + widget_getconfig(x); + } + x->x_update = WIDGET_NOVIS; } - else widget_pushoptions(x, 1); - x->x_update = WIDGET_NOUPDATE; } - /* LATER cache handlers */ + else + { + /* LATER cache handlers */ + } } static t_symbol *widget_addprops(t_widget *x, t_props *op, int single, @@ -438,7 +457,7 @@ static t_symbol *widget_addprops(t_widget *x, t_props *op, int single, if (empty) loud_error((t_pd *)x, "no value given for %s '%s'", props_getname(op), empty->s_name); - widget_update(x); + widget_update(x, op); return (empty); } else @@ -464,7 +483,7 @@ static void widget_anything(t_widget *x, t_symbol *s, int ac, t_atom *av) if (*s->s_name == '-' || *s->s_name == '@' || *s->s_name == '#') { t_symbol *empty; - x->x_update = WIDGET_RECONFIG; + x->x_update = WIDGET_PUSHVIS; if (empty = widget_addmessage(x, s, ac, av)) loud_errand((t_pd *)x, "(use 'remove %s' if that is what you want).", @@ -558,16 +577,32 @@ static void widget_symbol(t_widget *x, t_symbol *s) } } +static void widget_store(t_widget *x, t_symbol *s) +{ + if (s == &s_) + s = x->x_varname; + /* FIXME */ +} + +static void widget_restore(t_widget *x, t_symbol *s) +{ + if (s == &s_) + s = x->x_varname; + /* FIXME */ +} + static void widget_set(t_widget *x, t_symbol *s, int ac, t_atom *av) { t_symbol *prp; if (ac && av->a_type == A_SYMBOL && (prp = av->a_w.w_symbol)) { t_symbol *empty = 0; - x->x_update = WIDGET_RECONFIG; ac--; av++; if (*prp->s_name == '-') + { + x->x_update = WIDGET_PUSHVIS; empty = widget_addprops(x, x->x_options, 1, prp, ac, av); + } else if (*prp->s_name == '@') empty = widget_addprops(x, x->x_handlers, 1, prp, ac, av); else if (*prp->s_name == '#') @@ -595,8 +630,8 @@ static void widget_remove(t_widget *x, t_symbol *s) op = 0; if (op && props_remove(op, s)) { - x->x_update = WIDGET_REVIS; - widget_update(x); + if (op == x->x_options) x->x_update = WIDGET_REVIS; + widget_update(x, op); } else loud_warning((t_pd *)x, "%s %s has not been specified", props_getname(op), s->s_name); @@ -625,7 +660,9 @@ static void widget_tot(t_widget *x, t_symbol *s, int ac, t_atom *av) static void widget_refresh(t_widget *x) { x->x_update = WIDGET_REVIS; - widget_update(x); + widget_update(x, x->x_options); + widget_update(x, x->x_handlers); + widget_update(x, x->x_arguments); } static void widget__failure(t_widget *x, t_symbol *s, int ac, t_atom *av) @@ -682,13 +719,13 @@ static void widget__callback(t_widget *x, t_symbol *s, int ac, t_atom *av) else outlet_bang(((t_object *)x)->ob_outlet); } -/* FIXME this is a hack (see also widget_select) */ -/* FIXME why <Leave> is being issued on button press? */ +/* see also widget_select() */ static void widget__inout(t_widget *x, t_floatarg f) { + int disable = (int)f && x->x_glist->gl_edit; if (x->x_disabled) { - if (!x->x_glist->gl_edit) + if (!disable) { if (!x->x_selected) { @@ -699,54 +736,54 @@ static void widget__inout(t_widget *x, t_floatarg f) x->x_disabled = 0; } } - else if ((int)f && x->x_glist->gl_edit) + else if (disable) { - char *mypathname = widget_getmypathname(x, x->x_glist)->s_name; - if (x->x_hasstate) - sys_vgui("%s config -state disabled\n", mypathname); + if (!x->x_selected) + { + char *mypathname = widget_getmypathname(x, x->x_glist)->s_name; + if (x->x_hasstate) + sys_vgui("%s config -state disabled\n", mypathname); + } x->x_disabled = 1; } } -static void widget__click(t_widget *x, t_floatarg fx, t_floatarg fy, - t_floatarg fb, t_floatarg fm) +static void widget__click(t_widget *x, t_symbol *s, int ac, t_atom *av) { + if (ac != 4) + { + loud_error((t_pd *)x, "bad arguments to the '%s' method", s->s_name); + return; + } if (x->x_glist->gl_havewindow) /* LATER calculate on-parent coords */ { - t_text *t = (t_text *)x; - t_atom at[4]; - fx += t->te_xpix; - fy += t->te_ypix; - SETFLOAT(&at[0], fx); - SETFLOAT(&at[1], fy); - SETFLOAT(&at[2], fb); - SETFLOAT(&at[3], fm); if (x->x_cvtarget->s_thing) /* LATER rethink */ - typedmess(x->x_cvtarget->s_thing, widgetps_mouse, 4, at); + typedmess(x->x_cvtarget->s_thing, widgetps_mouse, ac, av); else - typedmess((t_pd *)x->x_glist, widgetps_mouse, 4, at); - widget__inout(x, 1.); + typedmess((t_pd *)x->x_glist, widgetps_mouse, ac, av); + widget__inout(x, 2.); } } /* LATER think how to grab the mouse when dragging */ -static void widget__motion(t_widget *x, t_floatarg fx, t_floatarg fy) +static void widget__motion(t_widget *x, t_symbol *s, int ac, t_atom *av) { + if (ac != 3) + { + loud_error((t_pd *)x, "bad arguments to the '%s' method", s->s_name); + return; + } if (x->x_glist->gl_havewindow) /* LATER calculate on-parent coords */ { - t_text *t = (t_text *)x; - t_atom at[3]; - fx += t->te_xpix; - fy += t->te_ypix; - SETFLOAT(&at[0], fx); - SETFLOAT(&at[1], fy); - SETFLOAT(&at[2], 0); +#if 0 + post("motion %g %g", av[0].a_w.w_float, av[1].a_w.w_float); +#endif if (x->x_cvtarget->s_thing) /* LATER rethink */ - typedmess(x->x_cvtarget->s_thing, widgetps_motion, 3, at); + typedmess(x->x_cvtarget->s_thing, widgetps_motion, ac, av); else - typedmess((t_pd *)x->x_glist, widgetps_motion, 3, at); + typedmess((t_pd *)x->x_glist, widgetps_motion, ac, av); } } @@ -799,6 +836,8 @@ static void widget_debug(t_widget *x) post("type initializer (size %d):\n\"%s\"", sz, bp); bp = scriptlet_getcontents(x->x_iniscript, &sz); post("instance initializer (size %d):\n\"%s\"", sz, bp); + bp = masterwidget_getcontents(&sz); + post("setup definitions (size %d):\n\"%s\"", sz, bp); } #endif @@ -815,6 +854,8 @@ static void gui_unbind(t_pd *x, t_symbol *s) static void widget_free(t_widget *x) { + sys_vgui("::toxy::itemdestroy %s %s\n", + widget_getmypathname(x, x->x_glist)->s_name, x->x_varname->s_name); gui_unbind((t_pd *)x, x->x_cbtarget); gui_unbind((t_pd *)x, x->x_rptarget); props_freeall(x->x_options); @@ -862,28 +903,28 @@ static void *widget_new(t_symbol *s, int ac, t_atom *av) if (!(x->x_tkclass = widgettype_tkclass(x->x_typedef))) x->x_tkclass = x->x_type; + x->x_glist = canvas_getcurrent(); + sprintf(buf, ".x%x.c", (int)x->x_glist); + x->x_cvpathname = gensym(buf); + sprintf(buf, ".x%x", (int)x->x_glist); + x->x_cvtarget = gensym(buf); + sprintf(buf, "::toxy::v%x", (int)x); + x->x_varname = gensym(buf); + x->x_iniscript = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, - x->x_name, widget_cvhook); + x->x_name, x->x_glist, widget_cvhook); x->x_optscript = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, - x->x_name, widget_cvhook); + x->x_name, x->x_glist, widget_cvhook); x->x_auxscript = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, - x->x_name, widget_cvhook); + x->x_name, x->x_glist, widget_cvhook); x->x_transient = scriptlet_new((t_pd *)x, x->x_rptarget, x->x_cbtarget, - x->x_name, widget_cvhook); + x->x_name, x->x_glist, widget_cvhook); x->x_options = props_new((t_pd *)x, "option", "-", 0, 0); x->x_handlers = props_new((t_pd *)x, "handler", "@", x->x_options, 0); x->x_arguments = props_new((t_pd *)x, "argument", "#", x->x_options, widget_propsresolver); - sprintf(buf, ".^.c.%s%x", x->x_name->s_name, (int)x); - x->x_glist = canvas_getcurrent(); - sprintf(buf, ".x%x.c", (int)x->x_glist); - x->x_cvpathname = gensym(buf); - sprintf(buf, ".x%x", (int)x->x_glist); - x->x_cvtarget = gensym(buf); - sprintf(buf, "::toxy::v%x", (int)x); - x->x_varname = gensym(buf); outlet_new((t_object *)x, &s_anything); /* LATER consider estimating these, based on widget class and options */ x->x_width = 50; @@ -894,7 +935,7 @@ static void *widget_new(t_symbol *s, int ac, t_atom *av) x->x_transclock = clock_new(x, (t_method)widget_transtick); x->x_background = 0; x->x_hasstate = 0; - x->x_update = WIDGET_NOUPDATE; + x->x_update = WIDGET_NOVIS; x->x_disabled = 0; x->x_vised = 0; widget_attach(x); @@ -1153,6 +1194,8 @@ void widget_setup(void) widgetps_atbang = gensym("@bang"); widgetps_atfloat = gensym("@float"); widgetps_atsymbol = gensym("@symbol"); + widgetps_atstore = gensym("@store"); + widgetps_atrestore = gensym("@restore"); widgettype_setup(); widget_class = class_new(gensym("widget"), (t_newmethod)widget_new, @@ -1165,6 +1208,10 @@ void widget_setup(void) class_addfloat(widget_class, widget_float); class_addsymbol(widget_class, widget_symbol); class_addanything(widget_class, widget_anything); + class_addmethod(widget_class, (t_method)widget_store, + gensym("store"), A_DEFSYMBOL, 0); + class_addmethod(widget_class, (t_method)widget_restore, + gensym("restore"), A_DEFSYMBOL, 0); class_addmethod(widget_class, (t_method)widget_set, gensym("set"), A_GIMME, 0); class_addmethod(widget_class, (t_method)widget_remove, @@ -1187,9 +1234,9 @@ void widget_setup(void) class_addmethod(widget_class, (t_method)widget__inout, gensym("_inout"), A_FLOAT, 0); class_addmethod(widget_class, (t_method)widget__click, - gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); + gensym("_click"), A_GIMME, 0); class_addmethod(widget_class, (t_method)widget__motion, - gensym("_motion"), A_FLOAT, A_FLOAT, 0); + gensym("_motion"), A_GIMME, 0); #ifdef WIDGET_DEBUG class_addmethod(widget_class, (t_method)widget_debug, gensym("debug"), 0); |