Commit 4d263a5a0c4a5c905e86ce59ab3af967d9891b9f
1 parent
a3c50bce
Exists in
master
and in
2 other branches
Binding menu options directly with toolbar properties.
Showing
3 changed files
with
93 additions
and
38 deletions
Show diff stats
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 | { | ... | ... |