[gedit] Use GMenu for the notebook popup



commit 72943de05bcd1519165d543cea4cc4a68752a831
Author: Paolo Borelli <pborelli gnome org>
Date:   Sat Jan 11 23:54:21 2014 +0100

    Use GMenu for the notebook popup

 gedit/gedit-notebook-popup-menu.c  |  204 ++++++++++++++++++------------------
 gedit/gedit-notebook-popup-menu.ui |   35 ++++++
 gedit/gedit.gresource.xml          |    1 +
 3 files changed, 139 insertions(+), 101 deletions(-)
---
diff --git a/gedit/gedit-notebook-popup-menu.c b/gedit/gedit-notebook-popup-menu.c
index 3ca29ab..3a583a5 100644
--- a/gedit/gedit-notebook-popup-menu.c
+++ b/gedit/gedit-notebook-popup-menu.c
@@ -29,11 +29,8 @@ struct _GeditNotebookPopupMenuPrivate
        GeditWindow *window;
        GeditTab *tab;
 
-       GtkWidget *move_left_item;
-       GtkWidget *move_right_item;
-       GtkWidget *move_to_new_tab_group_item;
-       GtkWidget *move_to_new_window_item;
-       GtkWidget *close_item;
+       GSimpleActionGroup *action_group;
+       GMenuModel *menu_model;
 };
 
 enum
@@ -108,6 +105,7 @@ update_sensitivity (GeditNotebookPopupMenu *menu)
        gint page_num;
        gint n_pages;
        guint n_tabs;
+       GAction *action;
 
        state = gedit_tab_get_state (menu->priv->tab);
 
@@ -115,23 +113,34 @@ update_sensitivity (GeditNotebookPopupMenu *menu)
 
        notebook = GTK_NOTEBOOK (gedit_multi_notebook_get_notebook_for_tab (mnb, menu->priv->tab));
        n_pages = gtk_notebook_get_n_pages (notebook);
-       page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (menu->priv->tab));
-
-       gtk_widget_set_sensitive (menu->priv->close_item,
-                                 (state != GEDIT_TAB_STATE_CLOSING) &&
-                                 (state != GEDIT_TAB_STATE_SAVING) &&
-                                 (state != GEDIT_TAB_STATE_SHOWING_PRINT_PREVIEW) &&
-                                 (state != GEDIT_TAB_STATE_PRINTING) &&
-                                 (state != GEDIT_TAB_STATE_PRINT_PREVIEWING) &&
-                                 (state != GEDIT_TAB_STATE_SAVING_ERROR));
-
-       gtk_widget_set_sensitive (menu->priv->move_to_new_tab_group_item, n_pages > 1);
-
        n_tabs = gedit_multi_notebook_get_n_tabs(mnb);
-       gtk_widget_set_sensitive (menu->priv->move_to_new_window_item, n_tabs > 1);
+       page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (menu->priv->tab));
 
-       gtk_widget_set_sensitive (menu->priv->move_left_item, page_num > 0);
-       gtk_widget_set_sensitive (menu->priv->move_right_item, page_num < n_pages - 1);
+       action = g_action_map_lookup_action (G_ACTION_MAP (menu->priv->action_group),
+                                            "close");
+       g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+                                    (state != GEDIT_TAB_STATE_CLOSING) &&
+                                    (state != GEDIT_TAB_STATE_SAVING) &&
+                                    (state != GEDIT_TAB_STATE_SHOWING_PRINT_PREVIEW) &&
+                                    (state != GEDIT_TAB_STATE_PRINTING) &&
+                                    (state != GEDIT_TAB_STATE_PRINT_PREVIEWING) &&
+                                    (state != GEDIT_TAB_STATE_SAVING_ERROR));
+
+       action = g_action_map_lookup_action (G_ACTION_MAP (menu->priv->action_group),
+                                            "move_to_new_window");
+       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), n_tabs > 1);
+
+       action = g_action_map_lookup_action (G_ACTION_MAP (menu->priv->action_group),
+                                            "move_to_new_tab_group");
+       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), n_pages > 1);
+
+       action = g_action_map_lookup_action (G_ACTION_MAP (menu->priv->action_group),
+                                            "move_left");
+       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), page_num > 0);
+
+       action = g_action_map_lookup_action (G_ACTION_MAP (menu->priv->action_group),
+                                            "move_right");
+       g_simple_action_set_enabled (G_SIMPLE_ACTION (action), page_num < n_pages - 1);
 }
 
 static void
@@ -148,6 +157,7 @@ static void
 gedit_notebook_popup_menu_class_init (GeditNotebookPopupMenuClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+       GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
        object_class->get_property = gedit_notebook_popup_menu_get_property;
        object_class->set_property = gedit_notebook_popup_menu_set_property;
@@ -171,128 +181,120 @@ gedit_notebook_popup_menu_class_init (GeditNotebookPopupMenuClass *klass)
                                                              GEDIT_TYPE_TAB,
                                                              G_PARAM_READWRITE |
                                                              G_PARAM_CONSTRUCT_ONLY));
-}
 
-static void
-on_file_close_menuitem_activate (GtkMenuItem            *menuitem,
-                                 GeditNotebookPopupMenu *menu)
-{
-       _gedit_cmd_file_close_tab (menu->priv->tab, menu->priv->window);
-}
+       gtk_widget_class_set_template_from_resource (widget_class,
+                                                    "/org/gnome/gedit/ui/gedit-notebook-popup-menu.ui");
 
-static void
-on_move_to_new_tab_group_menuitem_activate (GtkMenuItem            *menuitem,
-                                            GeditNotebookPopupMenu *menu)
-{
-       _gedit_window_move_tab_to_new_tab_group (menu->priv->window,
-                                                menu->priv->tab);
+       gtk_widget_class_bind_template_child_private (widget_class, GeditNotebookPopupMenu, menu_model);
 }
 
 static void
-on_move_to_new_window_menuitem_activate (GtkMenuItem            *menuitem,
-                                         GeditNotebookPopupMenu *menu)
-{
-       _gedit_window_move_tab_to_new_window (menu->priv->window,
-                                             menu->priv->tab);
-}
-
-static void
-on_move_right_menuitem_activate (GtkMenuItem            *menuitem,
-                                 GeditNotebookPopupMenu *menu)
+on_move_left_activate (GSimpleAction *action,
+                       GVariant      *parameter,
+                       gpointer       user_data)
 {
+       GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data);
        GeditMultiNotebook *mnb;
        GtkNotebook *notebook;
        gint page_num;
-       gint n_pages;
 
        mnb = GEDIT_MULTI_NOTEBOOK (_gedit_window_get_multi_notebook (menu->priv->window));
 
        notebook = GTK_NOTEBOOK (gedit_multi_notebook_get_notebook_for_tab (mnb, menu->priv->tab));
-       n_pages = gtk_notebook_get_n_pages (notebook);
        page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (menu->priv->tab));
 
-       if (page_num <  (n_pages - 1))
+       if (page_num > 0)
        {
                gtk_notebook_reorder_child (notebook, GTK_WIDGET (menu->priv->tab),
-                                           page_num + 1);
+                                           page_num - 1);
        }
 }
 
 static void
-on_move_left_menuitem_activate (GtkMenuItem            *menuitem,
-                                GeditNotebookPopupMenu *menu)
+on_move_right_activate (GSimpleAction *action,
+                        GVariant      *parameter,
+                        gpointer       user_data)
 {
+       GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data);
        GeditMultiNotebook *mnb;
        GtkNotebook *notebook;
        gint page_num;
+       gint n_pages;
 
        mnb = GEDIT_MULTI_NOTEBOOK (_gedit_window_get_multi_notebook (menu->priv->window));
 
        notebook = GTK_NOTEBOOK (gedit_multi_notebook_get_notebook_for_tab (mnb, menu->priv->tab));
+       n_pages = gtk_notebook_get_n_pages (notebook);
        page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (menu->priv->tab));
 
-       if (page_num > 0)
+       if (page_num <  (n_pages - 1))
        {
                gtk_notebook_reorder_child (notebook, GTK_WIDGET (menu->priv->tab),
-                                           page_num - 1);
+                                           page_num + 1);
        }
 }
 
 static void
-gedit_notebook_popup_menu_init (GeditNotebookPopupMenu *menu)
+on_move_to_new_window_activate (GSimpleAction *action,
+                                GVariant      *parameter,
+                                gpointer       user_data)
 {
-       GtkWidget *menu_item;
+       GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data);
+
+       _gedit_window_move_tab_to_new_window (menu->priv->window,
+                                             menu->priv->tab);
+}
+
+static void
+on_move_to_new_tab_group_activate (GSimpleAction *action,
+                                   GVariant      *parameter,
+                                   gpointer       user_data)
+{
+       GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data);
+
+       _gedit_window_move_tab_to_new_tab_group (menu->priv->window,
+                                                menu->priv->tab);
+}
 
+static void
+on_close_activate (GSimpleAction *action,
+                   GVariant      *parameter,
+                   gpointer       user_data)
+{
+       GeditNotebookPopupMenu *menu = GEDIT_NOTEBOOK_POPUP_MENU (user_data);
+
+       _gedit_cmd_file_close_tab (menu->priv->tab, menu->priv->window);
+}
+
+static GActionEntry action_entries[] = {
+       { "move_left", on_move_left_activate },
+       { "move_right", on_move_right_activate },
+       { "move_to_new_window", on_move_to_new_window_activate },
+       { "move_to_new_tab_group", on_move_to_new_tab_group_activate },
+       { "close", on_close_activate }
+};
+
+static void
+gedit_notebook_popup_menu_init (GeditNotebookPopupMenu *menu)
+{
        menu->priv = gedit_notebook_popup_menu_get_instance_private (menu);
 
-       /* Keep in sync with the respective GtkActions */
-       menu_item = gtk_menu_item_new_with_mnemonic (_("_Close"));
-       g_signal_connect (menu_item, "activate",
-                         G_CALLBACK (on_file_close_menuitem_activate),
-                         menu);
-       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-       gtk_widget_show (menu_item);
-       menu->priv->close_item = menu_item;
-
-       menu_item = gtk_separator_menu_item_new ();
-       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-       gtk_widget_show (menu_item);
-
-       menu_item = gtk_menu_item_new_with_mnemonic (_("_Move to New Tab Group"));
-       g_signal_connect (menu_item, "activate",
-                         G_CALLBACK (on_move_to_new_tab_group_menuitem_activate),
-                         menu);
-       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-       gtk_widget_show (menu_item);
-       menu->priv->move_to_new_tab_group_item = menu_item;
-
-       menu_item = gtk_menu_item_new_with_mnemonic (_("_Move to New Window"));
-       g_signal_connect (menu_item, "activate",
-                         G_CALLBACK (on_move_to_new_window_menuitem_activate),
-                         menu);
-       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-       gtk_widget_show (menu_item);
-       menu->priv->move_to_new_window_item = menu_item;
-
-       menu_item = gtk_separator_menu_item_new ();
-       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-       gtk_widget_show (menu_item);
-
-       menu_item = gtk_menu_item_new_with_mnemonic (_("_Move Right"));
-       g_signal_connect (menu_item, "activate",
-                         G_CALLBACK (on_move_right_menuitem_activate),
-                         menu);
-       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-       gtk_widget_show (menu_item);
-       menu->priv->move_right_item = menu_item;
-
-       menu_item = gtk_menu_item_new_with_mnemonic (_("_Move Left"));
-       g_signal_connect (menu_item, "activate",
-                         G_CALLBACK (on_move_left_menuitem_activate),
-                         menu);
-       gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menu_item);
-       gtk_widget_show (menu_item);
-       menu->priv->move_left_item = menu_item;
+       gtk_widget_init_template (GTK_WIDGET (menu));
+
+       gtk_menu_shell_bind_model (GTK_MENU_SHELL (menu),
+                                  menu->priv->menu_model,
+                                  "popup",
+                                  TRUE);
+
+       menu->priv->action_group = g_simple_action_group_new ();
+       g_action_map_add_action_entries (G_ACTION_MAP (menu->priv->action_group),
+                                        action_entries,
+                                        G_N_ELEMENTS (action_entries),
+                                        menu);
+
+       gtk_widget_insert_action_group (GTK_WIDGET (menu),
+                                       "popup",
+                                       G_ACTION_GROUP (menu->priv->action_group));
 }
 
 GtkWidget *
diff --git a/gedit/gedit-notebook-popup-menu.ui b/gedit/gedit-notebook-popup-menu.ui
new file mode 100644
index 0000000..048825c
--- /dev/null
+++ b/gedit/gedit-notebook-popup-menu.ui
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.8 -->
+  <menu id="menu_model">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Move _Left</attribute>
+        <attribute name="action">move_left</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Move _Right</attribute>
+        <attribute name="action">move_right</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Move to New _Window</attribute>
+        <attribute name="action">move_to_new_window</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Move to New Tab _Group</attribute>
+        <attribute name="action">move_to_new_tab_group</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Close</attribute>
+        <attribute name="action">close</attribute>
+      </item>
+    </section>
+  </menu>
+  <template class="GeditNotebookPopupMenu" parent="GtkMenu">
+    <property name="visible">True</property>
+  </template>
+</interface>
diff --git a/gedit/gedit.gresource.xml b/gedit/gedit.gresource.xml
index 3c9758a..f5dce90 100644
--- a/gedit/gedit.gresource.xml
+++ b/gedit/gedit.gresource.xml
@@ -12,6 +12,7 @@
     <file preprocess="xml-stripblanks">gedit-view-frame.ui</file>
     <file preprocess="xml-stripblanks">gedit-highlight-mode-dialog.ui</file>
     <file preprocess="xml-stripblanks">gedit-window.ui</file>
+    <file preprocess="xml-stripblanks">gedit-notebook-popup-menu.ui</file>
     <file>gedit-style.css</file>
   </gresource>
 </gresources>


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