Index: trunk/src/extobj_helper.h =================================================================== --- trunk/src/extobj_helper.h (revision 28909) +++ trunk/src/extobj_helper.h (revision 28910) @@ -27,6 +27,8 @@ #include "obj_subc.h" #include "conf_core.h" #include "hid_inlines.h" +#include "hid_dad.h" +#include "change.h" #include "undo.h" /*** API ***/ @@ -124,3 +126,45 @@ pcb_render->draw_line(pcb_draw_out.fgGC, x, y + unit, x + unit/2, y + unit); pcb_render->draw_line(pcb_draw_out.fgGC, x, y + unit/2, x + unit/3, y + unit/2); } + +/*** dialog box build ***/ + +PCB_INLINE void pcb_exto_dlg_coord_cb(void *hid_ctx, void *caller_data, pcb_hid_attribute_t *attr) +{ + pcb_subc_t *subc = caller_data; + pcb_board_t *pcb; + pcb_data_t *data; + char tmp[128]; + + if (subc->parent_type != PCB_PARENT_DATA) + return; + data = subc->parent.data; + if (data->parent_type != PCB_PARENT_BOARD) + return; + pcb = data->parent.board; + + pcb_snprintf(tmp, sizeof(tmp), "%$mm", attr->val.crd); + pcb_uchg_attr(pcb, (pcb_any_obj_t *)subc, (char *)attr->user_data, tmp); + pcb_trace("chg: %s\n", (char *)attr->user_data); + pcb_gui->invalidate_all(pcb_gui); +} + +#define pcb_exto_dlg_coord(dlg, subc, vis_name, attr_name, help) \ +do { \ + double d; \ + pcb_coord_t currval = 0; \ + const pcb_unit_t *unit_out; \ + int wid; \ + char *sval = pcb_attribute_get(&subc->Attributes, attr_name); \ + if (sval != NULL) \ + pcb_get_value_unit(sval, NULL, 0, &d, &unit_out); \ + currval = d; \ + PCB_DAD_LABEL(dlg, vis_name); \ + if (help != NULL) PCB_DAD_HELP(dlg, help); \ + PCB_DAD_COORD(dlg, ""); \ + if (help != NULL) PCB_DAD_HELP(dlg, help); \ + PCB_DAD_CHANGE_CB(dlg, pcb_exto_dlg_coord_cb); \ + wid = PCB_DAD_CURRENT(dlg); \ + dlg[wid].user_data = (void *)attr_name; \ + PCB_DAD_DEFAULT_NUM(dlg, currval); \ +} while(0) Index: trunk/src_plugins/exto_std/exto_std.c =================================================================== --- trunk/src_plugins/exto_std/exto_std.c (revision 28909) +++ trunk/src_plugins/exto_std/exto_std.c (revision 28910) @@ -40,6 +40,7 @@ #include "extobj_helper.h" #include "conf_core.h" #include "hid_inlines.h" +#include "hid_dad.h" static const char *exto_std_cookie = "exto_std plugin"; Index: trunk/src_plugins/exto_std/line_of_vias.c =================================================================== --- trunk/src_plugins/exto_std/line_of_vias.c (revision 28909) +++ trunk/src_plugins/exto_std/line_of_vias.c (revision 28910) @@ -31,6 +31,8 @@ #include "../src_plugins/lib_compat_help/pstk_compat.h" typedef struct { + PCB_DAD_DECL_NOINIT(dlg) + int gui_active; pcb_coord_t pitch; pcb_coord_t clearance; } line_of_vias; @@ -37,8 +39,13 @@ static void pcb_line_of_vias_del_pre(pcb_subc_t *subc) { + line_of_vias *lov = subc->extobj_data; pcb_trace("LoV del_pre\n"); - free(subc->extobj_data); + + if ((lov != NULL) && (lov->gui_active)) + PCB_DAD_FREE(lov->dlg); + + free(lov); subc->extobj_data = NULL; } @@ -282,9 +289,44 @@ return subc; } + +static void pcb_line_of_vias_close_cb(void *caller_data, pcb_hid_attr_ev_t ev) +{ + pcb_subc_t *subc = caller_data; + line_of_vias *lov = subc->extobj_data; + + PCB_DAD_FREE(lov->dlg); + lov->gui_active = 0; +} + static void pcb_line_of_vias_gui_propedit(pcb_subc_t *subc) { + pcb_hid_dad_buttons_t clbtn[] = {{"Close", 0}, {NULL, 0}}; + line_of_vias *lov; + pcb_trace("LoV: gui propedit\n"); + + if (subc->extobj_data == NULL) + subc->extobj_data = calloc(sizeof(line_of_vias), 1); + lov = subc->extobj_data; + + pcb_trace("LoV: active=%d\n", lov->gui_active); + if (lov->gui_active) + return; /* do not open another */ + + PCB_DAD_BEGIN_VBOX(lov->dlg); + PCB_DAD_COMPFLAG(lov->dlg, PCB_HATF_EXPFILL); + PCB_DAD_BEGIN_TABLE(lov->dlg, 2); + pcb_exto_dlg_coord(lov->dlg, subc, "pitch", "extobj::pitch", "target distance between center of vias"); + pcb_exto_dlg_coord(lov->dlg, subc, "clearance", "extobj::clearance", "global clarance value on vias"); + PCB_DAD_END(lov->dlg); + PCB_DAD_BUTTON_CLOSES(lov->dlg, clbtn); + PCB_DAD_END(lov->dlg); + + /* set up the context */ + lov->gui_active = 1; + + PCB_DAD_NEW("line_of_vias", lov->dlg, "Line of vias", subc, pcb_false, pcb_line_of_vias_close_cb); } static pcb_extobj_t pcb_line_of_vias = {