diff --git a/toot/tui/app.py b/toot/tui/app.py index 4ba25ab..b49dee2 100644 --- a/toot/tui/app.py +++ b/toot/tui/app.py @@ -398,7 +398,9 @@ class TUI(urwid.Frame): def show_goto_menu(self): user_timelines = self.config.get("timelines", {}) - menu = GotoMenu(user_timelines) + user_lists = api.get_lists(self.app, self.user) or [] + + menu = GotoMenu(user_timelines, user_lists) urwid.connect_signal(menu, "home_timeline", lambda x: self.goto_home_timeline()) urwid.connect_signal(menu, "public_timeline", @@ -411,10 +413,12 @@ class TUI(urwid.Frame): lambda x, local: self.goto_conversations()) urwid.connect_signal(menu, "hashtag_timeline", lambda x, tag, local: self.goto_tag_timeline(tag, local=local)) + urwid.connect_signal(menu, "list_timeline", + lambda x, list_item: self.goto_list_timeline(list_item)) self.open_overlay(menu, title="Go to", options=dict( align="center", width=("relative", 60), - valign="middle", height=16 + len(user_timelines), + valign="middle", height=17 + len(user_timelines) + len(user_lists), )) def show_help(self): @@ -468,6 +472,13 @@ class TUI(urwid.Frame): ) promise.add_done_callback(lambda *args: self.close_overlay()) + def goto_list_timeline(self, list_item): + self.timeline_generator = api.timeline_list_generator( + self.app, self.user, list_item['id'], limit=40) + promise = self.async_load_timeline( + is_initial=True, timeline_name=f"\N{clipboard}{list_item['title']}") + promise.add_done_callback(lambda *args: self.close_overlay()) + def show_media(self, status): urls = [m["url"] for m in status.original.data["media_attachments"]] if urls: @@ -660,12 +671,19 @@ class TUI(urwid.Frame): def refresh_timeline(self): # No point in refreshing the bookmarks timeline - if not self.timeline or self.timeline.name == 'bookmarks': + # and we don't have a good way to refresh a + # list timeline yet (no reference to list ID kept) + if (not self.timeline + or self.timeline.name == 'bookmarks' + or self.timeline.name.startswith("\N{clipboard}")): return if self.timeline.name.startswith("#"): self.timeline_generator = api.tag_timeline_generator( self.app, self.user, self.timeline.name[1:], limit=40) + elif self.timeline.name.startswith("\N{clipboard}"): + self.timeline_generator = api.tag_timeline_generator( + self.app, self.user, self.timeline.name[1:], limit=40) else: if self.timeline.name.endswith("public"): self.timeline_generator = api.public_timeline_generator( diff --git a/toot/tui/overlays.py b/toot/tui/overlays.py index 58b902a..a9c2442 100644 --- a/toot/tui/overlays.py +++ b/toot/tui/overlays.py @@ -102,20 +102,21 @@ class GotoMenu(urwid.ListBox): "bookmark_timeline", "notification_timeline", "conversation_timeline", + "list_timeline", ] - def __init__(self, user_timelines): + def __init__(self, user_timelines, user_lists): self.hash_edit = EditBox(caption="Hashtag: ") self.message_widget = urwid.Text("") - actions = list(self.generate_actions(user_timelines)) + actions = list(self.generate_actions(user_timelines, user_lists)) walker = urwid.SimpleFocusListWalker(actions) super().__init__(walker) def get_hashtag(self): return self.hash_edit.edit_text.strip().lstrip("#") - def generate_actions(self, user_timelines): + def generate_actions(self, user_timelines, user_lists): def _home(button): self._emit("home_timeline") @@ -147,6 +148,11 @@ class GotoMenu(urwid.ListBox): self._emit("hashtag_timeline", tag, local) return on_press + def mk_on_press_user_list(list_item): + def on_press(btn): + self._emit("list_timeline", list_item) + return on_press + yield Button("Home timeline", on_press=_home) yield Button("Local public timeline", on_press=_local_public) yield Button("Global public timeline", on_press=_global_public) @@ -164,6 +170,10 @@ class GotoMenu(urwid.ListBox): yield Button(f"#{tag}" + (" (local)" if is_local else ""), on_press=mk_on_press_user_hashtag(tag, is_local)) + for list_item in user_lists: + yield Button(f"\N{clipboard}{list_item['title']}", + on_press=mk_on_press_user_list(list_item)) + yield urwid.Divider() yield self.hash_edit yield Button("Local hashtag timeline", on_press=lambda x: _hashtag(True))