Commit 65629b59 authored by Miller Puckette's avatar Miller Puckette
Browse files

working on GOP bug

parent 05e4a8e8
......@@ -353,6 +353,7 @@ EXTERN int gobj_click(t_gobj *x, struct _glist *glist,
EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
EXTERN void gobj_properties(t_gobj *x, struct _glist *glist);
EXTERN void gobj_save(t_gobj *x, t_binbuf *b);
EXTERN int gobj_shouldvis(t_gobj *x, struct _glist *glist);
/* -------------------- functions on glists --------------------- */
EXTERN t_glist *glist_new( void);
......@@ -414,7 +415,6 @@ EXTERN int text_xcoord(t_text *x, t_glist *glist);
EXTERN int text_ycoord(t_text *x, t_glist *glist);
EXTERN int text_xpix(t_text *x, t_glist *glist);
EXTERN int text_ypix(t_text *x, t_glist *glist);
EXTERN int text_shouldvis(t_text *x, t_glist *glist);
/* -------------------- functions on rtexts ------------------------- */
#define RTEXT_DOWN 1
......
......@@ -61,28 +61,43 @@ void gobj_delete(t_gobj *x, t_glist *glist)
(*x->g_pd->c_wb->w_deletefn)(x, glist);
}
int gobj_shouldvis(t_gobj *x, struct _glist *glist)
{
t_object *ob;
if (!glist->gl_havewindow && glist->gl_isgraph && glist->gl_goprect &&
glist->gl_owner && (pd_class(&glist->gl_pd) != garray_class))
{
/* if we're graphing-on-parent and the object falls outside the
graph rectangle, don't draw it. */
int x1, y1, x2, y2, gx1, gy1, gx2, gy2, m;
gobj_getrect(&glist->gl_gobj, glist->gl_owner, &x1, &y1, &x2, &y2);
if (x1 > x2)
m = x1, x1 = x2, x2 = m;
if (y1 > y2)
m = y1, y1 = y2, y2 = m;
gobj_getrect(x, glist, &gx1, &gy1, &gx2, &gy2);
if (gx1 < x1 || gx1 > x2 || gx2 < x1 || gx2 > x2 ||
gy1 < y1 || gy1 > y2 || gy2 < y1 || gy2 > y2)
return (0);
}
if (ob = pd_checkobject(&x->g_pd))
{
/* return true if the text box should be drawn. We don't show text
boxes inside graphs---except comments, if we're doing the new
(goprect) style. */
return (glist->gl_havewindow ||
(ob->te_pd != canvas_class &&
ob->te_pd->c_wb != &text_widgetbehavior) ||
(ob->te_pd == canvas_class && (((t_glist *)ob)->gl_isgraph)) ||
(glist->gl_goprect && (ob->te_type == T_TEXT)));
}
else return (1);
}
void gobj_vis(t_gobj *x, struct _glist *glist, int flag)
{
if (x->g_pd->c_wb && x->g_pd->c_wb->w_visfn)
{
if (!glist->gl_havewindow && glist->gl_isgraph && glist->gl_goprect &&
glist->gl_owner && (pd_class(&glist->gl_pd) != garray_class))
{
/* if we're graphing-on-parent and the object falls outside the
graph rectangle, don't draw it. */
int x1, y1, x2, y2, gx1, gy1, gx2, gy2, m;
gobj_getrect(&glist->gl_gobj, glist->gl_owner, &x1, &y1, &x2, &y2);
if (x1 > x2)
m = x1, x1 = x2, x2 = m;
if (y1 > y2)
m = y1, y1 = y2, y2 = m;
gobj_getrect(x, glist, &gx1, &gy1, &gx2, &gy2);
if (gx1 < x1 || gx1 > x2 || gx2 < x1 || gx2 > x2 ||
gy1 < y1 || gy1 > y2 || gy2 < y1 || gy2 > y2)
return;
}
if (x->g_pd->c_wb && x->g_pd->c_wb->w_visfn && gobj_shouldvis(x, glist))
(*x->g_pd->c_wb->w_visfn)(x, glist, flag);
}
}
int gobj_click(t_gobj *x, struct _glist *glist,
......@@ -765,9 +780,8 @@ int canvas_hitbox(t_canvas *x, t_gobj *y, int xpos, int ypos,
{
int x1, y1, x2, y2;
t_text *ob;
if ((ob = pd_checkobject(&y->g_pd)) &&
!text_shouldvis(ob, x))
return (0);
if (!gobj_shouldvis(y, x))
return (0);
gobj_getrect(y, x, &x1, &y1, &x2, &y2);
if (xpos >= x1 && xpos <= x2 && ypos >= y1 && ypos <= y2)
{
......
......@@ -671,7 +671,6 @@ void glist_redraw(t_glist *x)
/* --------------------------- widget behavior ------------------- */
extern t_widgetbehavior text_widgetbehavior;
int garray_getname(t_garray *x, t_symbol **namep);
......@@ -904,7 +903,7 @@ static void graph_getrect(t_gobj *z, t_glist *glist,
hadwindow = x->gl_havewindow;
x->gl_havewindow = 0;
for (g = x->gl_list; g; g = g->g_next)
if ((!(ob = pd_checkobject(&g->g_pd))) || text_shouldvis(ob, x))
if (gobj_shouldvis(g, x))
{
/* don't do this for arrays, just let them hang outside the
box. */
......
......@@ -989,7 +989,7 @@ static void text_select(t_gobj *z, t_glist *glist, int state)
t_text *x = (t_text *)z;
t_rtext *y = glist_findrtext(glist, x);
rtext_select(y, state);
if (glist_isvisible(glist) && text_shouldvis(x, glist))
if (glist_isvisible(glist) && gobj_shouldvis(&x->te_g, glist))
sys_vgui(".x%lx.c itemconfigure %sR -fill %s\n", glist,
rtext_gettag(y), (state? "blue" : "black"));
}
......@@ -1007,22 +1007,12 @@ static void text_delete(t_gobj *z, t_glist *glist)
canvas_deletelinesfor(glist, x);
}
/* return true if the text box should be drawn. We don't show text boxes
inside graphs---except comments, if we're doing the new (goprect) style. */
int text_shouldvis(t_text *x, t_glist *glist)
{
return (glist->gl_havewindow ||
(x->te_pd != canvas_class && x->te_pd->c_wb != &text_widgetbehavior) ||
(x->te_pd == canvas_class && (((t_glist *)x)->gl_isgraph)) ||
(glist->gl_goprect && (x->te_type == T_TEXT)));
}
static void text_vis(t_gobj *z, t_glist *glist, int vis)
{
t_text *x = (t_text *)z;
if (vis)
{
if (text_shouldvis(x, glist))
if (gobj_shouldvis(&x->te_g, glist))
{
t_rtext *y = glist_findrtext(glist, x);
if (x->te_type == T_ATOM)
......@@ -1035,7 +1025,7 @@ static void text_vis(t_gobj *z, t_glist *glist, int vis)
else
{
t_rtext *y = glist_findrtext(glist, x);
if (text_shouldvis(x, glist))
if (gobj_shouldvis(&x->te_g, glist))
{
text_eraseborder(x, glist, rtext_gettag(y));
rtext_erase(y);
......
......@@ -149,7 +149,6 @@ static void pd_defaultlist(t_pd *x, t_symbol *s, int argc, t_atom *argv)
argument form, one for the multiple one; see select_setup() to find out
how this is handled. */
extern t_widgetbehavior text_widgetbehavior;
extern void text_save(t_gobj *z, t_binbuf *b);
t_class *class_new(t_symbol *s, t_newmethod newmethod, t_method freemethod,
......
......@@ -325,3 +325,4 @@ EXTERN void inmidi_polyaftertouch(int portno,
int pitch,
int value);
/* } jsarlo */
extern t_widgetbehavior text_widgetbehavior;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment