* applied patch by StefanV (from mailinglist) that fixes an error in config.py (broke...
[xonotic/netradiant.git] / contrib / bobtoolz / dialogs / dialogs-gtk.cpp
1 /*
2 BobToolz plugin for GtkRadiant
3 Copyright (C) 2001 Gordon Biggans
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 #include "../StdAfx.h"
21 #include "dialogs-gtk.h"
22 #include "../funchandlers.h"
23 #include "../lists.h"
24 #include "../misc.h"
25 #include <glib/gi18n.h>
26
27 /*--------------------------------
28                 Callback Functions
29 ---------------------------------*/
30
31 typedef struct {
32         GtkWidget *cbTexChange;
33         GtkWidget *editTexOld, *editTexNew;
34
35   GtkWidget *cbScaleHor, *cbScaleVert;
36         GtkWidget *editScaleHor, *editScaleVert;
37
38   GtkWidget *cbShiftHor, *cbShiftVert;
39         GtkWidget *editShiftHor, *editShiftVert;
40
41         GtkWidget *cbRotation;
42         GtkWidget *editRotation;
43 }dlg_texReset_t;
44
45 dlg_texReset_t dlgTexReset;
46
47 void Update_TextureReseter();
48
49 static void dialog_button_callback_texreset_update (GtkWidget *widget, gpointer data)
50 {
51   Update_TextureReseter();
52 }
53
54 void Update_TextureReseter()
55 {
56   gboolean check;
57
58   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbTexChange ));
59   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editTexNew), check);
60   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editTexOld), check);
61
62   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleHor ));
63   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editScaleHor), check);
64
65   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleVert ));
66   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editScaleVert), check);
67
68   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftHor ));
69   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editShiftHor), check);
70
71   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftVert ));
72   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editShiftVert), check);
73
74   check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbRotation ));
75   gtk_entry_set_editable (GTK_ENTRY (dlgTexReset.editRotation), check);
76 }
77
78 static void dialog_button_callback (GtkWidget *widget, gpointer data)
79 {
80         GtkWidget *parent;
81         int *loop, *ret;
82
83         parent = gtk_widget_get_toplevel (widget);
84         loop = (int*)g_object_get_data (G_OBJECT (parent), "loop");
85         ret = (int*)g_object_get_data (G_OBJECT (parent), "ret");
86
87         *loop = 0;
88         *ret = (int)data;
89 }
90
91 static gint dialog_delete_callback (GtkWidget *widget, GdkEvent* event, gpointer data)
92 {
93         int *loop;
94
95         gtk_widget_hide (widget);
96         loop = (int*)g_object_get_data (G_OBJECT (widget), "loop");
97         *loop = 0;
98
99         return TRUE;
100 }
101
102 static void dialog_button_callback_settex (GtkWidget *widget, gpointer data)
103 {
104         TwinWidget* tw = (TwinWidget*)data;
105
106         GtkEntry* entry = GTK_ENTRY( tw->one );
107         GtkCombo* combo = GTK_COMBO( tw->two );
108
109         const gchar* tex = gtk_entry_get_text(GTK_ENTRY( combo->entry ));
110         gtk_entry_set_text( entry, tex);
111 }
112
113 /*--------------------------------
114         Data validation Routines
115 ---------------------------------*/
116
117 bool ValidateTextFloat(const char* pData, char* error_title, float* value)
118 {
119         if(pData)
120         {
121                 float testNum = (float)atof(pData);
122
123                 if((testNum == 0.0f) && strcmp(pData, "0"))
124                 {
125                         DoMessageBox("Please Enter A Floating Point Number", error_title, MB_OK);
126                         return FALSE;
127                 }
128                 else
129                 {
130                         *value = testNum;
131                         return TRUE;
132                 }
133         }
134
135         DoMessageBox("Please Enter A Floating Point Number", error_title, MB_OK);
136         return FALSE;
137 }
138
139 bool ValidateTextFloatRange(const char* pData, float min, float max, char* error_title, float* value)
140 {
141         char error_buffer[256];
142         sprintf(error_buffer, "Please Enter A Floating Point Number Between %.3f and %.3f", min, max);
143
144         if(pData)
145         {
146                 float testNum = (float)atof(pData);
147
148                 if((testNum < min) || (testNum > max))
149                 {
150                         DoMessageBox(error_buffer, error_title, MB_OK);
151                         return FALSE;
152                 }
153                 else
154                 {
155                         *value = testNum;
156                         return TRUE;
157                 }
158         }
159
160         DoMessageBox(error_buffer, error_title, MB_OK);
161         return FALSE;
162 }
163
164 bool ValidateTextIntRange(const char* pData, int min, int max, const char* error_title, int* value)
165 {
166         char error_buffer[256];
167         sprintf(error_buffer, "Please Enter An Integer Between %i and %i", min, max);
168
169         if(pData)
170         {
171                 int testNum = atoi(pData);
172
173                 if((testNum < min) || (testNum > max))
174                 {
175                         DoMessageBox(error_buffer, error_title, MB_OK);
176                         return FALSE;
177                 }
178                 else
179                 {
180                         *value = testNum;
181                         return TRUE;
182                 }
183         }
184
185         DoMessageBox(error_buffer, error_title, MB_OK);
186         return FALSE;
187 }
188
189 bool ValidateTextInt(const char* pData, char* error_title, int* value)
190 {
191         if(pData)
192         {
193                 int testNum = atoi(pData);
194
195                 if((testNum == 0) && strcmp(pData, "0"))
196                 {
197                         DoMessageBox("Please Enter An Integer", error_title, MB_OK);
198                         return FALSE;
199                 }
200                 else
201                 {
202                         *value = testNum;
203                         return TRUE;
204                 }
205         }
206
207         DoMessageBox("Please Enter An Integer", error_title, MB_OK);
208         return FALSE;
209 }
210
211 /*--------------------------------
212                 Modal Dialog Boxes
213 ---------------------------------*/
214
215 /*
216
217   Major clean up of variable names etc required, excluding Mars's ones,
218   which are nicely done :)
219
220 */
221
222 int DoMessageBox (const char* lpText, const char* lpCaption, guint32 uType)
223 {
224         GtkWidget *window, *w, *vbox, *hbox;
225         int mode = (uType & MB_TYPEMASK), ret, loop = 1;
226
227         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
228         gtk_signal_connect (GTK_OBJECT (window), "delete_event",
229                       GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
230         gtk_signal_connect (GTK_OBJECT (window), "destroy",
231                       GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
232         gtk_window_set_title (GTK_WINDOW (window), lpCaption);
233         gtk_container_border_width (GTK_CONTAINER (window), 10);
234         g_object_set_data (G_OBJECT (window), "loop", &loop);
235         g_object_set_data (G_OBJECT (window), "ret", &ret);
236         gtk_widget_realize (window);
237
238         vbox = gtk_vbox_new (FALSE, 10);
239         gtk_container_add (GTK_CONTAINER (window), vbox);
240         gtk_widget_show (vbox);
241
242         w = gtk_label_new (lpText);
243         gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
244         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
245         gtk_widget_show (w);
246
247         w = gtk_hseparator_new ();
248         gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
249         gtk_widget_show (w);
250
251         hbox = gtk_hbox_new (FALSE, 10);
252         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
253         gtk_widget_show (hbox);
254
255         if (mode == MB_OK)
256         {
257                 w = gtk_button_new_with_label ("Ok");
258                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
259                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
260                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
261                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
262                 gtk_widget_grab_default (w);
263                 gtk_widget_show (w);
264                 ret = IDOK;
265         }
266         else if (mode ==  MB_OKCANCEL)
267         {
268                 w = gtk_button_new_with_label ("Ok");
269                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
270                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
271                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
272                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
273                 gtk_widget_grab_default (w);
274                 gtk_widget_show (w);
275
276                 w = gtk_button_new_with_label ("Cancel");
277                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
278                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
279                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
280                 gtk_widget_show (w);
281                 ret = IDCANCEL;
282         }
283         else if (mode == MB_YESNOCANCEL)
284         {
285                 w = gtk_button_new_with_label ("Yes");
286                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
287                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
288                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDYES));
289                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
290                 gtk_widget_grab_default (w);
291                 gtk_widget_show (w);
292
293                 w = gtk_button_new_with_label ("No");
294                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
295                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
296                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDNO));
297                 gtk_widget_show (w);
298
299                 w = gtk_button_new_with_label ("Cancel");
300                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
301                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
302                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
303                 gtk_widget_show (w);
304                 ret = IDCANCEL;
305         }
306         else /* if (mode == MB_YESNO) */
307         {
308                 w = gtk_button_new_with_label ("Yes");
309                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
310                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
311                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDYES));
312                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
313                 gtk_widget_grab_default (w);
314                 gtk_widget_show (w);
315
316                 w = gtk_button_new_with_label ("No");
317                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
318                 gtk_signal_connect (GTK_OBJECT (w), "clicked",
319                         GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDNO));
320                 gtk_widget_show (w);
321                 ret = IDNO;
322         }
323
324         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
325         gtk_widget_show (window);
326         gtk_grab_add (window);
327
328         while (loop)
329                 gtk_main_iteration ();
330
331         gtk_grab_remove (window);
332         gtk_widget_destroy (window);
333
334         return ret;
335 }
336
337 int DoIntersectBox (IntersectRS* rs)
338 {
339         GtkWidget *window, *w, *vbox, *hbox;
340         GtkWidget *radio1, *radio2;
341         GtkWidget *check1, *check2;
342         int ret, loop = 1;
343
344         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
345
346         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
347         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
348
349         gtk_window_set_title (GTK_WINDOW (window), "Intersect");
350         gtk_container_border_width (GTK_CONTAINER (window), 10);
351
352         g_object_set_data (G_OBJECT (window), "loop", &loop);
353         g_object_set_data (G_OBJECT (window), "ret", &ret);
354
355         gtk_widget_realize (window);
356
357
358
359         vbox = gtk_vbox_new (FALSE, 10);
360         gtk_container_add (GTK_CONTAINER (window), vbox);
361         gtk_widget_show (vbox);
362
363         // ---- vbox ----
364
365                 radio1 = gtk_radio_button_new_with_label(NULL, "Use Whole Map");
366                 gtk_box_pack_start (GTK_BOX (vbox), radio1, FALSE, FALSE, 2);
367                 gtk_widget_show (radio1);
368
369                 radio2 = gtk_radio_button_new_with_label(((GtkRadioButton*)radio1)->group, "Use Selected Brushes");
370                 gtk_box_pack_start (GTK_BOX (vbox), radio2, FALSE, FALSE, 2);
371                 gtk_widget_show (radio2);
372
373                 w = gtk_hseparator_new ();
374                 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
375                 gtk_widget_show (w);
376
377                 check1 = gtk_check_button_new_with_label("Include Detail Brushes");
378                 gtk_box_pack_start (GTK_BOX (vbox), check1, FALSE, FALSE, 0);
379                 gtk_widget_show (check1);
380
381                 check2 = gtk_check_button_new_with_label("Select Duplicate Brushes Only");
382                 gtk_box_pack_start (GTK_BOX (vbox), check2, FALSE, FALSE, 0);
383                 gtk_widget_show (check2);
384
385                 hbox = gtk_hbox_new (FALSE, 10);
386                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
387                 gtk_widget_show (hbox);
388
389                 // ---- hbox ---- ok/cancel buttons
390
391                 w = gtk_button_new_with_label ("Ok");
392                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
393                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
394
395                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
396                 gtk_widget_grab_default (w);
397                 gtk_widget_show (w);
398
399                 w = gtk_button_new_with_label ("Cancel");
400                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
401                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
402                 gtk_widget_show (w);
403                 ret = IDCANCEL;
404
405                 // ---- /hbox ----
406
407         // ---- /vbox ----
408
409         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
410         gtk_widget_show (window);
411         gtk_grab_add (window);
412
413         while (loop)
414                 gtk_main_iteration ();
415
416         if(gtk_toggle_button_get_active((GtkToggleButton*)radio1))
417                 rs->nBrushOptions = BRUSH_OPT_WHOLE_MAP;
418         else if(gtk_toggle_button_get_active((GtkToggleButton*)radio2))
419                 rs->nBrushOptions = BRUSH_OPT_SELECTED;
420
421   rs->bUseDetail = gtk_toggle_button_get_active((GtkToggleButton*)check1) ? true : false;
422         rs->bDuplicateOnly = gtk_toggle_button_get_active((GtkToggleButton*)check2) ? true : false;
423
424         gtk_grab_remove (window);
425         gtk_widget_destroy (window);
426
427         return ret;
428 }
429
430 int DoPolygonBox (PolygonRS* rs)
431 {
432         GtkWidget *window, *w, *vbox, *hbox, *vbox2, *hbox2;
433
434         GtkWidget *check1, *check2, *check3;
435         GtkWidget *text1, *text2;
436
437         int ret, loop = 1;
438
439         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
440
441         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
442         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
443
444         gtk_window_set_title (GTK_WINDOW (window), "Polygon Builder");
445         gtk_container_border_width (GTK_CONTAINER (window), 10);
446
447         g_object_set_data (G_OBJECT (window), "loop", &loop);
448         g_object_set_data (G_OBJECT (window), "ret", &ret);
449
450         gtk_widget_realize (window);
451
452
453
454         vbox = gtk_vbox_new (FALSE, 10);
455         gtk_container_add (GTK_CONTAINER (window), vbox);
456         gtk_widget_show (vbox);
457
458         // ---- vbox ----
459
460                 hbox = gtk_hbox_new (FALSE, 10);
461                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
462                 gtk_widget_show (hbox);
463
464                 // ---- hbox ----
465
466
467                         vbox2 = gtk_vbox_new (FALSE, 10);
468                         gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 2);
469                         gtk_widget_show (vbox2);
470
471                         // ---- vbox2 ----
472
473                                 hbox2 = gtk_hbox_new (FALSE, 10);
474                                 gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 2);
475                                 gtk_widget_show (hbox2);
476
477                                 // ---- hbox2 ----
478
479                                         text1 = gtk_entry_new_with_max_length(256);
480                                         gtk_entry_set_text((GtkEntry*)text1, "3");
481                                         gtk_box_pack_start (GTK_BOX (hbox2), text1, FALSE, FALSE, 2);
482                                         gtk_widget_show (text1);
483
484                                         w = gtk_label_new ("Number Of Sides");
485                                         gtk_box_pack_start (GTK_BOX (hbox2), w, FALSE, FALSE, 2);
486                                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
487                                         gtk_widget_show (w);
488
489                                 // ---- /hbox2 ----
490
491                                 hbox2 = gtk_hbox_new (FALSE, 10);
492                                 gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 2);
493                                 gtk_widget_show (hbox2);
494
495                                 // ---- hbox2 ----
496
497                                         text2 = gtk_entry_new_with_max_length(256);
498                                         gtk_entry_set_text((GtkEntry*)text2, "8");
499                                         gtk_box_pack_start (GTK_BOX (hbox2), text2, FALSE, FALSE, 2);
500                                         gtk_widget_show (text2);
501
502                                         w = gtk_label_new ("Border Width");
503                                         gtk_box_pack_start (GTK_BOX (hbox2), w, FALSE, FALSE, 2);
504                                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
505                                         gtk_widget_show (w);
506
507                                 // ---- /hbox2 ----
508
509                         // ---- /vbox2 ----
510
511
512
513                         vbox2 = gtk_vbox_new (FALSE, 10);
514                         gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 2);
515                         gtk_widget_show (vbox2);
516
517                         // ---- vbox2 ----
518
519                                 check1 = gtk_check_button_new_with_label("Use Border");
520                                 gtk_box_pack_start (GTK_BOX (vbox2), check1, FALSE, FALSE, 0);
521                                 gtk_widget_show (check1);
522
523
524                                 check2 = gtk_check_button_new_with_label("Inverse Polygon");
525                                 gtk_box_pack_start (GTK_BOX (vbox2), check2, FALSE, FALSE, 0);
526                                 gtk_widget_show (check2);
527
528
529                                 check3 = gtk_check_button_new_with_label("Align Top Edge");
530                                 gtk_box_pack_start (GTK_BOX (vbox2), check3, FALSE, FALSE, 0);
531                                 gtk_widget_show (check3);
532
533                         // ---- /vbox2 ----
534
535                 // ---- /hbox ----
536
537                 hbox = gtk_hbox_new (FALSE, 10);
538                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
539                 gtk_widget_show (hbox);
540
541                 // ---- hbox ----
542
543                         w = gtk_button_new_with_label ("Ok");
544                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
545                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
546
547                         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
548                         gtk_widget_grab_default (w);
549                         gtk_widget_show (w);
550
551                         w = gtk_button_new_with_label ("Cancel");
552                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
553                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
554                         gtk_widget_show (w);
555                         ret = IDCANCEL;
556
557                 // ---- /hbox ----
558
559         // ---- /vbox ----
560
561         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
562         gtk_widget_show (window);
563         gtk_grab_add (window);
564
565         bool dialogError = TRUE;
566         while (dialogError)
567         {
568                 loop = 1;
569                 while (loop)
570                         gtk_main_iteration ();
571
572                 dialogError = FALSE;
573
574                 if(ret == IDOK)
575                 {
576                         rs->bUseBorder = gtk_toggle_button_get_active((GtkToggleButton*)check1) ? true : false;
577                         rs->bInverse = gtk_toggle_button_get_active((GtkToggleButton*)check2) ? true : false;
578                         rs->bAlignTop = gtk_toggle_button_get_active((GtkToggleButton*)check3) ? true : false;
579
580                         if(!ValidateTextIntRange(gtk_entry_get_text((GtkEntry*)text1), 3, 32, "Number Of Sides", &rs->nSides))
581                                 dialogError = TRUE;
582
583                         if(rs->bUseBorder)
584                         {
585                                 if(!ValidateTextIntRange(gtk_entry_get_text((GtkEntry*)text2), 8, 256, "Border Width", &rs->nBorderWidth))
586                                         dialogError = TRUE;
587                         }
588                 }
589         }
590
591         gtk_grab_remove (window);
592         gtk_widget_destroy (window);
593
594         return ret;
595 }
596
597 // mars
598 // for stair builder stuck as close as i could to the MFC version
599 // obviously feel free to change it at will :)
600 int DoBuildStairsBox(BuildStairsRS* rs)
601 {
602         // i made widgets for just about everything ... i think that's what i need to do  dunno tho
603         GtkWidget       *window, *w, *vbox, *hbox;
604         GtkWidget       *textStairHeight, *textRiserTex, *textMainTex;
605         GtkWidget       *radioNorth, *radioSouth, *radioEast, *radioWest;       // i'm guessing we can't just abuse 'w' for these if we're getting a value
606         GtkWidget       *radioOldStyle, *radioBobStyle, *radioCornerStyle;
607         GtkWidget       *checkUseDetail;
608         GSList          *radioDirection, *radioStyle;
609         int ret, loop;
610
611         loop = 1;
612
613         char    *text = "Please set a value in the boxes below and press 'OK' to build the stairs";
614
615         window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
616
617         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
618         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
619
620         gtk_window_set_title( GTK_WINDOW( window ), "Stair Builder" );
621
622         gtk_container_border_width( GTK_CONTAINER( window ), 10 );
623
624         g_object_set_data (G_OBJECT (window), "loop", &loop);
625         g_object_set_data (G_OBJECT (window), "ret", &ret);
626
627         gtk_widget_realize (window);
628
629         // new vbox
630         vbox = gtk_vbox_new( FALSE, 10 );
631         gtk_container_add( GTK_CONTAINER( window ), vbox );
632         gtk_widget_show( vbox );
633
634         hbox = gtk_hbox_new( FALSE, 10 );
635         gtk_container_add( GTK_CONTAINER( vbox ), hbox );
636         gtk_widget_show( hbox );
637
638         // dunno if you want this text or not ...
639         w = gtk_label_new( text );
640         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 ); // not entirely sure on all the parameters / what they do ...
641         gtk_widget_show( w );
642
643         w = gtk_hseparator_new();
644         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
645         gtk_widget_show( w );
646
647         // ------------------------- // indenting == good way of keeping track of lines :)
648
649                 // new hbox
650                 hbox = gtk_hbox_new( FALSE, 10 );
651                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
652                 gtk_widget_show( hbox );
653
654                 textStairHeight = gtk_entry_new_with_max_length( 256 );
655                 gtk_box_pack_start( GTK_BOX( hbox ), textStairHeight, FALSE, FALSE, 1 );
656                 gtk_widget_show( textStairHeight );
657
658                 w = gtk_label_new( "Stair Height" );
659                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
660                 gtk_widget_show( w );
661
662         // ------------------------- //
663
664         hbox = gtk_hbox_new( FALSE, 10 );
665         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
666         gtk_widget_show( hbox );
667
668         w = gtk_label_new( "Direction:" );
669         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
670         gtk_widget_show( w );
671
672         // -------------------------- //
673
674                 hbox = gtk_hbox_new( FALSE, 10 );
675                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
676                 gtk_widget_show( hbox );
677
678                 // radio buttons confuse me ...
679                 // but this _looks_ right
680
681                 // djbob: actually it looks very nice :), slightly better than the way i did it
682                 // edit: actually it doesn't work :P, you must pass the last radio item each time, ugh
683
684                 radioNorth = gtk_radio_button_new_with_label( NULL, "North" );
685                 gtk_box_pack_start( GTK_BOX( hbox ), radioNorth, FALSE, FALSE, 3 );
686                 gtk_widget_show( radioNorth );
687
688                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioNorth ) );
689
690                 radioSouth = gtk_radio_button_new_with_label( radioDirection, "South" );
691                 gtk_box_pack_start( GTK_BOX( hbox ), radioSouth, FALSE, FALSE, 2 );
692                 gtk_widget_show( radioSouth );
693
694                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioSouth ) );
695
696                 radioEast = gtk_radio_button_new_with_label( radioDirection, "East" );
697                 gtk_box_pack_start( GTK_BOX( hbox ), radioEast, FALSE, FALSE, 1 );
698                 gtk_widget_show( radioEast );
699
700                 radioDirection = gtk_radio_button_group( GTK_RADIO_BUTTON( radioEast ) );
701
702                 radioWest = gtk_radio_button_new_with_label( radioDirection, "West" );
703                 gtk_box_pack_start( GTK_BOX( hbox ), radioWest, FALSE, FALSE, 0 );
704                 gtk_widget_show( radioWest );
705
706         // --------------------------- //
707
708         hbox = gtk_hbox_new( FALSE, 10 );
709         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
710         gtk_widget_show( hbox );
711
712         w = gtk_label_new( "Style:" );
713         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
714         gtk_widget_show( w );
715
716         // --------------------------- //
717
718                 hbox = gtk_hbox_new( FALSE, 10 );
719                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
720                 gtk_widget_show( hbox );
721
722                 radioOldStyle = gtk_radio_button_new_with_label( NULL, "Original" );
723                 gtk_box_pack_start( GTK_BOX( hbox ), radioOldStyle, FALSE, FALSE, 0 );
724                 gtk_widget_show( radioOldStyle );
725
726                 radioStyle = gtk_radio_button_group( GTK_RADIO_BUTTON( radioOldStyle ) );
727
728                 radioBobStyle = gtk_radio_button_new_with_label( radioStyle, "Bob's Style" );
729                 gtk_box_pack_start( GTK_BOX( hbox ), radioBobStyle, FALSE, FALSE, 0 );
730                 gtk_widget_show( radioBobStyle );
731
732                 radioStyle = gtk_radio_button_group( GTK_RADIO_BUTTON( radioBobStyle ) );
733
734                 radioCornerStyle = gtk_radio_button_new_with_label( radioStyle, "Corner Style" );
735                 gtk_box_pack_start( GTK_BOX( hbox ), radioCornerStyle, FALSE, FALSE, 0 );
736                 gtk_widget_show( radioCornerStyle );
737
738                 // err, the q3r has an if or something so you need bob style checked before this
739                 // is "ungreyed out" but you'll need to do that, as i suck :)
740
741                 // djbob: er.... yeah um, im not at all sure how i'm gonna sort this
742                 // djbob: think we need some button callback functions or smuffin
743                 // FIXME: actually get around to doing what i suggested!!!!
744
745                 checkUseDetail = gtk_check_button_new_with_label( "Use Detail Brushes" );
746                 gtk_box_pack_start( GTK_BOX( hbox ), checkUseDetail, FALSE, FALSE, 0 );
747                 gtk_widget_show( checkUseDetail );
748
749         // --------------------------- //
750
751         hbox = gtk_hbox_new( FALSE, 10 );
752         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
753         gtk_widget_show( hbox );
754
755         textMainTex = gtk_entry_new_with_max_length( 512 );
756         gtk_entry_set_text(GTK_ENTRY(textMainTex), rs->mainTexture);
757         gtk_box_pack_start( GTK_BOX( hbox ), textMainTex, FALSE, FALSE, 0 );
758         gtk_widget_show( textMainTex );
759
760         w = gtk_label_new( "Main Texture" );
761         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
762         gtk_widget_show( w );
763
764         // -------------------------- //
765
766         hbox = gtk_hbox_new( FALSE, 10 );
767         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
768         gtk_widget_show( hbox );
769
770         textRiserTex = gtk_entry_new_with_max_length( 512 );
771         gtk_box_pack_start( GTK_BOX( hbox ), textRiserTex, FALSE, FALSE, 0 );
772         gtk_widget_show( textRiserTex );
773
774         w = gtk_label_new( "Riser Texture" );
775         gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
776         gtk_widget_show( w );
777
778         // -------------------------- //
779         w = gtk_hseparator_new();
780         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
781         gtk_widget_show( w );
782
783         hbox = gtk_hbox_new( FALSE, 10 );
784         gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
785         gtk_widget_show( hbox );
786
787         w = gtk_button_new_with_label( "OK" );
788         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
789         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
790         GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
791         gtk_widget_grab_default( w );
792         gtk_widget_show( w );
793
794         w = gtk_button_new_with_label( "Cancel" );
795         gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
796         gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
797         gtk_widget_show( w );
798
799         ret = IDCANCEL;
800
801 // +djbob: need our "little" modal loop mars :P
802         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
803         gtk_widget_show (window);
804         gtk_grab_add (window);
805
806         bool dialogError = TRUE;
807         while (dialogError)
808         {
809                 loop = 1;
810                 while (loop)
811                         gtk_main_iteration ();
812
813                 dialogError = FALSE;
814
815                 if(ret == IDOK)
816                 {
817                         rs->bUseDetail = gtk_toggle_button_get_active((GtkToggleButton*)checkUseDetail) ? true : false;
818
819                         strcpy(rs->riserTexture, gtk_entry_get_text((GtkEntry*)textRiserTex));
820                         strcpy(rs->mainTexture, gtk_entry_get_text((GtkEntry*)textMainTex));
821
822                         if(gtk_toggle_button_get_active((GtkToggleButton*)radioNorth))
823                                 rs->direction = MOVE_NORTH;
824                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioSouth))
825                                 rs->direction = MOVE_SOUTH;
826                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioEast))
827                                 rs->direction = MOVE_EAST;
828                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioWest))
829                                 rs->direction = MOVE_WEST;
830
831                         if(!ValidateTextInt(gtk_entry_get_text((GtkEntry*)textStairHeight), "Stair Height", &rs->stairHeight))
832                                 dialogError = TRUE;
833
834                         if(gtk_toggle_button_get_active((GtkToggleButton*)radioOldStyle))
835                                 rs->style = STYLE_ORIGINAL;
836                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioBobStyle))
837                                 rs->style = STYLE_BOB;
838                         else if(gtk_toggle_button_get_active((GtkToggleButton*)radioCornerStyle))
839                                 rs->style = STYLE_CORNER;
840                 }
841         }
842
843         gtk_grab_remove (window);
844         gtk_widget_destroy (window);
845
846         return ret;
847 // -djbob
848
849         // there we go, all done ... on my end at least, not bad for a night's work
850 }
851
852 int DoDoorsBox(DoorRS* rs)
853 {
854         GtkWidget       *window, *hbox, *vbox, *w;
855         GtkWidget       *textFrontBackTex, *textTrimTex;
856         GtkWidget       *checkScaleMainH, *checkScaleMainV, *checkScaleTrimH, *checkScaleTrimV;
857         GtkWidget       *comboMain, *comboTrim;
858         GtkWidget       *buttonSetMain, *buttonSetTrim;
859         GtkWidget       *radioNS, *radioEW;
860         GSList          *radioOrientation;
861         TwinWidget      tw1, tw2;
862         int             ret, loop;
863
864         loop = 1;
865
866         window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
867
868         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
869         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
870
871         gtk_window_set_title( GTK_WINDOW( window ), "Door Builder" );
872
873         gtk_container_border_width( GTK_CONTAINER( window ), 10 );
874
875         g_object_set_data( G_OBJECT( window ), "loop", &loop );
876         g_object_set_data( G_OBJECT( window ), "ret", &ret );
877
878         gtk_widget_realize (window);
879
880         char buffer[256];
881         GList           *listMainTextures = NULL;
882         GList           *listTrimTextures = NULL;
883         LoadGList(GetFilename(buffer, "plugins/bt/door-tex.txt"), &listMainTextures);
884         LoadGList(GetFilename(buffer, "plugins/bt/door-tex-trim.txt"), &listTrimTextures);
885
886         vbox = gtk_vbox_new( FALSE, 10 );
887         gtk_container_add( GTK_CONTAINER( window ), vbox );
888         gtk_widget_show( vbox );
889
890         // -------------------------- //
891
892                 hbox = gtk_hbox_new( FALSE, 10 );
893                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
894                 gtk_widget_show( hbox );
895
896                 textFrontBackTex = gtk_entry_new_with_max_length( 512 );
897                 gtk_entry_set_text( GTK_ENTRY( textFrontBackTex ), rs->mainTexture);
898                 gtk_box_pack_start( GTK_BOX( hbox ), textFrontBackTex, FALSE, FALSE, 0 );
899                 gtk_widget_show( textFrontBackTex );
900
901                 w = gtk_label_new( "Door Front/Back Texture" );
902                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
903                 gtk_widget_show( w );
904
905         // ------------------------ //
906
907                 hbox = gtk_hbox_new( FALSE, 10 );
908                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
909                 gtk_widget_show( hbox );
910
911                 textTrimTex = gtk_entry_new_with_max_length( 512 );
912                 gtk_box_pack_start( GTK_BOX( hbox ), textTrimTex, FALSE, FALSE, 0 );
913                 gtk_widget_show( textTrimTex );
914
915                 w = gtk_label_new( "Door Trim Texture" );
916                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
917                 gtk_widget_show( w );
918
919         // ----------------------- //
920
921                 hbox = gtk_hbox_new( FALSE, 10 );
922                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
923                 gtk_widget_show( hbox );
924
925                 // sp: horizontally ????
926                 // djbob: yes mars, u can spell :]
927                 checkScaleMainH = gtk_check_button_new_with_label( "Scale Main Texture Horizontally" );
928                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleMainH ), TRUE);
929                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainH, FALSE, FALSE, 0 );
930                 gtk_widget_show( checkScaleMainH );
931
932                 checkScaleTrimH = gtk_check_button_new_with_label( "Scale Trim Texture Horizontally" );
933                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleTrimH ), TRUE);
934                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimH, FALSE, FALSE, 0 );
935                 gtk_widget_show( checkScaleTrimH );
936
937         // ---------------------- //
938
939                 hbox = gtk_hbox_new( FALSE, 10 );
940                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
941                 gtk_widget_show( hbox );
942
943                 checkScaleMainV = gtk_check_button_new_with_label( "Scale Main Texture Vertically" );
944                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( checkScaleMainV ), TRUE);
945                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainV, FALSE, FALSE, 0 );
946                 gtk_widget_show( checkScaleMainV );
947
948                 checkScaleTrimV = gtk_check_button_new_with_label( "Scale Trim Texture Vertically" );
949                 gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimV, FALSE, FALSE, 0 );
950                 gtk_widget_show( checkScaleTrimV );
951
952         // --------------------- //
953
954                 hbox = gtk_hbox_new( FALSE, 10 );
955                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
956                 gtk_widget_show( hbox );
957
958                 // djbob: lists added
959
960                 comboMain = gtk_combo_new();
961                 gtk_box_pack_start( GTK_BOX( hbox ), comboMain, FALSE, FALSE, 0 );
962                 gtk_combo_set_popdown_strings( GTK_COMBO( comboMain ), listMainTextures );
963                 gtk_combo_set_use_arrows( GTK_COMBO( comboMain ), 1 );
964                 gtk_widget_show( comboMain );
965
966                 tw1.one = textFrontBackTex;
967                 tw1.two = comboMain;
968
969                 buttonSetMain = gtk_button_new_with_label( "Set As Main Texture" );
970                 gtk_signal_connect( GTK_OBJECT( buttonSetMain ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback_settex ), &tw1 );
971                 gtk_box_pack_start( GTK_BOX( hbox ), buttonSetMain, FALSE, FALSE, 0 );
972                 gtk_widget_show( buttonSetMain );
973
974         // ------------------- //
975
976                 hbox = gtk_hbox_new( FALSE, 10 );
977                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
978                 gtk_widget_show( hbox );
979
980                 comboTrim = gtk_combo_new();
981                 gtk_box_pack_start( GTK_BOX( hbox ), comboTrim, FALSE, FALSE, 0 );
982                 gtk_combo_set_popdown_strings( GTK_COMBO( comboTrim ), listTrimTextures );
983                 gtk_combo_set_use_arrows( GTK_COMBO( comboMain ), 1 );
984                 gtk_widget_show( comboTrim );
985
986                 tw2.one = textTrimTex;
987                 tw2.two = comboTrim;
988
989                 buttonSetTrim = gtk_button_new_with_label( "Set As Trim Texture" );
990                 gtk_signal_connect( GTK_OBJECT( buttonSetTrim ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback_settex ), &tw2 );
991                 gtk_box_pack_start( GTK_BOX( hbox ), buttonSetTrim, FALSE, FALSE, 0 );
992                 gtk_widget_show( buttonSetTrim );
993
994         // ------------------ //
995
996                 hbox = gtk_hbox_new( FALSE, 10 );
997                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
998                 gtk_widget_show( hbox );
999
1000                 w = gtk_label_new( "Orientation" );
1001                 gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
1002                 gtk_widget_show( w );
1003
1004                 // argh more radio buttons!
1005                 radioNS = gtk_radio_button_new_with_label( NULL, "North - South" );
1006                 gtk_box_pack_start( GTK_BOX( hbox ), radioNS, FALSE, FALSE, 0 );
1007                 gtk_widget_show( radioNS );
1008
1009                 radioOrientation = gtk_radio_button_group( GTK_RADIO_BUTTON( radioNS ) );
1010
1011                 radioEW = gtk_radio_button_new_with_label( radioOrientation, "East - West" );
1012                 gtk_box_pack_start( GTK_BOX( hbox ), radioEW, FALSE, FALSE, 0 );
1013                 gtk_widget_show( radioEW );
1014
1015         // ----------------- //
1016
1017                 w = gtk_hseparator_new();
1018                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1019                 gtk_widget_show( w );
1020
1021         // ----------------- //
1022
1023                 hbox = gtk_hbox_new( FALSE, 10 );
1024                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1025                 gtk_widget_show( hbox );
1026
1027                 w = gtk_button_new_with_label( "OK" );
1028                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1029                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDOK ) );
1030                 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1031                 gtk_widget_grab_default( w );
1032                 gtk_widget_show( w );
1033
1034                 w = gtk_button_new_with_label( "Cancel" );
1035                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1036                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
1037                 gtk_widget_show( w );
1038                 ret = IDCANCEL;
1039
1040         // ----------------- //
1041
1042 //+djbob
1043         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1044         gtk_widget_show (window);
1045         gtk_grab_add (window);
1046
1047         while (loop)
1048                 gtk_main_iteration ();
1049
1050         strcpy(rs->mainTexture, gtk_entry_get_text( GTK_ENTRY( textFrontBackTex ) ));
1051         strcpy(rs->trimTexture, gtk_entry_get_text( GTK_ENTRY( textTrimTex ) ));
1052
1053         rs->bScaleMainH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleMainH)) ? true : false;
1054         rs->bScaleMainV = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleMainV)) ? true : false;
1055         rs->bScaleTrimH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleTrimH)) ? true : false;
1056         rs->bScaleTrimV = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkScaleTrimV)) ? true : false;
1057
1058         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioNS)))
1059                 rs->nOrientation = DIRECTION_NS;
1060         else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radioEW)))
1061                 rs->nOrientation = DIRECTION_EW;
1062
1063         gtk_grab_remove (window);
1064         gtk_widget_destroy (window);
1065
1066         return ret;
1067 //-djbob
1068 }
1069
1070 int DoPathPlotterBox(PathPlotterRS* rs)
1071 {
1072         GtkWidget *window, *w, *vbox, *hbox;
1073
1074         GtkWidget *text1, *text2, *text3;
1075         GtkWidget *check1, *check2;
1076
1077         int ret, loop = 1;
1078
1079         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1080
1081         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1082         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1083
1084         gtk_window_set_title (GTK_WINDOW (window), "Texture Reset");
1085         gtk_container_border_width (GTK_CONTAINER (window), 10);
1086
1087         g_object_set_data (G_OBJECT (window), "loop", &loop);
1088         g_object_set_data (G_OBJECT (window), "ret", &ret);
1089
1090         gtk_widget_realize (window);
1091
1092
1093
1094         vbox = gtk_vbox_new (FALSE, 10);
1095         gtk_container_add (GTK_CONTAINER (window), vbox);
1096         gtk_widget_show (vbox);
1097
1098         // ---- vbox ----
1099
1100                 hbox = gtk_hbox_new (FALSE, 10);
1101                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1102                 gtk_widget_show (hbox);
1103
1104                 // ---- hbox ----
1105
1106                         text1 = gtk_entry_new_with_max_length(256);
1107                         gtk_entry_set_text((GtkEntry*)text1, "25");
1108                         gtk_box_pack_start (GTK_BOX (hbox), text1, FALSE, FALSE, 2);
1109                         gtk_widget_show (text1);
1110
1111                         w = gtk_label_new ("Number Of Points");
1112                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1113                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1114                         gtk_widget_show (w);
1115
1116                 // ---- /hbox ----
1117
1118                 hbox = gtk_hbox_new (FALSE, 10);
1119                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1120                 gtk_widget_show (hbox);
1121
1122                 // ---- hbox ----
1123
1124                         text2 = gtk_entry_new_with_max_length(256);
1125                         gtk_entry_set_text((GtkEntry*)text2, "3");
1126                         gtk_box_pack_start (GTK_BOX (hbox), text2, FALSE, FALSE, 2);
1127                         gtk_widget_show (text2);
1128
1129                         w = gtk_label_new ("Multipler");
1130                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1131                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1132                         gtk_widget_show (w);
1133
1134                 // ---- /hbox ----
1135
1136                 w = gtk_label_new ("Path Distance = dist(start -> apex) * multiplier");
1137                 gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
1138                 gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1139                 gtk_widget_show (w);
1140
1141                 hbox = gtk_hbox_new (FALSE, 10);
1142                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1143                 gtk_widget_show (hbox);
1144
1145                 // ---- hbox ----
1146
1147                         text3 = gtk_entry_new_with_max_length(256);
1148                         gtk_entry_set_text((GtkEntry*)text3, "-800");
1149                         gtk_box_pack_start (GTK_BOX (hbox), text3, FALSE, FALSE, 2);
1150                         gtk_widget_show (text3);
1151
1152                         w = gtk_label_new ("Gravity");
1153                         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1154                         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1155                         gtk_widget_show (w);
1156
1157                 // ---- /hbox ----
1158
1159                 w = gtk_hseparator_new();
1160                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1161                 gtk_widget_show( w );
1162
1163                 check1 = gtk_check_button_new_with_label( "No Dynamic Update" );
1164                 gtk_box_pack_start( GTK_BOX( vbox ), check1, FALSE, FALSE, 0 );
1165                 gtk_widget_show( check1 );
1166
1167                 check2 = gtk_check_button_new_with_label( "Show Bounding Lines" );
1168                 gtk_box_pack_start( GTK_BOX( vbox ), check2, FALSE, FALSE, 0 );
1169                 gtk_widget_show( check2 );
1170
1171         // ---- /vbox ----
1172
1173
1174         // ----------------- //
1175
1176                 w = gtk_hseparator_new();
1177                 gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
1178                 gtk_widget_show( w );
1179
1180         // ----------------- //
1181
1182                 hbox = gtk_hbox_new( FALSE, 10 );
1183                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
1184                 gtk_widget_show( hbox );
1185
1186                 w = gtk_button_new_with_label( "Enable" );
1187                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1188                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDYES ) );
1189                 gtk_widget_show( w );
1190
1191                 GTK_WIDGET_SET_FLAGS( w, GTK_CAN_DEFAULT );
1192                 gtk_widget_grab_default( w );
1193
1194                 w = gtk_button_new_with_label( "Disable" );
1195                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0);
1196                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDNO ) );
1197                 gtk_widget_show( w );
1198
1199                 w = gtk_button_new_with_label( "Cancel" );
1200                 gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
1201                 gtk_signal_connect( GTK_OBJECT( w ), "clicked", GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( IDCANCEL ) );
1202                 gtk_widget_show( w );
1203
1204                 ret = IDCANCEL;
1205
1206         // ----------------- //
1207
1208         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1209         gtk_widget_show (window);
1210         gtk_grab_add (window);
1211
1212         bool dialogError = TRUE;
1213         while (dialogError)
1214         {
1215                 loop = 1;
1216                 while (loop)
1217                         gtk_main_iteration ();
1218
1219                 dialogError = FALSE;
1220
1221                 if(ret == IDYES)
1222                 {
1223                         if(!ValidateTextIntRange(gtk_entry_get_text(GTK_ENTRY(text1)), 1, 200, "Number Of Points", &rs->nPoints))
1224                                 dialogError = TRUE;
1225
1226                         if(!ValidateTextFloatRange(gtk_entry_get_text(GTK_ENTRY(text2)), 1.0f, 10.0f, "Multiplier", &rs->fMultiplier))
1227                                 dialogError = TRUE;
1228
1229                         if(!ValidateTextFloatRange(gtk_entry_get_text(GTK_ENTRY(text3)), -10000.0f, -1.0f, "Gravity", &rs->fGravity))
1230                                 dialogError = TRUE;
1231
1232                         rs->bNoUpdate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check1)) ? true : false;
1233                         rs->bShowExtra = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check2)) ? true : false;
1234                 }
1235         }
1236
1237         gtk_grab_remove (window);
1238         gtk_widget_destroy (window);
1239
1240         return ret;
1241 }
1242
1243 int DoCTFColourChangeBox ()
1244 {
1245         GtkWidget *window, *w, *vbox, *hbox;
1246         int ret, loop = 1;
1247
1248         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1249
1250         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1251         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1252
1253         gtk_window_set_title (GTK_WINDOW (window), "CTF Colour Changer");
1254         gtk_container_border_width (GTK_CONTAINER (window), 10);
1255
1256         g_object_set_data (G_OBJECT (window), "loop", &loop);
1257         g_object_set_data (G_OBJECT (window), "ret", &ret);
1258
1259         gtk_widget_realize (window);
1260
1261
1262
1263         vbox = gtk_vbox_new (FALSE, 10);
1264         gtk_container_add (GTK_CONTAINER (window), vbox);
1265         gtk_widget_show (vbox);
1266
1267         // ---- vbox ----
1268
1269                 hbox = gtk_hbox_new( FALSE, 10 );
1270                 gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
1271                 gtk_widget_show( hbox );
1272
1273                 // ---- hbox ---- ok/cancel buttons
1274
1275                 w = gtk_button_new_with_label ("Red->Blue");
1276                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1277                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
1278
1279                 GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1280                 gtk_widget_grab_default (w);
1281                 gtk_widget_show (w);
1282
1283                 w = gtk_button_new_with_label ("Blue->Red");
1284                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1285                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDYES));
1286                 gtk_widget_show (w);
1287
1288                 w = gtk_button_new_with_label ("Cancel");
1289                 gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1290                 gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
1291                 gtk_widget_show (w);
1292                 ret = IDCANCEL;
1293
1294                 // ---- /hbox ----
1295
1296         // ---- /vbox ----
1297
1298         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1299         gtk_widget_show (window);
1300         gtk_grab_add (window);
1301
1302         while (loop)
1303                 gtk_main_iteration ();
1304
1305         gtk_grab_remove (window);
1306         gtk_widget_destroy (window);
1307
1308         return ret;
1309 }
1310
1311 int DoResetTextureBox (ResetTextureRS* rs)
1312 {
1313         Str texSelected;
1314
1315         GtkWidget *window, *w, *vbox, *hbox, *frame, *table;
1316
1317         int ret, loop = 1;
1318
1319         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1320
1321         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1322         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1323
1324         gtk_window_set_title (GTK_WINDOW (window), "Texture Reset");
1325         gtk_container_border_width (GTK_CONTAINER (window), 10);
1326
1327         g_object_set_data (G_OBJECT (window), "loop", &loop);
1328         g_object_set_data (G_OBJECT (window), "ret", &ret);
1329
1330         gtk_widget_realize (window);
1331
1332         vbox = gtk_vbox_new (FALSE, 10);
1333         gtk_container_add (GTK_CONTAINER (window), vbox);
1334         gtk_widget_show (vbox);
1335
1336         // ---- vbox ----
1337
1338         hbox = gtk_hbox_new (FALSE, 10);
1339         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1340         gtk_widget_show (hbox);
1341
1342         // ---- hbox ----
1343
1344         texSelected = "Currently Selected Face:   ";
1345         if(g_SelectedFaceTable.m_pfnGetSelectedFaceCount() == 1) {
1346                 texSelected += GetCurrentTexture();
1347         }
1348
1349         w = gtk_label_new (texSelected);
1350         gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 2);
1351         gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
1352         gtk_widget_show (w);
1353
1354         // ---- /hbox ----
1355
1356         frame = gtk_frame_new (_("Reset Texture Names"));
1357     gtk_widget_show (frame);
1358     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1359
1360     table = gtk_table_new (2, 3, TRUE);
1361     gtk_widget_show (table);
1362     gtk_container_add (GTK_CONTAINER (frame), table);
1363     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1364     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1365     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1366
1367         // ---- frame ----
1368
1369         dlgTexReset.cbTexChange = gtk_check_button_new_with_label("Enabled");
1370         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbTexChange), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1371         gtk_widget_show (dlgTexReset.cbTexChange);
1372         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbTexChange, 0, 1, 0, 1,
1373                         (GtkAttachOptions) (GTK_FILL),
1374                         (GtkAttachOptions) (0), 0, 0);
1375
1376         w = gtk_label_new ("Old Name: ");
1377         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1378                                 (GtkAttachOptions) (GTK_FILL),
1379                         (GtkAttachOptions) (0), 0, 0);
1380         gtk_widget_show (w);
1381
1382         dlgTexReset.editTexOld = gtk_entry_new_with_max_length(256);
1383         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editTexOld), rs->textureName);
1384     gtk_table_attach (GTK_TABLE (table), dlgTexReset.editTexOld, 2, 3, 0, 1,
1385                                 (GtkAttachOptions) (GTK_FILL),
1386                         (GtkAttachOptions) (0), 0, 0);
1387         gtk_widget_show (dlgTexReset.editTexOld);
1388
1389         w = gtk_label_new ("New Name: ");
1390         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1391                         (GtkAttachOptions) (GTK_FILL),
1392                         (GtkAttachOptions) (0), 0, 0);
1393         gtk_widget_show (w);
1394
1395         dlgTexReset.editTexNew = gtk_entry_new_with_max_length(256);
1396         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editTexNew), rs->textureName);
1397         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editTexNew, 2, 3, 1, 2,
1398                         (GtkAttachOptions) (GTK_FILL),
1399                         (GtkAttachOptions) (0), 0, 0);
1400         gtk_widget_show (dlgTexReset.editTexNew);
1401
1402         // ---- /frame ----
1403
1404     frame = gtk_frame_new (_("Reset Scales"));
1405     gtk_widget_show (frame);
1406     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1407
1408     table = gtk_table_new (2, 3, TRUE);
1409     gtk_widget_show (table);
1410     gtk_container_add (GTK_CONTAINER (frame), table);
1411     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1412     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1413     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1414
1415         // ---- frame ----
1416
1417         dlgTexReset.cbScaleHor = gtk_check_button_new_with_label("Enabled");
1418         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbScaleHor), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1419         gtk_widget_show (dlgTexReset.cbScaleHor);
1420         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbScaleHor, 0, 1, 0, 1,
1421                         (GtkAttachOptions) (GTK_FILL),
1422                         (GtkAttachOptions) (0), 0, 0);
1423
1424         w = gtk_label_new ("New Horizontal Scale: ");
1425         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1426                         (GtkAttachOptions) (GTK_FILL),
1427                         (GtkAttachOptions) (0), 0, 0);
1428         gtk_widget_show (w);
1429
1430         dlgTexReset.editScaleHor = gtk_entry_new_with_max_length(256);
1431         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editScaleHor), "0.5");
1432         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editScaleHor, 2, 3, 0, 1,
1433                         (GtkAttachOptions) (GTK_FILL),
1434                         (GtkAttachOptions) (0), 0, 0);
1435         gtk_widget_show (dlgTexReset.editScaleHor);
1436
1437
1438         dlgTexReset.cbScaleVert = gtk_check_button_new_with_label("Enabled");
1439         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbScaleVert), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1440         gtk_widget_show (dlgTexReset.cbScaleVert);
1441         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbScaleVert, 0, 1, 1, 2,
1442                         (GtkAttachOptions) (GTK_FILL),
1443                         (GtkAttachOptions) (0), 0, 0);
1444
1445         w = gtk_label_new ("New Vertical Scale: ");
1446         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1447                         (GtkAttachOptions) (GTK_FILL),
1448                         (GtkAttachOptions) (0), 0, 0);
1449         gtk_widget_show (w);
1450
1451         dlgTexReset.editScaleVert = gtk_entry_new_with_max_length(256);
1452         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editScaleVert), "0.5");
1453         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editScaleVert, 2, 3, 1, 2,
1454                         (GtkAttachOptions) (GTK_FILL),
1455                         (GtkAttachOptions) (0), 0, 0);
1456         gtk_widget_show (dlgTexReset.editScaleVert);
1457
1458         // ---- /frame ----
1459
1460     frame = gtk_frame_new (_("Reset Shift"));
1461     gtk_widget_show (frame);
1462     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1463
1464     table = gtk_table_new (2, 3, TRUE);
1465     gtk_widget_show (table);
1466     gtk_container_add (GTK_CONTAINER (frame), table);
1467     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1468     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1469     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1470
1471                 // ---- frame ----
1472
1473         dlgTexReset.cbShiftHor = gtk_check_button_new_with_label("Enabled");
1474         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbShiftHor), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1475         gtk_widget_show (dlgTexReset.cbShiftHor);
1476         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbShiftHor, 0, 1, 0, 1,
1477                         (GtkAttachOptions) (GTK_FILL),
1478                         (GtkAttachOptions) (0), 0, 0);
1479
1480         w = gtk_label_new ("New Horizontal Shift: ");
1481         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1482                         (GtkAttachOptions) (GTK_FILL),
1483                         (GtkAttachOptions) (0), 0, 0);
1484         gtk_widget_show (w);
1485
1486         dlgTexReset.editShiftHor = gtk_entry_new_with_max_length(256);
1487         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editShiftHor), "0");
1488         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editShiftHor, 2, 3, 0, 1,
1489                         (GtkAttachOptions) (GTK_FILL),
1490                         (GtkAttachOptions) (0), 0, 0);
1491         gtk_widget_show (dlgTexReset.editShiftHor);
1492
1493
1494         dlgTexReset.cbShiftVert = gtk_check_button_new_with_label("Enabled");
1495         gtk_signal_connect (GTK_OBJECT (dlgTexReset.cbShiftVert), "toggled", GTK_SIGNAL_FUNC (dialog_button_callback_texreset_update), NULL);
1496         gtk_widget_show (dlgTexReset.cbShiftVert);
1497         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbShiftVert, 0, 1, 1, 2,
1498                         (GtkAttachOptions) (GTK_FILL),
1499                         (GtkAttachOptions) (0), 0, 0);
1500
1501         w = gtk_label_new ("New Vertical Shift: ");
1502         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 1, 2,
1503                         (GtkAttachOptions) (GTK_FILL),
1504                         (GtkAttachOptions) (0), 0, 0);
1505         gtk_widget_show (w);
1506
1507         dlgTexReset.editShiftVert = gtk_entry_new_with_max_length(256);
1508         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editShiftVert), "0");
1509         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editShiftVert, 2, 3, 1, 2,
1510                         (GtkAttachOptions) (GTK_FILL),
1511                         (GtkAttachOptions) (0), 0, 0);
1512         gtk_widget_show (dlgTexReset.editShiftVert);
1513
1514         // ---- /frame ----
1515
1516     frame = gtk_frame_new (_("Reset Rotation"));
1517     gtk_widget_show (frame);
1518     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1519
1520     table = gtk_table_new (1, 3, TRUE);
1521     gtk_widget_show (table);
1522     gtk_container_add (GTK_CONTAINER (frame), table);
1523     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1524     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1525     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1526
1527                 // ---- frame ----
1528
1529         dlgTexReset.cbRotation = gtk_check_button_new_with_label("Enabled");
1530         gtk_widget_show (dlgTexReset.cbRotation);
1531         gtk_table_attach (GTK_TABLE (table), dlgTexReset.cbRotation, 0, 1, 0, 1,
1532                         (GtkAttachOptions) (GTK_FILL),
1533                         (GtkAttachOptions) (0), 0, 0);
1534
1535         w = gtk_label_new ("New Rotation Value: ");
1536         gtk_table_attach (GTK_TABLE (table), w, 1, 2, 0, 1,
1537                         (GtkAttachOptions) (GTK_FILL),
1538                         (GtkAttachOptions) (0), 0, 0);
1539         gtk_widget_show (w);
1540
1541         dlgTexReset.editRotation = gtk_entry_new_with_max_length(256);
1542         gtk_entry_set_text(GTK_ENTRY(dlgTexReset.editRotation), "0");
1543         gtk_table_attach (GTK_TABLE (table), dlgTexReset.editRotation, 2, 3, 0, 1,
1544                         (GtkAttachOptions) (GTK_FILL),
1545                         (GtkAttachOptions) (0), 0, 0);
1546         gtk_widget_show (dlgTexReset.editRotation);
1547
1548         // ---- /frame ----
1549
1550         hbox = gtk_hbox_new (FALSE, 10);
1551         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1552         gtk_widget_show (hbox);
1553
1554         // ---- hbox ----
1555
1556         w = gtk_button_new_with_label ("Use Selected Brushes");
1557         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1558         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
1559
1560         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1561         gtk_widget_grab_default (w);
1562         gtk_widget_show (w);
1563
1564         w = gtk_button_new_with_label ("Use All Brushes");
1565         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1566         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDYES));
1567         gtk_widget_show (w);
1568
1569         w = gtk_button_new_with_label ("Cancel");
1570         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1571         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
1572         gtk_widget_show (w);
1573         ret = IDCANCEL;
1574
1575         // ---- /hbox ----
1576
1577         // ---- /vbox ----
1578
1579         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1580         gtk_widget_show (window);
1581         gtk_grab_add (window);
1582
1583         Update_TextureReseter();
1584
1585         bool dialogError = TRUE;
1586         while (dialogError)
1587         {
1588                 loop = 1;
1589                 while (loop)
1590                         gtk_main_iteration ();
1591
1592                 dialogError = FALSE;
1593
1594                 if(ret != IDCANCEL)
1595                 {
1596                         rs->bResetRotation =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbRotation ));
1597                         if(rs->bResetRotation)
1598                                 if(!ValidateTextInt(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editRotation)), "Rotation", &rs->rotation))
1599                                         dialogError = TRUE;
1600
1601                         rs->bResetScale[0] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleHor ));
1602                         if(rs->bResetScale[0])
1603                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editScaleHor)), "Horizontal Scale", &rs->fScale[0]))
1604                                         dialogError = TRUE;
1605
1606                         rs->bResetScale[1] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleVert ));
1607                         if(rs->bResetScale[1])
1608                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editScaleVert)), "Vertical Scale", &rs->fScale[1]))
1609                                         dialogError = TRUE;
1610
1611                         rs->bResetShift[0] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftHor ));
1612                         if(rs->bResetShift[0])
1613                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editShiftHor)), "Horizontal Shift", &rs->fShift[0]))
1614                                         dialogError = TRUE;
1615
1616                         rs->bResetShift[1] =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftVert ));
1617                         if(rs->bResetShift[1])
1618                                 if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(dlgTexReset.editShiftVert)), "Vertical Shift", &rs->fShift[1]))
1619                                         dialogError = TRUE;
1620
1621                         rs->bResetTextureName =  gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( dlgTexReset.cbTexChange ));
1622                         if(rs->bResetTextureName)
1623                         {
1624                                 strcpy(rs->textureName,     gtk_entry_get_text(GTK_ENTRY( dlgTexReset.editTexOld )));
1625                                 strcpy(rs->newTextureName,  gtk_entry_get_text(GTK_ENTRY( dlgTexReset.editTexNew )));
1626                         }
1627                 }
1628         }
1629
1630         gtk_grab_remove (window);
1631         gtk_widget_destroy (window);
1632
1633         return ret;
1634 }
1635
1636 int DoTrainThingBox (TrainThingRS* rs)
1637 {
1638         Str texSelected;
1639
1640         GtkWidget *window, *w, *vbox, *hbox, *frame, *table;
1641
1642         GtkWidget *radiusX, *radiusY;
1643         GtkWidget *angleStart, *angleEnd;
1644         GtkWidget *heightStart, *heightEnd;
1645         GtkWidget *numPoints;
1646
1647         int ret, loop = 1;
1648
1649         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1650
1651         gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_callback), NULL);
1652         gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
1653
1654         gtk_window_set_title (GTK_WINDOW (window), "Train Thing");
1655         gtk_container_border_width (GTK_CONTAINER (window), 10);
1656
1657         gtk_object_set_data (GTK_OBJECT (window), "loop", &loop);
1658         gtk_object_set_data (GTK_OBJECT (window), "ret", &ret);
1659
1660         gtk_widget_realize (window);
1661
1662         vbox = gtk_vbox_new (FALSE, 10);
1663         gtk_container_add (GTK_CONTAINER (window), vbox);
1664         gtk_widget_show (vbox);
1665
1666         // ---- vbox ----
1667
1668         hbox = gtk_hbox_new (FALSE, 10);
1669         gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1670         gtk_widget_show (hbox);
1671
1672         // ---- /hbox ----
1673
1674         frame = gtk_frame_new (_("Radii"));
1675     gtk_widget_show (frame);
1676     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1677
1678     table = gtk_table_new (2, 3, TRUE);
1679     gtk_widget_show (table);
1680     gtk_container_add (GTK_CONTAINER (frame), table);
1681     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1682     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1683     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1684
1685         // ---- frame ----
1686
1687         w = gtk_label_new ("X: ");
1688         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1689                                 (GtkAttachOptions) (GTK_FILL),
1690                         (GtkAttachOptions) (0), 0, 0);
1691         gtk_widget_show (w);
1692
1693         radiusX = gtk_entry_new_with_max_length(256);
1694         gtk_entry_set_text(GTK_ENTRY(radiusX), "100");
1695     gtk_table_attach (GTK_TABLE (table), radiusX, 1, 2, 0, 1,
1696                                 (GtkAttachOptions) (GTK_FILL),
1697                         (GtkAttachOptions) (0), 0, 0);
1698         gtk_widget_show (radiusX);
1699
1700
1701
1702         w = gtk_label_new ("Y: ");
1703         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1704                         (GtkAttachOptions) (GTK_FILL),
1705                         (GtkAttachOptions) (0), 0, 0);
1706         gtk_widget_show (w);
1707
1708         radiusY = gtk_entry_new_with_max_length(256);
1709         gtk_entry_set_text(GTK_ENTRY(radiusY), "100");
1710         gtk_table_attach (GTK_TABLE (table), radiusY, 1, 2, 1, 2,
1711                         (GtkAttachOptions) (GTK_FILL),
1712                         (GtkAttachOptions) (0), 0, 0);
1713         gtk_widget_show (radiusY);
1714
1715
1716
1717         frame = gtk_frame_new (_("Angles"));
1718     gtk_widget_show (frame);
1719     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1720
1721     table = gtk_table_new (2, 3, TRUE);
1722     gtk_widget_show (table);
1723     gtk_container_add (GTK_CONTAINER (frame), table);
1724     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1725     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1726     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1727
1728         // ---- frame ----
1729
1730         w = gtk_label_new ("Start: ");
1731         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1732                                 (GtkAttachOptions) (GTK_FILL),
1733                         (GtkAttachOptions) (0), 0, 0);
1734         gtk_widget_show (w);
1735
1736         angleStart = gtk_entry_new_with_max_length(256);
1737         gtk_entry_set_text(GTK_ENTRY(angleStart), "0");
1738     gtk_table_attach (GTK_TABLE (table), angleStart, 1, 2, 0, 1,
1739                                 (GtkAttachOptions) (GTK_FILL),
1740                         (GtkAttachOptions) (0), 0, 0);
1741         gtk_widget_show (angleStart);
1742
1743
1744
1745         w = gtk_label_new ("End: ");
1746         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1747                         (GtkAttachOptions) (GTK_FILL),
1748                         (GtkAttachOptions) (0), 0, 0);
1749         gtk_widget_show (w);
1750
1751         angleEnd = gtk_entry_new_with_max_length(256);
1752         gtk_entry_set_text(GTK_ENTRY(angleEnd), "90");
1753         gtk_table_attach (GTK_TABLE (table), angleEnd, 1, 2, 1, 2,
1754                         (GtkAttachOptions) (GTK_FILL),
1755                         (GtkAttachOptions) (0), 0, 0);
1756         gtk_widget_show (angleEnd);
1757
1758
1759         frame = gtk_frame_new (_("Height"));
1760     gtk_widget_show (frame);
1761     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1762
1763     table = gtk_table_new (2, 3, TRUE);
1764     gtk_widget_show (table);
1765     gtk_container_add (GTK_CONTAINER (frame), table);
1766     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1767     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1768     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1769
1770         // ---- frame ----
1771
1772         w = gtk_label_new ("Start: ");
1773         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1774                                 (GtkAttachOptions) (GTK_FILL),
1775                         (GtkAttachOptions) (0), 0, 0);
1776         gtk_widget_show (w);
1777
1778         heightStart = gtk_entry_new_with_max_length(256);
1779         gtk_entry_set_text(GTK_ENTRY(heightStart), "0");
1780     gtk_table_attach (GTK_TABLE (table), heightStart, 1, 2, 0, 1,
1781                                 (GtkAttachOptions) (GTK_FILL),
1782                         (GtkAttachOptions) (0), 0, 0);
1783         gtk_widget_show (heightStart);
1784
1785
1786
1787         w = gtk_label_new ("End: ");
1788         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 1, 2,
1789                         (GtkAttachOptions) (GTK_FILL),
1790                         (GtkAttachOptions) (0), 0, 0);
1791         gtk_widget_show (w);
1792
1793         heightEnd = gtk_entry_new_with_max_length(256);
1794         gtk_entry_set_text(GTK_ENTRY(heightEnd), "0");
1795         gtk_table_attach (GTK_TABLE (table), heightEnd, 1, 2, 1, 2,
1796                         (GtkAttachOptions) (GTK_FILL),
1797                         (GtkAttachOptions) (0), 0, 0);
1798         gtk_widget_show (heightEnd);
1799
1800
1801
1802         frame = gtk_frame_new (_("Points"));
1803     gtk_widget_show (frame);
1804     gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
1805
1806     table = gtk_table_new (2, 3, TRUE);
1807     gtk_widget_show (table);
1808     gtk_container_add (GTK_CONTAINER (frame), table);
1809     gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1810     gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1811     gtk_container_set_border_width (GTK_CONTAINER (table), 5);
1812
1813         // ---- frame ----
1814
1815         w = gtk_label_new ("Number: ");
1816         gtk_table_attach (GTK_TABLE (table), w, 0, 1, 0, 1,
1817                                 (GtkAttachOptions) (GTK_FILL),
1818                         (GtkAttachOptions) (0), 0, 0);
1819         gtk_widget_show (w);
1820
1821         numPoints = gtk_entry_new_with_max_length(256);
1822         gtk_entry_set_text(GTK_ENTRY(numPoints), "0");
1823     gtk_table_attach (GTK_TABLE (table), numPoints, 1, 2, 0, 1,
1824                                 (GtkAttachOptions) (GTK_FILL),
1825                         (GtkAttachOptions) (0), 0, 0);
1826         gtk_widget_show (numPoints);
1827
1828
1829                 hbox = gtk_hbox_new (FALSE, 10);
1830                 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
1831                 gtk_widget_show (hbox);
1832
1833                 // ---- hbox ----
1834
1835                         w = gtk_button_new_with_label ("Ok");
1836                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1837                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDOK));
1838
1839                         GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
1840                         gtk_widget_grab_default (w);
1841                         gtk_widget_show (w);
1842
1843                         w = gtk_button_new_with_label ("Cancel");
1844                         gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
1845                         gtk_signal_connect (GTK_OBJECT (w), "clicked", GTK_SIGNAL_FUNC (dialog_button_callback), GINT_TO_POINTER (IDCANCEL));
1846                         gtk_widget_show (w);
1847                         ret = IDCANCEL;
1848
1849                 // ---- /hbox ----
1850
1851
1852
1853         gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
1854         gtk_widget_show (window);
1855         gtk_grab_add (window);
1856
1857         bool dialogError = TRUE;
1858         while (dialogError)
1859         {
1860                 loop = 1;
1861                 while (loop)
1862                         gtk_main_iteration ();
1863
1864                 dialogError = FALSE;
1865
1866                 if(ret != IDCANCEL)
1867                 {
1868                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(radiusX)), "Radius (X)", &rs->fRadiusX))
1869                                 dialogError = TRUE;
1870
1871                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(radiusY)), "Radius (Y)", &rs->fRadiusY))
1872                                 dialogError = TRUE;
1873
1874                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(angleStart)), "Angle (Start)", &rs->fStartAngle))
1875                                 dialogError = TRUE;
1876
1877                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(angleEnd)), "Angle (End)", &rs->fEndAngle))
1878                                 dialogError = TRUE;
1879
1880                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(heightStart)), "Height (Start)", &rs->fStartHeight))
1881                                 dialogError = TRUE;
1882
1883                         if(!ValidateTextFloat(gtk_entry_get_text(GTK_ENTRY(heightEnd)), "Height (End)", &rs->fEndHeight))
1884                                 dialogError = TRUE;
1885
1886                         if(!ValidateTextInt(gtk_entry_get_text(GTK_ENTRY(numPoints)), "Num Points", &rs->iNumPoints))
1887                                 dialogError = TRUE;
1888                 }
1889         }
1890
1891         gtk_grab_remove (window);
1892         gtk_widget_destroy (window);
1893
1894         return ret;
1895 }