[meld/pathlabel] dirdiff: Move pane action bar to use MeldFileButton and PathLabel



commit 593b62c94ccbf18e1628519f1b200cf90dadd21b
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Sun Jan 17 08:32:11 2021 +1000

    dirdiff: Move pane action bar to use MeldFileButton and PathLabel
    
    The goal here is to make the folder comparisons action bar UI the same
    as the UI for file comparisons. We're also looking to fix the same kinds
    of problems that the file UI change fixes, namely: access to the full
    path, better overall display, and avoiding the deprecated
    GtkFileChooserButton.
    
    This change also moves to having a GObject property for the folders
    being compared. Currently we don't really make great use of this, but
    it gives us a starting point for migrating to a more property-driven
    model here.

 meld/dirdiff.py              | 54 +++++++++++++++++++++++++++++---------------
 meld/meldwindow.py           | 15 ++++++++----
 meld/resources/ui/dirdiff.ui | 51 +++++++++++++++++++++++++++++++----------
 3 files changed, 85 insertions(+), 35 deletions(-)
---
diff --git a/meld/dirdiff.py b/meld/dirdiff.py
index 78d893f6..09848700 100644
--- a/meld/dirdiff.py
+++ b/meld/dirdiff.py
@@ -22,9 +22,11 @@ import os
 import shutil
 import stat
 import sys
+import typing
 from collections import namedtuple
 from decimal import Decimal
 from mmap import ACCESS_COPY, mmap
+from typing import List, Optional
 
 from gi.repository import Gdk, Gio, GLib, GObject, Gtk
 
@@ -32,7 +34,7 @@ from gi.repository import Gdk, Gio, GLib, GObject, Gtk
 from meld import misc, tree
 from meld.conf import _
 from meld.const import FILE_FILTER_ACTION_FORMAT, MISSING_TIMESTAMP
-from meld.iohelpers import trash_or_confirm
+from meld.iohelpers import find_shared_parent_path, trash_or_confirm
 from meld.melddoc import MeldDoc, open_files_external
 from meld.misc import all_same, apply_text_filters, with_focused_pane
 from meld.recent import RecentType
@@ -46,6 +48,9 @@ from meld.ui.cellrenderers import (
 from meld.ui.emblemcellrenderer import EmblemCellRenderer
 from meld.ui.util import map_widgets_into_lists
 
+if typing.TYPE_CHECKING:
+    from meld.ui.pathlabel import PathLabel
+
 
 class StatItem(namedtuple('StatItem', 'mode size time')):
     __slots__ = ()
@@ -318,6 +323,11 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
             "should be applied when comparing file contents"),
         default=False,
     )
+    folders: List[Optional[Gio.File]] = GObject.Property(
+        type=object,
+        nick="Folders being compared",
+        blurb="List of folders being compared, as GFiles",
+    )
     ignore_blank_lines = GObject.Property(
         type=bool,
         nick="Ignore blank lines",
@@ -355,12 +365,13 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
     chunkmap0 = Gtk.Template.Child()
     chunkmap1 = Gtk.Template.Child()
     chunkmap2 = Gtk.Template.Child()
+    folder_label: 'List[PathLabel]'
+    folder_label0 = Gtk.Template.Child()
+    folder_label1 = Gtk.Template.Child()
+    folder_label2 = Gtk.Template.Child()
     treeview0 = Gtk.Template.Child()
     treeview1 = Gtk.Template.Child()
     treeview2 = Gtk.Template.Child()
-    fileentry0 = Gtk.Template.Child()
-    fileentry1 = Gtk.Template.Child()
-    fileentry2 = Gtk.Template.Child()
     scrolledwindow0 = Gtk.Template.Child()
     scrolledwindow1 = Gtk.Template.Child()
     scrolledwindow2 = Gtk.Template.Child()
@@ -456,6 +467,8 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
             '/org/gnome/meld/ui/dirdiff-actions.ui')
         self.toolbar_actions = builder.get_object('view-toolbar')
 
+        self.folders = [None, None, None]
+
         self.name_filters = []
         self.text_filters = []
         self.create_name_filters()
@@ -479,7 +492,7 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
         map_widgets_into_lists(
             self,
             [
-                "treeview", "fileentry", "scrolledwindow", "chunkmap",
+                "treeview", "folder_label", "scrolledwindow", "chunkmap",
                 "linkmap", "msgarea_mgr", "vbox", "dummy_toolbar_linkmap",
                 "pane_actionbar",
             ],
@@ -711,13 +724,23 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
             it = self.model.iter_parent(it)
 
     @Gtk.Template.Callback()
-    def on_fileentry_file_set(self, entry):
-        files = [e.get_file() for e in self.fileentry[:self.num_panes]]
-        paths = [f.get_path() for f in files]
-        self.set_locations(paths)
+    def on_file_selected(
+            self, button: Gtk.Button, pane: int, file: Gio.File) -> None:
+        self.folders[pane] = file
+        self.set_locations()
+
+    def set_locations(self) -> None:
+        locations = [f.get_path() for f in self.folders if f]
+        if not locations:
+            return
 
-    def set_locations(self, locations):
         self.set_num_panes(len(locations))
+
+        parent_path = find_shared_parent_path(self.folders)
+        for pane, folder in enumerate(self.folders):
+            self.folder_label[pane].set_file(folder)
+            self.folder_label[pane].set_parent_file(parent_path)
+
         # This is difficult to trigger, and to test. Most of the time here we
         # will actually have had UTF-8 from GTK, which has been unicode-ed by
         # the time we get this far. This is a fallback, and may be wrong!
@@ -726,13 +749,11 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
             if l and not isinstance(l, str):
                 locations[i] = l.decode(sys.getfilesystemencoding())
         locations = [os.path.abspath(l) if l else '' for l in locations]
+
         self.current_path = None
         self.model.clear()
         for m in self.msgarea_mgr:
             m.clear()
-        for pane, loc in enumerate(locations):
-            if loc:
-                self.fileentry[pane].set_filename(loc)
         child = self.model.add_entries(None, locations)
         self.treeview0.grab_focus()
         self._update_item_state(child)
@@ -1580,10 +1601,7 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
         self.num_panes = num_panes
 
     def refresh(self):
-        root = self.model.get_iter_first()
-        if root:
-            roots = self.model.value_paths(root)
-            self.set_locations(roots)
+        self.set_locations()
 
     def recompute_label(self):
         root = self.model.get_iter_first()
@@ -1672,7 +1690,7 @@ class DirDiff(Gtk.VBox, tree.TreeviewCommon, MeldDoc):
         self.next_diff(Gdk.ScrollDirection.DOWN)
 
     def action_refresh(self, *args):
-        self.on_fileentry_file_set(None)
+        self.refresh()
 
     def on_delete_event(self):
         meld_settings = get_meld_settings()
diff --git a/meld/meldwindow.py b/meld/meldwindow.py
index 0235a1e6..37140443 100644
--- a/meld/meldwindow.py
+++ b/meld/meldwindow.py
@@ -16,6 +16,7 @@
 
 import logging
 import os
+from typing import Optional, Sequence
 
 from gi.repository import Gdk, Gio, GLib, Gtk
 
@@ -356,12 +357,16 @@ class MeldWindow(Gtk.ApplicationWindow):
         doc.connect("diff-created", diff_created_cb)
         return doc
 
-    def append_dirdiff(self, gfiles, auto_compare=False):
-        dirs = [d.get_path() if d else None for d in gfiles]
-        assert len(dirs) in (1, 2, 3)
-        doc = DirDiff(len(dirs))
+    def append_dirdiff(
+        self,
+        gfiles: Sequence[Optional[Gio.File]],
+        auto_compare: bool = False,
+    ) -> DirDiff:
+        assert len(gfiles) in (1, 2, 3)
+        doc = DirDiff(len(gfiles))
         self._append_page(doc)
-        doc.set_locations(dirs)
+        doc.folders = gfiles
+        doc.set_locations()
         if auto_compare:
             doc.scheduler.add_task(doc.auto_compare)
         return doc
diff --git a/meld/resources/ui/dirdiff.ui b/meld/resources/ui/dirdiff.ui
index 63e174e9..a4530432 100644
--- a/meld/resources/ui/dirdiff.ui
+++ b/meld/resources/ui/dirdiff.ui
@@ -18,12 +18,21 @@
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <child>
-              <object class="GtkFileChooserButton" id="fileentry0">
+              <object class="MeldFileButton" id="folder_open_button0">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="hexpand">True</property>
-                <property name="action">select-folder</property>
-                <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
+                <property name="pane">0</property>
+                <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
+                <property name="dialog_label">Select Folder</property>
+                <property name="tooltip_text" translatable="yes">Select folder to open in this 
pane</property>
+                <signal name="file-selected" handler="on_file_selected" swapped="no"/>
+              </object>
+            </child>
+            <child type="center">
+              <object class="PathLabel" id="folder_label0">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Folder 1</property>
               </object>
             </child>
             <style>
@@ -40,12 +49,21 @@
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <child>
-              <object class="GtkFileChooserButton" id="fileentry1">
+              <object class="MeldFileButton" id="folder_open_button1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="pane">1</property>
+                <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
+                <property name="dialog_label">Select Folder</property>
+                <property name="tooltip_text" translatable="yes">Select folder to open in this 
pane</property>
+                <signal name="file-selected" handler="on_file_selected" swapped="no"/>
+              </object>
+            </child>
+            <child type="center">
+              <object class="PathLabel" id="folder_label1">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="hexpand">True</property>
-                <property name="action">select-folder</property>
-                <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
+                <property name="label" translatable="yes">Folder 2</property>
               </object>
             </child>
             <style>
@@ -62,12 +80,21 @@
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <child>
-              <object class="GtkFileChooserButton" id="fileentry2">
+              <object class="MeldFileButton" id="folder_open_button2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="pane">2</property>
+                <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
+                <property name="dialog_label">Select Folder</property>
+                <property name="tooltip_text" translatable="yes">Select folder to open in this 
pane</property>
+                <signal name="file-selected" handler="on_file_selected" swapped="no"/>
+              </object>
+            </child>
+            <child type="center">
+              <object class="PathLabel" id="folder_label2">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="hexpand">True</property>
-                <property name="action">select-folder</property>
-                <signal name="file-set" handler="on_fileentry_file_set" swapped="no"/>
+                <property name="label" translatable="yes">Folder 3</property>
               </object>
             </child>
             <style>


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