From 43398a55d959b12fb34a6cc9a7b2f14a0ecc9979 Mon Sep 17 00:00:00 2001
From: Sebastian Koslowski <koslowski@kit.edu>
Date: Thu, 7 Nov 2013 12:14:46 +0100
Subject: grc: make backspace chars work in TextDisplay

---
 grc/gui/Dialogs.py | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

(limited to 'grc/gui/Dialogs.py')

diff --git a/grc/gui/Dialogs.py b/grc/gui/Dialogs.py
index 5b3b420d3b..04e4f0a862 100644
--- a/grc/gui/Dialogs.py
+++ b/grc/gui/Dialogs.py
@@ -35,12 +35,32 @@ class TextDisplay(gtk.TextView):
         text_buffer = gtk.TextBuffer()
         text_buffer.set_text(text)
         self.set_text = text_buffer.set_text
-        self.insert = lambda line: text_buffer.insert(text_buffer.get_end_iter(), line)
         gtk.TextView.__init__(self, text_buffer)
         self.set_editable(False)
         self.set_cursor_visible(False)
         self.set_wrap_mode(gtk.WRAP_WORD_CHAR)
 
+    def insert(self, line):
+        # make backspaces work
+        line = self._consume_backspaces(line)
+        # add the remaining text to buffer
+        self.get_buffer().insert(self.get_buffer().get_end_iter(), line)
+
+    def _consume_backspaces(self, line):
+        """removes text from the buffer if line starts with \b*"""
+        if not line: return
+        # for each \b delete one char from the buffer
+        back_count = 0
+        start_iter = self.get_buffer().get_end_iter()
+        while line[back_count] == '\b':
+            # stop at the beginning of a line
+            if not start_iter.starts_line(): start_iter.backward_char()
+            back_count += 1
+        # remove chars
+        self.get_buffer().delete(start_iter, self.get_buffer().get_end_iter())
+        # return remaining text
+        return line[back_count:]
+
 def MessageDialogHelper(type, buttons, title=None, markup=None):
     """
     Create a modal message dialog and run it.
-- 
cgit v1.2.3