commit 9ab4ee7b85b8c5f14e98dab2d344d85d1b256566
parent c651c5a91e493f2559fb7e3a0d9dd1011ff09b34
Author: luke8086 <55237178+luke8086@users.noreply.github.com>
Date: Sat, 23 Jul 2022 20:14:09 +0000
Initial support for message flags (read & starred)
Diffstat:
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/retronews.py b/retronews.py
@@ -37,10 +37,12 @@ class Colors:
curses.init_pair(idx, fg, bg)
return curses.color_pair(idx)
+ self.default = init_pair(curses.COLOR_WHITE, -1)
self.menu = init_pair(curses.COLOR_GREEN, curses.COLOR_BLUE)
self.date = init_pair(curses.COLOR_CYAN, -1)
self.author = init_pair(curses.COLOR_YELLOW, -1)
self.subject = init_pair(curses.COLOR_GREEN, -1)
+ self.starred_subject = init_pair(curses.COLOR_CYAN, -1)
self.tree = init_pair(curses.COLOR_RED, -1)
self.quote = init_pair(curses.COLOR_YELLOW, -1)
self.nested_quote = init_pair(curses.COLOR_BLUE, -1)
@@ -50,6 +52,12 @@ class Colors:
@dataclass
+class MessageFlags:
+ read: bool = False
+ starred: bool = False
+
+
+@dataclass
class Message:
msg_id: str
story_id: str
@@ -60,6 +68,7 @@ class Message:
body: Optional[str] = None
lines: List[str] = field(default_factory=list)
children: List["Message"] = field(default_factory=list)
+ flags: MessageFlags = field(default_factory=MessageFlags)
index_position: int = 0
index_tree: str = ""
@@ -176,8 +185,6 @@ def cmd_open(app: AppState) -> None:
if msg.msg_id == msg.story_id:
app_open_story(app, msg)
- app.pager_visible = True
-
def cmd_close(app: AppState) -> None:
if app.pager_visible:
@@ -186,6 +193,11 @@ def cmd_close(app: AppState) -> None:
app_close_story(app)
+def cmd_star(app: AppState) -> None:
+ if (msg := app.selected_message) is not None:
+ msg.flags.starred = not msg.flags.starred
+
+
def cmd_toggle_raw_mode(app: AppState) -> None:
app.raw_mode = not app.raw_mode
app_select_message(app, app.selected_message)
@@ -200,6 +212,7 @@ KEY_BINDINGS = {
ord("\n"): cmd_open,
ord(" "): cmd_open,
ord("x"): cmd_close,
+ ord("s"): cmd_star,
ord("r"): cmd_toggle_raw_mode,
curses.KEY_UP: cmd_up,
curses.KEY_DOWN: cmd_down,
@@ -208,7 +221,7 @@ KEY_BINDINGS = {
}
-def app_select_message(app: AppState, message: Optional[Message]) -> None:
+def app_select_message(app: AppState, message: Optional[Message], show_pager: bool = False) -> None:
app.selected_message = message
if message is None or message.body is None:
@@ -217,8 +230,16 @@ def app_select_message(app: AppState, message: Optional[Message]) -> None:
message.lines = wrap(message.body) if app.raw_mode else msg_build_lines(message)
+ if show_pager:
+ app.pager_visible = True
+
+ if app.pager_visible:
+ message.flags.read = True
-def app_load_messages(app: AppState, messages: List[Message], selected_message_id: Optional[str] = None) -> None:
+
+def app_load_messages(
+ app: AppState, messages: List[Message], selected_message_id: Optional[str] = None, show_pager: bool = False
+) -> None:
if selected_message_id is None and app.selected_message is not None:
selected_message_id = app.selected_message.msg_id
@@ -234,7 +255,7 @@ def app_load_messages(app: AppState, messages: List[Message], selected_message_i
selected_message = messages[0]
app.messages = messages
- app_select_message(app, selected_message)
+ app_select_message(app, selected_message, show_pager)
def app_close_story(app: AppState) -> None:
@@ -257,7 +278,7 @@ def app_open_story(app: AppState, story_message: Message) -> None:
story_messages = list(app_flatten_story(new_story_message, prefix="", is_last_child=False, is_top=True))
messages = app.messages[:index_pos] + story_messages + app.messages[index_pos + 1 :] # noqa: E203
- app_load_messages(app, messages, selected_message_id=story_message.msg_id)
+ app_load_messages(app, messages, selected_message_id=story_message.msg_id, show_pager=True)
def app_flatten_story(msg: Message, prefix, is_last_child, is_top=False) -> Generator[Message, None, None]:
@@ -330,9 +351,13 @@ def app_render_index_row(app: AppState, row: int, message: Message) -> None:
if message == app.selected_message:
app.screen.chgat(row, 0, cols, app.colors.cursor)
else:
+ subject_attr = app.colors.starred_subject if message.flags.starred else app.colors.default
+ subject_attr = subject_attr if message.flags.read else subject_attr | curses.A_BOLD
+
app.screen.chgat(row, 1, 16, app.colors.date)
app.screen.chgat(row, 21, 10, app.colors.author)
app.screen.chgat(row, 34, len(message.index_tree), app.colors.tree)
+ app.screen.chgat(row, 34 + len(message.index_tree), cols - 34 - len(message.index_tree), subject_attr)
def app_render_index(app: AppState, height: int) -> None: