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