257 |
257 |
258 WINDOW_SHOW(GTK_WIDGET(dialog_w)); |
258 WINDOW_SHOW(GTK_WIDGET(dialog_w)); |
259 } |
259 } |
260 |
260 |
261 |
261 |
262 #if GTK_MAJOR_VERSION >= 4 |
262 #if GTK_MAJOR_VERSION >= 40 |
263 static void ui_gtkfilechooser(UiObject *obj, GtkFileChooserAction action, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
263 static void ui_gtkfilechooser(UiObject *obj, GtkFileChooserAction action, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
264 // TODO |
264 // TODO |
265 } |
265 } |
266 #else |
266 #else |
|
267 |
|
268 |
|
269 |
|
270 static void filechooser_response(GtkDialog* self, gint response_id, UiEventData *data) { |
|
271 UiEvent evt; |
|
272 evt.obj = data->obj; |
|
273 evt.document = evt.obj->ctx->document; |
|
274 evt.window = evt.obj->window; |
|
275 evt.intval = 0; |
|
276 |
|
277 UiFileList flist; |
|
278 flist.files = NULL; |
|
279 flist.nfiles = 0; |
|
280 evt.eventdata = &flist; |
|
281 |
|
282 if(response_id == GTK_RESPONSE_ACCEPT) { |
|
283 #if GTK_CHECK_VERSION(4, 0, 0) |
|
284 GListModel *selection = gtk_file_chooser_get_files(GTK_FILE_CHOOSER(self)); |
|
285 flist.nfiles = g_list_model_get_n_items(selection); |
|
286 flist.files = calloc(flist.nfiles, sizeof(char*)); |
|
287 for(int i=0;i<flist.nfiles;i++) { |
|
288 GFile *file = g_list_model_get_item(selection, i); |
|
289 char *path = g_file_get_path(file); |
|
290 flist.files[i] = strdup(path ? path : ""); |
|
291 g_object_unref(file); |
|
292 } |
|
293 g_object_unref(selection); |
|
294 #else |
|
295 GSList *selection = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(self)); |
|
296 flist.nfiles = g_slist_length(selection); |
|
297 flist.files = calloc(flist.nfiles, sizeof(char*)); |
|
298 int i = 0; |
|
299 while(selection) { |
|
300 char *file = selection->data; |
|
301 flist.files[i] = strdup(file); |
|
302 g_free(file); |
|
303 selection = selection->next; |
|
304 i++; |
|
305 } |
|
306 g_slist_free(selection); |
|
307 #endif |
|
308 } |
|
309 |
|
310 |
|
311 if(data->callback) { |
|
312 data->callback(&evt, data->userdata); |
|
313 } |
|
314 |
|
315 for(int i=0;i<flist.nfiles;i++) { |
|
316 free(flist.files[i]); |
|
317 } |
|
318 |
|
319 WINDOW_DESTROY(GTK_WIDGET(self)); |
|
320 } |
|
321 |
267 static void ui_gtkfilechooser(UiObject *obj, GtkFileChooserAction action, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
322 static void ui_gtkfilechooser(UiObject *obj, GtkFileChooserAction action, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
268 char *button; |
323 char *button; |
269 char *title; |
324 char *title; |
270 |
325 |
271 GtkWidget *dialog; |
326 GtkWidget *dialog; |
303 |
358 |
304 if((mode & UI_FILEDIALOG_SELECT_MULTI) == UI_FILEDIALOG_SELECT_MULTI) { |
359 if((mode & UI_FILEDIALOG_SELECT_MULTI) == UI_FILEDIALOG_SELECT_MULTI) { |
305 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); |
360 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); |
306 } |
361 } |
307 |
362 |
|
363 UiEventData *event = malloc(sizeof(UiEventData)); |
|
364 event->obj = obj; |
|
365 event->userdata = cbdata; |
|
366 event->callback = file_selected_callback; |
|
367 event->value = 0; |
|
368 event->customdata = NULL; |
|
369 |
|
370 g_signal_connect( |
|
371 dialog, |
|
372 "response", |
|
373 G_CALLBACK(filechooser_response), |
|
374 event); |
|
375 g_signal_connect( |
|
376 dialog, |
|
377 "destroy", |
|
378 G_CALLBACK(ui_destroy_userdata), |
|
379 event); |
|
380 |
|
381 |
308 UiEvent evt; |
382 UiEvent evt; |
309 evt.obj = obj; |
383 evt.obj = obj; |
310 evt.document = evt.obj->ctx->document; |
384 evt.document = evt.obj->ctx->document; |
311 evt.window = evt.obj->window; |
385 evt.window = evt.obj->window; |
312 evt.intval = 0; |
386 evt.intval = 0; |
314 UiFileList flist; |
388 UiFileList flist; |
315 flist.files = NULL; |
389 flist.files = NULL; |
316 flist.nfiles = 0; |
390 flist.nfiles = 0; |
317 evt.eventdata = &flist; |
391 evt.eventdata = &flist; |
318 |
392 |
319 int result = gtk_dialog_run(GTK_DIALOG (dialog)); |
393 gtk_widget_show(dialog); |
320 GSList *selection = NULL; |
|
321 if(result == GTK_RESPONSE_ACCEPT) { |
|
322 selection = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); |
|
323 flist.nfiles = g_slist_length(selection); |
|
324 flist.files = calloc(flist.nfiles, sizeof(char*)); |
|
325 int i = 0; |
|
326 while(selection) { |
|
327 flist.files[i] = selection->data; |
|
328 selection = selection->next; |
|
329 i++; |
|
330 } |
|
331 } |
|
332 |
|
333 if(file_selected_callback) { |
|
334 file_selected_callback(&evt, cbdata); |
|
335 } |
|
336 |
|
337 for(int i=0;i<flist.nfiles;i++) { |
|
338 g_free(flist.files[i]); |
|
339 } |
|
340 free(flist.files); |
|
341 g_slist_free(selection); |
|
342 |
|
343 gtk_widget_destroy(dialog); |
|
344 } |
394 } |
345 #endif |
395 #endif |
346 |
396 |
347 void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
397 void ui_openfiledialog(UiObject *obj, unsigned int mode, ui_callback file_selected_callback, void *cbdata) { |
348 ui_gtkfilechooser(obj, GTK_FILE_CHOOSER_ACTION_OPEN, mode, file_selected_callback, cbdata); |
398 ui_gtkfilechooser(obj, GTK_FILE_CHOOSER_ACTION_OPEN, mode, file_selected_callback, cbdata); |