[meld/deprecation-cleanup] vcview: Migrate to template and resource loading
- From: Kai Willadsen <kaiw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [meld/deprecation-cleanup] vcview: Migrate to template and resource loading
- Date: Sun, 9 Dec 2018 21:32:20 +0000 (UTC)
commit 6252d978a3a428bc06d0e35760f63bb5e542e505
Author: Kai Willadsen <kai willadsen gmail com>
Date: Sun Dec 9 07:38:05 2018 +1000
vcview: Migrate to template and resource loading
meld/resources/meld.gresource.xml | 1 +
{data => meld/resources}/ui/vcview.ui | 293 +++++++++++++++++-----------------
meld/vcview.py | 77 ++++++++-
3 files changed, 214 insertions(+), 157 deletions(-)
---
diff --git a/meld/resources/meld.gresource.xml b/meld/resources/meld.gresource.xml
index f34feb44..3512d3bd 100644
--- a/meld/resources/meld.gresource.xml
+++ b/meld/resources/meld.gresource.xml
@@ -19,5 +19,6 @@
<file>ui/push-dialog.ui</file>
<file>ui/revert-dialog.ui</file>
<file>ui/save-confirm-dialog.ui</file>
+ <file>ui/vcview.ui</file>
</gresource>
</gresources>
diff --git a/data/ui/vcview.ui b/meld/resources/ui/vcview.ui
similarity index 56%
rename from data/ui/vcview.ui
rename to meld/resources/ui/vcview.ui
index b8dad210..1b6c4376 100644
--- a/data/ui/vcview.ui
+++ b/meld/resources/ui/vcview.ui
@@ -129,221 +129,214 @@
</object>
</child>
</object>
- <object class="GtkWindow" id="container">
+ <template class="VcView" parent="GtkVBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="title" translatable="yes">window1</property>
<child>
- <object class="GtkVBox" id="vcview">
+ <object class="GtkToolbar" id="file_toolbar">
<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="GtkToolbar" id="file_toolbar">
+ <object class="GtkToolItem" id="fileentry_toolitem0">
<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>
+ <property name="margin-start">4</property>
+ <property name="margin-end">12</property>
<child>
- <object class="GtkToolItem" id="fileentry_toolitem0">
+ <object class="GtkFileChooserButton" id="fileentry">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin-start">4</property>
- <property name="margin-end">12</property>
- <child>
- <object class="GtkFileChooserButton" id="fileentry">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="action">select-folder</property>
- <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
- </object>
- </child>
+ <property name="action">select-folder</property>
+ <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
</object>
- <packing>
- <property name="expand">True</property>
- </packing>
</child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolItem" id="fileentry_toolitem1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-end">4</property>
<child>
- <object class="GtkToolItem" id="fileentry_toolitem1">
+ <object class="GtkComboBox" id="combobox_vcs">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin-end">4</property>
+ <property name="model">liststore_vcs</property>
+ <signal name="changed" handler="on_vc_change" swapped="no"/>
<child>
- <object class="GtkComboBox" id="combobox_vcs">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="model">liststore_vcs</property>
- <signal name="changed" handler="on_vc_change" swapped="no"/>
- <child>
- <object class="GtkCellRendererText">
- </object>
- <attributes>
- <attribute name="text">0</attribute>
- <attribute name="sensitive">2</attribute>
- </attributes>
- </child>
+ <object class="GtkCellRendererText">
</object>
+ <attributes>
+ <attribute name="text">0</attribute>
+ <attribute name="sensitive">2</attribute>
+ </attributes>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- </packing>
</child>
</object>
<packing>
<property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="MsgAreaController" id="msgarea_mgr">
- <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">1</property>
</packing>
</child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="MsgAreaController" id="msgarea_mgr">
+ <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">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkPaned" id="vc_console_vpaned">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="orientation">vertical</property>
+ <property name="position">250</property>
+ <style>
+ <class name="meld-vc-console-pane"/>
+ </style>
<child>
- <object class="GtkPaned" id="vc_console_vpaned">
+ <object class="GtkScrolledWindow" id="scrolledwindow">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="orientation">vertical</property>
- <property name="position">250</property>
- <style>
- <class name="meld-vc-console-pane"/>
- </style>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow">
+ <object class="GtkTreeView" id="treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <signal name="button-press-event" handler="on_treeview_button_press_event" swapped="no"/>
+ <signal name="cursor-changed" handler="on_treeview_cursor_changed" swapped="no"/>
+ <signal name="row-activated" handler="on_row_activated" swapped="no"/>
+ <signal name="popup-menu" handler="on_treeview_popup_menu" swapped="no"/>
<child>
- <object class="GtkTreeView" id="treeview">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <signal name="button-press-event" handler="on_treeview_button_press_event" swapped="no"/>
- <signal name="cursor-changed" handler="on_treeview_cursor_changed" swapped="no"/>
- <signal name="row-activated" handler="on_row_activated" swapped="no"/>
- <signal name="popup-menu" handler="on_treeview_popup_menu" swapped="no"/>
+ <object class="GtkTreeViewColumn" id="name_column">
+ <property name="title" translatable="yes">Name</property>
+ <property name="resizable">True</property>
<child>
- <object class="GtkTreeViewColumn" id="name_column">
- <property name="title" translatable="yes">Name</property>
- <property name="resizable">True</property>
- <child>
- <object class="EmblemCellRenderer" id="emblem_renderer"/>
- </child>
- <child>
- <object class="GtkCellRendererText" id="name_renderer"/>
- </child>
- </object>
+ <object class="EmblemCellRenderer" id="emblem_renderer"/>
</child>
<child>
- <object class="GtkTreeViewColumn" id="location_column">
- <property name="title" translatable="yes">Location</property>
- <property name="resizable">True</property>
- <child>
- <object class="GtkCellRendererText" id="location_renderer"/>
- </child>
- </object>
+ <object class="GtkCellRendererText" id="name_renderer"/>
</child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="location_column">
+ <property name="title" translatable="yes">Location</property>
+ <property name="resizable">True</property>
<child>
- <object class="GtkTreeViewColumn" id="status_column">
- <property name="title" translatable="yes">Status</property>
- <property name="resizable">True</property>
- <child>
- <object class="GtkCellRendererText" id="status_renderer"/>
- </child>
- </object>
+ <object class="GtkCellRendererText" id="location_renderer"/>
</child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="status_column">
+ <property name="title" translatable="yes">Status</property>
+ <property name="resizable">True</property>
<child>
- <object class="GtkTreeViewColumn" id="extra_column">
- <property name="title" translatable="yes">Extra</property>
- <property name="resizable">True</property>
- <child>
- <object class="GtkCellRendererText" id="extra_renderer"/>
- </child>
- </object>
+ <object class="GtkCellRendererText" id="status_renderer"/>
</child>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="treeview-selection">
- <property name="mode">multiple</property>
- </object>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="extra_column">
+ <property name="title" translatable="yes">Extra</property>
+ <property name="resizable">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="extra_renderer"/>
</child>
</object>
</child>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="treeview-selection">
+ <property name="mode">multiple</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="console_vbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Console output</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
</object>
<packing>
- <property name="resize">True</property>
- <property name="shrink">False</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkBox" id="console_vbox">
+ <object class="GtkScrolledWindow" id="console_scrolledwindow">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin-start">6</property>
- <property name="margin-end">6</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Console output</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
+ <property name="can_focus">True</property>
+ <property name="shadow_type">in</property>
<child>
- <object class="GtkScrolledWindow" id="console_scrolledwindow">
+ <object class="GtkTextView" id="consoleview">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="shadow_type">in</property>
- <child>
- <object class="GtkTextView" id="consoleview">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="cursor_visible">False</property>
- <signal name="populate-popup" handler="on_consoleview_populate_popup" swapped="no"/>
- </object>
- </child>
+ <property name="editable">False</property>
+ <property name="cursor_visible">False</property>
+ <signal name="populate-popup" handler="on_consoleview_populate_popup" swapped="no"/>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">6</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
<packing>
- <property name="resize">True</property>
- <property name="shrink">False</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">6</property>
+ <property name="position">1</property>
</packing>
</child>
</object>
<packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="pack_type">end</property>
- <property name="position">2</property>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
</packing>
</child>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">2</property>
+ </packing>
</child>
- </object>
+ </template>
<object class="GtkListStore" id="liststore_vcs">
<columns>
<!-- column-name gchararray1 -->
diff --git a/meld/vcview.py b/meld/vcview.py
index 957ac3b5..3792b3f7 100644
--- a/meld/vcview.py
+++ b/meld/vcview.py
@@ -37,7 +37,8 @@ from meld.melddoc import MeldDoc
from meld.misc import error_dialog, read_pipe_iter
from meld.recent import RecentType
from meld.settings import bind_settings, settings
-from meld.ui.gnomeglade import Component, ui_file
+from meld.ui._gtktemplate import Template
+from meld.ui.gnomeglade import ui_file
from meld.ui.vcdialogs import CommitDialog, PushDialog
from meld.vc import _null, get_vcs
from meld.vc._vc import Entry
@@ -119,7 +120,8 @@ class VcTreeStore(tree.DiffTreeStore):
return self.get_value(it, self.column_index(tree.COL_PATH, 0))
-class VcView(tree.TreeviewCommon, MeldDoc, Component):
+@Template(resource_path='/org/gnome/meld/ui/vcview.ui')
+class VcView(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
__gtype_name__ = "VcView"
@@ -129,6 +131,13 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
('vc-merge-file-order', 'merge-file-order'),
)
+ 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
+
status_filters = GObject.Property(
type=GObject.TYPE_STRV,
nick="File status filters",
@@ -150,18 +159,44 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
"ignored": ("VcShowIgnored", Entry.is_ignored),
}
+ combobox_vcs = Template.Child()
+ console_vbox = Template.Child()
+ consoleview = Template.Child()
+ emblem_renderer = Template.Child()
+ extra_column = Template.Child()
+ extra_renderer = Template.Child()
+ fileentry = Template.Child()
+ liststore_vcs = Template.Child()
+ location_column = Template.Child()
+ location_renderer = Template.Child()
+ name_column = Template.Child()
+ name_renderer = Template.Child()
+ status_column = Template.Child()
+ status_renderer = Template.Child()
+ treeview = Template.Child()
+ vc_console_vpaned = Template.Child()
+ VcviewActions = Template.Child()
+
def __init__(self):
+ 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, "vcview.ui", "vcview", ["VcviewActions", 'liststore_vcs'])
+ self.init_template()
bind_settings(self)
self.ui_file = ui_file("vcview-ui.xml")
self.actiongroup = self.VcviewActions
self.actiongroup.set_translation_domain("meld")
self.model = VcTreeStore()
- self.widget.connect("style-updated", self.model.on_style_updated)
- self.model.on_style_updated(self.widget)
+ self.connect("style-updated", self.model.on_style_updated)
+ self.model.on_style_updated(self)
self.treeview.set_model(self.model)
self.treeview.get_selection().connect(
"changed", self.on_treeview_selection_changed)
@@ -205,6 +240,10 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
self.actiongroup.get_action(
self.state_actions[s][0]).set_active(True)
+ # 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 _set_external_action_sensitivity(self, focused):
try:
self.main_actiongroup.get_action("OpenExternal").set_sensitive(
@@ -280,6 +319,7 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
self.combobox_vcs.set_sensitive(len(vcs_model) > 1)
self.combobox_vcs.set_active(default_active)
+ @Template.Callback()
def on_vc_change(self, combobox_vcs):
active_iter = combobox_vcs.get_active_iter()
if active_iter is None:
@@ -410,6 +450,7 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
self.treeview.expand_row(Gtk.TreePath.new_first(), False)
# TODO: This doesn't fire when the user selects a shortcut folder
+ @Template.Callback()
def on_fileentry_file_set(self, fileentry):
directory = fileentry.get_file()
path = directory.get_path()
@@ -420,6 +461,7 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
self.close_signal.emit(0)
return Gtk.ResponseType.OK
+ @Template.Callback()
def on_row_activated(self, treeview, path, tvc):
it = self.model.get_iter(path)
if self.model.iter_has_child(it):
@@ -495,6 +537,7 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
kwargs,
)
+ @Template.Callback()
def on_filter_state_toggled(self, button):
active_filters = [
k for k, (action_name, fn) in self.state_actions.items()
@@ -616,29 +659,34 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
for it in self._command_iter(command, files, refresh, working_dir):
pass
+ @Template.Callback()
def on_button_update_clicked(self, obj):
self.vc.update(self.runner)
+ @Template.Callback()
def on_button_push_clicked(self, obj):
response = PushDialog(self).run()
if response == Gtk.ResponseType.OK:
self.vc.push(self.runner)
+ @Template.Callback()
def on_button_commit_clicked(self, obj):
response, commit_msg = CommitDialog(self).run()
if response == Gtk.ResponseType.OK:
self.vc.commit(
self.runner, self._get_selected_files(), commit_msg)
+ @Template.Callback()
def on_button_add_clicked(self, obj):
self.vc.add(self.runner, self._get_selected_files())
+ @Template.Callback()
def on_button_remove_clicked(self, obj):
selected = self._get_selected_files()
if any(os.path.isdir(p) for p in selected):
# TODO: Improve and reuse this dialog for the non-VC delete action
dialog = Gtk.MessageDialog(
- parent=self.widget.get_toplevel(),
+ parent=self.get_toplevel(),
flags=(Gtk.DialogFlags.MODAL |
Gtk.DialogFlags.DESTROY_WITH_PARENT),
type=Gtk.MessageType.WARNING,
@@ -656,12 +704,15 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
self.vc.remove(self.runner, selected)
+ @Template.Callback()
def on_button_resolved_clicked(self, obj):
self.vc.resolve(self.runner, self._get_selected_files())
+ @Template.Callback()
def on_button_revert_clicked(self, obj):
self.vc.revert(self.runner, self._get_selected_files())
+ @Template.Callback()
def on_button_delete_clicked(self, obj):
files = self._get_selected_files()
for name in files:
@@ -680,6 +731,7 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
workdir = os.path.dirname(os.path.commonprefix(files))
self.refresh_partial(workdir)
+ @Template.Callback()
def on_button_diff_clicked(self, obj):
files = self._get_selected_files()
for f in files:
@@ -751,6 +803,7 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
break
return None
+ @Template.Callback()
def on_consoleview_populate_popup(self, textview, menu):
buf = textview.get_buffer()
clear_action = Gtk.MenuItem.new_with_label(_("Clear"))
@@ -760,6 +813,16 @@ class VcView(tree.TreeviewCommon, MeldDoc, Component):
menu.insert(Gtk.SeparatorMenuItem(), 1)
menu.show_all()
+ @Template.Callback()
+ def on_treeview_popup_menu(self, treeview):
+ tree.TreeviewCommon.on_treeview_popup_menu(self, treeview)
+
+ @Template.Callback()
+ def on_treeview_button_press_event(self, treeview, event):
+ tree.TreeviewCommon.on_treeview_button_press_event(
+ self, treeview, event)
+
+ @Template.Callback()
def on_treeview_cursor_changed(self, *args):
cursor_path, cursor_col = self.treeview.get_cursor()
if not cursor_path:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]