#include "libublsettingsui-gtk3.h" void on_file_chooser_accept(GtkWidget *, filechooser_window *window){ switch (gtk_file_chooser_get_action(GTK_FILE_CHOOSER(window->MainFileChooser))){ case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: case GTK_FILE_CHOOSER_ACTION_SAVE: window->responce=GTK_RESPONSE_APPLY; break; case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: case GTK_FILE_CHOOSER_ACTION_OPEN: window->responce = GTK_RESPONSE_ACCEPT; break; } gtk_widget_destroy(window->Window); gtk_main_quit(); } void on_file_chooser_cancel(GtkWidget *, filechooser_window *window){ window->responce=GTK_RESPONSE_CANCEL; gtk_widget_destroy(window->Window); gtk_main_quit(); } void on_file_chooser_selected(GtkWidget *self, filechooser_window *window){ if (window->last_any_selection) free(window->last_any_selection); if (window->last_success_selection) free(window->last_success_selection); GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(window->MainFileChooser)); config_str paths_all = NULL; config_str paths_success = NULL; int all_size=0; int success_size=0; GtkFileChooserAction action = gtk_file_chooser_get_action(GTK_FILE_CHOOSER(window->MainFileChooser)); for (int i=0;iChooseFolderCheck))&&yon_file_is_directory(data)) || (action == GTK_FILE_CHOOSER_ACTION_OPEN&&!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck))&&!yon_file_is_directory(data)) || (action == GTK_FILE_CHOOSER_ACTION_SAVE&&!yon_file_is_directory(data)) || (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER&&yon_file_is_directory(data)) ){ yon_char_parsed_add_or_create_if_exists(paths_success,&success_size,data); } yon_char_parsed_add_or_create_if_exists(paths_all,&all_size,data); } char *full_success = yon_char_parsed_to_string(paths_success,success_size,","); char *full_all = yon_char_parsed_to_string(paths_all,all_size,","); window->last_any_selection = yon_char_is_empty(full_all)?NULL:full_all; window->last_success_selection = yon_char_is_empty(full_success)?NULL:full_success; if (all_size) yon_char_parsed_free(paths_all,all_size); if (success_size) yon_char_parsed_free(paths_success,success_size); } filechooser_window *__yon_filechooser_window = NULL; void yon_file_chooser_set_button_label(char *label){ if (__yon_filechooser_window){ gtk_button_set_label(GTK_BUTTON(__yon_filechooser_window->SaveButton),label); } } void on_file_chooser_exit(GtkWidget *, filechooser_window *){ __yon_filechooser_window = NULL; } filechooser_window *yon_file_chooser_window_new(GtkFileChooserAction action){ if (!__yon_filechooser_window){ filechooser_window *window = malloc(sizeof(filechooser_window)); __yon_filechooser_window = window; GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_filechooser); window->Window = yon_gtk_builder_get_widget(builder,"Window"); window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); window->HeaderTopic = yon_gtk_builder_get_widget(builder,"HeaderTopic"); window->MainFileChooser = yon_gtk_builder_get_widget(builder,"MainFileChooser"); window->SaveButton = yon_gtk_builder_get_widget(builder,"SaveButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->ChooseFolderCheck = yon_gtk_builder_get_widget(builder,"ChooseFolderCheck"); window->last_any_selection=NULL; window->last_success_selection=NULL; g_signal_connect(G_OBJECT(window->MainFileChooser),"selection-changed",G_CALLBACK(on_file_chooser_selected),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_file_chooser_cancel),window); g_signal_connect(G_OBJECT(window->SaveButton),"clicked",G_CALLBACK(on_file_chooser_accept),window); g_signal_connect(G_OBJECT(window->Window),"destroy",G_CALLBACK(on_file_chooser_exit),window); gtk_file_chooser_set_action(GTK_FILE_CHOOSER(window->MainFileChooser),action); switch(action){ case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: gtk_widget_hide(window->ChooseFolderCheck); gtk_button_set_label(GTK_BUTTON(window->SaveButton),yon_char_get_localised_from_lib(CREATE_FOLDER_LABEL)); break; case GTK_FILE_CHOOSER_ACTION_OPEN: gtk_widget_hide(window->ChooseFolderCheck); gtk_button_set_label(GTK_BUTTON(window->SaveButton),yon_char_get_localised_from_lib(OPEN_LABEL)); break; case GTK_FILE_CHOOSER_ACTION_SAVE: gtk_widget_hide(window->ChooseFolderCheck); gtk_button_set_label(GTK_BUTTON(window->SaveButton),yon_char_get_localised_from_lib(SAVE_LABEL)); break; case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->ChooseFolderCheck),1); gtk_widget_hide(window->ChooseFolderCheck); gtk_button_set_label(GTK_BUTTON(window->SaveButton),yon_char_get_localised_from_lib(SELECT_FOLDER_LABEL)); break; } g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); return window; } else { return __yon_filechooser_window; } } GtkResponseType yon_file_chooser_start(filechooser_window *window){ gtk_widget_show(window->Window); gtk_main(); return window->responce; }