commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r9177 - trunk/gnue-forms/src/uidrivers/curses/widgets


From: johannes
Subject: [gnue] r9177 - trunk/gnue-forms/src/uidrivers/curses/widgets
Date: Tue, 19 Dec 2006 08:51:26 -0600 (CST)

Author: johannes
Date: 2006-12-19 08:51:26 -0600 (Tue, 19 Dec 2006)
New Revision: 9177

Modified:
   trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py
Log:
Selection and navigation keys in multiline edits


Modified: trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py      2006-12-19 
10:49:04 UTC (rev 9176)
+++ trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py      2006-12-19 
14:51:26 UTC (rev 9177)
@@ -22,6 +22,7 @@
 # $Id$
 
 import curses
+import sets
 
 from gnue.forms.uidrivers.curses.widgets import _base
 
@@ -511,13 +512,45 @@
         data = [''.ljust(self.width)] * self.height
         text = self.value or ''
 
+        selected = {}
+        stream = ''
+
+        if self.selection is not None:
+            sel1, sel2 = self.selection
+            sel_set = sets.Set(range(sel1, sel2+1))
+            gDebug(2, "SELECTION=%r %s" % (sel_set, sel2))
+
         for (row, line) in enumerate(text.splitlines()):
+            if self.selection is not None:
+                left = len(stream)
+                right = left + len(line)
+                current = sets.Set(range(left, right))
+                gDebug(2, "current: %r %r" % (line, current))
+                match = sel_set.intersection(current)
+                if match:
+                    mins = min(min(match) - left - self.__hoffs, 0)
+                    maxs = min(max(match) - left - self.__hoffs + 1, 
self.width)
+                    selected[row] = (mins, maxs)
+                    gDebug(2, "MATCH: %s/%s aus %s" % (mins, maxs, match))
+
+            stream += line + '\n'
+
             vrow = row - self.__voffs
             if (vrow >= 0) and (vrow < self.height):
                 data[vrow] = line[self.__hoffs:].ljust(self.width)[:self.width]
 
         for (row, line) in enumerate(data):
-            self.entry._parent.write(self.left, self.top + row, line,
+            vrow = row + self.__voffs
+            if vrow in selected:
+                sel1, sel2 = selected[vrow]
+                self.entry._parent.write(self.left, self.top + row,
+                        line[:sel1], self.attribute)
+                self.entry._parent.write(self.left + sel1, self.top + row,
+                        line[sel1:sel2], self.attribute + curses.A_STANDOUT)
+                self.entry._parent.write(self.left + sel2, self.top + row,
+                        line[sel2:], self.attribute)
+            else:
+                self.entry._parent.write(self.left, self.top + row, line,
                     self.attribute)
 
 
@@ -582,6 +615,56 @@
             self.entry._parent.move(self.left + col, self.top + row)
 
     # -------------------------------------------------------------------------
+
+    def _ui_set_selected_area_(self, selection1, selection2):
+        """
+        Set the current selection and repaint the widget
+        """
+
+        if selection1 == selection2:
+            self.selection = None
+        else:
+            self.selection = (selection1, selection2)
+            gDebug(2, "set selection: %s %s" % self.selection)
+
+        self._repaint_()
+
+
+    # -------------------------------------------------------------------------
+    # Check for navigation keys within text pad
+    # -------------------------------------------------------------------------
+
+    def _fkeypress(self, key, shift, ctrl, meta):
+        
+        result = False
+
+        if key == curses.KEY_UP and self.__vy > 0:
+            lines = (self.value or '').splitlines()[:self.__vy]
+            if lines:
+                last = lines[-1]
+                if len(last) > self.__vx:
+                    lines[-1] = last[:self.__vx]
+
+            self.entry._request('CURSORMOVE', position = len('\n'.join(lines)))
+            result = True
+
+        elif key == curses.KEY_DOWN:
+            lines = (self.value or '').splitlines()
+            if self.__vy < len(lines):
+                lines = lines[:self.__vy+2]
+                last = lines[-1]
+
+                if len(last) > self.__vx:
+                    lines[-1] = last[:self.__vx]
+
+                self.entry._request('CURSORMOVE',
+                        position = len('\n'.join(lines)))
+                result = True
+
+        return result
+
+
+    # -------------------------------------------------------------------------
     # Map a GF position into a row/column tuple suitable for cursor positioning
     # -------------------------------------------------------------------------
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]