Index: trunk/src_plugins/gui/camv_gui.c =================================================================== --- trunk/src_plugins/gui/camv_gui.c (revision 721) +++ trunk/src_plugins/gui/camv_gui.c (revision 722) @@ -30,6 +30,7 @@ #include #include +#include #include "event.h" #include @@ -172,12 +173,87 @@ return 0; } +static int save_as(rnd_design_t *hl, int what, int as, const char *name) +{ + camv_design_t *camv = (camv_design_t *)hl; + const char *prev_fn, *whats, *prev_loadfn; + char *free_me = NULL; + int need_fsd, save_res = -1; + + if (name == NULL) { + prev_fn = camv->hidlib.fullpath; + if (prev_fn == NULL) + prev_fn = free_me = dup_cwd(); + prev_loadfn = camv->hidlib.loadname; + if (prev_loadfn == NULL) + prev_loadfn = prev_fn; + need_fsd = 1; + } + else { + prev_fn = name; + need_fsd = 0; + } + + /* invoke FSD if needed */ + switch(what) { + case 'd': /* design */ + if (need_fsd) + name = rnd_hid_fileselect(rnd_gui, "Save design", "Save all layers to a design file", prev_loadfn, ".tdx", NULL, "design", 0, NULL); + whats = "design"; + break; + default: + rnd_message(RND_MSG_ERROR, "Invalid first argument for Save() or SaveAs()\n"); + goto error; + } + + if (name != NULL) { /* NULL means cancel */ + if (rnd_conf.rc.verbose) + fprintf(stderr, "Save: Calling SaveTo(%s, %s)\n", whats, name); + save_res = rnd_actionva(hl, "SaveTo", whats, name, NULL); + } + else if (rnd_conf.rc.verbose) + fprintf(stderr, "Save: SaveTo(%s, ...) cancelled\n", whats); + + free(free_me); + return save_res; + + error:; + free(free_me); + return 1; +} + +static const char camv_acts_Save[] = "Save()\n" "Save(design)"; +static const char camv_acth_Save[] = "Save all sheets of a design to file."; +static const char camv_acts_SaveAs[] = "SaveAs(design, [filename])"; +static const char camv_acth_SaveAs[] = "Save all sheets of a design to file."; +static fgw_error_t camv_act_Save(fgw_arg_t *res, int argc, fgw_arg_t *argv) +{ + rnd_design_t *hl = RND_ACT_DESIGN; + const char *actname = argv[0].val.func->name; + int as = (actname[4] == 'a') || (actname[4] == 'A'); + int what = 'd'; + const char *name = NULL; + + if (as) { + RND_ACT_MAY_CONVARG(1, FGW_STR, SaveAs, what = tolower(argv[1].val.cstr[0])); + RND_ACT_MAY_CONVARG(2, FGW_STR, SaveAs, name = argv[2].val.cstr); + } + else + RND_ACT_MAY_CONVARG(1, FGW_STR, Save, what = tolower(argv[1].val.cstr[0])); + + RND_ACT_IRES(save_as(hl, what, as, name)); + return 0; +} + + static rnd_action_t camv_gui_action_list[] = { {"PrintGUI", rnd_act_PrintDialog, rnd_acth_PrintDialog, rnd_acts_PrintDialog}, {"Popup", camv_act_Popup, camv_acth_Popup, camv_acts_Popup}, {"Load", camv_act_Load, camv_acth_Load, camv_acts_Load}, {"Layer", camv_act_Layer, camv_acth_Layer, camv_acts_Layer}, - {"StatusSetText", camv_act_StatusSetText, camv_acth_StatusSetText, camv_acts_StatusSetText} + {"StatusSetText", camv_act_StatusSetText, camv_acth_StatusSetText, camv_acts_StatusSetText}, + {"Save", camv_act_Save, camv_acth_Save, camv_acts_Save}, + {"SaveAs", camv_act_Save, camv_acth_SaveAs, camv_acts_SaveAs} }; int pplg_check_ver_gui(int ver_needed) { return 0; }