/* RealTimeBattle, a robot programming game for Unix Copyright (C) 1998-2000 Erik Ouchterlony and Ragnar Ouchterlony This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include using namespace std; #include "OptionsWindow.h" #include "IntlDefs.h" #include "ArenaRealTime.h" #include "ArenaController.h" #include "ArenaWindow.h" #include "ControlWindow.h" #include "MessageWindow.h" #include "ScoreWindow.h" #include "StatisticsWindow.h" #include "Options.h" #include "Various.h" extern class Options the_opts; extern class Gui the_gui; extern class ControlWindow* controlwindow_p; OptionsWindow::OptionsWindow( const int default_width, const int default_height, const int default_x_pos, const int default_y_pos ) { // The window widget window_p = gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_widget_set_name( window_p, "RTB Options" ); gtk_window_set_title( GTK_WINDOW( window_p ), _("Options") ); gtk_container_border_width( GTK_CONTAINER( window_p ), 12 ); if( default_width != -1 && default_height != -1 ) gtk_widget_set_usize( window_p, default_width, default_height ); if( default_x_pos != -1 && default_y_pos != -1 ) gtk_widget_set_uposition( window_p, default_x_pos, default_y_pos ); gtk_signal_connect( GTK_OBJECT( window_p ), "delete_event", (GtkSignalFunc) OptionsWindow::delete_event_occured, (gpointer) this ); // Main box GtkWidget* vbox = gtk_vbox_new( FALSE, 10 ); gtk_container_add( GTK_CONTAINER( window_p ), vbox ); gtk_widget_show( vbox ); // The notebook with all options GtkWidget* notebook = gtk_notebook_new(); gtk_notebook_set_tab_pos( GTK_NOTEBOOK( notebook ), GTK_POS_LEFT ); gtk_box_pack_start( GTK_BOX( vbox ), notebook, TRUE, TRUE, 0 ); gtk_widget_show( notebook ); const char* page_titles[LAST_PAGE] = { _("Environment"), _("Robot"), _("Shot"), _("Extras"), _("Time"), _("Window sizes"), _("Misc") }; option_info_t* double_opts = the_opts.get_all_double_options(); option_info_t* long_opts = the_opts.get_all_long_options(); option_info_t* string_opts = the_opts.get_all_string_options(); for( int i=0; i < LAST_PAGE; i++ ) { int number_of_options = 0; for( int opt=0; opt* double_opts = the_opts.get_all_double_options(); option_info_t* long_opts = the_opts.get_all_long_options(); option_info_t* string_opts = the_opts.get_all_string_options(); for(int i=0;i> entry_value; if( entry_value > double_opts[i].max_value ) entry_value = double_opts[i].max_value; if( entry_value < double_opts[i].min_value ) entry_value = double_opts[i].min_value; double_opts[i].value = entry_value; } for(int i=0;i> entry_value; } if( long_opts[i].datatype == ENTRY_HEX ) { string2number.clear(); string2number.str(gtk_entry_get_text( GTK_ENTRY( long_opts[i].entry ) )); string2number >> std::hex >> entry_value >> std::dec; } if( entry_value > long_opts[i].max_value ) entry_value = long_opts[i].max_value; if( entry_value < long_opts[i].min_value ) entry_value = long_opts[i].min_value; long_opts[i].value = entry_value; } for(int i=0;i* double_opts = the_opts.get_all_double_options(); option_info_t* long_opts = the_opts.get_all_long_options(); option_info_t* string_opts = the_opts.get_all_string_options(); for(int i=0;i* double_opts = the_opts.get_all_double_options(); option_info_t* long_opts = the_opts.get_all_long_options(); option_info_t* string_opts = the_opts.get_all_string_options(); for(int i=0;iupdate_all_gtk_entries(); } void OptionsWindow::load( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { if( optionswindow_p->get_filesel() == NULL ) { GtkWidget* fs = gtk_file_selection_new( _("Choose an options file to load") ); gtk_signal_connect( GTK_OBJECT( fs ), "destroy", (GtkSignalFunc) OptionsWindow::destroy_filesel, (gpointer) optionswindow_p ); gtk_signal_connect ( GTK_OBJECT( GTK_FILE_SELECTION( fs )->cancel_button ), "clicked", (GtkSignalFunc) OptionsWindow::destroy_filesel, (gpointer) optionswindow_p ); gtk_signal_connect ( GTK_OBJECT( GTK_FILE_SELECTION( fs )->ok_button ), "clicked", (GtkSignalFunc) OptionsWindow::load_options, (gpointer) optionswindow_p ); gtk_widget_show( fs ); optionswindow_p->set_filesel( fs ); } } void OptionsWindow::save( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { if( optionswindow_p->get_filesel() == NULL ) { GtkWidget* fs = gtk_file_selection_new( _("Choose an options file to save") ); gtk_signal_connect( GTK_OBJECT( fs ), "destroy", (GtkSignalFunc) OptionsWindow::destroy_filesel, (gpointer) optionswindow_p ); gtk_signal_connect ( GTK_OBJECT( GTK_FILE_SELECTION( fs )->cancel_button ), "clicked", (GtkSignalFunc) OptionsWindow::destroy_filesel, (gpointer) optionswindow_p ); gtk_signal_connect ( GTK_OBJECT( GTK_FILE_SELECTION( fs )->ok_button ), "clicked", (GtkSignalFunc) OptionsWindow::save_options, (gpointer) optionswindow_p ); gtk_widget_show( fs ); optionswindow_p->set_filesel( fs ); } } void OptionsWindow::load_options( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { the_opts.read_options_file ( gtk_file_selection_get_filename ( GTK_FILE_SELECTION( optionswindow_p->get_filesel() )), false ); optionswindow_p->update_all_gtk_entries(); destroy_filesel( optionswindow_p->get_filesel(), optionswindow_p ); } void OptionsWindow::save_options( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { the_opts.save_all_options_to_file ( gtk_file_selection_get_filename ( GTK_FILE_SELECTION( optionswindow_p->get_filesel() )), false ); destroy_filesel( optionswindow_p->get_filesel(), optionswindow_p ); } void OptionsWindow::destroy_filesel( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { gtk_widget_destroy( optionswindow_p->get_filesel() ); optionswindow_p->set_filesel( NULL ); } void OptionsWindow::save_def( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { the_opts.save_all_options_to_file("",true); } void OptionsWindow::apply( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { optionswindow_p->set_all_options(); } void OptionsWindow::ok( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { optionswindow_p->set_all_options(); the_opts.close_optionswindow(); } void OptionsWindow::cancel( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { the_opts.close_optionswindow(); } void OptionsWindow::delete_event_occured( GtkWidget* widget, GdkEvent* event, class OptionsWindow* optionswindow_p ) { the_opts.close_optionswindow(); } void OptionsWindow::grab_windows( GtkWidget* widget, class OptionsWindow* optionswindow_p ) { option_info_t* long_opts = the_opts.get_all_long_options(); if( the_gui.is_arenawindow_up() ) { ArenaWindow* aw_p = the_gui.get_arenawindow_p(); int width, height; int xpos, ypos; gdk_window_get_size( aw_p->get_window_p()->window, &width, &height ); gdk_window_get_root_origin( aw_p->get_window_p()->window, &xpos, &ypos ); long_opts[OPTION_ARENA_WINDOW_SIZE_X].value = width; long_opts[OPTION_ARENA_WINDOW_SIZE_Y].value = height; long_opts[OPTION_ARENA_WINDOW_POS_X].value = xpos; long_opts[OPTION_ARENA_WINDOW_POS_Y].value = ypos; optionswindow_p->update_all_gtk_entries(); } { int xpos, ypos; gdk_window_get_root_origin( controlwindow_p->get_window_p()->window, &xpos, &ypos ); long_opts[OPTION_CONTROL_WINDOW_POS_X].value = xpos; long_opts[OPTION_CONTROL_WINDOW_POS_Y].value = ypos; optionswindow_p->update_all_gtk_entries(); } if( the_gui.is_messagewindow_up() ) { MessageWindow* mw_p = the_gui.get_messagewindow_p(); int width, height; int xpos, ypos; gdk_window_get_size( mw_p->get_window_p()->window, &width, &height ); gdk_window_get_root_origin( mw_p->get_window_p()->window, &xpos, &ypos ); long_opts[OPTION_MESSAGE_WINDOW_SIZE_X].value = width; long_opts[OPTION_MESSAGE_WINDOW_SIZE_Y].value = height; long_opts[OPTION_MESSAGE_WINDOW_POS_X].value = xpos; long_opts[OPTION_MESSAGE_WINDOW_POS_Y].value = ypos; optionswindow_p->update_all_gtk_entries(); } if( the_gui.is_scorewindow_up() ) { ScoreWindow* sw_p = the_gui.get_scorewindow_p(); int width, height; int xpos, ypos; gdk_window_get_size( sw_p->get_window_p()->window, &width, &height ); gdk_window_get_root_origin( sw_p->get_window_p()->window, &xpos, &ypos ); long_opts[OPTION_SCORE_WINDOW_SIZE_X].value = width; long_opts[OPTION_SCORE_WINDOW_SIZE_Y].value = height; long_opts[OPTION_SCORE_WINDOW_POS_X].value = xpos; long_opts[OPTION_SCORE_WINDOW_POS_Y].value = ypos; optionswindow_p->update_all_gtk_entries(); } if( the_gui.is_statisticswindow_up() ) { StatisticsWindow* sw_p = the_gui.get_statisticswindow_p(); int width, height; gdk_window_get_size( sw_p->get_window_p()->window, &width, &height ); long_opts[OPTION_STATISTICS_WINDOW_SIZE_X].value = width; long_opts[OPTION_STATISTICS_WINDOW_SIZE_Y].value = height; optionswindow_p->update_all_gtk_entries(); } } void OptionsWindow::double_min( GtkWidget* widget, option_info_t* option ) { ostringstream number2string; number2string << option->min_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), number2string.str().c_str() ); } void OptionsWindow::double_def( GtkWidget* widget, option_info_t* option ) { ostringstream number2string; number2string << option->default_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), number2string.str().c_str() ); } void OptionsWindow::double_max( GtkWidget* widget, option_info_t* option ) { ostringstream number2string; number2string << option->max_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), number2string.str().c_str() ); } void OptionsWindow::long_min( GtkWidget* widget, option_info_t* option ) { if( option->datatype == ENTRY_INT ) { ostringstream number2string; number2string << option->min_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), number2string.str().c_str() ); } else if( option->datatype == ENTRY_HEX ) { ostringstream hex2string; hex2string << std::hex << option->min_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), hex2string.str().c_str() ); } } void OptionsWindow::long_def( GtkWidget* widget, option_info_t* option ) { if( option->datatype == ENTRY_INT ) { ostringstream number2string; number2string << option->default_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), number2string.str().c_str() ); } else if( option->datatype == ENTRY_HEX ) { ostringstream hex2string; hex2string << std::hex << option->default_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), hex2string.str().c_str() ); } } void OptionsWindow::long_max( GtkWidget* widget, option_info_t* option ) { if( option->datatype == ENTRY_INT ) { ostringstream number2string; number2string << option->max_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), number2string.str().c_str() ); } else if( option->datatype == ENTRY_HEX ) { ostringstream hex2string; hex2string << std::hex << option->max_value; gtk_entry_set_text( GTK_ENTRY( option->entry ), hex2string.str().c_str() ); } } void OptionsWindow::string_def( GtkWidget* widget, option_info_t* option ) { gtk_entry_set_text( GTK_ENTRY( option->entry ), option->default_value.c_str() ); }