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