X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=hildon%2Fhildon-app-menu.c;h=e7a769471923adb59bf3d3675d7c1ad416b2cd45;hb=293c5746d90f0f9e5282dce4f99e85cb91777178;hp=7247e7a498f664d682d5ab5181634a2c1a21d605;hpb=905902b4ef3a95bc3ac583aa5c9f13eb5d74c942;p=hildon diff --git a/hildon/hildon-app-menu.c b/hildon/hildon-app-menu.c index 7247e7a..e7a7694 100644 --- a/hildon/hildon-app-menu.c +++ b/hildon/hildon-app-menu.c @@ -133,10 +133,22 @@ remove_item_from_list (GList **list, gpointer item); static void +emit_menu_changed (HildonAppMenu *menu, + gpointer item); + +static void hildon_app_menu_apply_style (GtkWidget *widget); G_DEFINE_TYPE (HildonAppMenu, hildon_app_menu, GTK_TYPE_WINDOW); +enum +{ + CHANGED, + LAST_SIGNAL +}; + +static guint app_menu_signals[LAST_SIGNAL] = { 0 }; + /** * hildon_app_menu_new: * @@ -194,6 +206,9 @@ hildon_app_menu_insert (HildonAppMenu *menu, /* Remove item from list when it is destroyed */ g_object_weak_ref (G_OBJECT (item), (GWeakNotify) remove_item_from_list, &(priv->buttons)); + g_object_weak_ref (G_OBJECT (item), (GWeakNotify) emit_menu_changed, menu); + + g_signal_emit (menu, app_menu_signals[CHANGED], 0); } /** @@ -301,6 +316,9 @@ hildon_app_menu_add_filter (HildonAppMenu *menu, /* Remove filter from list when it is destroyed */ g_object_weak_ref (G_OBJECT (filter), (GWeakNotify) remove_item_from_list, &(priv->filters)); + g_object_weak_ref (G_OBJECT (filter), (GWeakNotify) emit_menu_changed, menu); + + g_signal_emit (menu, app_menu_signals[CHANGED], 0); } static void @@ -407,6 +425,7 @@ item_visibility_changed (GtkWidget *item, if (! priv->inhibit_repack) hildon_app_menu_repack_items (menu, g_list_index (priv->buttons, item)); + g_signal_emit (menu, app_menu_signals[CHANGED], 0); } static void @@ -418,6 +437,7 @@ filter_visibility_changed (GtkWidget *item, if (! priv->inhibit_repack) hildon_app_menu_repack_filters (menu); + g_signal_emit (menu, app_menu_signals[CHANGED], 0); } static void @@ -428,6 +448,13 @@ remove_item_from_list (GList **list, } static void +emit_menu_changed (HildonAppMenu *menu, + gpointer item) +{ + g_signal_emit (menu, app_menu_signals[CHANGED], 0); +} + +static void hildon_app_menu_show_all (GtkWidget *widget) { HildonAppMenu *menu = HILDON_APP_MENU (widget); @@ -798,6 +825,39 @@ hildon_app_menu_repack_items (HildonAppMenu *menu, } } } + + gtk_widget_queue_draw (GTK_WIDGET (menu)); +} + +/** + * hildon_app_menu_has_visible_children: + * @menu: a #HildonAppMenu + * + * Returns whether this menu has any visible items + * and/or filters. If this is %FALSE, the menu will + * not be popped up. + * + * Returns: whether there are visible items or filters + * + * Since: 2.2 + **/ +gboolean +hildon_app_menu_has_visible_children (HildonAppMenu *menu) +{ + HildonAppMenuPrivate *priv; + GList *i; + gboolean show_menu = FALSE; + + priv = HILDON_APP_MENU_GET_PRIVATE (menu); + + /* Don't show menu if it doesn't contain visible items */ + for (i = priv->buttons; i && !show_menu; i = i->next) + show_menu = GTK_WIDGET_VISIBLE (i->data); + + for (i = priv->filters; i && !show_menu; i = i->next) + show_menu = GTK_WIDGET_VISIBLE (i->data); + + return show_menu; } /** @@ -814,23 +874,10 @@ void hildon_app_menu_popup (HildonAppMenu *menu, GtkWindow *parent_window) { - HildonAppMenuPrivate *priv; - gboolean show_menu = FALSE; - GList *i; - g_return_if_fail (HILDON_IS_APP_MENU (menu)); g_return_if_fail (GTK_IS_WINDOW (parent_window)); - priv = HILDON_APP_MENU_GET_PRIVATE (menu); - - /* Don't show menu if it doesn't contain visible items */ - for (i = priv->buttons; i && !show_menu; i = i->next) - show_menu = GTK_WIDGET_VISIBLE (i->data); - - for (i = priv->filters; i && !show_menu; i = i->next) - show_menu = GTK_WIDGET_VISIBLE (i->data); - - if (show_menu) { + if (hildon_app_menu_has_visible_children (menu)) { hildon_app_menu_set_parent_window (menu, parent_window); gtk_widget_show (GTK_WIDGET (menu)); } @@ -1030,4 +1077,22 @@ hildon_app_menu_class_init (HildonAppMenuClass *klass) "the screen edges (in horizontal mode)", 0, G_MAXUINT, 50, G_PARAM_READABLE)); + + + /** + * HildonAppMenu::changed: + * @widget: the widget that received the signal + * + * The HildonAppMenu::changed signal is emitted whenever an + * item or filter is added or removed from the menu. + * + * Since: 2.2 + */ + app_menu_signals[CHANGED] = + g_signal_new ("changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0, NULL); }