From 5a9d0cdaa799932d393b29118055fd2fb1a65b8a Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Wed, 22 Jul 2020 15:32:38 -0300 Subject: [PATCH] Updating popup engine. --- src/dialogs/popups.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------ 1 file changed, 116 insertions(+), 60 deletions(-) diff --git a/src/dialogs/popups.c b/src/dialogs/popups.c index db4cec7..0246c65 100644 --- a/src/dialogs/popups.c +++ b/src/dialogs/popups.c @@ -32,66 +32,134 @@ #include #include #include + #include /*--[ Implement ]------------------------------------------------------------------------------------*/ - void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type , const gchar *title, const gchar *message, const gchar *text) { - GtkWidget * dialog; - GtkWidget * toplevel = NULL; - GtkMessageType msgtype = GTK_MESSAGE_WARNING; - GtkButtonsType buttons = GTK_BUTTONS_OK; + GtkResponseType v3270_show_popup(GtkWidget *widget, const LIB3270_POPUP *popup, gboolean wait) { - if(widget && GTK_IS_WIDGET(widget)) - toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget)); + g_return_val_if_fail(GTK_IS_WIDGET(widget),GTK_RESPONSE_NONE); - if(!GTK_IS_WINDOW(toplevel)) - toplevel = NULL; + // Popup settings. + static const struct _settings { + GtkMessageType type; + GtkButtonsType buttons; + const gchar *title; + } settings[LIB3270_NOTIFY_USER] = { - if(type == LIB3270_NOTIFY_CRITICAL) { - msgtype = GTK_MESSAGE_ERROR; - buttons = GTK_BUTTONS_CLOSE; - } + // LIB3270_NOTIFY_INFO - Simple information dialog. + { + .type = GTK_MESSAGE_INFO, + .buttons = GTK_BUTTONS_OK, + .title = N_("Information") - if(!title) - title = _( "Error" ); + }, - if(message) { - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",message); - if(text && *text) - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",text); - } else if(text && *text) { - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",text); - } else { - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",title); - } + // LIB3270_NOTIFY_WARNING - Warning message. + { + .type = GTK_MESSAGE_WARNING, + .buttons = GTK_BUTTONS_OK, + .title = N_("Warning") - gtk_window_set_title(GTK_WINDOW(dialog),title); - gtk_widget_show_all(dialog); - gtk_dialog_run(GTK_DIALOG (dialog)); - gtk_widget_destroy(dialog); + }, - } + // LIB3270_NOTIFY_ERROR - Error message. + { + .type = GTK_MESSAGE_ERROR, + .buttons = GTK_BUTTONS_OK, + .title = N_("Error") - void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body) { + }, + + // LIB3270_NOTIFY_CRITICAL - Critical error, user can abort application. + { + .type = GTK_MESSAGE_ERROR, + .buttons = GTK_BUTTONS_CLOSE, + .title = N_("Critical Error") + + }, + + // LIB3270_NOTIFY_SECURE - Secure host dialog. + { + .type = GTK_MESSAGE_OTHER, + .buttons = GTK_BUTTONS_OK, + .title = N_("Security alert") + + } + + + }; + + // Create dialog GtkWidget * dialog = - gtk_message_dialog_new_with_markup( - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s",summary - ); + gtk_message_dialog_new_with_markup( + GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + settings[popup->type].type, + settings[popup->type].buttons, + "%s",popup->summary + ); + + if(popup->body) { + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",popup->body); + } + + if(popup->title) { + gtk_window_set_title(GTK_WINDOW(dialog),popup->title); + } else { + gtk_window_set_title(GTK_WINDOW(dialog),g_dgettext(GETTEXT_PACKAGE,settings[popup->type].title)); + } + + + if(wait) { - gtk_window_set_title(GTK_WINDOW(dialog), (title ? title : _("Error"))); + // Wait for response. + gtk_widget_show_all(dialog); + gint rc = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + return rc; - if(body) - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",body); + } + // Unnamed dialog, no need for wait. g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); gtk_widget_show_all(dialog); + return GTK_RESPONSE_NONE; + + } + + void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type , const gchar *title, const gchar *message, const gchar *text) { + + LIB3270_POPUP popup = { + .type = type, + .body = text + }; + + if(message) { + popup.summary = message; + popup.title = title; + } else { + popup.summary = title; + } + + v3270_show_popup(widget, &popup, FALSE); + + } + + void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body) { + + LIB3270_POPUP popup = { + .type = LIB3270_NOTIFY_ERROR, + .title = title, + .summary = summary, + .body = body + }; + + v3270_show_popup(widget, &popup, FALSE); + } void v3270_popup_gerror(GtkWidget *widget, GError *error, const gchar *title, const gchar *fmt, ...) { @@ -99,29 +167,17 @@ // Format message. va_list arg_ptr; va_start(arg_ptr, fmt); - g_autofree gchar *text = g_strdup_vprintf(fmt,arg_ptr); + g_autofree gchar *summary = g_strdup_vprintf(fmt,arg_ptr); va_end(arg_ptr); - GtkWidget *dialog = gtk_message_dialog_new( - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, - "%s",text - ); + LIB3270_POPUP popup = { + .type = LIB3270_NOTIFY_ERROR, + .title = title, + .summary = summary, + .body = error->message + }; - if(title) - gtk_window_set_title(GTK_WINDOW(dialog), title); - else - gtk_window_set_title(GTK_WINDOW(dialog), (title ? title : _("Operation failed"))); - - if(error) - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); - - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); - - gtk_widget_show_all(dialog); + v3270_show_popup(widget, &popup, FALSE); } -- libgit2 0.21.2