[devhelp/wip/book-tree-collapse-all] BookTree: add context menu with Collapse All action



commit fae8f84370625b2afedcad27688327fec4c24e9c
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Fri May 5 16:10:30 2017 +0200

    BookTree: add context menu with Collapse All action
    
    I hesitated between adding a toolbar above the BookTree with the action,
    or a context menu. But there is currently only one action, so the
    toolbar would be quite empty.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=761292

 src/dh-book-tree.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 60 insertions(+), 0 deletions(-)
---
diff --git a/src/dh-book-tree.c b/src/dh-book-tree.c
index 8bd976f..0b05de2 100644
--- a/src/dh-book-tree.c
+++ b/src/dh-book-tree.c
@@ -22,6 +22,7 @@
 
 #include "config.h"
 #include "dh-book-tree.h"
+#include <glib/gi18n-lib.h>
 #include "dh-book-manager.h"
 #include "dh-book.h"
 
@@ -594,12 +595,71 @@ dh_book_tree_dispose (GObject *object)
 }
 
 static void
+do_popup_menu (DhBookTree     *tree,
+               GdkEventButton *event)
+{
+        GtkMenu *menu;
+        GtkWidget *menu_item;
+
+        menu = GTK_MENU (gtk_menu_new ());
+        g_signal_connect (menu,
+                          "deactivate",
+                          G_CALLBACK (gtk_widget_destroy),
+                          NULL);
+
+        menu_item = gtk_menu_item_new_with_mnemonic (_("_Collapse All"));
+        gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+        gtk_widget_show (menu_item);
+
+        gtk_menu_attach_to_widget (menu, GTK_WIDGET (tree), NULL);
+
+        if (event != NULL) {
+                gtk_menu_popup_at_pointer (menu, (GdkEvent *) event);
+        } else {
+                gtk_menu_popup_at_widget (menu,
+                                          GTK_WIDGET (tree),
+                                          GDK_GRAVITY_NORTH_EAST,
+                                          GDK_GRAVITY_NORTH_WEST,
+                                          NULL);
+        }
+}
+
+static gboolean
+dh_book_tree_button_press_event (GtkWidget      *widget,
+                                 GdkEventButton *event)
+{
+        DhBookTree *tree = DH_BOOK_TREE (widget);
+
+        if (gdk_event_triggers_context_menu ((GdkEvent *) event) &&
+            event->type == GDK_BUTTON_PRESS) {
+                do_popup_menu (tree, event);
+                return GDK_EVENT_STOP;
+        }
+
+        if (GTK_WIDGET_CLASS (dh_book_tree_parent_class)->button_press_event != NULL)
+                return GTK_WIDGET_CLASS (dh_book_tree_parent_class)->button_press_event (widget, event);
+
+        return GDK_EVENT_PROPAGATE;
+}
+
+static gboolean
+dh_book_tree_popup_menu (GtkWidget *widget)
+{
+        do_popup_menu (DH_BOOK_TREE (widget), NULL);
+        return TRUE;
+}
+
+static void
 dh_book_tree_class_init (DhBookTreeClass *klass)
 {
         GObjectClass *object_class = G_OBJECT_CLASS (klass);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
         object_class->dispose = dh_book_tree_dispose;
 
+        widget_class->button_press_event = dh_book_tree_button_press_event;
+        widget_class->popup_menu = dh_book_tree_popup_menu;
+
         /**
          * DhBookTree::link-selected:
          * @tree: the #DhBookTree.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]