[meld] Support setting TextViews to read-only (closes bgo#321637)



commit f8d65a8cf49b2ce10e98e62143c59271168f72d9
Author: Kai Willadsen <kai willadsen gmail com>
Date:   Mon Dec 17 06:53:12 2012 +1000

    Support setting TextViews to read-only (closes bgo#321637)
    
    While we already have support for handling read-only buffers,
    introduced as part of auto-merge mode, we haven't actually used this in
    regular comparisons until now. The reason it wasn't used is that
    editing files you can't write to can still be useful in resolving
    conflicts, by eliminating or simplifying differences.
    
    In order to accommodate both the use case of simpler and more
    consistent actions, and the occasional need to edit read-only files,
    this commit introduces a toggleable lock indicator for read-only files
    which both indicates read-only status (and thus obsoletes our previous
    read-only indicator) and allows the user to lock or unlock read-only
    files.
    
    This commit also changes default behaviour, so that read-only files are
    now uneditable by default.

 meld/filediff.py   |   29 ++++++++++++++++++++++-------
 meld/meldbuffer.py |    1 +
 2 files changed, 23 insertions(+), 7 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index ef82966..f3334a3 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -161,7 +161,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         self.map_widgets_into_lists(["textview", "fileentry", "diffmap",
                                      "scrolledwindow", "linkmap",
                                      "statusimage", "msgarea_mgr", "vbox",
-                                     "selector_hbox"])
+                                     "selector_hbox", "readonlytoggle"])
 
         # This SizeGroup isn't actually necessary for FileDiff; it's for
         # handling non-homogenous selectors in FileComp. It's also fragile.
@@ -350,8 +350,8 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
                 buf.disconnect(h)
 
     def _connect_buffer_handlers(self):
-        for textview in self.textview:
-            textview.set_editable(1)
+        for textview, buf in zip(self.textview, self.textbuffer):
+            textview.set_editable(buf.data.editable)
         for buf in self.textbuffer:
             id0 = buf.connect("insert-text", self.on_text_insert_text)
             id1 = buf.connect("delete-range", self.on_text_delete_range)
@@ -962,8 +962,6 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
                     stock = gtk.STOCK_SAVE
                 else:
                     stock = gtk.STOCK_SAVE_AS
-            elif not self.textbuffer[i].data.writable:
-                stock = gtk.STOCK_NO
             if stock:
                 self.statusimage[i].show()
                 self.statusimage[i].set_from_stock(stock, gtk.ICON_SIZE_MENU)
@@ -1446,14 +1444,26 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         dialog = patchdialog.PatchDialog(self)
         dialog.run()
 
-    def set_buffer_writable(self, buf, yesno):
-        buf.data.writable = yesno
+    def set_buffer_writable(self, buf, writable):
+        buf.data.writable = writable
         self.recompute_label()
+        index = self.textbuffer.index(buf)
+        self.readonlytoggle[index].set_visible(not writable)
+        self.set_buffer_editable(buf, writable)
 
     def set_buffer_modified(self, buf, yesno):
         buf.data.modified = yesno
         self.recompute_label()
 
+    def set_buffer_editable(self, buf, editable):
+        buf.data.editable = editable
+        index = self.textbuffer.index(buf)
+        self.readonlytoggle[index].set_active(not editable)
+        self.textview[index].set_editable(editable)
+        self.on_current_diff_changed(self)
+        for linkmap in self.linkmap:
+            linkmap.queue_draw()
+
     def save(self):
         pane = self._get_focused_pane()
         if pane >= 0:
@@ -1512,6 +1522,11 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         self.actiongroup.get_action("LockScrolling").set_active(locked)
         self._scroll_lock = not locked
 
+    def on_readonly_button_toggled(self, button):
+        index = self.readonlytoggle.index(button)
+        buf = self.textbuffer[index]
+        self.set_buffer_editable(buf, not button.get_active())
+
         #
         # scrollbars
         #
diff --git a/meld/meldbuffer.py b/meld/meldbuffer.py
index 07e7cd0..5049eb3 100644
--- a/meld/meldbuffer.py
+++ b/meld/meldbuffer.py
@@ -77,6 +77,7 @@ class MeldBufferData(object):
     def __init__(self, filename=None):
         self.modified = False
         self.writable = True
+        self.editable = True
         self.filename = filename
         self.savefile = None
         self._label = filename



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