[Top][All Lists]
[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
# -------------------------------------------------------------------------
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r9177 - trunk/gnue-forms/src/uidrivers/curses/widgets,
johannes <=