g_bang.c 29.7 KB
Newer Older
Miller Puckette's avatar
Miller Puckette committed
1
2
3
4
5
6
7
/* 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 */

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
8
#include "config.h"
Miller Puckette's avatar
Miller Puckette committed
9
10
11
12
13
14
15
16
17
18
19

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

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
20
#ifdef HAVE_UNISTD_H
Miller Puckette's avatar
Miller Puckette committed
21
22
23
#include <unistd.h>
#endif

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
24
25
26
27
#ifdef HAVE_IO_H
#include <io.h>
#endif

28
29
30
extern int gfxstub_haveproperties(void *key);
void bng_draw_select(t_bng* x, t_glist* glist);
 
Miller Puckette's avatar
Miller Puckette committed
31
32
33
/* --------------- bng     gui-bang ------------------------- */

t_widgetbehavior bng_widgetbehavior;
34
static t_class *bng_class;
Miller Puckette's avatar
Miller Puckette committed
35
36
37

/*  widget helper functions  */

38
void bng_draw_update(t_gobj *xgobj, t_glist *glist)
Miller Puckette's avatar
Miller Puckette committed
39
{
40
41
42
43
44
45
46
47
    t_bng *x = (t_bng *)xgobj;
    if (x->x_gui.x_changed != x->x_flashed)
    {
        if(glist_isvisible(glist))
        {
            sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n",
                glist_getcanvas(glist), x,
                x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol);
48
            //vcanvas_itemconf(glist,x,"BUT","-fill",x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol);
49
50
51
        }
        x->x_gui.x_changed = x->x_flashed;
    }
Miller Puckette's avatar
Miller Puckette committed
52
53
54
55
56
57
58
59
}

void bng_draw_new(t_bng *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);

60
61
    scalehandle_draw_new(x->x_gui. x_handle,canvas);
    scalehandle_draw_new(x->x_gui.x_lhandle,canvas);
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

    //if (glist_isvisible(canvas)) {

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

    sys_vgui(".x%lx.c create prect %d %d %d %d "
             "-stroke $pd_colors(iemgui_border) -fill #%6.6x "
             "-tags {%lxBASE %lxBNG text iemgui border %s}\n",
         canvas, xpos, ypos, xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
         x->x_gui.x_bcol, x, x, nlet_tag);
    t_float cr = (x->x_gui.x_w-2)/2.0;
    t_float cx = xpos+cr+1.5;
    t_float cy = ypos+cr+1.5;
    sys_vgui(".x%lx.c create circle %f %f -r %f "
             "-stroke $pd_colors(iemgui_border) -fill #%6.6x "
             "-tags {%lxBUT %lxBNG text iemgui border %s}\n",
         canvas, cx, cy, cr, x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol,
         x, x, nlet_tag);
    sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w "
             "-font {{%s} -%d %s} -fill #%6.6x "
             "-tags {%lxLABEL %lxBNG text iemgui %s}\n",
         canvas, xpos+x->x_gui.x_ldx,
         ypos+x->x_gui.x_ldy,
         strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"",
         x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
         x->x_gui.x_lcol, x, x, nlet_tag);
    if (!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
    {
        sys_vgui(".x%lx.c create prect %d %d %d %d "
                 "-stroke $pd_colors(iemgui_nlet) "
                 "-tags {%lxBNG%so%d %so%d %lxBNG outlet iemgui %s}\n",
            canvas, xpos,
            ypos + x->x_gui.x_h-1, xpos + IOWIDTH,
            ypos + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
    }
    if (!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
    {
        sys_vgui(".x%lx.c create prect %d %d %d %d "
                 "-stroke $pd_colors(iemgui_nlet) "
                 "-tags {%lxBNG%si%d %si%d %lxBNG inlet iemgui %s}\n",
            canvas, xpos, ypos,
            xpos + IOWIDTH, ypos+1, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
    }
//}
Miller Puckette's avatar
Miller Puckette committed
106
107
108
109
110
111
112
113
}

void bng_draw_move(t_bng *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);

114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
    if (glist_isvisible(canvas))
    {

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

        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);
        t_float cr = (x->x_gui.x_w-2)/2.0;
        t_float cx = xpos+cr+1.5;
        t_float cy = ypos+cr+1.5;

        /*sys_vgui(".x%lx.c create circle %d %d -r %d "
                   "-stroke #%6.6x "
                   "-tags {%lxBUT %lxBNG %lx text iemgui}\n",
             canvas, cx, cy, cr,*/

        sys_vgui(".x%lx.c coords %lxBUT %f %f\n",
            canvas, x, cx, cy);
        sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x -r %f\n",
            canvas, x, x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol, cr);
        sys_vgui(".x%lx.c coords %lxLABEL %d %d\n",
            canvas, x, xpos+x->x_gui.x_ldx, ypos+x->x_gui.x_ldy);
        if(!x->x_gui.x_fsf.x_snd_able && canvas == x->x_gui.x_glist)
            sys_vgui(".x%lx.c coords %lxBNG%so%d %d %d %d %d\n",
                canvas, x, nlet_tag, 0, xpos,
                ypos + x->x_gui.x_h-1, xpos + IOWIDTH,
                ypos + x->x_gui.x_h);
        if(!x->x_gui.x_fsf.x_rcv_able && canvas == x->x_gui.x_glist)
            sys_vgui(".x%lx.c coords %lxBNG%si%d %d %d %d %d\n",
                canvas, x, nlet_tag, 0, xpos, ypos,
                xpos + IOWIDTH, ypos+1);
        /* redraw scale handle rectangle if selected */
        if (x->x_gui.x_fsf.x_selected)
            bng_draw_select(x, x->x_gui.x_glist);
    }
Miller Puckette's avatar
Miller Puckette committed
150
151
152
153
154
}

void bng_draw_erase(t_bng* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
155
156
    sys_vgui(".x%lx.c delete %lxBNG\n", canvas, x);
    sys_vgui(".x%lx.c dtag all %lxBNG\n", canvas, x);
157
    scalehandle_draw_erase2(&x->x_gui,glist);
Miller Puckette's avatar
Miller Puckette committed
158
159
160
161
162
163
}

void bng_draw_config(t_bng* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);

164
165
166
167
168
169
170
    /*
    char color[64];
    if (x->x_gui.x_fsf.x_selected)
        sprintf(color, "$pd_colors(selection)");
    else
        sprintf(color, "#%6.6x", x->x_gui.x_lcol);
    */
171

172
173
174
    if (x->x_gui.x_fsf.x_selected && x->x_gui.x_glist == canvas)
        sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} "
                 "-fill $pd_colors(selection) -text {%s} \n",
175
176
             canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
             strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
177
178
179
    else
        sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s} "
                 "-fill #%6.6x -text {%s} \n",
Miller Puckette's avatar
Miller Puckette committed
180
             canvas, x, x->x_gui.x_font, x->x_gui.x_fontsize, sys_fontweight,
181
             x->x_gui.x_lcol,
Miller Puckette's avatar
Miller Puckette committed
182
             strcmp(x->x_gui.x_lab->s_name, "empty")?x->x_gui.x_lab->s_name:"");
183
184
185
186
    sys_vgui(".x%lx.c itemconfigure %lxBASE -fill #%6.6x\n "
             ".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n",
         canvas, x, x->x_gui.x_bcol, canvas, x,
         x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol);
187
188
    /*sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n", canvas, x,
             x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol);*/
Miller Puckette's avatar
Miller Puckette committed
189
190
191
192
193
194
195
196
}

void bng_draw_io(t_bng* x, t_glist* glist, int old_snd_rcv_flags)
{
    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);

197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
    if (glist_isvisible(canvas) && canvas == x->x_gui.x_glist)
    {
        char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
        if((old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) &&
            !x->x_gui.x_fsf.x_snd_able)
            sys_vgui(".x%lx.c create prect %d %d %d %d "
                     "-stroke $pd_colors(iemgui_nlet) "
                     "-tags {%lxBNG%so%d %so%d %lxBNG outlet iemgui %s}\n",
                 canvas, xpos,
                 ypos + x->x_gui.x_h-1, xpos + IOWIDTH,
                 ypos + x->x_gui.x_h, x, nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
        if(!(old_snd_rcv_flags & IEM_GUI_OLD_SND_FLAG) &&
            x->x_gui.x_fsf.x_snd_able)
            sys_vgui(".x%lx.c delete %lxBNG%so%d\n", canvas, x, nlet_tag, 0);
        if((old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) &&
            !x->x_gui.x_fsf.x_rcv_able)
            sys_vgui(".x%lx.c create prect %d %d %d %d "
                     "-stroke $pd_colors(iemgui_nlet) "
                     "-tags {%lxBNG%si%d %si%d %lxBNG inlet iemgui %s}\n",
                 canvas, xpos, ypos, xpos + IOWIDTH, ypos+1, x,
                 nlet_tag, 0, nlet_tag, 0, x, nlet_tag);
        if(!(old_snd_rcv_flags & IEM_GUI_OLD_RCV_FLAG) &&
            x->x_gui.x_fsf.x_rcv_able)
            sys_vgui(".x%lx.c delete %lxBNG%si%d\n", canvas, x, nlet_tag, 0);
    }
Miller Puckette's avatar
Miller Puckette committed
222
223
224
225
226
}

void bng_draw_select(t_bng* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
227
228
    t_scalehandle *sh = (t_scalehandle *)(x->x_gui.x_handle);
    t_scalehandle *lh = (t_scalehandle *)(x->x_gui.x_lhandle);
229

230
231
232
    //if (glist_isvisible(canvas)) {

    if(x->x_gui.x_fsf.x_selected)
Miller Puckette's avatar
Miller Puckette committed
233
    {
234
235
236
237
238
239
240
241
242
243
244
245
246
247
        /* 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))
        {

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

            sys_vgui(".x%lx.c itemconfigure %lxBASE "
                     "-stroke $pd_colors(selection)\n", canvas, x);
            sys_vgui(".x%lx.c itemconfigure %lxBUT "
                     "-stroke $pd_colors(selection)\n", canvas, x);
            sys_vgui(".x%lx.c itemconfigure %lxLABEL "
                     "-fill $pd_colors(selection)\n", canvas, x);

248
            scalehandle_draw_select(sh,canvas,x->x_gui.x_w-1,x->x_gui.x_h-1,nlet_tag,"BNG");
249
250
            if (strcmp(x->x_gui.x_lab->s_name, "empty") != 0)
            {
251
                scalehandle_draw_select(lh,canvas,x->x_gui.x_ldx,x->x_gui.x_ldy,nlet_tag,"BNG");
252
253
254
            }
        }
        sys_vgui(".x%lx.c addtag selected withtag %lxBNG\n", canvas, x);
Miller Puckette's avatar
Miller Puckette committed
255
    }
256
    else
257
    {
258
259
260
261
262
263
264
        sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n",
            canvas, x, IEM_GUI_COLOR_NORMAL);
        sys_vgui(".x%lx.c itemconfigure %lxBUT -stroke %s\n",
            canvas, x, IEM_GUI_COLOR_NORMAL);
        sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n",
            canvas, x, x->x_gui.x_lcol);
        sys_vgui(".x%lx.c dtag %lxBNG selected\n", canvas, x);
265
        scalehandle_draw_erase2(&x->x_gui,glist);
266
    }
267
268
    //}
}
269

270
271
272
static void bng__clickhook(t_scalehandle *sh, t_floatarg f,
    t_floatarg xxx, t_floatarg yyy)
{
273

274
    t_bng *x = (t_bng *)(sh->h_master);
275

276
277
    if (xxx)
    {
278
        sh->h_offset_x = xxx;
279
280
281
    }
    if (yyy)
    {
282
        sh->h_offset_y = yyy;
283
    }
284

285
286
287
288
289
290
291
292
293
294
295
296
297
298
    int newstate = (int)f;
    if (sh->h_dragon && newstate == 0 && sh->h_scale)
    {
        /* done dragging */

        /* first set up the undo apply */
        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);

        if (sh->h_dragx || sh->h_dragy)
        {
            if (sh->h_dragx > sh->h_dragy)
                sh->h_dragx = sh->h_dragy;
            else sh->h_dragy = sh->h_dragx;

299
            x->x_gui.x_w = x->x_gui.x_w + sh->h_dragx - sh->h_offset_x;
300
301
            if (x->x_gui.x_w < SCALE_BNG_MINWIDTH)
                x->x_gui.x_w = SCALE_BNG_MINWIDTH;
302
            x->x_gui.x_h = x->x_gui.x_h + sh->h_dragy - sh->h_offset_y;
303
304
305
306
307
308
309
310
311
312
            if (x->x_gui.x_h < SCALE_BNG_MINHEIGHT)
                x->x_gui.x_h = SCALE_BNG_MINHEIGHT;

            canvas_dirty(x->x_gui.x_glist, 1);
        }

        int properties = gfxstub_haveproperties((void *)x);

        if (properties)
        {
313
            properties_set_field_int(properties,"dim.w_ent",x->x_gui.x_w);
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
        }

        if (glist_isvisible(x->x_gui.x_glist))
        {
            sys_vgui(".x%x.c delete %s\n", x->x_gui.x_glist, sh->h_outlinetag);
            bng_draw_move(x, x->x_gui.x_glist);
            iemgui_select((t_gobj *)x, x->x_gui.x_glist, 1);
            canvas_fixlinesfor(x->x_gui.x_glist, (t_text *)x);
            sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x->x_gui.x_glist);
        }
    }
    else if (!sh->h_dragon && newstate && sh->h_scale)
    {
        /* dragging */
        if (glist_isvisible(x->x_gui.x_glist))
        {
            sys_vgui("lower %s\n", sh->h_pathname);
            sys_vgui(".x%x.c create prect %d %d %d %d\
     -stroke $pd_colors(selection) -strokewidth 1 -tags %s\n",
                x->x_gui.x_glist, x->x_gui.x_obj.te_xpix,
                x->x_gui.x_obj.te_ypix,
                x->x_gui.x_obj.te_xpix + x->x_gui.x_w,
                x->x_gui.x_obj.te_ypix + x->x_gui.x_h, sh->h_outlinetag);
        }

        sh->h_dragx = 0;
        sh->h_dragy = 0;
    }
    else if (sh->h_dragon && newstate == 0 && !sh->h_scale)
    {
        /* done dragging */

        /* first set up the undo apply */
        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);

        if (sh->h_dragx || sh->h_dragy)
        {
            x->x_gui.x_ldx = x->x_gui.x_ldx + sh->h_dragx -
352
                sh->h_offset_x;
353
            x->x_gui.x_ldy = x->x_gui.x_ldy + sh->h_dragy -
354
                sh->h_offset_y;
355
356
357
358
359
360
361
            canvas_dirty(x->x_gui.x_glist, 1);
        }

        int properties = gfxstub_haveproperties((void *)x);

        if (properties)
        {
362
            properties_set_field_int(properties,"dim.w_ent",x->x_gui.x_w);
363
364
365
366
367
368
369
370
371
372
        }

        if (glist_isvisible(x->x_gui.x_glist))
        {
            sys_vgui(".x%x.c delete %s\n", x->x_gui.x_glist, sh->h_outlinetag);
            bng_draw_move(x, x->x_gui.x_glist);
            iemgui_select((t_gobj *)x, x->x_gui.x_glist, 1);
            canvas_fixlinesfor(x->x_gui.x_glist, (t_text *)x);
            sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x->x_gui.x_glist);
        }
373
374
375
    }
    else if (!sh->h_dragon && newstate && !sh->h_scale)
    {
376
377
378
379
        /* dragging */
        if (glist_isvisible(x->x_gui.x_glist))
        {
            sys_vgui("lower %s\n", sh->h_pathname);
380
            t_scalehandle *othersh = x->x_gui.x_handle;
381
382
383
384
385
386
            sys_vgui("lower .x%lx.h%lx\n",
                (t_int)glist_getcanvas(x->x_gui.x_glist), (t_int)othersh);
        }

        sh->h_dragx = 0;
        sh->h_dragy = 0;
387
    }
388
389
390
391
    sh->h_dragon = newstate;
}

static void bng__motionhook(t_scalehandle *sh,
392
                    t_floatarg f1, t_floatarg f2)
393
{
394
    if (sh->h_dragon && sh->h_scale)
Miller Puckette's avatar
Miller Puckette committed
395
    {
396
397
398
399
400
401
402
        t_bng *x = (t_bng *)(sh->h_master);
        int dx = (int)f1, dy = (int)f2;
        int newx, newy;

        if (dx > dy)
        {
            dx = dy;
403
            sh->h_offset_x = sh->h_offset_y;
404
405
406
407
        }
        else
        {
            dy = dx;
408
            sh->h_offset_y = sh->h_offset_x;
409
410
411
        }

        newx = x->x_gui.x_obj.te_xpix + x->x_gui.x_w -
412
            sh->h_offset_x + dx;
413
        newy = x->x_gui.x_obj.te_ypix + x->x_gui.x_h -
414
            sh->h_offset_y + dy;
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433

        if (newx < x->x_gui.x_obj.te_xpix + SCALE_BNG_MINWIDTH)
            newx = x->x_gui.x_obj.te_xpix + SCALE_BNG_MINWIDTH;
        if (newy < x->x_gui.x_obj.te_ypix + SCALE_BNG_MINHEIGHT)
            newy = x->x_gui.x_obj.te_ypix + SCALE_BNG_MINHEIGHT;

        if (glist_isvisible(x->x_gui.x_glist))
        {
            sys_vgui(".x%x.c coords %s %d %d %d %d\n",
                 x->x_gui.x_glist, sh->h_outlinetag, x->x_gui.x_obj.te_xpix,
                 x->x_gui.x_obj.te_ypix, newx, newy);
        }
        sh->h_dragx = dx;
        sh->h_dragy = dy;

        int properties = gfxstub_haveproperties((void *)x);

        if (properties)
        {
434
            int new_w = x->x_gui.x_w - sh->h_offset_x + sh->h_dragx;
435
            properties_set_field_int(properties,"dim.w_ent",new_w);
436
        }
437
    }
438
    scalehandle_dragon_label(sh,f1,f2);
Miller Puckette's avatar
Miller Puckette committed
439
440
441
442
443
}

void bng_draw(t_bng *x, t_glist *glist, int mode)
{
    if(mode == IEM_GUI_DRAW_MODE_UPDATE)
444
        sys_queuegui((t_gobj*)x, x->x_gui.x_glist, bng_draw_update);
445
        //bng_draw_update(x, glist);
Miller Puckette's avatar
Miller Puckette committed
446
447
    else if(mode == IEM_GUI_DRAW_MODE_MOVE)
        bng_draw_move(x, glist);
448
449
    else if(mode == IEM_GUI_DRAW_MODE_NEW)
    {
Miller Puckette's avatar
Miller Puckette committed
450
        bng_draw_new(x, glist);
451
452
        sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));
    }
Miller Puckette's avatar
Miller Puckette committed
453
454
455
456
457
458
459
460
461
462
463
464
    else if(mode == IEM_GUI_DRAW_MODE_SELECT)
        bng_draw_select(x, glist);
    else if(mode == IEM_GUI_DRAW_MODE_ERASE)
        bng_draw_erase(x, glist);
    else if(mode == IEM_GUI_DRAW_MODE_CONFIG)
        bng_draw_config(x, glist);
    else if(mode >= IEM_GUI_DRAW_MODE_IO)
        bng_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO);
}

/* ------------------------ bng widgetbehaviour----------------------------- */

465
466
static void bng_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1,
    int *xp2, int *yp2)
Miller Puckette's avatar
Miller Puckette committed
467
468
469
470
471
472
473
{
    t_bng *x = (t_bng *)z;

    *xp1 = text_xpix(&x->x_gui.x_obj, glist);
    *yp1 = text_ypix(&x->x_gui.x_obj, glist);
    *xp2 = *xp1 + x->x_gui.x_w;
    *yp2 = *yp1 + x->x_gui.x_h;
474

475
    iemgui_label_getrect(x->x_gui, glist, xp1, yp1, xp2, yp2);
Miller Puckette's avatar
Miller Puckette committed
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
}

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

    iemgui_save(&x->x_gui, srl, bflcol);
    binbuf_addv(b, "ssiisiiiisssiiiiiii", gensym("#X"),gensym("obj"),
                (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
                gensym("bng"), x->x_gui.x_w,
                x->x_flashtime_hold, x->x_flashtime_break,
                iem_symargstoint(&x->x_gui.x_isa),
                srl[0], srl[1], srl[2],
                x->x_gui.x_ldx, x->x_gui.x_ldy,
                iem_fstyletoint(&x->x_gui.x_fsf), x->x_gui.x_fontsize,
                bflcol[0], bflcol[1], bflcol[2]);
    binbuf_addv(b, ";");
}

void bng_check_minmax(t_bng *x, int ftbreak, int fthold)
{
    if(ftbreak > fthold)
    {
        int h;

        h = ftbreak;
        ftbreak = fthold;
        fthold = h;
    }
    if(ftbreak < IEM_BNG_MINBREAKFLASHTIME)
        ftbreak = IEM_BNG_MINBREAKFLASHTIME;
    if(fthold < IEM_BNG_MINHOLDFLASHTIME)
        fthold = IEM_BNG_MINHOLDFLASHTIME;
    x->x_flashtime_break = ftbreak;
    x->x_flashtime_hold = fthold;
}

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

    iemgui_properties(&x->x_gui, srl);
Miller Puckette's avatar
Miller Puckette committed
522
    sprintf(buf, "pdtk_iemgui_dialog %%s |bang| \
Miller Puckette's avatar
Miller Puckette committed
523
524
525
            ----------dimensions(pix):----------- %d %d size: 0 0 empty \
            --------flash-time(ms)(ms):--------- %d intrrpt: %d hold: %d \
            %d empty empty %d %d empty %d \
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
526
527
            {%s} {%s} \
            {%s} %d %d \
Miller Puckette's avatar
Miller Puckette committed
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
            %d %d \
            %d %d %d\n",
            x->x_gui.x_w, IEM_GUI_MINSIZE,
            x->x_flashtime_break, x->x_flashtime_hold, 2,/*min_max_schedule+clip*/
            -1, x->x_gui.x_isa.x_loadinit, -1, -1,/*no linlog, no multi*/
            srl[0]->s_name, srl[1]->s_name,
            srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy,
            x->x_gui.x_fsf.x_font_style, x->x_gui.x_fontsize,
            0xffffff & x->x_gui.x_bcol, 0xffffff & x->x_gui.x_fcol, 0xffffff & x->x_gui.x_lcol);
    gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf);
}

static void bng_set(t_bng *x)
{
    if(x->x_flashed)
    {
        x->x_flashed = 0;
        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
        clock_delay(x->x_clock_brk, x->x_flashtime_break);
        x->x_flashed = 1;
    }
    else
    {
        x->x_flashed = 1;
        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
    }
    clock_delay(x->x_clock_hld, x->x_flashtime_hold);
}

static void bng_bout1(t_bng *x)/*wird nur mehr gesendet, wenn snd != rcv*/
{
    if(!x->x_gui.x_fsf.x_put_in2out)
    {
        x->x_gui.x_isa.x_locked = 1;
        clock_delay(x->x_clock_lck, 2);
    }
    outlet_bang(x->x_gui.x_obj.ob_outlet);
565
566
    if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing &&
        x->x_gui.x_fsf.x_put_in2out)
Miller Puckette's avatar
Miller Puckette committed
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
        pd_bang(x->x_gui.x_snd->s_thing);
}

static void bng_bout2(t_bng *x)/*wird immer gesendet, wenn moeglich*/
{
    if(!x->x_gui.x_fsf.x_put_in2out)
    {
        x->x_gui.x_isa.x_locked = 1;
        clock_delay(x->x_clock_lck, 2);
    }
    outlet_bang(x->x_gui.x_obj.ob_outlet);
    if(x->x_gui.x_fsf.x_snd_able && x->x_gui.x_snd->s_thing)
        pd_bang(x->x_gui.x_snd->s_thing);
}

static void bng_bang(t_bng *x)/*wird nur mehr gesendet, wenn snd != rcv*/
{
    if(!x->x_gui.x_isa.x_locked)
    {
        bng_set(x);
        bng_bout1(x);
    }
}

static void bng_bang2(t_bng *x)/*wird immer gesendet, wenn moeglich*/
{
    if(!x->x_gui.x_isa.x_locked)
    {
        bng_set(x);
        bng_bout2(x);
    }
}

static void bng_dialog(t_bng *x, t_symbol *s, int argc, t_atom *argv)
{
602
    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
603

Miller Puckette's avatar
Miller Puckette committed
604
605
606
607
608
609
610
611
612
613
614
    t_symbol *srl[3];
    int a = (int)atom_getintarg(0, argc, argv);
    int fthold = (int)atom_getintarg(2, argc, argv);
    int ftbreak = (int)atom_getintarg(3, argc, argv);
    int sr_flags = iemgui_dialog(&x->x_gui, srl, argc, argv);

    x->x_gui.x_w = iemgui_clip_size(a);
    x->x_gui.x_h = x->x_gui.x_w;
    bng_check_minmax(x, ftbreak, fthold);
    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_IO + sr_flags);
615
616
    //(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
    //canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x);
617
    iemgui_shouldvis((void *)x, &x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
618

619
620
621
622
623
    /* forcing redraw of the scale handle */
    if (x->x_gui.x_fsf.x_selected)
    {
        bng_draw_select(x, x->x_gui.x_glist);
    }
624

625
626
    //ico@bukvic.net 100518 update scrollbars when object potentially
    //exceeds window size
627
    t_canvas *canvas=(t_canvas *)glist_getcanvas(x->x_gui.x_glist);
628
    sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", (long unsigned int)canvas);
Miller Puckette's avatar
Miller Puckette committed
629
630
}

631
632
static void bng_click(t_bng *x, t_floatarg xpos, t_floatarg ypos,
    t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
Miller Puckette's avatar
Miller Puckette committed
633
634
635
636
637
{
    bng_set(x);
    bng_bout2(x);
}

638
639
static int bng_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix,
    int shift, int alt, int dbl, int doit)
Miller Puckette's avatar
Miller Puckette committed
640
641
{
    if(doit)
642
643
        bng_click((t_bng *)z, (t_floatarg)xpix, (t_floatarg)ypix,
            (t_floatarg)shift, 0, (t_floatarg)alt);
Miller Puckette's avatar
Miller Puckette committed
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
    return (1);
}

static void bng_float(t_bng *x, t_floatarg f)
{bng_bang2(x);}

static void bng_symbol(t_bng *x, t_symbol *s)
{bng_bang2(x);}

static void bng_pointer(t_bng *x, t_gpointer *gp)
{bng_bang2(x);}

static void bng_list(t_bng *x, t_symbol *s, int ac, t_atom *av)
{
    bng_bang2(x);
}

static void bng_anything(t_bng *x, t_symbol *s, int argc, t_atom *argv)
{bng_bang2(x);}

static void bng_loadbang(t_bng *x)
{
    if(!sys_noloadbang && x->x_gui.x_isa.x_loadinit)
    {
        bng_set(x);
        bng_bout2(x);
    }
}

static void bng_size(t_bng *x, t_symbol *s, int ac, t_atom *av)
{
    x->x_gui.x_w = iemgui_clip_size((int)atom_getintarg(0, ac, av));
    x->x_gui.x_h = x->x_gui.x_w;
    iemgui_size((void *)x, &x->x_gui);
}

static void bng_delta(t_bng *x, t_symbol *s, int ac, t_atom *av)
{iemgui_delta((void *)x, &x->x_gui, s, ac, av);}

static void bng_pos(t_bng *x, t_symbol *s, int ac, t_atom *av)
{iemgui_pos((void *)x, &x->x_gui, s, ac, av);}

static void bng_flashtime(t_bng *x, t_symbol *s, int ac, t_atom *av)
{
    bng_check_minmax(x, (int)atom_getintarg(0, ac, av),
                     (int)atom_getintarg(1, ac, av));
}

static void bng_color(t_bng *x, t_symbol *s, int ac, t_atom *av)
{iemgui_color((void *)x, &x->x_gui, s, ac, av);}

static void bng_send(t_bng *x, t_symbol *s)
{iemgui_send(x, &x->x_gui, s);}

static void bng_receive(t_bng *x, t_symbol *s)
{iemgui_receive(x, &x->x_gui, s);}

static void bng_label(t_bng *x, t_symbol *s)
{iemgui_label((void *)x, &x->x_gui, s);}

static void bng_label_pos(t_bng *x, t_symbol *s, int ac, t_atom *av)
{iemgui_label_pos((void *)x, &x->x_gui, s, ac, av);}

static void bng_label_font(t_bng *x, t_symbol *s, int ac, t_atom *av)
{iemgui_label_font((void *)x, &x->x_gui, s, ac, av);}

static void bng_init(t_bng *x, t_floatarg f)
{
    x->x_gui.x_isa.x_loadinit = (f==0.0)?0:1;
}

static void bng_tick_hld(t_bng *x)
{
    x->x_flashed = 0;
    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
}

static void bng_tick_brk(t_bng *x)
{
    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
}

static void bng_tick_lck(t_bng *x)
{
    x->x_gui.x_isa.x_locked = 0;
}

static void *bng_new(t_symbol *s, int argc, t_atom *argv)
{
    t_bng *x = (t_bng *)pd_new(bng_class);
    int bflcol[]={-262144, -1, -1};
    int a=IEM_GUI_DEFAULTSIZE;
    int ldx=17, ldy=7;
    int fs=10;
    int ftbreak=IEM_BNG_DEFAULTBREAKFLASHTIME,
        fthold=IEM_BNG_DEFAULTHOLDFLASHTIME;

    iem_inttosymargs(&x->x_gui.x_isa, 0);
    iem_inttofstyle(&x->x_gui.x_fsf, 0);

    if((argc == 14)&&IS_A_FLOAT(argv,0)
       &&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,2)
       &&IS_A_FLOAT(argv,3)
       &&(IS_A_SYMBOL(argv,4)||IS_A_FLOAT(argv,4))
       &&(IS_A_SYMBOL(argv,5)||IS_A_FLOAT(argv,5))
       &&(IS_A_SYMBOL(argv,6)||IS_A_FLOAT(argv,6))
       &&IS_A_FLOAT(argv,7)&&IS_A_FLOAT(argv,8)
       &&IS_A_FLOAT(argv,9)&&IS_A_FLOAT(argv,10)&&IS_A_FLOAT(argv,11)
       &&IS_A_FLOAT(argv,12)&&IS_A_FLOAT(argv,13))
    {

        a = (int)atom_getintarg(0, argc, argv);
        fthold = (int)atom_getintarg(1, argc, argv);
        ftbreak = (int)atom_getintarg(2, argc, argv);
        iem_inttosymargs(&x->x_gui.x_isa, atom_getintarg(3, argc, argv));
        iemgui_new_getnames(&x->x_gui, 4, argv);
        ldx = (int)atom_getintarg(7, argc, argv);
        ldy = (int)atom_getintarg(8, argc, argv);
        iem_inttofstyle(&x->x_gui.x_fsf, atom_getintarg(9, argc, argv));
        fs = (int)atom_getintarg(10, argc, argv);
        bflcol[0] = (int)atom_getintarg(11, argc, argv);
        bflcol[1] = (int)atom_getintarg(12, argc, argv);
        bflcol[2] = (int)atom_getintarg(13, argc, argv);
    }
    else iemgui_new_getnames(&x->x_gui, 4, 0);

    x->x_gui.x_draw = (t_iemfunptr)bng_draw;

    x->x_gui.x_fsf.x_snd_able = 1;
    x->x_gui.x_fsf.x_rcv_able = 1;
    x->x_flashed = 0;
    x->x_gui.x_glist = (t_glist *)canvas_getcurrent();
    if (!strcmp(x->x_gui.x_snd->s_name, "empty"))
        x->x_gui.x_fsf.x_snd_able = 0;
    if (!strcmp(x->x_gui.x_rcv->s_name, "empty"))
        x->x_gui.x_fsf.x_rcv_able = 0;
780
781
782
783
784
785
786
787
788
    if (x->x_gui.x_fsf.x_font_style == 1)
        strcpy(x->x_gui.x_font, "helvetica");
    else if (x->x_gui.x_fsf.x_font_style == 2)
        strcpy(x->x_gui.x_font, "times");
    else
    {
        x->x_gui.x_fsf.x_font_style = 0;
        strcpy(x->x_gui.x_font, sys_font);
    }
Miller Puckette's avatar
Miller Puckette committed
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807

    if (x->x_gui.x_fsf.x_rcv_able)
        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;
    x->x_gui.x_w = iemgui_clip_size(a);
    x->x_gui.x_h = x->x_gui.x_w;
    bng_check_minmax(x, ftbreak, fthold);
    iemgui_all_colfromload(&x->x_gui, bflcol);
    x->x_gui.x_isa.x_locked = 0;
    iemgui_verify_snd_ne_rcv(&x->x_gui);
    x->x_clock_hld = clock_new(x, (t_method)bng_tick_hld);
    x->x_clock_brk = clock_new(x, (t_method)bng_tick_brk);
    x->x_clock_lck = clock_new(x, (t_method)bng_tick_lck);
    outlet_new(&x->x_gui.x_obj, &s_bang);
808

809
810
    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);
811
812
    x->x_gui.x_obj.te_iemgui = 1;
    x->x_gui.x_changed = 0;
813

Miller Puckette's avatar
Miller Puckette committed
814
815
816
817
818
819
820
821
822
823
824
    return (x);
}

static void bng_ff(t_bng *x)
{
    if(x->x_gui.x_fsf.x_rcv_able)
        pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
    clock_free(x->x_clock_lck);
    clock_free(x->x_clock_brk);
    clock_free(x->x_clock_hld);
    gfxstub_deleteforkey(x);
825

826
827
    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
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
}

void g_bang_setup(void)
{
    bng_class = class_new(gensym("bng"), (t_newmethod)bng_new,
                          (t_method)bng_ff, sizeof(t_bng), 0, A_GIMME, 0);
    class_addbang(bng_class, bng_bang);
    class_addfloat(bng_class, bng_float);
    class_addsymbol(bng_class, bng_symbol);
    class_addpointer(bng_class, bng_pointer);
    class_addlist(bng_class, bng_list);
    class_addanything(bng_class, bng_anything);
    class_addmethod(bng_class, (t_method)bng_click, gensym("click"),
                    A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
    class_addmethod(bng_class, (t_method)bng_dialog, gensym("dialog"),
                    A_GIMME, 0);
    class_addmethod(bng_class, (t_method)bng_loadbang, gensym("loadbang"), 0);
    class_addmethod(bng_class, (t_method)bng_size, gensym("size"), A_GIMME, 0);
846
847
    class_addmethod(bng_class, (t_method)bng_delta, gensym("delta"),
        A_GIMME, 0);
Miller Puckette's avatar
Miller Puckette committed
848
    class_addmethod(bng_class, (t_method)bng_pos, gensym("pos"), A_GIMME, 0);
849
850
851
852
    class_addmethod(bng_class, (t_method)bng_flashtime, gensym("flashtime"),
        A_GIMME, 0);
    class_addmethod(bng_class, (t_method)bng_color, gensym("color"),
        A_GIMME, 0);
Miller Puckette's avatar
Miller Puckette committed
853
    class_addmethod(bng_class, (t_method)bng_send, gensym("send"), A_DEFSYM, 0);
854
855
856
857
858
859
860
861
    class_addmethod(bng_class, (t_method)bng_receive, gensym("receive"),
        A_DEFSYM, 0);
    class_addmethod(bng_class, (t_method)bng_label, gensym("label"),
        A_DEFSYM, 0);
    class_addmethod(bng_class, (t_method)bng_label_pos, gensym("label_pos"),
        A_GIMME, 0);
    class_addmethod(bng_class, (t_method)bng_label_font, gensym("label_font"),
        A_GIMME, 0);
Miller Puckette's avatar
Miller Puckette committed
862
    class_addmethod(bng_class, (t_method)bng_init, gensym("init"), A_FLOAT, 0);
863
864
 
    scalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
865
                  sizeof(t_scalehandle), CLASS_PD, 0);
866
    class_addmethod(scalehandle_class, (t_method)bng__clickhook,
867
            gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
868
    class_addmethod(scalehandle_class, (t_method)bng__motionhook,
869
            gensym("_motion"), A_FLOAT, A_FLOAT, 0);
870

Miller Puckette's avatar
Miller Puckette committed
871
872
873
874
875
876
877
    bng_widgetbehavior.w_getrectfn = bng_getrect;
    bng_widgetbehavior.w_displacefn = iemgui_displace;
    bng_widgetbehavior.w_selectfn = iemgui_select;
    bng_widgetbehavior.w_activatefn = NULL;
    bng_widgetbehavior.w_deletefn = iemgui_delete;
    bng_widgetbehavior.w_visfn = iemgui_vis;
    bng_widgetbehavior.w_clickfn = bng_newclick;
878
    bng_widgetbehavior.w_displacefnwtag = iemgui_displace_withtag;
Miller Puckette's avatar
Miller Puckette committed
879
880
881
882
883
    class_setwidget(bng_class, &bng_widgetbehavior);
    class_sethelpsymbol(bng_class, gensym("bng"));
    class_setsavefn(bng_class, bng_save);
    class_setpropertiesfn(bng_class, bng_properties);
}