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