Index: trunk/src_plugins/order/order.c =================================================================== --- trunk/src_plugins/order/order.c (revision 26274) +++ trunk/src_plugins/order/order.c (revision 26275) @@ -31,14 +31,36 @@ #include "actions.h" #include "pcb-printf.h" #include "plugins.h" +#include "hid_dad.h" +#include "order.h" + static const char *order_cookie = "order plugin"; -static const char pcb_acts_OrderPCB[] = "orderPCB()"; +vtp0_t pcb_order_imps; + +void pcb_order_reg(const pcb_order_imp_t *imp) +{ + vtp0_append(&pcb_order_imps, (void *)imp); +} + + +#include "order_dlg.c" + +static const char pcb_acts_OrderPCB[] = "orderPCB([gui])"; static const char pcb_acth_OrderPCB[] = "Order the board from a fab"; fgw_error_t pcb_act_OrderPCB(fgw_arg_t *res, int argc, fgw_arg_t *argv) { - pcb_message(PCB_MSG_ERROR, "OrderPCB() not yet implemented\n"); + const char *cmd = "gui"; + + PCB_ACT_MAY_CONVARG(1, FGW_STR, OrderPCB, cmd = argv[1].val.str); + + if (strcmp(cmd, "gui") == 0) { + PCB_ACT_IRES(order_dialog()); + return 0; + } + + pcb_message(PCB_MSG_ERROR, "CLI version of OrderPCB() not yet implemented\n"); PCB_ACT_IRES(-1); return 0; } Index: trunk/src_plugins/order/order.h =================================================================== --- trunk/src_plugins/order/order.h (revision 26274) +++ trunk/src_plugins/order/order.h (revision 26275) @@ -27,11 +27,18 @@ #ifndef PCB_ORDER_H #define PCB_ORDER_H +#include + /* order implementation - registered by an order plugin */ typedef struct pcb_order_imp_s pcb_order_imp_t; struct pcb_order_imp_s { + const char *name; int (*enabled)(pcb_order_imp_t *imp); /* returns 1 if the plugin is enabled */ void (*populate_dad)(pcb_order_imp_t *imp); }; +extern vtp0_t pcb_order_imps; /* of (pcb_order_imp_t *) items */ + +void pcb_order_reg(const pcb_order_imp_t *imp); + #endif Index: trunk/src_plugins/order/order_dlg.c =================================================================== --- trunk/src_plugins/order/order_dlg.c (nonexistent) +++ trunk/src_plugins/order/order_dlg.c (revision 26275) @@ -0,0 +1,51 @@ +typedef struct{ + PCB_DAD_DECL_NOINIT(dlg) + int active; /* already open - allow only one instance */ + vtp0_t names; +} order_ctx_t; + +order_ctx_t order_ctx; + +static void order_close_cb(void *caller_data, pcb_hid_attr_ev_t ev) +{ + order_ctx_t *ctx = caller_data; + PCB_DAD_FREE(ctx->dlg); + memset(ctx, 0, sizeof(order_ctx_t)); +} + +static int order_dialog(void) +{ + pcb_hid_dad_buttons_t clbtn[] = {{"Close", 0}, {NULL, 0}}; + pcb_order_imp_t *imp; + int n; + + if (order_ctx.active) + return; /* do not open another */ + + if (pcb_order_imps.used == 0) { + pcb_message(PCB_MSG_ERROR, "OrderPCB(): there are no ordering plugins compiled/loaded\n"); + return -1; + } + + order_ctx.names.used = 0; + vtp0_enlarge(&order_ctx.names, pcb_order_imps.used); + for(n = 0; n < pcb_order_imps.used; n++) { + imp = pcb_order_imps.array[n]; + vtp0_set(&order_ctx.names, n, (char *)imp->name); + } + vtp0_set(&order_ctx.names, n, NULL); + + PCB_DAD_BEGIN_TABBED(order_ctx.dlg, order_ctx.names.array); + PCB_DAD_COMPFLAG(order_ctx.dlg, PCB_HATF_EXPFILL | PCB_HATF_LEFT_TAB); + for(n = 0; n < pcb_order_imps.used; n++) { + PCB_DAD_BEGIN_VBOX(order_ctx.dlg); + PCB_DAD_LABEL(order_ctx.dlg, "TODO"); + PCB_DAD_END(order_ctx.dlg); + } + PCB_DAD_END(order_ctx.dlg); + + /* set up the context */ + order_ctx.active = 1; + + PCB_DAD_NEW("EDIT_THIS_ID", order_ctx.dlg, "EDIT THIS: title", &order_ctx, pcb_false, order_close_cb); +}