Newer
Older
/* 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 <ctype.h>
#include "m_pd.h"
#include "g_canvas.h"
#include "t_tk.h"
#include "g_all_guis.h"
#include <math.h>
#ifdef HAVE_IO_H
#include <io.h>
#endif
Mathieu L Bouchard
committed
t_symbol *s_empty;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
106
107
108
109
110
111
112
113
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/* #define GGEE_HSLIDER_COMPATIBLE */
/*------------------ global varaibles -------------------------*/
int iemgui_color_hex[]=
{
16579836, 10526880, 4210752, 16572640, 16572608,
16579784, 14220504, 14220540, 14476540, 16308476,
14737632, 8158332, 2105376, 16525352, 16559172,
15263784, 1370132, 2684148, 3952892, 16003312,
12369084, 6316128, 0, 9177096, 5779456,
7874580, 2641940, 17488, 5256, 5767248
};
int iemgui_vu_db2i[]=
{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
9, 9, 9, 9, 9,10,10,10,10,10,
11,11,11,11,11,12,12,12,12,12,
13,13,13,13,14,14,14,14,15,15,
15,15,16,16,16,16,17,17,17,18,
18,18,19,19,19,20,20,20,21,21,
22,22,23,23,24,24,25,26,27,28,
29,30,31,32,33,33,34,34,35,35,
36,36,37,37,37,38,38,38,39,39,
39,39,39,39,40,40
};
int iemgui_vu_col[]=
{
0,17,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
15,15,15,15,15,15,15,15,15,15,14,14,13,13,13,13,13,13,13,13,13,13,13,19,19,19
};
char *iemgui_vu_scale_str[]=
{
"",
"<-99",
"",
"",
"",
"-50",
"",
"",
"",
"-30",
"",
"",
"",
"-20",
"",
"",
"",
"-12",
"",
"",
"",
"-6",
"",
"",
"",
"-2",
"",
"",
"",
"-0dB",
"",
"",
"",
"+2",
"",
"",
"",
"+6",
"",
"",
"",
">+12",
"",
"",
"",
"",
"",
};
/*------------------ global functions -------------------------*/
int iemgui_clip_size(int size)
{
if(size < IEM_GUI_MINSIZE)
size = IEM_GUI_MINSIZE;
return(size);
}
int iemgui_clip_font(int size)
{
if(size < IEM_FONT_MINSIZE)
size = IEM_FONT_MINSIZE;
return(size);
}
int iemgui_modulo_color(int col)
{
while(col >= IEM_GUI_MAX_COLOR)
col -= IEM_GUI_MAX_COLOR;
while(col < 0)
col += IEM_GUI_MAX_COLOR;
return(col);
}
t_symbol *iemgui_dollar2raute(t_symbol *s)
{
char buf[MAXPDSTRING+1], *s1, *s2;
if (strlen(s->s_name) >= MAXPDSTRING)
return (s);
for (s1 = s->s_name, s2 = buf; ; s1++, s2++)
{
if (*s1 == '$')
*s2 = '#';
else if (!(*s2 = *s1))
break;
}
return(gensym(buf));
}
t_symbol *iemgui_raute2dollar(t_symbol *s)
{
char buf[MAXPDSTRING+1], *s1, *s2;
if (strlen(s->s_name) >= MAXPDSTRING)
return (s);
for (s1 = s->s_name, s2 = buf; ; s1++, s2++)
{
if (*s1 == '#')
*s2 = '$';
else if (!(*s2 = *s1))
break;
}
return(gensym(buf));
}
void iemgui_verify_snd_ne_rcv(t_iemgui *iemgui)
{
Mathieu L Bouchard
committed
iemgui->x_put_in2out = 1;
if(iemgui_has_snd(iemgui) && iemgui_has_rcv(iemgui))
Mathieu L Bouchard
committed
if(iemgui->x_snd==iemgui->x_rcv)
iemgui->x_put_in2out = 0;
}
}
t_symbol *iemgui_new_dogetname(t_iemgui *iemgui, int indx, t_atom *argv)
{
if (IS_A_SYMBOL(argv, indx))
return (atom_getsymbolarg(indx, 100000, argv));
else if (IS_A_FLOAT(argv, indx))
{
char str[80];
sprintf(str, "%d", (int)atom_getintarg(indx, 100000, argv));
return (gensym(str));
}
Mathieu L Bouchard
committed
else return s_empty;
}
void iemgui_new_getnames(t_iemgui *iemgui, int indx, t_atom *argv)
{
if (argv)
{
iemgui->x_snd = iemgui_new_dogetname(iemgui, indx, argv);
iemgui->x_rcv = iemgui_new_dogetname(iemgui, indx+1, argv);
iemgui->x_lab = iemgui_new_dogetname(iemgui, indx+2, argv);
}
Mathieu L Bouchard
committed
else iemgui->x_snd = iemgui->x_rcv = iemgui->x_lab = s_empty;
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
iemgui->x_snd_unexpanded = iemgui->x_rcv_unexpanded =
iemgui->x_lab_unexpanded = 0;
iemgui->x_binbufindex = indx;
iemgui->x_labelbindex = indx + 3;
}
/* convert symbols in "$" form to the expanded symbols */
void iemgui_all_dollararg2sym(t_iemgui *iemgui, t_symbol **srlsym)
{
/* save unexpanded ones for later */
iemgui->x_snd_unexpanded = srlsym[0];
iemgui->x_rcv_unexpanded = srlsym[1];
iemgui->x_lab_unexpanded = srlsym[2];
srlsym[0] = canvas_realizedollar(iemgui->x_glist, srlsym[0]);
srlsym[1] = canvas_realizedollar(iemgui->x_glist, srlsym[1]);
srlsym[2] = canvas_realizedollar(iemgui->x_glist, srlsym[2]);
}
/* initialize a single symbol in unexpanded form. We reach into the
binbuf to grab them; if there's nothing there, set it to the
fallback; if still nothing, set to "empty". */
static void iemgui_init_sym2dollararg(t_iemgui *iemgui, t_symbol **symp,
int indx, t_symbol *fallback)
{
if (!*symp)
{
t_binbuf *b = iemgui->x_obj.ob_binbuf;
if (binbuf_getnatom(b) > indx)
{
char buf[80];
atom_string(binbuf_getvec(b) + indx, buf, 80);
*symp = gensym(buf);
}
else if (fallback)
*symp = fallback;
Mathieu L Bouchard
committed
else *symp = s_empty;
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
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
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
}
}
/* get the unexpanded versions of the symbols; initialize them if
necessary. */
void iemgui_all_sym2dollararg(t_iemgui *iemgui, t_symbol **srlsym)
{
iemgui_init_sym2dollararg(iemgui, &iemgui->x_snd_unexpanded,
iemgui->x_binbufindex+1, iemgui->x_snd);
iemgui_init_sym2dollararg(iemgui, &iemgui->x_rcv_unexpanded,
iemgui->x_binbufindex+2, iemgui->x_rcv);
iemgui_init_sym2dollararg(iemgui, &iemgui->x_lab_unexpanded,
iemgui->x_labelbindex, iemgui->x_lab);
srlsym[0] = iemgui->x_snd_unexpanded;
srlsym[1] = iemgui->x_rcv_unexpanded;
srlsym[2] = iemgui->x_lab_unexpanded;
}
void iemgui_first_dollararg2sym(t_iemgui *iemgui, t_symbol **srlsym)
{
/* delete this function */
}
void iemgui_all_col2save(t_iemgui *iemgui, int *bflcol)
{
bflcol[0] = -1 - (((0xfc0000 & iemgui->x_bcol) >> 6)|
((0xfc00 & iemgui->x_bcol) >> 4)|((0xfc & iemgui->x_bcol) >> 2));
bflcol[1] = -1 - (((0xfc0000 & iemgui->x_fcol) >> 6)|
((0xfc00 & iemgui->x_fcol) >> 4)|((0xfc & iemgui->x_fcol) >> 2));
bflcol[2] = -1 - (((0xfc0000 & iemgui->x_lcol) >> 6)|
((0xfc00 & iemgui->x_lcol) >> 4)|((0xfc & iemgui->x_lcol) >> 2));
}
void iemgui_all_colfromload(t_iemgui *iemgui, int *bflcol)
{
if(bflcol[0] < 0)
{
bflcol[0] = -1 - bflcol[0];
iemgui->x_bcol = ((bflcol[0] & 0x3f000) << 6)|((bflcol[0] & 0xfc0) << 4)|
((bflcol[0] & 0x3f) << 2);
}
else
{
bflcol[0] = iemgui_modulo_color(bflcol[0]);
iemgui->x_bcol = iemgui_color_hex[bflcol[0]];
}
if(bflcol[1] < 0)
{
bflcol[1] = -1 - bflcol[1];
iemgui->x_fcol = ((bflcol[1] & 0x3f000) << 6)|((bflcol[1] & 0xfc0) << 4)|
((bflcol[1] & 0x3f) << 2);
}
else
{
bflcol[1] = iemgui_modulo_color(bflcol[1]);
iemgui->x_fcol = iemgui_color_hex[bflcol[1]];
}
if(bflcol[2] < 0)
{
bflcol[2] = -1 - bflcol[2];
iemgui->x_lcol = ((bflcol[2] & 0x3f000) << 6)|((bflcol[2] & 0xfc0) << 4)|
((bflcol[2] & 0x3f) << 2);
}
else
{
bflcol[2] = iemgui_modulo_color(bflcol[2]);
iemgui->x_lcol = iemgui_color_hex[bflcol[2]];
}
}
int iemgui_compatible_col(int i)
{
int j;
if(i >= 0)
{
j = iemgui_modulo_color(i);
return(iemgui_color_hex[(j)]);
}
else
return((-1 -i)&0xffffff);
}
void iemgui_all_dollar2raute(t_symbol **srlsym)
{
srlsym[0] = iemgui_dollar2raute(srlsym[0]);
srlsym[1] = iemgui_dollar2raute(srlsym[1]);
srlsym[2] = iemgui_dollar2raute(srlsym[2]);
}
void iemgui_all_raute2dollar(t_symbol **srlsym)
{
srlsym[0] = iemgui_raute2dollar(srlsym[0]);
srlsym[1] = iemgui_raute2dollar(srlsym[1]);
srlsym[2] = iemgui_raute2dollar(srlsym[2]);
}
Mathieu L Bouchard
committed
void iemgui_send(t_iemgui *x, t_symbol *s)
Mathieu L Bouchard
committed
int oldsndrcvable=0;
if(iemgui_has_rcv(x)) oldsndrcvable += IEM_GUI_OLD_RCV_FLAG;
if(iemgui_has_snd(x)) oldsndrcvable += IEM_GUI_OLD_SND_FLAG;
Mathieu L Bouchard
committed
x->x_snd_unexpanded = snd;
x->x_snd = snd = canvas_realizedollar(x->x_glist, snd);
iemgui_verify_snd_ne_rcv(x);
x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_IO + oldsndrcvable);
Mathieu L Bouchard
committed
void iemgui_receive(t_iemgui *x, t_symbol *s)
Mathieu L Bouchard
committed
int oldsndrcvable=0;
if(iemgui_has_rcv(x)) oldsndrcvable += IEM_GUI_OLD_RCV_FLAG;
if(iemgui_has_snd(x)) oldsndrcvable += IEM_GUI_OLD_SND_FLAG;
Mathieu L Bouchard
committed
x->x_rcv_unexpanded = rcv;
rcv = canvas_realizedollar(x->x_glist, rcv);
if(iemgui_has_rcv(x))
Mathieu L Bouchard
committed
if(rcv!=x->x_rcv)
Mathieu L Bouchard
committed
if(iemgui_has_rcv(x))
pd_unbind((t_pd *)x, x->x_rcv);
x->x_rcv = rcv;
pd_bind((t_pd *)x, x->x_rcv);
Mathieu L Bouchard
committed
else if(s!=s_empty && iemgui_has_rcv(x))
Mathieu L Bouchard
committed
pd_unbind((t_pd *)x, x->x_rcv);
x->x_rcv = rcv;
Mathieu L Bouchard
committed
iemgui_verify_snd_ne_rcv(x);
x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_IO + oldsndrcvable);
Mathieu L Bouchard
committed
void iemgui_label(t_iemgui *x, t_symbol *s)
Mathieu L Bouchard
committed
if (s == &s_) s = s_empty; //tb: fix for empty label
t_symbol *lab = iemgui_raute2dollar(s);
x->x_lab_unexpanded = lab;
x->x_lab = lab = canvas_realizedollar(x->x_glist, lab);
Mathieu L Bouchard
committed
if(glist_isvisible(x->x_glist))
sys_vgui(".x%lx.c itemconfigure %lxLABEL -text {%s} \n",
Mathieu L Bouchard
committed
glist_getcanvas(x->x_glist), x,
s!=s_empty?x->x_lab->s_name:"");
iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_CONFIG);
Mathieu L Bouchard
committed
void iemgui_label_pos(t_iemgui *x, t_symbol *s, int ac, t_atom *av)
Mathieu L Bouchard
committed
x->x_ldx = (int)atom_getintarg(0, ac, av);
x->x_ldy = (int)atom_getintarg(1, ac, av);
if(glist_isvisible(x->x_glist))
{
sys_vgui(".x%lx.c coords %lxLABEL %d %d\n",
Mathieu L Bouchard
committed
glist_getcanvas(x->x_glist), x,
text_xpix((t_object *)x,x->x_glist)+x->x_ldx,
text_ypix((t_object *)x,x->x_glist)+x->x_ldy);
iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_CONFIG);
Mathieu L Bouchard
committed
void iemgui_label_font(t_iemgui *x, t_symbol *s, int ac, t_atom *av)
Mathieu L Bouchard
committed
if (f<0 || f>2) f=0;
x->x_font_style = f;
f = (int)atom_getintarg(1, ac, av);
if(f < 4)
f = 4;
Mathieu L Bouchard
committed
x->x_fontsize = f;
if(glist_isvisible(x->x_glist))
sys_vgui(".x%lx.c itemconfigure %lxLABEL -font {{%s} -%d %s}\n",
Mathieu L Bouchard
committed
glist_getcanvas(x->x_glist), x, iemgui_font(x),
x->x_fontsize, sys_fontweight);
iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_CONFIG);
}
//Sans: 84 x 10 (14) -> 6 x 10 -> 1.0
//Helvetica: 70 x 10 (14) -> 5 x 10 -> 0.83333
//Times: 61 x 10 (14) -> 4.357 x 10 -> 0.72619; 0.735 appears to work better
// We use this global var to check when getrect should report label:
// It should report it when drawing inside gop to see if we truly fit.
// Otherwise we should not report it while inside gop to avoid label being
// misinterpreted as part of the "hot" area of a widget (e.g. toggle)
extern int gop_redraw;
void iemgui_label_getrect(t_iemgui x_gui, t_glist *x,
int *xp1, int *yp1, int *xp2, int *yp2)
{
//fprintf(stderr,"gop_redraw = %d\n", gop_redraw);
if (!gop_redraw)
{
//fprintf(stderr,"ignoring label\n");
}
t_float width_multiplier;
int label_x1;
int label_y1;
int label_x2;
int label_y2;
int actual_fontsize; //seems tk does its own thing when rendering
int actual_height;
if (x->gl_isgraph && !glist_istoplevel(x))
{
//fprintf(stderr,"iemgui_label_getrect\n");
Mathieu L Bouchard
committed
if (x_gui.x_lab!=s_empty)
Mathieu L Bouchard
committed
switch(x_gui.x_font_style)
{
case 1:
width_multiplier = 0.83333;
break;
case 2:
width_multiplier = 0.735;
break;
default:
width_multiplier = 1.0;
break;
}
if (x_gui.x_fontsize % 2 == 0)
{
actual_fontsize = x_gui.x_fontsize;
}
else
{
actual_fontsize = x_gui.x_fontsize;
}
actual_height = actual_fontsize;
Mathieu L Bouchard
committed
if (x_gui.x_font_style == 0 &&
(actual_fontsize == 8 || actual_fontsize == 13 ||
actual_fontsize % 10 == 1 || actual_fontsize % 10 == 6 ||
(actual_fontsize > 48 && actual_fontsize < 100 &&
(actual_fontsize %10 == 4 || actual_fontsize %10 == 9))))
{
actual_fontsize += 1;
}
Mathieu L Bouchard
committed
else if (x_gui.x_font_style == 1 && actual_fontsize >= 5 &&
actual_fontsize < 13 && actual_fontsize % 2 == 1)
actual_fontsize += 1;
Mathieu L Bouchard
committed
else if (x_gui.x_font_style == 2 && actual_fontsize >= 5 &&
actual_fontsize % 2 == 1)
actual_fontsize += 1;
if (actual_height == 9)
actual_height += 1;
//done with exceptions
width_multiplier = width_multiplier * (actual_fontsize * 0.6);
label_length = strlen(x_gui.x_lab->s_name);
label_x1 = *xp1 + x_gui.x_ldx;
label_y1 = *yp1 + x_gui.x_ldy - actual_height/2;
label_x2 = label_x1 + (label_length * width_multiplier);
label_y2 = label_y1 + actual_height*1.1;
//DEBUG
//fprintf(stderr,"%f %d %d\n", width_multiplier,
Mathieu L Bouchard
committed
// label_length, x_gui.x_font_style);
//sys_vgui(".x%lx.c delete iemguiDEBUG\n", x);
//sys_vgui(".x%lx.c create rectangle %d %d %d %d "
// "-tags iemguiDEBUG\n",
// x, label_x1, label_y1, label_x2, label_y2);
if (label_x1 < *xp1) *xp1 = label_x1;
if (label_x2 > *xp2) *xp2 = label_x2;
if (label_y1 < *yp1) *yp1 = label_y1;
if (label_y2 > *yp2) *yp2 = label_y2;
//DEBUG
//sys_vgui(".x%lx.c delete iemguiDEBUG\n", x);
//sys_vgui(".x%lx.c create rectangle %d %d %d %d "
// "-tags iemguiDEBUG\n", x, *xp1, *yp1, *xp2, *yp2);
}
}
}
Mathieu L Bouchard
committed
void iemgui_shouldvis(t_iemgui *x, int mode)
{
gop_redraw = 1;
Mathieu L Bouchard
committed
if(gobj_shouldvis((t_gobj *)x, x->x_glist))
Mathieu L Bouchard
committed
if (!x->x_vis)
{
//fprintf(stderr,"draw new %d\n", mode);
Mathieu L Bouchard
committed
x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_NEW);
canvas_fixlinesfor(glist_getcanvas(x->x_glist), (t_text*)x);
x->x_vis = 1;
if (x->x_glist != glist_getcanvas(x->x_glist))
{
/* if we are inside gop and just have had our object's
properties changed we'll adjust our layer position
to ensure that ordering is honored */
Mathieu L Bouchard
committed
t_canvas *canvas = glist_getcanvas(x->x_glist);
t_gobj *y = (t_gobj *)x->x_glist;
562
563
564
565
566
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
gobj_vis(y, canvas, 0);
gobj_vis(y, canvas, 1);
// reorder it visually
glist_redraw(canvas);
/*
// some day when the object tagging is
// properly done for all GUI objects
glist_noselect(canvas);
glist_select(canvas, y);
t_gobj *yy = canvas->gl_list;
if (yy != y)
{
fprintf(stderr,"not bottom\n");
while (yy && yy->g_next != y)
{
fprintf(stderr,"+\n");
yy = yy->g_next;
}
// now we have yy which is right before our y graph
t_object *ob = NULL;
t_rtext *yr = NULL;
if (yy)
{
yr = glist_findrtext(canvas, (t_text *)yy);
}
if (yr)
{
fprintf(stderr,"lower\n");
sys_vgui(".x%lx.c lower selected %s\n",
canvas, rtext_gettag(yr));
sys_vgui(".x%lx.c raise selected %s\n",
canvas, rtext_gettag(yr));
//sys_vgui(".x%lx.c raise all_cords\n", canvas);
else
{
// fall back to legacy redraw for objects
// that are not patchable
fprintf(stderr,"lower fallback redraw\n");
canvas_redraw(canvas);
}
}
else
{
// we get here if we are supposed to go
// all the way to the bottom
fprintf(stderr,"lower to the bottom\n");
sys_vgui(".x%lx.c lower selected\n", canvas);
}
glist_noselect(canvas);
*/
}
}
Mathieu L Bouchard
committed
//fprintf(stderr,"draw move x->x_w=%d\n", x->x_w);
x->x_draw(x, x->x_glist, mode);
canvas_fixlinesfor(glist_getcanvas(x->x_glist), (t_text*)x);
Mathieu L Bouchard
committed
else if (x->x_vis)
{
//fprintf(stderr,"draw erase %d\n", mode);
Mathieu L Bouchard
committed
x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_ERASE);
x->x_vis = 0;
}
gop_redraw = 0;
Mathieu L Bouchard
committed
void iemgui_size(t_iemgui *x)
Mathieu L Bouchard
committed
if(glist_isvisible(x->x_glist))
iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_MOVE);
Mathieu L Bouchard
committed
void iemgui_delta(t_iemgui *x, t_symbol *s, int ac, t_atom *av)
Mathieu L Bouchard
committed
x->x_obj.te_xpix += (int)atom_getintarg(0, ac, av);
x->x_obj.te_ypix += (int)atom_getintarg(1, ac, av);
if(glist_isvisible(x->x_glist))
Mathieu L Bouchard
committed
iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_MOVE);
Mathieu L Bouchard
committed
void iemgui_pos(t_iemgui *x, t_symbol *s, int ac, t_atom *av)
Mathieu L Bouchard
committed
x->x_obj.te_xpix = (int)atom_getintarg(0, ac, av);
x->x_obj.te_ypix = (int)atom_getintarg(1, ac, av);
if(glist_isvisible(x->x_glist))
iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_MOVE);
Mathieu L Bouchard
committed
void iemgui_color(t_iemgui *x, t_symbol *s, int ac, t_atom *av)
Mathieu L Bouchard
committed
x->x_bcol = iemgui_compatible_col(atom_getintarg(0, ac, av));
Mathieu L Bouchard
committed
x->x_fcol = iemgui_compatible_col(atom_getintarg(1, ac, av));
x->x_lcol = iemgui_compatible_col(atom_getintarg(2, ac, av));
Mathieu L Bouchard
committed
x->x_lcol = iemgui_compatible_col(atom_getintarg(1, ac, av));
if(glist_isvisible(x->x_glist))
x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_CONFIG);
}
void iemgui_displace(t_gobj *z, t_glist *glist, int dx, int dy)
{
Mathieu L Bouchard
committed
t_iemgui *x = (t_iemgui *)z;
x->x_obj.te_xpix += dx;
x->x_obj.te_ypix += dy;
iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_MOVE);
void iemgui_displace_withtag(t_gobj *z, t_glist *glist, int dx, int dy)
{
Mathieu L Bouchard
committed
t_iemgui *x = (t_iemgui *)z;
x->x_obj.te_xpix += dx;
x->x_obj.te_ypix += dy;
//(*x->x_gui.x_draw)((void *)z, glist, IEM_GUI_DRAW_MODE_MOVE);
canvas_fixlinesfor(glist_getcanvas(glist), (t_text *)z);
}
void iemgui_select(t_gobj *z, t_glist *glist, int selected)
{
Mathieu L Bouchard
committed
t_iemgui *x = (t_iemgui *)z;
Mathieu L Bouchard
committed
x->x_selected = selected;
(*x->x_draw)((void *)z, glist, IEM_GUI_DRAW_MODE_SELECT);
}
void iemgui_delete(t_gobj *z, t_glist *glist)
{
canvas_deletelinesfor(glist, (t_text *)z);
}
void iemgui_vis(t_gobj *z, t_glist *glist, int vis)
{
Mathieu L Bouchard
committed
t_iemgui *x = (t_iemgui *)z;
if (gobj_shouldvis(z, glist))
{
if (vis)
{
Mathieu L Bouchard
committed
(*x->x_draw)((void *)z, glist, IEM_GUI_DRAW_MODE_NEW);
x->x_vis = 1;
}
else
{
Mathieu L Bouchard
committed
(*x->x_draw)((void *)z, glist, IEM_GUI_DRAW_MODE_ERASE);
sys_unqueuegui(z);
Mathieu L Bouchard
committed
x->x_vis = 0;
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
}
void iemgui_save(t_iemgui *iemgui, t_symbol **srl, int *bflcol)
{
srl[0] = iemgui->x_snd;
srl[1] = iemgui->x_rcv;
srl[2] = iemgui->x_lab;
iemgui_all_sym2dollararg(iemgui, srl);
iemgui_all_col2save(iemgui, bflcol);
}
void iemgui_properties(t_iemgui *iemgui, t_symbol **srl)
{
srl[0] = iemgui->x_snd;
srl[1] = iemgui->x_rcv;
srl[2] = iemgui->x_lab;
iemgui_all_sym2dollararg(iemgui, srl);
iemgui_all_dollar2raute(srl);
}
int iemgui_dialog(t_iemgui *iemgui, t_symbol **srl, int argc, t_atom *argv)
{
char str[144];
int init = (int)atom_getintarg(5, argc, argv);
int ldx = (int)atom_getintarg(10, argc, argv);
int ldy = (int)atom_getintarg(11, argc, argv);
int f = (int)atom_getintarg(12, argc, argv);
int fs = (int)atom_getintarg(13, argc, argv);
int bcol = (int)atom_getintarg(14, argc, argv);
int fcol = (int)atom_getintarg(15, argc, argv);
int lcol = (int)atom_getintarg(16, argc, argv);
Mathieu L Bouchard
committed
int rcvable=1, oldsndrcvable=0;
Mathieu L Bouchard
committed
if(iemgui_has_rcv(iemgui))
Mathieu L Bouchard
committed
if(iemgui_has_snd(iemgui))
oldsndrcvable += IEM_GUI_OLD_SND_FLAG;
if(IS_A_SYMBOL(argv,7))
srl[0] = atom_getsymbolarg(7, argc, argv);
else if(IS_A_FLOAT(argv,7))
{
sprintf(str, "%d", (int)atom_getintarg(7, argc, argv));
srl[0] = gensym(str);
}
if(IS_A_SYMBOL(argv,8))
srl[1] = atom_getsymbolarg(8, argc, argv);
else if(IS_A_FLOAT(argv,8))
{
sprintf(str, "%d", (int)atom_getintarg(8, argc, argv));
srl[1] = gensym(str);
}
if(IS_A_SYMBOL(argv,9))
srl[2] = atom_getsymbolarg(9, argc, argv);
else if(IS_A_FLOAT(argv,9))
{
sprintf(str, "%d", (int)atom_getintarg(9, argc, argv));
srl[2] = gensym(str);
}
if(init != 0) init = 1;
Mathieu L Bouchard
committed
iemgui->x_loadinit = init;
iemgui_all_raute2dollar(srl);
iemgui_all_dollararg2sym(iemgui, srl);
if(rcvable)
{
Mathieu L Bouchard
committed
if(srl[1]!=iemgui->x_rcv)
Mathieu L Bouchard
committed
if(iemgui_has_rcv(iemgui))
pd_unbind(&iemgui->x_obj.ob_pd, iemgui->x_rcv);
iemgui->x_rcv = srl[1];
pd_bind(&iemgui->x_obj.ob_pd, iemgui->x_rcv);
}
}
Mathieu L Bouchard
committed
else if(!rcvable && iemgui_has_rcv(iemgui))
{
pd_unbind(&iemgui->x_obj.ob_pd, iemgui->x_rcv);
iemgui->x_rcv = srl[1];
}
iemgui->x_snd = srl[0];
iemgui->x_lcol = lcol & 0xffffff;
iemgui->x_fcol = fcol & 0xffffff;
iemgui->x_bcol = bcol & 0xffffff;
iemgui->x_lab = srl[2];
iemgui->x_ldx = ldx;
iemgui->x_ldy = ldy;
Mathieu L Bouchard
committed
if(f<0 || f>2) f=0;
iemgui->x_font_style = f;
if(fs < 4)
fs = 4;
iemgui->x_fontsize = fs;
iemgui_verify_snd_ne_rcv(iemgui);
Mathieu L Bouchard
committed
void iem_inttosymargs(t_iemgui *x, int n)
Mathieu L Bouchard
committed
x->x_loadinit = (n >> 0);
x->x_scale = (n >> 20);
x->x_flashed = 0;
x->x_locked = 0;
x->x_reverse = 0;
Mathieu L Bouchard
committed
int iem_symargstoint(t_iemgui *x)
Mathieu L Bouchard
committed
(((x->x_loadinit & 1) << 0) |
((x->x_scale & 1) << 20)));
Mathieu L Bouchard
committed
void iem_inttofstyle(t_iemgui *x, int n)
Mathieu L Bouchard
committed
x->x_font_style = (n >> 0);
x->x_selected = 0;
x->x_finemoved = 0;
x->x_put_in2out = 0;
x->x_change = 0;
x->x_thick = 0;
x->x_lin0_log1 = 0;
x->x_steady = 0;
}
int iem_fstyletoint(t_iemgui *x)
Mathieu L Bouchard
committed
return ((x->x_font_style << 0) & 63);
char *iem_get_tag(t_canvas *glist, t_iemgui *iem_obj)
{
t_gobj *y = (t_gobj *)iem_obj;
t_object *ob = pd_checkobject(&y->g_pd);
/* GOP objects are unable to call findrtext
triggering consistency check error */
t_rtext *yyyy = NULL;
if (!glist->gl_isgraph || glist_istoplevel(glist))
yyyy = glist_findrtext(glist_getcanvas(glist), (t_text *)&ob->ob_g);
/* on GOP we cause segfault as text_gettag() returns bogus data */
if (yyyy) return(rtext_gettag(yyyy));
else return("bogus");
//----------------------------------------------------------------
Mathieu L Bouchard
committed
// SCALEHANDLE COMMON CODE (by Mathieu, refactored from existing code)
extern int gfxstub_haveproperties(void *key);
int mini(int a, int b) {return a<b?a:b;}
int maxi(int a, int b) {return a>b?a:b;}
// in all 20 cases :
// [bng], [tgl], [hradio], [vradio], [hsl], [vsl], [cnv], [nbx], [vu]
// for both scale & label, plus canvas' scale & move.
void scalehandle_bind(t_scalehandle *h) {
sys_vgui("bind %s <Button> {pd [concat %s _click 1 %%x %%y \\;]}\n",
h->h_pathname, h->h_bindsym->s_name);
sys_vgui("bind %s <ButtonRelease> {pd [concat %s _click 0 0 0 \\;]}\n",
h->h_pathname, h->h_bindsym->s_name);
sys_vgui("bind %s <Motion> {pd [concat %s _motion %%x %%y \\;]}\n",
h->h_pathname, h->h_bindsym->s_name);
}
// in 18 cases only, because canvas does not fit the pattern below.
Mathieu L Bouchard
committed
// canvas has no label handle and has a motion handle
// but in the case of canvas, the "iemgui" tag is added (it wasn't the case originally)
void scalehandle_draw_select(t_scalehandle *h, t_glist *canvas, int px, int py,
const char *nlet_tag, const char *class_tag) {
char tags[128]; // BNG may need up to 100 chars in 64-bit mode, for example
Mathieu L Bouchard
committed
t_text *x = (t_text *)h->h_master;
//if (!nlet_tag) nlet_tag = iem_get_tag(canvas, (t_iemgui *)x);
const char *cursor = h->h_scale ? "bottom_right_corner" : "crosshair";
int sx = h->h_scale ? SCALEHANDLE_WIDTH : LABELHANDLE_WIDTH;
int sy = h->h_scale ? SCALEHANDLE_HEIGHT : LABELHANDLE_HEIGHT;
//printf("scalehandle_draw_select(x%lx,x%lx,%d,%d,\"%s\",\"%s\")\n",h,canvas,px,py,nlet_tag,class_tag);
Mathieu L Bouchard
committed
if (h->h_vis) scalehandle_draw_erase(h,canvas);
Mathieu L Bouchard
committed
// sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 "
sys_vgui("canvas %s -width %d -height %d -bg #0080ff -bd 0 "
"-cursor %s\n", h->h_pathname, sx, sy, cursor);
// there was a %lxBNG tag (or similar) in every scalehandle,
// but it didn't seem to be used —mathieu
if (h->h_scale) {
sprintf(tags,"%lx%s %lxSCALE iemgui %s",
(long)x,class_tag,(long)x,nlet_tag);
} else {
//sprintf(tags,"%lx%s %lxLABEL %lxLABELH iemgui %s", // causes unknown option "-fill"
Mathieu L Bouchard
committed
sprintf(tags,"%lx%s %lx%s iemgui %s", (long)x,class_tag,
(long)x,strcmp(class_tag,"GOP")?"LABELH":"MOVE",nlet_tag);
}
sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d "
Mathieu L Bouchard
committed
"-window %s -tags {%s}\n", canvas, x->te_xpix+px-sx, x->te_ypix+py-sy,
sx, sy, h->h_pathname, tags);
scalehandle_bind(h);
Mathieu L Bouchard
committed
h->h_vis = 1;
void scalehandle_draw_select2(t_iemgui *x, t_glist *canvas, const char *class_tag, int sx, int sy) {
char *nlet_tag = iem_get_tag(canvas, (t_iemgui *)x);
scalehandle_draw_select(x->x_handle,canvas,sx,sy,nlet_tag,class_tag);
Mathieu L Bouchard
committed
if (x->x_lab!=s_empty)
{
scalehandle_draw_select(x->x_lhandle,canvas,x->x_ldx,x->x_ldy,nlet_tag,class_tag);
}
}
void scalehandle_draw_erase(t_scalehandle *h, t_glist *canvas) {
sys_vgui("destroy %s\n", h->h_pathname);
sys_vgui(".x%lx.c delete %lx%s\n", canvas, h->h_master, h->h_scale ? "SCALE" : "LABELH");
Mathieu L Bouchard
committed
h->h_vis = 0;
}
void scalehandle_draw_erase2(t_iemgui *x, t_glist *canvas) {
Mathieu L Bouchard
committed
t_scalehandle *sh = (t_scalehandle *)(x->x_handle);
t_scalehandle *lh = (t_scalehandle *)(x->x_lhandle);
if (sh->h_vis) scalehandle_draw_erase(sh,canvas);
if (lh->h_vis) scalehandle_draw_erase(lh,canvas);
}
void scalehandle_draw_new(t_scalehandle *h, t_glist *canvas) {
sprintf(h->h_pathname, ".x%lx.h%lx", (t_int)canvas, (t_int)h);
}
t_scalehandle *scalehandle_new(t_class *c, t_iemgui *x, int scale) {
t_scalehandle *h = (t_scalehandle *)pd_new(c);
char buf[64];
h->h_master = (t_gobj*)x;
sprintf(buf, "_h%lx", (t_int)h);
pd_bind((t_pd *)h, h->h_bindsym = gensym(buf));
sprintf(h->h_outlinetag, "h%lx", (t_int)h);
h->h_dragon = 0;
h->h_scale = scale;
//h->h_offset_x = 0; // unused (maybe keep for later)
//h->h_offset_y = 0; // unused (maybe keep for later)
Mathieu L Bouchard
committed
h->h_vis = 0;
return h;
}
void scalehandle_free(t_scalehandle *h) {
pd_unbind((t_pd *)h, h->h_bindsym);
pd_free((t_pd *)h);
Mathieu L Bouchard
committed
void properties_set_field_int(long props, const char *gui_field, int value) {
sys_vgui(".gfxstub%lx.%s delete 0 end\n", props, gui_field);
sys_vgui(".gfxstub%lx.%s insert 0 %d\n", props, gui_field, value);
};
void scalehandle_dragon_label(t_scalehandle *h, float f1, float f2) {
if (h->h_dragon && !h->h_scale)
{
t_iemgui *x = (t_iemgui *)(h->h_master);
int dx = (int)f1, dy = (int)f2;
h->h_dragx = dx;
h->h_dragy = dy;
int properties = gfxstub_haveproperties((void *)x);
if (properties)
{
int new_x = x->x_ldx + h->h_dragx;
int new_y = x->x_ldy + h->h_dragy;
Mathieu L Bouchard
committed
properties_set_field_int(properties,"label.xy.x_entry",new_x);
properties_set_field_int(properties,"label.xy.y_entry",new_y);
}
if (glist_isvisible(x->x_glist))
{
int xpos=text_xpix(&x->x_obj, x->x_glist);
int ypos=text_ypix(&x->x_obj, x->x_glist);
t_canvas *canvas=glist_getcanvas(x->x_glist);
sys_vgui(".x%lx.c coords %lxLABEL %d %d\n", canvas, x,
xpos+x->x_ldx + h->h_dragx,
ypos+x->x_ldy + h->h_dragy);
Mathieu L Bouchard
committed
}
}
}
void scalehandle_unclick_label(t_scalehandle *h) {
t_iemgui *x = (t_iemgui *)h->h_master;
canvas_apply_setundo(x->x_glist, (t_gobj *)x);
if (h->h_dragx || h->h_dragy)
{
x->x_ldx += h->h_dragx;
x->x_ldy += h->h_dragy;
canvas_dirty(x->x_glist, 1);