/Users/huttone/Devel/sedflux-new/sedflux/trunk/ew/sed/sed_ui.c

Go to the documentation of this file.
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       GtkWidget* about_dialog = gtk_about_dialog_new();
00054 
00055       gtk_about_dialog_set_name   ( about_dialog , "Sedflux" );
00056       gtk_about_dialog_set_version( about_dialog , "2.0"     );
00057       gtk_about_dialog_set_authors( about_dialog , "Eric Hutton" );
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          g_signal_connect_object( G_OBJECT( choose_button ) ,
00135                                   "clicked" ,
00136                                   G_CALLBACK(create_file_selection) ,
00137                                   entry , G_CONNECT_AFTER|G_CONNECT_SWAPPED );
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    //GtkWidget* combo_box = GTK_WIDGET( user_data );
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    // Destination list
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          GList* this_item = items;
00219 
00220          for ( ; this_item ; this_item = this_item->next  )
00221          {
00222             gtk_list_store_append( dest_list , &iter );
00223             gtk_list_store_set( dest_list , &iter , 0 , this_item->data , -1 );
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    // left/right arrows
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    // Source list
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    // Create a frame to choose bedload.
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    // Create a frame to choose suspended load.
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          GtkWidget* select_box = gtk_hbox_new( FALSE , 2 );
00335          GtkWidget* susp_select = gtk_combo_new();
00336          GtkWidget* add_button = gtk_button_new_from_stock( GTK_STOCK_ADD );
00337 
00338          g_signal_connect( G_OBJECT( add_button ) , "clicked" , G_CALLBACK(add_to_list) , susp_select );
00339 
00340          gtk_combo_set_popdown_strings( GTK_COMBO(susp_select) , sediment_items );
00341 
00342          gtk_box_pack_start( GTK_BOX( select_box ) , susp_select , TRUE , TRUE , 2 );
00343          gtk_box_pack_start( GTK_BOX( select_box ) , add_button  , TRUE , TRUE , 2 );
00344 
00345          gtk_box_pack_start( GTK_BOX( susp_v_box ) , select_box , TRUE , TRUE , 2 );
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 

Generated on Fri Jan 4 18:04:15 2008 for sedflux by  doxygen 1.5.2