2 BobToolz plugin for GtkRadiant
3 Copyright (C) 2001 Gordon Biggans
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.
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.
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
20 #include "dialogs-gtk.h"
21 #include "../funchandlers.h"
26 #include "gtkutil/pointer.h"
32 /*--------------------------------
34 ---------------------------------*/
37 ui::Widget cbTexChange{ui::null};
38 ui::Widget editTexOld{ui::null}, editTexNew{ui::null};
40 ui::Widget cbScaleHor{ui::null}, cbScaleVert{ui::null};
41 ui::Widget editScaleHor{ui::null}, editScaleVert{ui::null};
43 ui::Widget cbShiftHor{ui::null}, cbShiftVert{ui::null};
44 ui::Widget editShiftHor{ui::null}, editShiftVert{ui::null};
46 ui::Widget cbRotation{ui::null};
47 ui::Widget editRotation{ui::null};
50 dlg_texReset_t dlgTexReset;
52 void Update_TextureReseter();
54 static void dialog_button_callback_texreset_update( GtkWidget *widget, gpointer data ){
55 Update_TextureReseter();
58 void Update_TextureReseter(){
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 );
65 check = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleHor ) );
66 gtk_editable_set_editable( GTK_EDITABLE( dlgTexReset.editScaleHor ), check );
68 check = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleVert ) );
69 gtk_editable_set_editable( GTK_EDITABLE( dlgTexReset.editScaleVert ), check );
71 check = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftHor ) );
72 gtk_editable_set_editable( GTK_EDITABLE( dlgTexReset.editShiftHor ), check );
74 check = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftVert ) );
75 gtk_editable_set_editable( GTK_EDITABLE( dlgTexReset.editShiftVert ), check );
77 check = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbRotation ) );
78 gtk_editable_set_editable( GTK_EDITABLE( dlgTexReset.editRotation ), check );
81 static void dialog_button_callback( GtkWidget *widget, gpointer data ){
84 EMessageBoxReturn *ret;
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" );
91 *ret = (EMessageBoxReturn)gpointer_to_int( data );
94 static gint dialog_delete_callback( ui::Widget widget, GdkEvent* event, gpointer data ){
96 int *loop = (int *) g_object_get_data(G_OBJECT(widget), "loop");
101 static void dialog_button_callback_settex( GtkWidget *widget, gpointer data ){
102 TwinWidget* tw = (TwinWidget*)data;
104 GtkEntry* entry = GTK_ENTRY( tw->one );
105 auto* combo = GTK_BIN(tw->two);
107 const gchar *tex = gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(combo)));
108 gtk_entry_set_text( entry, tex );
111 /*--------------------------------
112 Data validation Routines
113 ---------------------------------*/
115 bool ValidateTextFloat( const char* pData, const char* error_title, float* value ){
117 float testNum = (float)atof( pData );
119 if ( ( testNum == 0.0f ) && strcmp( pData, "0" ) ) {
120 DoMessageBox( "Please Enter A Floating Point Number", error_title, eMB_OK );
130 DoMessageBox( "Please Enter A Floating Point Number", error_title, eMB_OK );
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 );
139 float testNum = (float)atof( pData );
141 if ( ( testNum < min ) || ( testNum > max ) ) {
142 DoMessageBox( error_buffer, error_title, eMB_OK );
152 DoMessageBox( error_buffer, error_title, eMB_OK );
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 );
161 int testNum = atoi( pData );
163 if ( ( testNum < min ) || ( testNum > max ) ) {
164 DoMessageBox( error_buffer, error_title, eMB_OK );
174 DoMessageBox( error_buffer, error_title, eMB_OK );
178 bool ValidateTextInt( const char* pData, const char* error_title, int* value ){
180 int testNum = atoi( pData );
182 if ( ( testNum == 0 ) && strcmp( pData, "0" ) ) {
183 DoMessageBox( "Please Enter An Integer", error_title, eMB_OK );
193 DoMessageBox( "Please Enter An Integer", error_title, eMB_OK );
197 /*--------------------------------
199 ---------------------------------*/
203 Major clean up of variable names etc required, excluding Mars's ones,
204 which are nicely done :)
208 EMessageBoxReturn DoMessageBox( const char* lpText, const char* lpCaption, EMessageBoxType type ){
209 ui::Widget w{ui::null};
210 EMessageBoxReturn ret;
213 auto window = ui::Window( ui::window_type::TOP );
214 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
215 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
216 gtk_window_set_title( GTK_WINDOW( window ), lpCaption );
217 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
218 g_object_set_data( G_OBJECT( window ), "loop", &loop );
219 g_object_set_data( G_OBJECT( window ), "ret", &ret );
220 gtk_widget_realize( window );
222 auto vbox = ui::VBox( FALSE, 10 );
226 w = ui::Label( lpText );
227 vbox.pack_start( w, FALSE, FALSE, 2 );
228 gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
231 w = ui::Widget(gtk_hseparator_new());
232 vbox.pack_start( w, FALSE, FALSE, 2 );
235 auto hbox = ui::HBox( FALSE, 10 );
236 vbox.pack_start( hbox, FALSE, FALSE, 2 );
239 if ( type == eMB_OK ) {
240 w = ui::Button( "Ok" );
241 hbox.pack_start( w, TRUE, TRUE, 0 );
242 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
243 gtk_widget_set_can_default(w, true);
244 gtk_widget_grab_default( w );
248 else if ( type == eMB_OKCANCEL ) {
249 w = ui::Button( "Ok" );
250 hbox.pack_start( w, TRUE, TRUE, 0 );
251 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
252 gtk_widget_set_can_default( w, true );
253 gtk_widget_grab_default( w );
256 w = ui::Button( "Cancel" );
257 hbox.pack_start( w, TRUE, TRUE, 0 );
258 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
262 else if ( type == eMB_YESNOCANCEL ) {
263 w = ui::Button( "Yes" );
264 hbox.pack_start( w, TRUE, TRUE, 0 );
265 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
266 gtk_widget_set_can_default( w, true );
267 gtk_widget_grab_default( w );
270 w = ui::Button( "No" );
271 hbox.pack_start( w, TRUE, TRUE, 0 );
272 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
275 w = ui::Button( "Cancel" );
276 hbox.pack_start( w, TRUE, TRUE, 0 );
277 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
281 else /* if (mode == MB_YESNO) */
283 w = ui::Button( "Yes" );
284 hbox.pack_start( w, TRUE, TRUE, 0 );
285 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
286 gtk_widget_set_can_default( w, true );
287 gtk_widget_grab_default( w );
290 w = ui::Button( "No" );
291 hbox.pack_start( w, TRUE, TRUE, 0 );
292 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
297 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
299 gtk_grab_add( window );
302 gtk_main_iteration();
304 gtk_grab_remove( window );
310 EMessageBoxReturn DoIntersectBox( IntersectRS* rs ){
311 EMessageBoxReturn ret;
314 auto window = ui::Window( ui::window_type::TOP );
316 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
317 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
319 gtk_window_set_title( GTK_WINDOW( window ), "Intersect" );
320 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
322 g_object_set_data( G_OBJECT( window ), "loop", &loop );
323 g_object_set_data( G_OBJECT( window ), "ret", &ret );
325 gtk_widget_realize( window );
329 auto vbox = ui::VBox( FALSE, 10 );
336 auto radio1 = ui::Widget(gtk_radio_button_new_with_label( NULL, "Use Whole Map" ));
337 vbox.pack_start( radio1, FALSE, FALSE, 2 );
340 auto radio2 = ui::Widget(gtk_radio_button_new_with_label( gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio1)), "Use Selected Brushes" ));
341 vbox.pack_start( radio2, FALSE, FALSE, 2 );
344 auto hsep = ui::Widget(gtk_hseparator_new());
345 vbox.pack_start( hsep, FALSE, FALSE, 2 );
348 auto check1 = ui::CheckButton( "Include Detail Brushes" );
349 vbox.pack_start( check1, FALSE, FALSE, 0 );
352 auto check2 = ui::CheckButton( "Select Duplicate Brushes Only" );
353 vbox.pack_start( check2, FALSE, FALSE, 0 );
356 auto hbox = ui::HBox( FALSE, 10 );
357 vbox.pack_start( hbox, FALSE, FALSE, 2 );
360 // ---- hbox ---- ok/cancel buttons
362 auto w = ui::Button( "Ok" );
363 hbox.pack_start( w, TRUE, TRUE, 0 );
364 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
366 gtk_widget_set_can_default( w, true );
367 gtk_widget_grab_default( w );
370 w = ui::Button( "Cancel" );
371 hbox.pack_start( w, TRUE, TRUE, 0 );
372 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
380 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
382 gtk_grab_add( window );
385 gtk_main_iteration();
387 if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radio1) ) ) {
388 rs->nBrushOptions = BRUSH_OPT_WHOLE_MAP;
390 else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radio2) ) ) {
391 rs->nBrushOptions = BRUSH_OPT_SELECTED;
394 rs->bUseDetail = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check1) ) ? true : false;
395 rs->bDuplicateOnly = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check2) ) ? true : false;
397 gtk_grab_remove( window );
403 EMessageBoxReturn DoPolygonBox( PolygonRS* rs ){
404 EMessageBoxReturn ret;
407 auto window = ui::Window( ui::window_type::TOP );
409 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
410 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
412 gtk_window_set_title( GTK_WINDOW( window ), "Polygon Builder" );
413 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
415 g_object_set_data( G_OBJECT( window ), "loop", &loop );
416 g_object_set_data( G_OBJECT( window ), "ret", &ret );
418 gtk_widget_realize( window );
422 auto vbox = ui::VBox( FALSE, 10 );
428 auto hbox = ui::HBox( FALSE, 10 );
429 vbox.pack_start( hbox, FALSE, FALSE, 2 );
435 auto vbox2 = ui::VBox( FALSE, 10 );
436 hbox.pack_start( vbox2, FALSE, FALSE, 2 );
441 auto hbox2 = ui::HBox( FALSE, 10 );
442 vbox2.pack_start( hbox2, FALSE, FALSE, 2 );
447 auto text1 = ui::Entry( 256 );
448 gtk_entry_set_text( (GtkEntry*)text1, "3" );
449 hbox2.pack_start( text1, FALSE, FALSE, 2 );
452 auto l = ui::Label( "Number Of Sides" );
453 hbox2.pack_start( l, FALSE, FALSE, 2 );
454 gtk_label_set_justify( GTK_LABEL( l ), GTK_JUSTIFY_LEFT );
459 hbox2 = ui::HBox( FALSE, 10 );
460 vbox2.pack_start( hbox2, FALSE, FALSE, 2 );
465 auto text2 = ui::Entry( 256 );
466 gtk_entry_set_text( (GtkEntry*)text2, "8" );
467 hbox2.pack_start( text2, FALSE, FALSE, 2 );
470 l = ui::Label( "Border Width" );
471 hbox2.pack_start( l, FALSE, FALSE, 2 );
472 gtk_label_set_justify( GTK_LABEL( l ), GTK_JUSTIFY_LEFT );
481 vbox2 = ui::VBox( FALSE, 10 );
482 hbox.pack_start( vbox2, FALSE, FALSE, 2 );
487 auto check1 = ui::CheckButton( "Use Border" );
488 vbox2.pack_start( check1, FALSE, FALSE, 0 );
492 auto check2 = ui::CheckButton( "Inverse Polygon" );
493 vbox2.pack_start( check2, FALSE, FALSE, 0 );
497 auto check3 = ui::CheckButton( "Align Top Edge" );
498 vbox2.pack_start( check3, FALSE, FALSE, 0 );
505 hbox = ui::HBox( FALSE, 10 );
506 vbox.pack_start( hbox, FALSE, FALSE, 2 );
511 auto w = ui::Button( "Ok" );
512 hbox.pack_start( w, TRUE, TRUE, 0 );
513 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
515 gtk_widget_set_can_default( w, true );
516 gtk_widget_grab_default( w );
519 w = ui::Button( "Cancel" );
520 hbox.pack_start( w, TRUE, TRUE, 0 );
521 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
529 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
531 gtk_grab_add( window );
533 bool dialogError = TRUE;
534 while ( dialogError )
538 gtk_main_iteration();
542 if ( ret == eIDOK ) {
543 rs->bUseBorder = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check1) ) ? true : false;
544 rs->bInverse = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check2) ) ? true : false;
545 rs->bAlignTop = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check3) ) ? true : false;
547 if ( !ValidateTextIntRange( gtk_entry_get_text( (GtkEntry*)text1 ), 3, 32, "Number Of Sides", &rs->nSides ) ) {
551 if ( rs->bUseBorder ) {
552 if ( !ValidateTextIntRange( gtk_entry_get_text( (GtkEntry*)text2 ), 8, 256, "Border Width", &rs->nBorderWidth ) ) {
559 gtk_grab_remove( window );
566 // for stair builder stuck as close as i could to the MFC version
567 // obviously feel free to change it at will :)
568 EMessageBoxReturn DoBuildStairsBox( BuildStairsRS* rs ){
569 GSList *radioDirection, *radioStyle;
570 EMessageBoxReturn ret;
573 const char *text = "Please set a value in the boxes below and press 'OK' to build the stairs";
575 auto window = ui::Window( ui::window_type::TOP );
577 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
578 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
580 gtk_window_set_title( GTK_WINDOW( window ), "Stair Builder" );
582 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
584 g_object_set_data( G_OBJECT( window ), "loop", &loop );
585 g_object_set_data( G_OBJECT( window ), "ret", &ret );
587 gtk_widget_realize( window );
590 auto vbox = ui::VBox( FALSE, 10 );
594 auto hbox = ui::HBox( FALSE, 10 );
598 // dunno if you want this text or not ...
599 ui::Widget w = ui::Label( text );
600 hbox.pack_start( w, FALSE, FALSE, 0 ); // not entirely sure on all the parameters / what they do ...
603 w = ui::Widget(gtk_hseparator_new());
604 vbox.pack_start( w, FALSE, FALSE, 0 );
607 // ------------------------- // indenting == good way of keeping track of lines :)
610 hbox = ui::HBox( FALSE, 10 );
611 vbox.pack_start( hbox, FALSE, FALSE, 0 );
614 auto textStairHeight = ui::Entry( 256 );
615 hbox.pack_start( textStairHeight, FALSE, FALSE, 1 );
616 textStairHeight.show();
618 w = ui::Label( "Stair Height" );
619 hbox.pack_start( w, FALSE, FALSE, 1 );
622 // ------------------------- //
624 hbox = ui::HBox( FALSE, 10 );
625 vbox.pack_start( hbox, FALSE, FALSE, 0 );
628 w = ui::Label( "Direction:" );
629 hbox.pack_start( w, FALSE, FALSE, 5 );
632 // -------------------------- //
634 hbox = ui::HBox( FALSE, 10 );
635 vbox.pack_start( hbox, FALSE, FALSE, 0 );
638 // radio buttons confuse me ...
639 // but this _looks_ right
641 // djbob: actually it looks very nice :), slightly better than the way i did it
642 // edit: actually it doesn't work :P, you must pass the last radio item each time, ugh
644 auto radioNorth = ui::Widget(gtk_radio_button_new_with_label( NULL, "North" ));
645 hbox.pack_start( radioNorth, FALSE, FALSE, 3 );
648 radioDirection = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioNorth ) );
650 auto radioSouth = ui::Widget(gtk_radio_button_new_with_label( radioDirection, "South" ));
651 hbox.pack_start( radioSouth, FALSE, FALSE, 2 );
654 radioDirection = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioSouth ) );
656 auto radioEast = ui::Widget(gtk_radio_button_new_with_label( radioDirection, "East" ));
657 hbox.pack_start( radioEast, FALSE, FALSE, 1 );
660 radioDirection = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioEast ) );
662 auto radioWest = ui::Widget(gtk_radio_button_new_with_label( radioDirection, "West" ));
663 hbox.pack_start( radioWest, FALSE, FALSE, 0 );
666 // --------------------------- //
668 hbox = ui::HBox( FALSE, 10 );
669 vbox.pack_start( hbox, FALSE, FALSE, 0 );
672 w = ui::Label( "Style:" );
673 hbox.pack_start( w, FALSE, FALSE, 5 );
676 // --------------------------- //
678 hbox = ui::HBox( FALSE, 10 );
679 vbox.pack_start( hbox, FALSE, FALSE, 0 );
682 auto radioOldStyle = ui::Widget(gtk_radio_button_new_with_label( NULL, "Original" ));
683 hbox.pack_start( radioOldStyle, FALSE, FALSE, 0 );
684 radioOldStyle.show();
686 radioStyle = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioOldStyle ) );
688 auto radioBobStyle = ui::Widget(gtk_radio_button_new_with_label( radioStyle, "Bob's Style" ));
689 hbox.pack_start( radioBobStyle, FALSE, FALSE, 0 );
690 radioBobStyle.show();
692 radioStyle = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioBobStyle ) );
694 auto radioCornerStyle = ui::Widget(gtk_radio_button_new_with_label( radioStyle, "Corner Style" ));
695 hbox.pack_start( radioCornerStyle, FALSE, FALSE, 0 );
696 radioCornerStyle.show();
698 // err, the q3r has an if or something so you need bob style checked before this
699 // is "ungreyed out" but you'll need to do that, as i suck :)
701 // djbob: er.... yeah um, im not at all sure how i'm gonna sort this
702 // djbob: think we need some button callback functions or smuffin
703 // FIXME: actually get around to doing what i suggested!!!!
705 auto checkUseDetail = ui::CheckButton( "Use Detail Brushes" );
706 hbox.pack_start( checkUseDetail, FALSE, FALSE, 0 );
707 checkUseDetail.show();
709 // --------------------------- //
711 hbox = ui::HBox( FALSE, 10 );
712 vbox.pack_start( hbox, FALSE, FALSE, 0 );
715 auto textMainTex = ui::Entry( 512 );
716 gtk_entry_set_text( GTK_ENTRY( textMainTex ), rs->mainTexture );
717 hbox.pack_start( textMainTex, FALSE, FALSE, 0 );
720 w = ui::Label( "Main Texture" );
721 hbox.pack_start( w, FALSE, FALSE, 1 );
724 // -------------------------- //
726 hbox = ui::HBox( FALSE, 10 );
727 vbox.pack_start( hbox, FALSE, FALSE, 0 );
730 auto textRiserTex = ui::Entry( 512 );
731 hbox.pack_start( textRiserTex, FALSE, FALSE, 0 );
734 w = ui::Label( "Riser Texture" );
735 hbox.pack_start( w, FALSE, FALSE, 1 );
738 // -------------------------- //
739 w = ui::Widget(gtk_hseparator_new());
740 vbox.pack_start( w, FALSE, FALSE, 0 );
743 hbox = ui::HBox( FALSE, 10 );
744 vbox.pack_start( hbox, FALSE, FALSE, 0 );
747 w = ui::Button( "OK" );
748 hbox.pack_start( w, TRUE, TRUE, 0 );
749 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
750 gtk_widget_set_can_default( w, true );
751 gtk_widget_grab_default( w );
754 w = ui::Button( "Cancel" );
755 hbox.pack_start( w, TRUE, TRUE, 0 );
756 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
761 // +djbob: need our "little" modal loop mars :P
762 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
764 gtk_grab_add( window );
766 bool dialogError = TRUE;
767 while ( dialogError )
771 gtk_main_iteration();
775 if ( ret == eIDOK ) {
776 rs->bUseDetail = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(checkUseDetail) ) ? true : false;
778 strcpy( rs->riserTexture, gtk_entry_get_text( (GtkEntry*)textRiserTex ) );
779 strcpy( rs->mainTexture, gtk_entry_get_text( (GtkEntry*)textMainTex ) );
781 if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioNorth) ) ) {
782 rs->direction = MOVE_NORTH;
784 else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioSouth) ) ) {
785 rs->direction = MOVE_SOUTH;
787 else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioEast) ) ) {
788 rs->direction = MOVE_EAST;
790 else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioWest) ) ) {
791 rs->direction = MOVE_WEST;
794 if ( !ValidateTextInt( gtk_entry_get_text( (GtkEntry*)textStairHeight ), "Stair Height", &rs->stairHeight ) ) {
798 if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioOldStyle) ) ) {
799 rs->style = STYLE_ORIGINAL;
801 else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioBobStyle) ) ) {
802 rs->style = STYLE_BOB;
804 else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioCornerStyle) ) ) {
805 rs->style = STYLE_CORNER;
810 gtk_grab_remove( window );
816 // there we go, all done ... on my end at least, not bad for a night's work
819 EMessageBoxReturn DoDoorsBox( DoorRS* rs ){
820 GSList *radioOrientation;
822 EMessageBoxReturn ret;
825 auto window = ui::Window( ui::window_type::TOP );
827 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
828 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
830 gtk_window_set_title( GTK_WINDOW( window ), "Door Builder" );
832 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
834 g_object_set_data( G_OBJECT( window ), "loop", &loop );
835 g_object_set_data( G_OBJECT( window ), "ret", &ret );
837 gtk_widget_realize( window );
840 ui::ListStore listMainTextures = ui::ListStore(gtk_list_store_new( 1, G_TYPE_STRING ));
841 ui::ListStore listTrimTextures = ui::ListStore(gtk_list_store_new( 1, G_TYPE_STRING ));
842 LoadGList( GetFilename( buffer, "plugins/bt/door-tex.txt" ), listMainTextures );
843 LoadGList( GetFilename( buffer, "plugins/bt/door-tex-trim.txt" ), listTrimTextures );
845 auto vbox = ui::VBox( FALSE, 10 );
849 // -------------------------- //
851 auto hbox = ui::HBox( FALSE, 10 );
852 vbox.pack_start( hbox, FALSE, FALSE, 0 );
855 auto textFrontBackTex = ui::Entry( 512 );
856 gtk_entry_set_text( GTK_ENTRY( textFrontBackTex ), rs->mainTexture );
857 hbox.pack_start( textFrontBackTex, FALSE, FALSE, 0 );
858 textFrontBackTex.show();
860 ui::Widget w = ui::Label( "Door Front/Back Texture" );
861 hbox.pack_start( w, FALSE, FALSE, 0 );
864 // ------------------------ //
866 hbox = ui::HBox( FALSE, 10 );
867 vbox.pack_start( hbox, FALSE, FALSE, 0 );
870 auto textTrimTex = ui::Entry( 512 );
871 hbox.pack_start( textTrimTex, FALSE, FALSE, 0 );
874 w = ui::Label( "Door Trim Texture" );
875 hbox.pack_start( w, FALSE, FALSE, 0 );
878 // ----------------------- //
880 hbox = ui::HBox( FALSE, 10 );
881 vbox.pack_start( hbox, FALSE, FALSE, 0 );
884 // sp: horizontally ????
885 // djbob: yes mars, u can spell :]
886 auto checkScaleMainH = ui::CheckButton( "Scale Main Texture Horizontally" );
887 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( checkScaleMainH ), TRUE );
888 hbox.pack_start( checkScaleMainH, FALSE, FALSE, 0 );
889 checkScaleMainH.show();
891 auto checkScaleTrimH = ui::CheckButton( "Scale Trim Texture Horizontally" );
892 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( checkScaleTrimH ), TRUE );
893 hbox.pack_start( checkScaleTrimH, FALSE, FALSE, 0 );
894 checkScaleTrimH.show();
896 // ---------------------- //
898 hbox = ui::HBox( FALSE, 10 );
899 vbox.pack_start( hbox, FALSE, FALSE, 0 );
902 auto checkScaleMainV = ui::CheckButton( "Scale Main Texture Vertically" );
903 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( checkScaleMainV ), TRUE );
904 hbox.pack_start( checkScaleMainV, FALSE, FALSE, 0 );
905 checkScaleMainV.show();
907 auto checkScaleTrimV = ui::CheckButton( "Scale Trim Texture Vertically" );
908 hbox.pack_start( checkScaleTrimV, FALSE, FALSE, 0 );
909 checkScaleTrimV.show();
911 // --------------------- //
913 hbox = ui::HBox( FALSE, 10 );
914 vbox.pack_start( hbox, FALSE, FALSE, 0 );
917 // djbob: lists added
919 auto comboMain = ui::ComboBox(GTK_COMBO_BOX(gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(listMainTextures))));
920 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(comboMain), 0);
921 hbox.pack_start( comboMain, FALSE, FALSE, 0 );
924 tw1.one = textFrontBackTex;
927 auto buttonSetMain = ui::Button( "Set As Main Texture" );
928 buttonSetMain.connect( "clicked", G_CALLBACK( dialog_button_callback_settex ), &tw1 );
929 hbox.pack_start( buttonSetMain, FALSE, FALSE, 0 );
930 buttonSetMain.show();
932 // ------------------- //
934 hbox = ui::HBox( FALSE, 10 );
935 vbox.pack_start( hbox, FALSE, FALSE, 0 );
938 auto comboTrim = ui::ComboBox(GTK_COMBO_BOX(gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(listTrimTextures))));
939 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(comboMain), 0);
940 hbox.pack_start( comboTrim, FALSE, FALSE, 0 );
943 tw2.one = textTrimTex;
946 auto buttonSetTrim = ui::Button( "Set As Trim Texture" );
947 buttonSetTrim.connect( "clicked", G_CALLBACK( dialog_button_callback_settex ), &tw2 );
948 hbox.pack_start( buttonSetTrim, FALSE, FALSE, 0 );
949 buttonSetTrim.show();
951 // ------------------ //
953 hbox = ui::HBox( FALSE, 10 );
954 vbox.pack_start( hbox, FALSE, FALSE, 0 );
957 w = ui::Label( "Orientation" );
958 hbox.pack_start( w, FALSE, FALSE, 0 );
961 // argh more radio buttons!
962 auto radioNS = ui::Widget(gtk_radio_button_new_with_label( NULL, "North - South" ));
963 hbox.pack_start( radioNS, FALSE, FALSE, 0 );
966 radioOrientation = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioNS ) );
968 auto radioEW = ui::Widget(gtk_radio_button_new_with_label( radioOrientation, "East - West" ));
969 hbox.pack_start( radioEW, FALSE, FALSE, 0 );
972 // ----------------- //
974 w = ui::Widget(gtk_hseparator_new());
975 vbox.pack_start( w, FALSE, FALSE, 0 );
978 // ----------------- //
980 hbox = ui::HBox( FALSE, 10 );
981 vbox.pack_start( hbox, FALSE, FALSE, 0 );
984 w = ui::Button( "OK" );
985 hbox.pack_start( w, TRUE, TRUE, 0 );
986 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
987 gtk_widget_set_can_default( w, true );
988 gtk_widget_grab_default( w );
991 w = ui::Button( "Cancel" );
992 hbox.pack_start( w, TRUE, TRUE, 0 );
993 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
997 // ----------------- //
1000 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
1002 gtk_grab_add( window );
1005 gtk_main_iteration();
1007 strcpy( rs->mainTexture, gtk_entry_get_text( GTK_ENTRY( textFrontBackTex ) ) );
1008 strcpy( rs->trimTexture, gtk_entry_get_text( GTK_ENTRY( textTrimTex ) ) );
1010 rs->bScaleMainH = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( checkScaleMainH ) ) ? true : false;
1011 rs->bScaleMainV = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( checkScaleMainV ) ) ? true : false;
1012 rs->bScaleTrimH = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( checkScaleTrimH ) ) ? true : false;
1013 rs->bScaleTrimV = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( checkScaleTrimV ) ) ? true : false;
1015 if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( radioNS ) ) ) {
1016 rs->nOrientation = DIRECTION_NS;
1018 else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( radioEW ) ) ) {
1019 rs->nOrientation = DIRECTION_EW;
1022 gtk_grab_remove( window );
1029 EMessageBoxReturn DoPathPlotterBox( PathPlotterRS* rs ){
1030 ui::Widget w{ui::null};
1032 EMessageBoxReturn ret;
1035 auto window = ui::Window( ui::window_type::TOP );
1037 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
1038 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
1040 gtk_window_set_title( GTK_WINDOW( window ), "Texture Reset" );
1041 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
1043 g_object_set_data( G_OBJECT( window ), "loop", &loop );
1044 g_object_set_data( G_OBJECT( window ), "ret", &ret );
1046 gtk_widget_realize( window );
1050 auto vbox = ui::VBox( FALSE, 10 );
1056 auto hbox = ui::HBox( FALSE, 10 );
1057 vbox.pack_start( hbox, FALSE, FALSE, 2 );
1062 auto text1 = ui::Entry( 256 );
1063 gtk_entry_set_text( text1, "25" );
1064 hbox.pack_start( text1, FALSE, FALSE, 2 );
1067 w = ui::Label( "Number Of Points" );
1068 hbox.pack_start( w, FALSE, FALSE, 2 );
1069 gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
1074 hbox = ui::HBox( FALSE, 10 );
1075 vbox.pack_start( hbox, FALSE, FALSE, 2 );
1080 auto text2 = ui::Entry( 256 );
1081 gtk_entry_set_text( text2, "3" );
1082 hbox.pack_start( text2, FALSE, FALSE, 2 );
1085 w = ui::Label( "Multipler" );
1086 hbox.pack_start( w, FALSE, FALSE, 2 );
1087 gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
1092 w = ui::Label( "Path Distance = dist(start -> apex) * multiplier" );
1093 vbox.pack_start( w, FALSE, FALSE, 0 );
1094 gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
1097 hbox = ui::HBox( FALSE, 10 );
1098 vbox.pack_start( hbox, FALSE, FALSE, 2 );
1103 auto text3 = ui::Entry( 256 );
1104 gtk_entry_set_text( text3, "-800" );
1105 hbox.pack_start( text3, FALSE, FALSE, 2 );
1108 w = ui::Label( "Gravity" );
1109 hbox.pack_start( w, FALSE, FALSE, 2 );
1110 gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
1115 w = ui::Widget(gtk_hseparator_new());
1116 vbox.pack_start( w, FALSE, FALSE, 0 );
1119 auto check1 = ui::CheckButton( "No Dynamic Update" );
1120 vbox.pack_start( check1, FALSE, FALSE, 0 );
1123 auto check2 = ui::CheckButton( "Show Bounding Lines" );
1124 vbox.pack_start( check2, FALSE, FALSE, 0 );
1130 // ----------------- //
1132 w = ui::Widget(gtk_hseparator_new());
1133 vbox.pack_start( w, FALSE, FALSE, 0 );
1136 // ----------------- //
1138 hbox = ui::HBox( FALSE, 10 );
1139 vbox.pack_start( hbox, FALSE, FALSE, 0 );
1142 w = ui::Button( "Enable" );
1143 hbox.pack_start( w, TRUE, TRUE, 0 );
1144 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
1147 gtk_widget_set_can_default( w, true );
1148 gtk_widget_grab_default( w );
1150 w = ui::Button( "Disable" );
1151 hbox.pack_start( w, TRUE, TRUE, 0 );
1152 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
1155 w = ui::Button( "Cancel" );
1156 hbox.pack_start( w, TRUE, TRUE, 0 );
1157 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1162 // ----------------- //
1164 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
1166 gtk_grab_add( window );
1168 bool dialogError = TRUE;
1169 while ( dialogError )
1173 gtk_main_iteration();
1175 dialogError = FALSE;
1177 if ( ret == eIDYES ) {
1178 if ( !ValidateTextIntRange( gtk_entry_get_text( GTK_ENTRY( text1 ) ), 1, 200, "Number Of Points", &rs->nPoints ) ) {
1182 if ( !ValidateTextFloatRange( gtk_entry_get_text( GTK_ENTRY( text2 ) ), 1.0f, 10.0f, "Multiplier", &rs->fMultiplier ) ) {
1186 if ( !ValidateTextFloatRange( gtk_entry_get_text( GTK_ENTRY( text3 ) ), -10000.0f, -1.0f, "Gravity", &rs->fGravity ) ) {
1190 rs->bNoUpdate = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check1 ) ) ? true : false;
1191 rs->bShowExtra = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( check2 ) ) ? true : false;
1195 gtk_grab_remove( window );
1201 EMessageBoxReturn DoCTFColourChangeBox(){
1202 ui::Widget w{ui::null};
1203 EMessageBoxReturn ret;
1206 auto window = ui::Window( ui::window_type::TOP );
1208 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
1209 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
1211 gtk_window_set_title( GTK_WINDOW( window ), "CTF Colour Changer" );
1212 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
1214 g_object_set_data( G_OBJECT( window ), "loop", &loop );
1215 g_object_set_data( G_OBJECT( window ), "ret", &ret );
1217 gtk_widget_realize( window );
1221 auto vbox = ui::VBox( FALSE, 10 );
1227 auto hbox = ui::HBox( FALSE, 10 );
1228 vbox.pack_start( hbox, TRUE, TRUE, 0 );
1231 // ---- hbox ---- ok/cancel buttons
1233 w = ui::Button( "Red->Blue" );
1234 hbox.pack_start( w, TRUE, TRUE, 0 );
1235 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
1237 gtk_widget_set_can_default( w, true );
1238 gtk_widget_grab_default( w );
1241 w = ui::Button( "Blue->Red" );
1242 hbox.pack_start( w, TRUE, TRUE, 0 );
1243 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
1246 w = ui::Button( "Cancel" );
1247 hbox.pack_start( w, TRUE, TRUE, 0 );
1248 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1256 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
1258 gtk_grab_add( window );
1261 gtk_main_iteration();
1263 gtk_grab_remove( window );
1269 EMessageBoxReturn DoResetTextureBox( ResetTextureRS* rs ){
1272 ui::Widget w{ui::null};
1274 EMessageBoxReturn ret;
1277 auto window = ui::Window( ui::window_type::TOP );
1279 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
1280 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
1282 gtk_window_set_title( GTK_WINDOW( window ), "Texture Reset" );
1283 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
1285 g_object_set_data( G_OBJECT( window ), "loop", &loop );
1286 g_object_set_data( G_OBJECT( window ), "ret", &ret );
1288 gtk_widget_realize( window );
1290 auto vbox = ui::VBox( FALSE, 10 );
1296 auto hbox = ui::HBox( FALSE, 10 );
1297 vbox.pack_start( hbox, FALSE, FALSE, 2 );
1302 texSelected = "Currently Selected Texture: ";
1303 texSelected += GetCurrentTexture();
1305 w = ui::Label( texSelected );
1306 hbox.pack_start( w, FALSE, FALSE, 2 );
1307 gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
1312 auto frame = ui::Frame( "Reset Texture Names" );
1314 vbox.pack_start( frame, FALSE, TRUE, 0 );
1316 auto table = ui::Table( 2, 3, TRUE );
1319 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1320 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1321 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1325 dlgTexReset.cbTexChange = ui::CheckButton( "Enabled" );
1326 dlgTexReset.cbTexChange.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
1327 dlgTexReset.cbTexChange.show();
1328 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbTexChange, 0, 1, 0, 1,
1329 (GtkAttachOptions) ( GTK_FILL ),
1330 (GtkAttachOptions) ( 0 ), 0, 0 );
1332 w = ui::Label( "Old Name: " );
1333 gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
1334 (GtkAttachOptions) ( GTK_FILL ),
1335 (GtkAttachOptions) ( 0 ), 0, 0 );
1338 dlgTexReset.editTexOld = ui::Entry( 256 );
1339 gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editTexOld ), rs->textureName );
1340 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editTexOld, 2, 3, 0, 1,
1341 (GtkAttachOptions) ( GTK_FILL ),
1342 (GtkAttachOptions) ( 0 ), 0, 0 );
1343 dlgTexReset.editTexOld.show();
1345 w = ui::Label( "New Name: " );
1346 gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 1, 2,
1347 (GtkAttachOptions) ( GTK_FILL ),
1348 (GtkAttachOptions) ( 0 ), 0, 0 );
1351 dlgTexReset.editTexNew = ui::Entry( 256 );
1352 gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editTexNew ), rs->textureName );
1353 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editTexNew, 2, 3, 1, 2,
1354 (GtkAttachOptions) ( GTK_FILL ),
1355 (GtkAttachOptions) ( 0 ), 0, 0 );
1356 dlgTexReset.editTexNew.show();
1360 frame = ui::Frame( "Reset Scales" );
1362 vbox.pack_start( frame, FALSE, TRUE, 0 );
1364 table = ui::Table( 2, 3, TRUE );
1367 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1368 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1369 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1373 dlgTexReset.cbScaleHor = ui::CheckButton( "Enabled" );
1374 dlgTexReset.cbScaleHor.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
1375 dlgTexReset.cbScaleHor.show();
1376 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbScaleHor, 0, 1, 0, 1,
1377 (GtkAttachOptions) ( GTK_FILL ),
1378 (GtkAttachOptions) ( 0 ), 0, 0 );
1380 w = ui::Label( "New Horizontal Scale: " );
1381 gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
1382 (GtkAttachOptions) ( GTK_FILL ),
1383 (GtkAttachOptions) ( 0 ), 0, 0 );
1386 dlgTexReset.editScaleHor = ui::Entry( 256 );
1387 gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editScaleHor ), "0.5" );
1388 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editScaleHor, 2, 3, 0, 1,
1389 (GtkAttachOptions) ( GTK_FILL ),
1390 (GtkAttachOptions) ( 0 ), 0, 0 );
1391 dlgTexReset.editScaleHor.show();
1394 dlgTexReset.cbScaleVert = ui::CheckButton( "Enabled" );
1395 dlgTexReset.cbScaleVert.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
1396 dlgTexReset.cbScaleVert.show();
1397 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbScaleVert, 0, 1, 1, 2,
1398 (GtkAttachOptions) ( GTK_FILL ),
1399 (GtkAttachOptions) ( 0 ), 0, 0 );
1401 w = ui::Label( "New Vertical Scale: " );
1402 gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 1, 2,
1403 (GtkAttachOptions) ( GTK_FILL ),
1404 (GtkAttachOptions) ( 0 ), 0, 0 );
1407 dlgTexReset.editScaleVert = ui::Entry( 256 );
1408 gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editScaleVert ), "0.5" );
1409 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editScaleVert, 2, 3, 1, 2,
1410 (GtkAttachOptions) ( GTK_FILL ),
1411 (GtkAttachOptions) ( 0 ), 0, 0 );
1412 dlgTexReset.editScaleVert.show();
1416 frame = ui::Frame( "Reset Shift" );
1418 vbox.pack_start( frame, FALSE, TRUE, 0 );
1420 table = ui::Table( 2, 3, TRUE );
1423 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1424 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1425 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1429 dlgTexReset.cbShiftHor = ui::CheckButton( "Enabled" );
1430 dlgTexReset.cbShiftHor.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
1431 dlgTexReset.cbShiftHor.show();
1432 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbShiftHor, 0, 1, 0, 1,
1433 (GtkAttachOptions) ( GTK_FILL ),
1434 (GtkAttachOptions) ( 0 ), 0, 0 );
1436 w = ui::Label( "New Horizontal Shift: " );
1437 gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
1438 (GtkAttachOptions) ( GTK_FILL ),
1439 (GtkAttachOptions) ( 0 ), 0, 0 );
1442 dlgTexReset.editShiftHor = ui::Entry( 256 );
1443 gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editShiftHor ), "0" );
1444 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editShiftHor, 2, 3, 0, 1,
1445 (GtkAttachOptions) ( GTK_FILL ),
1446 (GtkAttachOptions) ( 0 ), 0, 0 );
1447 dlgTexReset.editShiftHor.show();
1450 dlgTexReset.cbShiftVert = ui::CheckButton( "Enabled" );
1451 dlgTexReset.cbShiftVert.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
1452 dlgTexReset.cbShiftVert.show();
1453 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbShiftVert, 0, 1, 1, 2,
1454 (GtkAttachOptions) ( GTK_FILL ),
1455 (GtkAttachOptions) ( 0 ), 0, 0 );
1457 w = ui::Label( "New Vertical Shift: " );
1458 gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 1, 2,
1459 (GtkAttachOptions) ( GTK_FILL ),
1460 (GtkAttachOptions) ( 0 ), 0, 0 );
1463 dlgTexReset.editShiftVert = ui::Entry( 256 );
1464 gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editShiftVert ), "0" );
1465 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editShiftVert, 2, 3, 1, 2,
1466 (GtkAttachOptions) ( GTK_FILL ),
1467 (GtkAttachOptions) ( 0 ), 0, 0 );
1468 dlgTexReset.editShiftVert.show();
1472 frame = ui::Frame( "Reset Rotation" );
1474 vbox.pack_start( frame, FALSE, TRUE, 0 );
1476 table = ui::Table( 1, 3, TRUE );
1479 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1480 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1481 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1485 dlgTexReset.cbRotation = ui::CheckButton( "Enabled" );
1486 dlgTexReset.cbRotation.show();
1487 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbRotation, 0, 1, 0, 1,
1488 (GtkAttachOptions) ( GTK_FILL ),
1489 (GtkAttachOptions) ( 0 ), 0, 0 );
1491 w = ui::Label( "New Rotation Value: " );
1492 gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
1493 (GtkAttachOptions) ( GTK_FILL ),
1494 (GtkAttachOptions) ( 0 ), 0, 0 );
1497 dlgTexReset.editRotation = ui::Entry( 256 );
1498 gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editRotation ), "0" );
1499 gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editRotation, 2, 3, 0, 1,
1500 (GtkAttachOptions) ( GTK_FILL ),
1501 (GtkAttachOptions) ( 0 ), 0, 0 );
1502 dlgTexReset.editRotation.show();
1506 hbox = ui::HBox( FALSE, 10 );
1507 vbox.pack_start( hbox, FALSE, FALSE, 2 );
1512 w = ui::Button( "Use Selected Brushes" );
1513 hbox.pack_start( w, TRUE, TRUE, 0 );
1514 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
1516 gtk_widget_set_can_default( w, true );
1517 gtk_widget_grab_default( w );
1520 w = ui::Button( "Use All Brushes" );
1521 hbox.pack_start( w, TRUE, TRUE, 0 );
1522 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
1525 w = ui::Button( "Cancel" );
1526 hbox.pack_start( w, TRUE, TRUE, 0 );
1527 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1535 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
1537 gtk_grab_add( window );
1539 Update_TextureReseter();
1541 bool dialogError = TRUE;
1542 while ( dialogError )
1546 gtk_main_iteration();
1548 dialogError = FALSE;
1550 if ( ret != eIDCANCEL ) {
1551 rs->bResetRotation = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbRotation ) );
1552 if ( rs->bResetRotation ) {
1553 if ( !ValidateTextInt( gtk_entry_get_text( GTK_ENTRY( dlgTexReset.editRotation ) ), "Rotation", &rs->rotation ) ) {
1558 rs->bResetScale[0] = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleHor ) );
1559 if ( rs->bResetScale[0] ) {
1560 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( dlgTexReset.editScaleHor ) ), "Horizontal Scale", &rs->fScale[0] ) ) {
1565 rs->bResetScale[1] = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbScaleVert ) );
1566 if ( rs->bResetScale[1] ) {
1567 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( dlgTexReset.editScaleVert ) ), "Vertical Scale", &rs->fScale[1] ) ) {
1572 rs->bResetShift[0] = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftHor ) );
1573 if ( rs->bResetShift[0] ) {
1574 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( dlgTexReset.editShiftHor ) ), "Horizontal Shift", &rs->fShift[0] ) ) {
1579 rs->bResetShift[1] = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbShiftVert ) );
1580 if ( rs->bResetShift[1] ) {
1581 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( dlgTexReset.editShiftVert ) ), "Vertical Shift", &rs->fShift[1] ) ) {
1586 rs->bResetTextureName = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( dlgTexReset.cbTexChange ) );
1587 if ( rs->bResetTextureName ) {
1588 strcpy( rs->textureName, gtk_entry_get_text( GTK_ENTRY( dlgTexReset.editTexOld ) ) );
1589 strcpy( rs->newTextureName, gtk_entry_get_text( GTK_ENTRY( dlgTexReset.editTexNew ) ) );
1594 gtk_grab_remove( window );
1600 EMessageBoxReturn DoTrainThingBox( TrainThingRS* rs ){
1603 ui::Widget w{ui::null};
1605 ui::Widget radiusX{ui::null}, radiusY{ui::null};
1606 ui::Widget angleStart{ui::null}, angleEnd{ui::null};
1607 ui::Widget heightStart{ui::null}, heightEnd{ui::null};
1608 ui::Widget numPoints{ui::null};
1610 EMessageBoxReturn ret;
1613 auto window = ui::Window( ui::window_type::TOP );
1615 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
1616 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
1618 gtk_window_set_title( GTK_WINDOW( window ), "Train Thing" );
1619 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
1621 g_object_set_data( G_OBJECT( window ), "loop", &loop );
1622 g_object_set_data( G_OBJECT( window ), "ret", &ret );
1624 gtk_widget_realize( window );
1626 auto vbox = ui::VBox( FALSE, 10 );
1632 auto hbox = ui::HBox( FALSE, 10 );
1633 vbox.pack_start( hbox, FALSE, FALSE, 2 );
1638 auto frame = ui::Frame( "Radii" );
1640 vbox.pack_start( frame, FALSE, TRUE, 0 );
1642 auto table = ui::Table( 2, 3, TRUE );
1645 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1646 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1647 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1651 w = ui::Label( "X: " );
1652 gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
1653 (GtkAttachOptions) ( GTK_FILL ),
1654 (GtkAttachOptions) ( 0 ), 0, 0 );
1657 radiusX = ui::Entry( 256 );
1658 gtk_entry_set_text( GTK_ENTRY( radiusX ), "100" );
1659 gtk_table_attach( GTK_TABLE( table ), radiusX, 1, 2, 0, 1,
1660 (GtkAttachOptions) ( GTK_FILL ),
1661 (GtkAttachOptions) ( 0 ), 0, 0 );
1666 w = ui::Label( "Y: " );
1667 gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 1, 2,
1668 (GtkAttachOptions) ( GTK_FILL ),
1669 (GtkAttachOptions) ( 0 ), 0, 0 );
1672 radiusY = ui::Entry( 256 );
1673 gtk_entry_set_text( GTK_ENTRY( radiusY ), "100" );
1674 gtk_table_attach( GTK_TABLE( table ), radiusY, 1, 2, 1, 2,
1675 (GtkAttachOptions) ( GTK_FILL ),
1676 (GtkAttachOptions) ( 0 ), 0, 0 );
1681 frame = ui::Frame( "Angles" );
1683 vbox.pack_start( frame, FALSE, TRUE, 0 );
1685 table = ui::Table( 2, 3, TRUE );
1688 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1689 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1690 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1694 w = ui::Label( "Start: " );
1695 gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
1696 (GtkAttachOptions) ( GTK_FILL ),
1697 (GtkAttachOptions) ( 0 ), 0, 0 );
1700 angleStart = ui::Entry( 256 );
1701 gtk_entry_set_text( GTK_ENTRY( angleStart ), "0" );
1702 gtk_table_attach( GTK_TABLE( table ), angleStart, 1, 2, 0, 1,
1703 (GtkAttachOptions) ( GTK_FILL ),
1704 (GtkAttachOptions) ( 0 ), 0, 0 );
1709 w = ui::Label( "End: " );
1710 gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 1, 2,
1711 (GtkAttachOptions) ( GTK_FILL ),
1712 (GtkAttachOptions) ( 0 ), 0, 0 );
1715 angleEnd = ui::Entry( 256 );
1716 gtk_entry_set_text( GTK_ENTRY( angleEnd ), "90" );
1717 gtk_table_attach( GTK_TABLE( table ), angleEnd, 1, 2, 1, 2,
1718 (GtkAttachOptions) ( GTK_FILL ),
1719 (GtkAttachOptions) ( 0 ), 0, 0 );
1723 frame = ui::Frame( "Height" );
1725 vbox.pack_start( frame, FALSE, TRUE, 0 );
1727 table = ui::Table( 2, 3, TRUE );
1730 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1731 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1732 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1736 w = ui::Label( "Start: " );
1737 gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
1738 (GtkAttachOptions) ( GTK_FILL ),
1739 (GtkAttachOptions) ( 0 ), 0, 0 );
1742 heightStart = ui::Entry( 256 );
1743 gtk_entry_set_text( GTK_ENTRY( heightStart ), "0" );
1744 gtk_table_attach( GTK_TABLE( table ), heightStart, 1, 2, 0, 1,
1745 (GtkAttachOptions) ( GTK_FILL ),
1746 (GtkAttachOptions) ( 0 ), 0, 0 );
1751 w = ui::Label( "End: " );
1752 gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 1, 2,
1753 (GtkAttachOptions) ( GTK_FILL ),
1754 (GtkAttachOptions) ( 0 ), 0, 0 );
1757 heightEnd = ui::Entry( 256 );
1758 gtk_entry_set_text( GTK_ENTRY( heightEnd ), "0" );
1759 gtk_table_attach( GTK_TABLE( table ), heightEnd, 1, 2, 1, 2,
1760 (GtkAttachOptions) ( GTK_FILL ),
1761 (GtkAttachOptions) ( 0 ), 0, 0 );
1766 frame = ui::Frame( "Points" );
1768 vbox.pack_start( frame, FALSE, TRUE, 0 );
1770 table = ui::Table( 2, 3, TRUE );
1773 gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
1774 gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
1775 gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
1779 w = ui::Label( "Number: " );
1780 gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
1781 (GtkAttachOptions) ( GTK_FILL ),
1782 (GtkAttachOptions) ( 0 ), 0, 0 );
1785 numPoints = ui::Entry( 256 );
1786 gtk_entry_set_text( GTK_ENTRY( numPoints ), "0" );
1787 gtk_table_attach( GTK_TABLE( table ), numPoints, 1, 2, 0, 1,
1788 (GtkAttachOptions) ( GTK_FILL ),
1789 (GtkAttachOptions) ( 0 ), 0, 0 );
1793 hbox = ui::HBox( FALSE, 10 );
1794 vbox.pack_start( hbox, FALSE, FALSE, 2 );
1799 w = ui::Button( "Ok" );
1800 hbox.pack_start( w, TRUE, TRUE, 0 );
1801 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
1803 gtk_widget_set_can_default( w, true );
1804 gtk_widget_grab_default( w );
1807 w = ui::Button( "Cancel" );
1808 hbox.pack_start( w, TRUE, TRUE, 0 );
1809 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1817 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
1819 gtk_grab_add( window );
1821 bool dialogError = TRUE;
1822 while ( dialogError )
1826 gtk_main_iteration();
1828 dialogError = FALSE;
1830 if ( ret != eIDCANCEL ) {
1831 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( radiusX ) ), "Radius (X)", &rs->fRadiusX ) ) {
1835 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( radiusY ) ), "Radius (Y)", &rs->fRadiusY ) ) {
1839 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( angleStart ) ), "Angle (Start)", &rs->fStartAngle ) ) {
1843 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( angleEnd ) ), "Angle (End)", &rs->fEndAngle ) ) {
1847 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( heightStart ) ), "Height (Start)", &rs->fStartHeight ) ) {
1851 if ( !ValidateTextFloat( gtk_entry_get_text( GTK_ENTRY( heightEnd ) ), "Height (End)", &rs->fEndHeight ) ) {
1855 if ( !ValidateTextInt( gtk_entry_get_text( GTK_ENTRY( numPoints ) ), "Num Points", &rs->iNumPoints ) ) {
1861 gtk_grab_remove( window );
1867 // add a simple input for the MakeChain thing..
1868 EMessageBoxReturn DoMakeChainBox( MakeChainRS* rs ){
1869 ui::Widget w{ui::null};
1870 ui::Entry textlinkNum{ui::null}, textlinkName{ui::null};
1871 EMessageBoxReturn ret;
1874 const char *text = "Please set a value in the boxes below and press 'OK' to make a chain";
1876 auto window = ui::Window( ui::window_type::TOP );
1878 window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
1879 window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
1881 gtk_window_set_title( GTK_WINDOW( window ), "Make Chain" );
1883 gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
1885 g_object_set_data( G_OBJECT( window ), "loop", &loop );
1886 g_object_set_data( G_OBJECT( window ), "ret", &ret );
1888 gtk_widget_realize( window );
1891 auto vbox = ui::VBox( FALSE, 10 );
1895 auto hbox = ui::HBox( FALSE, 10 );
1899 // dunno if you want this text or not ...
1900 w = ui::Label( text );
1901 hbox.pack_start( w, FALSE, FALSE, 0 );
1904 w = ui::Widget(gtk_hseparator_new());
1905 vbox.pack_start( w, FALSE, FALSE, 0 );
1908 // ------------------------- //
1911 hbox = ui::HBox( FALSE, 10 );
1912 vbox.pack_start( hbox, FALSE, FALSE, 0 );
1915 textlinkNum = ui::Entry( 256 );
1916 hbox.pack_start( textlinkNum, FALSE, FALSE, 1 );
1919 w = ui::Label( "Number of elements in chain" );
1920 hbox.pack_start( w, FALSE, FALSE, 1 );
1923 // -------------------------- //
1925 hbox = ui::HBox( FALSE, 10 );
1926 vbox.pack_start( hbox, FALSE, FALSE, 0 );
1929 textlinkName = ui::Entry( 256 );
1930 hbox.pack_start( textlinkName, FALSE, FALSE, 0 );
1931 textlinkName.show();
1933 w = ui::Label( "Basename for chain's targetnames." );
1934 hbox.pack_start( w, FALSE, FALSE, 1 );
1938 w = ui::Button( "OK" );
1939 hbox.pack_start( w, TRUE, TRUE, 0 );
1940 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
1941 gtk_widget_set_can_default( w, true );
1942 gtk_widget_grab_default( w );
1945 w = ui::Button( "Cancel" );
1946 hbox.pack_start( w, TRUE, TRUE, 0 );
1947 w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
1952 gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
1954 gtk_grab_add( window );
1956 bool dialogError = TRUE;
1957 while ( dialogError )
1961 gtk_main_iteration();
1963 dialogError = FALSE;
1965 if ( ret == eIDOK ) {
1966 strcpy( rs->linkName, gtk_entry_get_text( textlinkName ) );
1967 if ( !ValidateTextInt( gtk_entry_get_text( textlinkNum ), "Elements", &rs->linkNum ) ) {
1973 gtk_grab_remove( window );