[meld] meldapp: Initial support for app menu
- From: Kai Willadsen <kaiw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [meld] meldapp: Initial support for app menu
- Date: Mon, 14 Oct 2013 21:10:00 +0000 (UTC)
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'><Primary>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 © 2002-2009 Stephen Kennedy
-Copyright © 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
<http://www.gnu.org/licenses/>.</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]