| 108 | | |
| | 112 | #endif |
| | 113 | |
| | 114 | static gboolean reject_filter(const GtkFileFilterInfo * filter_info, gpointer data) |
| | 115 | { |
| | 116 | //log_info("filter: '%s'", filter_info->filename); |
| | 117 | return FALSE; |
| | 118 | } |
| | 119 | |
| | 120 | static 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 |
| | 140 | static 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 | |
| | 159 | static 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) |
| | 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 | |
| | 202 | loop: |
| | 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 |
| | 235 | void ladish_run_load_project_dialog(ladish_room_proxy_handle room) |
| | 236 | { |
| | 237 | GtkWidget * dialog; |
| | 238 | GtkWidget * browse_button; |