aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/paramGui.h102
1 files changed, 64 insertions, 38 deletions
diff --git a/src/paramGui.h b/src/paramGui.h
index be33f0a..fb9f7c4 100644
--- a/src/paramGui.h
+++ b/src/paramGui.h
@@ -19,35 +19,35 @@ static t_class *paramGui_class;
typedef struct _paramGui
{
- t_object x_obj;
- //t_outlet* outlet;
- //t_symbol* canvasname;
- t_canvas* childcanvas;
- //t_symbol* fullpath;
- t_symbol* path;
-
-
- int path_l;
-
- t_symbol* subpath;
- int subpath_l;
- int build;
- t_symbol* root;
-
- t_symbol* receive;
- int waiting;
- //t_symbol* target;
- //t_class* empty_s;
- //t_symbol* root;
-
+ t_object x_obj;
+ //t_outlet* outlet;
+ //t_symbol* canvasname;
+ t_canvas* childcanvas;
+ //t_symbol* fullpath;
+ t_symbol* path;
+ int path_l;
+ t_symbol* subpath;
+ int subpath_l;
+ int build;
+ t_symbol* root;
+ t_symbol* receive;
+ int waiting;
+ int absolute;
+ t_symbol* current;
+ //t_symbol* target;
+ //t_class* empty_s;
+ //t_symbol* root;
+
} t_paramGui;
static void paramGui_buildCanvas(t_paramGui* x,int x_position,int y_position) {
- // Clear the canvas
- pd_typedmess((t_pd*)x->childcanvas,s_clear,0,NULL);
-
+ // Clear the canvas
+ pd_typedmess((t_pd*)x->childcanvas,s_clear,0,NULL);
+
+
+
int pos_x = 0;
int pos_y = 0;
@@ -63,7 +63,11 @@ static void paramGui_buildCanvas(t_paramGui* x,int x_position,int y_position) {
SETFLOAT(&atoms[6],20);
SETSYMBOL(&atoms[7],s_empty);
SETSYMBOL(&atoms[8],s_empty);
- SETSYMBOL(&atoms[9],x->path);
+ if ( x->subpath != NULL) {
+ SETSYMBOL(&atoms[9],x->subpath);
+ } else {
+ SETSYMBOL(&atoms[9],x->path);
+ }
SETFLOAT(&atoms[10],2);
SETFLOAT(&atoms[11],12);
SETFLOAT(&atoms[12],0);
@@ -95,15 +99,24 @@ static void paramGui_buildCanvas(t_paramGui* x,int x_position,int y_position) {
t_param* p = get_param_list(x->root);
-
+ int match;
while (p) {
gui_update = 0;
- if (p->GUI && (strncmp(p->path->s_name,x->path->s_name,x->path_l)==0)) {
+ if (p->GUI ) {
- if ( x->subpath==NULL || (x->path_l > 0 && strncmp((p->path->s_name)+(x->path_l-1),x->subpath->s_name,x->subpath_l)==0)) {
+ match = 0;
+ if ( x->absolute ) {
+ match = (strncmp(p->path->s_name,x->subpath->s_name,x->subpath_l)==0);
+ } else { // relative
+ match = (strncmp(p->path->s_name,x->path->s_name,x->path_l)==0);
+ if ( x->subpath != NULL ) match = match && ( strncmp((p->path->s_name)+(x->path_l),x->subpath->s_name,x->subpath_l)==0);
+
+ }
+
+ if ( match ) {
p->GUI(p->x,&ac,&av,&send,&receive);
@@ -188,7 +201,7 @@ static void paramGui_buildCanvas(t_paramGui* x,int x_position,int y_position) {
SETFLOAT(&atoms[17],-1);
pd_forwardmess((t_pd*)x->childcanvas, 18, atoms);
pos_y = pos_y + GUI_Y_STEP;
-
+ gui_update = 0;
} else if ( (type == s_slider) || (type == s_knob) || (type == s_hsl) ) {
SETSYMBOL(&atoms[0],s_obj);
SETFLOAT(&atoms[1],pos_x);
@@ -294,8 +307,17 @@ static void paramGui_buildCanvas(t_paramGui* x,int x_position,int y_position) {
// Change the build flag
x->build = 0;
+ if ( x->subpath != NULL) {
+ x->current = x->subpath;
+ } else {
+ x->current = NULL;
+
+ }
x->subpath=NULL;
-
+ x->absolute = 0;
+
+
+
// Show canvas
t_atom a;
SETFLOAT(&a,1);
@@ -318,6 +340,8 @@ static void paramGui_motion_callback(t_paramGui *x, t_float x_position, t_float
static void paramGui_bang(t_paramGui *x) {
+
+
if (x->childcanvas && !x->waiting) {
if (x->build) {
@@ -327,9 +351,6 @@ static void paramGui_bang(t_paramGui *x) {
x->waiting = 1;
sys_vgui("pd [concat %s motion [winfo pointerxy .] \\;]\n",x->receive->s_name);
} else {
-
-
-
// Show canvas
t_atom a;
SETFLOAT(&a,1);
@@ -344,9 +365,12 @@ static void paramGui_bang(t_paramGui *x) {
}
static void paramGui_symbol(t_paramGui *x, t_symbol* s) {
- if ( x->subpath != NULL && x->subpath != s) x->build = 1;
- x->subpath = s;
- x->subpath_l = strlen(x->subpath->s_name);
+ if ( x->current != s || x->build==1) {
+ x->build = 1;
+ x->subpath = s;
+ x->subpath_l = strlen(x->subpath->s_name);
+ if (x->subpath_l && x->subpath->s_name[0] == '/') x->absolute = 1;
+ }
paramGui_bang(x);
}
@@ -356,7 +380,9 @@ static void paramGui_reset(t_paramGui *x) {
// Hide canvas
t_atom a;
SETFLOAT(&a,0);
+ x->current = NULL;
pd_typedmess((t_pd*)x->childcanvas,s_vis,1,&a);
+
}
@@ -389,8 +415,8 @@ static void *paramGui_new(t_symbol *s, int ac, t_atom *av) {
x->build = 1;
-
-
+ x->absolute = 0;
+ x->current = NULL;
char buf[MAXPDSTRING];
sprintf(buf, "#%lx", (long)x);