Index: dlg_library.c =================================================================== --- dlg_library.c (revision 36173) +++ dlg_library.c (revision 36174) @@ -57,7 +57,23 @@ #define MAX_PARAMS 128 -typedef struct{ +typedef struct library_ctx_s library_ctx_t; + +typedef struct { + int pactive; /* already open - allow only one instance */ + int pwdesc; + RND_DAD_DECL_NOINIT(pdlg) + pcb_fplibrary_t *last_l; + char *example, *help_params; + htsi_t param_names; /* param_name -> param_idx */ + int pwid[MAX_PARAMS]; /* param_idx -> widget_idx (for the input field widget) */ + char *pnames[MAX_PARAMS]; /* param_idx -> parameter_name (also key stored in the param_names hash */ + int num_params, first_optional; + gds_t descr; + library_ctx_t *lib_ctx; +} library_param_ctx_t; + +struct library_ctx_s { RND_DAD_DECL_NOINIT(dlg) int wtree, wpreview, wtags, wfilt, wpend, wnopend, wedit; int wvis_cpr, wvis_slk, wvis_mnp, wvis_doc; @@ -70,19 +86,10 @@ rnd_hidval_t timer; int timer_active; - /* for the parametric */ - int pactive; /* already open - allow only one instance */ - int pwdesc; - RND_DAD_DECL_NOINIT(pdlg) - pcb_fplibrary_t *last_l; - char *example, *help_params; - htsi_t param_names; /* param_name -> param_idx */ - int pwid[MAX_PARAMS]; /* param_idx -> widget_idx (for the input field widget) */ - char *pnames[MAX_PARAMS]; /* param_idx -> parameter_name (also key stored in the param_names hash */ - int num_params, first_optional; + library_param_ctx_t param; /* for the parametric */ + unsigned last_clicked:1; /* 1 if the last user action was a click in the tree, 0 if it was an edit of the filter text */ - gds_t descr; -} library_ctx_t; +}; library_ctx_t library_ctx; @@ -237,11 +244,19 @@ param_selected = (l != NULL) && (l->type == PCB_LIB_FOOTPRINT) && (l->data.fp.type == PCB_FP_PARAMETRIC); } - param_entered = !ctx->pactive && (otext != NULL) && (strchr(otext, '(') != NULL); + param_entered = !ctx->param.pactive && (otext != NULL) && (strchr(otext, '(') != NULL); rnd_gui->attr_dlg_widget_state(ctx->dlg_hid_ctx, ctx->wedit, param_selected || param_entered); } +static void library_set_filter(library_ctx_t *ctx, const char *text) +{ + rnd_hid_attr_val_t hv; + + hv.str = text; + rnd_gui->attr_dlg_set_value(ctx->dlg_hid_ctx, ctx->wfilt, &hv); +} + #include "dlg_library_param.c" static void library_close_cb(void *caller_data, rnd_hid_attr_ev_t ev) @@ -248,11 +263,7 @@ { library_ctx_t *ctx = caller_data; - if (ctx->pactive) { - ctx->pactive = 0; - RND_DAD_FREE(ctx->pdlg); - } - + library_param_dialog_close(&ctx->param); timed_update_preview(ctx, 0); pcb_board_free(ctx->prev_pcb); RND_DAD_FREE(ctx->dlg); @@ -311,7 +322,7 @@ static void library_select_show_param_example(library_ctx_t *ctx, pcb_fplibrary_t *l) { char line[1024], *arg, *cmd, *end; - FILE *f = library_param_get_help(ctx, l); + FILE *f = library_param_get_help(&ctx->param, l); while(fgets(line, sizeof(line), f) != NULL) { cmd = strchr(line, '@'); if ((cmd == NULL) || (cmd[1] != '@')) @@ -358,7 +369,8 @@ update_edit_button(ctx); } else { /* second click */ - library_param_dialog(ctx, l); + ctx->param.lib_ctx = ctx; + library_param_dialog(&ctx->param, l, ctx->dlg[ctx->wfilt].val.str); close_param = 0; } } @@ -375,8 +387,10 @@ last = l; } - if (close_param) - library_param_dialog(ctx, NULL); + if (close_param) { + ctx->param.lib_ctx = ctx; + library_param_dialog(&ctx->param, NULL, NULL); + } hv.str = NULL; rnd_gui->attr_dlg_set_value(ctx->dlg_hid_ctx, ctx->wpreview, &hv); @@ -605,7 +619,8 @@ if (rnew != NULL) { if (r != rnew) rnd_dad_tree_jumpto(attr, rnew); - library_param_dialog(ctx, rnew->user_data); + ctx->param.lib_ctx = ctx; + library_param_dialog(&ctx->param, rnew->user_data, ctx->dlg[ctx->wfilt].val.str); } else rnd_message(RND_MSG_ERROR, "No such parametric footprint: '%s'\n", name); Index: dlg_library_param.c =================================================================== --- dlg_library_param.c (revision 36173) +++ dlg_library_param.c (revision 36174) @@ -31,7 +31,7 @@ static void library_param_close_cb(void *caller_data, rnd_hid_attr_ev_t ev) { - library_ctx_t *ctx = caller_data; + library_param_ctx_t *ctx = caller_data; htsi_entry_t *e; gds_uninit(&ctx->descr); @@ -45,7 +45,7 @@ ctx->pactive = 0; RND_DAD_FREE(ctx->pdlg); } - update_edit_button(ctx); + update_edit_button(ctx->lib_ctx); } #define colsplit() \ @@ -57,7 +57,7 @@ } \ } while(0) -static void set_attr(library_ctx_t *ctx, int pidx, char *val) +static void set_attr(library_param_ctx_t *ctx, int pidx, char *val) { rnd_hid_attr_val_t hv; rnd_hid_attribute_t *a = &ctx->pdlg[ctx->pwid[pidx]]; @@ -141,43 +141,43 @@ if (curr_type == RND_HATT_END) \ break; \ pre_append(); \ - RND_DAD_LABEL(library_ctx.pdlg, name); \ - RND_DAD_HELP(library_ctx.pdlg, rnd_strdup(help)); \ + RND_DAD_LABEL(ctx->pdlg, name); \ + RND_DAD_HELP(ctx->pdlg, rnd_strdup(help)); \ switch(curr_type) { \ case RND_HATT_COORD: \ case RND_HATT_END: \ - RND_DAD_COORD(library_ctx.pdlg); \ - ctx->pwid[curr] = RND_DAD_CURRENT(library_ctx.pdlg); \ - RND_DAD_MINMAX(library_ctx.pdlg, 0, RND_MM_TO_COORD(512)); \ - RND_DAD_CHANGE_CB(library_ctx.pdlg, library_param_cb); \ + RND_DAD_COORD(ctx->pdlg); \ + ctx->pwid[curr] = RND_DAD_CURRENT(ctx->pdlg); \ + RND_DAD_MINMAX(ctx->pdlg, 0, RND_MM_TO_COORD(512)); \ + RND_DAD_CHANGE_CB(ctx->pdlg, library_param_cb); \ break; \ case RND_HATT_STRING: \ - RND_DAD_STRING(library_ctx.pdlg); \ - ctx->pwid[curr] = RND_DAD_CURRENT(library_ctx.pdlg); \ - RND_DAD_CHANGE_CB(library_ctx.pdlg, library_param_cb); \ + RND_DAD_STRING(ctx->pdlg); \ + ctx->pwid[curr] = RND_DAD_CURRENT(ctx->pdlg); \ + RND_DAD_CHANGE_CB(ctx->pdlg, library_param_cb); \ break; \ case RND_HATT_BOOL: \ - RND_DAD_BOOL(library_ctx.pdlg); \ - ctx->pwid[curr] = RND_DAD_CURRENT(library_ctx.pdlg); \ - RND_DAD_CHANGE_CB(library_ctx.pdlg, library_param_cb); \ + RND_DAD_BOOL(ctx->pdlg); \ + ctx->pwid[curr] = RND_DAD_CURRENT(ctx->pdlg); \ + RND_DAD_CHANGE_CB(ctx->pdlg, library_param_cb); \ break; \ case RND_HATT_ENUM: \ - RND_DAD_ENUM(library_ctx.pdlg, (const char **)curr_enum.array); \ - ctx->pwid[curr] = RND_DAD_CURRENT(library_ctx.pdlg); \ - RND_DAD_CHANGE_CB(library_ctx.pdlg, library_param_cb); \ + RND_DAD_ENUM(ctx->pdlg, (const char **)curr_enum.array); \ + ctx->pwid[curr] = RND_DAD_CURRENT(ctx->pdlg); \ + RND_DAD_CHANGE_CB(ctx->pdlg, library_param_cb); \ vtp0_init(&curr_enum); \ vtp0_append(&curr_enum, rnd_strdup("")); \ break; \ default: \ - RND_DAD_LABEL(library_ctx.pdlg, "internal error: invalid type"); \ + RND_DAD_LABEL(ctx->pdlg, "internal error: invalid type"); \ } \ - RND_DAD_HELP(library_ctx.pdlg, rnd_strdup(help)); \ + RND_DAD_HELP(ctx->pdlg, rnd_strdup(help)); \ ctx->pnames[curr] = rnd_strdup(name); \ htsi_set(&ctx->param_names, ctx->pnames[curr], curr); \ post_append(); \ } while(0) -static int library_param_build(library_ctx_t *ctx, pcb_fplibrary_t *l, FILE *f) +static int library_param_build(library_param_ctx_t *ctx, pcb_fplibrary_t *l, FILE *f) { char line[1024]; char *name = NULL, *help = NULL, *help_def = NULL; @@ -284,7 +284,7 @@ return numrows; } -static char *gen_cmd(library_ctx_t *ctx) +static char *gen_cmd(library_param_ctx_t *ctx) { int n, pushed = 0; gds_t sres; @@ -360,14 +360,12 @@ static void library_param_cb(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr_inp) { - library_ctx_t *ctx = caller_data; + library_param_ctx_t *ctx = caller_data; char *cmd = gen_cmd(ctx); - rnd_hid_attr_val_t hv; - hv.str = cmd; - rnd_gui->attr_dlg_set_value(ctx->dlg_hid_ctx, ctx->wfilt, &hv); + library_set_filter(ctx->lib_ctx, cmd); free(cmd); - timed_update_preview(ctx, 1); + timed_update_preview(ctx->lib_ctx, 1); } static int param_split(char *buf, char *argv[], int amax) @@ -401,7 +399,7 @@ return -1; } -static void load_params(library_ctx_t *ctx, char *user_params) +static void load_params(library_param_ctx_t *ctx, char *user_params) { char *parain; char *parahlp; @@ -474,10 +472,9 @@ free(parahlp); } -int pcb_library_param_fillin(library_ctx_t *ctx, pcb_fplibrary_t *l) +int pcb_library_param_fillin(library_param_ctx_t *ctx, pcb_fplibrary_t *l, const char *filter_txt) { rnd_hid_attr_val_t hv; - const char *filter_txt = ctx->dlg[ctx->wfilt].val.str; if (filter_txt != NULL) { char *sep; @@ -495,11 +492,8 @@ if (filter_txt == NULL) { - filter_txt = ctx->example; - - hv.str = filter_txt; - rnd_gui->attr_dlg_set_value(ctx->dlg_hid_ctx, ctx->wfilt, &hv); + library_set_filter(ctx->lib_ctx, filter_txt); } if (filter_txt != NULL) { @@ -510,8 +504,7 @@ if ((prm == NULL) || (prm[1] == ')')) { if (ctx->example != NULL) { filter_txt = ctx->example; - hv.str = filter_txt; - rnd_gui->attr_dlg_set_value(ctx->dlg_hid_ctx, ctx->wfilt, &hv); + library_set_filter(ctx->lib_ctx, filter_txt); prm = strchr(filter_txt, '('); } } @@ -539,33 +532,33 @@ if (hv.str == NULL) hv.str = ""; rnd_gui->attr_dlg_set_value(ctx->pdlg_hid_ctx, ctx->pwdesc, &hv); - timed_update_preview(ctx, 1); + timed_update_preview(ctx->lib_ctx, 1); return 0; } -static int library_param_open(library_ctx_t *ctx, pcb_fplibrary_t *l, FILE *f) +static int library_param_open(library_param_ctx_t *ctx, pcb_fplibrary_t *l, FILE *f) { rnd_hid_dad_buttons_t clbtn[] = {{"Close", 0}, {NULL, 0}}; int w, oversized = 0; - RND_DAD_BEGIN_VBOX(library_ctx.pdlg); - RND_DAD_COMPFLAG(library_ctx.pdlg, RND_HATF_EXPFILL); - RND_DAD_LABEL(library_ctx.pdlg, "n/a"); - ctx->pwdesc = RND_DAD_CURRENT(library_ctx.pdlg); - RND_DAD_BEGIN_TABLE(library_ctx.pdlg, 2); - RND_DAD_COMPFLAG(library_ctx.pdlg, RND_HATF_EXPFILL); - w = RND_DAD_CURRENT(library_ctx.pdlg); + RND_DAD_BEGIN_VBOX(ctx->pdlg); + RND_DAD_COMPFLAG(ctx->pdlg, RND_HATF_EXPFILL); + RND_DAD_LABEL(ctx->pdlg, "n/a"); + ctx->pwdesc = RND_DAD_CURRENT(ctx->pdlg); + RND_DAD_BEGIN_TABLE(ctx->pdlg, 2); + RND_DAD_COMPFLAG(ctx->pdlg, RND_HATF_EXPFILL); + w = RND_DAD_CURRENT(ctx->pdlg); if (library_param_build(ctx, l, f) > 16) { - library_ctx.pdlg[w].rnd_hatt_flags |= RND_HATF_SCROLL; + ctx->pdlg[w].rnd_hatt_flags |= RND_HATF_SCROLL; oversized = 1; } - RND_DAD_END(library_ctx.pdlg); - RND_DAD_BUTTON_CLOSES(library_ctx.pdlg, clbtn); - RND_DAD_END(library_ctx.pdlg); + RND_DAD_END(ctx->pdlg); + RND_DAD_BUTTON_CLOSES(ctx->pdlg, clbtn); + RND_DAD_END(ctx->pdlg); return oversized; } -static FILE *library_param_get_help(library_ctx_t *ctx, pcb_fplibrary_t *l) +static FILE *library_param_get_help(library_param_ctx_t *ctx, pcb_fplibrary_t *l) { FILE *f; char *cmd; @@ -591,7 +584,7 @@ return f; } -static void library_param_dialog(library_ctx_t *ctx, pcb_fplibrary_t *l) +static void library_param_dialog(library_param_ctx_t *ctx, pcb_fplibrary_t *l, const char *filter_txt) { FILE *f; @@ -600,7 +593,7 @@ ctx->pactive = 0; RND_DAD_FREE(ctx->pdlg); } - update_edit_button(ctx); + update_edit_button(ctx->lib_ctx); } else if (ctx->pactive) /* reopening the same -> nop */ return; @@ -624,13 +617,21 @@ /* oversized dialog got the scroll bar, which would make it small; set preferred size so it opens in reasonable area even when win size not persistent (window palcement code) */ - RND_DAD_DEFSIZE(library_ctx.pdlg, 700, 500); + RND_DAD_DEFSIZE(ctx->pdlg, 700, 500); } rnd_pclose(f); - RND_DAD_NEW("lib_param", library_ctx.pdlg, "pcb-rnd parametric footprint", ctx, rnd_false, library_param_close_cb); + RND_DAD_NEW("lib_param", ctx->pdlg, "pcb-rnd parametric footprint", ctx, rnd_false, library_param_close_cb); - update_edit_button(ctx); - pcb_library_param_fillin(ctx, l); + update_edit_button(ctx->lib_ctx); + pcb_library_param_fillin(ctx, l, filter_txt); } +static void library_param_dialog_close(library_param_ctx_t *ctx) +{ + if (ctx->pactive) { + ctx->pactive = 0; + RND_DAD_FREE(ctx->pdlg); + } +} +