1
0
mirror of https://github.com/ihabunek/toot.git synced 2024-06-30 06:35:24 +00:00

Prepare for context menu

This commit is contained in:
Ivan Habunek 2019-08-30 12:28:03 +02:00
parent 330fd03b01
commit 07e6c372bc
No known key found for this signature in database
GPG Key ID: CDBD63C43A30BB95
5 changed files with 37 additions and 19 deletions

View File

@ -5,6 +5,7 @@ Interesting urwid implementations:
Check out: Check out:
* https://github.com/rr-/urwid_readline - better edit box? * https://github.com/rr-/urwid_readline - better edit box?
* https://github.com/prompt-toolkit/python-prompt-toolkit
TODO/Ideas: TODO/Ideas:
* pack left column in timeline view * pack left column in timeline view
@ -26,6 +27,10 @@ TODO/Ideas:
* Status source * Status source
* shortcut to copy source * shortcut to copy source
* syntax highlighting? * syntax highlighting?
* reblog
* show author in status list, not person who reblogged
* "v" should open the reblogged status, status.url is empty for the reblog
Questions: Questions:
* is it possible to make a span a urwid.Text selectable? e.g. for urls and hashtags * is it possible to make a span a urwid.Text selectable? e.g. for urls and hashtags

View File

@ -175,6 +175,9 @@ class TUI(urwid.Frame):
def _media(timeline, status): def _media(timeline, status):
self.show_media(status) self.show_media(status)
def _menu(timeline, status):
self.show_context_menu(status)
urwid.connect_signal(timeline, "focus", self.refresh_footer) urwid.connect_signal(timeline, "focus", self.refresh_footer)
urwid.connect_signal(timeline, "reblog", self.async_toggle_reblog) urwid.connect_signal(timeline, "reblog", self.async_toggle_reblog)
urwid.connect_signal(timeline, "favourite", self.async_toggle_favourite) urwid.connect_signal(timeline, "favourite", self.async_toggle_favourite)
@ -182,6 +185,7 @@ class TUI(urwid.Frame):
urwid.connect_signal(timeline, "compose", _compose) urwid.connect_signal(timeline, "compose", _compose)
urwid.connect_signal(timeline, "reply", _reply) urwid.connect_signal(timeline, "reply", _reply)
urwid.connect_signal(timeline, "media", _media) urwid.connect_signal(timeline, "media", _media)
urwid.connect_signal(timeline, "menu", _menu)
def build_timeline(self, statuses): def build_timeline(self, statuses):
def _close(*args): def _close(*args):
@ -291,6 +295,10 @@ class TUI(urwid.Frame):
if urls: if urls:
show_media(urls) show_media(urls)
def show_context_menu(self, status):
# TODO: show context menu
pass
def post_status(self, content, warning, visibility, in_reply_to_id): def post_status(self, content, warning, visibility, in_reply_to_id):
data = api.post_status(self.app, self.user, content, data = api.post_status(self.app, self.user, content,
spoiler_text=warning, spoiler_text=warning,

View File

@ -2,27 +2,10 @@ import urwid
import logging import logging
from .constants import VISIBILITY_OPTIONS from .constants import VISIBILITY_OPTIONS
from .widgets import Button, EditBox
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class EditBox(urwid.AttrWrap):
def __init__(self):
edit = urwid.Edit(multiline=True, allow_tab=True)
return super().__init__(edit, "editbox", "editbox_focused")
class Button(urwid.AttrWrap):
def __init__(self, *args, **kwargs):
button = urwid.Button(*args, **kwargs)
padding = urwid.Padding(button, width=len(args[0]) + 4)
return super().__init__(padding, "button", "button_focused")
def set_label(self, *args, **kwargs):
self.original_widget.original_widget.set_label(*args, **kwargs)
self.original_widget.width = len(args[0]) + 4
class StatusComposer(urwid.Frame): class StatusComposer(urwid.Frame):
""" """
UI for compose and posting a status message. UI for compose and posting a status message.

View File

@ -20,6 +20,7 @@ class Timeline(urwid.Columns):
"favourite", # Favourite status "favourite", # Favourite status
"focus", # Focus changed "focus", # Focus changed
"media", # Display media attachments "media", # Display media attachments
"menu", # Show a context menu
"next", # Fetch more statuses "next", # Fetch more statuses
"reblog", # Reblog status "reblog", # Reblog status
"reply", # Compose a reply to a status "reply", # Compose a reply to a status
@ -38,7 +39,7 @@ class Timeline(urwid.Columns):
("weight", 40, self.status_list), ("weight", 40, self.status_list),
("weight", 0, urwid.AttrWrap(urwid.SolidFill(""), "blue_selected")), ("weight", 0, urwid.AttrWrap(urwid.SolidFill(""), "blue_selected")),
("weight", 60, self.status_details), ("weight", 60, self.status_details),
], dividechars=1) ])
def build_status_list(self, statuses, focus): def build_status_list(self, statuses, focus):
items = [self.build_list_item(status) for status in statuses] items = [self.build_list_item(status) for status in statuses]
@ -49,6 +50,8 @@ class Timeline(urwid.Columns):
def build_list_item(self, status): def build_list_item(self, status):
item = StatusListItem(status) item = StatusListItem(status)
urwid.connect_signal(item, "click", lambda *args:
self._emit("menu", status))
return urwid.AttrMap(item, None, focus_map={ return urwid.AttrMap(item, None, focus_map={
"blue": "green_selected", "blue": "green_selected",
"green": "green_selected", "green": "green_selected",

View File

@ -27,3 +27,22 @@ class SelectableText(Clickable, urwid.Text):
class SelectableColumns(Clickable, urwid.Columns): class SelectableColumns(Clickable, urwid.Columns):
_selectable = True _selectable = True
class EditBox(urwid.AttrWrap):
"""Styled edit box."""
def __init__(self):
edit = urwid.Edit(multiline=True, allow_tab=True)
return super().__init__(edit, "editbox", "editbox_focused")
class Button(urwid.AttrWrap):
"""Styled button."""
def __init__(self, *args, **kwargs):
button = urwid.Button(*args, **kwargs)
padding = urwid.Padding(button, width=len(args[0]) + 4)
return super().__init__(padding, "button", "button_focused")
def set_label(self, *args, **kwargs):
self.original_widget.original_widget.set_label(*args, **kwargs)
self.original_widget.width = len(args[0]) + 4