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,6 +43,8 @@
43 43
44 Pw3270SettingsPage * pw3270_toolbar_settings_new(); 44 Pw3270SettingsPage * pw3270_toolbar_settings_new();
45 45
  46 + GtkWidget * pw3270_frame_new(GtkWidget * child, const gchar *title);
  47 +
46 G_END_DECLS 48 G_END_DECLS
47 49
48 #endif // PW3270_SETTINGS_H_INCLUDED 50 #endif // PW3270_SETTINGS_H_INCLUDED
src/main/main.c
@@ -38,9 +38,34 @@ @@ -38,9 +38,34 @@
38 #include <lib3270.h> 38 #include <lib3270.h>
39 #include <lib3270/log.h> 39 #include <lib3270/log.h>
40 #include <locale.h> 40 #include <locale.h>
  41 + #ifdef G_OS_UNIX
  42 + #include <glib-unix.h>
  43 + #endif // G_OS_UNIX
41 44
42 /*---[ Implement ]----------------------------------------------------------------------------------*/ 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 int main (int argc, char **argv) { 69 int main (int argc, char **argv) {
45 70
46 GtkApplication *app; 71 GtkApplication *app;
@@ -67,6 +92,11 @@ int main (int argc, char **argv) { @@ -67,6 +92,11 @@ int main (int argc, char **argv) {
67 g_set_application_name(G_STRINGIFY(PRODUCT_NAME)); 92 g_set_application_name(G_STRINGIFY(PRODUCT_NAME));
68 app = pw3270_application_new("br.com.bb." G_STRINGIFY(PRODUCT_NAME),G_APPLICATION_HANDLES_OPEN); 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 status = g_application_run(G_APPLICATION (app), argc, argv); 100 status = g_application_run(G_APPLICATION (app), argc, argv);
71 g_object_unref (app); 101 g_object_unref (app);
72 102
src/main/tools.c
@@ -35,6 +35,7 @@ @@ -35,6 +35,7 @@
35 35
36 #include "private.h" 36 #include "private.h"
37 #include <pw3270/application.h> 37 #include <pw3270/application.h>
  38 + #include <pw3270/settings.h>
38 39
39 /*---[ Implement ]----------------------------------------------------------------------------------*/ 40 /*---[ Implement ]----------------------------------------------------------------------------------*/
40 41
@@ -62,4 +63,22 @@ @@ -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,4 +50,8 @@
50 G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_style_model_new(); 50 G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_style_model_new();
51 G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_icon_size_model_new(); 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 #endif // PRIVATE_H_INCLUDED 57 #endif // PRIVATE_H_INCLUDED
src/objects/toolbar/settings.c
@@ -31,16 +31,36 @@ @@ -31,16 +31,36 @@
31 #include <pw3270/settings.h> 31 #include <pw3270/settings.h>
32 #include <pw3270/actions.h> 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 typedef struct _ToolbarSettingsPage { 51 typedef struct _ToolbarSettingsPage {
35 Pw3270SettingsPage parent; 52 Pw3270SettingsPage parent;
36 GtkWidget * views[2]; 53 GtkWidget * views[2];
37 GtkWidget * buttons[2]; 54 GtkWidget * buttons[2];
  55 + GtkTreeModel * models[2];
  56 + GtkWidget * combos[G_N_ELEMENTS(comboboxes)];
38 57
39 } ToolbarSettingsPage; 58 } ToolbarSettingsPage;
40 59
41 static void load(Pw3270SettingsPage *pg, GtkApplication *application, GSettings *settings) { 60 static void load(Pw3270SettingsPage *pg, GtkApplication *application, GSettings *settings) {
42 61
43 size_t ix; 62 size_t ix;
  63 + ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg;
44 64
45 debug("%s",__FUNCTION__); 65 debug("%s",__FUNCTION__);
46 66
@@ -57,12 +77,12 @@ @@ -57,12 +77,12 @@
57 if(g_ascii_strcasecmp(actions[ix],"separator")) { 77 if(g_ascii_strcasecmp(actions[ix],"separator")) {
58 78
59 // It's an action 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 } else { 82 } else {
63 83
64 // It's a separator 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,23 +91,53 @@
71 g_strfreev(actions); 91 g_strfreev(actions);
72 92
73 // Load available actions. 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 pw3270_action_list_free(action_list); 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 static void apply(Pw3270SettingsPage *pg, GtkApplication G_GNUC_UNUSED(*application), GSettings *settings) { 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 debug("%s",__FUNCTION__); 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 g_settings_set_string(settings,"toolbar-action-names",action_names); 123 g_settings_set_string(settings,"toolbar-action-names",action_names);
88 124
89 debug("[%s]",action_names); 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 static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) { 143 static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) {
@@ -107,7 +157,6 @@ @@ -107,7 +157,6 @@
107 Pw3270SettingsPage * pw3270_toolbar_settings_new() { 157 Pw3270SettingsPage * pw3270_toolbar_settings_new() {
108 158
109 size_t ix; 159 size_t ix;
110 - GtkTreeSelection * selection;  
111 160
112 ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1); 161 ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1);
113 162
@@ -116,94 +165,155 @@ @@ -116,94 +165,155 @@
116 page->parent.label = _("Toolbar"); 165 page->parent.label = _("Toolbar");
117 page->parent.title = _("Setup toolbar"); 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 // Create views 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 gtk_grid_attach( 267 gtk_grid_attach(
149 - GTK_GRID(page->parent.widget), 268 + grid,
150 box, 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 return (Pw3270SettingsPage *) page; 318 return (Pw3270SettingsPage *) page;
209 } 319 }
src/objects/toolbar/toolbar.c
@@ -420,3 +420,33 @@ @@ -420,3 +420,33 @@
420 420
421 return GTK_TREE_MODEL(model); 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 +