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 | { | ... | ... |