From d8623d1c509e8f90234d239e61bb0e8bd93851e6 Mon Sep 17 00:00:00 2001 From: mathieui Date: Thu, 26 Jul 2012 12:40:08 +0200 Subject: Change how scrolling is done - All functions involved return a boolean, and the core function use that value to determine if a refresh is needed or not. (avoids useless refreshs) - Scrolling with PGUP/DOWN on the roster now only does _one_ action, an not a range corresponding to the screen size (should be way faster) --- src/windows.py | 61 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 18 deletions(-) (limited to 'src/windows.py') diff --git a/src/windows.py b/src/windows.py index 03905d4b..a46edb1e 100644 --- a/src/windows.py +++ b/src/windows.py @@ -212,11 +212,14 @@ class UserList(Win): } def scroll_up(self): self.pos += self.height-1 + return True def scroll_down(self): + pos = self.pos self.pos -= self.height-1 if self.pos < 0: self.pos = 0 + return self.pos != pos def draw_plus(self, y): self.addstr(y, self.width-2, '++', to_curses_attr(get_theme().COLOR_MORE_INDICATOR)) @@ -714,16 +717,20 @@ class TextWin(Win): self.pos = 0 def scroll_up(self, dist=14): + pos = self.pos self.pos += dist if self.pos + self.height > len(self.built_lines): self.pos = len(self.built_lines) - self.height if self.pos < 0: self.pos = 0 + return self.pos != pos def scroll_down(self, dist=14): + pos = self.pos self.pos -= dist if self.pos <= 0: self.pos = 0 + return self.pos != pos def scroll_to_separator(self): """ @@ -1540,35 +1547,53 @@ class RosterWin(Win): self.roster_len = 0 self.selected_row = None - def move_cursor_down(self): + def move_cursor_down(self, number=1): """ Return True if we scrolled, False otherwise """ - if self.pos < self.roster_len-1: - self.pos += 1 + pos = self.pos + if self.pos < self.roster_len-number: + self.pos += number else: - return False - if self.pos == self.start_pos-1 + self.height-1: - self.scroll_down() - return True + self.pos = self.roster_len - 1 + if self.pos >= self.start_pos-1 + self.height-1: + if number == 1: + self.scroll_down(8) + else: + self.scroll_down(self.pos-self.start_pos - self.height // 2) + return pos != self.pos - def move_cursor_up(self): + def move_cursor_up(self, number=1): """ Return True if we scrolled, False otherwise """ - if self.pos > 0: - self.pos -= 1 + pos = self.pos + if self.pos-number >= 0: + self.pos -= number else: - return False - if self.pos == self.start_pos-2: - self.scroll_up() - return True + self.pos = 0 + if self.pos <= self.start_pos: + if number == 1: + self.scroll_up(8) + else: + self.scroll_up(self.start_pos-self.pos + self.height // 2) + return pos != self.pos - def scroll_down(self): - self.start_pos += 8 + def scroll_down(self, number=8): + pos = self.start_pos + if self.start_pos + number <= self.roster_len-1: + self.start_pos += number + else: + self.start_pos = self.roster_len-1 + return self.start_pos != pos - def scroll_up(self): - self.start_pos -= 8 + def scroll_up(self, number=8): + pos = self.start_pos + if self.start_pos - number > 0: + self.start_pos -= number + else: + self.start_pos = 1 + return self.start_pos != pos def refresh(self, roster): """ -- cgit v1.2.3