From 9f575fd338d8ca6590870a911a6a084956282f85 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Tue, 12 Feb 2019 10:09:46 -0200 Subject: [PATCH] Working on FT dialog components. --- src/v3270ft/activitylist.c | 2 +- src/v3270ft/dialog.c | 7 ++++--- src/v3270ft/select.c | 152 +++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------- 3 files changed, 50 insertions(+), 111 deletions(-) diff --git a/src/v3270ft/activitylist.c b/src/v3270ft/activitylist.c index 8aa2238..69c871b 100644 --- a/src/v3270ft/activitylist.c +++ b/src/v3270ft/activitylist.c @@ -347,7 +347,7 @@ _("Save queue to file"), _("Save"), GTK_FILE_CHOOSER_ACTION_SAVE, - "", + list->filename, N_("XML file"), "*.xml", NULL ); diff --git a/src/v3270ft/dialog.c b/src/v3270ft/dialog.c index a14cd3d..605f2d0 100644 --- a/src/v3270ft/dialog.c +++ b/src/v3270ft/dialog.c @@ -180,9 +180,10 @@ static void remove_clicked(GtkWidget G_GNUC_UNUSED(*button), V3270FTDialog *widg v3270_ft_settings_set_activity(widget->settings,NULL); } -static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, GtkWidget *button) +static void enable_queue_save(GtkWidget G_GNUC_UNUSED(*save), gboolean enabled, V3270FTDialog *widget) { - gtk_widget_set_sensitive(button,enabled); + debug("%s: %s",__FUNCTION__,(enabled ? "Enable" : "Disable")); + gtk_widget_set_sensitive(widget->queue.save,enabled); } static void V3270FTDialog_init(V3270FTDialog *widget) @@ -251,7 +252,6 @@ static void V3270FTDialog_init(V3270FTDialog *widget) gtk_widget_set_tooltip_markup(widget->queue.save,_("Save transfer queue")); g_signal_connect(widget->queue.save,"clicked",G_CALLBACK(save_queue_clicked),widget); gtk_widget_set_sensitive(widget->queue.save,FALSE); - g_signal_connect(widget->queue.view,"has-file",G_CALLBACK(enable_queue_save),widget->queue.save); widget->queue.saveAs = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_set_tooltip_markup(widget->queue.saveAs,_("Save transfer queue to file")); @@ -264,6 +264,7 @@ static void V3270FTDialog_init(V3270FTDialog *widget) widget->queue.view = v3270_activity_list_new(); gtk_widget_set_tooltip_markup(widget->queue.view,_("Files to transfer")); g_signal_connect(G_OBJECT(widget->queue.view),"row-activated",G_CALLBACK(activity_selected),widget); + g_signal_connect(G_OBJECT(widget->queue.view),"has-file",G_CALLBACK(enable_queue_save),widget); // Put the view inside a scrolled window. GtkWidget * scrolled = gtk_scrolled_window_new(NULL,NULL); diff --git a/src/v3270ft/select.c b/src/v3270ft/select.c index 2b43daf..8aae24f 100644 --- a/src/v3270ft/select.c +++ b/src/v3270ft/select.c @@ -37,43 +37,7 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ -/* -#if defined(_WIN32) - -struct file { - OPENFILENAME ofn; - gboolean enabled; - char szName[260]; // buffer for file name - GtkFileChooserAction action; - BOOL ok; -}; - -static gpointer select_file(struct file *fl) { - - - switch(fl->action) { - case GTK_FILE_CHOOSER_ACTION_SAVE: // Receber arquivo - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646839(v=vs.85).aspx - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#open_file - fl->ofn.Flags = OFN_OVERWRITEPROMPT | OFN_CREATEPROMPT | OFN_HIDEREADONLY; - fl->ok = GetSaveFileName(&fl->ofn); - break; - - case GTK_FILE_CHOOSER_ACTION_OPEN: // Enviar arquivo - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms646928(v=vs.85).aspx - fl->ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; - fl->ok = GetOpenFileName(&fl->ofn); - break; - } - - fl->enabled = FALSE; - - return 0; -} -#endif // _WIN32 -*/ - -gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, G_GNUC_UNUSED const gchar *filename, G_GNUC_UNUSED const gchar *filter, ...) { +gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar *button, GtkFileChooserAction action, const gchar *filename, G_GNUC_UNUSED const gchar *filter, ...) { gchar *rc = NULL; @@ -91,84 +55,37 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * ); - if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) { - rc = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native))); - } - - g_object_unref(native); - -#elif defined(_WIN32) - - GThread * thd; - struct file fl; - GdkWindow * win = gtk_widget_get_window(GTK_WIDGET(dialog)); - - gtk_widget_set_sensitive(GTK_WIDGET(dialog),FALSE); - - memset(&fl,0,sizeof(fl)); - fl.ofn.lStructSize = sizeof(fl.ofn); - fl.ofn.hwndOwner = GDK_WINDOW_HWND(win); - fl.ofn.lpstrFile = fl.szName; - - fl.ofn.lpstrTitle = title; - - // Set lpstrFile[0] to '\0' so that GetOpenFileName does not - // use the contents of szFile to initialize itself. - fl.ofn.lpstrFile[0] = '\0'; - - fl.ofn.nMaxFile = sizeof(fl.szName); - - // Monta lista de arquivos. - va_list args; - size_t ix = 0; - - fl.ofn.lpstrFilter = (char *) g_malloc0(4096); + // Setup filename + if(filename && *filename) + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(native),filename); + // Setup filters + va_list args; va_start (args, filter); - while(filter) { - - filter = gettext(filter); - size_t sz = strlen(filter)+1; - - if(ix+sz > 4095) + while(filter) + { + const gchar * name = va_arg(args, const gchar *); + if(!name) break; - debug("%s",filter); - - memcpy(((char *) fl.ofn.lpstrFilter)+ix,filter,sz); - ix += sz; - filter = va_arg(args, const char *); - } - va_end (args); - - debug("%s",fl.ofn.lpstrFilter); - - fl.ofn.nFilterIndex = 1; - fl.ofn.lpstrInitialDir = NULL; - fl.ofn.nMaxFileTitle = 0; - - // Guarda o valor atual - if(filename) - strncpy(fl.szName,filename,fl.ofn.nMaxFile); - - fl.action = action; + const gchar * pattern = va_arg(args, const gchar *); + if(!pattern) + break; - thd = g_thread_new("GetFileName",(GThreadFunc) select_file, &fl); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter,name); + gtk_file_filter_add_pattern(filter, pattern); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter); - fl.enabled = TRUE; - while(fl.enabled) { - g_main_context_iteration(NULL,TRUE); } + va_end(args); - g_thread_unref(thd); - - if(fl.ok) { - rc = g_strdup(fl.szName); + // Run dialog + if(gtk_native_dialog_run(GTK_NATIVE_DIALOG (native)) == GTK_RESPONSE_ACCEPT) { + rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(native)); } - g_free( ((char *) fl.ofn.lpstrFilter) ); - gtk_widget_set_sensitive(GTK_WIDGET(dialog),TRUE); - + g_object_unref(native); #else @@ -185,6 +102,27 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * if(filename && *filename) gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(chooser),filename); + // Setup filters + va_list args; + va_start (args, filter); + while(filter) + { + const gchar * name = va_arg(args, const gchar *); + if(!name) + break; + + const gchar * pattern = va_arg(args, const gchar *); + if(!pattern) + break; + + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter,name); + gtk_file_filter_add_pattern(filter, pattern); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(native), filter); + + } + va_end(args); + if(gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { rc = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); } @@ -192,9 +130,9 @@ gchar * v3270ft_select_file(GtkWidget *dialog, const gchar *title, const gchar * gtk_widget_destroy(chooser); -#endif // WIN32 +#endif // GTK 3.20 - debug("%s=%p",__FUNCTION__,rc); + debug("%s=%s",__FUNCTION__,rc); return rc; -- libgit2 0.21.2