diff options
author | Maxime Buquet <pep@bouah.net> | 2020-05-17 21:34:50 +0200 |
---|---|---|
committer | Maxime Buquet <pep@bouah.net> | 2020-05-17 21:34:50 +0200 |
commit | 36a0281b6761371d5a42a14acc7f7081c0bf076c (patch) | |
tree | 35f39d2e623e03b1bc1d1b2e482875e2f362bbde | |
parent | 20cb8f0bef811e7b470d4be36e7467a0da7177b5 (diff) | |
parent | 551828607c7644d7af6b5889c7ffb2f28eeefee9 (diff) | |
download | poezio-36a0281b6761371d5a42a14acc7f7081c0bf076c.tar.gz poezio-36a0281b6761371d5a42a14acc7f7081c0bf076c.tar.bz2 poezio-36a0281b6761371d5a42a14acc7f7081c0bf076c.tar.xz poezio-36a0281b6761371d5a42a14acc7f7081c0bf076c.zip |
Merge branch 'fix-highlights' into 'master'
Fix highlights
See merge request poezio/poezio!102
-rw-r--r-- | poezio/core/handlers.py | 6 | ||||
-rw-r--r-- | poezio/tabs/muctab.py | 59 | ||||
-rw-r--r-- | poezio/ui/render.py | 3 | ||||
-rw-r--r-- | poezio/windows/base_wins.py | 19 | ||||
-rw-r--r-- | poezio/windows/text_win.py | 7 |
5 files changed, 43 insertions, 51 deletions
diff --git a/poezio/core/handlers.py b/poezio/core/handlers.py index 01fb6062..445d8b74 100644 --- a/poezio/core/handlers.py +++ b/poezio/core/handlers.py @@ -783,6 +783,7 @@ class HandlerCore: # Messages coming from MUC barejid (Server maintenance, IRC mode # changes from biboumi, etc.) are displayed as info messages. if message['from'].resource: + highlight = tab.message_is_highlight(body, nick_from, delayed) ui_msg = PMessage( txt=body, time=date, @@ -792,6 +793,7 @@ class HandlerCore: identifier=message['id'], jid=message['from'], user=user, + highlight=highlight, ) typ = 1 else: @@ -801,8 +803,8 @@ class HandlerCore: identifier=message['id'], ) typ = 2 - - if tab.add_message(ui_msg, typ): + tab.add_message(ui_msg, typ) + if highlight: self.core.events.trigger('highlight', message, tab) if message['from'].resource == tab.own_nick: diff --git a/poezio/tabs/muctab.py b/poezio/tabs/muctab.py index f0c055b1..d4ff1d48 100644 --- a/poezio/tabs/muctab.py +++ b/poezio/tabs/muctab.py @@ -1077,13 +1077,8 @@ class MucTab(ChatTab): return user return None - def add_message(self, msg: BaseMessage, typ=1): - """ - Note that user can be None even if nickname is not None. It happens - when we receive an history message said by someone who is not - in the room anymore - Return True if the message highlighted us. False otherwise. - """ + def add_message(self, msg: BaseMessage, typ=1) -> None: + """Add a message to the text buffer and set various tab status""" # reset self-ping interval if self.self_ping_event: self.enable_self_ping_event() @@ -1095,8 +1090,7 @@ class MucTab(ChatTab): if config.get_by_tabname('notify_messages', self.jid.bare) and self.state != 'current': if msg.nickname != self.own_nick and not msg.history: self.state = 'message' - msg.highlight = self.do_highlight(msg.txt, msg.nickname, msg.delayed) - return msg.highlight + self.do_highlight(msg.txt, msg.nickname, msg.delayed) def modify_message(self, txt, @@ -1107,7 +1101,9 @@ class MucTab(ChatTab): nickname=None, user=None, jid=None): - highlight = self.do_highlight(txt, nickname, delayed, corrected=True) + highlight = self.message_is_highlight( + txt, nickname, delayed, corrected=True + ) message = self._text_buffer.modify_message( txt, old_id, @@ -1314,15 +1310,19 @@ class MucTab(ChatTab): def build_highlight_regex(self, nickname): return re.compile(r"(^|\W)" + re.escape(nickname) + r"(\W|$)", re.I) - def is_highlight(self, txt: str, nick: str, highlight_on: List[str], - delayed, corrected: bool = False): - """ - Highlight algorithm for MUC tabs - """ - + def message_is_highlight(self, txt: str, nickname: str, delayed: bool, + corrected: bool = False) -> bool: + """Highlight algorithm for MUC tabs""" + # Don't highlight on info message or our own messages + if not nickname or nickname == self.own_nick: + return False + highlight_on = config.get_by_tabname( + 'highlight_on', + self.general_jid, + ).split(':') highlighted = False - if not delayed and not corrected: - if self.build_highlight_regex(nick).search(txt): + if not delayed: + if self.build_highlight_regex(self.own_nick).search(txt): highlighted = True else: for word in highlight_on: @@ -1331,22 +1331,13 @@ class MucTab(ChatTab): break return highlighted - def do_highlight(self, txt, nickname, delayed, corrected=False): - """ - Set the tab color and returns the nick color - """ - own_nick = self.own_nick - highlight_on = config.get_by_tabname( - 'highlight_on', - self.general_jid, - ).split(':') - - # Don't highlight on info message or our own messages - if not nickname or nickname == own_nick: - return False - - highlighted = self.is_highlight(txt, own_nick, highlight_on, delayed, corrected) - if highlighted and self.joined: + def do_highlight(self, txt: str, nickname: str, delayed: bool, + corrected: bool = False) -> bool: + """Set the tab color and returns the highlight state""" + highlighted = self.message_is_highlight( + txt, nickname, delayed, corrected + ) + if highlighted and self.joined and not corrected: if self.state != 'current': self.state = 'highlight' beep_on = config.get('beep_on').split() diff --git a/poezio/ui/render.py b/poezio/ui/render.py index b8368312..a431b4e7 100644 --- a/poezio/ui/render.py +++ b/poezio/ui/render.py @@ -1,4 +1,3 @@ -import logging import curses from datetime import datetime @@ -133,7 +132,6 @@ def write_pre_message(msg: Message, win: 'Win', with_timestamps: bool, nick_size """ offset = 0 if with_timestamps: - logging.debug(msg) offset += PreMessageHelpers.write_time(win, msg.history, msg.time) if not msg.nickname: # not a message, nothing to do afterwards @@ -243,7 +241,6 @@ class PreMessageHelpers: format = LONG_FORMAT else: format = SHORT_FORMAT - logging.debug(time) time_str = time.strftime(format) color = get_theme().COLOR_TIME_STRING with buffer.colored_text(color=color): diff --git a/poezio/windows/base_wins.py b/poezio/windows/base_wins.py index d6c72912..f371c106 100644 --- a/poezio/windows/base_wins.py +++ b/poezio/windows/base_wins.py @@ -80,15 +80,18 @@ class Win: @contextmanager def colored_text(self, color: Optional[Tuple]=None, attr: Optional[int]=None): """Context manager which sets up an attr/color when inside""" - if attr is None: - if color is not None: - attr = to_curses_attr(color) - else: - yield None - return - self._win.attron(attr) + if color is None and attr is None: + yield None + return + if color is not None: + mode = to_curses_attr(color) + if attr is not None: + mode = mode | attr + else: + mode = attr + self._win.attron(mode) yield None - self._win.attroff(attr) + self._win.attroff(mode) def addstr(self, *args) -> None: """ diff --git a/poezio/windows/text_win.py b/poezio/windows/text_win.py index a1b12ae9..9e6641f7 100644 --- a/poezio/windows/text_win.py +++ b/poezio/windows/text_win.py @@ -85,7 +85,6 @@ class TextWin(Win): def build_new_message(self, message: BaseMessage, clean: bool = True, - highlight: bool = False, timestamp: bool = False, nick_size: int = 10) -> int: """ @@ -106,7 +105,7 @@ class TextWin(Win): self.built_lines.extend(lines) if not lines or not lines[0]: return 0 - if highlight: + if isinstance(message, Message) and message.highlight: self.highlights.append(lines[0]) self.nb_of_highlights_after_separator += 1 log.debug("Number of highlights after separator is now %s", @@ -244,7 +243,7 @@ class TextWin(Win): try: pos = self.built_lines.index(hl) except ValueError: - self.highlights = self.highlights[self.hl_pos + 1:] + del self.highlights[self.hl_pos] if not self.highlights: self.hl_pos = float('nan') self.pos = 0 @@ -278,7 +277,7 @@ class TextWin(Win): try: pos = self.built_lines.index(hl) except ValueError: - self.highlights = self.highlights[self.hl_pos + 1:] + del self.highlights[self.hl_pos] if not self.highlights: self.hl_pos = float('nan') self.pos = 0 |