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