def handle_key(self, ch):
backward_keys = {'-', 'b', 'B', curses.KEY_PPAGE, curses.KEY_LEFT}
- if not (self.mode == 'normal' and ch in backward_keys):
- self.unprime()
if self.mode == 'normal':
if ch in {' ', curses.KEY_NPAGE, curses.KEY_RIGHT}:
self.search_re is not None):
self.search(self.search_direction, self.search_re)
- def unprime(self):
- pass # not supported
def send_mode(self):
pass # not supported
def favourite_mode(self):
self.select_target = None
self.old_display_state = None
self.index_by_line = []
- self.primed_to_extend = False
+
+ def top_line_pos(self):
+ return max(0, self.linepos - (self.cc.scr_h - 1))
+
+ def primed_to_extend(self):
+ if self.linepos is None:
+ return False # we haven't set up at all yet
+ if self.history_closed:
+ return False # we can't be primed to extend if we can't extend
+ return self.top_line_pos() == 0
def iter_text_indexed(self):
yield self.header, None
if not self.history_closed:
- yield text.ExtendableIndicator(self.primed_to_extend), None
+ yield text.ExtendableIndicator(self.primed_to_extend()), None
for i in range(self.minpos, self.maxpos):
for thing in self.statuses[i].text():
yield thing, i # FIXME: maybe just yield the last?
# If not that, and also nothing _else_ has changed, we don't
# need to do anything at all.
- display_state = (self.mode, self.select_target, self.primed_to_extend)
+ display_state = (self.mode, self.select_target,
+ self.primed_to_extend())
if not recompute_line and display_state == self.old_display_state:
return
def render(self):
self.regenerate_lines(self.cc.scr_w)
- topline = max(0, self.linepos - (self.cc.scr_h - 1))
+ topline = self.top_line_pos()
for y, line in enumerate(self.lines[topline:topline+self.cc.scr_h-1]):
self.cc.print_at(y, 0, line)
return self.move_to(self.linepos + delta)
def down_screen(self): return self.move_by(max(1, self.cc.scr_h - 3))
+ def up_screen(self): self.move_by(-max(1, self.cc.scr_h - 3))
def down_line(self): return self.move_by(+1)
def up_line(self): return self.move_by(-1)
- def goto_top(self): return self.move_to(0)
+ def goto_top(self):
+ if self.primed_to_extend():
+ if self.feed.extend_past() is False: # None does not count
+ self.history_closed = True
+ return self.move_to(0)
def goto_bottom(self): return self.move_to(len(self.lines))
- def up_screen(self):
- success = self.move_by(-max(1, self.cc.scr_h - 3))
- if not success and not self.history_closed:
- if not self.primed_to_extend:
- self.primed_to_extend = True
- else:
- if self.feed.extend_past() is False: # None does not count
- self.history_closed = True
- self.primed_to_extend = False
- def unprime(self):
- self.primed_to_extend = False
-
def search(self, direction, re):
pos = self.linepos - 1
while True: