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.
This commit is contained in:
parent
41283a4ff7
commit
9fc20d4f86
1 changed files with 57 additions and 69 deletions
|
@ -108,6 +108,8 @@ class BaseTextWin(Win):
|
||||||
self.addstr(time)
|
self.addstr(time)
|
||||||
self._win.attroff(curses_color)
|
self._win.attroff(curses_color)
|
||||||
self.addstr(' ')
|
self.addstr(' ')
|
||||||
|
return poopt.wcswidth(time) + 1
|
||||||
|
return 0
|
||||||
|
|
||||||
def resize(self, height, width, y, x, room=None):
|
def resize(self, height, width, y, x, room=None):
|
||||||
if hasattr(self, 'width'):
|
if hasattr(self, 'width'):
|
||||||
|
@ -287,7 +289,7 @@ class TextWin(BaseTextWin):
|
||||||
self.highlights.append(lines[0])
|
self.highlights.append(lines[0])
|
||||||
self.nb_of_highlights_after_separator += 1
|
self.nb_of_highlights_after_separator += 1
|
||||||
log.debug("Number of highlights after separator is now %s",
|
log.debug("Number of highlights after separator is now %s",
|
||||||
self.nb_of_highlights_after_separator)
|
self.nb_of_highlights_after_separator)
|
||||||
if clean:
|
if clean:
|
||||||
while len(self.built_lines) > self.lines_nb_limit:
|
while len(self.built_lines) > self.lines_nb_limit:
|
||||||
self.built_lines.pop(0)
|
self.built_lines.pop(0)
|
||||||
|
@ -305,7 +307,7 @@ class TextWin(BaseTextWin):
|
||||||
return []
|
return []
|
||||||
if len(message.str_time) > 8:
|
if len(message.str_time) > 8:
|
||||||
default_color = (FORMAT_CHAR + dump_tuple(get_theme().COLOR_LOG_MSG)
|
default_color = (FORMAT_CHAR + dump_tuple(get_theme().COLOR_LOG_MSG)
|
||||||
+ '}')
|
+ '}')
|
||||||
else:
|
else:
|
||||||
default_color = None
|
default_color = None
|
||||||
ret = []
|
ret = []
|
||||||
|
@ -357,84 +359,68 @@ class TextWin(BaseTextWin):
|
||||||
nick_size = config.get("max_nick_length")
|
nick_size = config.get("max_nick_length")
|
||||||
self._win.move(0, 0)
|
self._win.move(0, 0)
|
||||||
self._win.erase()
|
self._win.erase()
|
||||||
|
offset = 0
|
||||||
for y, line in enumerate(lines):
|
for y, line in enumerate(lines):
|
||||||
if line:
|
if line:
|
||||||
msg = line.msg
|
msg = line.msg
|
||||||
if line.start_pos == 0:
|
if line.start_pos == 0:
|
||||||
nick = truncate_nick(msg.nickname, nick_size)
|
offset = self.write_pre_msg(msg, with_timestamps, nick_size)
|
||||||
if msg.nick_color:
|
self.write_text(y, offset, line.prepend
|
||||||
color = msg.nick_color
|
+ line.msg.txt[line.start_pos:line.end_pos])
|
||||||
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)
|
|
||||||
else:
|
else:
|
||||||
offset = 0
|
self.write_line_separator(y)
|
||||||
# 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])
|
|
||||||
if y != self.height-1:
|
if y != self.height-1:
|
||||||
self.addstr('\n')
|
self.addstr('\n')
|
||||||
self._win.attrset(0)
|
self._win.attrset(0)
|
||||||
self._refresh()
|
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):
|
def write_line_separator(self, y):
|
||||||
char = get_theme().CHAR_NEW_TEXT_SEPARATOR
|
char = get_theme().CHAR_NEW_TEXT_SEPARATOR
|
||||||
self.addnstr(y, 0,
|
self.addnstr(y, 0,
|
||||||
char*((self.width//len(char) - 1)),
|
char * (self.width // len(char) - 1),
|
||||||
self.width,
|
self.width,
|
||||||
to_curses_attr(get_theme().COLOR_NEW_TEXT_SEPARATOR))
|
to_curses_attr(get_theme().COLOR_NEW_TEXT_SEPARATOR))
|
||||||
|
|
||||||
def write_ack(self):
|
def write_ack(self):
|
||||||
color = get_theme().COLOR_CHAR_ACK
|
color = get_theme().COLOR_CHAR_ACK
|
||||||
|
@ -442,6 +428,7 @@ class TextWin(BaseTextWin):
|
||||||
self.addstr(get_theme().CHAR_ACK_RECEIVED)
|
self.addstr(get_theme().CHAR_ACK_RECEIVED)
|
||||||
self._win.attroff(to_curses_attr(color))
|
self._win.attroff(to_curses_attr(color))
|
||||||
self.addstr(' ')
|
self.addstr(' ')
|
||||||
|
return poopt.wcswidth(get_theme().CHAR_ACK_RECEIVED) + 1
|
||||||
|
|
||||||
def write_nack(self):
|
def write_nack(self):
|
||||||
color = get_theme().COLOR_CHAR_NACK
|
color = get_theme().COLOR_CHAR_NACK
|
||||||
|
@ -449,6 +436,7 @@ class TextWin(BaseTextWin):
|
||||||
self.addstr(get_theme().CHAR_NACK)
|
self.addstr(get_theme().CHAR_NACK)
|
||||||
self._win.attroff(to_curses_attr(color))
|
self._win.attroff(to_curses_attr(color))
|
||||||
self.addstr(' ')
|
self.addstr(' ')
|
||||||
|
return poopt.wcswidth(get_theme().CHAR_NACK) + 1
|
||||||
|
|
||||||
def write_nickname(self, nickname, color, highlight=False):
|
def write_nickname(self, nickname, color, highlight=False):
|
||||||
"""
|
"""
|
||||||
|
@ -536,8 +524,8 @@ class XMLTextWin(BaseTextWin):
|
||||||
# space
|
# space
|
||||||
offset += 1
|
offset += 1
|
||||||
|
|
||||||
self.write_text(y, offset,
|
self.write_text(y, offset, line.prepend
|
||||||
line.prepend+line.msg.txt[line.start_pos:line.end_pos])
|
+ line.msg.txt[line.start_pos:line.end_pos])
|
||||||
if y != self.height-1:
|
if y != self.height-1:
|
||||||
self.addstr('\n')
|
self.addstr('\n')
|
||||||
self._win.attrset(0)
|
self._win.attrset(0)
|
||||||
|
|
Loading…
Reference in a new issue