Commit 4d263a5a0c4a5c905e86ce59ab3af967d9891b9f

Authored by Perry Werneck
1 parent a3c50bce

Binding menu options directly with toolbar properties.

src/objects/toolbar/models.c
... ... @@ -30,20 +30,25 @@
30 30 #include "private.h"
31 31 #include <pw3270/application.h>
32 32 #include <pw3270/settings.h>
  33 + #include <pw3270/window.h>
33 34  
34 35 #define GTK_TOOLBAR_DEFAULT_STYLE ((GtkToolbarStyle) -1)
35 36  
  37 + struct _contents {
  38 + const gchar * label;
  39 + int value;
  40 + };
  41 +
36 42 static const struct _models {
37 43 const gchar *name;
  44 + const gchar *property;
38 45 const gchar *label;
39   - const struct _contents {
40   - const gchar * label;
41   - guint value;
42   - } *contents;
  46 + const struct _contents *contents;
43 47 } models[] = {
44 48  
45 49 {
46 50 "toolbar-icon-size",
  51 + "icon-size",
47 52 N_("Icon _size"),
48 53 (const struct _contents[]) {
49 54 {
... ... @@ -70,6 +75,7 @@
70 75  
71 76 {
72 77 "toolbar-style",
  78 + "style",
73 79 N_("Toolbar s_tyle"),
74 80 (const struct _contents[]) {
75 81 {
... ... @@ -98,6 +104,7 @@
98 104 },
99 105 {
100 106 "toolbar-icon-type",
  107 + "icon-type",
101 108 N_("Icon type"),
102 109 (const struct _contents[]) {
103 110 {
... ... @@ -175,10 +182,45 @@
175 182 return iVal;
176 183 }
177 184  
178   - GtkWidget * pw3270_menu_item_from_name(const gchar *name) {
  185 + static void set_property(GObject *menuitem, GObject *widget) {
  186 +
  187 + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) {
  188 +
  189 + const struct _contents *model = (const struct _contents *) g_object_get_data(menuitem, I_("pw3270_model_data"));
  190 + const char *name = (const char *) g_object_get_data(menuitem, I_("pw3270_property_name"));
  191 +
  192 + debug("%s(%s,%d)",__FUNCTION__,name,model->value);
  193 + g_object_set(widget,name,model->value,NULL);
  194 +
  195 + }
  196 +
  197 + }
  198 +
  199 + static void set_toggle_menu_item(GtkCheckMenuItem *item, gint *value) {
  200 + const struct _contents *model = (const struct _contents *) g_object_get_data(G_OBJECT(item), I_("pw3270_model_data"));
  201 + if(model) {
  202 + gtk_check_menu_item_set_active(item,model->value == *value);
  203 + }
  204 + }
  205 +
  206 + static void property_changed(GObject *widget, GParamSpec *pspec, GtkContainer *menu) {
  207 +
  208 + gint value = -1;
  209 + const gchar * name = g_object_get_data(menu, I_("pw3270_property_name"));
  210 + g_object_get(widget,name,&value,NULL);
  211 +
  212 + debug("%s(%p,%s)=%d",__FUNCTION__,widget,name,value);
  213 +
  214 + gtk_container_foreach(menu,set_toggle_menu_item,&value);
  215 +
  216 +
  217 + }
  218 +
  219 + GtkWidget * pw3270_menu_item_from_model(GtkWidget *widget, const gchar *name) {
179 220  
180 221 size_t model;
181 222  
  223 +
182 224 for(model = 0; model < G_N_ELEMENTS(models); model++) {
183 225  
184 226 if(g_ascii_strcasecmp(models[model].name,name))
... ... @@ -190,16 +232,29 @@
190 232 GtkWidget * menu = gtk_menu_item_new_with_mnemonic(gettext(models[model].label));
191 233  
192 234 GtkWidget * submenu = gtk_menu_new();
  235 + g_object_set_data(G_OBJECT(submenu),I_("pw3270_property_name"),(gpointer) models[model].property);
193 236 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu),submenu);
194 237  
195   - g_object_set_data(G_OBJECT(submenu),"model-data",(gpointer) &models[model]);
  238 + guint selected = (guint) -1;
  239 + if(widget) {
  240 + g_object_get(G_OBJECT(widget),models[model].property,&selected);
  241 + g_autofree gchar * signame = g_strconcat("notify::",models[model].property,NULL);
  242 + g_signal_connect(G_OBJECT(widget),signame,G_CALLBACK(property_changed),submenu);
  243 + }
196 244  
197 245 for(row = 0; models[model].contents[row].label; row++) {
198 246  
199 247 item = gtk_check_menu_item_new_with_mnemonic(gettext(models[model].contents[row].label));
200 248 gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item),TRUE);
201 249  
202   - //g_signal_connect(item, "toggled", G_CALLBACK(set_icon_size), menu);
  250 + g_object_set_data(G_OBJECT(item),I_("pw3270_property_name"),(gpointer) models[model].property);
  251 + g_object_set_data(G_OBJECT(item),I_("pw3270_model_data"),(gpointer) &models[model].contents[row]);
  252 +
  253 + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),selected == models[model].contents[row].value);
  254 +
  255 + if(widget) {
  256 + g_signal_connect(item, "toggled", G_CALLBACK(set_property), widget);
  257 + }
203 258  
204 259 gtk_menu_shell_append(GTK_MENU_SHELL(submenu),item);
205 260  
... ... @@ -212,3 +267,10 @@
212 267  
213 268 return NULL;
214 269 }
  270 +
  271 + void pw3270_menu_item_set_value(GtkWidget *menu, guint value) {
  272 +
  273 + debug("%s(%p,%d)",__FUNCTION__,menu,value);
  274 +
  275 + }
  276 +
... ...
src/objects/toolbar/private.h
... ... @@ -51,7 +51,8 @@
51 51 G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new_from_action_name(const gchar * action_name);
52 52  
53 53 GtkTreeModel * pw3270_model_from_name(const gchar *name);
54   - GtkWidget * pw3270_menu_item_from_name(const gchar *name);
  54 + GtkWidget * pw3270_menu_item_from_model(GtkWidget *widget, const gchar *model_name);
  55 + void pw3270_menu_item_set_value(GtkWidget *menu, guint value);
55 56  
56 57 G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value);
57 58 G_GNUC_INTERNAL guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter);
... ...
src/objects/toolbar/toolbar.c
... ... @@ -46,19 +46,25 @@
46 46 PROP_STYLE
47 47 };
48 48  
  49 + enum {
  50 + TOOLBAR_MENU_STYLE,
  51 + TOOLBAR_MENU_ICON_SIZE,
  52 + TOOLBAR_MENU_ICON_TYPE
  53 + };
  54 +
  55 + static const gchar * toolbar_menus[] = {
  56 + "toolbar-style",
  57 + "toolbar-icon-size",
  58 + "toolbar-icon-type"
  59 + };
49 60  
50 61 struct _pw3270ToolBar {
51 62 GtkToolbar parent;
52 63 GtkToolbarStyle style;
53   - GtkWidget *menu;
54 64 int icon_type;
55 65  
56   - /// @brief Popup Menu
57   -// struct {
58   -// GtkWidget * menu;
59   -// GtkWidget * styles[G_N_ELEMENTS(styles)];
60   -// GtkWidget * icon_sizes[G_N_ELEMENTS(icon_sizes)];
61   -// } popup;
  66 + GtkWidget *menu;
  67 + GtkWidget *submenu[G_N_ELEMENTS(toolbar_menus)];
62 68  
63 69 };
64 70  
... ... @@ -193,26 +199,6 @@
193 199  
194 200 }
195 201  
196   - /*
197   - static void set_icon_size(GtkCheckMenuItem *menuitem, GtkWidget *toolbar) {
198   -
199   - if(gtk_check_menu_item_get_active(menuitem)) {
200   - const struct icon_size * size = g_object_get_data(G_OBJECT(menuitem),"icon_size");
201   - pw3270_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), size->icon_size);
202   - }
203   -
204   - }
205   -
206   - static void set_style(GtkCheckMenuItem *menuitem, GtkWidget *toolbar) {
207   -
208   - if(gtk_check_menu_item_get_active(menuitem)) {
209   - struct style * style = g_object_get_data(G_OBJECT(menuitem),"toolbar_style");
210   - pw3270_toolbar_set_style(GTK_TOOLBAR(toolbar), style->style);
211   - }
212   -
213   - }
214   - */
215   -
216 202 static void open_preferences(GtkMenuItem G_GNUC_UNUSED(*menuitem), GtkWidget *toolbar) {
217 203  
218 204 GtkWidget * window = gtk_widget_get_toplevel(toolbar);
... ... @@ -233,11 +219,17 @@
233 219  
234 220 static void pw3270ToolBar_init(pw3270ToolBar *widget) {
235 221  
  222 + size_t ix;
  223 +
236 224 widget->menu = gtk_menu_new();
237 225  
238   - gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),pw3270_menu_item_from_name("toolbar-style"));
239   - gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),pw3270_menu_item_from_name("toolbar-icon-size"));
240   - gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),pw3270_menu_item_from_name("toolbar-icon-type"));
  226 + // Create menus.
  227 + {
  228 + for(ix = 0; ix < G_N_ELEMENTS(widget->submenu); ix++) {
  229 + widget->submenu[ix] = pw3270_menu_item_from_model(GTK_WIDGET(widget),toolbar_menus[ix]);
  230 + gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),widget->submenu[ix]);
  231 + }
  232 + }
241 233  
242 234 // Toolbar preferences.
243 235 {
... ...