[meld] meldapp: Initial support for app menu



commit c93fc12afedc2a4c88a6440c506e29e7e2fba971
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Sun Oct 6 12:34:26 2013 +1000

    meldapp: Initial support for app menu

 data/ui/application.ui |   73 ++++++++++++++++++++++++++++++++++++++++++++++++
 data/ui/meldapp-ui.xml |    8 -----
 data/ui/meldapp.ui     |   72 +++++++++++++++++------------------------------
 meld/meldapp.py        |   48 +++++++++++++++++++++++++++++++
 meld/meldwindow.py     |   66 +++++--------------------------------------
 5 files changed, 155 insertions(+), 112 deletions(-)
---
diff --git a/data/ui/application.ui b/data/ui/application.ui
new file mode 100644
index 0000000..403f60f
--- /dev/null
+++ b/data/ui/application.ui
@@ -0,0 +1,73 @@
+<?xml version="1.0"?>
+<!--*- mode: xml -*-->
+<interface>
+  <!-- interface-requires gtk+ 3.6 -->
+  <object class="GtkAboutDialog" id="aboutdialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">About Meld</property>
+    <property name="icon_name">meld</property>
+    <property name="type_hint">dialog</property>
+    <property name="program_name">Meld</property>
+    <property name="copyright" translatable="yes">Copyright © 2002-2009 Stephen Kennedy
+Copyright © 2009-2013 Kai Willadsen</property>
+    <property name="website" translatable="yes">http://meldmerge.org/</property>
+    <property name="website_label" translatable="yes">Website</property>
+    <property name="authors">Stephen Kennedy
+Kai Willadsen
+Vincent Legoll</property>
+    <property name="translator_credits" translatable="yes">translator-credits</property>
+    <property name="artists">GNOME Project
+Josef Vybíral</property>
+    <property name="logo_icon_name">meld</property>
+    <property name="license_type">gpl-2-0</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="aboutdialog-vbox1">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="aboutdialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+      </object>
+    </child>
+  </object>
+  <menu id='app-menu'>
+    <section>
+      <item>
+        <attribute name='label' translatable='yes'>_Preferences</attribute>
+        <attribute name='action'>app.preferences</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name='label' translatable='yes'>_Help</attribute>
+        <attribute name='action'>app.help</attribute>
+        <attribute name='accel'>F1</attribute>
+      </item>
+      <item>
+        <attribute name='label' translatable='yes'>_About Meld</attribute>
+        <attribute name='action'>app.about</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name='label' translatable='yes'>_Quit</attribute>
+        <attribute name='action'>app.quit</attribute>
+        <attribute name='accel'>&lt;Primary&gt;q</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/data/ui/meldapp-ui.xml b/data/ui/meldapp-ui.xml
index b013265..d987760 100644
--- a/data/ui/meldapp-ui.xml
+++ b/data/ui/meldapp-ui.xml
@@ -10,7 +10,6 @@
       <separator/>
       <menuitem action="Recent" />
       <menuitem action="Close" />
-      <menuitem action="Quit" />
     </menu>
     <menu action="EditMenu">
       <menuitem action="Undo"/>
@@ -26,8 +25,6 @@
       <menuitem action="FindNext"/>
       <menuitem action="FindPrevious"/>
       <menuitem action="Replace"/>
-      <separator/>
-      <menuitem name="Preferences" action="Preferences"/>
     </menu>
     <menu action="ChangesMenu">
       <menuitem action="PrevChange"/>
@@ -62,11 +59,6 @@
       <separator/>
       <placeholder name="TabPlaceholder" />
     </menu>
-    <menu action="HelpMenu">
-      <menuitem action="Help" />
-      <menuitem action="BugReport" />
-      <menuitem action="About" />
-    </menu>
   </menubar>
 
   <toolbar action="Toolbar">
diff --git a/data/ui/meldapp.ui b/data/ui/meldapp.ui
index 03aa479..b3c24ec 100644
--- a/data/ui/meldapp.ui
+++ b/data/ui/meldapp.ui
@@ -1,69 +1,49 @@
-<?xml version="1.0"?>
-<!--*- mode: xml -*-->
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <object class="GtkWindow" id="meldapp">
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkApplicationWindow" id="meldapp">
     <property name="height_request">400</property>
+    <property name="can_focus">False</property>
     <property name="title" translatable="yes">Meld</property>
-    <property name="icon-name">meld</property>
-    <signal handler="on_size_allocate" name="size_allocate"/>
-    <signal handler="on_delete_event" name="delete_event"/>
+    <property name="icon_name">meld</property>
+    <signal name="delete-event" handler="on_delete_event" swapped="no"/>
+    <signal name="size-allocate" handler="on_size_allocate" swapped="no"/>
     <child>
       <object class="GtkVBox" id="appvbox">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <child>
-          <object class="GtkNotebook" id="notebook">
+          <object class="MeldStatusBar" id="statusbar">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="scrollable">True</property>
-            <property name="enable_popup">True</property>
-            <signal handler="on_switch_page" name="switch_page"/>
-            <signal handler="after_switch_page" name="switch_page" after="True"/>
-            <signal handler="_update_notebook_menu" name="page-added"/>
-            <signal handler="_update_notebook_menu" name="page-removed"/>
-            <signal handler="_update_notebook_menu" name="page-reordered"/>
-            <signal handler="after_page_reordered" name="page-reordered" after="True"/>
           </object>
           <packing>
-            <property name="position">1</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
         <child>
-          <object class="MeldStatusBar" id="statusbar">
+          <object class="GtkNotebook" id="notebook">
             <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="scrollable">True</property>
+            <property name="enable_popup">True</property>
+            <signal name="page-reordered" handler="_update_notebook_menu" swapped="no"/>
+            <signal name="page-reordered" handler="after_page_reordered" after="yes" swapped="no"/>
+            <signal name="page-added" handler="_update_notebook_menu" swapped="no"/>
+            <signal name="switch-page" handler="on_switch_page" swapped="no"/>
+            <signal name="switch-page" handler="after_switch_page" after="yes" swapped="no"/>
+            <signal name="page-removed" handler="_update_notebook_menu" swapped="no"/>
           </object>
           <packing>
-            <property name="expand">False</property>
+            <property name="expand">True</property>
             <property name="fill">True</property>
-            <property name="position">0</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">1</property>
           </packing>
         </child>
       </object>
     </child>
   </object>
-  <object class="GtkAboutDialog" id="about">
-    <property name="visible">True</property>
-    <property name="border_width">5</property>
-    <property name="destroy_with_parent">True</property>
-    <property name="logo-icon-name">meld</property>
-    <property name="program-name">Meld</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="copyright" translatable="yes">Copyright &#xA9; 2002-2009 Stephen Kennedy
-Copyright &#xA9; 2009-2013 Kai Willadsen</property>
-    <property name="website">http://meldmerge.org/</property>
-    <property name="license" translatable="yes">Meld is free software: you can redistribute it and/or modify 
it under the terms of the GNU General Public License as published by the Free Software Foundation, either 
version 2 of the License, or (at your option) any later version.
-
-Meld is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
details. 
-
-You should have received a copy of the GNU General Public License along with this program.  If not, see 
&lt;http://www.gnu.org/licenses/&gt;.</property>
-    <property name="authors">Stephen Kennedy
-Kai Willadsen
-Vincent Legoll
-</property>
-    <property name="artists">GNOME Project
-Josef Vybíral</property>
-    <property name="translator-credits" translatable="yes">translator-credits</property>
-    <property name="wrap_license">True</property>
-  </object>
 </interface>
diff --git a/meld/meldapp.py b/meld/meldapp.py
index 5b96f8f..fa211e3 100644
--- a/meld/meldapp.py
+++ b/meld/meldapp.py
@@ -26,8 +26,12 @@ from gettext import gettext as _
 
 from gi.repository import Gio
 from gi.repository import GObject
+from gi.repository import Gdk
 from gi.repository import Gtk
 
+import meld.conf
+import meld.preferences
+import meld.ui.util
 from . import conf
 from . import filters
 from . import preferences
@@ -59,11 +63,55 @@ class MeldApp(Gtk.Application):
     def do_startup(self):
         Gtk.Application.do_startup(self)
 
+        prefs_action = Gio.SimpleAction.new("preferences", None)
+        prefs_action.connect("activate", self.preferences_callback)
+        self.add_action(prefs_action)
+        help_action = Gio.SimpleAction.new("help", None)
+        help_action.connect("activate", self.help_callback)
+        self.add_action(help_action)
+        about_action = Gio.SimpleAction.new("about", None)
+        about_action.connect("activate", self.about_callback)
+        self.add_action(about_action)
+        quit_action = Gio.SimpleAction.new("quit", None)
+        quit_action.connect("activate", self.quit_callback)
+        self.add_action(quit_action)
+
+        # TODO: Should not be necessary but Builder doesn't understand Menus
+        builder = meld.ui.util.get_builder("application.ui")
+        menu = builder.get_object("app-menu")
+        self.set_app_menu(menu)
+        # self.set_menubar()
+
     def do_activate(self):
         # Should be meldwindow.MeldWindow(self), and rely on the Application
         # to keep track
         self.window = meldwindow.MeldWindow()
         self.add_window(self.window.widget)
+        self.window.widget.show()
+
+    def preferences_callback(self, action, parameter):
+        meld.preferences.PreferencesDialog(self.get_active_window(),
+                                           self.prefs)
+
+    def help_callback(self, action, parameter):
+        Gtk.show_uri(Gdk.Screen.get_default(), "help:meld",
+                     Gtk.get_current_event_time())
+
+    def about_callback(self, action, parameter):
+        about = meld.ui.util.get_widget("application.ui", "aboutdialog")
+        about.set_version(meld.conf.__version__)
+        about.set_transient_for(self.get_active_window())
+        about.run()
+        about.destroy()
+
+    def quit_callback(self, action, parameter):
+        for window in self.get_windows():
+            cancelled = window.emit("delete-event",
+                                    Gdk.Event(Gdk.EventType.DELETE))
+            if cancelled:
+                return
+            window.destroy()
+        sys.exit(0)
 
     def on_preference_changed(self, key, val):
         if key == "filters":
diff --git a/meld/meldwindow.py b/meld/meldwindow.py
index 698c95e..255b7ba 100644
--- a/meld/meldwindow.py
+++ b/meld/meldwindow.py
@@ -24,14 +24,12 @@ from gi.repository import Gdk
 from gi.repository import Gtk
 from gi.repository import GObject
 
-from . import conf
 from . import dirdiff
 from . import filediff
 from . import filemerge
 from . import melddoc
 from . import misc
 from . import newdifftab
-from . import preferences
 from . import recent
 from . import task
 from . import vcview
@@ -71,9 +69,6 @@ class MeldWindow(gnomeglade.Component):
             ("Close", Gtk.STOCK_CLOSE, None, None,
                 _("Close the current file"),
                 self.on_menu_close_activate),
-            ("Quit", Gtk.STOCK_QUIT, None, None,
-                _("Quit the program"),
-                self.on_menu_quit_activate),
 
             ("EditMenu", None, _("_Edit")),
             ("Undo", Gtk.STOCK_UNDO, None, "<control>Z",
@@ -100,9 +95,6 @@ class MeldWindow(gnomeglade.Component):
                 _("_Replace..."), "<control>H",
                 _("Find and replace text"),
                 self.on_menu_replace_activate),
-            ("Preferences", Gtk.STOCK_PREFERENCES, _("Prefere_nces"), None,
-                _("Configure the application"),
-                self.on_menu_preferences_activate),
 
             ("ChangesMenu", None, _("_Changes")),
             ("NextChange", Gtk.STOCK_GO_DOWN, _("Next Change"), "<Alt>Down",
@@ -142,16 +134,6 @@ class MeldWindow(gnomeglade.Component):
                 _("Move Tab _Right"), "<Ctrl><Alt><Shift>Page_Down",
                 _("Move current tab to right"),
                 self.on_move_tab_next),
-
-            ("HelpMenu", None, _("_Help")),
-            ("Help", Gtk.STOCK_HELP, _("_Contents"), "F1",
-                _("Open the Meld manual"), self.on_menu_help_activate),
-            ("BugReport", Gtk.STOCK_DIALOG_WARNING, _("Report _Bug"), None,
-                _("Report a bug in Meld"),
-                self.on_menu_help_bug_activate),
-            ("About", Gtk.STOCK_ABOUT, None, None,
-                _("About this program"),
-                self.on_menu_about_activate),
         )
         toggleactions = (
             ("Fullscreen", None, _("Fullscreen"), "F11",
@@ -223,7 +205,6 @@ class MeldWindow(gnomeglade.Component):
         self.scheduler.connect("runnable", self.on_scheduler_runnable)
         self.widget.set_default_size(app.prefs.window_size_x, app.prefs.window_size_y)
         self.ui.ensure_update()
-        self.widget.show()
         self.diff_handler = None
         self.undo_handlers = tuple()
         self.widget.connect('focus_in_event', self.on_focus_change)
@@ -305,7 +286,14 @@ class MeldWindow(gnomeglade.Component):
     # General events and callbacks
     #
     def on_delete_event(self, *extra):
-        return self.on_menu_quit_activate()
+        # Delete pages from right-to-left.  This ensures that if a version
+        # control page is open in the far left page, it will be closed last.
+        for c in reversed(self.notebook.get_children()):
+            page = c.pyobject
+            self.notebook.set_current_page(self.notebook.page_num(page.widget))
+            response = self.try_remove_page(page, appquit=1)
+            if response == Gtk.ResponseType.CANCEL:
+                return True
 
     def has_pages(self):
         return self.notebook.get_n_pages() > 0
@@ -455,18 +443,6 @@ class MeldWindow(gnomeglade.Component):
             page = self.notebook.get_nth_page(i).pyobject
             self.try_remove_page(page)
 
-    def on_menu_quit_activate(self, *extra):
-        # Delete pages from right-to-left.  This ensures that if a version
-        # control page is open in the far left page, it will be closed last.
-        for c in reversed(self.notebook.get_children()):
-            page = c.pyobject
-            self.notebook.set_current_page(self.notebook.page_num(page.widget))
-            response = self.try_remove_page(page, appquit=1)
-            if response == Gtk.ResponseType.CANCEL:
-                return Gtk.ResponseType.CANCEL
-        Gtk.main_quit()
-        return Gtk.ResponseType.CLOSE
-
     #
     # Toolbar and menu items (edit)
     #
@@ -512,12 +488,6 @@ class MeldWindow(gnomeglade.Component):
         elif isinstance(widget, Gtk.TextView):
             widget.emit("paste-clipboard")
 
-    #
-    # Toolbar and menu items (settings)
-    #
-    def on_menu_preferences_activate(self, item):
-        preferences.PreferencesDialog(self.widget, app.prefs)
-
     def on_action_fullscreen_toggled(self, widget):
         is_full = self.widget.get_window().get_state() & Gdk.WindowState.FULLSCREEN
         if widget.get_active() and not is_full:
@@ -531,26 +501,6 @@ class MeldWindow(gnomeglade.Component):
     def on_menu_statusbar_toggled(self, widget):
         app.prefs.statusbar_visible = widget.get_active()
 
-    def on_menu_help_activate(self, button):
-        misc.open_uri("help:meld")
-
-    def on_menu_help_bug_activate(self, button):
-        misc.open_uri("http://bugzilla.gnome.org/buglist.cgi?query=product%3Ameld";)
-
-    def on_menu_about_activate(self, *extra):
-        builder = Gtk.Builder()
-        builder.set_translation_domain(conf.__package__)
-        ui_file = gnomeglade.ui_file("meldapp.ui")
-        builder.add_objects_from_file(ui_file, ["about"])
-        about = builder.get_object("about")
-        about.props.version = app.version
-        about.set_transient_for(self.widget)
-        about.run()
-        about.hide()
-
-    #
-    # Toolbar and menu items (misc)
-    #
     def on_menu_edit_down_activate(self, *args):
         self.current_doc().next_diff(Gdk.ScrollDirection.DOWN)
 


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