aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2007-11-22 00:37:59 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2007-11-22 00:37:59 +0000
commitff4298c30dfd8e4cee237b40acec599020d14ff1 (patch)
tree3b64e3ba6631b4c87d83c9a6e1d55465dd319925
parent2a320ac2fbd246be7b0844fe00b543bcd1bae271 (diff)
- moved iolet drawing/erasing to tkwidgets common
- added iolets roughly to [checkbutton] - cleaned up naming in text.c a bit - moved t_widgetbehavior setup to textwidget_setup() svn path=/trunk/externals/tkwidgets/; revision=9021
-rw-r--r--checkbutton-help.pd11
-rw-r--r--checkbutton.c141
-rw-r--r--shared/tkwidgets.c73
-rw-r--r--shared/tkwidgets.h16
-rw-r--r--text.c216
5 files changed, 281 insertions, 176 deletions
diff --git a/checkbutton-help.pd b/checkbutton-help.pd
index c4e0b7e..51cfb0e 100644
--- a/checkbutton-help.pd
+++ b/checkbutton-help.pd
@@ -1,2 +1,11 @@
-#N canvas 351 228 450 300 10;
+#N canvas 148 397 467 404 10;
#X obj 178 105 checkbutton;
+#X msg 98 58 query;
+#X obj 147 167 print QUERY;
+#X msg 147 49 query size;
+#X msg 241 60 size 100 100;
+#X msg 239 30 size 20 20;
+#X connect 1 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 0;
diff --git a/checkbutton.c b/checkbutton.c
index 371ff48..a0694f1 100644
--- a/checkbutton.c
+++ b/checkbutton.c
@@ -1,6 +1,5 @@
/* [checkbutton] object for dislaying a check box
- Copyright (C) 2002-2004 Guenter Geiger
Copyright (C) 2007 Hans-Christoph Steiner <hans@at.or.at>
This program is free software; you can redistribute it and/or modify
@@ -23,6 +22,11 @@
#include "shared/tkwidgets.h"
+#define DEBUG(x) x
+
+#define TOTAL_INLETS 1
+#define TOTAL_OUTLETS 2
+
/* ------------------------ class variables --------------------------------- */
static t_class *checkbutton_class;
@@ -30,10 +34,13 @@ static t_widgetbehavior checkbutton_widgetbehavior;
typedef struct _checkbutton
{
- t_object x_obj;
- t_glist* x_glist;
- int x_width;
- int x_height;
+ t_object x_obj;
+ t_canvas* x_canvas; /* canvas this widget is currently drawn in */
+ t_glist* x_glist; /* glist that owns this widget */
+ t_binbuf* options_binbuf;/* binbuf to save options state in */
+
+ int width;
+ int height;
/* IDs for Tk widgets */
t_symbol* tcl_namespace;
@@ -41,6 +48,8 @@ typedef struct _checkbutton
t_symbol* canvas_id;
t_symbol* widget_id;
t_symbol* handle_id;
+ t_symbol* window_tag;
+ t_symbol* iolets_tag;
t_symbol* all_tag;
t_outlet* x_data_outlet;
@@ -86,19 +95,72 @@ static char *checkbutton_tk_options[] = {
"wraplength"
};
+/* -------------------- function prototypes --------------------------------- */
+
+static void checkbutton_query_callback(t_checkbutton *x, t_symbol *s, int argc, t_atom *argv);
+
/* -------------------- widget helper functions------------------------------ */
+static void set_tkwidgets_ids(t_checkbutton* x, t_canvas* canvas)
+{
+ x->x_canvas = canvas;
+ x->canvas_id = tkwidgets_gen_canvas_id(x->x_canvas);
+ x->widget_id = tkwidgets_gen_widget_id((t_object*)x, x->canvas_id);
+ x->window_tag = tkwidgets_gen_window_tag((t_object*)x, x->canvas_id);
+ x->handle_id = tkwidgets_gen_handle_id((t_object *)x, x->canvas_id);
+}
+
static void checkbutton_drawme(t_checkbutton *x, t_glist *glist)
{
- sys_vgui("checkbutton %s\n", x->widget_id);
+
+ set_tkwidgets_ids(x,glist_getcanvas(glist));
+ sys_vgui("destroy %s\n", x->widget_id->s_name); /* just in case it exists */
+ sys_vgui("checkbutton %s\n",
+ x->widget_id->s_name);
+ tkwidgets_draw_inlets((t_object*)x, glist,
+ x->canvas_id, x->iolets_tag, x->all_tag,
+ x->width, x->height, TOTAL_INLETS, TOTAL_OUTLETS);
+ sys_vgui("%s create window %d %d -anchor nw -window %s -tags {%s %s}\n",
+ x->canvas_id->s_name,
+ text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),
+ x->widget_id->s_name,
+ x->window_tag->s_name, x->all_tag->s_name);
}
-static void checkbutton_erase(t_checkbutton* x,t_glist* glist)
+static void checkbutton_erase(t_checkbutton* x, t_glist* glist)
{
- sys_vgui("%s delete %s\n", x->canvas_id, x->widget_id);
+ set_tkwidgets_ids(x, glist_getcanvas(glist));
+ sys_vgui("destroy %s\n", x->widget_id->s_name);
+ sys_vgui("%s delete %s\n", x->canvas_id->s_name, x->all_tag->s_name);
}
+/* --------------------- query functions ------------------------------------ */
+
+static void query_size(t_checkbutton *x)
+{
+ t_atom coords[3];
+ SETSYMBOL(coords, gensym("size"));
+ SETFLOAT(coords + 1, (t_float)x->width);
+ SETFLOAT(coords + 2, (t_float)x->height);
+ checkbutton_query_callback(x, gensym("query_callback"), 3, coords);
+}
+
+static void checkbutton_query(t_checkbutton *x, t_symbol *s)
+{
+ post("checkbutton_query %s", s->s_name);
+ if(s == &s_)
+ {
+ tkwidgets_query_options(x->receive_name, x->widget_id,
+ sizeof(checkbutton_tk_options)/sizeof(char *),
+ checkbutton_tk_options);
+ query_size(x);
+ }
+ else if(s == gensym("size"))
+ query_size(x);
+ else
+ tkwidgets_query_options(x->receive_name, x->widget_id, 1, &(s->s_name));
+}
/* --------------------- checkbutton widgetbehaviour ------------------------ */
@@ -109,8 +171,8 @@ static void checkbutton_getrect(t_gobj *z, t_glist *glist,
*xp1 = text_xpix(&x->x_obj, glist);
*yp1 = text_ypix(&x->x_obj, glist);
- *xp2 = text_xpix(&x->x_obj, glist) + x->x_width;
- *yp2 = text_ypix(&x->x_obj, glist) + x->x_height;
+ *xp2 = text_xpix(&x->x_obj, glist) + x->width;
+ *yp2 = text_ypix(&x->x_obj, glist) + x->height;
}
static void checkbutton_delete(t_gobj *z, t_glist *glist)
@@ -128,6 +190,39 @@ static void checkbutton_vis(t_gobj *z, t_glist *glist, int vis)
checkbutton_erase(s, glist);
}
+/* --------------------------- methods -------------------------------------- */
+
+static void checkbutton_size(t_checkbutton *x, t_float width, t_float height)
+{
+ DEBUG(post("checkbutton_size"););
+ x->height = height;
+ x->width = width;
+ if(glist_isvisible(x->x_glist))
+ {
+ sys_vgui("%s itemconfigure %s -width %d -height %d\n",
+ x->canvas_id->s_name, x->window_tag->s_name, x->width, x->height);
+// erase_inlets(x);
+// tkwidgets_draw_inlets(x, x->x_glist, TOTAL_INLETS, TOTAL_OUTLETS);
+ canvas_fixlinesfor(x->x_glist, (t_text *)x); // 2nd inlet
+ }
+}
+
+/* --------------------------- callback functions --------------------------- */
+
+static void checkbutton_query_callback(t_checkbutton *x, t_symbol *s, int argc, t_atom *argv)
+{
+ t_symbol *tmp_symbol = atom_getsymbolarg(0, argc, argv);
+ if(tmp_symbol != &s_)
+ {
+ post("tmp_symbol %s argc %d", tmp_symbol->s_name, argc);
+ outlet_anything(x->x_status_outlet, tmp_symbol, argc - 1, argv + 1);
+ }
+ else
+ {
+ post("checkbutton_query_callback %s %d", s->s_name, argc);
+ }
+}
+
/* --------------------------- standard class functions --------------------- */
static void checkbutton_free(t_checkbutton *x)
@@ -141,10 +236,21 @@ static void *checkbutton_new(t_symbol* s, int argc, t_atom *argv)
x->x_glist = (t_glist*) canvas_getcurrent();
- x->x_width = 15;
- x->x_height = 15;
+ x->width = 15;
+ x->height = 15;
+
+ x->tcl_namespace = tkwidgets_gen_tcl_namespace((t_object*)x, s);
+ x->receive_name = tkwidgets_gen_callback_name(x->tcl_namespace);
+ pd_bind(&x->x_obj.ob_pd, x->receive_name);
+
+ x->x_glist = canvas_getcurrent();
+ set_tkwidgets_ids(x, x->x_glist);
+ x->iolets_tag = tkwidgets_gen_iolets_tag((t_object*)x);
+ x->all_tag = tkwidgets_gen_all_tag((t_object*)x);
+
+ x->x_data_outlet = outlet_new(&x->x_obj, &s_float);
+ x->x_status_outlet = outlet_new(&x->x_obj, &s_anything);
- outlet_new(&x->x_obj, &s_float);
return (x);
}
@@ -154,6 +260,15 @@ void checkbutton_setup(void)
(t_method)checkbutton_free,
sizeof(t_checkbutton), 0, A_GIMME,0);
+ class_addmethod(checkbutton_class, (t_method)checkbutton_query,
+ gensym("query"), A_DEFSYMBOL, 0);
+ class_addmethod(checkbutton_class, (t_method)checkbutton_size,
+ gensym("size"), A_DEFFLOAT, A_DEFFLOAT, 0);
+
+/* callbacks */
+ class_addmethod(checkbutton_class, (t_method)checkbutton_query_callback,
+ gensym("query_callback"), A_GIMME, 0);
+
checkbutton_widgetbehavior.w_getrectfn = checkbutton_getrect;
checkbutton_widgetbehavior.w_displacefn = NULL;
checkbutton_widgetbehavior.w_selectfn = NULL;
diff --git a/shared/tkwidgets.c b/shared/tkwidgets.c
index fd7f9c3..4d3ec2e 100644
--- a/shared/tkwidgets.c
+++ b/shared/tkwidgets.c
@@ -54,13 +54,6 @@ void tkwidgets_restore_options(t_symbol *receive_name, t_symbol *widget_id,
}
}
-void tkwidgets_set_ids(t_object *x, t_tkwidgets *tkw, t_canvas *canvas)
-{
-
- tkw->canvas = canvas;
-}
-
-
t_symbol* tkwidgets_gen_tcl_namespace(t_object* x, t_symbol* widget_name)
{
char buf[MAXPDSTRING];
@@ -96,38 +89,39 @@ t_symbol* tkwidgets_gen_widget_id(t_object* x, t_symbol* parent_id)
return gensym(buf);
}
-t_symbol* tkwidgets_gen_window_id(t_object* x, t_symbol* canvas_id)
+t_symbol* tkwidgets_gen_handle_id(t_object *x, t_symbol* canvas_id)
{
char buf[MAXPDSTRING];
- sprintf(buf,"%s.window%lx", canvas_id->s_name, (long unsigned int)x);
+ sprintf(buf,"%s.handle%lx", canvas_id->s_name, (long unsigned int)x);
return gensym(buf);
}
-t_symbol* tkwidgets_gen_handle_id(t_object *x, t_symbol* canvas_id)
+t_symbol* tkwidgets_gen_scrollbar_id(t_object *x, t_symbol* frame_id)
{
char buf[MAXPDSTRING];
- sprintf(buf,"%s.handle%lx", canvas_id->s_name, (long unsigned int)x);
+ sprintf(buf,"%s.scrollbar%lx", frame_id->s_name, (long unsigned int)x);
return gensym(buf);
}
-t_symbol* tkwidgets_gen_scrollbar_id(t_object *x, t_symbol* frame_id)
+t_symbol* tkwidgets_gen_window_tag(t_object* x, t_symbol* canvas_id)
{
char buf[MAXPDSTRING];
- sprintf(buf,"%s.scrollbar%lx", frame_id->s_name, (long unsigned int)x);
+ sprintf(buf,"%s.window%lx", canvas_id->s_name, (long unsigned int)x);
return gensym(buf);
}
-t_symbol* tkwidgets_gen_all_tag(t_object *x)
+t_symbol* tkwidgets_gen_iolets_tag(t_object* x)
{
char buf[MAXPDSTRING];
- sprintf(buf,"all%lx", (long unsigned int)x);
+ sprintf(buf,"iolets%lx", (long unsigned int)x);
return gensym(buf);
}
-void tkwidgets_draw_inlets(t_object *x, t_glist *glist,
- int total_inlets, int total_outlets)
+t_symbol* tkwidgets_gen_all_tag(t_object *x)
{
- // TODO perhaps I should try to use glist_drawiofor() from g_text.c
+ char buf[MAXPDSTRING];
+ sprintf(buf,"all%lx", (long unsigned int)x);
+ return gensym(buf);
}
void tkwidgets_draw_handle()
@@ -140,13 +134,48 @@ void tkwidgets_draw_resize_window()
// TODO draw the resize window while resizing
}
+/* -------------------- inlets/outlets -------------------------------------- */
+
+static int calculate_onset(int x_location, int width,
+ int current_iolet, int total_iolets)
+{
+ post("calculate_onset");
+ return(x_location + (width - IOWIDTH) \
+ * current_iolet / (total_iolets == 1 ? 1 : total_iolets - 1));
+}
-/*
-void query_options()
+void tkwidgets_draw_inlets(t_object *x, t_glist *glist, t_symbol *canvas_id,
+ t_symbol *iolets_tag, t_symbol *all_tag,
+ int width, int height,
+ int total_inlets, int total_outlets)
{
-
+ int i, onset;
+ int x_location = text_xpix(x, glist);
+ int y_location = text_ypix(x, glist);
+
+ for (i = 0; i < total_inlets; i++) /* inlets */
+ {
+ onset = calculate_onset(x_location, width, i, total_inlets);
+ sys_vgui("%s create rectangle %d %d %d %d -tags {%s %s}\n",
+ canvas_id->s_name, onset, y_location - 2,
+ onset + IOWIDTH, y_location,
+ iolets_tag->s_name, all_tag->s_name);
+ sys_vgui("%s raise %s\n", canvas_id->s_name, iolets_tag->s_name);
+ }
+ for (i = 0; i < total_outlets; i++) /* outlets */
+ {
+ onset = calculate_onset(x_location, width, i, total_outlets);
+ sys_vgui("%s create rectangle %d %d %d %d -tags {%s %s}\n",
+ canvas_id->s_name, onset, y_location + height,
+ onset + IOWIDTH, y_location + height + 2,
+ iolets_tag->s_name, all_tag->s_name);
+ sys_vgui("%s raise %s\n", canvas_id->s_name, iolets_tag->s_name);
+ }
}
+void tkwidgets_erase_inlets(t_symbol* canvas_id, t_symbol* iolets_tag)
+{
+ sys_vgui("%s delete %s\n", canvas_id->s_name, iolets_tag);
+}
-*/
diff --git a/shared/tkwidgets.h b/shared/tkwidgets.h
index aa1d097..9f0dea4 100644
--- a/shared/tkwidgets.h
+++ b/shared/tkwidgets.h
@@ -48,7 +48,7 @@ typedef struct _tkwidgets
t_symbol* tcl_namespace; /* namespace to prevent name collisions */
t_symbol* canvas_id; /* the canvas that is showing this widget */
t_symbol* frame_id; /* the frame around the widget and supporters */
- t_symbol* window_id; /* the window that contains the widget */
+ t_symbol* window_tag; /* the window that contains the widget */
t_symbol* widget_id; /* the core widget */
t_symbol* handle_id; /* the resizing handle */
t_symbol* all_tag; /* the tag for moving/deleting everything */
@@ -73,14 +73,20 @@ t_symbol* tkwidgets_gen_callback_name(t_symbol* tcl_namespace);
t_symbol* tkwidgets_gen_canvas_id(t_canvas* canvas);
t_symbol* tkwidgets_gen_frame_id(t_object* x, t_symbol* canvas_id);
t_symbol* tkwidgets_gen_widget_id(t_object* x, t_symbol* parent_id);
-t_symbol* tkwidgets_gen_handle_id(t_object *x, t_symbol* parent_id);
-t_symbol* tkwidgets_gen_window_tag(t_object* x, t_symbol* parent_id);
+t_symbol* tkwidgets_gen_handle_id(t_object *x, t_symbol* canvas_id);
+t_symbol* tkwidgets_gen_scrollbar_id(t_object *x, t_symbol* frame_id);
+t_symbol* tkwidgets_gen_window_tag(t_object* x, t_symbol* canvas_id);
+t_symbol* tkwidgets_gen_iolets_tag(t_object* x);
t_symbol* tkwidgets_gen_all_tag(t_object *x);
// TODO perhaps I should try to use glist_drawiofor() from g_text.c
-void tkwidgets_draw_inlets(t_object *x, t_glist *glist,
- int total_inlets, int total_outlets);
+void tkwidgets_draw_inlets(t_object *x, t_glist *glist, t_symbol *canvas_id,
+ t_symbol *iolets_tag, t_symbol *all_tag,
+ int width, int height,
+ int total_inlets, int total_outlets);
+void tkwidgets_erase_inlets(t_symbol* canvas_id, t_symbol* iolets_tag);
+
void tkwidgets_draw_handle(); // TODO draw resize handle when selected in editmode
void tkwidgets_draw_resize_window(); // TODO draw the resize window while resizing
diff --git a/text.c b/text.c
index ddb9697..318197e 100644
--- a/text.c
+++ b/text.c
@@ -27,6 +27,8 @@
/* TODO: set message doesnt work with a loadbang */
/* TODO: add size to query and save */
/* TODO: add scrollbars to query and save */
+/* TODO: remove glist from _erase() args */
+/* TODO: window name "handle1376fc00" already exists in parent */
#define DEFAULT_COLOR "grey70"
@@ -41,16 +43,19 @@
#define DEBUG(x) x
+static t_class *textwidget_class;
+static t_widgetbehavior textwidget_widgetbehavior;
+
typedef struct _textwidget
{
t_object x_obj;
- t_canvas* x_canvas; /* canvas/glist this widget is currently drawn in*/
+ t_canvas* x_canvas; /* canvas this widget is currently drawn in */
t_glist* x_glist; /* glist that owns this widget */
t_binbuf* options_binbuf;/* binbuf to save options state in */
- int size_x;
- int size_y;
- int x_have_scrollbars;
+ int width;
+ int height;
+ int have_scrollbars;
int x_resizing;
int x_selected;
@@ -63,15 +68,14 @@ typedef struct _textwidget
t_symbol* widget_id;
t_symbol* scrollbar_id;
t_symbol* handle_id;
- t_symbol* window_id;
+ t_symbol* window_tag;
+ t_symbol* iolets_tag;
t_symbol* all_tag;
t_outlet* x_data_outlet;
t_outlet* x_status_outlet;
} t_textwidget;
-static t_class *textwidget_class;
-
static char *textwidget_tk_options[] = {
"autoseparators",
"background",
@@ -124,31 +128,12 @@ static t_symbol *right_symbol;
static t_symbol *up_symbol;
static t_symbol *down_symbol;
-/* function prototypes */
-
-static void textwidget_getrect(t_gobj *z, t_glist *owner, int *xp1, int *yp1, int *xp2, int *yp2);
-static void textwidget_displace(t_gobj *z, t_glist *glist, int dx, int dy);
-static void textwidget_select(t_gobj *z, t_glist *glist, int state);
-static void textwidget_activate(t_gobj *z, t_glist *glist, int state);
-static void textwidget_delete(t_gobj *z, t_glist *glist);
-static void textwidget_vis(t_gobj *z, t_glist *glist, int vis);
-//static int textwidget_click(t_gobj *z, t_glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit);
-static void textwidget_save(t_gobj *z, t_binbuf *b);
+/* -------------------- function prototypes --------------------------------- */
static void textwidget_query_callback(t_textwidget *x, t_symbol *s, int argc, t_atom *argv);
-static t_widgetbehavior textwidget_widgetbehavior = {
-w_getrectfn: textwidget_getrect,
-w_displacefn: textwidget_displace,
-w_selectfn: textwidget_select,
-w_activatefn: textwidget_activate,
-w_deletefn: textwidget_delete,
-w_visfn: textwidget_vis,
-w_clickfn: NULL,
-};
-
-/* widget helper functions */
+/* -------------------- widget helper functions ----------------------------- */
static void store_options(t_textwidget *x)
{
@@ -182,62 +167,21 @@ static void set_tkwidgets_ids(t_textwidget *x, t_canvas *canvas)
x->frame_id = tkwidgets_gen_frame_id((t_object*)x, x->canvas_id);
x->widget_id = tkwidgets_gen_widget_id((t_object*)x, x->frame_id);
x->scrollbar_id = tkwidgets_gen_scrollbar_id((t_object*)x, x->frame_id);
- x->window_id = tkwidgets_gen_window_id((t_object*)x, x->frame_id);
+ x->window_tag = tkwidgets_gen_window_tag((t_object*)x, x->frame_id);
x->handle_id = tkwidgets_gen_handle_id((t_object *)x, x->canvas_id);
}
-static int calculate_onset(t_textwidget *x, t_glist *glist,
- int current_iolet, int total_iolets)
-{
- post("calculate_onset");
- return(text_xpix(&x->x_obj, glist) + (x->size_x - IOWIDTH) \
- * current_iolet / (total_iolets == 1 ? 1 : total_iolets - 1));
-}
-
-static void textwidget_draw_inlets(t_textwidget *x, t_glist *glist, int firsttime,
- int total_inlets, int total_outlets)
-{
- DEBUG(post("textwidget_draw_inlets in: %d out: %d", total_inlets, total_outlets););
- int i, onset;
-
- for (i = 0; i < total_inlets; i++) /* inlets */
- {
- onset = calculate_onset(x, glist, i, total_inlets);
- sys_vgui("%s create rectangle %d %d %d %d -tags {%xi%d %xi %s}\n",
- x->canvas_id->s_name, onset, text_ypix(&x->x_obj, glist) - 2,
- onset + IOWIDTH, text_ypix(&x->x_obj, glist),
- x, i, x, x->all_tag->s_name);
- }
- for (i = 0; i < total_outlets; i++) /* outlets */
- {
- onset = calculate_onset(x, glist, i, total_outlets);
- sys_vgui("%s create rectangle %d %d %d %d -tags {%xo%d %xo %s}\n",
- x->canvas_id->s_name, onset, text_ypix(&x->x_obj, glist) + x->size_y,
- onset + IOWIDTH, text_ypix(&x->x_obj, glist) + x->size_y + 2,
- x, i, x, x->all_tag->s_name);
- }
-}
-
-static void erase_inlets(t_textwidget *x)
-{
- DEBUG(post("erase_inlets"););
-/* Added tag for all inlets/outlets of one instance */
- sys_vgui("%s delete %xi\n", x->canvas_id->s_name, x);
- sys_vgui("%s delete %xo\n", x->canvas_id->s_name, x);
-
-}
-
static void draw_scrollbar(t_textwidget *x)
{
sys_vgui("pack %s -side right -fill y -before %s \n",
x->scrollbar_id->s_name, x->widget_id->s_name);
- x->x_have_scrollbars = 1;
+ x->have_scrollbars = 1;
}
static void erase_scrollbar(t_textwidget *x)
{
sys_vgui("pack forget %s \n", x->scrollbar_id->s_name);
- x->x_have_scrollbars = 0;
+ x->have_scrollbars = 0;
}
static void bind_standard_keys(t_textwidget *x)
@@ -312,35 +256,28 @@ static void create_widget(t_textwidget *x)
x->widget_id->s_name, x->receive_name->s_name);
}
-static void textwidget_drawme(t_textwidget *x, t_glist *glist, int firsttime)
+static void textwidget_drawme(t_textwidget *x, t_glist *glist)
{
- DEBUG(post("textwidget_drawme: firsttime %d canvas %lx glist %lx", firsttime, x->x_canvas, glist););
+ DEBUG(post("textwidget_drawme: firsttime %d canvas %lx glist %lx", x->x_canvas, glist););
set_tkwidgets_ids(x,glist_getcanvas(glist));
- if (firsttime)
- {
- create_widget(x);
- textwidget_draw_inlets(x, glist, firsttime, TOTAL_INLETS, TOTAL_OUTLETS);
- if(x->x_have_scrollbars) draw_scrollbar(x);
- sys_vgui("%s create window %d %d -anchor nw -window %s \
+ create_widget(x);
+ tkwidgets_draw_inlets((t_object*)x, glist,
+ x->canvas_id, x->iolets_tag, x->all_tag,
+ x->width, x->height, TOTAL_INLETS, TOTAL_OUTLETS);
+ if(x->have_scrollbars) draw_scrollbar(x);
+ sys_vgui("%s create window %d %d -anchor nw -window %s \
-tags {%s %s} -width %d -height %d \n", x->canvas_id->s_name,
- text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),
- x->frame_id->s_name, x->window_id->s_name, x->all_tag->s_name, x->size_x, x->size_y);
- }
- else
- {
- post("NO MORE COORDS");
-// sys_vgui("%s coords %s %d %d\n", x->canvas_id->s_name, x->all_tag->s_name,
-// text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist));
- }
-}
-
+ text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist),
+ x->frame_id->s_name, x->window_tag->s_name, x->all_tag->s_name,
+ x->width, x->height);
+}
static void textwidget_erase(t_textwidget* x,t_glist* glist)
{
DEBUG(post("textwidget_erase: canvas %lx glist %lx", x->x_canvas, glist););
set_tkwidgets_ids(x,glist_getcanvas(glist));
- erase_inlets(x);
+ tkwidgets_erase_inlets(x->canvas_id, x->iolets_tag);
sys_vgui("destroy %s\n", x->frame_id->s_name);
sys_vgui("%s delete %s\n", x->canvas_id->s_name, x->all_tag->s_name);
}
@@ -349,7 +286,6 @@ static void textwidget_erase(t_textwidget* x,t_glist* glist)
/* ------------------------ text widgetbehaviour----------------------------- */
-
static void textwidget_getrect(t_gobj *z, t_glist *owner,
int *xp1, int *yp1, int *xp2, int *yp2)
{
@@ -357,8 +293,8 @@ static void textwidget_getrect(t_gobj *z, t_glist *owner,
t_textwidget *x = (t_textwidget*)z;
*xp1 = text_xpix(&x->x_obj, owner);
*yp1 = text_ypix(&x->x_obj, owner);
- *xp2 = *xp1 + x->size_x;
- *yp2 = *yp1 + x->size_y + 2; // add 2 to give space for outlets
+ *xp2 = *xp1 + x->width;
+ *yp2 = *yp1 + x->height + 2; // add 2 to give space for outlets
}
static void textwidget_displace(t_gobj *z, t_glist *glist, int dx, int dy)
@@ -372,11 +308,6 @@ static void textwidget_displace(t_gobj *z, t_glist *glist, int dx, int dy)
set_tkwidgets_ids(x,glist_getcanvas(glist));
sys_vgui("%s move %s %d %d\n", x->canvas_id->s_name, x->all_tag->s_name, dx, dy);
sys_vgui("%s move RSZ %d %d\n", x->canvas_id->s_name, dx, dy);
-/* sys_vgui("%s coords %s %d %d %d %d\n", x->canvas_id->s_name, x->all_tag->s_name,
- text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)-1,
- text_xpix(&x->x_obj, glist) + x->size_x,
- text_ypix(&x->x_obj, glist) + x->size_y-2);*/
-// textwidget_drawme(x, glist, 0);
canvas_fixlinesfor(glist_getcanvas(glist), (t_text*) x);
}
DEBUG(post("displace end"););
@@ -451,7 +382,7 @@ static void textwidget_vis(t_gobj *z, t_glist *glist, int vis)
t_rtext *y;
if (vis) {
y = (t_rtext *) rtext_new(glist, (t_text *)z);
- textwidget_drawme(x, glist, 1);
+ textwidget_drawme(x, glist);
}
else {
y = glist_findrtext(glist, (t_text *)z);
@@ -611,7 +542,7 @@ static void textwidget_save(t_gobj *z, t_binbuf *b)
binbuf_addv(b, "ssiisiii", &s__X, gensym("obj"),
x->x_obj.te_xpix, x->x_obj.te_ypix,
atom_getsymbol(binbuf_getvec(x->x_obj.te_binbuf)),
- x->size_x, x->size_y, x->x_have_scrollbars);
+ x->width, x->height, x->have_scrollbars);
binbuf_addbinbuf(b, x->options_binbuf);
binbuf_addv(b, ";");
}
@@ -639,7 +570,7 @@ static void query_scrollbars(t_textwidget *x)
{
t_atom state[2];
SETSYMBOL(state, scrollbars_symbol);
- SETFLOAT(state + 1, (t_float)x->x_have_scrollbars);
+ SETFLOAT(state + 1, (t_float)x->have_scrollbars);
textwidget_query_callback(x, gensym("query_callback"), 2, state);
}
@@ -647,8 +578,8 @@ static void query_size(t_textwidget *x)
{
t_atom coords[3];
SETSYMBOL(coords, size_symbol);
- SETFLOAT(coords + 1, (t_float)x->size_x);
- SETFLOAT(coords + 2, (t_float)x->size_y);
+ SETFLOAT(coords + 1, (t_float)x->width);
+ SETFLOAT(coords + 2, (t_float)x->height);
textwidget_query_callback(x, gensym("query_callback"), 3, coords);
}
@@ -657,7 +588,7 @@ static void textwidget_query(t_textwidget *x, t_symbol *s)
post("textwidget_query %s", s->s_name);
if(s == &s_)
{
- tkwidgets_query_options(x->receive_name, x->widget_id->s_name,
+ tkwidgets_query_options(x->receive_name, x->widget_id,
sizeof(textwidget_tk_options)/sizeof(char *),
textwidget_tk_options);
query_scrollbars(x);
@@ -668,12 +599,13 @@ static void textwidget_query(t_textwidget *x, t_symbol *s)
else if(s == size_symbol)
query_size(x);
else
- tkwidgets_query_options(x->receive_name, x->widget_id->s_name, 1, &(s->s_name));
+ tkwidgets_query_options(x->receive_name, x->widget_id, 1, &(s->s_name));
}
static void textwidget_scrollbars(t_textwidget *x, t_float f)
{
- if(f > 0)
+ int value = (int) f;
+ if(value > 0)
draw_scrollbar(x);
else
erase_scrollbar(x);
@@ -682,19 +614,21 @@ static void textwidget_scrollbars(t_textwidget *x, t_float f)
static void textwidget_size(t_textwidget *x, t_float width, t_float height)
{
DEBUG(post("textwidget_size"););
- x->size_y = height;
- x->size_x = width;
+ x->height = height;
+ x->width = width;
if(glist_isvisible(x->x_glist))
{
sys_vgui("%s itemconfigure %s -width %d -height %d\n",
- x->canvas_id->s_name, x->window_id->s_name, x->size_x, x->size_y);
- erase_inlets(x);
- textwidget_draw_inlets(x, x->x_glist, 1, TOTAL_INLETS, TOTAL_OUTLETS);
+ x->canvas_id->s_name, x->window_tag->s_name, x->width, x->height);
+ tkwidgets_erase_inlets(x->canvas_id, x->iolets_tag);
+ tkwidgets_draw_inlets((t_object*)x, x->x_glist,
+ x->canvas_id, x->iolets_tag, x->all_tag,
+ x->width, x->height, TOTAL_INLETS, TOTAL_OUTLETS);
canvas_fixlinesfor(x->x_glist, (t_text *)x); // 2nd inlet
}
}
-/* callback functions */
+/* -------------------- callback functions ---------------------------------- */
static void textwidget_store_callback(t_textwidget *x, t_symbol *s, int argc, t_atom *argv)
{
@@ -732,13 +666,15 @@ static void textwidget_resize_click_callback(t_textwidget *x, t_floatarg f)
{
if (canvas)
{
- textwidget_draw_inlets(x, canvas, 1, TOTAL_INLETS, TOTAL_OUTLETS);
+ tkwidgets_draw_inlets((t_object*)x, canvas,
+ x->canvas_id, x->iolets_tag, x->all_tag,
+ x->width, x->height, TOTAL_INLETS, TOTAL_OUTLETS);
canvas_fixlinesfor(x->x_glist, (t_text *)x); // 2nd inlet
}
}
else if (!x->x_resizing && newstate)
{
- erase_inlets(x);
+ tkwidgets_erase_inlets(x->canvas_id, x->iolets_tag);
}
x->x_resizing = newstate;
}
@@ -751,11 +687,11 @@ static void textwidget_resize_motion_callback(t_textwidget *x, t_floatarg f1, t_
int dx = (int)f1, dy = (int)f2;
if (glist_isvisible(x->x_glist))
{
- x->size_x += dx;
- x->size_y += dy;
+ x->width += dx;
+ x->height += dy;
sys_vgui("%s itemconfigure %s -width %d -height %d\n",
- x->canvas_id->s_name, x->window_id->s_name,
- x->size_x, x->size_y);
+ x->canvas_id->s_name, x->window_tag->s_name,
+ x->width, x->height);
sys_vgui("%s move RSZ %d %d\n",
x->canvas_id->s_name, dx, dy);
canvas_fixlinesfor(x->x_glist, (t_text *)x);
@@ -763,6 +699,8 @@ static void textwidget_resize_motion_callback(t_textwidget *x, t_floatarg f1, t_
}
}
+/* --------------------------- standard class functions --------------------- */
+
static void textwidget_free(t_textwidget *x)
{
pd_unbind(&x->x_obj.ob_pd, x->receive_name);
@@ -781,15 +719,15 @@ static void *textwidget_new(t_symbol *s, int argc, t_atom *argv)
if (argc < 3)
{
post("[text]: less than 3 arguments entered, default values used.");
- x->size_x = TEXT_DEFAULT_WIDTH;
- x->size_y = TEXT_DEFAULT_HEIGHT;
- x->x_have_scrollbars = 0;
+ x->width = TEXT_DEFAULT_WIDTH;
+ x->height = TEXT_DEFAULT_HEIGHT;
+ x->have_scrollbars = 0;
}
else
{
- x->size_x = atom_getint(argv);
- x->size_y = atom_getint(argv + 1);
- x->x_have_scrollbars = atom_getint(argv + 2);
+ x->width = atom_getint(argv);
+ x->height = atom_getint(argv + 1);
+ x->have_scrollbars = atom_getint(argv + 2);
if(argc > 3)
{
binbuf_add(x->options_binbuf, argc - 3, argv + 3);
@@ -803,6 +741,7 @@ static void *textwidget_new(t_symbol *s, int argc, t_atom *argv)
x->x_glist = canvas_getcurrent();
set_tkwidgets_ids(x, x->x_glist);
+ x->iolets_tag = tkwidgets_gen_iolets_tag((t_object*)x);
x->all_tag = tkwidgets_gen_all_tag((t_object*)x);
x->x_data_outlet = outlet_new(&x->x_obj, &s_float);
@@ -819,20 +758,20 @@ void text_setup(void) {
class_addbang(textwidget_class, (t_method)textwidget_bang_output);
class_addanything(textwidget_class, (t_method)textwidget_option);
+ class_addmethod(textwidget_class, (t_method)textwidget_append,
+ gensym("append"), A_GIMME, 0);
+ class_addmethod(textwidget_class, (t_method)textwidget_clear,
+ gensym("clear"), 0);
+ class_addmethod(textwidget_class, (t_method)textwidget_key,
+ gensym("key"), A_GIMME, 0);
class_addmethod(textwidget_class, (t_method)textwidget_query,
gensym("query"), A_DEFSYMBOL, 0);
class_addmethod(textwidget_class, (t_method)textwidget_scrollbars,
gensym("scrollbars"), A_DEFFLOAT, 0);
- class_addmethod(textwidget_class, (t_method)textwidget_size,
- gensym("size"), A_DEFFLOAT, A_DEFFLOAT, 0);
class_addmethod(textwidget_class, (t_method)textwidget_set,
gensym("set"), A_GIMME, 0);
- class_addmethod(textwidget_class, (t_method)textwidget_append,
- gensym("append"), A_GIMME, 0);
- class_addmethod(textwidget_class, (t_method)textwidget_key,
- gensym("key"), A_GIMME, 0);
- class_addmethod(textwidget_class, (t_method)textwidget_clear,
- gensym("clear"), 0);
+ class_addmethod(textwidget_class, (t_method)textwidget_size,
+ gensym("size"), A_DEFFLOAT, A_DEFFLOAT, 0);
/* callbacks */
class_addmethod(textwidget_class, (t_method)textwidget_store_callback,
gensym("store_callback"), A_GIMME, 0);
@@ -848,7 +787,14 @@ void text_setup(void) {
gensym("resize_click"), A_FLOAT, 0);
class_addmethod(textwidget_class, (t_method)textwidget_resize_motion_callback,
gensym("resize_motion"), A_FLOAT, A_FLOAT, 0);
-
+
+ textwidget_widgetbehavior.w_getrectfn = textwidget_getrect;
+ textwidget_widgetbehavior.w_displacefn = textwidget_displace;
+ textwidget_widgetbehavior.w_selectfn = textwidget_select;
+ textwidget_widgetbehavior.w_activatefn = textwidget_activate;
+ textwidget_widgetbehavior.w_deletefn = textwidget_delete;
+ textwidget_widgetbehavior.w_visfn = textwidget_vis;
+ textwidget_widgetbehavior.w_clickfn = NULL;
class_setwidget(textwidget_class,&textwidget_widgetbehavior);
class_setsavefn(textwidget_class,&textwidget_save);