Index: trunk/src_plugins/dialogs/dlg_pref.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref.c (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref.c (revision 35840) @@ -54,8 +54,11 @@ #define PREF_INIT_FUNC Rnd_pref_init_func_dummy -#define PREF_INIT(ctx) \ - PREF_INIT_FUNC(ctx, PREF_TAB-1); +#define PREF_INIT(ctx, hooks_) \ + do { \ + ctx->tab[PREF_TAB].hooks = hooks_; \ + PREF_INIT_FUNC(ctx, PREF_TAB-1); \ + } while(0) /* application tabs */ #undef PREF_TAB @@ -305,7 +308,6 @@ pref_ctx_t *ctx = caller_data; pcb_dlg_pref_sizes_close(ctx); - pcb_dlg_pref_board_close(ctx); pcb_dlg_pref_general_close(ctx); pcb_dlg_pref_lib_close(ctx); pcb_dlg_pref_color_close(ctx); @@ -493,8 +495,8 @@ rnd_event_bind(RND_EVENT_BOARD_META_CHANGED, pref_ev_board_meta_changed, &pref_ctx, pref_cookie); rnd_event_bind(RND_EVENT_MENU_CHANGED, pref_ev_menu_changed, &pref_ctx, pref_cookie); pref_hid = rnd_conf_hid_reg(pref_cookie, &pref_conf_cb); - PREF_INIT_FUNC(&pref_ctx, PREF_TAB); + pref_ctx.tabs = PREF_TAB+1; } void pcb_dlg_pref_uninit(void) Index: trunk/src_plugins/dialogs/dlg_pref.h =================================================================== --- trunk/src_plugins/dialogs/dlg_pref.h (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref.h (revision 35840) @@ -23,11 +23,32 @@ pref_confitem_t *cnext; /* linked list for conf callback - should be NULL initially */ }; +typedef struct Rnd_pref_tab_hook_s Rnd_pref_tab_hook_t; +struct Rnd_pref_tab_hook_s { + const char *tab_label; + + void (*open_cb)(pref_ctx_t *ctx); /* called right after the dialog box is created */ + void (*close_cb)(pref_ctx_t *ctx); /* called from the dialog box is close_cb event */ + void (*create_cb)(pref_ctx_t *ctx); /* called while the dialog box is being created: create widgets in current tab */ + + void (*spare_f1)(); void (*spare_f2)(); void (*spare_f3)(); void (*spare_f4)(); + void *spare_p1, *spare_p2, *spare_p3, *spare_p4; + long spare_l1, spare_l2, spare_l3, spare_l4; +}; + +#define Rnd_PREF_MAX_TAB 32 + struct pref_ctx_s { RND_DAD_DECL_NOINIT(dlg) int wtab, wrole, wrolebox; int active; /* already open - allow only one instance */ + struct { + const Rnd_pref_tab_hook_t *hooks; + void *tabdata; + } tab[Rnd_PREF_MAX_TAB]; + int tabs; /* number of tabs used */ + pref_sizes_t sizes; pref_board_t board; pref_general_t general; Index: trunk/src_plugins/dialogs/dlg_pref_board.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_board.c (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref_board.c (revision 35840) @@ -74,11 +74,6 @@ rnd_actionva(&PCB->hidlib, "Propedit", "board", NULL); } - -void pcb_dlg_pref_board_close(pref_ctx_t *ctx) -{ -} - void pcb_dlg_pref_board_create(pref_ctx_t *ctx) { RND_DAD_BEGIN_TABLE(ctx->dlg, 2); @@ -104,9 +99,15 @@ RND_DAD_END(ctx->dlg); } +static const Rnd_pref_tab_hook_t pref_board = { + "Board meta", + NULL, NULL, + pcb_dlg_pref_board_create +}; + static void pcb_dlg_pref_board_init(pref_ctx_t *ctx, int tab) { - PREF_INIT(ctx); + PREF_INIT(ctx, &pref_board); rnd_trace("INIT pref board tab %d\n", tab); } #undef PREF_INIT_FUNC Index: trunk/src_plugins/dialogs/dlg_pref_color.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_color.c (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref_color.c (revision 35840) @@ -168,9 +168,15 @@ RND_DAD_END(ctx->dlg); } +static const Rnd_pref_tab_hook_t pref_color = { + "Colors", + pcb_dlg_pref_color_open, pcb_dlg_pref_color_close, + pcb_dlg_pref_color_create +}; + static void pcb_dlg_pref_color_init(pref_ctx_t *ctx, int tab) { - PREF_INIT(ctx); + PREF_INIT(ctx, &pref_color); rnd_trace("INIT pref color tab %d\n", tab); } #undef PREF_INIT_FUNC Index: trunk/src_plugins/dialogs/dlg_pref_general.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_general.c (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref_general.c (revision 35840) @@ -92,9 +92,15 @@ RND_DAD_END(ctx->dlg); } +static const Rnd_pref_tab_hook_t pref_general = { + "General", + NULL, pcb_dlg_pref_general_close, + pcb_dlg_pref_general_create +}; + static void pcb_dlg_pref_general_init(pref_ctx_t *ctx, int tab) { - PREF_INIT(ctx); + PREF_INIT(ctx, &pref_general); rnd_trace("INIT pref general tab %d\n", tab); } #undef PREF_INIT_FUNC Index: trunk/src_plugins/dialogs/dlg_pref_layer.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_layer.c (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref_layer.c (revision 35840) @@ -60,9 +60,15 @@ RND_DAD_END(ctx->dlg); } +static const Rnd_pref_tab_hook_t pref_layer = { + "Layers", + NULL, NULL, + pcb_dlg_pref_layer_create +}; + static void pcb_dlg_pref_layer_init(pref_ctx_t *ctx, int tab) { - PREF_INIT(ctx); + PREF_INIT(ctx, &pref_layer); rnd_trace("INIT pref layer tab %d\n", tab); } #undef PREF_INIT_FUNC Index: trunk/src_plugins/dialogs/dlg_pref_lib.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_lib.c (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref_lib.c (revision 35840) @@ -467,12 +467,18 @@ pref_lib_conf2dlg_post(cn, -1); } +static const Rnd_pref_tab_hook_t pref_lib = { + "Library", + pcb_dlg_pref_lib_open, pcb_dlg_pref_lib_close, + pcb_dlg_pref_lib_create +}; + void pcb_dlg_pref_lib_init(pref_ctx_t *ctx, int tab) { static rnd_conf_hid_callbacks_t cbs_spth; rnd_conf_native_t *cn = rnd_conf_get_field("rc/library_search_paths"); - PREF_INIT(ctx); + PREF_INIT(ctx, &pref_lib); rnd_trace("INIT pref lib tab %d\n", tab); if (cn != NULL) { Index: trunk/src_plugins/dialogs/dlg_pref_sizes.c =================================================================== --- trunk/src_plugins/dialogs/dlg_pref_sizes.c (revision 35839) +++ trunk/src_plugins/dialogs/dlg_pref_sizes.c (revision 35840) @@ -157,12 +157,18 @@ RND_DAD_END(ctx->dlg); } +static const Rnd_pref_tab_hook_t pref_sizes = { + "Sizes & DRC", + NULL, pcb_dlg_pref_sizes_close, + pcb_dlg_pref_sizes_create +}; + static void pcb_dlg_pref_sizes_init(pref_ctx_t *ctx, int tab) { static rnd_conf_hid_callbacks_t cbs_isle; rnd_conf_native_t *cn = rnd_conf_get_field("design/poly_isle_area"); - PREF_INIT(ctx); + PREF_INIT(ctx, &pref_sizes); rnd_trace("INIT pref sizes tab %d\n", tab); if (cn != NULL) {