implemented controllers for key input

This commit is contained in:
Tobin
2015-03-30 17:18:29 -05:00
parent 346ba424f2
commit 6fcabe36e3
3 changed files with 43 additions and 106 deletions

View File

@@ -1,4 +1,5 @@
import curses import curses
import six
import praw.errors import praw.errors
@@ -126,11 +127,11 @@ class BaseController(object):
func = self.character_map.get(char) func = self.character_map.get(char)
if func is None: if func is None:
func = Controller.character_map.get(char) func = BaseController.character_map.get(char)
if func is None: if func is None:
func = self.character_map.get(None) func = self.character_map.get(None)
if func is None: if func is None:
func = Controller.character_map.get(None) func = BaseController.character_map.get(None)
return func(self.instance, *args, **kwargs) return func(self.instance, *args, **kwargs)
@classmethod @classmethod
@@ -164,9 +165,19 @@ class BasePage(object):
self._content_window = None self._content_window = None
self._subwindows = None self._subwindows = None
@BaseController.register('q')
def exit(self):
sys.exit()
@BaseController.register('?')
def help(self):
show_help(self.stdscr)
@BaseController.register(curses.KEY_UP, 'k')
def move_cursor_up(self): def move_cursor_up(self):
self._move_cursor(-1) self._move_cursor(-1)
@BaseController.register(curses.KEY_DOWN, 'j')
def move_cursor_down(self): def move_cursor_down(self):
self._move_cursor(1) self._move_cursor(1)
@@ -177,8 +188,8 @@ class BasePage(object):
continue continue
self.stdscr.nodelay(0) self.stdscr.nodelay(0)
@BaseController.register('a')
def upvote(self): def upvote(self):
data = self.content.get(self.nav.absolute_index) data = self.content.get(self.nav.absolute_index)
try: try:
if 'likes' not in data: if 'likes' not in data:
@@ -192,8 +203,8 @@ class BasePage(object):
except praw.errors.LoginOrScopeRequired: except praw.errors.LoginOrScopeRequired:
show_notification(self.stdscr, ['Login to vote']) show_notification(self.stdscr, ['Login to vote'])
@BaseController.register('z')
def downvote(self): def downvote(self):
data = self.content.get(self.nav.absolute_index) data = self.content.get(self.nav.absolute_index)
try: try:
if 'likes' not in data: if 'likes' not in data:

View File

@@ -5,20 +5,25 @@ import time
import praw.errors import praw.errors
from .content import SubmissionContent from .content import SubmissionContent
from .page import BasePage, Navigator from .page import BasePage, Navigator, BaseController
from .helpers import clean, open_browser, open_editor from .helpers import clean, open_browser, open_editor
from .curses_helpers import (BULLET, UARROW, DARROW, Color, LoadScreen, from .curses_helpers import (BULLET, UARROW, DARROW, Color, LoadScreen,
show_help, show_notification, text_input) show_help, show_notification, text_input)
from .docs import COMMENT_FILE from .docs import COMMENT_FILE
__all__ = ['SubmissionPage'] __all__ = ['SubmissionController', 'SubmissionPage']
class SubmissionController(BaseController):
character_map = {}
class SubmissionPage(BasePage): class SubmissionPage(BasePage):
def __init__(self, stdscr, reddit, url=None, submission=None): def __init__(self, stdscr, reddit, url=None, submission=None):
self.controller = SubmissionController(self)
self.loader = LoadScreen(stdscr) self.loader = LoadScreen(stdscr)
if url is not None: if url is not None:
content = SubmissionContent.from_url(reddit, url, self.loader) content = SubmissionContent.from_url(reddit, url, self.loader)
elif submission is not None: elif submission is not None:
@@ -30,59 +35,13 @@ class SubmissionPage(BasePage):
page_index=-1) page_index=-1)
def loop(self): def loop(self):
self.draw()
while True: while True:
self.draw()
cmd = self.stdscr.getch() cmd = self.stdscr.getch()
self.controller.trigger(cmd)
if cmd in (curses.KEY_UP, ord('k')): @SubmissionController.register(curses.KEY_RIGHT, 'l')
self.move_cursor_up()
self.clear_input_queue()
elif cmd in (curses.KEY_DOWN, ord('j')):
self.move_cursor_down()
self.clear_input_queue()
elif cmd in (curses.KEY_RIGHT, curses.KEY_ENTER, ord('l')):
self.toggle_comment()
self.draw()
elif cmd in (curses.KEY_LEFT, ord('h')):
break
elif cmd == ord('o'):
self.open_link()
self.draw()
elif cmd in (curses.KEY_F5, ord('r')):
self.refresh_content()
self.draw()
elif cmd == ord('c'):
self.add_comment()
self.draw()
elif cmd == ord('?'):
show_help(self.stdscr)
self.draw()
elif cmd == ord('a'):
self.upvote()
self.draw()
elif cmd == ord('z'):
self.downvote()
self.draw()
elif cmd == ord('q'):
sys.exit()
elif cmd == curses.KEY_RESIZE:
self.draw()
def toggle_comment(self): def toggle_comment(self):
current_index = self.nav.absolute_index current_index = self.nav.absolute_index
self.content.toggle(current_index) self.content.toggle(current_index)
if self.nav.inverted: if self.nav.inverted:
@@ -91,19 +50,20 @@ class SubmissionPage(BasePage):
# cursor index to go out of bounds. # cursor index to go out of bounds.
self.nav.page_index, self.nav.cursor_index = current_index, 0 self.nav.page_index, self.nav.cursor_index = current_index, 0
@SubmissionController.register(curses.KEY_F5, 'r')
def refresh_content(self): def refresh_content(self):
url = self.content.name url = self.content.name
self.content = SubmissionContent.from_url(self.reddit, url, self.loader) self.content = SubmissionContent.from_url(self.reddit, url, self.loader)
self.nav = Navigator(self.content.get, page_index=-1) self.nav = Navigator(self.content.get, page_index=-1)
@SubmissionController.register(curses.KEY_ENTER, 'o')
def open_link(self): def open_link(self):
# Always open the page for the submission # Always open the page for the submission
# May want to expand at some point to open comment permalinks # May want to expand at some point to open comment permalinks
url = self.content.get(-1)['permalink'] url = self.content.get(-1)['permalink']
open_browser(url) open_browser(url)
@SubmissionController.register('c')
def add_comment(self): def add_comment(self):
""" """
Add a comment on the submission if a header is selected. Add a comment on the submission if a header is selected.

View File

@@ -4,78 +4,41 @@ import sys
import requests import requests
from .exceptions import SubredditError from .exceptions import SubredditError
from .page import BasePage, Navigator from .page import BasePage, Navigator, BaseController
from .submission import SubmissionPage from .submission import SubmissionPage
from .content import SubredditContent from .content import SubredditContent
from .helpers import clean, open_browser from .helpers import clean, open_browser
from .curses_helpers import (BULLET, UARROW, DARROW, Color, LoadScreen, from .curses_helpers import (BULLET, UARROW, DARROW, Color, LoadScreen,
text_input, show_notification, show_help) text_input, show_notification, show_help)
__all__ = ['opened_links', 'SubredditPage'] __all__ = ['opened_links', 'SubredditController', 'SubredditPage']
# Used to keep track of browsing history across the current session # Used to keep track of browsing history across the current session
opened_links = set() opened_links = set()
class SubredditController(BaseController):
character_map = {}
class SubredditPage(BasePage): class SubredditPage(BasePage):
def __init__(self, stdscr, reddit, name): def __init__(self, stdscr, reddit, name):
self.controller = SubredditController(self)
self.loader = LoadScreen(stdscr) self.loader = LoadScreen(stdscr)
content = SubredditContent.from_name(reddit, name, self.loader) content = SubredditContent.from_name(reddit, name, self.loader)
super(SubredditPage, self).__init__(stdscr, reddit, content) super(SubredditPage, self).__init__(stdscr, reddit, content)
def loop(self): def loop(self):
self.draw()
while True: while True:
self.draw()
cmd = self.stdscr.getch() cmd = self.stdscr.getch()
self.controller.trigger(cmd)
if cmd in (curses.KEY_UP, ord('k')): @SubredditController.register(curses.KEY_F5, 'r')
self.move_cursor_up()
self.clear_input_queue()
elif cmd in (curses.KEY_DOWN, ord('j')):
self.move_cursor_down()
self.clear_input_queue()
elif cmd in (curses.KEY_RIGHT, curses.KEY_ENTER, ord('l')):
self.open_submission()
self.draw()
elif cmd == ord('o'):
self.open_link()
self.draw()
elif cmd in (curses.KEY_F5, ord('r')):
self.refresh_content()
self.draw()
elif cmd == ord('?'):
show_help(self.stdscr)
self.draw()
elif cmd == ord('a'):
self.upvote()
self.draw()
elif cmd == ord('z'):
self.downvote()
self.draw()
elif cmd == ord('q'):
sys.exit()
elif cmd == curses.KEY_RESIZE:
self.draw()
elif cmd == ord('/'):
self.prompt_subreddit()
self.draw()
def refresh_content(self, name=None): def refresh_content(self, name=None):
name = name or self.content.name name = name or self.content.name
try: try:
@@ -88,6 +51,7 @@ class SubredditPage(BasePage):
else: else:
self.nav = Navigator(self.content.get) self.nav = Navigator(self.content.get)
@SubredditController.register('/')
def prompt_subreddit(self): def prompt_subreddit(self):
"Open a prompt to type in a new subreddit" "Open a prompt to type in a new subreddit"
@@ -103,6 +67,7 @@ class SubredditPage(BasePage):
if out is not None: if out is not None:
self.refresh_content(name=out) self.refresh_content(name=out)
@SubredditController.register(curses.KEY_RIGHT, 'l')
def open_submission(self): def open_submission(self):
"Select the current submission to view posts" "Select the current submission to view posts"
@@ -114,6 +79,7 @@ class SubredditPage(BasePage):
global opened_links global opened_links
opened_links.add(data['url_full']) opened_links.add(data['url_full'])
@SubredditController.register(curses.KEY_ENTER, 'o')
def open_link(self): def open_link(self):
"Open a link with the webbrowser" "Open a link with the webbrowser"