From 4a2762d146e2b19b981bd734827308c742d34c1a Mon Sep 17 00:00:00 2001 From: "Andrew M. Kuchling" Date: Sun, 20 Jan 2008 00:00:38 +0000 Subject: Patch #1048820 from Stefan Wehr: add insert-mode editing to Textbox. Fix an off-by-one error I noticed. --- Doc/whatsnew/2.6.rst | 7 +++++-- Lib/curses/textpad.py | 36 +++++++++++++++++++++++++----------- Misc/ACKS | 1 + Misc/NEWS | 4 ++++ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index e386b36..83101bd 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -868,16 +868,19 @@ complete list of changes, or look through the CVS logs for all the details. .. Revision 57769 - * A new method in the :mod:`curses` module: for a window, :meth:`chgat` changes the display characters for a certain number of characters on a single line. + (Contributed by Fabian Kreutz.) :: # Boldface text starting at y=0,x=21 # and affecting the rest of the line. stdscr.chgat(0,21, curses.A_BOLD) - (Contributed by Fabian Kreutz.) + The :class:`Textbox` class in the :mod:`curses.textpad` module + now supports editing in insert mode as well as overwrite mode. + Insert mode is enabled by supplying a true value for the *insert_mode* + parameter when creating the :class:`Textbox` instance. * The :mod:`decimal` module was updated to version 1.66 of `the General Decimal Specification `__. New features diff --git a/Lib/curses/textpad.py b/Lib/curses/textpad.py index 120c572..54acc15 100644 --- a/Lib/curses/textpad.py +++ b/Lib/curses/textpad.py @@ -39,8 +39,9 @@ class Textbox: KEY_LEFT = Ctrl-B, KEY_RIGHT = Ctrl-F, KEY_UP = Ctrl-P, KEY_DOWN = Ctrl-N KEY_BACKSPACE = Ctrl-h """ - def __init__(self, win): + def __init__(self, win, insert_mode=False): self.win = win + self.insert_mode = insert_mode (self.maxy, self.maxx) = win.getmaxyx() self.maxy = self.maxy - 1 self.maxx = self.maxx - 1 @@ -49,9 +50,10 @@ class Textbox: win.keypad(1) def _end_of_line(self, y): - "Go to the location of the first blank on the given line." + """Go to the location of the first blank on the given line, + returning the index of the last non-blank character.""" last = self.maxx - while 1: + while True: if ascii.ascii(self.win.inch(y, last)) != ascii.SP: last = min(self.maxx, last+1) break @@ -60,19 +62,31 @@ class Textbox: last = last - 1 return last + def _insert_printable_char(self, ch): + (y, x) = self.win.getyx() + if y < self.maxy or x < self.maxx: + if self.insert_mode: + oldch = self.win.inch() + # The try-catch ignores the error we trigger from some curses + # versions by trying to write into the lowest-rightmost spot + # in the window. + try: + self.win.addch(ch) + except curses.error: + pass + if self.insert_mode: + (backy, backx) = self.win.getyx() + if ascii.isprint(oldch): + self._insert_printable_char(oldch) + self.win.move(backy, backx) + def do_command(self, ch): "Process a single editing command." (y, x) = self.win.getyx() self.lastcmd = ch if ascii.isprint(ch): if y < self.maxy or x < self.maxx: - # The try-catch ignores the error we trigger from some curses - # versions by trying to write into the lowest-rightmost spot - # in the window. - try: - self.win.addch(ch) - except curses.error: - pass + self._insert_printable_char(ch) elif ch == ascii.SOH: # ^a self.win.move(y, 0) elif ch in (ascii.STX,curses.KEY_LEFT, ascii.BS,curses.KEY_BACKSPACE): @@ -139,7 +153,7 @@ class Textbox: if stop == 0 and self.stripspaces: continue for x in range(self.maxx+1): - if self.stripspaces and x == stop: + if self.stripspaces and x > stop: break result = result + chr(ascii.ascii(self.win.inch(y, x))) if self.maxy > 0: diff --git a/Misc/ACKS b/Misc/ACKS index 5c87ed1..36b7d44 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -696,6 +696,7 @@ Bob Watson Aaron Watters Henrik Weber Corran Webster +Stefan Wehr Zack Weinberg Edward Welbourne Cliff Wells diff --git a/Misc/NEWS b/Misc/NEWS index e988fc7..fcc56b4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -390,6 +390,10 @@ Library - #1837: The queue module now also supports a LIFO queue and a priority queue. +- Patch #1048820: Add insert-mode editing to curses.textpad.Textbox + (patch by Stefan Wehr). Also, fix an off-by-one bug in + Textbox.gather(). + - Issue #1831: ctypes now raises a TypeError if conflicting positional and named arguments are passed to a Structure or Union initializer. When too many positional arguments are passed, also a TypeError is -- cgit v0.12