ui/gtk/window.c

branch
newapi
changeset 279
2ad83650d797
parent 278
a8faf8757450
equal deleted inserted replaced
278:a8faf8757450 279:2ad83650d797
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

mercurial