g_mycanvas.c 15 KB
Newer Older
Miller Puckette's avatar
Miller Puckette committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/* Copyright (c) 1997-1999 Miller Puckette.
 * For information on usage and redistribution, and for a DISCLAIMER OF ALL
 * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */

/* g_7_guis.c written by Thomas Musil (c) IEM KUG Graz Austria 2000-2001 */
/* thanks to Miller Puckette, Guenther Geiger and Krzystof Czaja */

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "m_pd.h"
#include "g_canvas.h"
#include "g_all_guis.h"
#include <math.h>

16
static t_class *scalehandle_class;
17 18 19
extern int gfxstub_haveproperties(void *key);
void my_canvas_draw_select(t_my_canvas* x, t_glist* glist);

Miller Puckette's avatar
Miller Puckette committed
20 21 22
/* ---------- cnv  my gui-canvas for a window ---------------- */

t_widgetbehavior my_canvas_widgetbehavior;
23
/*static*/ t_class *my_canvas_class;
Miller Puckette's avatar
Miller Puckette committed
24 25 26 27 28 29 30 31 32

/* widget helper functions */

void my_canvas_draw_new(t_my_canvas *x, t_glist *glist)
{
    int xpos=text_xpix(&x->x_gui.x_obj, glist);
    int ypos=text_ypix(&x->x_gui.x_obj, glist);
    t_canvas *canvas=glist_getcanvas(glist);

33 34
    scalehandle_draw_new(x->x_gui. x_handle,canvas);
    scalehandle_draw_new(x->x_gui.x_lhandle,canvas);
Ivica Bukvic's avatar
Ivica Bukvic committed
35 36 37 38

        char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);

        sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x "
39
                 "-tags {%lxRECT %lxOBJ %s text iemgui}\n",
Ivica Bukvic's avatar
Ivica Bukvic committed
40 41 42 43
                 canvas, xpos, ypos,
                 xpos + x->x_vis_w, ypos + x->x_vis_h,
                 x->x_gui.x_bcol, x->x_gui.x_bcol, x, x, nlet_tag);
        sys_vgui(".x%lx.c create prect %d %d %d %d -stroke #%6.6x "
44
                 "-tags {%lxBASE %lxOBJ %s text iemgui}\n",
Ivica Bukvic's avatar
Ivica Bukvic committed
45 46 47
                 canvas, xpos, ypos,
                 xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
                 x->x_gui.x_bcol, x, x, nlet_tag);
48
    iemgui_label_draw_new(&x->x_gui,canvas,xpos,ypos,nlet_tag);
Miller Puckette's avatar
Miller Puckette committed
49 50 51 52
}

void my_canvas_draw_move(t_my_canvas *x, t_glist *glist)
{
53 54
    t_canvas *canvas=glist_getcanvas(glist);
    if (!glist_isvisible(canvas)) return;
Miller Puckette's avatar
Miller Puckette committed
55 56 57
    int xpos=text_xpix(&x->x_gui.x_obj, glist);
    int ypos=text_ypix(&x->x_gui.x_obj, glist);

58 59 60 61 62 63
    sys_vgui(".x%lx.c coords %lxRECT %d %d %d %d\n",
        canvas, x, xpos, ypos, xpos + x->x_vis_w, ypos + x->x_vis_h);
    sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n",
        canvas, x, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h);
    iemgui_label_draw_move(&x->x_gui,canvas,xpos,ypos);
    if (x->x_gui.x_selected) my_canvas_draw_select(x, x->x_gui.x_glist);
Miller Puckette's avatar
Miller Puckette committed
64 65 66 67 68
}

void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
69 70
    sys_vgui(".x%lx.c itemconfigure %lxRECT -fill #%6.6x -stroke #%6.6x\n",
             canvas, x, x->x_gui.x_bcol, x->x_gui.x_bcol);
71
    if (x->x_gui.x_selected && x->x_gui.x_glist == canvas)
Ivica Bukvic's avatar
Ivica Bukvic committed
72
        sys_vgui(".x%lx.c itemconfigure %lxBASE "
73
                 "-stroke $pd_colors(selection)\n", canvas, x);
Ivica Bukvic's avatar
Ivica Bukvic committed
74 75
    else
        sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x,
76
             x->x_gui.x_bcol);
77
    iemgui_label_draw_config(&x->x_gui,canvas);
Miller Puckette's avatar
Miller Puckette committed
78 79 80 81 82
}

void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
83
    if(x->x_gui.x_selected)
84 85 86 87 88
    {
        // check if we are drawing inside a gop abstraction
        // visible on parent canvas
        // if so, disable highlighting
        if (x->x_gui.x_glist == glist_getcanvas(glist))
Ivica Bukvic's avatar
Ivica Bukvic committed
89
        {
90 91
            sys_vgui(".x%lx.c itemconfigure %lxBASE "
                     "-stroke $pd_colors(selection)\n", canvas, x);
92
            scalehandle_draw_select2(&x->x_gui,glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
93
        }
94
        sys_vgui(".x%lx.c addtag selected withtag %lxOBJ\n", canvas, x);
95 96 97 98 99
    }
    else
    {
        sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n",
            canvas, x, x->x_gui.x_bcol);
100
        sys_vgui(".x%lx.c dtag %lxOBJ selected\n", canvas, x);
101 102 103
        scalehandle_draw_erase2(&x->x_gui,glist);
    }
    iemgui_label_draw_select(&x->x_gui,canvas);
104
    iemgui_tag_selected(&x->x_gui,canvas);
105 106
}

Ivica Bukvic's avatar
Ivica Bukvic committed
107 108
static void my_canvas__clickhook(t_scalehandle *sh, t_floatarg f,
    t_floatarg xxx, t_floatarg yyy)
109
{
Ivica Bukvic's avatar
Ivica Bukvic committed
110
    t_my_canvas *x = (t_my_canvas *)(sh->h_master);
111
    int newstate = (int)f;
112
    if (sh->h_dragon && newstate == 0 && sh->h_scale)
Miller Puckette's avatar
Miller Puckette committed
113
    {
Ivica Bukvic's avatar
Ivica Bukvic committed
114 115 116
        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
        if (sh->h_dragx || sh->h_dragy)
        {
117 118
            x->x_vis_w += sh->h_dragx;
            x->x_vis_h += sh->h_dragy;
Ivica Bukvic's avatar
Ivica Bukvic committed
119 120 121 122 123
            canvas_dirty(x->x_gui.x_glist, 1);
        }
        if (glist_isvisible(x->x_gui.x_glist))
        {
            my_canvas_draw_move(x, x->x_gui.x_glist);
124
            scalehandle_unclick_scale(sh);
Ivica Bukvic's avatar
Ivica Bukvic committed
125
        }
Miller Puckette's avatar
Miller Puckette committed
126
    }
127
    else if (!sh->h_dragon && newstate && sh->h_scale)
Miller Puckette's avatar
Miller Puckette committed
128
    {
129
        scalehandle_click_scale(sh);
130
    }
131 132
    else if (sh->h_dragon && newstate == 0 && !sh->h_scale)
    {
133
        scalehandle_unclick_label(sh);
134 135 136
    }
    else if (!sh->h_dragon && newstate && !sh->h_scale)
    {
137
        scalehandle_click_label(sh);
138
    }
139 140 141
    sh->h_dragon = newstate;
}

142
static void my_canvas__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
143
{
144
    if (sh->h_dragon && sh->h_scale)
145
    {
Ivica Bukvic's avatar
Ivica Bukvic committed
146 147
        t_my_canvas *x = (t_my_canvas *)(sh->h_master);
        int dx = (int)f1, dy = (int)f2;
148 149
        dx = maxi(dx,1-x->x_vis_w);
        dy = maxi(dy,1-x->x_vis_h);        
Ivica Bukvic's avatar
Ivica Bukvic committed
150 151
        sh->h_dragx = dx;
        sh->h_dragy = dy;
152
        scalehandle_drag_scale(sh);
Ivica Bukvic's avatar
Ivica Bukvic committed
153 154 155 156

        int properties = gfxstub_haveproperties((void *)x);
        if (properties)
        {
157 158
            int new_w = x->x_vis_w + sh->h_dragx;
            int new_h = x->x_vis_h + sh->h_dragy;
159 160 161
            properties_set_field_int(properties,"rng.min_ent",new_w);
            properties_set_field_int(properties,"rng.max_ent",new_h);

Ivica Bukvic's avatar
Ivica Bukvic committed
162 163 164
            int min = (new_w < new_h ? new_w : new_h);
            if (min <= x->x_gui.x_w)
            {
165
                properties_set_field_int(properties,"dim.w_ent",min);
Ivica Bukvic's avatar
Ivica Bukvic committed
166 167 168
            }
        }
    }
169
    scalehandle_dragon_label(sh,f1,f2);
Miller Puckette's avatar
Miller Puckette committed
170 171 172 173 174 175
}

void my_canvas_draw(t_my_canvas *x, t_glist *glist, int mode)
{
    if(mode == IEM_GUI_DRAW_MODE_MOVE)
        my_canvas_draw_move(x, glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
176 177
    else if(mode == IEM_GUI_DRAW_MODE_NEW)
    {
Miller Puckette's avatar
Miller Puckette committed
178
        my_canvas_draw_new(x, glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
179 180
        sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));
    }
Miller Puckette's avatar
Miller Puckette committed
181 182 183
    else if(mode == IEM_GUI_DRAW_MODE_SELECT)
        my_canvas_draw_select(x, glist);
    else if(mode == IEM_GUI_DRAW_MODE_ERASE)
184
        iemgui_draw_erase(&x->x_gui, glist);
Miller Puckette's avatar
Miller Puckette committed
185 186 187 188 189 190
    else if(mode == IEM_GUI_DRAW_MODE_CONFIG)
        my_canvas_draw_config(x, glist);
}

/* ------------------------ cnv widgetbehaviour----------------------------- */

Ivica Bukvic's avatar
Ivica Bukvic committed
191 192
static void my_canvas_getrect(t_gobj *z, t_glist *glist,
    int *xp1, int *yp1, int *xp2, int *yp2)
Miller Puckette's avatar
Miller Puckette committed
193 194 195 196 197
{
    t_my_canvas *x = (t_my_canvas *)z;
    
    *xp1 = text_xpix(&x->x_gui.x_obj, glist);
    *yp1 = text_ypix(&x->x_gui.x_obj, glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
198 199 200 201 202 203 204 205 206 207 208 209
    if (!glist_istoplevel(glist))
    {
        //if we are trying to calculate visibility of a widget inside a GOP
        *xp2 = *xp1 + x->x_vis_w;
        *yp2 = *yp1 + x->x_vis_h;
    }
    else
    {
        *xp2 = *xp1 + x->x_gui.x_w;
        *yp2 = *yp1 + x->x_gui.x_h;
    }
    iemgui_label_getrect(x->x_gui, glist, xp1, yp1, xp2, yp2);
Miller Puckette's avatar
Miller Puckette committed
210 211 212 213 214 215 216 217 218 219 220 221 222
}

static void my_canvas_save(t_gobj *z, t_binbuf *b)
{
    t_my_canvas *x = (t_my_canvas *)z;
    int bflcol[3];
    t_symbol *srl[3];

    iemgui_save(&x->x_gui, srl, bflcol);
    binbuf_addv(b, "ssiisiiisssiiiiiii", gensym("#X"),gensym("obj"),
                (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
                gensym("cnv"), x->x_gui.x_w, x->x_vis_w, x->x_vis_h,
                srl[0], srl[1], srl[2], x->x_gui.x_ldx, x->x_gui.x_ldy,
223 224
                iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
                bflcol[0], bflcol[2], iem_symargstoint(&x->x_gui));
Miller Puckette's avatar
Miller Puckette committed
225 226 227 228 229 230 231 232 233 234
    binbuf_addv(b, ";");
}

static void my_canvas_properties(t_gobj *z, t_glist *owner)
{
    t_my_canvas *x = (t_my_canvas *)z;
    char buf[800];
    t_symbol *srl[3];

    iemgui_properties(&x->x_gui, srl);
Miller Puckette's avatar
Miller Puckette committed
235
    sprintf(buf, "pdtk_iemgui_dialog %%s |cnv| \
Miller Puckette's avatar
Miller Puckette committed
236 237 238
            ------selectable_dimensions(pix):------ %d %d size: 0.0 0.0 empty \
            ------visible_rectangle(pix)(pix):------ %d width: %d height: %d \
            %d empty empty %d %d empty %d \
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
239 240
            {%s} {%s} \
            {%s} %d %d \
Miller Puckette's avatar
Miller Puckette committed
241 242 243 244 245 246 247
            %d %d \
            %d %d %d\n",
            x->x_gui.x_w, 1,
            x->x_vis_w, x->x_vis_h, 0,/*no_schedule*/
            -1, -1, -1, -1,/*no linlog, no init, no multi*/
            srl[0]->s_name, srl[1]->s_name,
            srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy,
248
            x->x_gui.x_font_style, x->x_gui.x_fontsize,
Miller Puckette's avatar
Miller Puckette committed
249 250 251 252 253 254
            0xffffff & x->x_gui.x_bcol, -1/*no frontcolor*/, 0xffffff & x->x_gui.x_lcol);
    gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf);
}

static void my_canvas_get_pos(t_my_canvas *x)
{
255
    if(iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
Miller Puckette's avatar
Miller Puckette committed
256 257 258 259 260 261 262 263 264
    {
        x->x_at[0].a_w.w_float = text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
        x->x_at[1].a_w.w_float = text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
        pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at);
    }
}

static void my_canvas_dialog(t_my_canvas *x, t_symbol *s, int argc, t_atom *argv)
{
Ivica Bukvic's avatar
Ivica Bukvic committed
265
    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
266

Miller Puckette's avatar
Miller Puckette committed
267 268 269 270
    t_symbol *srl[3];
    int a = (int)atom_getintarg(0, argc, argv);
    int w = (int)atom_getintarg(2, argc, argv);
    int h = (int)atom_getintarg(3, argc, argv);
Mathieu L Bouchard's avatar
Mathieu L Bouchard committed
271
    iemgui_dialog(&x->x_gui, srl, argc, argv);
Miller Puckette's avatar
Miller Puckette committed
272

273
    x->x_gui.x_loadinit = 0;
Miller Puckette's avatar
Miller Puckette committed
274 275 276 277 278 279 280 281 282 283 284
    if(a < 1)
        a = 1;
    x->x_gui.x_w = a;
    x->x_gui.x_h = x->x_gui.x_w;
    if(w < 1)
        w = 1;
    x->x_vis_w = w;
    if(h < 1)
        h = 1;
    x->x_vis_h = h;
    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
285
    //(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
286
    iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
287

288 289
    if (x->x_gui.x_selected) my_canvas_draw_select(x, x->x_gui.x_glist);
    scrollbar_update(x->x_gui.x_glist);
Miller Puckette's avatar
Miller Puckette committed
290 291 292 293 294 295 296 297 298 299
}

static void my_canvas_size(t_my_canvas *x, t_symbol *s, int ac, t_atom *av)
{
    int i = (int)atom_getintarg(0, ac, av);

    if(i < 1)
        i = 1;
    x->x_gui.x_w = i;
    x->x_gui.x_h = i;
300
    iemgui_size(&x->x_gui);
Miller Puckette's avatar
Miller Puckette committed
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
}

static void my_canvas_vis_size(t_my_canvas *x, t_symbol *s, int ac, t_atom *av)
{
    int i;

    i = (int)atom_getintarg(0, ac, av);
    if(i < 1)
        i = 1;
    x->x_vis_w = i;
    if(ac > 1)
    {
        i = (int)atom_getintarg(1, ac, av);
        if(i < 1)
            i = 1;
    }
    x->x_vis_h = i;
    if(glist_isvisible(x->x_gui.x_glist))
        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
}

static void *my_canvas_new(t_symbol *s, int argc, t_atom *argv)
{
    t_my_canvas *x = (t_my_canvas *)pd_new(my_canvas_class);
    int bflcol[]={-233017, -1, -66577};
    int a=IEM_GUI_DEFAULTSIZE, w=100, h=60;
Mathieu L Bouchard's avatar
Mathieu L Bouchard committed
327
    int ldx=20, ldy=12, i=0;
Miller Puckette's avatar
Miller Puckette committed
328 329
    int fs=14;

330 331
    iem_inttosymargs(&x->x_gui, 0);
    iem_inttofstyle(&x->x_gui, 0);
Miller Puckette's avatar
Miller Puckette committed
332 333 334 335 336 337 338 339

    if(((argc >= 10)&&(argc <= 13))
       &&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,2))
    {
        a = (int)atom_getintarg(0, argc, argv);
        w = (int)atom_getintarg(1, argc, argv);
        h = (int)atom_getintarg(2, argc, argv);
    }
Ivica Bukvic's avatar
Ivica Bukvic committed
340 341
    if((argc >= 12) && (IS_A_SYMBOL(argv,3) || IS_A_FLOAT(argv,3)) &&
        (IS_A_SYMBOL(argv,4) || IS_A_FLOAT(argv,4)))
Miller Puckette's avatar
Miller Puckette committed
342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
    {
        i = 2;
        iemgui_new_getnames(&x->x_gui, 3, argv);
    }
    else if((argc == 11)&&(IS_A_SYMBOL(argv,3)||IS_A_FLOAT(argv,3)))
    {
        i = 1;
        iemgui_new_getnames(&x->x_gui, 3, argv);
    }
    else iemgui_new_getnames(&x->x_gui, 3, 0);

    if(((argc >= 10)&&(argc <= 13))
       &&(IS_A_SYMBOL(argv,i+3)||IS_A_FLOAT(argv,i+3))&&IS_A_FLOAT(argv,i+4)
       &&IS_A_FLOAT(argv,i+5)&&IS_A_FLOAT(argv,i+6)
       &&IS_A_FLOAT(argv,i+7)&&IS_A_FLOAT(argv,i+8)
       &&IS_A_FLOAT(argv,i+9))
    {
            /* disastrously, the "label" sits in a different part of the
            message.  So we have to track its location separately (in
            the slot x_labelbindex) and initialize it specially here. */
        iemgui_new_dogetname(&x->x_gui, i+3, argv);
        x->x_gui.x_labelbindex = i+4;
        ldx = (int)atom_getintarg(i+4, argc, argv);
        ldy = (int)atom_getintarg(i+5, argc, argv);
366
        iem_inttofstyle(&x->x_gui, atom_getintarg(i+6, argc, argv));
Miller Puckette's avatar
Miller Puckette committed
367 368 369 370 371 372
        fs = (int)atom_getintarg(i+7, argc, argv);
        bflcol[0] = (int)atom_getintarg(i+8, argc, argv);
        bflcol[2] = (int)atom_getintarg(i+9, argc, argv);
    }
    if((argc == 13)&&IS_A_FLOAT(argv,i+10))
    {
373
        iem_inttosymargs(&x->x_gui, atom_getintarg(i+10, argc, argv));
Miller Puckette's avatar
Miller Puckette committed
374 375 376 377 378 379 380 381 382 383 384 385 386
    }
    x->x_gui.x_draw = (t_iemfunptr)my_canvas_draw;
    x->x_gui.x_glist = (t_glist *)canvas_getcurrent();
    if(a < 1)
        a = 1;
    x->x_gui.x_w = a;
    x->x_gui.x_h = x->x_gui.x_w;
    if(w < 1)
        w = 1;
    x->x_vis_w = w;
    if(h < 1)
        h = 1;
    x->x_vis_h = h;
387 388
    if (x->x_gui.x_font_style<0 || x->x_gui.x_font_style>2) x->x_gui.x_font_style=0;
    if (iemgui_has_rcv(&x->x_gui))
Miller Puckette's avatar
Miller Puckette committed
389 390 391 392 393 394 395 396 397 398
        pd_bind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
    x->x_gui.x_ldx = ldx;
    x->x_gui.x_ldy = ldy;
    if(fs < 4)
        fs = 4;
    x->x_gui.x_fontsize = fs;
    iemgui_all_colfromload(&x->x_gui, bflcol);
    x->x_at[0].a_type = A_FLOAT;
    x->x_at[1].a_type = A_FLOAT;
    iemgui_verify_snd_ne_rcv(&x->x_gui);
399

400 401
    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
Ivica Bukvic's avatar
Ivica Bukvic committed
402
    x->x_gui.x_obj.te_iemgui = 1;
403

Miller Puckette's avatar
Miller Puckette committed
404 405 406 407 408
    return (x);
}

static void my_canvas_ff(t_my_canvas *x)
{
409
    if(iemgui_has_rcv(&x->x_gui))
Miller Puckette's avatar
Miller Puckette committed
410 411
        pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
    gfxstub_deleteforkey(x);
412

413 414
    if (x->x_gui. x_handle) scalehandle_free(x->x_gui. x_handle);
    if (x->x_gui.x_lhandle) scalehandle_free(x->x_gui.x_lhandle);
Miller Puckette's avatar
Miller Puckette committed
415 416 417 418 419
}

void g_mycanvas_setup(void)
{
    my_canvas_class = class_new(gensym("cnv"), (t_newmethod)my_canvas_new,
Ivica Bukvic's avatar
Ivica Bukvic committed
420 421 422 423 424 425 426
        (t_method)my_canvas_ff, sizeof(t_my_canvas), CLASS_NOINLET, A_GIMME, 0);
    class_addcreator((t_newmethod)my_canvas_new,
        gensym("my_canvas"), A_GIMME, 0);
    class_addmethod(my_canvas_class, (t_method)my_canvas_dialog,
        gensym("dialog"), A_GIMME, 0);
    class_addmethod(my_canvas_class, (t_method)my_canvas_size,
        gensym("size"), A_GIMME, 0);
427
    iemgui_class_addmethods(my_canvas_class);
Ivica Bukvic's avatar
Ivica Bukvic committed
428 429 430 431
    class_addmethod(my_canvas_class, (t_method)my_canvas_vis_size,
        gensym("vis_size"), A_GIMME, 0);
    class_addmethod(my_canvas_class, (t_method)my_canvas_get_pos,
        gensym("get_pos"), 0);
Miller Puckette's avatar
Miller Puckette committed
432

433
    scalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
Ivica Bukvic's avatar
Ivica Bukvic committed
434
                  sizeof(t_scalehandle), CLASS_PD, 0);
435
    class_addmethod(scalehandle_class, (t_method)my_canvas__clickhook,
Ivica Bukvic's avatar
Ivica Bukvic committed
436
            gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
437
    class_addmethod(scalehandle_class, (t_method)my_canvas__motionhook,
Ivica Bukvic's avatar
Ivica Bukvic committed
438
            gensym("_motion"), A_FLOAT, A_FLOAT, 0);
439

440
    wb_init(&my_canvas_widgetbehavior,my_canvas_getrect,0);
Miller Puckette's avatar
Miller Puckette committed
441 442 443 444 445
    class_setwidget(my_canvas_class, &my_canvas_widgetbehavior);
    class_sethelpsymbol(my_canvas_class, gensym("my_canvas"));
    class_setsavefn(my_canvas_class, my_canvas_save);
    class_setpropertiesfn(my_canvas_class, my_canvas_properties);
}