from uuid import UUID
# ourselves
from ircplom.events import PayloadMixin
-from ircplom.tui_base import (BaseTui, Window, TuiEvent, CMD_SHORTCUTS,
- PROMPT_TEMPLATE)
+from ircplom.tui_base import (BaseTui, PromptWidget, TuiEvent, Window,
+ CMD_SHORTCUTS)
from ircplom.irc_conn import IrcMessage
from ircplom.client import (CHAT_GLOB, IrcConnSetup, Client,
ClientIdMixin, ClientQueueMixin,
CMD_SHORTCUTS['reconnect'] = 'window.reconnect'
+class _ClientPromptWidget(PromptWidget):
+ _prefix: str = ''
+
+ @property
+ def prefix(self) -> str:
+ return self._prefix + super().prefix
+
+ @prefix.setter
+ def prefix(self, to_set: str) -> None:
+ self._prefix = to_set
+ self.tainted = True
+
+ def prefix_copy_to(self, other: '_ClientPromptWidget') -> None:
+ 'Copy over .prefix to other.'
+ other.prefix = self._prefix
+
+
class _ClientWindow(Window, ClientQueueMixin):
client_id_name = 'client_id'
+ prompt: _ClientPromptWidget
def __init__(self, client_id: UUID, chat: str = '', **kwargs) -> None:
self.client_id = client_id
return candidates[0]
win = self._new_client_window(client_id=client_id, chat=chat)
if client_wins:
- win.prompt.prefix = client_wins[0].prompt.prefix
+ client_wins[0].prompt.prefix_copy_to(win.prompt)
return win
def cmd__connect(self, hostname: str, nickname: str, realname: str
payload: tuple[str, str]
def affect(self, target: ClientTui) -> None:
- new_prefix = ((' ' if self.payload[0] else '?')
- + f'{self.payload[1]}{PROMPT_TEMPLATE}')
+ new_prefix = (' ' if self.payload[0] else '?') + self.payload[1]
for win in target.client_wins(self.client_id):
- prompt = win.prompt
- prompt.prefix = new_prefix
- prompt.tainted = True
+ win.prompt.prefix = new_prefix
target.redraw_affected()
self._history_idx = history_idx_to_wrapped_idx - len(self._history)
-class _PromptWidget(_ScrollableWidget):
+class PromptWidget(_ScrollableWidget):
+ 'Manages/displays keyboard input field.'
_y: int
_width: int
_history_idx: int = 0
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
- self.prefix = PROMPT_TEMPLATE
self._reset_buffer('')
+ @property
+ def prefix(self) -> str:
+ 'Main input prefix.'
+ return PROMPT_TEMPLATE[:]
+
@property
def _input_buffer(self) -> str:
return self._input_buffer_unsafe[:]
class Window(_Widget):
'Widget filling entire screen with sub-widgets like .prompt, .log.'
_y_status: int
- prompt: _PromptWidget
+ prompt: PromptWidget
def __init__(self, idx: int, term: 'Terminal', **kwargs) -> None:
super().__init__(**kwargs)