diff options
Diffstat (limited to 'entry')
-rw-r--r-- | entry/entry.c | 243 |
1 files changed, 188 insertions, 55 deletions
diff --git a/entry/entry.c b/entry/entry.c index 5f84bab..c2d55c9 100644 --- a/entry/entry.c +++ b/entry/entry.c @@ -26,6 +26,8 @@ /* TODO: make [size( message redraw object */ /* TODO: set message doesnt work with a loadbang */ /* TODO: complete inlet draw/erase logic */ +/* TODO: unbind text from all key events when selected */ +/* TODO try binding to FocusIn and FocusOut for making selection */ #ifdef _MSC_VER #pragma warning( disable : 4244 ) @@ -38,6 +40,15 @@ #define BACKGROUNDCOLOR "grey70" +#define TKW_HANDLE_HEIGHT 10 +#define TKW_HANDLE_WIDTH 10 + +#define SCOPE_SELBDWIDTH 3.0 +#define SCOPE_DEFWIDTH 130 /* CHECKED */ +#define SCOPE_MINWIDTH 66 +#define SCOPE_DEFHEIGHT 130 /* CHECKED */ +#define SCOPE_MINHEIGHT 34 + #define TOTAL_INLETS 1 #define TOTAL_OUTLETS 2 @@ -46,11 +57,17 @@ typedef struct _entry { t_object x_obj; + t_canvas *x_canvas; + t_glist *x_glist; int x_rect_width; int x_rect_height; t_symbol* x_receive_name; + int h_dragon; + int h_dragx; + int h_dragy; + /* TODO: these all should be settable by messages */ int x_height; int x_width; @@ -65,8 +82,8 @@ typedef struct _entry t_float x_border; t_symbol *x_relief; t_int x_have_scrollbar; - - t_canvas *canvas; + t_int x_selected; + /* IDs for Tk widgets */ char *tcl_namespace; char *canvas_id; @@ -74,7 +91,9 @@ typedef struct _entry char *text_id; char *scrollbar_id; char *handle_id; - char *window_id; + char *window_tag; + char *all_tag; + char *outline_tag; t_outlet* x_data_outlet; t_outlet* x_status_outlet; @@ -102,6 +121,8 @@ static void entry_select(t_gobj *z, t_glist *glist, int state); static void entry_activate(t_gobj *z, t_glist *glist, int state); static void entry_delete(t_gobj *z, t_glist *glist); static void entry_vis(t_gobj *z, t_glist *glist, int vis); +static void entry_activate(t_gobj *x, struct _glist *glist, int state); +//static int entry_click(t_gobj *x, struct _glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit); static void entry_save(t_gobj *z, t_binbuf *b); @@ -128,7 +149,7 @@ static void set_tk_widget_ids(t_entry *x, t_canvas *canvas) { char buf[MAXPDSTRING]; - x->canvas = canvas; + x->x_canvas = canvas; /* Tk ID for the current canvas that this object is drawn in */ sprintf(buf,".x%lx.c", (long unsigned int) canvas); @@ -140,29 +161,26 @@ static void set_tk_widget_ids(t_entry *x, t_canvas *canvas) x->frame_id = getbytes(strlen(buf)); strcpy(x->frame_id, buf); - sprintf(buf,"%s.text", x->frame_id); + sprintf(buf,"%s.text%lx", x->frame_id, (long unsigned int)x); x->text_id = getbytes(strlen(buf)); strcpy(x->text_id, buf); /* Tk ID for the "text", the meat! */ sprintf(buf,"%s.window%lx", x->canvas_id, (long unsigned int)x); - x->window_id = getbytes(strlen(buf)); - strcpy(x->window_id, buf); /* Tk ID for the resizing "window" */ + x->window_tag = getbytes(strlen(buf)); + strcpy(x->window_tag, buf); /* Tk ID for the resizing "window" */ + post(""); sprintf(buf,"%s.handle%lx", x->canvas_id, (long unsigned int)x); x->handle_id = getbytes(strlen(buf)); strcpy(x->handle_id, buf); /* Tk ID for the resizing "handle" */ - sprintf(buf,"%s.scrollbar", x->frame_id); + sprintf(buf,"%s.scrollbar%lx", x->frame_id, (long unsigned int)x); x->scrollbar_id = getbytes(strlen(buf)); strcpy(x->scrollbar_id, buf); /* Tk ID for the optional "scrollbar" */ - post("buf: %s scrollbar_id %s", buf, x->scrollbar_id); - post("buf: %s handle_id %s", buf, x->handle_id); -} - -static void draw_resize_handle(t_entry *x) -{ - + sprintf(buf,"all%lx", (long unsigned int)x); + x->all_tag = getbytes(strlen(buf)); + strcpy(x->all_tag, buf); /* Tk ID for the optional "scrollbar" */ } static int calculate_onset(t_entry *x, t_glist *glist, @@ -185,35 +203,35 @@ static void draw_inlets(t_entry *x, t_glist *glist, int firsttime, onset = calculate_onset(x, glist, i, total_inlets); if (firsttime) { - sys_vgui("%s create rectangle %d %d %d %d -tags {%xi%d %xi}\n", + sys_vgui("%s create rectangle %d %d %d %d -tags {%xi%d %xi %s}\n", x->canvas_id, onset, text_ypix(&x->x_obj, glist) - 1, onset + IOWIDTH, text_ypix(&x->x_obj, glist), - x, i, x); + x, i, x, x->all_tag); } - else +/* else { sys_vgui("%s coords %xi%d %d %d %d %d\n", x->canvas_id, x, i, onset, text_ypix(&x->x_obj, glist) - 1, onset + IOWIDTH, text_ypix(&x->x_obj, glist)); - } + }*/ } for (i = 0; i < total_outlets; i++) /* outlets */ { onset = calculate_onset(x, glist, i, total_outlets); if (firsttime) { - sys_vgui("%s create rectangle %d %d %d %d -tags {%xo%d %xo}\n", + sys_vgui("%s create rectangle %d %d %d %d -tags {%xo%d %xo %s}\n", x->canvas_id, onset, text_ypix(&x->x_obj, glist) + x->x_rect_height - 1, onset + IOWIDTH, text_ypix(&x->x_obj, glist) + x->x_rect_height, - x, i, x); + x, i, x, x->all_tag); } - else +/* else { sys_vgui("%s coords %xo%d %d %d %d %d\n", x->canvas_id, x, i, onset, text_ypix(&x->x_obj, glist) + x->x_rect_height - 1, onset + IOWIDTH, text_ypix(&x->x_obj, glist) + x->x_rect_height); - } + }*/ } DEBUG(post("draw inlet end");); } @@ -242,20 +260,31 @@ static void erase_scrollbar(t_entry *x) x->x_have_scrollbar = 0; } +static void draw_resize_handle(t_entry *x) +{ +} + +static void erase_resize_handle(t_entry *x) +{ +} + + static void bind_button_events(t_entry *x) { + sys_vgui("bind %s <Button> {pd [concat %s click 1 \\;]}\n", + x->text_id, x->x_receive_name->s_name); sys_vgui("bind %s <Button-2> \ {pdtk_canvas_popup .x%lx [expr %%x + %d] [expr %%y + %d] 0 0} \n", - x->text_id, x->canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); + x->text_id, x->x_canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); sys_vgui("bind %s <Control-Button> \ {pdtk_canvas_popup .x%lx [expr %%x + %d] [expr %%y + %d] 0 0} \n", - x->text_id, x->canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); + x->text_id, x->x_canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); sys_vgui("bind %s <Button-3> \ {pdtk_canvas_popup .x%lx [expr %%x + %d] [expr %%y + %d] 0 0} \n", - x->text_id, x->canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); + x->text_id, x->x_canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); sys_vgui("bind %s <Control-Button> \ {pdtk_canvas_popup .x%lx [expr %%x + %d] [expr %%y + %d] 0 0} \n", - x->text_id, x->canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); + x->text_id, x->x_canvas, x->x_obj.te_xpix, x->x_obj.te_ypix); } static void create_widget(t_entry *x) @@ -276,10 +305,10 @@ static void create_widget(t_entry *x) -highlightthickness 2 -relief sunken -bg \"%s\" -fg \"%s\" \ -yscrollcommand {%s set} \n", x->text_id, - x->x_font_face->s_name, x->x_font_size, x->x_font_weight->s_name, -x->x_bgcolour->s_name, x->x_fgcolour->s_name, + x->x_font_face->s_name, x->x_font_size, x->x_font_weight->s_name, + x->x_bgcolour->s_name, x->x_fgcolour->s_name, x->scrollbar_id); - sys_vgui("scrollbar %s -command {%s yview} \n", + sys_vgui("scrollbar %s -command {%s yview}\n", x->scrollbar_id, x->text_id); sys_vgui("pack %s -side left -fill both -expand 1 \n", x->text_id); sys_vgui("pack %s -side bottom -fill both -expand 1 \n", x->frame_id); @@ -293,20 +322,21 @@ x->x_bgcolour->s_name, x->x_fgcolour->s_name, static void entry_drawme(t_entry *x, t_glist *glist, int firsttime) { - DEBUG(post("entry_drawme: firsttime %d canvas %s glist %s", firsttime, x->canvas, glist);); + DEBUG(post("entry_drawme: firsttime %d canvas %lx glist %lx", firsttime, x->x_canvas, glist);); set_tk_widget_ids(x,glist_getcanvas(glist)); if (firsttime) { create_widget(x); /* TODO: what is this window for? */ - sys_vgui("%s create window %d %d -anchor nw -window %s \ - -tags %xS -width %d -height %d \n", x->canvas_id, + sys_vgui("%s create window %d %d -anchor nw -window %s \ + -tags {%s %s} -width %d -height %d \n", x->canvas_id, text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), - x->frame_id,x, x->x_width, x->x_height); + x->frame_id, x->window_tag, x->all_tag, x->x_width, x->x_height); } else { - sys_vgui("%s coords %xS %d %d\n", x->canvas_id, x, - text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)); + post("NO MORE COORDS"); +// sys_vgui("%s coords %s %d %d\n", x->canvas_id, x->all_tag, +// text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)); } if(glist->gl_edit) /* this is buggy logic */ draw_inlets(x, glist, firsttime, TOTAL_INLETS, TOTAL_OUTLETS); @@ -318,11 +348,12 @@ static void entry_drawme(t_entry *x, t_glist *glist, int firsttime) static void entry_erase(t_entry* x,t_glist* glist) { - DEBUG(post("entry_erase: canvas %s glist %s", x->canvas, glist);); + DEBUG(post("entry_erase: canvas %lx glist %lx", x->x_canvas, glist);); - erase_inlets(x); + set_tk_widget_ids(x,glist_getcanvas(glist)); +// erase_inlets(x); sys_vgui("destroy %s\n", x->frame_id); - sys_vgui("%s delete %xS\n", x->canvas_id, x); + sys_vgui("%s delete %s\n", x->canvas_id, x->all_tag); } @@ -348,17 +379,18 @@ static void entry_getrect(t_gobj *z, t_glist *owner, static void entry_displace(t_gobj *z, t_glist *glist, int dx, int dy) { t_entry *x = (t_entry *)z; - DEBUG(post("entry_displace: canvas %s glist %s", x->canvas, glist);); + DEBUG(post("entry_displace: canvas %lx glist %lx", x->x_canvas, glist);); x->x_obj.te_xpix += dx; x->x_obj.te_ypix += dy; if (glist_isvisible(glist)) { - sys_vgui("%s coords %xSEL %d %d %d %d\n", x->canvas_id, x, + set_tk_widget_ids(x,glist_getcanvas(glist)); + sys_vgui("%s move %s %d %d\n", x->canvas_id, x->all_tag, dx, dy); +/* sys_vgui("%s coords %s %d %d %d %d\n", x->canvas_id, x->all_tag, text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)-1, text_xpix(&x->x_obj, glist) + x->x_rect_width, - text_ypix(&x->x_obj, glist) + x->x_rect_height-2); - - entry_drawme(x, glist, 0); + text_ypix(&x->x_obj, glist) + x->x_rect_height-2);*/ +// entry_drawme(x, glist, 0); canvas_fixlinesfor(glist_getcanvas(glist), (t_text*) x); } DEBUG(post("displace end");); @@ -367,19 +399,42 @@ static void entry_displace(t_gobj *z, t_glist *glist, int dx, int dy) static void entry_select(t_gobj *z, t_glist *glist, int state) { t_entry *x = (t_entry *)z; - DEBUG(post("entry_select: canvas %s glist %s", x->canvas, glist);); - - if (state) { -// sys_vgui(".x%x.c itemconfigure %s -outline blue -width %f -fill %s\n", -// x->canvas_id, x->x_bgtag, SCOPE_SELBDWIDTH, SCOPE_SELCOLOR); - sys_vgui("%s create rectangle %d %d %d %d -tags %xSEL -outline blue\n", + int x1, y1, x2, y2; + DEBUG(post("entry_select: canvas %lx glist %lx state %d", x->x_canvas, glist, state);); + +// set_tk_widget_ids(x,glist_getcanvas(glist)); + if( (state) && (!x->x_selected)) + { + entry_getrect(z, glist, &x1, &y1, &x2, &y2); + sys_vgui("%s configure -bg #bdbddd -state disabled\n", x->text_id); + sys_vgui("canvas %s -width %d -height %d -bg #fedc00 -bd 0 -cursor top_left_arrow\n", + x->handle_id, TKW_HANDLE_WIDTH, TKW_HANDLE_HEIGHT); + sys_vgui("%s create window %f %f -anchor nw -width %d -height %d -window %s -tags %s\n", + x->canvas_id, x2 - (TKW_HANDLE_WIDTH - SCOPE_SELBDWIDTH), + y2 - (TKW_HANDLE_HEIGHT - SCOPE_SELBDWIDTH), + TKW_HANDLE_WIDTH, TKW_HANDLE_HEIGHT, + x->handle_id, x->all_tag); + sys_vgui("bind %s <Button> {pd [concat %s resize_click 1 \\;]}\n", + x->handle_id, x->x_receive_name->s_name); + sys_vgui("bind %s <ButtonRelease> {pd [concat %s resize_click 0 \\;]}\n", + x->handle_id, x->x_receive_name->s_name); + sys_vgui("bind %s <Motion> {pd [concat %s resize_motion %%x %%y \\;]}\n", + x->handle_id, x->x_receive_name->s_name); +/* */ + sys_vgui("%s create rectangle %d %d %d %d -tags {%xSEL %s} -outline blue -width 2\n", x->canvas_id, text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)-1, text_xpix(&x->x_obj, glist) + x->x_rect_width, - text_ypix(&x->x_obj, glist) + x->x_rect_height-2, x); + text_ypix(&x->x_obj, glist) + x->x_rect_height-2, + x, x->all_tag); + x->x_selected = 1; } - else { + else if (!state) + { + sys_vgui("%s configure -bg grey -state normal\n", x->text_id); sys_vgui("%s delete %xSEL\n", x->canvas_id, x); + sys_vgui("destroy %s\n", x->handle_id); + x->x_selected = 0; } } @@ -395,7 +450,7 @@ static void entry_activate(t_gobj *z, t_glist *glist, int state) static void entry_delete(t_gobj *z, t_glist *glist) { - DEBUG(post("entry_delete: glist %s", glist);); + DEBUG(post("entry_delete: glist %lx", glist);); t_text *x = (t_text *)z; canvas_deletelinesfor(glist_getcanvas(glist), x); } @@ -404,7 +459,7 @@ static void entry_delete(t_gobj *z, t_glist *glist) static void entry_vis(t_gobj *z, t_glist *glist, int vis) { t_entry *x = (t_entry*)z; - DEBUG(post("entry_vis: vis %d canvas %s glist %s", vis, x->canvas, glist);); + DEBUG(post("entry_vis: vis %d canvas %lx glist %lx", vis, x->x_canvas, glist);); t_rtext *y; if (vis) { y = (t_rtext *) rtext_new(glist, (t_text *)z); @@ -639,6 +694,75 @@ static void entry_size(t_entry *x, t_float width, t_float height) DEBUG(post("entry_size");); x->x_height = height; x->x_width = width; +// sys_vgui("%s configure -width %d -height %d \n", x->text_id, (int)width, (int)height); + sys_vgui("%s itemconfigure %s -width %d -height %d \n", + x->canvas_id, x->all_tag, (int)width, (int)height); +} + +static void entry_click_callback(t_entry *x, t_floatarg f) +{ + if( (x->x_glist->gl_edit) && (x->x_glist == x->x_canvas) ) + { + entry_select((t_gobj *)x, x->x_glist, f); + } +} + +static void entry_resize_click_callback(t_entry *x, t_floatarg f) +{ +/* + t_canvas *canvas = (glist_isvisible(x->x_glist) ? x->x_canvas : 0); + int newstate = (int)f; + if (x->h_dragon && newstate == 0) + { + x->x_width += x->h_dragx; + x->x_height += x->h_dragy; + if (canvas) + { + sys_vgui(".x%x.c delete %s\n", canvas, x->outline_tag); + scope_revis(x, canvas); + sys_vgui("destroy %s\n", x->handle_id); + entry_select((t_gobj *)x, x->x_glist, 1); + canvas_fixlinesfor(x->x_glist, (t_text *)x); // 2nd inlet + } + } + else if (!x->h_dragon && newstate) + { + if (canvas) + { + int x1, y1, x2, y2; + entry_getrect((t_gobj *)x, x->x_glist, &x1, &y1, &x2, &y2); + sys_vgui("lower %s\n", x->handle_id); + sys_vgui(".x%x.c create rectangle %d %d %d %d -outline blue -width %f -tags %s\n", + canvas, x1, y1, x2, y2, SCOPE_SELBDWIDTH, x->outline_tag); + } + x->h_dragx = 0; + x->h_dragy = 0; + } + x->h_dragon = newstate; +*/ +} + +static void entry_resize_motion_callback(t_entry *x, t_floatarg f1, t_floatarg f2) +{ +/* + if (x->h_dragon) + { + int dx = (int)f1, dy = (int)f2; + int x1, y1, x2, y2, newx, newy; + entry_getrect((t_gobj *)x, x->x_glist, &x1, &y1, &x2, &y2); + newx = x2 + dx; + newy = y2 + dy; + if (newx > x1 + SCOPE_MINWIDTH && newy > y1 + SCOPE_MINHEIGHT) + { + t_canvas *canvas = (glist_isvisible(x->x_glist) ? x->x_canvas : 0); + if (canvas) + sys_vgui(".x%x.c coords %s %d %d %d %d\n", + canvas, x->outline_tag, x1, y1, newx, newy); + x->h_dragx = dx; + x->h_dragy = dy; + } + } +*/ } static void entry_free(t_entry *x) @@ -657,6 +781,7 @@ static void *entry_new(t_symbol *s, int argc, t_atom *argv) x->x_font_size = 10; x->x_font_weight = gensym("normal"); x->x_have_scrollbar = 0; + x->x_selected = 0; if (argc < 4) { @@ -687,7 +812,8 @@ static void *entry_new(t_symbol *s, int argc, t_atom *argv) pd_bind(&x->x_obj.ob_pd, x->x_receive_name); post("2"); - set_tk_widget_ids(x, canvas_getcurrent()); + x->x_glist = canvas_getcurrent(); + set_tk_widget_ids(x, x->x_glist); return (x); } @@ -757,6 +883,13 @@ void entry_setup(void) { gensym("fgcolour"), A_DEFSYMBOL, 0); + + class_addmethod(entry_class, (t_method)entry_click_callback, + gensym("click"), A_FLOAT, 0); + class_addmethod(entry_class, (t_method)entry_resize_click_callback, + gensym("resize_click"), A_FLOAT, 0); + class_addmethod(entry_class, (t_method)entry_resize_motion_callback, + gensym("resize_motion"), A_FLOAT, A_FLOAT, 0); class_setwidget(entry_class,&entry_widgetbehavior); class_setsavefn(entry_class,&entry_save); |