1 //------------------------------------------------------------------------
2 // Options : Unix/FLTK Option boxes
3 //------------------------------------------------------------------------
4 //
5 // GL-Friendly Node Builder (C) 2000-2005 Andrew Apted
6 //
7 // Based on 'BSP 2.3' by Colin Reed, Lee Killough and others.
8 //
9 // This program is free software; you can redistribute it and/or
10 // modify it under the terms of the GNU General Public License
11 // as published by the Free Software Foundation; either version 2
12 // of the License, or (at your option) any later version.
13 //
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
18 //
19 //------------------------------------------------------------------------
20
21 // this includes everything we need
22 #include "local.h"
23
24
25 #define BM_BUTTONTYPE FL_ROUND_DOWN_BOX
26 #define BM_BUTTONSIZE 30
27
28
build_mode_radio_CB(Fl_Widget * w,void * data)29 static void build_mode_radio_CB(Fl_Widget *w, void *data)
30 {
31 boolean_g old_gwa = guix_info.gwa_mode;
32
33 guix_win->build_mode->WriteInfo();
34
35 // communicate with output file widget, for GWA mode
36 if (old_gwa != guix_info.gwa_mode)
37 {
38 guix_win->files->GWA_Changed();
39 }
40
41 guix_win->misc_opts->GWA_Changed();
42 }
43
44
45 //
46 // BuildMode Constructor
47 //
Guix_BuildMode(int x,int y,int w,int h)48 Guix_BuildMode::Guix_BuildMode(int x, int y, int w, int h) :
49 Fl_Group(x, y, w, h, "Build Mode")
50 {
51 // cancel the automatic 'begin' in Fl_Group constructor
52 end();
53
54 box(FL_THIN_UP_BOX);
55 resizable(0); // no resizing the kiddies, please
56
57 labelfont(FL_HELVETICA | FL_BOLD);
58 labeltype(FL_NORMAL_LABEL);
59 align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_TOP);
60
61 // create the children
62
63 int CX = x+12;
64 int CY = y+16;
65
66 gwa = new Fl_Check_Button(CX, CY,
67 BM_BUTTONSIZE, BM_BUTTONSIZE, "GWA Mode");
68 gwa->down_box(BM_BUTTONTYPE);
69 gwa->type(FL_RADIO_BUTTON);
70 gwa->align(FL_ALIGN_RIGHT);
71 gwa->callback((Fl_Callback *) build_mode_radio_CB);
72 add(gwa);
73
74 CY += 24;
75
76 maybe_normal = new Fl_Check_Button(CX, CY,
77 BM_BUTTONSIZE, BM_BUTTONSIZE, "GL, Normal if missing");
78 maybe_normal->down_box(BM_BUTTONTYPE);
79 maybe_normal->type(FL_RADIO_BUTTON);
80 maybe_normal->align(FL_ALIGN_RIGHT);
81 maybe_normal->callback((Fl_Callback *) build_mode_radio_CB);
82 add(maybe_normal);
83
84 CY += 24;
85
86 both = new Fl_Check_Button(CX, CY,
87 BM_BUTTONSIZE, BM_BUTTONSIZE, "GL and Normal nodes");
88 both->down_box(BM_BUTTONTYPE);
89 both->type(FL_RADIO_BUTTON);
90 both->align(FL_ALIGN_RIGHT);
91 both->callback((Fl_Callback *) build_mode_radio_CB);
92 add(both);
93
94 CY += 24;
95
96 gl_only = new Fl_Check_Button(CX, CY,
97 BM_BUTTONSIZE, BM_BUTTONSIZE, "GL nodes only");
98 gl_only->down_box(BM_BUTTONTYPE);
99 gl_only->type(FL_RADIO_BUTTON);
100 gl_only->align(FL_ALIGN_RIGHT);
101 gl_only->callback((Fl_Callback *) build_mode_radio_CB);
102 add(gl_only);
103
104 CY += 24;
105
106 ReadInfo();
107 }
108
109
110 //
111 // BuildMode Destructor
112 //
~Guix_BuildMode()113 Guix_BuildMode::~Guix_BuildMode()
114 {
115 WriteInfo();
116 }
117
118
ReadInfo()119 void Guix_BuildMode::ReadInfo()
120 {
121 if (guix_info.gwa_mode)
122 gwa->setonly();
123
124 else if (guix_info.no_normal)
125 gl_only->setonly();
126
127 else if (guix_info.force_normal)
128 both->setonly();
129
130 else
131 maybe_normal->setonly();
132
133 // redraw them all (just to be safe)
134 gwa->redraw();
135 gl_only->redraw();
136 both->redraw();
137 maybe_normal->redraw();
138 }
139
140
WriteInfo()141 void Guix_BuildMode::WriteInfo()
142 {
143 // default: everything false
144 guix_info.gwa_mode = FALSE;
145 guix_info.no_normal = FALSE;
146 guix_info.force_normal = FALSE;
147
148 if (gwa->value())
149 {
150 guix_info.gwa_mode = TRUE;
151 }
152 else if (gl_only->value())
153 {
154 guix_info.no_normal = TRUE;
155 }
156 else if (both->value())
157 {
158 guix_info.force_normal = TRUE;
159 }
160 }
161
162
LockOut(boolean_g lock_it)163 void Guix_BuildMode::LockOut(boolean_g lock_it)
164 {
165 if (lock_it)
166 {
167 gwa->set_output();
168 maybe_normal->set_output();
169 both->set_output();
170 gl_only->set_output();
171 }
172 else
173 {
174 gwa->clear_output();
175 maybe_normal->clear_output();
176 both->clear_output();
177 gl_only->clear_output();
178 }
179 }
180
181
182 //------------------------------------------------------------------------
183
184
misc_opts_check_CB(Fl_Widget * w,void * data)185 static void misc_opts_check_CB(Fl_Widget *w, void *data)
186 {
187 guix_win->misc_opts->WriteInfo();
188 }
189
190
191 //
192 // MiscOptions Constructor
193 //
Guix_MiscOptions(int x,int y,int w,int h)194 Guix_MiscOptions::Guix_MiscOptions(int x, int y, int w, int h) :
195 Fl_Group(x, y, w, h, "Misc Options")
196 {
197 // cancel the automatic 'begin' in Fl_Group constructor
198 end();
199
200 box(FL_THIN_UP_BOX);
201 resizable(0); // no resizing the kiddies, please
202
203 labelfont(FL_HELVETICA | FL_BOLD);
204 labeltype(FL_NORMAL_LABEL);
205 align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_TOP);
206
207 // create children
208
209 int CX = x+12;
210 int CY = y+20;
211
212 warnings = new Fl_Check_Button(CX, CY, 22, 22, "Extra Warnings");
213 warnings->down_box(FL_DOWN_BOX);
214 warnings->align(FL_ALIGN_RIGHT);
215 warnings->callback((Fl_Callback *) misc_opts_check_CB);
216 add(warnings);
217
218 CY += 24;
219
220 no_reject = new Fl_Check_Button(CX, CY, 22, 22, "Don't clobber REJECT");
221 no_reject->down_box(FL_DOWN_BOX);
222 no_reject->align(FL_ALIGN_RIGHT);
223 no_reject->callback((Fl_Callback *) misc_opts_check_CB);
224 add(no_reject);
225
226 CY += 24;
227
228 pack_sides = new Fl_Check_Button(CX, CY, 22, 22, "Pack Sidedefs");
229 pack_sides->down_box(FL_DOWN_BOX);
230 pack_sides->align(FL_ALIGN_RIGHT);
231 pack_sides->callback((Fl_Callback *) misc_opts_check_CB);
232 add(pack_sides);
233
234 CY += 24;
235
236 choose_fresh = new Fl_Check_Button(CX, CY, 22, 22, "Fresh Partition Lines");
237 choose_fresh->down_box(FL_DOWN_BOX);
238 choose_fresh->align(FL_ALIGN_RIGHT);
239 choose_fresh->callback((Fl_Callback *) misc_opts_check_CB);
240 add(choose_fresh);
241
242 CY += 24;
243
244 ReadInfo();
245 }
246
247
248 //
249 // MiscOptions Destructor
250 //
~Guix_MiscOptions()251 Guix_MiscOptions::~Guix_MiscOptions()
252 {
253 WriteInfo();
254 }
255
256
ReadInfo()257 void Guix_MiscOptions::ReadInfo()
258 {
259 choose_fresh->value(guix_info.fast ? 0 : 1); // API change
260 choose_fresh->redraw();
261
262 warnings->value(guix_info.mini_warnings ? 1 : 0);
263 warnings->redraw();
264
265 no_reject->value(guix_info.no_reject ? 1 : 0);
266 no_reject->redraw();
267
268 pack_sides->value(guix_info.pack_sides ? 1 : 0);
269 pack_sides->redraw();
270
271 GWA_Changed();
272 }
273
274
WriteInfo()275 void Guix_MiscOptions::WriteInfo()
276 {
277 guix_info.fast = choose_fresh->value() ? FALSE : TRUE; // API change
278 guix_info.no_reject = no_reject->value() ? TRUE : FALSE;
279 guix_info.mini_warnings = warnings->value() ? TRUE : FALSE;
280 guix_info.pack_sides = pack_sides->value() ? TRUE : FALSE;
281 }
282
283
GWA_Changed()284 void Guix_MiscOptions::GWA_Changed()
285 {
286 if (guix_info.gwa_mode)
287 {
288 no_reject->deactivate();
289 pack_sides->deactivate();
290 }
291 else
292 {
293 no_reject->activate();
294 pack_sides->activate();
295 }
296
297 if (guix_info.force_normal)
298 choose_fresh->deactivate();
299 else
300 choose_fresh->activate();
301 }
302
303
LockOut(boolean_g lock_it)304 void Guix_MiscOptions::LockOut(boolean_g lock_it)
305 {
306 if (lock_it)
307 {
308 choose_fresh->set_output();
309 warnings->set_output();
310 no_reject->set_output();
311 pack_sides->set_output();
312 }
313 else
314 {
315 choose_fresh->clear_output();
316 warnings->clear_output();
317 no_reject->clear_output();
318 pack_sides->clear_output();
319 }
320 }
321