Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Rishabh Gupta
purr-data
Commits
55cb5c09
Commit
55cb5c09
authored
Oct 29, 2017
by
Jonathan Wilkes
Browse files
make it possible to update attributes for an array element without redrawing
parent
89f3dc8b
Changes
3
Hide whitespace changes
Inline
Side-by-side
pd/src/g_scalar.c
View file @
55cb5c09
...
...
@@ -780,32 +780,36 @@ extern void svg_register_events(t_gobj *z, t_canvas *c, t_scalar *sc,
t_template
*
template
,
t_word
*
data
);
static
void
scalar_group_configure
(
t_scalar
*
x
,
t_glist
*
owner
,
t_template
*
template
,
t_glist
*
gl
,
t_glist
*
parent
)
t_template
*
template
,
t_word
*
data
,
t_glist
*
gl
,
t_glist
*
parent
)
{
t_gobj
*
y
;
char
tagbuf
[
MAXPDSTRING
];
sprintf
(
tagbuf
,
"dgroup%lx.%lx"
,
(
long
unsigned
int
)
gl
,
(
long
unsigned
int
)
x
->
sc_vec
);
(
long
unsigned
int
)
data
);
char
parentbuf
[
MAXPDSTRING
];
sprintf
(
parentbuf
,
"dgroup%lx.%lx"
,
(
long
unsigned
int
)
parent
,
(
long
unsigned
int
)
x
->
sc_vec
);
/* check if we're in an array-- really need to see if we can just
get rid of the different tag names for arrays... */
sprintf
(
parentbuf
,
"%s%lx.%lx"
,
(
x
->
sc_vec
==
data
)
?
"dgroup"
:
"scelem"
,
(
long
unsigned
int
)
parent
,
(
long
unsigned
int
)
data
);
gui_start_vmess
(
"gui_draw_configure_all"
,
"xs"
,
glist_getcanvas
(
owner
),
tagbuf
);
svg_grouptogui
(
gl
,
template
,
x
->
sc_vec
);
svg_grouptogui
(
gl
,
template
,
data
);
gui_end_vmess
();
svg_register_events
((
t_gobj
*
)
gl
,
owner
,
x
,
template
,
x
->
sc_vec
);
svg_register_events
((
t_gobj
*
)
gl
,
owner
,
x
,
template
,
data
);
for
(
y
=
gl
->
gl_list
;
y
;
y
=
y
->
g_next
)
{
if
(
pd_class
(
&
y
->
g_pd
)
==
canvas_class
&&
((
t_glist
*
)
y
)
->
gl_svg
)
{
scalar_group_configure
(
x
,
owner
,
template
,
(
t_glist
*
)
y
,
gl
);
scalar_group_configure
(
x
,
owner
,
template
,
data
,
(
t_glist
*
)
y
,
gl
);
}
t_parentwidgetbehavior
*
wb
=
pd_getparentwidget
(
&
y
->
g_pd
);
if
(
!
wb
)
continue
;
//(*wb->w_parentvisfn)(y, owner, gl, x,
x->sc_vec
, template,
//(*wb->w_parentvisfn)(y, owner, gl, x,
data
, template,
// 0, 0, vis);
svg_parentwidgettogui
(
y
,
x
,
owner
,
x
->
sc_vec
,
template
);
svg_parentwidgettogui
(
y
,
x
,
owner
,
data
,
template
);
svg_register_events
(
y
,
owner
,
x
,
template
,
data
);
}
}
...
...
@@ -848,7 +852,7 @@ void scalar_doconfigure(t_gobj *xgobj, t_glist *owner)
if
(
pd_class
(
&
y
->
g_pd
)
==
canvas_class
&&
((
t_glist
*
)
y
)
->
gl_svg
)
{
scalar_group_configure
(
x
,
owner
,
template
,
scalar_group_configure
(
x
,
owner
,
template
,
x
->
sc_vec
,
(
t_glist
*
)
y
,
templatecanvas
);
}
continue
;
...
...
@@ -856,6 +860,7 @@ void scalar_doconfigure(t_gobj *xgobj, t_glist *owner)
//(*wb->w_parentvisfn)(y, owner, 0, x, x->sc_vec, template,
// basex, basey, vis);
svg_parentwidgettogui
(
y
,
x
,
owner
,
x
->
sc_vec
,
template
);
svg_register_events
(
y
,
owner
,
x
,
template
,
x
->
sc_vec
);
}
if
(
glist_isselected
(
owner
,
&
x
->
sc_gobj
))
{
...
...
@@ -873,6 +878,47 @@ void scalar_configure(t_scalar *x, t_glist *owner)
sys_queuegui
(
x
,
owner
,
scalar_doconfigure
);
}
extern
int
is_plot_class
(
t_gobj
*
y
);
void
array_configure
(
t_scalar
*
x
,
t_glist
*
owner
,
t_array
*
a
,
t_word
*
data
)
{
t_template
*
template
=
template_findbyname
(
x
->
sc_template
);
t_template
*
elemtemplate
=
template_findbyname
(
a
->
a_templatesym
);
t_canvas
*
templatecanvas
=
template_findcanvas
(
template
);
t_canvas
*
elemtemplatecanvas
=
template_findcanvas
(
elemtemplate
);
t_gobj
*
y
;
for
(
y
=
templatecanvas
->
gl_list
;
y
;
y
=
y
->
g_next
)
{
t_parentwidgetbehavior
*
wb
=
pd_getparentwidget
(
&
y
->
g_pd
);
if
(
wb
&&
is_plot_class
(
y
))
{
scalar_redraw
(
x
,
owner
);
return
;
}
}
/* If no plot widgets, it is now safe to just configure the individual
array elements. */
for
(
y
=
elemtemplatecanvas
->
gl_list
;
y
;
y
=
y
->
g_next
)
{
t_parentwidgetbehavior
*
wb
=
pd_getparentwidget
(
&
y
->
g_pd
);
if
(
!
wb
)
{
/* check subpatches for more drawing commands.
(Optimized to only search [group] subpatches) */
if
(
pd_class
(
&
y
->
g_pd
)
==
canvas_class
&&
((
t_glist
*
)
y
)
->
gl_svg
)
{
scalar_group_configure
(
x
,
owner
,
template
,
data
,
(
t_glist
*
)
y
,
elemtemplatecanvas
);
}
continue
;
}
svg_parentwidgettogui
(
y
,
x
,
owner
,
data
,
elemtemplate
);
svg_register_events
(
y
,
owner
,
x
,
elemtemplate
,
data
);
}
}
static
void
scalar_groupvis
(
t_scalar
*
x
,
t_glist
*
owner
,
t_template
*
template
,
t_glist
*
gl
,
t_glist
*
parent
,
int
vis
)
{
...
...
@@ -908,27 +954,27 @@ static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template,
}
}
/* At present, scalars have a three-level hierarchy in t
kpath
,
/* At present, scalars have a three-level hierarchy in t
he gui
,
with two levels accessible by the user from within Pd:
scalar - ".scalar%lx", x->sc_vec
|
tkpath group
with matrix derived from x/y fields,
|
<g>
with matrix derived from x/y fields,
| gop basexy, and gop scaling values. This group is
| not configurable by the user. This means that the
| [draw g
roup
] below can ignore basexy and gop junk
|
a
[draw g] below can ignore basexy and gop junk
| when computing the transform matrix.
v
group - ".dgroup%lx.%lx", templatecanvas, x->sc_vec
| group used as parent for all the toplevel drawing
| commands of the scalar (i.e., the ones located on
| the same canvas as the [struct]). Its matrix and
| options aren't
yet
accessible by the user.
| options aren't accessible by the user.
v
(draw - ".draw%lx.%lx", (t_draw *ptr), x->sc_vec
| the actual drawing command: rectangle, path, etc.
| the actual drawing command: rectangle, path,
g,
etc.
or Each has its own matrix and options which can set
scelem with messages to the corresponding [draw] object.
or - ds arrays can nest arbitrarily deep. Scelem is for
group) data structure arrays. group is for
more groups.
group) data structure arrays. group is for
[draw g] and [draw svg]
|
v
etc.
...
...
pd/src/g_template.c
View file @
55cb5c09
...
...
@@ -1753,7 +1753,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
}
else
{
sprintf(tag, "
draw
%lx.%lx",
sprintf(tag, "
%s
%lx.%lx",
(in_array ? "scelem": "draw"),
(long unsigned int)x->x_parent,
(long unsigned int)data);
}
...
...
@@ -1927,7 +1927,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
else if (s == gensym("d"))
{
char tagbuf[MAXPDSTRING];
sprintf(tagbuf, "
draw
%lx.%lx",
sprintf(tagbuf, "
%s
%lx.%lx",
(in_array ? "scelem" : "draw"),
(long unsigned int)parent, (long unsigned int)data);
gui_start_vmess("gui_draw_configure", "xss",
glist_getcanvas(c), tagbuf, "d");
...
...
@@ -4213,7 +4213,8 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
one for this specific draw item
*/
char tagbuf[MAXPDSTRING];
sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x,
sprintf(tagbuf, "%s%lx.%lx", in_array ? "scelem" : "draw",
(long unsigned int)x,
(long unsigned int)data);
gui_s(tagbuf);
gui_end_array();
...
...
@@ -5424,7 +5425,7 @@ static void curve_setup(void)
/* --------- plots for showing arrays --------------- */
t_class *plot_class;
static
t_class *plot_class;
typedef struct _plot
{
...
...
@@ -5446,6 +5447,11 @@ typedef struct _plot
t_fielddesc x_symfillcolor; /* fill color as hex symbol */
} t_plot;
int is_plot_class(t_gobj *y)
{
return (pd_class(&y->g_pd) == plot_class);
}
static void *plot_new(t_symbol *classsym, t_int argc, t_atom *argv)
{
if (legacy_draw_in_group(canvas_getcurrent()))
...
...
@@ -8287,8 +8293,6 @@ static void drawimage_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
t_float xloc = fielddesc_getcoord(&svg->x_x.a_attr, template, data, 0);
t_float yloc = fielddesc_getcoord(&svg->x_y.a_attr, template, data, 0);
fprintf(stderr, "xloc is %g\n", xloc);
fprintf(stderr, "yloc is %g\n", yloc);
char tagbuf[MAXPDSTRING];
char parent_tagbuf[MAXPDSTRING];
sprintf(tagbuf, "draw%lx.%lx",
...
...
@@ -8617,7 +8621,8 @@ void svg_parentwidgettogui(t_gobj *z, t_scalar *sc, t_glist *owner,
if (pd_class(&z->g_pd) == draw_class)
{
t_draw *x = (t_draw *)z;
sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x,
sprintf(tagbuf, "%s%lx.%lx", (sc->sc_vec == data) ? "draw" : "scelem",
(long unsigned int)x,
(long unsigned int)data);
gui_start_vmess("gui_draw_configure_all", "xs",
glist_getcanvas(owner), tagbuf);
...
...
@@ -8627,7 +8632,8 @@ void svg_parentwidgettogui(t_gobj *z, t_scalar *sc, t_glist *owner,
else if (pd_class(&z->g_pd) == drawimage_class)
{
t_drawimage *x = (t_drawimage *)z;
sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x,
sprintf(tagbuf, "%s%lx.%lx", (sc->sc_vec == data) ? "draw" : "scelem",
(long unsigned int)x,
(long unsigned int)data);
gui_start_vmess("gui_draw_configure_all", "xs",
glist_getcanvas(owner), tagbuf);
...
...
pd/src/g_traversal.c
View file @
55cb5c09
...
...
@@ -706,10 +706,12 @@ static void set_bang(t_set *x)
else
{
t_array
*
owner_array
=
gs
->
gs_un
.
gs_array
;
while
(
owner_array
->
a_gp
.
gp_stub
->
gs_which
==
GP_ARRAY
)
owner_array
=
owner_array
->
a_gp
.
gp_stub
->
gs_un
.
gs_array
;
scalar_redraw
((
t_scalar
*
)(
owner_array
->
a_gp
.
gp_un
.
gp_gobj
),
owner_array
->
a_gp
.
gp_stub
->
gs_un
.
gs_glist
);
t_array
*
top_array
=
owner_array
;
while
(
top_array
->
a_gp
.
gp_stub
->
gs_which
==
GP_ARRAY
)
top_array
=
top_array
->
a_gp
.
gp_stub
->
gs_un
.
gs_array
;
array_configure
((
t_scalar
*
)(
top_array
->
a_gp
.
gp_un
.
gp_gobj
),
top_array
->
a_gp
.
gp_stub
->
gs_un
.
gs_glist
,
owner_array
,
vec
);
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment