def build_message(self, message, timestamp=False, nick_size=10): txt = message.txt ret = [] default_color = None nick = truncate_nick(message.nickname, nick_size) offset = 0 if nick: offset += poopt.wcswidth(nick) + 1 # + nick + ' ' length if message.str_time: offset += 1 + len(message.str_time) if get_theme().CHAR_TIME_LEFT and message.str_time: offset += 1 if get_theme().CHAR_TIME_RIGHT and message.str_time: offset += 1 lines = poopt.cut_text(txt, self.width-offset-1) prepend = default_color if default_color else '' attrs = [] for line in lines: saved = Line(msg=message, start_pos=line[0], end_pos=line[1], prepend=prepend) attrs = parse_attrs(message.txt[line[0]:line[1]], attrs) if attrs: prepend = FORMAT_CHAR + FORMAT_CHAR.join(attrs) else: if default_color: prepend = default_color else: prepend = '' ret.append(saved) return ret
def build_message(self, message, timestamp=False, nick_size=10): txt = message.txt ret = [] default_color = None nick = truncate_nick(message.nickname, nick_size) offset = 0 if nick: offset += poopt.wcswidth(nick) + 1 # + nick + ' ' length if message.str_time: offset += 1 + len(message.str_time) if get_theme().CHAR_TIME_LEFT and message.str_time: offset += 1 if get_theme().CHAR_TIME_RIGHT and message.str_time: offset += 1 lines = poopt.cut_text(txt, self.width - offset - 1) prepend = default_color if default_color else '' attrs = [] for line in lines: saved = Line(msg=message, start_pos=line[0], end_pos=line[1], prepend=prepend) attrs = parse_attrs(message.txt[line[0]:line[1]], attrs) if attrs: prepend = FORMAT_CHAR + FORMAT_CHAR.join(attrs) else: if default_color: prepend = default_color else: prepend = '' ret.append(saved) return ret
def write_pre_msg(self, msg, with_timestamps, nick_size): offset = 0 if with_timestamps: offset += self.write_time(msg.str_time) if not msg.nickname: # not a message, nothing to do afterwards return offset nick = truncate_nick(msg.nickname, nick_size) offset += poopt.wcswidth(nick) if msg.nick_color: color = msg.nick_color elif msg.user: color = msg.user.color else: color = None 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_pre_msg(self, msg, with_timestamps, nick_size) -> int: offset = 0 if with_timestamps: offset += self.write_time(msg.str_time) if not msg.nickname: # not a message, nothing to do afterwards return offset nick = truncate_nick(msg.nickname, nick_size) offset += poopt.wcswidth(nick) if msg.nick_color: color = msg.nick_color elif msg.user: color = msg.user.color else: color = None 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_own_nick(self, room): """ Write our own nick in the info bar """ nick = room.own_nick if not nick: return self.addstr(truncate_nick(nick, 13), to_curses_attr(get_theme().COLOR_INFORMATION_BAR))
def build_message(self, message: Optional[Message], timestamp: bool = False, nick_size: int = 10) -> List[Union[None, Line]]: """ Build a list of lines from a message, without adding it to a list """ if message is None: # line separator return [None] txt = message.txt if not txt: return [] theme = get_theme() if len(message.str_time) > 8: default_color = (FORMAT_CHAR + dump_tuple(theme.COLOR_LOG_MSG) + '}') # type: Optional[str] else: default_color = None ret = [] # type: List[Union[None, Line]] nick = truncate_nick(message.nickname, nick_size) offset = 0 if message.ack: if message.ack > 0: offset += poopt.wcswidth(theme.CHAR_ACK_RECEIVED) + 1 else: offset += poopt.wcswidth(theme.CHAR_NACK) + 1 if nick: offset += poopt.wcswidth(nick) + 2 # + nick + '> ' length if message.revisions > 0: offset += ceil(log10(message.revisions + 1)) if message.me: offset += 1 # '* ' before and ' ' after if timestamp: if message.str_time: offset += 1 + len(message.str_time) if theme.CHAR_TIME_LEFT and message.str_time: offset += 1 if theme.CHAR_TIME_RIGHT and message.str_time: offset += 1 lines = poopt.cut_text(txt, self.width - offset - 1) prepend = default_color if default_color else '' attrs = [] # type: List[str] for line in lines: saved = Line(msg=message, start_pos=line[0], end_pos=line[1], prepend=prepend) attrs = parse_attrs(message.txt[line[0]:line[1]], attrs) if attrs: prepend = FORMAT_CHAR + FORMAT_CHAR.join(attrs) else: if default_color: prepend = default_color else: prepend = '' ret.append(saved) return ret
def build_message(self, message: Optional[Message], timestamp: bool = False, nick_size: int = 10) -> List[Union[None, Line]]: """ Build a list of lines from a message, without adding it to a list """ if message is None: # line separator return [None] txt = message.txt if not txt: return [] theme = get_theme() if len(message.str_time) > 8: default_color = ( FORMAT_CHAR + dump_tuple(theme.COLOR_LOG_MSG) + '}') # type: Optional[str] else: default_color = None ret = [] # type: List[Union[None, Line]] nick = truncate_nick(message.nickname, nick_size) offset = 0 if message.ack: if message.ack > 0: offset += poopt.wcswidth(theme.CHAR_ACK_RECEIVED) + 1 else: offset += poopt.wcswidth(theme.CHAR_NACK) + 1 if nick: offset += poopt.wcswidth(nick) + 2 # + nick + '> ' length if message.revisions > 0: offset += ceil(log10(message.revisions + 1)) if message.me: offset += 1 # '* ' before and ' ' after if timestamp: if message.str_time: offset += 1 + len(message.str_time) if theme.CHAR_TIME_LEFT and message.str_time: offset += 1 if theme.CHAR_TIME_RIGHT and message.str_time: offset += 1 lines = poopt.cut_text(txt, self.width - offset - 1) prepend = default_color if default_color else '' attrs = [] # type: List[str] for line in lines: saved = Line( msg=message, start_pos=line[0], end_pos=line[1], prepend=prepend) attrs = parse_attrs(message.txt[line[0]:line[1]], attrs) if attrs: prepend = FORMAT_CHAR + FORMAT_CHAR.join(attrs) else: if default_color: prepend = default_color else: prepend = '' ret.append(saved) return ret
def goto_build_lines(self, new_date): text_buffer = self._text_buffer built_lines = [] message_count = 0 timestamp = config.get('show_timestamps') nick_size = config.get('max_nick_length') for message in text_buffer.messages: # Build lines of a message txt = message.txt nick = truncate_nick(message.nickname, nick_size) offset = 0 theme = get_theme() if message.ack: if message.ack > 0: offset += poopt.wcswidth(theme.CHAR_ACK_RECEIVED) + 1 else: offset += poopt.wcswidth(theme.CHAR_NACK) + 1 if nick: offset += poopt.wcswidth(nick) + 2 if message.revisions > 0: offset += ceil(log10(message.revisions + 1)) if message.me: offset += 1 if timestamp: if message.str_time: offset += 1 + len(message.str_time) if theme.CHAR_TIME_LEFT and message.str_time: offset += 1 if theme.CHAR_TIME_RIGHT and message.str_time: offset += 1 lines = poopt.cut_text(txt, self.text_win.width - offset - 1) for line in lines: built_lines.append(line) # Find the message with timestamp less than or equal to the queried # timestamp and goto that location in the tab. if message.time <= new_date: message_count += 1 if len(self.text_win.built_lines ) - self.text_win.height >= len(built_lines): self.text_win.pos = len( self.text_win.built_lines ) - self.text_win.height - len(built_lines) + 1 else: self.text_win.pos = 0 if message_count == 0: self.text_win.scroll_up(len(self.text_win.built_lines)) self.core.refresh_window()
def refresh(self) -> None: log.debug('Refresh: %s', self.__class__.__name__) theme = get_theme() if self.height <= 0: return if self.pos == 0: lines = self.built_lines[-self.height:] else: lines = self.built_lines[-self.height - self.pos:-self.pos] self._win.move(0, 0) self._win.erase() for y, line in enumerate(lines): if line: msg = line.msg if line.start_pos == 0: if msg.nickname == theme.CHAR_XML_OUT: color = theme.COLOR_XML_OUT elif msg.nickname == theme.CHAR_XML_IN: color = theme.COLOR_XML_IN self.write_time(msg.str_time) self.write_prefix(msg.nickname, color) self.addstr(' ') if y != self.height - 1: self.addstr('\n') self._win.attrset(0) for y, line in enumerate(lines): offset = 0 # Offset for the timestamp (if any) plus a space after it offset += len(line.msg.str_time) # space offset += 1 # Offset for the prefix offset += poopt.wcswidth(truncate_nick(line.msg.nickname)) # space offset += 1 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) self._refresh()
def compute_offset(self, msg, with_timestamps, nick_size): offset = 0 if with_timestamps and msg.str_time: offset += poopt.wcswidth(msg.str_time) + 1 if not msg.nickname: # not a message, nothing to do afterwards return offset nick = truncate_nick(msg.nickname, nick_size) offset += poopt.wcswidth(nick) if msg.ack: if msg.ack > 0: offset += poopt.wcswidth(get_theme().CHAR_ACK_RECEIVED) + 1 else: offset += poopt.wcswidth(get_theme().CHAR_NACK) + 1 if msg.me: offset += 3 else: offset += 2 if msg.revisions: offset += ceil(log10(msg.revisions + 1)) offset += self.write_revisions(msg) return offset
def write_prefix(self, nickname, color): self._win.attron(to_curses_attr(color)) self.addstr(truncate_nick(nickname)) self._win.attroff(to_curses_attr(color))
def write_prefix(self, nickname, color) -> None: self._win.attron(to_curses_attr(color)) self.addstr(truncate_nick(nickname)) self._win.attroff(to_curses_attr(color))