Commit c9c4eb5b434141d04967e3ee1a86e729c28646b6

Authored by Perry Werneck
1 parent f7ff40d9

Implementing style & icon size on toolbar settings.

src/include/pw3270/settings.h
... ... @@ -43,6 +43,8 @@
43 43  
44 44 Pw3270SettingsPage * pw3270_toolbar_settings_new();
45 45  
  46 + GtkWidget * pw3270_frame_new(GtkWidget * child, const gchar *title);
  47 +
46 48 G_END_DECLS
47 49  
48 50 #endif // PW3270_SETTINGS_H_INCLUDED
... ...
src/main/main.c
... ... @@ -38,9 +38,34 @@
38 38 #include <lib3270.h>
39 39 #include <lib3270/log.h>
40 40 #include <locale.h>
  41 + #ifdef G_OS_UNIX
  42 + #include <glib-unix.h>
  43 + #endif // G_OS_UNIX
41 44  
42 45 /*---[ Implement ]----------------------------------------------------------------------------------*/
43 46  
  47 +static gboolean quit_signal(GtkApplication *app) {
  48 +
  49 + debug("%s",__FUNCTION__);
  50 + g_message("Terminating by signal");
  51 +
  52 + /*
  53 + GList *list = gtk_application_get_windows(GTK_APPLICATION(application));
  54 +
  55 + while(list) {
  56 +
  57 + GtkWidget * window = GTK_WIDGET(list->data);
  58 + list = list->next;
  59 +
  60 + gtk_widget_destroy(window);
  61 +
  62 + }
  63 + */
  64 +
  65 + g_application_quit(G_APPLICATION(app));
  66 + return FALSE;
  67 +}
  68 +
44 69 int main (int argc, char **argv) {
45 70  
46 71 GtkApplication *app;
... ... @@ -67,6 +92,11 @@ int main (int argc, char **argv) {
67 92 g_set_application_name(G_STRINGIFY(PRODUCT_NAME));
68 93 app = pw3270_application_new("br.com.bb." G_STRINGIFY(PRODUCT_NAME),G_APPLICATION_HANDLES_OPEN);
69 94  
  95 +#ifdef G_OS_UNIX
  96 + // Termination
  97 + g_unix_signal_add(SIGTERM, (GSourceFunc) quit_signal, app);
  98 +#endif // G_OS_UNIX
  99 +
70 100 status = g_application_run(G_APPLICATION (app), argc, argv);
71 101 g_object_unref (app);
72 102  
... ...
src/main/tools.c
... ... @@ -35,6 +35,7 @@
35 35  
36 36 #include "private.h"
37 37 #include <pw3270/application.h>
  38 + #include <pw3270/settings.h>
38 39  
39 40 /*---[ Implement ]----------------------------------------------------------------------------------*/
40 41  
... ... @@ -62,4 +63,22 @@
62 63  
63 64 }
64 65  
  66 + GtkWidget * pw3270_frame_new(GtkWidget * child, const gchar *title) {
  67 +
  68 + GtkFrame * frame = GTK_FRAME(gtk_frame_new(""));
  69 + g_autofree gchar * markup = g_strdup_printf("<b>%s</b>",title);
  70 + GtkWidget * label = gtk_label_new(NULL);
  71 +
  72 + gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_NONE);
  73 + gtk_label_set_markup(GTK_LABEL(label),markup);
  74 + gtk_frame_set_label_widget(GTK_FRAME(frame),label);
  75 + gtk_container_set_border_width(GTK_CONTAINER(child),12);
  76 +
  77 + gtk_container_add(GTK_CONTAINER(frame),GTK_WIDGET(child));
  78 +
  79 + g_object_set(G_OBJECT(frame),"margin-top",6,NULL);
  80 +
  81 + return GTK_WIDGET(frame);
  82 +
  83 + }
65 84  
... ...
src/objects/toolbar/private.h
... ... @@ -50,4 +50,8 @@
50 50 G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_style_model_new();
51 51 G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_icon_size_model_new();
52 52  
  53 + G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value);
  54 + G_GNUC_INTERNAL guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter);
  55 +
  56 +
53 57 #endif // PRIVATE_H_INCLUDED
... ...
src/objects/toolbar/settings.c
... ... @@ -31,16 +31,36 @@
31 31 #include <pw3270/settings.h>
32 32 #include <pw3270/actions.h>
33 33  
  34 + static const struct _comboboxes {
  35 + const gchar * name;
  36 + const gchar * label;
  37 + } comboboxes[] = {
  38 +
  39 + {
  40 + .name = "toolbar-icon-size",
  41 + .label = N_("Icon Size"),
  42 + },
  43 +
  44 + {
  45 + .name = "toolbar-style",
  46 + .label = N_("Style")
  47 + }
  48 +
  49 + };
  50 +
34 51 typedef struct _ToolbarSettingsPage {
35 52 Pw3270SettingsPage parent;
36 53 GtkWidget * views[2];
37 54 GtkWidget * buttons[2];
  55 + GtkTreeModel * models[2];
  56 + GtkWidget * combos[G_N_ELEMENTS(comboboxes)];
38 57  
39 58 } ToolbarSettingsPage;
40 59  
41 60 static void load(Pw3270SettingsPage *pg, GtkApplication *application, GSettings *settings) {
42 61  
43 62 size_t ix;
  63 + ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg;
44 64  
45 65 debug("%s",__FUNCTION__);
46 66  
... ... @@ -57,12 +77,12 @@
57 77 if(g_ascii_strcasecmp(actions[ix],"separator")) {
58 78  
59 79 // It's an action
60   - action_list = pw3270_action_list_move_action(action_list,actions[ix],((ToolbarSettingsPage *) pg)->views[0]);
  80 + action_list = pw3270_action_list_move_action(action_list,actions[ix],page->views[0]);
61 81  
62 82 } else {
63 83  
64 84 // It's a separator
65   - pw3270_action_view_append(((ToolbarSettingsPage *) pg)->views[0], _( "Separator"), NULL, "separator", 2);
  85 + pw3270_action_view_append(page->views[0], _( "Separator"), NULL, "separator", 2);
66 86  
67 87 }
68 88  
... ... @@ -71,23 +91,53 @@
71 91 g_strfreev(actions);
72 92  
73 93 // Load available actions.
74   - pw3270_action_view_set_actions(((ToolbarSettingsPage *) pg)->views[1], action_list);
75   - pw3270_action_view_append(((ToolbarSettingsPage *) pg)->views[1], _( "Separator"), NULL, "separator", 1);
  94 + pw3270_action_view_set_actions(page->views[1], action_list);
  95 + pw3270_action_view_append(page->views[1], _( "Separator"), NULL, "separator", 1);
76 96  
77 97 pw3270_action_list_free(action_list);
78 98  
  99 + GtkTreeIter iter;
  100 +
  101 + for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
  102 +
  103 + pw3270_model_get_iter_from_value(
  104 + gtk_combo_box_get_model(GTK_COMBO_BOX(page->combos[ix])),
  105 + &iter,
  106 + (guint) g_settings_get_int(settings,comboboxes[ix].name)
  107 + );
  108 +
  109 + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(page->combos[ix]),&iter);
  110 +
  111 + }
79 112  
80 113 }
81 114  
82 115 static void apply(Pw3270SettingsPage *pg, GtkApplication G_GNUC_UNUSED(*application), GSettings *settings) {
83 116  
  117 + size_t ix;
  118 + ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg;
  119 +
84 120 debug("%s",__FUNCTION__);
85 121  
86   - g_autofree gchar * action_names = pw3270_action_view_get_action_names(((ToolbarSettingsPage *) pg)->views[0]);
  122 + g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]);
87 123 g_settings_set_string(settings,"toolbar-action-names",action_names);
88 124  
89 125 debug("[%s]",action_names);
90 126  
  127 + GtkTreeIter iter;
  128 + for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
  129 +
  130 + if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(page->combos[ix]),&iter)) {
  131 +
  132 + g_settings_set_int(
  133 + settings,
  134 + comboboxes[ix].name,
  135 + (gint) pw3270_model_get_value_from_iter(gtk_combo_box_get_model(GTK_COMBO_BOX(page->combos[ix])),&iter)
  136 + );
  137 +
  138 + }
  139 +
  140 + }
91 141 }
92 142  
93 143 static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) {
... ... @@ -107,7 +157,6 @@
107 157 Pw3270SettingsPage * pw3270_toolbar_settings_new() {
108 158  
109 159 size_t ix;
110   - GtkTreeSelection * selection;
111 160  
112 161 ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1);
113 162  
... ... @@ -116,94 +165,155 @@
116 165 page->parent.label = _("Toolbar");
117 166 page->parent.title = _("Setup toolbar");
118 167  
119   - page->parent.widget = gtk_grid_new();
120   - gtk_grid_set_row_homogeneous(GTK_GRID(page->parent.widget),FALSE);
  168 + page->parent.widget = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
  169 +
121 170  
  171 + //
122 172 // Create views
123   - static const gchar *labels[G_N_ELEMENTS(page->views)] = {
124   - N_("Selected"),
125   - N_("Available")
126   - };
  173 + //
  174 + {
  175 + GtkTreeSelection * selection;
127 176  
128   - for(ix = 0; ix < G_N_ELEMENTS(page->views); ix++) {
  177 + GtkGrid * grid = GTK_GRID(gtk_grid_new());
  178 + gtk_grid_set_row_homogeneous(grid,FALSE);
129 179  
130   - GtkWidget * label = gtk_label_new(gettext(labels[ix]));
131   - gtk_label_set_xalign(GTK_LABEL(label),0);
  180 + gtk_box_pack_start(
  181 + GTK_BOX(page->parent.widget),
  182 + pw3270_frame_new(GTK_WIDGET(grid), _("Actions")),
  183 + TRUE,
  184 + TRUE,
  185 + 0
  186 + );
132 187  
133   - page->views[ix] = pw3270_action_view_new();
  188 + static const gchar *labels[G_N_ELEMENTS(page->views)] = {
  189 + N_("Selected"),
  190 + N_("Available")
  191 + };
134 192  
135   - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix]));
136   - gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
  193 + for(ix = 0; ix < G_N_ELEMENTS(page->views); ix++) {
137 194  
138   - gtk_grid_attach(
139   - GTK_GRID(page->parent.widget),
140   - label,
141   - ix * 3,0,2,1
  195 + GtkWidget * label = gtk_label_new(gettext(labels[ix]));
  196 + gtk_label_set_xalign(GTK_LABEL(label),0);
  197 +
  198 + page->views[ix] = pw3270_action_view_new();
  199 +
  200 + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix]));
  201 + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
  202 +
  203 + gtk_grid_attach(
  204 + grid,
  205 + label,
  206 + ix * 3,0,2,1
  207 + );
  208 +
  209 + GtkWidget * box = gtk_scrolled_window_new(NULL,NULL);
  210 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  211 + gtk_container_add(GTK_CONTAINER(box),page->views[ix]);
  212 +
  213 + gtk_grid_attach(
  214 + grid,
  215 + box,
  216 + ix * 3,1,2,4
  217 + );
  218 +
  219 + }
  220 +
  221 + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE);
  222 + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->views[1]))), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
  223 +
  224 + // Create buttons
  225 + static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = {
  226 + "go-next",
  227 + "go-previous"
  228 + };
  229 +
  230 + GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL);
  231 + gtk_widget_set_hexpand(box,FALSE);
  232 + gtk_widget_set_vexpand(box,FALSE);
  233 +
  234 + for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) {
  235 + page->buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND);
  236 +
  237 + gtk_widget_set_focus_on_click(page->buttons[ix],FALSE);
  238 + gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE);
  239 + gtk_widget_set_sensitive(page->buttons[ix],FALSE);
  240 +
  241 + g_signal_connect(
  242 + gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])),
  243 + "changed",
  244 + G_CALLBACK(selection_changed),
  245 + page->buttons[ix]
  246 + );
  247 +
  248 + }
  249 +
  250 + gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0);
  251 + gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0);
  252 +
  253 + g_signal_connect(
  254 + page->buttons[0],
  255 + "clicked",
  256 + G_CALLBACK(toolbar_remove),
  257 + page
142 258 );
143 259  
144   - GtkWidget * box = gtk_scrolled_window_new(NULL,NULL);
145   - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
146   - gtk_container_add(GTK_CONTAINER(box),page->views[ix]);
  260 + g_signal_connect(
  261 + page->buttons[1],
  262 + "clicked",
  263 + G_CALLBACK(toolbar_insert),
  264 + page
  265 + );
147 266  
148 267 gtk_grid_attach(
149   - GTK_GRID(page->parent.widget),
  268 + grid,
150 269 box,
151   - ix * 3,1,2,4
  270 + 2,2,1,1
152 271 );
153 272  
154 273 }
155 274  
156   - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE);
157   - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->views[1]))), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
  275 + //
  276 + // Create style & icon size settings.
  277 + //
  278 + {
  279 + GtkGrid * grid = GTK_GRID(gtk_grid_new());
158 280  
159   - // Create buttons
160   - static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = {
161   - "go-next",
162   - "go-previous"
163   - };
  281 + gtk_box_pack_start(
  282 + GTK_BOX(page->parent.widget),
  283 + pw3270_frame_new(GTK_WIDGET(grid), _("Options")),
  284 + TRUE,
  285 + TRUE,
  286 + 0
  287 + );
164 288  
165   - GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL);
166   - gtk_widget_set_hexpand(box,FALSE);
167   - gtk_widget_set_vexpand(box,FALSE);
  289 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  290 + gtk_grid_set_row_spacing(grid,6);
  291 + gtk_grid_set_column_spacing(grid,12);
  292 + gtk_widget_set_hexpand(GTK_WIDGET(grid),TRUE);
168 293  
169   - for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) {
170   - page->buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND);
  294 + page->models[0] = pw3270_toolbar_icon_size_model_new();
  295 + page->models[1] = pw3270_toolbar_style_model_new();
171 296  
172   - gtk_widget_set_focus_on_click(page->buttons[ix],FALSE);
173   - gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE);
174   - gtk_widget_set_sensitive(page->buttons[ix],FALSE);
  297 + GtkCellRenderer * renderer = gtk_cell_renderer_text_new();
175 298  
176   - g_signal_connect(
177   - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])),
178   - "changed",
179   - G_CALLBACK(selection_changed),
180   - page->buttons[ix]
181   - );
  299 + for(ix = 0; ix < G_N_ELEMENTS(page->models); ix++) {
182 300  
183   - }
  301 + GtkWidget * label = gtk_label_new(gettext(comboboxes[ix].label));
  302 + gtk_label_set_xalign(GTK_LABEL(label),1);
  303 +
  304 + gtk_grid_attach(grid,label,(ix*3),0,1,1);
184 305  
185   - gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0);
186   - gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0);
187   -
188   - g_signal_connect(
189   - page->buttons[0],
190   - "clicked",
191   - G_CALLBACK(toolbar_remove),
192   - page
193   - );
194   -
195   - g_signal_connect(
196   - page->buttons[1],
197   - "clicked",
198   - G_CALLBACK(toolbar_insert),
199   - page
200   - );
201   -
202   - gtk_grid_attach(
203   - GTK_GRID(page->parent.widget),
204   - box,
205   - 2,2,1,1
206   - );
  306 + page->combos[ix] = gtk_combo_box_new_with_model(page->models[ix]);
  307 + gtk_widget_set_hexpand(page->combos[ix],TRUE);
  308 +
  309 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->combos[ix]), renderer, TRUE);
  310 + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(page->combos[ix]), renderer, "text", 0, NULL);
  311 +
  312 + gtk_grid_attach(grid,page->combos[ix],(ix*3)+1,0,2,1);
  313 +
  314 + }
  315 +
  316 + }
207 317  
208 318 return (Pw3270SettingsPage *) page;
209 319 }
... ...
src/objects/toolbar/toolbar.c
... ... @@ -420,3 +420,33 @@
420 420  
421 421 return GTK_TREE_MODEL(model);
422 422 }
  423 +
  424 + void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value) {
  425 +
  426 + if(gtk_tree_model_get_iter_first(model,iter)) {
  427 +
  428 + do {
  429 +
  430 + GValue gVal = { 0, };
  431 + gtk_tree_model_get_value(model,iter,1,&gVal);
  432 + guint iVal = g_value_get_uint(&gVal);
  433 + g_value_unset(&gVal);
  434 +
  435 + if(iVal == value) {
  436 + return;
  437 + }
  438 +
  439 + } while(gtk_tree_model_iter_next(model,iter));
  440 +
  441 + }
  442 +
  443 + }
  444 +
  445 + guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter) {
  446 + GValue gVal = { 0, };
  447 + gtk_tree_model_get_value(model,iter,1,&gVal);
  448 + guint iVal = g_value_get_uint(&gVal);
  449 + g_value_unset(&gVal);
  450 + return iVal;
  451 +}
  452 +
... ...