commit-gnue
[Top][All Lists]
Advanced

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

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


From: johannes
Subject: [gnue] r9176 - trunk/gnue-forms/src/uidrivers/curses/widgets
Date: Tue, 19 Dec 2006 04:49:05 -0600 (CST)

Author: johannes
Date: 2006-12-19 04:49:04 -0600 (Tue, 19 Dec 2006)
New Revision: 9176

Modified:
   trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py
Log:
Multiline text edit is capable of entering text now (although selection 
is still missing)


Modified: trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py      2006-12-19 
09:51:34 UTC (rev 9175)
+++ trunk/gnue-forms/src/uidrivers/curses/widgets/entry.py      2006-12-19 
10:49:04 UTC (rev 9176)
@@ -490,6 +490,19 @@
 class MultiLineTextEntry(TextEntry):
 
     # -------------------------------------------------------------------------
+    # Constructor
+    # -------------------------------------------------------------------------
+
+    def __init__(self, entry, row_offset):
+
+        BaseEntry.__init__(self, entry, row_offset)
+
+        self.selection = None
+        self.__vx = self.__vy = 0            # Virtual cursor position
+        self.__hoffs = self.__voffs = 0      # Offset of the top/left cell
+
+
+    # -------------------------------------------------------------------------
     # Draw the widget
     # -------------------------------------------------------------------------
 
@@ -499,7 +512,9 @@
         text = self.value or ''
 
         for (row, line) in enumerate(text.splitlines()):
-            data[row] = line[self.offset:].ljust(self.width)[:self.width]
+            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,
@@ -520,21 +535,50 @@
         if not self.entry.ready():
             return
 
+        gDebug(2, "S=%s/%s, H=%s, V=%s" % (self.width, self.height,
+            self.__hoffs, self.__voffs))
         (row, col) = self.__position_to_coord(position)
-        if col > self.width - 1:
-            self.offset = col - self.width + 1
+        self.__vx = col
+        self.__vy = row
+
+        delta_x = col - self.__hoffs
+        delta_y = row - self.__voffs
+
+        gDebug(2, "ch/rv: %s/%s" % (delta_x, delta_y))
+
+        if (delta_x) > self.width - 1:
+            self.__hoffs = col - self.width + 1
             col = self.width - 1
+            gDebug(2, "New HOFFS: %s" % self.__hoffs)
             need_repaint = True
 
-        elif col < 0:
-            self.offset += col
+        elif (delta_x) < 0:
+            self.__hoffs += delta_x
             col = 0
+            gDebug(2, "New HOFFS: %s" % self.__hoffs)
             need_repaint = True
+        else:
+            col -= self.__hoffs
 
+        if delta_y > self.height - 1:
+            self.__voffs = row - self.height + 1
+            gDebug(2, "New VOFFS: %s" % self.__voffs)
+            row = self.height - 1
+            need_repaint = True
+
+        elif delta_y < 0:
+            self.__voffs += delta_y
+            gDebug(2, "New VOFFS: %s" % self.__voffs)
+            row = 0
+            need_repaint = True
+        else:
+            row -= self.__voffs
+
         if need_repaint:
             self._repaint_()
 
         if self.has_focus:
+            gDebug(2, "Point to: %s/%s" % (col, row))
             self.entry._parent.move(self.left + col, self.top + row)
 
     # -------------------------------------------------------------------------
@@ -543,12 +587,13 @@
 
     def __position_to_coord(self, position):
 
-        part = (self.value or '')[self.offset:position]
+        part = (self.value or '')[:position]
         paragraph = part.count('\n')
         offset = position
         if paragraph > 0:
             offset = len(part.split('\n')[-1])
 
+        gDebug(2, "pos2virt: %s %s/%s" % (position, paragraph, offset))
         return (paragraph, offset)
 
 





reply via email to

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