[meld/deprecation-cleanup] filediff: Move to template and resource loading
- From: Kai Willadsen <kaiw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [meld/deprecation-cleanup] filediff: Move to template and resource loading
- Date: Sun, 9 Dec 2018 21:32:31 +0000 (UTC)
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]