diff options
Diffstat (limited to 'poezio/windows')
-rw-r--r-- | poezio/windows/base_wins.py | 5 | ||||
-rw-r--r-- | poezio/windows/funcs.py | 60 | ||||
-rw-r--r-- | poezio/windows/info_wins.py | 2 | ||||
-rw-r--r-- | poezio/windows/inputs.py | 11 | ||||
-rw-r--r-- | poezio/windows/text_win.py | 66 |
5 files changed, 11 insertions, 133 deletions
diff --git a/poezio/windows/base_wins.py b/poezio/windows/base_wins.py index ac6b4804..6a689067 100644 --- a/poezio/windows/base_wins.py +++ b/poezio/windows/base_wins.py @@ -20,10 +20,7 @@ from typing import Optional, Tuple, TYPE_CHECKING from poezio.theming import to_curses_attr, read_tuple -FORMAT_CHAR = '\x19' -# These are non-printable chars, so they should never appear in the input, -# I guess. But maybe we can find better chars that are even less risky. -format_chars = '\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x1A' +from poezio.ui.consts import FORMAT_CHAR if TYPE_CHECKING: from _curses import _CursesWindow # pylint: disable=E0611 diff --git a/poezio/windows/funcs.py b/poezio/windows/funcs.py deleted file mode 100644 index 22977374..00000000 --- a/poezio/windows/funcs.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -Standalone functions used by the modules -""" - -import string -from typing import Optional, List -from poezio.windows.base_wins import FORMAT_CHAR, format_chars - -DIGITS = string.digits + '-' - - -def find_first_format_char(text: str, - chars: str = None) -> int: - to_find = chars or format_chars - pos = -1 - for char in to_find: - p = text.find(char) - if p == -1: - continue - if pos == -1 or p < pos: - pos = p - return pos - - -def truncate_nick(nick: Optional[str], size=10) -> Optional[str]: - if size < 1: - size = 1 - if nick and len(nick) > size: - return nick[:size] + '…' - return nick - - -def parse_attrs(text: str, previous: Optional[List[str]] = None) -> List[str]: - next_attr_char = text.find(FORMAT_CHAR) - if previous: - attrs = previous - else: - attrs = [] - while next_attr_char != -1 and text: - if next_attr_char + 1 < len(text): - attr_char = text[next_attr_char + 1].lower() - else: - attr_char = '\0' - if attr_char == 'o': - attrs = [] - elif attr_char == 'u': - attrs.append('u') - elif attr_char == 'b': - attrs.append('b') - elif attr_char == 'i': - attrs.append('i') - if attr_char in DIGITS and attr_char: - color_str = text[next_attr_char + 1:text.find('}', next_attr_char)] - if color_str: - attrs.append(color_str + '}') - text = text[next_attr_char + len(color_str) + 2:] - else: - text = text[next_attr_char + 2:] - next_attr_char = text.find(FORMAT_CHAR) - return attrs diff --git a/poezio/windows/info_wins.py b/poezio/windows/info_wins.py index 3a8d1863..d31130fe 100644 --- a/poezio/windows/info_wins.py +++ b/poezio/windows/info_wins.py @@ -10,7 +10,7 @@ from poezio.common import safeJID from poezio.config import config from poezio.windows.base_wins import Win -from poezio.windows.funcs import truncate_nick +from poezio.ui.funcs import truncate_nick from poezio.theming import get_theme, to_curses_attr diff --git a/poezio/windows/inputs.py b/poezio/windows/inputs.py index 84b95599..5cca8803 100644 --- a/poezio/windows/inputs.py +++ b/poezio/windows/inputs.py @@ -10,8 +10,9 @@ from typing import List, Dict, Callable, Optional from poezio import keyboard from poezio import common from poezio import poopt -from poezio.windows.base_wins import Win, format_chars -from poezio.windows.funcs import find_first_format_char +from poezio.windows.base_wins import Win +from poezio.ui.consts import FORMAT_CHARS +from poezio.ui.funcs import find_first_format_char from poezio.config import config from poezio.theming import to_curses_attr @@ -487,7 +488,7 @@ class Input(Win): (\x0E to \x19 instead of \x19 + attr). We do not use any } char in this version """ - chars = format_chars + '\n' + chars = FORMAT_CHARS + '\n' if y is not None and x is not None: self.move(y, x) format_char = find_first_format_char(text, chars) @@ -497,7 +498,7 @@ class Input(Win): if text[format_char] == '\n': attr_char = '|' else: - attr_char = self.text_attributes[format_chars.index( + attr_char = self.text_attributes[FORMAT_CHARS.index( text[format_char])] self.addstr(text[:format_char]) self.addstr(attr_char, curses.A_REVERSE) @@ -696,7 +697,7 @@ class MessageInput(HistoryInput): def cb(attr_char): if attr_char in self.text_attributes: - char = format_chars[self.text_attributes.index(attr_char)] + char = FORMAT_CHARS[self.text_attributes.index(attr_char)] self.do_command(char, False) self.rewrite_text() diff --git a/poezio/windows/text_win.py b/poezio/windows/text_win.py index f4c78c2c..bba66d60 100644 --- a/poezio/windows/text_win.py +++ b/poezio/windows/text_win.py @@ -9,28 +9,16 @@ from math import ceil, log10 from typing import Optional, List, Union from poezio.windows.base_wins import Win, FORMAT_CHAR -from poezio.windows.funcs import truncate_nick, parse_attrs +from poezio.ui.funcs import truncate_nick, parse_attrs from poezio import poopt from poezio.config import config from poezio.theming import to_curses_attr, get_theme, dump_tuple -from poezio.text_buffer import Message +from poezio.ui.types import Line, Message log = logging.getLogger(__name__) -# msg is a reference to the corresponding Message object. text_start and -# text_end are the position delimiting the text in this line. -class Line: - __slots__ = ('msg', 'start_pos', 'end_pos', 'prepend') - - def __init__(self, msg: Message, start_pos: int, end_pos: int, prepend: str) -> None: - self.msg = msg - self.start_pos = start_pos - self.end_pos = end_pos - self.prepend = prepend - - class BaseTextWin(Win): __slots__ = ('lines_nb_limit', 'pos', 'built_lines', 'lock', 'lock_buffer', 'separator_after') @@ -360,55 +348,7 @@ class TextWin(BaseTextWin): """ 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 + return message.render(self.width, timestamp, nick_size) def refresh(self) -> None: log.debug('Refresh: %s', self.__class__.__name__) |