1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
/*
* COPYRIGHT
*
* pcb-rnd, interactive printed circuit board design
* Copyright (C) 2017 Tibor 'Igor2' Palinkas
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Contact:
* Project page: http://repo.hu/projects/pcb-rnd
* lead developer: http://repo.hu/projects/pcb-rnd/contact.html
* mailing list: pcb-rnd (at) list.repo.hu (send "subscribe")
*/
#include <librnd/core/hid_dad.h>
typedef struct {
RND_DAD_DECL_NOINIT(dlg)
int mthi;
int wmethod, wfmt, wcmd;
} ee_t;
#define NUM_METHODS (sizeof(methods) / sizeof(methods[0]))
static void ee_data2dialog(ee_t *ee)
{
RND_DAD_SET_VALUE(ee->dlg_hid_ctx, ee->wmethod, lng, ee->mthi);
RND_DAD_SET_VALUE(ee->dlg_hid_ctx, ee->wfmt, lng, methods[ee->mthi].fmt);
RND_DAD_SET_VALUE(ee->dlg_hid_ctx, ee->wcmd, str, rnd_strdup(methods[ee->mthi].command));
/* we have only one format, so disable the combo box for selecting it */
rnd_gui->attr_dlg_widget_state(ee->dlg_hid_ctx, ee->wfmt, rnd_false);
}
static void ee_chg_method(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr)
{
static int lock = 0;
ee_t *ee = caller_data;
if (lock)
return;
ee->mthi = ee->dlg[ee->wmethod].val.lng;
lock = 1;
ee_data2dialog(ee);
lock = 0;
}
static void ee_chg_cmd(void *hid_ctx, void *caller_data, rnd_hid_attribute_t *attr)
{
static int lock = 0;
ee_t *ee = caller_data;
if (lock)
return;
methods[ee->mthi].command = rnd_strdup(ee->dlg[ee->wcmd].val.str);
lock = 1;
ee_data2dialog(ee);
lock = 0;
}
/* DAD-based interactive method editor */
static extedit_method_t *extedit_interactive(void)
{
ee_t ee;
char tmp[256];
const char *names[NUM_METHODS+1];
int n, res;
rnd_hid_dad_buttons_t clbtn[] = {{"Cancel", -1}, {"Edit!", 0}, {NULL, 0}};
for(n = 0; n < NUM_METHODS; n++)
names[n] = methods[n].name;
names[n] = NULL;
memset(&ee, 0, sizeof(ee));
RND_DAD_BEGIN_VBOX(ee.dlg);
sprintf(tmp, "Select external editor...");
RND_DAD_LABEL(ee.dlg, tmp);
RND_DAD_BEGIN_HBOX(ee.dlg);
RND_DAD_LABEL(ee.dlg, "Method name:");
RND_DAD_ENUM(ee.dlg, names);
ee.wmethod = RND_DAD_CURRENT(ee.dlg);
RND_DAD_CHANGE_CB(ee.dlg, ee_chg_method);
RND_DAD_END(ee.dlg);
RND_DAD_BEGIN_HBOX(ee.dlg);
RND_DAD_LABEL(ee.dlg, "File format:");
RND_DAD_ENUM(ee.dlg, extedit_fmt_names);
ee.wfmt = RND_DAD_CURRENT(ee.dlg);
RND_DAD_END(ee.dlg);
RND_DAD_BEGIN_HBOX(ee.dlg);
RND_DAD_LABEL(ee.dlg, "Command template:");
RND_DAD_STRING(ee.dlg);
ee.wcmd = RND_DAD_CURRENT(ee.dlg);
RND_DAD_CHANGE_CB(ee.dlg, ee_chg_cmd);
RND_DAD_END(ee.dlg);
RND_DAD_BUTTON_CLOSES(ee.dlg, clbtn);
RND_DAD_END(ee.dlg);
RND_DAD_NEW("extedit", ee.dlg, "External editor", &ee, rnd_true, NULL);
ee_data2dialog(&ee);
res = RND_DAD_RUN(ee.dlg);
RND_DAD_FREE(ee.dlg);
if (res != 0)
return NULL;
return &methods[ee.mthi];
}
|