[meld/deprecation-cleanup] filediff: Move to template and resource loading



commit a15453d9584fa1f5c973d2b1188f5044dd69b907
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Mon Dec 10 06:01:55 2018 +1000

    filediff: Move to template and resource loading

 data/ui/filediff.ui           | 738 ------------------------------------------
 meld/filediff.py              | 122 ++++++-
 meld/resources/ui/filediff.ui | 731 +++++++++++++++++++++++++++++++++++++++++
 meld/sourceview.py            |   2 +-
 4 files changed, 842 insertions(+), 751 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index c0cd67da..607bbd27 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -42,8 +42,10 @@ from meld.recent import RecentType
 from meld.settings import bind_settings, meldsettings
 from meld.sourceview import (
     get_custom_encoding_candidates, LanguageManager, TextviewLineAnimationType)
+from meld.ui._gtktemplate import Template
 from meld.ui.findbar import FindBar
-from meld.ui.gnomeglade import Component, ui_file
+from meld.ui.gnomeglade import ui_file
+from meld.ui.util import map_widgets_into_lists
 from meld.undo import UndoSequence
 
 
@@ -89,11 +91,19 @@ class CursorDetails:
             setattr(self, var, None)
 
 
-class FileDiff(MeldDoc, Component):
+@Template(resource_path='/org/gnome/meld/ui/filediff.ui')
+class FileDiff(Gtk.VBox, MeldDoc):
     """Two or three way comparison of text files"""
 
     __gtype_name__ = "FileDiff"
 
+    close_signal = MeldDoc.close_signal
+    create_diff_signal = MeldDoc.create_diff_signal
+    file_changed_signal = MeldDoc.file_changed_signal
+    label_changed = MeldDoc.label_changed
+    next_diff_changed_signal = MeldDoc.next_diff_changed_signal
+    tab_state_changed = MeldDoc.tab_state_changed
+
     __gsettings_bindings__ = (
         ('ignore-blank-lines', 'ignore-blank-lines'),
     )
@@ -105,6 +115,53 @@ class FileDiff(MeldDoc, Component):
         default=False,
     )
 
+    actiongroup = Template.Child('FilediffActions')
+    diffmap0 = Template.Child()
+    diffmap1 = Template.Child()
+    dummy_toolbar_diffmap0 = Template.Child()
+    dummy_toolbar_diffmap1 = Template.Child()
+    dummy_toolbar_linkmap0 = Template.Child()
+    dummy_toolbar_linkmap1 = Template.Child()
+    fileentry0 = Template.Child()
+    fileentry1 = Template.Child()
+    fileentry2 = Template.Child()
+    fileentry_toolitem0 = Template.Child()
+    fileentry_toolitem1 = Template.Child()
+    fileentry_toolitem2 = Template.Child()
+    file_save_button0 = Template.Child()
+    file_save_button1 = Template.Child()
+    file_save_button2 = Template.Child()
+    file_toolbar0 = Template.Child()
+    file_toolbar1 = Template.Child()
+    file_toolbar2 = Template.Child()
+    filelabel0 = Template.Child()
+    filelabel1 = Template.Child()
+    filelabel2 = Template.Child()
+    filelabel_toolitem0 = Template.Child()
+    filelabel_toolitem1 = Template.Child()
+    filelabel_toolitem2 = Template.Child()
+    grid = Template.Child()
+    msgarea_mgr0 = Template.Child()
+    msgarea_mgr1 = Template.Child()
+    msgarea_mgr2 = Template.Child()
+    readonlytoggle0 = Template.Child()
+    readonlytoggle1 = Template.Child()
+    readonlytoggle2 = Template.Child()
+    scrolledwindow0 = Template.Child()
+    scrolledwindow1 = Template.Child()
+    scrolledwindow2 = Template.Child()
+    statusbar0 = Template.Child()
+    statusbar1 = Template.Child()
+    statusbar2 = Template.Child()
+    linkmap0 = Template.Child()
+    linkmap1 = Template.Child()
+    textview0 = Template.Child()
+    textview1 = Template.Child()
+    textview2 = Template.Child()
+    vbox0 = Template.Child()
+    vbox1 = Template.Child()
+    vbox2 = Template.Child()
+
     differ = Differ
 
     keylookup = {
@@ -128,11 +185,17 @@ class FileDiff(MeldDoc, Component):
     }
 
     def __init__(self, num_panes):
-        """Start up an filediff with num_panes empty contents.
-        """
+        super().__init__()
+        # FIXME:
+        # This unimaginable hack exists because GObject (or GTK+?)
+        # doesn't actually correctly chain init calls, even if they're
+        # not to GObjects. As a workaround, we *should* just be able to
+        # put our class first, but because of Gtk.Template we can't do
+        # that if it's a GObject, because GObject doesn't support
+        # multiple inheritance and we need to inherit from our Widget
+        # parent to make Template work.
         MeldDoc.__init__(self)
-        Component.__init__(
-            self, "filediff.ui", "filediff", ["FilediffActions"])
+        self.init_template()
         bind_settings(self)
 
         widget_lists = [
@@ -142,7 +205,7 @@ class FileDiff(MeldDoc, Component):
             "dummy_toolbar_linkmap", "filelabel_toolitem", "filelabel",
             "fileentry_toolitem", "dummy_toolbar_diffmap", "statusbar",
         ]
-        self.map_widgets_into_lists(widget_lists)
+        map_widgets_into_lists(self, widget_lists)
 
         self.warned_bad_comparison = False
         self._keymask = 0
@@ -181,7 +244,6 @@ class FileDiff(MeldDoc, Component):
             buf.data.file_changed_signal.connect(self.notify_file_changed)
 
         self.ui_file = ui_file("filediff-ui.xml")
-        self.actiongroup = self.FilediffActions
         self.actiongroup.set_translation_domain("meld")
 
         # Alternate keybindings for a few commands.
@@ -278,6 +340,10 @@ class FileDiff(MeldDoc, Component):
 
         self.connect("notify::ignore-blank-lines", self.refresh_comparison)
 
+        # FIXME: Awful migration hack; this means that we don't have to
+        # address `.pyobject` access before all tab types are updated.
+        self.pyobject = self
+
     def on_container_switch_in_event(self, ui):
         MeldDoc.on_container_switch_in_event(self, ui)
 
@@ -308,6 +374,7 @@ class FileDiff(MeldDoc, Component):
         self.emit("action-mode-changed", mode)
     keymask = property(get_keymask, set_keymask)
 
+    @Template.Callback()
     def on_key_event(self, object, event):
         keymap = Gdk.Keymap.get_default()
         ok, keyval, group, lvl, consumed = keymap.translate_keyboard_state(
@@ -520,6 +587,7 @@ class FileDiff(MeldDoc, Component):
             mark0, mark1, 'focus-highlight', 400000, starting_alpha=0.3,
             anim_type=TextviewLineAnimationType.stroke)
 
+    @Template.Callback()
     def on_linkmap_scroll_event(self, linkmap, event):
         self.next_diff(event.direction)
 
@@ -528,9 +596,11 @@ class FileDiff(MeldDoc, Component):
                   else self.cursor.prev)
         self.go_to_chunk(target, centered=centered)
 
+    @Template.Callback()
     def action_previous_conflict(self, *args):
         self.go_to_chunk(self.cursor.prev_conflict, self.cursor.pane)
 
+    @Template.Callback()
     def action_next_conflict(self, *args):
         self.go_to_chunk(self.cursor.next_conflict, self.cursor.pane)
 
@@ -556,37 +626,45 @@ class FileDiff(MeldDoc, Component):
         dst = src + direction
         return (dst, src) if reverse else (src, dst)
 
+    @Template.Callback()
     def action_push_change_left(self, *args):
         src, dst = self.get_action_panes(PANE_LEFT)
         self.replace_chunk(src, dst, self.get_action_chunk(src, dst))
 
+    @Template.Callback()
     def action_push_change_right(self, *args):
         src, dst = self.get_action_panes(PANE_RIGHT)
         self.replace_chunk(src, dst, self.get_action_chunk(src, dst))
 
+    @Template.Callback()
     def action_pull_change_left(self, *args):
         src, dst = self.get_action_panes(PANE_LEFT, reverse=True)
         self.replace_chunk(src, dst, self.get_action_chunk(src, dst))
 
+    @Template.Callback()
     def action_pull_change_right(self, *args):
         src, dst = self.get_action_panes(PANE_RIGHT, reverse=True)
         self.replace_chunk(src, dst, self.get_action_chunk(src, dst))
 
+    @Template.Callback()
     def action_copy_change_left_up(self, *args):
         src, dst = self.get_action_panes(PANE_LEFT)
         self.copy_chunk(
             src, dst, self.get_action_chunk(src, dst), copy_up=True)
 
+    @Template.Callback()
     def action_copy_change_right_up(self, *args):
         src, dst = self.get_action_panes(PANE_RIGHT)
         self.copy_chunk(
             src, dst, self.get_action_chunk(src, dst), copy_up=True)
 
+    @Template.Callback()
     def action_copy_change_left_down(self, *args):
         src, dst = self.get_action_panes(PANE_LEFT)
         self.copy_chunk(
             src, dst, self.get_action_chunk(src, dst), copy_up=False)
 
+    @Template.Callback()
     def action_copy_change_right_down(self, *args):
         src, dst = self.get_action_panes(PANE_RIGHT)
         self.copy_chunk(
@@ -608,14 +686,17 @@ class FileDiff(MeldDoc, Component):
             self._sync_vscroll(self.scrolledwindow[src].get_vadjustment(), src)
         self.scheduler.add_task(resync)
 
+    @Template.Callback()
     def action_pull_all_changes_left(self, *args):
         src, dst = self.get_action_panes(PANE_LEFT, reverse=True)
         self.pull_all_non_conflicting_changes(src, dst)
 
+    @Template.Callback()
     def action_pull_all_changes_right(self, *args):
         src, dst = self.get_action_panes(PANE_RIGHT, reverse=True)
         self.pull_all_non_conflicting_changes(src, dst)
 
+    @Template.Callback()
     def merge_all_non_conflicting_changes(self, *args):
         dst = 1
         merger = Merger()
@@ -633,6 +714,7 @@ class FileDiff(MeldDoc, Component):
             self._sync_vscroll(self.scrolledwindow[0].get_vadjustment(), 0)
         self.scheduler.add_task(resync)
 
+    @Template.Callback()
     @with_focused_pane
     def delete_change(self, pane, *args):
         chunk = self.linediffer.get_chunk(self.cursor.chunk, pane)
@@ -741,11 +823,13 @@ class FileDiff(MeldDoc, Component):
         new_line = self._corresponding_chunk_line(chunk, line, pane, new_pane)
         self.move_cursor(new_pane, new_line)
 
+    @Template.Callback()
     def action_prev_pane(self, *args):
         pane = self._get_focused_pane()
         new_pane = (pane - 1) % self.num_panes
         self.move_cursor_pane(pane, new_pane)
 
+    @Template.Callback()
     def action_next_pane(self, *args):
         pane = self._get_focused_pane()
         new_pane = (pane + 1) % self.num_panes
@@ -775,6 +859,7 @@ class FileDiff(MeldDoc, Component):
                     self.set_file(pane, gfiles[0])
             return True
 
+    @Template.Callback()
     def on_textview_focus_in_event(self, view, event):
         self.focus_pane = view
         self.findbar.textview = view
@@ -784,6 +869,7 @@ class FileDiff(MeldDoc, Component):
         self._set_external_action_sensitivity()
         self.update_text_actions_sensitivity()
 
+    @Template.Callback()
     def on_textview_focus_out_event(self, view, event):
         self.keymask = 0
         self._set_merge_action_sensitivity()
@@ -852,7 +938,7 @@ class FileDiff(MeldDoc, Component):
             builder = Gtk.Builder.new_from_resource(
                 '/org/gnome/meld/ui/save-confirm-dialog.ui')
             dialog = builder.get_object('save-confirm-dialog')
-            dialog.set_transient_for(self.widget.get_toplevel())
+            dialog.set_transient_for(self.get_toplevel())
             message_area = dialog.get_message_area()
 
             buttons = []
@@ -890,7 +976,7 @@ class FileDiff(MeldDoc, Component):
                 buttons = ((_("Cancel"), Gtk.ResponseType.CANCEL),
                            (_("Mark _Resolved"), Gtk.ResponseType.OK))
                 resolve_response = misc.modal_dialog(
-                    primary, secondary, buttons, parent=self.widget,
+                    primary, secondary, buttons, parent=self,
                     messagetype=Gtk.MessageType.QUESTION)
 
                 if resolve_response == Gtk.ResponseType.OK:
@@ -1008,6 +1094,7 @@ class FileDiff(MeldDoc, Component):
     def on_go_to_line_activate(self, pane, *args):
         self.statusbar[pane].emit('start-go-to-line')
 
+    @Template.Callback()
     def on_scrolledwindow_size_allocate(self, scrolledwindow, allocation):
         index = self.scrolledwindow.index(scrolledwindow)
         if index == 0 or index == 1:
@@ -1015,6 +1102,7 @@ class FileDiff(MeldDoc, Component):
         if index == 1 or index == 2:
             self.linkmap[1].queue_draw()
 
+    @Template.Callback()
     def on_textview_popup_menu(self, textview):
         buffer = textview.get_buffer()
         cursor_it = buffer.get_iter_at_mark(buffer.get_insert())
@@ -1033,6 +1121,7 @@ class FileDiff(MeldDoc, Component):
         )
         return True
 
+    @Template.Callback()
     def on_textview_button_press_event(self, textview, event):
         if event.button == 3:
             textview.grab_focus()
@@ -1557,7 +1646,7 @@ class FileDiff(MeldDoc, Component):
                 prompt = _("Save Middle Pane As")
             else:
                 prompt = _("Save Right Pane As")
-            gfile = prompt_save_filename(prompt, self.widget)
+            gfile = prompt_save_filename(prompt, self)
             if not gfile:
                 return False
             bufdata.label = gfile.get_path()
@@ -1643,6 +1732,7 @@ class FileDiff(MeldDoc, Component):
         else:
             self.state = ComparisonState.Normal
 
+    @Template.Callback()
     def make_patch(self, *extra):
         dialog = PatchDialog(self)
         dialog.run()
@@ -1673,15 +1763,18 @@ class FileDiff(MeldDoc, Component):
     def save_as(self, pane):
         self.save_file(pane, saveas=True)
 
+    @Template.Callback()
     def on_save_all_activate(self, action):
         for i in range(self.num_panes):
             if self.textbuffer[i].get_modified():
                 self.save_file(i)
 
+    @Template.Callback()
     def on_file_save_button_clicked(self, button):
         idx = self.file_save_button.index(button)
         self.save_file(idx)
 
+    @Template.Callback()
     def on_fileentry_file_set(self, entry):
         pane = self.fileentry[:self.num_panes].index(entry)
         buffer = self.textbuffer[pane]
@@ -1707,7 +1800,7 @@ class FileDiff(MeldDoc, Component):
         builder = Gtk.Builder.new_from_resource(
             '/org/gnome/meld/ui/revert-dialog.ui')
         dialog = builder.get_object('revert_dialog')
-        dialog.set_transient_for(self.widget.get_toplevel())
+        dialog.set_transient_for(self.get_toplevel())
 
         filelist = Gtk.Label("\n".join(["\t• " + f for f in unsaved]))
         filelist.props.xalign = 0.0
@@ -1719,6 +1812,7 @@ class FileDiff(MeldDoc, Component):
         dialog.destroy()
         return response == Gtk.ResponseType.OK
 
+    @Template.Callback()
     def on_revert_activate(self, *extra):
         if not self.check_unsaved_changes():
             return
@@ -1739,6 +1833,7 @@ class FileDiff(MeldDoc, Component):
         self.diffmap0.queue_draw()
         self.diffmap1.queue_draw()
 
+    @Template.Callback()
     def on_action_lock_scrolling_toggled(self, action):
         self.toggle_scroll_lock(action.get_active())
 
@@ -1746,6 +1841,7 @@ class FileDiff(MeldDoc, Component):
         self.actiongroup.get_action("LockScrolling").set_active(locked)
         self._scroll_lock = not locked
 
+    @Template.Callback()
     def on_readonly_button_toggled(self, button):
         index = self.readonlytoggle.index(button)
         buf = self.textbuffer[index]
@@ -1962,6 +2058,7 @@ class FileDiff(MeldDoc, Component):
         self.textview[src].add_fading_highlight(
             mark0, mark1, 'conflict', 500000)
 
+    @Template.Callback()
     @with_focused_pane
     def add_sync_point(self, pane, action):
         # Find a non-complete syncpoint, or create a new one
@@ -2012,6 +2109,7 @@ class FileDiff(MeldDoc, Component):
 
         self.refresh_comparison()
 
+    @Template.Callback()
     def clear_sync_points(self, action):
         self.syncpoints = []
         self.linediffer.syncpoints = []
diff --git a/meld/resources/ui/filediff.ui b/meld/resources/ui/filediff.ui
new file mode 100644
index 00000000..d2e061d3
--- /dev/null
+++ b/meld/resources/ui/filediff.ui
@@ -0,0 +1,731 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <!-- interface-requires meld.ui.gladesupport 0.0 -->
+  <object class="GtkActionGroup" id="FilediffActions">
+    <child>
+      <object class="GtkAction" id="MakePatch">
+        <property name="label" translatable="yes">Format as Patch…</property>
+        <property name="tooltip" translatable="yes">Create a patch using differences between files</property>
+        <signal name="activate" handler="make_patch" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkAction" id="SaveAll">
+        <property name="label" translatable="yes">Save A_ll</property>
+        <property name="tooltip" translatable="yes">Save all files in the current comparison</property>
+        <signal name="activate" handler="on_save_all_activate" swapped="no"/>
+      </object>
+      <accelerator key="L" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="Revert">
+        <property name="tooltip" translatable="yes">Revert files to their saved versions</property>
+        <property name="stock_id">gtk-revert-to-saved</property>
+        <signal name="activate" handler="on_revert_activate" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkAction" id="SplitAdd">
+        <property name="label" translatable="yes">Add Synchronization Point</property>
+        <property name="tooltip" translatable="yes">Add a synchronization point for changes between 
files</property>
+        <signal name="activate" handler="add_sync_point" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkAction" id="SplitClear">
+        <property name="label" translatable="yes">Clear Synchronization Points</property>
+        <property name="tooltip" translatable="yes">Clear sychronization points for changes between 
files</property>
+        <signal name="activate" handler="clear_sync_points" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkAction" id="PrevConflict">
+        <property name="label" translatable="yes">Previous Conflict</property>
+        <property name="tooltip" translatable="yes">Go to the previous conflict</property>
+        <signal name="activate" handler="action_previous_conflict" swapped="no"/>
+      </object>
+      <accelerator key="I" modifiers="GDK_CONTROL_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="NextConflict">
+        <property name="label" translatable="yes">Next Conflict</property>
+        <property name="tooltip" translatable="yes">Go to the next conflict</property>
+        <signal name="activate" handler="action_next_conflict" swapped="no"/>
+      </object>
+      <accelerator key="K" modifiers="GDK_CONTROL_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="PushLeft">
+        <property name="label" translatable="yes">Push to Left</property>
+        <property name="tooltip" translatable="yes">Push current change to the left</property>
+        <property name="stock_id">gtk-go-back</property>
+        <signal name="activate" handler="action_push_change_left" swapped="no"/>
+      </object>
+      <accelerator key="Left" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="PushRight">
+        <property name="label" translatable="yes">Push to Right</property>
+        <property name="tooltip" translatable="yes">Push current change to the right</property>
+        <property name="stock_id">gtk-go-forward</property>
+        <signal name="activate" handler="action_push_change_right" swapped="no"/>
+      </object>
+      <accelerator key="Right" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <!-- FIXME: using LAST and FIRST is terrible and unreliable icon abuse -->
+    <child>
+      <object class="GtkAction" id="PullLeft">
+        <property name="label" translatable="yes">Pull from Left</property>
+        <property name="tooltip" translatable="yes">Pull change from the left</property>
+        <property name="stock_id">gtk-goto-last</property>
+        <signal name="activate" handler="action_pull_change_left" swapped="no"/>
+      </object>
+      <accelerator key="Right" modifiers="GDK_MOD1_MASK | GDK_SHIFT_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="PullRight">
+        <property name="label" translatable="yes">Pull from Right</property>
+        <property name="tooltip" translatable="yes">Pull change from the right</property>
+        <property name="stock_id">gtk-goto-first</property>
+        <signal name="activate" handler="action_pull_change_right" swapped="no"/>
+      </object>
+      <accelerator key="Left" modifiers="GDK_MOD1_MASK | GDK_SHIFT_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="CopyLeftUp">
+        <property name="label" translatable="yes">Copy Above Left</property>
+        <property name="tooltip" translatable="yes">Copy change above the left chunk</property>
+        <signal name="activate" handler="action_copy_change_left_up" swapped="no"/>
+      </object>
+      <accelerator key="bracketleft" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="CopyLeftDown">
+        <property name="label" translatable="yes">Copy Below Left</property>
+        <property name="tooltip" translatable="yes">Copy change below the left chunk</property>
+        <signal name="activate" handler="action_copy_change_left_down" swapped="no"/>
+      </object>
+      <accelerator key="semicolon" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="CopyRightUp">
+        <property name="label" translatable="yes">Copy Above Right</property>
+        <property name="tooltip" translatable="yes">Copy change above the right chunk</property>
+        <signal name="activate" handler="action_copy_change_right_up" swapped="no"/>
+      </object>
+      <accelerator key="bracketright" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="CopyRightDown">
+        <property name="label" translatable="yes">Copy Below Right</property>
+        <property name="tooltip" translatable="yes">Copy change below the right chunk</property>
+        <signal name="activate" handler="action_copy_change_right_down" swapped="no"/>
+      </object>
+      <accelerator key="quoteright" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="Delete">
+        <property name="label" translatable="yes">Delete</property>
+        <property name="tooltip" translatable="yes">Delete change</property>
+        <property name="stock_id">gtk-delete</property>
+        <signal name="activate" handler="delete_change" swapped="no"/>
+      </object>
+      <accelerator key="Delete" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="MergeFromLeft">
+        <property name="label" translatable="yes">Merge All from Left</property>
+        <property name="tooltip" translatable="yes">Merge all non-conflicting changes from the 
left</property>
+        <signal name="activate" handler="action_pull_all_changes_left" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkAction" id="MergeFromRight">
+        <property name="label" translatable="yes">Merge All from Right</property>
+        <property name="tooltip" translatable="yes">Merge all non-conflicting changes from the 
right</property>
+        <signal name="activate" handler="action_pull_all_changes_right" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkAction" id="MergeAll">
+        <property name="label" translatable="yes">Merge All</property>
+        <property name="tooltip" translatable="yes">Merge all non-conflicting changes from left and right 
panes</property>
+        <signal name="activate" handler="merge_all_non_conflicting_changes" swapped="no"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkAction" id="PrevPane">
+        <property name="label" translatable="yes">Previous Pane</property>
+        <property name="tooltip" translatable="yes">Move keyboard focus to the previous document in this 
comparison</property>
+        <signal name="activate" handler="action_prev_pane" swapped="no"/>
+      </object>
+      <accelerator key="Page_Up" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkAction" id="NextPane">
+        <property name="label" translatable="yes">Next Pane</property>
+        <property name="tooltip" translatable="yes">Move keyboard focus to the next document in this 
comparison</property>
+        <signal name="activate" handler="action_next_pane" swapped="no"/>
+      </object>
+      <accelerator key="Page_Down" modifiers="GDK_MOD1_MASK"/>
+    </child>
+    <child>
+      <object class="GtkToggleAction" id="LockScrolling">
+        <property name="label" translatable="yes">Lock Scrolling</property>
+        <property name="tooltip" translatable="yes">Lock scrolling of all panes</property>
+        <property name="active">True</property>
+        <signal name="toggled" handler="on_action_lock_scrolling_toggled" swapped="no"/>
+      </object>
+    </child>
+  </object>
+  <template class="FileDiff" parent="GtkVBox">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <signal name="key-press-event" handler="on_key_event" swapped="no"/>
+    <signal name="key-release-event" handler="on_key_event" swapped="no"/>
+    <child>
+      <object class="DiffGrid" id="grid">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="margin_top">0</property>
+        <property name="row_spacing">0</property>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <placeholder/>
+        </child>
+        <child>
+          <object class="GtkToolbar" id="file_toolbar2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="show-arrow">False</property>
+            <property name="icon-size">1</property>
+            <style>
+              <class name="meld-notebook-toolbar"/>
+            </style>
+            <child>
+              <object class="GtkToggleToolButton" id="readonlytoggle2">
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="tooltip_text" translatable="yes">This file can not be written to. You may 
click here to unlock this file and make changes anyway, but these changes must be saved to a new 
file.</property>
+                <property name="icon_name">changes-prevent-symbolic</property>
+                <signal name="toggled" handler="on_readonly_button_toggled" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolButton" id="file_save_button2">
+                <property name="icon-name">document-save</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <signal name="clicked" handler="on_file_save_button_clicked" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolItem" id="fileentry_toolitem2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <child>
+                  <object class="GtkFileChooserButton" id="fileentry2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="local-only">False</property>
+                    <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkToolItem" id="filelabel_toolitem2">
+                <property name="visible">False</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="margin-start">12</property>
+                <child>
+                  <object class="GtkLabel" id="filelabel2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">File 3</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">5</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkToolbar" id="file_toolbar1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="show-arrow">False</property>
+            <property name="icon-size">1</property>
+            <style>
+              <class name="meld-notebook-toolbar"/>
+            </style>
+            <child>
+              <object class="GtkToggleToolButton" id="readonlytoggle1">
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="tooltip_text" translatable="yes">This file can not be written to. You may 
click here to unlock this file and make changes anyway, but these changes must be saved to a new 
file.</property>
+                <property name="icon_name">emblem-readonly</property>
+                <signal name="toggled" handler="on_readonly_button_toggled" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolButton" id="file_save_button1">
+                <property name="icon-name">document-save-symbolic</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <signal name="clicked" handler="on_file_save_button_clicked" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolItem" id="fileentry_toolitem1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <child>
+                  <object class="GtkFileChooserButton" id="fileentry1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="local-only">False</property>
+                    <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkToolItem" id="filelabel_toolitem1">
+                <property name="visible">False</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="margin-start">12</property>
+                <child>
+                  <object class="GtkLabel" id="filelabel1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">File 2</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">3</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkToolbar" id="file_toolbar0">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="show-arrow">False</property>
+            <property name="icon-size">1</property>
+            <style>
+              <class name="meld-notebook-toolbar"/>
+            </style>
+            <child>
+              <object class="GtkToggleToolButton" id="readonlytoggle0">
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="tooltip_text" translatable="yes">This file can not be written to. You may 
click here to unlock this file and make changes anyway, but these changes must be saved to a new 
file.</property>
+                <property name="icon_name">emblem-readonly</property>
+                <signal name="toggled" handler="on_readonly_button_toggled" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolButton" id="file_save_button0">
+                <property name="icon-name">document-save-symbolic</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <signal name="clicked" handler="on_file_save_button_clicked" swapped="no"/>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolItem" id="fileentry_toolitem0">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <child>
+                  <object class="GtkFileChooserButton" id="fileentry0">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="local-only">False</property>
+                    <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkToolItem" id="filelabel_toolitem0">
+                <property name="visible">False</property>
+                <property name="can_focus">False</property>
+                <property name="receives_default">False</property>
+                <property name="margin-start">12</property>
+                <child>
+                  <object class="GtkLabel" id="filelabel0">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">File 1</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox0">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="MsgAreaController" id="msgarea_mgr0">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow0">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="vexpand">True</property>
+                <property name="hexpand">True</property>
+                <property name="vscrollbar_policy">always</property>
+                <property name="overlay-scrolling">False</property>
+                <property name="window_placement">top-right</property>
+                <property name="window_placement_set">True</property>
+                <signal name="size-allocate" handler="on_scrolledwindow_size_allocate" swapped="no"/>
+                <child>
+                  <object class="MeldSourceView" id="textview0">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <signal name="button-press-event" handler="on_textview_button_press_event" swapped="no"/>
+                    <signal name="key-release-event" handler="on_key_event" swapped="no"/>
+                    <signal name="key-press-event" handler="on_key_event" swapped="no"/>
+                    <signal name="focus-in-event" handler="on_textview_focus_in_event" swapped="no"/>
+                    <signal name="focus-out-event" handler="on_textview_focus_out_event" swapped="no"/>
+                    <signal name="popup-menu" handler="on_textview_popup_menu" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="top_attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="MsgAreaController" id="msgarea_mgr2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="vexpand">True</property>
+                <property name="hexpand">True</property>
+                <property name="vscrollbar_policy">always</property>
+                <property name="overlay-scrolling">False</property>
+                <signal name="size-allocate" handler="on_scrolledwindow_size_allocate" swapped="no"/>
+                <child>
+                  <object class="MeldSourceView" id="textview2">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <signal name="button-press-event" handler="on_textview_button_press_event" swapped="no"/>
+                    <signal name="key-release-event" handler="on_key_event" swapped="no"/>
+                    <signal name="key-press-event" handler="on_key_event" swapped="no"/>
+                    <signal name="focus-in-event" handler="on_textview_focus_in_event" swapped="no"/>
+                    <signal name="focus-out-event" handler="on_textview_focus_out_event" swapped="no"/>
+                    <signal name="popup-menu" handler="on_textview_popup_menu" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">5</property>
+            <property name="top_attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="MsgAreaController" id="msgarea_mgr1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="vexpand">True</property>
+                <property name="hexpand">True</property>
+                <property name="vscrollbar_policy">always</property>
+                <property name="overlay-scrolling">False</property>
+                <signal name="size-allocate" handler="on_scrolledwindow_size_allocate" swapped="no"/>
+                <child>
+                  <object class="MeldSourceView" id="textview1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <signal name="button-press-event" handler="on_textview_button_press_event" swapped="no"/>
+                    <signal name="key-release-event" handler="on_key_event" swapped="no"/>
+                    <signal name="key-press-event" handler="on_key_event" swapped="no"/>
+                    <signal name="focus-in-event" handler="on_textview_focus_in_event" swapped="no"/>
+                    <signal name="focus-out-event" handler="on_textview_focus_out_event" swapped="no"/>
+                    <signal name="popup-menu" handler="on_textview_popup_menu" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="left_attach">3</property>
+            <property name="top_attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkToolbar" id="dummy_toolbar_diffmap1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <style>
+              <class name="meld-notebook-toolbar"/>
+            </style>
+          </object>
+          <packing>
+            <property name="left_attach">6</property>
+            <property name="top_attach">0</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="DiffMap" id="diffmap1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="left_attach">6</property>
+            <property name="top_attach">1</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkToolbar" id="dummy_toolbar_linkmap0">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <style>
+              <class name="meld-notebook-toolbar"/>
+            </style>
+          </object>
+          <packing>
+            <property name="left_attach">2</property>
+            <property name="top_attach">0</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="LinkMap" id="linkmap0">
+            <property name="width_request">50</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | 
GDK_KEY_RELEASE_MASK | GDK_SCROLL_MASK</property>
+            <signal name="scroll-event" handler="on_linkmap_scroll_event" swapped="no"/>
+          </object>
+          <packing>
+            <property name="left_attach">2</property>
+            <property name="top_attach">1</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkToolbar" id="dummy_toolbar_diffmap0">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <style>
+              <class name="meld-notebook-toolbar"/>
+            </style>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">0</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="DiffMap" id="diffmap0">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+          </object>
+          <packing>
+            <property name="left_attach">0</property>
+            <property name="top_attach">1</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkToolbar" id="dummy_toolbar_linkmap1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <style>
+              <class name="meld-notebook-toolbar"/>
+            </style>
+          </object>
+          <packing>
+            <property name="left_attach">4</property>
+            <property name="top_attach">0</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="LinkMap" id="linkmap1">
+            <property name="width_request">50</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | 
GDK_KEY_RELEASE_MASK | GDK_SCROLL_MASK</property>
+            <signal name="scroll-event" handler="on_linkmap_scroll_event" swapped="no"/>
+          </object>
+          <packing>
+            <property name="left_attach">4</property>
+            <property name="top_attach">1</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="MeldStatusBar" id="statusbar0">
+            <property name="visible">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="top_attach">3</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="MeldStatusBar" id="statusbar1">
+            <property name="visible">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">3</property>
+            <property name="top_attach">3</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="MeldStatusBar" id="statusbar2">
+            <property name="visible">True</property>
+          </object>
+          <packing>
+            <property name="left_attach">5</property>
+            <property name="top_attach">3</property>
+            <property name="width">1</property>
+            <property name="height">1</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+  </template>
+</interface>
diff --git a/meld/sourceview.py b/meld/sourceview.py
index 41d88908..d3173be6 100644
--- a/meld/sourceview.py
+++ b/meld/sourceview.py
@@ -113,7 +113,7 @@ class MeldSourceView(GtkSource.View):
         if show == self._show_line_numbers:
             return
 
-        if self.line_renderer:
+        if getattr(self, 'line_renderer', None):
             self.line_renderer.set_visible(show)
 
         self._show_line_numbers = bool(show)


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