diff options
author | Ryan Lortie <desrt@desrt.ca> | 2011-12-03 18:45:32 -0500 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2011-12-19 12:51:10 -0500 |
commit | cd7ce867a75d69fa708a04bca91b8ad9c5f1b0e6 (patch) | |
tree | 61f5848aa7cea132562fe16055b95737d8d5d2e5 /gtk/gtkapplicationwindow.c | |
parent | afb0c098cb28c4798b4b6a570191404dfa469906 (diff) | |
download | gtk+-cd7ce867a75d69fa708a04bca91b8ad9c5f1b0e6.tar.gz |
Split off GMenuModel -> GtkMenuBar code
Put this in a separate file and substantially refactor it.
Move handling of submenu creation into gtkmodelmenuitem where it
belongs.
Improve our handling of when to show separators or not.
Diffstat (limited to 'gtk/gtkapplicationwindow.c')
-rw-r--r-- | gtk/gtkapplicationwindow.c | 214 |
1 files changed, 2 insertions, 212 deletions
diff --git a/gtk/gtkapplicationwindow.c b/gtk/gtkapplicationwindow.c index b3ad18cc02..3577842c0d 100644 --- a/gtk/gtkapplicationwindow.c +++ b/gtk/gtkapplicationwindow.c @@ -23,10 +23,7 @@ #include "gtkapplicationwindow.h" -#include "gtkseparatormenuitem.h" -#include "gtkmodelmenuitem.h" -#include "gtkcheckmenuitem.h" -#include "gtkmenubar.h" +#include "gtkmodelmenu.h" #include "gactionmuxer.h" #include "gtkintl.h" @@ -65,11 +62,6 @@ struct _GtkApplicationWindowPrivate gboolean show_menubar; }; -static GtkWidget * -gtk_application_window_create_menubar (GMenuModel *model, - GActionObservable *actions); - - static void gtk_application_window_update_menubar (GtkApplicationWindow *window) { @@ -103,7 +95,7 @@ gtk_application_window_update_menubar (GtkApplicationWindow *window) g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->app_menu_section)); g_menu_append_section (combined, NULL, G_MENU_MODEL (window->priv->menubar_section)); - window->priv->menubar = gtk_application_window_create_menubar (G_MENU_MODEL (combined), G_ACTION_OBSERVABLE (muxer)); + window->priv->menubar = gtk_model_menu_create_menu_bar (G_MENU_MODEL (combined), G_ACTION_OBSERVABLE (muxer)); gtk_widget_set_parent (window->priv->menubar, GTK_WIDGET (window)); gtk_widget_show_all (window->priv->menubar); g_object_unref (combined); @@ -629,205 +621,3 @@ gtk_application_window_set_show_menubar (GtkApplicationWindow *window, g_object_notify_by_pspec (G_OBJECT (window), gtk_application_window_properties[PROP_SHOW_MENUBAR]); } } - -/* GtkMenu construction {{{1 */ - -static void populate_menu_from_model (GtkMenuShell *menu, - GMenuModel *model, - GActionObservable *actions); - -static void -append_items_from_model (GtkMenuShell *menu, - GMenuModel *model, - GActionObservable *actions, - gboolean *need_separator, - const gchar *heading) -{ - gint n; - gint i; - GtkWidget *w; - GtkMenuItem *menuitem; - GtkWidget *submenu; - GMenuModel *m; - gchar *label; - - n = g_menu_model_get_n_items (model); - - if (!GTK_IS_MENU_BAR (menu) && *need_separator && n > 0) - { - w = gtk_separator_menu_item_new (); - gtk_widget_show (w); - gtk_menu_shell_append (menu, w); - *need_separator = FALSE; - } - - if (heading != NULL) - { - w = gtk_menu_item_new_with_label (heading); - gtk_widget_show (w); - gtk_widget_set_sensitive (w, FALSE); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), w); - } - - for (i = 0; i < n; i++) - { - if ((m = g_menu_model_get_item_link (model, i, G_MENU_LINK_SECTION))) - { - label = NULL; - g_menu_model_get_item_attribute (model, i, G_MENU_ATTRIBUTE_LABEL, "s", &label); - append_items_from_model (menu, m, actions, need_separator, label); - g_object_unref (m); - g_free (label); - - if (!GTK_IS_MENU_BAR (menu) && *need_separator) - { - w = gtk_separator_menu_item_new (); - gtk_widget_show (w); - gtk_menu_shell_append (menu, w); - *need_separator = FALSE; - } - - continue; - } - - menuitem = gtk_model_menu_item_new (model, i, actions); - - if ((m = g_menu_model_get_item_link (model, i, G_MENU_LINK_SUBMENU))) - { - submenu = gtk_menu_new (); - populate_menu_from_model (GTK_MENU_SHELL (submenu), m, actions); - gtk_menu_item_set_submenu (menuitem, submenu); - g_object_unref (m); - } - - gtk_widget_show (GTK_WIDGET (menuitem)); - gtk_menu_shell_append (menu, GTK_WIDGET (menuitem)); - - *need_separator = TRUE; - } -} - -static void -populate_menu_from_model (GtkMenuShell *menu, - GMenuModel *model, - GActionObservable *actions) -{ - gboolean need_separator; - - need_separator = FALSE; - append_items_from_model (menu, model, actions, &need_separator, NULL); -} - -typedef struct { - GActionObservable *actions; - GMenuModel *model; - GtkMenuShell *menu; - guint update_idle; - GHashTable *connected; -} ItemsChangedData; - -static void -free_items_changed_data (gpointer data) -{ - ItemsChangedData *d = data; - - g_object_unref (d->actions); - g_object_unref (d->model); - - if (d->update_idle != 0) - g_source_remove (d->update_idle); - - g_hash_table_unref (d->connected); - - g_free (d); -} - -static gboolean -repopulate_menu (gpointer data) -{ - ItemsChangedData *d = data; - GList *children, *l; - GtkWidget *child; - - /* remove current children */ - children = gtk_container_get_children (GTK_CONTAINER (d->menu)); - for (l = children; l; l = l->next) - { - child = l->data; - gtk_container_remove (GTK_CONTAINER (d->menu), child); - } - g_list_free (children); - - populate_menu_from_model (d->menu, d->model, d->actions); - d->update_idle = 0; - - return FALSE; -} - -static void -connect_to_items_changed (GMenuModel *model, - GCallback callback, - gpointer data) -{ - ItemsChangedData *d = data; - gint i; - GMenuModel *m; - GMenuLinkIter *iter; - - if (!g_hash_table_lookup (d->connected, model)) - { - g_signal_connect (model, "items-changed", callback, data); - g_hash_table_insert (d->connected, model, model); - } - - for (i = 0; i < g_menu_model_get_n_items (model); i++) - { - iter = g_menu_model_iterate_item_links (model, i); - while (g_menu_link_iter_next (iter)) - { - m = g_menu_link_iter_get_value (iter); - connect_to_items_changed (m, callback, data); - g_object_unref (m); - } - g_object_unref (iter); - } -} - -static void -items_changed (GMenuModel *model, - gint position, - gint removed, - gint added, - gpointer data) -{ - ItemsChangedData *d = data; - - if (d->update_idle == 0) - d->update_idle = gdk_threads_add_idle (repopulate_menu, data); - connect_to_items_changed (model, G_CALLBACK (items_changed), data); -} - -static GtkWidget * -gtk_application_window_create_menubar (GMenuModel *model, - GActionObservable *actions) -{ - ItemsChangedData *data; - GtkWidget *menubar; - - menubar = gtk_menu_bar_new (); - - data = g_new (ItemsChangedData, 1); - data->model = g_object_ref (model); - data->actions = g_object_ref (actions); - data->menu = GTK_MENU_SHELL (menubar); - data->update_idle = 0; - data->connected = g_hash_table_new (NULL, NULL); - - g_object_set_data_full (G_OBJECT (menubar), "gtk-application-menu-data", - data, free_items_changed_data); - - connect_to_items_changed (model, G_CALLBACK (items_changed), data); - repopulate_menu (data); - - return menubar; -} |