Changeset f0c53adbc08df9a50e48ce3ef71045fdeb951b3f

Show
Ignore:
Timestamp:
09/05/10 07:41:43 (3 years ago)
Author:
Nedko Arnaudov <nedko@…>
Children:
1719aada4cca026605e498019f069b0d7de3603a
Parents:
f802bd0402a3f10b7913dda0840350f9d9c93278
git-committer:
Nedko Arnaudov <nedko@arnaudov.name> / 2010-09-05T07:41:43Z+0300
Message:

gui: File chooser dialog for loading projects

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • gui/load_project_dialog.c

    r997208c rf0c53ad  
    2525 */ 
    2626 
     27#include <sys/stat.h> 
     28 
    2729#include "load_project_dialog.h" 
    2830#include "gtk_builder.h" 
     31#include "../catdup.h" 
    2932 
    3033enum 
     
    9699#endif 
    97100 
     101#if 0 
    98102static int mtime_sorter(GtkTreeModel * model, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data) 
    99103{ 
     
    106110  return ta > tb ? -1 : (ta == tb ? 0 : 1); 
    107111} 
    108  
     112#endif 
     113 
     114static gboolean reject_filter(const GtkFileFilterInfo * filter_info, gpointer data) 
     115{ 
     116  //log_info("filter: '%s'", filter_info->filename); 
     117  return FALSE; 
     118} 
     119 
     120static bool is_project_dir(const char * dir) 
     121{ 
     122  char * file; 
     123  struct stat st; 
     124  int ret; 
     125 
     126  file = catdup(dir, "/ladish-project.xml"); 
     127  if (file == NULL) 
     128  { 
     129    log_error("catdup() failed to compose project file path"); 
     130    return false; 
     131  } 
     132 
     133  ret = stat(file, &st); 
     134  free(file); 
     135 
     136  return ret == 0; 
     137} 
     138 
     139#if 0 
     140static void on_dir_select(GtkWidget * widget, gpointer data) 
     141{ 
     142  char * dir; 
     143  gboolean sensitive; 
     144 
     145  //log_info("selection-changed signal"); 
     146 
     147  dir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data)); 
     148  sensitive = FALSE; 
     149  if (dir != NULL) 
     150  { 
     151    sensitive = is_project_dir(dir); 
     152    g_free(dir); 
     153  } 
     154 
     155  gtk_widget_set_sensitive(gtk_dialog_get_widget_for_response(GTK_DIALOG(data), GTK_RESPONSE_ACCEPT), sensitive); 
     156} 
     157#endif 
     158 
     159static void dir_changed(GtkWidget * widget, gpointer data) 
     160{ 
     161  char * dir; 
     162 
     163  //log_info("current-folder-changed signal"); 
     164 
     165  dir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(data)); 
     166  if (dir == NULL) 
     167  { 
     168    return; 
     169  } 
     170 
     171  //log_info("dir changed: '%s'", dir); 
     172 
     173  if (is_project_dir(dir)) 
     174  { 
     175    gtk_widget_activate(gtk_dialog_get_widget_for_response(GTK_DIALOG(data), GTK_RESPONSE_ACCEPT)); 
     176  } 
     177} 
     178 
     179//static void on_browse(GtkWidget * widget, gpointer data) 
    109180void ladish_run_load_project_dialog(ladish_room_proxy_handle room) 
    110181{ 
     182  GtkFileFilter * filter; 
    111183  GtkWidget * dialog; 
     184  char * filename; 
     185 
     186  dialog = gtk_file_chooser_dialog_new( 
     187    "Load project", 
     188    NULL, 
     189    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, 
     190    GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, 
     191    GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, 
     192    NULL); 
     193 
     194  gtk_file_chooser_set_create_folders(GTK_FILE_CHOOSER(dialog), FALSE); 
     195 
     196  filter = gtk_file_filter_new(); 
     197  gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME, reject_filter, dialog, NULL); /* reject all files */ 
     198  gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); 
     199  //g_signal_connect(G_OBJECT(dialog), "selection-changed", G_CALLBACK(on_dir_select), dialog); 
     200  g_signal_connect(G_OBJECT(dialog), "current-folder-changed", G_CALLBACK(dir_changed), dialog); 
     201 
     202loop: 
     203  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) 
     204  { 
     205    filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); 
     206 
     207    if (!is_project_dir(filename)) 
     208    { 
     209      GtkWidget * dialog; 
     210      dialog = get_gtk_builder_widget("error_dialog"); 
     211      gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(dialog), "<b><big>Not a project dir</big></b>"); 
     212      gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog), "%s", filename); 
     213      gtk_widget_show(dialog); 
     214      gtk_dialog_run(GTK_DIALOG(dialog)); 
     215      gtk_widget_hide(dialog); 
     216      goto loop; 
     217    } 
     218 
     219    //gtk_entry_set_text(GTK_ENTRY(get_gtk_builder_widget("load_project_path_entry")), filename); 
     220    log_info("Loading project from '%s'", filename); 
     221    if (!ladish_room_proxy_load_project(room, filename)) 
     222    { 
     223      log_error("ladish_room_proxy_load_project() failed."); 
     224    } 
     225 
     226    g_free(filename); 
     227 
     228    //gtk_widget_activate(gtk_dialog_get_widget_for_response(GTK_DIALOG(data), GTK_RESPONSE_OK)); 
     229  } 
     230  gtk_widget_destroy(dialog); 
     231  return; 
     232} 
     233 
     234#if 0 
     235void ladish_run_load_project_dialog(ladish_room_proxy_handle room) 
     236{ 
     237  GtkWidget * dialog; 
     238  GtkWidget * browse_button; 
    112239  GtkTreeView * view; 
    113240  GtkResponseType response; 
     
    120247 
    121248  dialog = get_gtk_builder_widget("load_project_dialog"); 
     249  browse_button = get_gtk_builder_widget("load_project_path_browse_button"); 
    122250  path = GTK_ENTRY(get_gtk_builder_widget("load_project_path_entry")); 
    123251  view = GTK_TREE_VIEW(get_gtk_builder_widget("loadable_project_list")); 
     
    166294  /* _widget->signal_key_press_event().connect(sigc::mem_fun(*this, &LoadProjectDialog::on_key_press_event), false); */ 
    167295 
     296  g_signal_connect(G_OBJECT(browse_button), "clicked", G_CALLBACK(on_browse), dialog); 
    168297 
    169298  gtk_entry_set_text(path, ""); 
     
    181310  } 
    182311} 
     312#endif