summaryrefslogtreecommitdiff
path: root/src/windows
diff options
context:
space:
mode:
authormathieui <mathieui@mathieui.net>2015-11-11 22:44:53 +0100
committermathieui <mathieui@mathieui.net>2015-11-11 22:45:52 +0100
commit9fc20d4f86f6e1c31a7648072d61112bdea91c58 (patch)
tree20acdd3e4a9e1e3f85c0d160a2ffe37b444659c5 /src/windows
parent41283a4ff76de4c0ab990d1b62e4f69a43b29b73 (diff)
downloadpoezio-9fc20d4f86f6e1c31a7648072d61112bdea91c58.tar.gz
poezio-9fc20d4f86f6e1c31a7648072d61112bdea91c58.tar.bz2
poezio-9fc20d4f86f6e1c31a7648072d61112bdea91c58.tar.xz
poezio-9fc20d4f86f6e1c31a7648072d61112bdea91c58.zip
Clean up the refresh a bit
It should be around 25/30% faster (according to basic profiling) due to looping only once, and also be easier to read.
Diffstat (limited to 'src/windows')
-rw-r--r--src/windows/text_win.py126
1 files changed, 57 insertions, 69 deletions
diff --git a/src/windows/text_win.py b/src/windows/text_win.py
index 970bd1f8..cc4b5189 100644
--- a/src/windows/text_win.py
+++ b/src/windows/text_win.py
@@ -108,6 +108,8 @@ class BaseTextWin(Win):
self.addstr(time)
self._win.attroff(curses_color)
self.addstr(' ')
+ return poopt.wcswidth(time) + 1
+ return 0
def resize(self, height, width, y, x, room=None):
if hasattr(self, 'width'):
@@ -287,7 +289,7 @@ class TextWin(BaseTextWin):
self.highlights.append(lines[0])
self.nb_of_highlights_after_separator += 1
log.debug("Number of highlights after separator is now %s",
- self.nb_of_highlights_after_separator)
+ self.nb_of_highlights_after_separator)
if clean:
while len(self.built_lines) > self.lines_nb_limit:
self.built_lines.pop(0)
@@ -305,7 +307,7 @@ class TextWin(BaseTextWin):
return []
if len(message.str_time) > 8:
default_color = (FORMAT_CHAR + dump_tuple(get_theme().COLOR_LOG_MSG)
- + '}')
+ + '}')
else:
default_color = None
ret = []
@@ -357,84 +359,68 @@ class TextWin(BaseTextWin):
nick_size = config.get("max_nick_length")
self._win.move(0, 0)
self._win.erase()
+ offset = 0
for y, line in enumerate(lines):
if line:
msg = line.msg
if line.start_pos == 0:
- nick = truncate_nick(msg.nickname, nick_size)
- if msg.nick_color:
- color = msg.nick_color
- elif msg.user:
- color = msg.user.color
- else:
- color = None
- if with_timestamps:
- self.write_time(msg.str_time)
- if msg.ack:
- if msg.ack > 0:
- self.write_ack()
- else:
- self.write_nack()
- if msg.me:
- self._win.attron(to_curses_attr(get_theme().COLOR_ME_MESSAGE))
- self.addstr('* ')
- self.write_nickname(nick, color, msg.highlight)
- if msg.revisions:
- self._win.attron(to_curses_attr(get_theme().COLOR_REVISIONS_MESSAGE))
- self.addstr('%d' % msg.revisions)
- self._win.attrset(0)
- self.addstr(' ')
- else:
- self.write_nickname(nick, color, msg.highlight)
- if msg.revisions:
- self._win.attron(to_curses_attr(get_theme().COLOR_REVISIONS_MESSAGE))
- self.addstr('%d' % msg.revisions)
- self._win.attrset(0)
- self.addstr('> ')
- if y != self.height-1:
- self.addstr('\n')
- self._win.attrset(0)
- for y, line in enumerate(lines):
- if not line:
- self.write_line_separator(y)
+ offset = self.write_pre_msg(msg, with_timestamps, nick_size)
+ self.write_text(y, offset, line.prepend
+ + line.msg.txt[line.start_pos:line.end_pos])
else:
- offset = 0
- # Offset for the timestamp (if any) plus a space after it
- if with_timestamps:
- offset += len(line.msg.str_time)
- if offset:
- offset += 1
-
- # Offset for the nickname (if any)
- # plus a space and a > after it
- if line.msg.nickname:
- offset += poopt.wcswidth(truncate_nick(line.msg.nickname, nick_size))
- if line.msg.me:
- offset += 3
- else:
- offset += 2
- offset += ceil(log10(line.msg.revisions + 1))
-
- if line.msg.ack:
- if msg.ack > 0:
- offset += 1 + poopt.wcswidth(
- get_theme().CHAR_ACK_RECEIVED)
- else:
- offset += 1 + poopt.wcswidth(get_theme().CHAR_NACK)
-
- self.write_text(y, offset,
- line.prepend+line.msg.txt[line.start_pos:line.end_pos])
+ self.write_line_separator(y)
if y != self.height-1:
self.addstr('\n')
self._win.attrset(0)
self._refresh()
+ def write_pre_msg(self, msg, with_timestamps, nick_size):
+ offset = 0
+ nick = truncate_nick(msg.nickname, nick_size)
+ if nick is None:
+ return 0
+ offset += poopt.wcswidth(nick)
+ if msg.nick_color:
+ color = msg.nick_color
+ elif msg.user:
+ color = msg.user.color
+ else:
+ color = None
+ if with_timestamps:
+ offset += self.write_time(msg.str_time)
+ if msg.ack:
+ if msg.ack > 0:
+ offset += self.write_ack()
+ else:
+ offset += self.write_nack()
+ if msg.me:
+ self._win.attron(to_curses_attr(get_theme().COLOR_ME_MESSAGE))
+ self.addstr('* ')
+ self.write_nickname(nick, color, msg.highlight)
+ offset += self.write_revisions(msg)
+ self.addstr(' ')
+ offset += 3
+ else:
+ self.write_nickname(nick, color, msg.highlight)
+ offset += self.write_revisions(msg)
+ self.addstr('> ')
+ offset += 2
+ return offset
+
+ def write_revisions(self, msg):
+ if msg.revisions:
+ self._win.attron(to_curses_attr(get_theme().COLOR_REVISIONS_MESSAGE))
+ self.addstr('%d' % msg.revisions)
+ self._win.attrset(0)
+ return ceil(log10(msg.revisions + 1))
+ return 0
+
def write_line_separator(self, y):
char = get_theme().CHAR_NEW_TEXT_SEPARATOR
self.addnstr(y, 0,
- char*((self.width//len(char) - 1)),
- self.width,
- to_curses_attr(get_theme().COLOR_NEW_TEXT_SEPARATOR))
+ char * (self.width // len(char) - 1),
+ self.width,
+ to_curses_attr(get_theme().COLOR_NEW_TEXT_SEPARATOR))
def write_ack(self):
color = get_theme().COLOR_CHAR_ACK
@@ -442,6 +428,7 @@ class TextWin(BaseTextWin):
self.addstr(get_theme().CHAR_ACK_RECEIVED)
self._win.attroff(to_curses_attr(color))
self.addstr(' ')
+ return poopt.wcswidth(get_theme().CHAR_ACK_RECEIVED) + 1
def write_nack(self):
color = get_theme().COLOR_CHAR_NACK
@@ -449,6 +436,7 @@ class TextWin(BaseTextWin):
self.addstr(get_theme().CHAR_NACK)
self._win.attroff(to_curses_attr(color))
self.addstr(' ')
+ return poopt.wcswidth(get_theme().CHAR_NACK) + 1
def write_nickname(self, nickname, color, highlight=False):
"""
@@ -536,8 +524,8 @@ class XMLTextWin(BaseTextWin):
# space
offset += 1
- self.write_text(y, offset,
- line.prepend+line.msg.txt[line.start_pos:line.end_pos])
+ self.write_text(y, offset, line.prepend
+ + line.msg.txt[line.start_pos:line.end_pos])
if y != self.height-1:
self.addstr('\n')
self._win.attrset(0)