ui/gtk/window.c

branch
newapi
changeset 314
d96ba820083a
parent 311
450a813dc2a5
child 315
144c2b4683cb
equal deleted inserted replaced
313:b679cc6059ab 314:d96ba820083a
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);

mercurial