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