00001 #include <gtk/gtk.h>
00002 #include <glib/gprintf.h>
00003 #include "etk_keyvalue.h"
00004 #include "etk_addrem.h"
00005
00006 void new_sim( void )
00007 {
00008 g_printf( "Create a new simulation\n" );
00009 }
00010
00011 void open_sim( void )
00012 {
00013 g_printf( "Open an existing simulation\n" );
00014 }
00015
00016 void about_sedflux( void )
00017 {
00018 g_printf( "Sedflux 2.0 by Eric\n" );
00019 }
00020
00021 void quit_prog( void )
00022 {
00023 g_printf( "Quitting..." );
00024
00025 gtk_main_quit ();
00026 }
00027
00028 static GtkItemFactoryEntry menu_items[] =
00029 {
00030 { "/_File" , NULL , NULL , 0 , "<Branch>" } ,
00031 { "/_File/_New" , "<CTRL>N" , new_sim , 0 , "<Item>" } ,
00032 { "/_File/_Open" , "<CTRL>O" , open_sim , 0 , "<Item>" } ,
00033 { "/_File/sep1" , NULL , NULL , 0 , "<Separator>" } ,
00034 { "/_File/_Quit" , "<CTRL>Q" , quit_prog , 0 , "<StockItem>" , GTK_STOCK_QUIT } ,
00035 { "/_Help" , NULL , NULL , 0 , "<LastBranch>" } ,
00036 { "/_Help/_About" , NULL , about_sedflux , 0 , "<Item>" }
00037 };
00038
00039 static gint n_items = sizeof(menu_items) / sizeof(menu_items[0]);
00040
00041 static GtkWidget* get_menubar_menu( GtkWidget* window )
00042 {
00043 GtkAccelGroup* accel_group = gtk_accel_group_new();
00044 GtkItemFactory* i_factory = gtk_item_factory_new( GTK_TYPE_MENU_BAR ,
00045 "<SedfluxMain>" ,
00046 accel_group );
00047
00048 gtk_item_factory_create_items( i_factory , n_items , menu_items , NULL );
00049
00050 gtk_window_add_accel_group( GTK_WINDOW(window) , accel_group );
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 return gtk_item_factory_get_widget( i_factory , "<SedfluxMain>" );
00062 }
00063
00064 void store_filename( GtkWidget* widget , GtkWidget* user_data[2] )
00065 {
00066 GtkWidget* file_selector = GTK_WIDGET( user_data[0] );
00067 GtkWidget* entry = GTK_WIDGET( user_data[1] );
00068 const gchar* filename;
00069
00070 filename = gtk_file_selection_get_filename( GTK_FILE_SELECTION(file_selector) );
00071 gtk_entry_set_text( GTK_ENTRY( entry ) , filename );
00072
00073 g_print( "Selected filename: %s\n" , filename );
00074 }
00075
00076 void create_file_selection( gpointer user_data )
00077 {
00078 GtkWidget* entry = GTK_WIDGET( user_data );
00079 GtkWidget* file_selector;
00080 static GtkWidget* data[2];
00081
00082 file_selector = gtk_file_selection_new( "Please select a file." );
00083
00084 data[0] = file_selector;
00085 data[1] = entry;
00086
00087 g_signal_connect( GTK_FILE_SELECTION( file_selector )->ok_button ,
00088 "clicked" ,
00089 G_CALLBACK( store_filename ) ,
00090 data );
00091
00092 g_signal_connect_swapped( GTK_FILE_SELECTION( file_selector )->ok_button ,
00093 "clicked" ,
00094 G_CALLBACK( gtk_widget_destroy ) ,
00095 file_selector );
00096 g_signal_connect_swapped( GTK_FILE_SELECTION( file_selector )->cancel_button ,
00097 "clicked" ,
00098 G_CALLBACK( gtk_widget_destroy ) ,
00099 file_selector );
00100
00101 gtk_widget_show( file_selector );
00102 }
00103
00104 static GtkWidget* get_bathymetry_file( GtkWidget* window )
00105 {
00106 GtkWidget* frame = gtk_frame_new( "Initial Bathymetry" );
00107
00108 {
00109 GtkWidget* v_box = gtk_vbox_new ( FALSE , 2 );
00110 GtkWidget* h_box = gtk_hbox_new ( FALSE , 2 );
00111 GtkWidget* message = gtk_text_view_new ( );
00112
00113 {
00114 GtkTextBuffer* buff = gtk_text_buffer_new( NULL );
00115
00116 gtk_text_buffer_set_text( buff , "This is a test.\n\n An indented line.\0" , -1 );
00117
00118 gtk_text_view_set_buffer ( GTK_TEXT_VIEW( message ) , buff );
00119 gtk_text_view_set_editable( GTK_TEXT_VIEW( message ) , FALSE );
00120 }
00121
00122 {
00123 GtkWidget* entry = gtk_entry_new();
00124 GtkWidget* choose_button = gtk_button_new_with_label( "Choose..." );
00125
00126 gtk_box_pack_start( GTK_BOX( h_box ) , entry , TRUE , TRUE , 2 );
00127 gtk_box_pack_end ( GTK_BOX( h_box ) , choose_button , FALSE , FALSE , 2 );
00128
00129 g_signal_connect_swapped( G_OBJECT( choose_button ) ,
00130 "clicked" ,
00131 G_CALLBACK(create_file_selection) ,
00132 entry );
00133
00134
00135
00136
00137
00138
00139 }
00140
00141 gtk_box_pack_start( GTK_BOX( v_box ) , message , TRUE , TRUE , 2 );
00142 gtk_box_pack_start( GTK_BOX( v_box ) , h_box , FALSE , FALSE , 2 );
00143
00144 gtk_container_set_border_width( GTK_CONTAINER( v_box ) , 10 );
00145
00146 gtk_container_add( GTK_CONTAINER( frame ) , v_box );
00147 }
00148
00149 gtk_frame_set_label_align( GTK_FRAME( frame ) , 1. , .5 );
00150 gtk_container_set_border_width( GTK_CONTAINER( frame ) , 5 );
00151
00152 return frame;
00153 }
00154
00155 static GtkWidget* get_global_parameters( GtkWidget* window )
00156 {
00157 GtkWidget* frame = gtk_frame_new( "Resolution" );
00158
00159 {
00160 GtkWidget* v_box = gtk_vbox_new ( FALSE , 2 );
00161 GtkWidget* message = gtk_text_view_new ( );
00162
00163 {
00164 GtkTextBuffer* buff = gtk_text_buffer_new( NULL );
00165
00166 gtk_text_buffer_set_text( buff , "Specify the spatial resolution for the simulation.\0" , -1 );
00167
00168 gtk_text_view_set_buffer ( GTK_TEXT_VIEW( message ) , buff );
00169 gtk_text_view_set_editable( GTK_TEXT_VIEW( message ) , FALSE );
00170
00171 gtk_box_pack_start( GTK_BOX( v_box ) , message , TRUE , TRUE , 2 );
00172 }
00173
00174 {
00175 GtkWidget* v_res = key_value_new( "Vertical resolution (m)" );
00176 GtkWidget* x_res = key_value_new( "Along-shore width (m)" );
00177 GtkWidget* y_res = key_value_new( "Cross shore resolution (m)" );
00178
00179 gtk_box_pack_start( GTK_BOX( v_box ) , v_res , TRUE , TRUE , 2 );
00180 gtk_box_pack_start( GTK_BOX( v_box ) , x_res , TRUE , TRUE , 2 );
00181 gtk_box_pack_start( GTK_BOX( v_box ) , y_res , TRUE , TRUE , 2 );
00182
00183 }
00184
00185 gtk_container_set_border_width( GTK_CONTAINER( v_box ) , 10 );
00186
00187 gtk_container_add( GTK_CONTAINER( frame ) , v_box );
00188 }
00189
00190 gtk_frame_set_label_align( GTK_FRAME( frame ) , 1. , .5 );
00191 gtk_container_set_border_width( GTK_CONTAINER( frame ) , 5 );
00192
00193 return frame;
00194 }
00195
00196 void add_to_list( gpointer user_data )
00197 {
00198
00199 return;
00200
00201 }
00202
00203 GtkWidget* get_suspended_sediment_box( GList* items )
00204 {
00205 GtkWidget* h_box = gtk_hbox_new( TRUE , 2 );
00206 GtkWidget* dest_list_view;
00207 GtkWidget* arrow_box = gtk_vbox_new( FALSE , 2 );
00208 GtkWidget* src_list_view;
00209
00210
00211 {
00212 GtkListStore* dest_list = gtk_list_store_new( 1 , G_TYPE_STRING );
00213 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
00214 GtkTreeViewColumn* col;
00215 GtkTreeSelection* sel;
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 dest_list_view = gtk_tree_view_new_with_model( GTK_TREE_MODEL(dest_list) );
00228 col = gtk_tree_view_column_new_with_attributes( "Sediment Name" ,
00229 renderer ,
00230 "text" , 0 , NULL );
00231 gtk_tree_view_append_column( GTK_TREE_VIEW(dest_list_view) , col );
00232 gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(dest_list_view) , FALSE );
00233
00234 sel = gtk_tree_view_get_selection( GTK_TREE_VIEW(dest_list_view) );
00235 gtk_tree_selection_set_mode( sel , GTK_SELECTION_MULTIPLE );
00236 }
00237
00238
00239 {
00240 GtkWidget* right = gtk_button_new_from_stock( GTK_STOCK_GO_FORWARD );
00241 GtkWidget* left = gtk_button_new_from_stock( GTK_STOCK_GO_BACK );
00242 GtkWidget* new = gtk_button_new_from_stock( GTK_STOCK_NEW );
00243
00244 gtk_box_pack_start( GTK_BOX(arrow_box) , right , FALSE , FALSE , 2 );
00245 gtk_box_pack_start( GTK_BOX(arrow_box) , left , FALSE , FALSE , 2 );
00246 gtk_box_pack_end ( GTK_BOX(arrow_box) , new , FALSE , FALSE , 2 );
00247 }
00248
00249
00250 {
00251 GtkListStore* src_list = gtk_list_store_new( 1 , G_TYPE_STRING );
00252 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
00253 GtkTreeIter iter;
00254 GtkTreeViewColumn* col;
00255 GtkTreeSelection* sel;
00256
00257 {
00258 GList* this_item = items;
00259
00260 for ( ; this_item ; this_item = this_item->next )
00261 {
00262 gtk_list_store_append( src_list , &iter );
00263 gtk_list_store_set( src_list , &iter , 0 , this_item->data , -1 );
00264 }
00265 }
00266
00267 src_list_view = gtk_tree_view_new_with_model( GTK_TREE_MODEL(src_list) );
00268 col = gtk_tree_view_column_new_with_attributes( "Sediment Name" ,
00269 renderer ,
00270 "text" , 0 , NULL );
00271 gtk_tree_view_append_column( GTK_TREE_VIEW(src_list_view) , col );
00272 gtk_tree_view_set_headers_visible( GTK_TREE_VIEW(src_list_view) , FALSE );
00273
00274 sel = gtk_tree_view_get_selection( GTK_TREE_VIEW(src_list_view) );
00275 gtk_tree_selection_set_mode( sel , GTK_SELECTION_MULTIPLE );
00276 }
00277
00278 gtk_box_pack_start( GTK_BOX( h_box ) , dest_list_view , TRUE , TRUE , 2 );
00279 gtk_box_pack_start( GTK_BOX( h_box ) , arrow_box , FALSE , FALSE , 2 );
00280 gtk_box_pack_start( GTK_BOX( h_box ) , src_list_view , TRUE , TRUE , 2 );
00281
00282 return h_box;
00283 }
00284
00285 static GtkWidget* get_sediment( GtkWidget* window )
00286 {
00287 GtkWidget* frame = gtk_frame_new( "Sediment" );
00288 GtkWidget* v_box = gtk_vbox_new ( FALSE , 2 );
00289 GList* sediment_items = NULL;
00290
00291 gtk_frame_set_label_align( GTK_FRAME( frame ) , 1. , .5 );
00292
00293 sediment_items = g_list_append( sediment_items , "Coarse sand" );
00294 sediment_items = g_list_append( sediment_items , "Sand" );
00295 sediment_items = g_list_append( sediment_items , "Fine sand" );
00296 sediment_items = g_list_append( sediment_items , "Coarse silt" );
00297 sediment_items = g_list_append( sediment_items , "Silt" );
00298 sediment_items = g_list_append( sediment_items , "Fine silt" );
00299 sediment_items = g_list_append( sediment_items , "Coarse clay" );
00300 sediment_items = g_list_append( sediment_items , "clay" );
00301 sediment_items = g_list_append( sediment_items , "Fine Clay" );
00302
00303
00304 {
00305 GtkWidget* bed_frame = gtk_frame_new( "Bedload" );
00306 GtkWidget* bed_select = gtk_combo_new();
00307
00308 gtk_container_set_border_width( GTK_CONTAINER(bed_select) , 10 );
00309
00310 gtk_frame_set_label_align( GTK_FRAME( bed_frame ) , 1. , .5 );
00311
00312 gtk_combo_set_popdown_strings( GTK_COMBO(bed_select) , sediment_items );
00313
00314 gtk_container_add( GTK_CONTAINER( bed_frame ) , bed_select );
00315 gtk_container_set_border_width( GTK_CONTAINER( bed_frame ) , 5 );
00316
00317 gtk_box_pack_start( GTK_BOX(v_box) , bed_frame , TRUE , TRUE , 2 );
00318 }
00319
00320
00321 {
00322 GtkWidget* susp_frame = gtk_frame_new( "Suspended Load" );
00323 GtkWidget* susp_box = get_suspended_sediment_box( sediment_items );
00324
00325 gtk_container_set_border_width( GTK_CONTAINER(susp_box) , 10 );
00326
00327 gtk_frame_set_label_align( GTK_FRAME( susp_frame ) , 1. , .5 );
00328
00329 gtk_container_set_border_width( GTK_CONTAINER( susp_frame ) , 5 );
00330 gtk_container_add( GTK_CONTAINER( susp_frame ) , susp_box );
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349 gtk_box_pack_start( GTK_BOX( v_box ) , susp_frame , TRUE , TRUE , 2 );
00350 }
00351
00352 gtk_container_add( GTK_CONTAINER( frame ) , v_box );
00353 gtk_container_set_border_width( GTK_CONTAINER( frame ) , 5 );
00354
00355 return frame;
00356 }
00357
00358 static void destroy( GtkWidget* widget , gpointer data )
00359 {
00360 gtk_main_quit();
00361 }
00362
00363 void add( GtkWidget* w , gpointer data )
00364 {
00365 g_print( "We should be adding another entry after this one.\n" );
00366 }
00367
00368 int main( int argc,
00369 char *argv[] )
00370 {
00371 GtkWidget *window;
00372 GtkWidget *main_vbox;
00373 GtkWidget *menubar;
00374 GtkWidget *bathy_entry;
00375 GtkWidget *global_entry;
00376 GtkWidget *sediment_entry;
00377
00378 gtk_init (&argc, &argv);
00379
00380 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00381 g_signal_connect (G_OBJECT (window), "destroy",
00382 G_CALLBACK (destroy), NULL);
00383 gtk_window_set_title( GTK_WINDOW(window) , "sedflux 2.0" );
00384 gtk_widget_set_size_request( GTK_WIDGET(window) , 600 , 750 );
00385
00386 main_vbox = gtk_vbox_new( FALSE , 1 );
00387 gtk_container_set_border_width( GTK_CONTAINER(main_vbox) , 1 );
00388 gtk_container_add( GTK_CONTAINER(window) , main_vbox );
00389
00390 menubar = get_menubar_menu( window );
00391 bathy_entry = get_bathymetry_file ( window );
00392 global_entry = get_global_parameters ( window );
00393 sediment_entry = get_sediment ( window );
00394
00395 gtk_box_pack_start( GTK_BOX(main_vbox) , menubar , FALSE , TRUE , 0 );
00396 gtk_box_pack_start( GTK_BOX(main_vbox) , bathy_entry , FALSE , TRUE , 0 );
00397 gtk_box_pack_start( GTK_BOX(main_vbox) , global_entry , FALSE , TRUE , 0 );
00398 gtk_box_pack_start( GTK_BOX(main_vbox) , sediment_entry , FALSE , TRUE , 0 );
00399
00400 gtk_widget_show_all( window );
00401
00402 gtk_main ();
00403
00404 return 0;
00405 }
00406