From 7df549508ec9374b48922ff5ed401cd93ce6a657 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Thu, 19 Dec 2019 16:34:20 -0300 Subject: [PATCH] Implementing toolbar edit. --- pw3270.cbp | 4 ++++ src/include/pw3270.h | 12 +++++++----- src/include/pw3270/settings.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/application/actions/preferences.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- src/objects/toolbar/settings.c | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 272 insertions(+), 32 deletions(-) create mode 100644 src/include/pw3270/settings.h create mode 100644 src/objects/toolbar/settings.c diff --git a/pw3270.cbp b/pw3270.cbp index f0cd30f..53b3029 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -46,6 +46,7 @@ + @@ -121,6 +122,9 @@ + + diff --git a/src/include/pw3270.h b/src/include/pw3270.h index 9507141..7ecbe40 100644 --- a/src/include/pw3270.h +++ b/src/include/pw3270.h @@ -55,12 +55,14 @@ void pw3270_load_placeholders(GtkBuilder * builder); // Application settings widget - typedef struct _Pw3270SettingWidget Pw3270SettingsWidget; + typedef struct _Pw3270SettingsPage Pw3270SettingsPage; - struct _Pw3270SettingWidget { - GtkWidget * widget; - void (*apply)(Pw3270SettingsWidget *, GtkApplication *, GSettings *); - void (*revert)(Pw3270SettingsWidget *, GtkApplication *, GSettings *); + struct _Pw3270SettingsPage { + GtkWidget * widget; ///< @brief Settings widget. + const gchar * label; ///< @brief Page lagel. + const gchar * title; ///< @brief Page title. + void (*load)(Pw3270SettingsPage *, GtkApplication *, GSettings *); + void (*apply)(Pw3270SettingsPage *, GtkApplication *, GSettings *); }; G_END_DECLS diff --git a/src/include/pw3270/settings.h b/src/include/pw3270/settings.h new file mode 100644 index 0000000..d01ea78 --- /dev/null +++ b/src/include/pw3270/settings.h @@ -0,0 +1,48 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +/** + * @brief Declares the pw3270 Application Settings widget. + * + */ + +#ifndef PW3270_SETTINGS_H_INCLUDED + + #define PW3270_SETTINGS_H_INCLUDED + + #include + #include + + G_BEGIN_DECLS + + Pw3270SettingsPage * pw3270_toolbar_settings_new(); + + G_END_DECLS + +#endif // PW3270_SETTINGS_H_INCLUDED diff --git a/src/objects/application/actions/preferences.c b/src/objects/application/actions/preferences.c index 5ddc0f1..aa1bffe 100644 --- a/src/objects/application/actions/preferences.c +++ b/src/objects/application/actions/preferences.c @@ -30,14 +30,18 @@ #include "../private.h" #include #include + #include typedef struct _Pw3270SettingsDialog { - GtkApplication * application; + GApplication * application; GSimpleAction * action; + GtkDialog * dialog; + GtkNotebook * notebook; GSList * pages; } Pw3270SettingsDialog; static void on_destroy(GtkWidget *dialog, Pw3270SettingsDialog *settings) { + settings->dialog = NULL; g_slist_free_full(settings->pages,g_free); g_free(settings); g_simple_action_set_enabled(settings->action,TRUE); @@ -45,28 +49,21 @@ void on_response(GtkDialog *dialog, gint response_id, Pw3270SettingsDialog * settings) { - GSList * page; - GSettings *hSettings = pw3270_application_get_settings(settings->application); - - switch(response_id) { - case GTK_RESPONSE_CANCEL: - g_message("Reverting application settings"); - for(page = settings->pages;page;page = page->next) { - Pw3270SettingsWidget * widget = (Pw3270SettingsWidget *) page->data; - widget->revert(widget,settings->application,hSettings); - } - break; + if(response_id== GTK_RESPONSE_APPLY) { - case GTK_RESPONSE_APPLY: g_message("Aplying application settings"); + + GSList * page; for(page = settings->pages;page;page = page->next) { - Pw3270SettingsWidget * widget = (Pw3270SettingsWidget *) page->data; - widget->apply(widget,settings->application,hSettings); + Pw3270SettingsPage * widget = (Pw3270SettingsPage *) page->data; + if(widget->apply) { + widget->apply(widget,GTK_APPLICATION(settings->application),pw3270_application_get_settings(settings->application)); + } } - break; + } - gtk_widget_destroy(dialog); + gtk_widget_destroy(GTK_WIDGET(dialog)); } static void on_page_added(GtkNotebook *notebook, GtkWidget *widget, guint page_num, Pw3270SettingsDialog * settings) { @@ -84,8 +81,47 @@ } + static void on_switch_page(GtkNotebook G_GNUC_UNUSED(*notebook), GtkWidget *widget, guint G_GNUC_UNUSED(page_num), Pw3270SettingsDialog * settings) + { + if(!settings->dialog) + return; + + GtkWidget * header_bar = gtk_dialog_get_header_bar(settings->dialog); + + if(header_bar) { + GSList * page; + for(page = settings->pages;page;page = page->next) { + Pw3270SettingsPage * pg = (Pw3270SettingsPage *) page->data; + if(pg->widget == pg) { + if(pg->title) + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar),pg->title); + return; + } + } + } + + } + + void pw3270_application_settings_dialog_add_page(Pw3270SettingsDialog *settings, Pw3270SettingsPage *page) { + + settings->pages = g_slist_prepend(settings->pages,page); + + GtkWidget * label = NULL; + if(page->label) + label = gtk_label_new(page->label); + + gtk_notebook_append_page( + settings->notebook, + page->widget, + label + ); + + } + void pw3270_application_preferences_activated(GSimpleAction *action, GVariant G_GNUC_UNUSED(*parameter), gpointer application) { + size_t ix; + debug("%s",__FUNCTION__); // Create dialog. @@ -115,30 +151,49 @@ // Create setttings data. Pw3270SettingsDialog * settings = g_new0(Pw3270SettingsDialog,1); - settings->action = action; - settings->application = GTK_APPLICATION(application); + settings->action = action; + settings->dialog = GTK_DIALOG(dialog); + settings->application = G_APPLICATION(application); g_simple_action_set_enabled(action,FALSE); gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); // Create settings notebook. - GtkNotebook *notebook = GTK_NOTEBOOK(gtk_notebook_new()); + settings->notebook = GTK_NOTEBOOK(gtk_notebook_new()); - gtk_notebook_set_scrollable(notebook,TRUE); - gtk_notebook_set_show_tabs(notebook,TRUE); - gtk_notebook_set_show_border(notebook, FALSE); + gtk_notebook_set_scrollable(settings->notebook,TRUE); + gtk_notebook_set_show_tabs(settings->notebook,TRUE); + gtk_notebook_set_show_border(settings->notebook, FALSE); - g_signal_connect(G_OBJECT(notebook), "page-added", G_CALLBACK(on_page_added), dialog); -// g_signal_connect(G_OBJECT(notebook), "page-removed", G_CALLBACK(on_page_changed), dialog); -// g_signal_connect(G_OBJECT(notebook), "switch-page", G_CALLBACK(on_switch_page), dialog); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(notebook),TRUE,TRUE,0); + g_signal_connect(G_OBJECT(settings->notebook), "page-added", G_CALLBACK(on_page_added), settings); +// g_signal_connect(G_OBJECT(settings->notebook), "page-removed", G_CALLBACK(on_page_changed), settings); + g_signal_connect(G_OBJECT(settings->notebook), "switch-page", G_CALLBACK(on_switch_page), settings); + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(settings->notebook),TRUE,TRUE,0); // Connection signals. g_signal_connect(dialog,"destroy",G_CALLBACK(on_destroy),settings); g_signal_connect(dialog,"response",G_CALLBACK(on_response),settings); g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); + // Load pages. + Pw3270SettingsPage * pages[] = { + pw3270_toolbar_settings_new() + }; + + for(ix = 0; ix < G_N_ELEMENTS(pages); ix++) { + pw3270_application_settings_dialog_add_page(settings,pages[ix]); + } + + // Load page contents. + GSList * page; + for(page = settings->pages;page;page = page->next) { + Pw3270SettingsPage * widget = (Pw3270SettingsPage *) page->data; + if(widget->load) { + widget->load(widget,GTK_APPLICATION(settings->application),pw3270_application_get_settings(settings->application)); + } + } + // Show dialog. gtk_widget_show_all(dialog); gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); diff --git a/src/objects/toolbar/settings.c b/src/objects/toolbar/settings.c new file mode 100644 index 0000000..ef984f4 --- /dev/null +++ b/src/objects/toolbar/settings.c @@ -0,0 +1,131 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "private.h" + #include + + typedef struct _ToolbarSettingsPage { + Pw3270SettingsPage parent; + GtkWidget * views[2]; + GtkWidget * buttons[2]; + + } ToolbarSettingsPage; + + static void load(Pw3270SettingsPage *pg, GtkApplication *application, GSettings *settings) { + debug("%s",__FUNCTION__); + } + + static void apply(Pw3270SettingsPage *pg, GtkApplication *application, GSettings *settings) { + debug("%s",__FUNCTION__); + } + + GtkWidget * pw3270_action_store_new() { + + GtkWidget * view = GTK_WIDGET(gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtk_list_store_new(2,G_TYPE_OBJECT,G_TYPE_STRING)))); + + gtk_widget_set_hexpand(view,TRUE); + gtk_widget_set_vexpand(view,TRUE); + gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(view),FALSE); + + return view; + } + + Pw3270SettingsPage * pw3270_toolbar_settings_new() { + + size_t ix; + + ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1); + + page->parent.load = load; + page->parent.apply = apply; + page->parent.label = _("Toolbar"); + page->parent.title = _("Setup toolbar action elements"); + + page->parent.widget = gtk_grid_new(); + gtk_grid_set_row_homogeneous(GTK_GRID(page->parent.widget),FALSE); + + // Create views + static const gchar *labels[G_N_ELEMENTS(page->views)] = { + N_("Selected"), + N_("Available") + }; + + for(ix = 0; ix < G_N_ELEMENTS(page->views); ix++) { + + page->views[ix] = pw3270_action_store_new(); + + gtk_grid_attach( + GTK_GRID(page->parent.widget), + gtk_label_new(gettext(labels[ix])), + ix * 3,0,2,1 + ); + + GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(box),page->views[ix]); + + gtk_grid_attach( + GTK_GRID(page->parent.widget), + box, + ix * 3,1,2,4 + ); + + } + + // Create buttons + static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = { + "go-next", + "go-previous" + }; + + GtkWidget * box = gtk_vbutton_box_new(); + gtk_widget_set_hexpand(box,FALSE); + gtk_widget_set_vexpand(box,FALSE); + + for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) { + page->buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND); + + gtk_widget_set_focus_on_click(page->buttons[ix],FALSE); + gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE); + gtk_widget_set_sensitive(page->buttons[ix],FALSE); + + } + + gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0); + gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0); + + gtk_grid_attach( + GTK_GRID(page->parent.widget), + box, + 2,2,1,1 + ); + + + return (Pw3270SettingsPage *) page; + } -- libgit2 0.21.2