From fc3d3c0a4f110a23335398c327ac0a4fc949d5cb Mon Sep 17 00:00:00 2001 From: Guenter Geiger Date: Mon, 17 Jun 2002 10:13:57 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r12, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/ggee/; revision=13 --- gui/ticker.c | 337 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100755 gui/ticker.c (limited to 'gui/ticker.c') diff --git a/gui/ticker.c b/gui/ticker.c new file mode 100755 index 0000000..b40b1d7 --- /dev/null +++ b/gui/ticker.c @@ -0,0 +1,337 @@ +/* (C) Guenter Geiger */ + + +#include +#include +#include "g_canvas.h" +#ifdef NT +#pragma warning( disable : 4244 ) +#pragma warning( disable : 4305 ) +#endif + +/* ------------------------ ticker ----------------------------- */ + +#define DEFAULTSIZE 15 +#define DEFAULTCOLOR "black" + +static t_class *ticker_class; + +typedef struct _ticker +{ + t_object x_obj; + t_glist * x_glist; + int x_width; + int x_height; + t_float x_on; +} t_ticker; + +/* widget helper functions */ + + +static void draw_inlets(t_ticker *x, t_glist *glist, int firsttime, int nin, int nout) +{ + int n = nin; + int nplus, i; + nplus = (n == 1 ? 1 : n-1); + for (i = 0; i < n; i++) + { + int onset = x->x_obj.te_xpix + (x->x_width - IOWIDTH) * i / nplus; + if (firsttime) + sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xo%d\n", + glist_getcanvas(glist), + onset, x->x_obj.te_ypix + x->x_height - 1, + onset + IOWIDTH, x->x_obj.te_ypix + x->x_height, + x, i); + else + sys_vgui(".x%x.c coords %xo%d %d %d %d %d\n", + glist_getcanvas(glist), x, i, + onset, x->x_obj.te_ypix + x->x_height - 1, + onset + IOWIDTH, x->x_obj.te_ypix + x->x_height); + } + n = nout; + nplus = (n == 1 ? 1 : n-1); + for (i = 0; i < n; i++) + { + int onset = x->x_obj.te_xpix + (x->x_width - IOWIDTH) * i / nplus; + if (firsttime) + sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xi%d\n", + glist_getcanvas(glist), + onset, x->x_obj.te_ypix, + onset + IOWIDTH, x->x_obj.te_ypix + 1, + x, i); + else + sys_vgui(".x%x.c coords %xi%d %d %d %d %d\n", + glist_getcanvas(glist), x, i, + onset, x->x_obj.te_ypix, + onset + IOWIDTH, x->x_obj.te_ypix + 1); + + } +} + + + +void ticker_draw(t_ticker *x,t_glist *glist) +{ + if (x->x_on) { + sys_vgui(".x%x.c create line \ +%d %d %d %d -tags %xB\n",glist_getcanvas(glist), + x->x_obj.te_xpix+1,x->x_obj.te_ypix+1, + x->x_obj.te_xpix + x->x_width -1, + x->x_obj.te_ypix + x->x_height -1,x); + sys_vgui(".x%x.c create line \ +%d %d %d %d -tags %xC\n",glist_getcanvas(glist), + x->x_obj.te_xpix+1,x->x_obj.te_ypix + x->x_height -1, + x->x_obj.te_xpix + x->x_width -1,x->x_obj.te_ypix+1, + x); + + } + else { + sys_vgui(".x%x.c delete %xB\n", + glist_getcanvas(glist), x); + sys_vgui(".x%x.c delete %xC\n", + glist_getcanvas(glist), x); + } +} + + +void ticker_update(t_ticker *x,t_glist *glist) +{ + if (glist_isvisible(glist)) { + if (x->x_on) { + sys_vgui(".x%x.c coords %xB \ +%d %d %d %d\n",glist_getcanvas(glist), + x,x->x_obj.te_xpix+1,x->x_obj.te_ypix+1, + x->x_obj.te_xpix + x->x_width -1, + x->x_obj.te_ypix + x->x_height -1); + sys_vgui(".x%x.c coords %xC \ +%d %d %d %d\n",glist_getcanvas(glist), + x,x->x_obj.te_xpix+1,x->x_obj.te_ypix + x->x_height -1, + x->x_obj.te_xpix + x->x_width -1,x->x_obj.te_ypix+1); + + } + } +} + + + +void ticker_drawme(t_ticker *x, t_glist *glist, int firsttime) +{ + if (firsttime) { + sys_vgui(".x%x.c create rectangle \ +%d %d %d %d -tags %xS "BACKGROUND"\n", + glist_getcanvas(glist), + x->x_obj.te_xpix, x->x_obj.te_ypix, + x->x_obj.te_xpix + x->x_width, x->x_obj.te_ypix + x->x_height, + x); + ticker_draw(x,glist); + } + else { + sys_vgui(".x%x.c coords %xS \ +%d %d %d %d\n", + glist_getcanvas(glist), x, + x->x_obj.te_xpix, x->x_obj.te_ypix, + x->x_obj.te_xpix + x->x_width, x->x_obj.te_ypix + x->x_height); + ticker_update(x,glist); + } + + draw_inlets(x, glist, firsttime, 1,1); + +} + + + + +void ticker_erase(t_ticker* x,t_glist* glist) +{ + int n; + sys_vgui(".x%x.c delete %xS\n", + glist_getcanvas(glist), x); + + sys_vgui(".x%x.c delete %xP\n", + glist_getcanvas(glist), x); + + n = 1; + sys_vgui(".x%x.c delete %xB\n", + glist_getcanvas(glist), x); + sys_vgui(".x%x.c delete %xC\n", + glist_getcanvas(glist), x); + + while (n--) { + sys_vgui(".x%x.c delete %xi%d\n",glist_getcanvas(glist),x,n); + sys_vgui(".x%x.c delete %xo%d\n",glist_getcanvas(glist),x,n); + } +} + + + +/* ------------------------ ticker widgetbehaviour----------------------------- */ + + +static void ticker_getrect(t_gobj *z, t_glist *owner, + int *xp1, int *yp1, int *xp2, int *yp2) +{ + int width, height; + t_ticker* s = (t_ticker*)z; + + + width = s->x_width; + height = s->x_height; + *xp1 = s->x_obj.te_xpix; + *yp1 = s->x_obj.te_ypix; + *xp2 = s->x_obj.te_xpix + width; + *yp2 = s->x_obj.te_ypix + height; +} + +static void ticker_displace(t_gobj *z, t_glist *glist, + int dx, int dy) +{ + t_ticker *x = (t_ticker *)z; + x->x_obj.te_xpix += dx; + x->x_obj.te_ypix += dy; + ticker_drawme(x, glist, 0); + canvas_fixlinesfor(glist_getcanvas(glist),(t_text*) x); +} + +static void ticker_select(t_gobj *z, t_glist *glist, int state) +{ + t_ticker *x = (t_ticker *)z; + sys_vgui(".x%x.c itemconfigure %xS -fill %s\n", glist, + x, (state? "blue" : BACKGROUNDCOLOR)); +} + + +static void ticker_activate(t_gobj *z, t_glist *glist, int state) +{ +/* t_text *x = (t_text *)z; + t_rtext *y = glist_findrtext(glist, x); + if (z->g_pd != gatom_class) rtext_activate(y, state);*/ +} + +static void ticker_delete(t_gobj *z, t_glist *glist) +{ + t_text *x = (t_text *)z; + canvas_deletelinesfor(glist_getcanvas(glist), x); +} + + +static void ticker_vis(t_gobj *z, t_glist *glist, int vis) +{ + t_ticker* s = (t_ticker*)z; + if (vis) + ticker_drawme(s, glist, 1); + else + ticker_erase(s,glist); +} + +/* can we use the normal text save function ?? */ + +static void ticker_save(t_gobj *z, t_binbuf *b) +{ + t_ticker *x = (t_ticker *)z; + binbuf_addv(b, "ssiisii", gensym("#X"),gensym("obj"), + (t_int)x->x_obj.te_xpix, (t_int)x->x_obj.te_ypix, + gensym("ticker"),x->x_width,x->x_height); + binbuf_addv(b, ";"); +} + + +static void ticker_click(t_ticker *x, + t_floatarg xpos, t_floatarg ypos, t_floatarg shift, t_floatarg ctrl, + t_floatarg alt) +{ + x->x_on = x->x_on == 0.0 ? 1.0:0.0; + ticker_draw(x,x->x_glist); + outlet_float(x->x_obj.ob_outlet,x->x_on); +} + +#if (PD_VERSION_MINOR > 31) +static int ticker_newclick(t_gobj *z, struct _glist *glist, + int xpix, int ypix, int shift, int alt, int dbl, int doit) +{ + if (doit) + ticker_click((t_ticker *)z, (t_floatarg)xpix, (t_floatarg)ypix, + (t_floatarg)shift, 0, (t_floatarg)alt); + return (1); +} +#endif + +t_widgetbehavior ticker_widgetbehavior; + + +void ticker_size(t_ticker* x,t_floatarg w,t_floatarg h) { + x->x_width = w; + x->x_height = h; + ticker_drawme(x, x->x_glist, 0); +} + + +static void ticker_bang(t_ticker* x) +{ + x->x_on = x->x_on == 0.0 ? 1.0:0.0; + if (glist_isvisible(x->x_glist)) + ticker_draw(x,x->x_glist); + outlet_float(x->x_obj.ob_outlet,x->x_on); +} + +static void ticker_float(t_ticker* x,t_floatarg f) +{ + x->x_on = f; + if (glist_isvisible(x->x_glist)) + ticker_draw(x,x->x_glist); + outlet_float(x->x_obj.ob_outlet,x->x_on); +} + +static void ticker_set(t_ticker* x,t_floatarg f) +{ + x->x_on = f; +} + +static void *ticker_new(t_floatarg h,t_floatarg o) +{ + t_ticker *x = (t_ticker *)pd_new(ticker_class); + + x->x_glist = (t_glist*) canvas_getcurrent(); + if (h) x->x_width = h; + else + x->x_width = DEFAULTSIZE; + + if (o) x->x_height = o; + else + x->x_height = DEFAULTSIZE; + + x->x_on = 0; + + outlet_new(&x->x_obj, &s_float); + return (x); +} + +void ticker_setup(void) +{ + ticker_class = class_new(gensym("ticker"), (t_newmethod)ticker_new, 0, + sizeof(t_ticker),0, A_DEFFLOAT,A_DEFFLOAT,0); + + + class_addmethod(ticker_class, (t_method)ticker_click, gensym("click"), + A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0); + class_addmethod(ticker_class, (t_method)ticker_size, gensym("size"), + A_FLOAT, A_FLOAT, 0); + + class_addfloat(ticker_class, ticker_float); + class_addbang(ticker_class,ticker_bang); + class_addmethod(ticker_class,(t_method) ticker_set,gensym("set"),A_FLOAT,0); + class_setwidget(ticker_class,&ticker_widgetbehavior); + + ticker_widgetbehavior.w_getrectfn = ticker_getrect; + ticker_widgetbehavior.w_displacefn = ticker_displace; + ticker_widgetbehavior.w_selectfn = ticker_select; + ticker_widgetbehavior.w_activatefn = ticker_activate; + ticker_widgetbehavior.w_deletefn = ticker_delete; + ticker_widgetbehavior.w_visfn = ticker_vis; +#if (PD_VERSION_MINOR > 31) + ticker_widgetbehavior.w_clickfn = ticker_newclick; + ticker_widgetbehavior.w_propertiesfn = NULL; +#endif + ticker_widgetbehavior.w_savefn = ticker_save; +} + + -- cgit v1.2.1