[meld/deprecation-cleanup] vcview: Migrate to template and resource loading



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]