From 31462fe6f8f31a9fec4f0320b22dece70beec23e Mon Sep 17 00:00:00 2001 From: Ivan Habunek Date: Thu, 29 Aug 2019 11:01:49 +0200 Subject: [PATCH] Implement replies --- toot/tui/app.py | 19 +++++++++++++------ toot/tui/compose.py | 16 ++++++++++------ toot/tui/timeline.py | 13 +++++++------ 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/toot/tui/app.py b/toot/tui/app.py index b80998b..7f873a5 100644 --- a/toot/tui/app.py +++ b/toot/tui/app.py @@ -164,6 +164,10 @@ class TUI(urwid.Frame): def _compose(*args): self.show_compose() + def _reply(timeline, status): + logger.info("reply") + self.show_compose(status) + def _source(timeline, status): self.show_status_source(status) @@ -172,6 +176,7 @@ class TUI(urwid.Frame): urwid.connect_signal(timeline, "favourite", self.async_toggle_favourite) urwid.connect_signal(timeline, "source", _source) urwid.connect_signal(timeline, "compose", _compose) + urwid.connect_signal(timeline, "reply", _reply) def build_timeline(self, statuses): def _close(*args): @@ -264,21 +269,23 @@ class TUI(urwid.Frame): title="Unhandled Exception", ) - def show_compose(self): + def show_compose(self, in_reply_to=None): def _close(*args): self.close_overlay() - def _post(timeline, content, warning, visibility): - self.post_status(content, warning, visibility) + def _post(timeline, *args): + self.post_status(*args) - composer = StatusComposer() + composer = StatusComposer(in_reply_to) urwid.connect_signal(composer, "close", _close) urwid.connect_signal(composer, "post", _post) self.open_overlay(composer, title="Compose status") - def post_status(self, content, warning, visibility): + def post_status(self, content, warning, visibility, in_reply_to_id): data = api.post_status(self.app, self.user, content, - spoiler_text=warning, visibility=visibility) + spoiler_text=warning, + visibility=visibility, + in_reply_to_id=in_reply_to_id) status = Status(data, self.app.instance) # TODO: instead of this, fetch new items from the timeline? diff --git a/toot/tui/compose.py b/toot/tui/compose.py index 87ae0dd..914a569 100644 --- a/toot/tui/compose.py +++ b/toot/tui/compose.py @@ -29,11 +29,10 @@ class StatusComposer(urwid.Frame): """ signals = ["close", "post"] - def __init__(self): - self.content_caption = urwid.Text("Status message") + def __init__(self, in_reply_to=None): + self.in_reply_to = in_reply_to self.content_edit = EditBox() - self.cw_caption = urwid.Text("Content warning") self.cw_edit = None self.cw_add_button = Button("Add content warning", on_press=self.add_content_warning) @@ -53,12 +52,16 @@ class StatusComposer(urwid.Frame): return super().__init__(self.listbox) def generate_list_items(self): - yield self.content_caption + if self.in_reply_to: + yield urwid.Text(("gray", "Replying to {}".format(self.in_reply_to.account))) + yield urwid.AttrWrap(urwid.Divider("-"), "gray") + + yield urwid.Text("Status message") yield self.content_edit yield urwid.Divider() if self.cw_edit: - yield self.cw_caption + yield urwid.Text("Content warning") yield self.cw_edit yield urwid.Divider() yield self.cw_remove_button @@ -125,7 +128,8 @@ class StatusComposer(urwid.Frame): self.set_error_message("Cannot post an empty message") return - self._emit("post", content, warning, self.visibility) + in_reply_to_id = self.in_reply_to.id if self.in_reply_to else None + self._emit("post", content, warning, self.visibility, in_reply_to_id) def close(self, button): self._emit("close") diff --git a/toot/tui/timeline.py b/toot/tui/timeline.py index b960506..6bbabb2 100644 --- a/toot/tui/timeline.py +++ b/toot/tui/timeline.py @@ -21,6 +21,7 @@ class Timeline(urwid.Columns): "focus", # Focus changed "next", # Fetch more statuses "reblog", # Reblog status + "reply", # Compose a reply to a status "source", # Show status source "thread", # Show thread for status ] @@ -85,6 +86,7 @@ class Timeline(urwid.Columns): self.contents[2] = self.status_details, ("weight", 60, False) def keypress(self, size, key): + status = self.get_focused_status() command = self._command_map[key] # If down is pressed on last status in list emit a signal to load more. @@ -96,7 +98,6 @@ class Timeline(urwid.Columns): self._emit("next") if key in ("b", "B"): - status = self.get_focused_status() self._emit("reblog", status) return @@ -105,7 +106,6 @@ class Timeline(urwid.Columns): return if key in ("f", "F"): - status = self.get_focused_status() self._emit("favourite", status) return @@ -113,19 +113,20 @@ class Timeline(urwid.Columns): self._emit("close") return + if key in ("r", "R"): + self._emit("reply", status) + return + if key in ("t", "T"): - status = self.get_focused_status() self._emit("thread", status) return if key in ("v", "V"): - status = self.get_focused_status() if status.data["url"]: webbrowser.open(status.data["url"]) return if key in ("u", "U"): - status = self.get_focused_status() self._emit("source", status) return @@ -220,7 +221,7 @@ class StatusDetails(urwid.Pile): # Push things to bottom yield ("weight", 1, urwid.SolidFill(" ")) - options = "[B]oost [F]avourite [V]iew {}So[u]rce [H]elp".format( + options = "[B]oost [F]avourite [V]iew {}[R]eply So[u]rce [H]elp".format( "[T]hread " if not self.in_thread else "") options = highlight_keys(options, "cyan_bold", "cyan") yield ("pack", urwid.Text(options))