mirror of
https://github.com/ihabunek/toot.git
synced 2024-09-29 04:35:54 -04:00
Prepare for context menu
This commit is contained in:
parent
330fd03b01
commit
07e6c372bc
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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.
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user