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/slider.h | 439 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 439 insertions(+) create mode 100755 gui/slider.h (limited to 'gui/slider.h') diff --git a/gui/slider.h b/gui/slider.h new file mode 100755 index 0000000..69c44dd --- /dev/null +++ b/gui/slider.h @@ -0,0 +1,439 @@ +#ifndef __SLIDER_H__ +#define __SLIDER_H__ + +/* changes for setting width by + set message by +*/ + +#include "ggee.h" +#include "m_imp.h" +#include "g_canvas.h" +#ifdef NT +#pragma warning( disable : 4244 ) +#pragma warning( disable : 4305 ) +#endif + +#define SPOSITIONS +#define te_xpos te_xpix +#define te_ypos te_ypix + +typedef struct _slider +{ + t_object x_obj; + t_atom a_pos; + t_atom a_pos2; + t_glist * x_glist; + int x_width; + int x_height; + int x_offset; + int x_mpos; + int x_num; + int x_horizontal; +} t_slider; + +#define x_pos a_pos.a_w.w_float +#define x_pos2 a_pos2.a_w.w_float + + +/* widget helper functions */ + +static void draw_inlets(t_slider *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_xpos + (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_ypos + x->x_height - 1, + onset + IOWIDTH, x->x_obj.te_ypos + 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_ypos + x->x_height - 1, + onset + IOWIDTH, x->x_obj.te_ypos + x->x_height); + } + n = nout; + nplus = (n == 1 ? 1 : n-1); + for (i = 0; i < n; i++) + { + int onset = x->x_obj.te_xpos + (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_ypos, + onset + IOWIDTH, x->x_obj.te_ypos + 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_ypos, + onset + IOWIDTH, x->x_obj.te_ypos + 1); + + } +} + + + +static void slider_update(t_slider *x, t_glist *glist) +{ + if (glist_isvisible(glist)) { + if (!x->x_horizontal) { + sys_vgui(".x%x.c coords %xP \ +%d %d %d %d\n",glist_getcanvas(glist),x, + x->x_obj.te_xpos,x->x_obj.te_ypos + x->x_height - (int)x->x_pos + x->x_offset, + x->x_obj.te_xpos + x->x_width,x->x_obj.te_ypos + x->x_height - (int)x->x_pos + x->x_offset); + sys_vgui(".x%x.c coords %xP2 \ +%d %d %d %d\n",glist_getcanvas(glist),x, + x->x_obj.te_xpos,x->x_obj.te_ypos + x->x_height - (int)x->x_pos2 + x->x_offset, + x->x_obj.te_xpos + x->x_width,x->x_obj.te_ypos + x->x_height - (int)x->x_pos2 + x->x_offset); + } + else { + sys_vgui(".x%x.c coords %xP \ +%d %d %d %d\n",glist_getcanvas(glist),x, + x->x_obj.te_xpos +(int)x->x_pos - x->x_offset ,x->x_obj.te_ypos, + x->x_obj.te_xpos +(int)x->x_pos - x->x_offset ,x->x_obj.te_ypos + x->x_height); + sys_vgui(".x%x.c coords %xP2 \ +%d %d %d %d\n",glist_getcanvas(glist),x, + x->x_obj.te_xpos +(int)x->x_pos2 - x->x_offset ,x->x_obj.te_ypos, + x->x_obj.te_xpos +(int)x->x_pos2 - x->x_offset ,x->x_obj.te_ypos + x->x_height); + } + } +} + + +static void slider_drawme(t_slider *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_xpos, x->x_obj.te_ypos, + x->x_obj.te_xpos + x->x_width, x->x_obj.te_ypos + x->x_height, + x); + if (!x->x_horizontal) { + sys_vgui(".x%x.c create line \ +%d %d %d %d -width 3 -tags %xP\n",glist_getcanvas(glist), + x->x_obj.te_xpos,x->x_obj.te_ypos + x->x_height - (int)x->x_pos + x->x_offset, + x->x_obj.te_xpos + x->x_width, + x->x_obj.te_ypos + x->x_height - (int)x->x_pos + x->x_offset,x); + + sys_vgui(".x%x.c create line \ +%d %d %d %d -width 3 -tags %xP2\n",glist_getcanvas(glist), + x->x_obj.te_xpos,x->x_obj.te_ypos + x->x_height - (int)x->x_pos2 + x->x_offset, + x->x_obj.te_xpos + x->x_width, + x->x_obj.te_ypos + x->x_height - (int)x->x_pos2 + x->x_offset,x); + } + else { + sys_vgui(".x%x.c create line \ +%d %d %d %d -width 3 -tags %xP\n",glist_getcanvas(glist), + x->x_obj.te_xpos + (int)x->x_pos + x->x_offset ,x->x_obj.te_ypos, + x->x_obj.te_xpos + (int)x->x_pos + x->x_offset, + x->x_obj.te_ypos + x->x_height,x ); + sys_vgui(".x%x.c create line \ +%d %d %d %d -width 3 -tags %xP2\n",glist_getcanvas(glist), + x->x_obj.te_xpos + (int)x->x_pos2 + x->x_offset ,x->x_obj.te_ypos, + x->x_obj.te_xpos + (int)x->x_pos2 + x->x_offset, + x->x_obj.te_ypos + x->x_height,x ); + } + } + else { + sys_vgui(".x%x.c coords %xS \ +%d %d %d %d\n", + glist_getcanvas(glist), x, + x->x_obj.te_xpos, x->x_obj.te_ypos, + x->x_obj.te_xpos + x->x_width, x->x_obj.te_ypos + x->x_height); + slider_update(x, glist); + } + + draw_inlets(x, glist, firsttime, 1,1); + +} + + + + +static void slider_erase(t_slider* 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); + + sys_vgui(".x%x.c delete %xP2\n", + glist_getcanvas(glist), x); + + n = x->x_num; + + 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); + } +} + + + +/* ------------------------ slider widgetbehaviour----------------------------- */ + + +static void slider_getrect(t_gobj *z, t_glist *owner, + int *xp1, int *yp1, int *xp2, int *yp2) +{ + int width, height; + t_slider* s = (t_slider*)z; + + + width = s->x_width; + height = s->x_height; + *xp1 = s->x_obj.te_xpos; + *yp1 = s->x_obj.te_ypos; + *xp2 = s->x_obj.te_xpos + width; + *yp2 = s->x_obj.te_ypos + height; +} + +static void slider_displace(t_gobj *z, t_glist *glist, + int dx, int dy) +{ + t_slider *x = (t_slider *)z; + x->x_obj.te_xpos += dx; + x->x_obj.te_ypos += dy; + slider_drawme(x, glist, 0); + canvas_fixlinesfor(glist_getcanvas(glist),(t_text*) x); +} + +static void slider_select(t_gobj *z, t_glist *glist, int state) +{ + t_slider *x = (t_slider *)z; + sys_vgui(".x%x.c itemconfigure %xS -fill %s\n", glist, + x, (state? "blue" : BACKGROUNDCOLOR)); +} + + +static void slider_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 slider_delete(t_gobj *z, t_glist *glist) +{ + t_text *x = (t_text *)z; + canvas_deletelinesfor(glist_getcanvas(glist), x); +} + + +static void slider_vis(t_gobj *z, t_glist *glist, int vis) +{ + t_slider* s = (t_slider*)z; + if (vis) + slider_drawme(s, glist, 1); + else + slider_erase(s,glist); +} + +/* can we use the normal text save function ?? */ + +static void slider_save(t_gobj *z, t_binbuf *b) +{ + t_slider *x = (t_slider *)z; + t_symbol* sname; + int maxlen,maxwidth; + +/* if (!x->x_horizontal) {*/ + sname = gensym("slider"); + maxlen = x->x_height + x->x_offset; + maxwidth = x->x_width; +/* }*/ + + /* forget hsliders ... + else { + sname = gensym("hslider"); + maxlen = x->x_width + x->x_offset; + maxwidth = x->x_height; + } +*/ + + + binbuf_addv(b, "ssiisiiii", gensym("#X"),gensym("obj"), + (t_int)x->x_obj.te_xpos, (t_int)x->x_obj.te_ypos, sname,maxlen, + x->x_offset,maxwidth,x->x_num,x->x_horizontal); +/* binbuf_addbinbuf(b, x->te_binbuf); */ + binbuf_addv(b, ";"); +} + + +t_widgetbehavior slider_widgetbehavior; + + +static void slider_motion(t_slider *x, t_floatarg dx, t_floatarg dy) +{ + int max; + + if (!x->x_horizontal) { + x->x_mpos -= dy; + max = (x->x_offset + x->x_height); + } + else { + x->x_mpos += dx; + max = (x->x_offset + x->x_width); + } + + if (x->x_mpos < x->x_offset) + x->x_pos = x->x_offset; + else if (x->x_mpos > (max)) + x->x_pos = (max); + else + x->x_pos = x->x_mpos; + + + slider_update(x, x->x_glist); + outlet_float(x->x_obj.ob_outlet, x->x_pos); + +} + + +static void slider_click(t_slider *x, + t_floatarg xpos, t_floatarg ypos, t_floatarg shift, t_floatarg ctrl, + t_floatarg alt) +{ + + if (!x->x_horizontal) + x->x_mpos = x->x_pos = x->x_obj.te_ypos + x->x_height + x->x_offset - ypos; + else + x->x_mpos = x->x_pos = xpos - x->x_obj.te_xpos + x->x_offset; + + slider_update(x, x->x_glist); + outlet_float(x->x_obj.ob_outlet, x->x_pos); +#if (PD_VERSION_MINOR > 31) + glist_grab(x->x_glist, &x->x_obj.te_g, slider_motion, 0,xpos, ypos); +#else + glist_grab(x->x_glist, &x->x_obj.te_g, xpos, ypos); +#endif +} + + +#if (PD_VERSION_MINOR > 31) +static int slider_newclick(t_gobj *z, struct _glist *glist, + int xpix, int ypix, int shift, int alt, int dbl, int doit) +{ + t_slider* x = (t_slider *)z; + if (doit) + slider_click( x, (t_floatarg)xpix, (t_floatarg)ypix, + (t_floatarg)shift, 0, (t_floatarg)alt); + return (1); +} +#endif + +static void slider_setwidget() +{ + slider_widgetbehavior.w_getrectfn = slider_getrect; + slider_widgetbehavior.w_displacefn = slider_displace; + slider_widgetbehavior.w_selectfn = slider_select; + slider_widgetbehavior.w_activatefn = slider_activate; + slider_widgetbehavior.w_deletefn = slider_delete; + slider_widgetbehavior.w_visfn = slider_vis; +#if (PD_VERSION_MINOR > 31) + slider_widgetbehavior.w_clickfn = slider_newclick; + slider_widgetbehavior.w_propertiesfn = NULL; +#endif + slider_widgetbehavior.w_savefn = slider_save; +} + + + +static void slider_float(t_slider *x,t_floatarg f) +{ + if (!x->x_horizontal) { + if (f >= x->x_offset && f <= (x->x_offset + x->x_height)) + x->x_pos = (int)f; + } + else + if (f >= x->x_offset && f <= (x->x_offset + x->x_width)) + x->x_pos = (int)f; + + + slider_update(x, x->x_glist); + outlet_float(x->x_obj.ob_outlet, x->x_pos); + +} + + +static void slider_mark(t_slider *x,t_floatarg val) +{ + if (!x->x_horizontal) { + if (val >= x->x_offset && val <= (x->x_offset + x->x_height)) + x->x_pos2 = (int)val; + } + else + if (val >= x->x_offset && val <= (x->x_offset + x->x_width)) + x->x_pos2 = (int)val; + + slider_update(x, x->x_glist); +} + + +static void slider_type(t_slider *x,t_floatarg val) +{ + x->x_horizontal=val; + slider_vis((struct _gobj*)x,x->x_glist,0); + slider_vis((struct _gobj*)x,x->x_glist,1); +} + +static void slider_list(t_slider *x,t_symbol* s,t_int argc, t_atom* argv) +{ + t_float num; + t_float val; + + if (argc != 2) return; + + num = atom_getfloat(argv++); + val = atom_getfloat(argv); + if (!x->x_horizontal) { + if (val >= x->x_offset && val <= (x->x_offset + x->x_height)) + if (num) + x->x_pos2 = (int)val; + else + x->x_pos = (int)val; + } + else + if (val >= x->x_offset && val <= (x->x_offset + x->x_width)) + if (num) + x->x_pos2 = (int)val; + else + x->x_pos = (int)val; + + slider_update(x, x->x_glist); + outlet_float(x->x_obj.ob_outlet, x->x_pos); + +} + + + +static void slider_bang(t_slider *x) +{ + outlet_float(x->x_obj.ob_outlet, x->x_pos); +} + + +static void slider_set(t_slider *x,t_floatarg f) +{ + if (!x->x_horizontal) { + if (f >= x->x_offset && f <= (x->x_offset + x->x_height)) + x->x_pos = (int)f; + } + else{ + if (f >= x->x_offset && f <= (x->x_offset + x->x_width)) + x->x_pos = (int)f; + } + + slider_update(x, x->x_glist); +} + +#endif -- cgit v1.2.1