diff options
Diffstat (limited to 'src/editor.py')
| -rw-r--r-- | src/editor.py | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/src/editor.py b/src/editor.py index 83a964c..a1225bf 100644 --- a/src/editor.py +++ b/src/editor.py @@ -43,6 +43,23 @@ def ctrl(key): return chr(ord(key) - ord('@')) +class jump(): ## Lowercase + ''' + Create a cursor jump that can either be included in a print statement + as a string or invoked + + @param y:int The row, 1 based + @param x:int The column, 1 based + @string :str|()→void Functor that can be treated as a string for jumping + ''' + def __init__(self, y, x): + self.string = '\033[%i;%iH' % (y, x) + def __str__(self): + return self.string + def __call__(self): + print(self.string, end = '') + + class TextArea(): ''' GNU Emacs alike text area @@ -83,13 +100,13 @@ class TextArea(): self.area, self.name, self.text, self.y = area, name, text, y def draw(self): - leftside = '\033[%i;%iH\033[%s34m%s:\033[00m' % (self.area.top + self.y, self.area.left, '01;' if self.area.y == self.y else '', self.name) + leftside = '%s\033[%s34m%s:\033[00m' % (jump(self.area.top + self.y, self.area.left), '01;' if self.area.y == self.y else '', self.name) text = (self.text[self.area.offx if self.area.y == self.y else 0:] + ' ' * self.area.areawidth)[:self.area.areawidth] if (self.area.y == self.y) and (self.area.mark is not None) and (self.area.mark >= 0): (a, b) = self.area.get_selection(True) if a != b: text = text[:a] + ('\033[44;37m%s\033[00m' % text[a : b]) + text[b:] - print('%s\033[%i;%iH%s' % (leftside, self.area.top + self.y, self.area.left + self.area.innerleft, text), end='') + print('%s%s%s' % (leftside, jump(self.area.top + self.y, self.area.left + self.area.innerleft), text), end='') def copy(self): if (self.area.mark is not None) and (self.area.mark >= 0) and (self.area.mark != self.area.x): @@ -99,7 +116,7 @@ class TextArea(): self.area.killring[:] = self.area.killring[1:] (a, b) = self.area.get_selection(True) text = self.text[self.area.offx:][:self.area.areawidth][a : b] - print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft + a, text), end='') + print('%s%s' % (jump(self.area.top + self.y, self.area.left + self.area.innerleft + a), text), end='') self.area.mark = None return True else: @@ -131,7 +148,7 @@ class TextArea(): if self.area.offx > len(self.text): self.area.offx = max(len(self.text) - self.area.areawidth, 0) self.area.mark = None - print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft, ' ' * self.area.areawidth), end='') + print('%s%s' % (jump(self.area.top + self.y, self.area.left + self.area.innerleft), ' ' * self.area.areawidth), end='') self.draw() return True removed = b - a @@ -144,7 +161,7 @@ class TextArea(): text = self.text[self.area.offx:][:self.area.areawidth] a = limit(0, self.area.x - self.area.offx, self.area.areawidth) left = self.area.left + self.area.innerleft + a - print('\033[%i;%iH%s\033[%i;%iH' % (self.area.top + self.y, left, text[a:] + ' ' * removed, self.area.top + self.y, left), end='') + print('%s%s%s' % (jump(self.area.top + self.y, left), text[a:] + ' ' * removed, jump(self.area.top + self.y, left)), end='') return True def erase(self): @@ -156,7 +173,7 @@ class TextArea(): if self.area.x < self.area.offx: self.area.offx = max(self.area.offx - self.area.areawidth, 0) self.draw() - print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='') + jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)() self.delete() return True @@ -171,9 +188,9 @@ class TextArea(): self.area.x += len(yanked) if self.area.x > self.area.offx + self.area.areawidth: self.area.offx = len(self.text) - self.area.areawidth - print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft, ' ' * self.area.areawidth), end='') + print('%s%s' % (jump(self.area.top + self.y, self.area.left + self.area.innerleft), ' ' * self.area.areawidth), end='') self.draw() - print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='') + jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)() return True def yank_cycle(self): @@ -197,14 +214,14 @@ class TextArea(): self.area.offx = self.area.x - self.area.areawidth self.area.offx = max(self.area.offx, 0) self.draw() - print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='') + jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)() else: print('\033[%iD' % -delta, end='') elif delta > 0: if self.area.x - self.area.offx > self.area.areawidth: self.area.offx = self.area.x self.draw() - print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft), end='') + jump(self.area.top + self.y, self.area.left + self.area.innerleft)() else: print('\033[%iC' % delta, end='') return delta != 0 @@ -232,14 +249,15 @@ class TextArea(): if not override: y = self.area.top + self.y xi = self.area.left + self.area.innerleft - print('\033[%i;%iH\033[%iP' % (y, xi + self.area.areawidth - len(insert), len(insert)), end='') - print('\033[%i;%iH\033[%i@' % (y, xi + oldx - self.area.offx, len(insert)), end='') + print('%s\033[%iP' % (jump(y, xi + self.area.areawidth - len(insert)), len(insert)), end='') + print('%s\033[%i@' % (jump(y, xi + oldx - self.area.offx), len(insert)), end='') print(insert, end='') else: self.area.offx = len(self.text) - self.area.areawidth - print('\033[%i;%iH%s' % (self.area.top + self.y, self.area.left + self.area.innerleft, ' ' * self.area.areawidth), end='') + jump(self.area.top + self.y, self.area.left + self.area.innerleft) + print(' ' * self.area.areawidth, end='') self.draw() - print('\033[%i;%iH' % (self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx), end='') + jump(self.area.top + self.y, self.area.left + self.area.innerleft + self.area.x - self.area.offx)() def insert(self, insert): self.override(insert, False) @@ -255,7 +273,7 @@ class TextArea(): txt = ' (' + text + ') ' y = self.top + self.y x = self.left + self.innerleft + self.x - self.offx - print('\033[%i;%iH\033[7m%s-\033[27m\033[%i;%iH' % (self.height - 1, 1, txt + '-' * (self.width - len(txt)), y, x), end='') + print('%s\033[7m%s-\033[27m%s' % (jump(self.height - 1, 1), txt + '-' * (self.width - len(txt)), jump(y, x)), end='') self.last_status = text def alert(self, text): @@ -270,7 +288,7 @@ class TextArea(): else: y = self.top + self.y x = self.left + self.innerleft + self.x - self.offx - print('\033[%i;%iH\033[2K%s\033[%i;%iH' % (self.height, 1, text, y, x), end='') + print('%s\033[2K%s%s' % (jump(self.height, 1), text, jump(y, x)), end='') self.alerted = True self.last_alert = text @@ -311,7 +329,7 @@ class TextArea(): if self.y != oldy: self.lines[oldy].draw() self.lines[self.y].draw() - print('\033[%i;%iH' % (self.top + self.y, self.left + self.innerleft + self.x - self.offx), end='') + jump(self.top + self.y, self.left + self.innerleft + self.x - self.offx)() (oldy, oldx, oldmark) = (self.y, self.x, self.mark) if edited: edited = False |
