223 event); |
223 event); |
224 |
224 |
225 gtk_widget_show_all(GTK_WIDGET(dialog_w)); |
225 gtk_widget_show_all(GTK_WIDGET(dialog_w)); |
226 } |
226 } |
227 |
227 |
228 static char* ui_gtkfilechooser(UiObject *obj, GtkFileChooserAction action) { |
228 static void ui_gtkfilechooser(UiObject *obj, GtkFileChooserAction action, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
229 char *button; |
229 char *button; |
230 char *title; |
230 char *title; |
231 |
231 |
232 if(action == GTK_FILE_CHOOSER_ACTION_OPEN) { |
232 GtkWidget *dialog; |
233 button = GTK_STOCK_OPEN; |
233 if((mode & UI_FILEDIALOG_SELECT_FOLDER) == UI_FILEDIALOG_SELECT_FOLDER) { |
234 title = "Datei öffnen..."; |
234 dialog = gtk_file_chooser_dialog_new ( |
|
235 "Open Folder", |
|
236 GTK_WINDOW(obj->widget), |
|
237 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, |
|
238 "Cancel", |
|
239 GTK_RESPONSE_CANCEL, |
|
240 "Select Folder", |
|
241 GTK_RESPONSE_ACCEPT, |
|
242 NULL); |
|
243 } else if(action == GTK_FILE_CHOOSER_ACTION_OPEN) { |
|
244 dialog = gtk_file_chooser_dialog_new ( |
|
245 "Select Folder", |
|
246 GTK_WINDOW(obj->widget), |
|
247 action, |
|
248 "Cancel", |
|
249 GTK_RESPONSE_CANCEL, |
|
250 "Open File", |
|
251 GTK_RESPONSE_ACCEPT, |
|
252 NULL); |
235 } else { |
253 } else { |
236 button = GTK_STOCK_SAVE; |
254 dialog = gtk_file_chooser_dialog_new ( |
237 title = "Datei speichern..."; |
255 "Save File", |
238 } |
256 GTK_WINDOW(obj->widget), |
239 |
257 action, |
240 GtkWidget *dialog = gtk_file_chooser_dialog_new( |
258 "Cancel", |
241 title, |
259 GTK_RESPONSE_CANCEL, |
242 GTK_WINDOW(obj->widget), |
260 "Save File", |
243 action, |
261 GTK_RESPONSE_ACCEPT, |
244 GTK_STOCK_CANCEL, |
262 NULL); |
245 GTK_RESPONSE_CANCEL, |
263 } |
246 button, |
264 |
247 GTK_RESPONSE_ACCEPT, |
265 if((mode & UI_FILEDIALOG_SELECT_MULTI) == UI_FILEDIALOG_SELECT_MULTI) { |
248 NULL); |
266 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); |
249 if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { |
267 } |
250 char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); |
268 |
251 gtk_widget_destroy(dialog); |
269 UiEvent evt; |
252 char *copy = strdup(file); |
270 evt.obj = obj; |
253 g_free(file); |
271 evt.document = evt.obj->ctx->document; |
254 return copy; |
272 evt.window = evt.obj->window; |
255 } else { |
273 evt.intval = 0; |
256 gtk_widget_destroy(dialog); |
274 |
257 return NULL; |
275 UiFileList flist; |
258 } |
276 flist.files = NULL; |
259 } |
277 flist.nfiles = 0; |
260 |
278 evt.eventdata = &flist; |
261 |
279 |
|
280 int result = gtk_dialog_run(GTK_DIALOG (dialog)); |
|
281 GSList *selection = NULL; |
|
282 if(result == GTK_RESPONSE_ACCEPT) { |
|
283 selection = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); |
|
284 flist.nfiles = g_slist_length(selection); |
|
285 flist.files = calloc(flist.nfiles, sizeof(char*)); |
|
286 int i = 0; |
|
287 while(selection) { |
|
288 flist.files[i] = selection->data; |
|
289 selection = selection->next; |
|
290 i++; |
|
291 } |
|
292 } |
|
293 |
|
294 if(file_selected_callback) { |
|
295 file_selected_callback(&evt, cbdata); |
|
296 } |
|
297 |
|
298 for(int i=0;i<flist.nfiles;i++) { |
|
299 g_free(flist.files[i]); |
|
300 } |
|
301 free(flist.files); |
|
302 g_slist_free(selection); |
|
303 |
|
304 gtk_widget_destroy(dialog); |
|
305 } |
|
306 |
|
307 void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
|
308 ui_gtkfilechooser(obj, GTK_FILE_CHOOSER_ACTION_OPEN, mode, file_selected_callback, cbdata); |
|
309 } |
|
310 |
|
311 void ui_savefiledialog(UiObject *obj, const char *name, ui_callback file_selected_callback, void *cbdata) { |
|
312 ui_gtkfilechooser(obj, GTK_FILE_CHOOSER_ACTION_SAVE, 0, file_selected_callback, cbdata); |
|
313 } |
|
314 |