diff --git a/rtv/page.py b/rtv/page.py index 5a3012e..a4f329b 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -1,4 +1,5 @@ import curses +import six import praw.errors @@ -126,11 +127,11 @@ class BaseController(object): func = self.character_map.get(char) if func is None: - func = Controller.character_map.get(char) + func = BaseController.character_map.get(char) if func is None: func = self.character_map.get(None) if func is None: - func = Controller.character_map.get(None) + func = BaseController.character_map.get(None) return func(self.instance, *args, **kwargs) @classmethod @@ -164,9 +165,19 @@ class BasePage(object): self._content_window = 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): self._move_cursor(-1) + @BaseController.register(curses.KEY_DOWN, 'j') def move_cursor_down(self): self._move_cursor(1) @@ -177,8 +188,8 @@ class BasePage(object): continue self.stdscr.nodelay(0) + @BaseController.register('a') def upvote(self): - data = self.content.get(self.nav.absolute_index) try: if 'likes' not in data: @@ -192,8 +203,8 @@ class BasePage(object): except praw.errors.LoginOrScopeRequired: show_notification(self.stdscr, ['Login to vote']) + @BaseController.register('z') def downvote(self): - data = self.content.get(self.nav.absolute_index) try: if 'likes' not in data: diff --git a/rtv/submission.py b/rtv/submission.py index 5e8198c..0c35bda 100644 --- a/rtv/submission.py +++ b/rtv/submission.py @@ -5,20 +5,25 @@ import time import praw.errors from .content import SubmissionContent -from .page import BasePage, Navigator +from .page import BasePage, Navigator, BaseController from .helpers import clean, open_browser, open_editor from .curses_helpers import (BULLET, UARROW, DARROW, Color, LoadScreen, show_help, show_notification, text_input) from .docs import COMMENT_FILE -__all__ = ['SubmissionPage'] +__all__ = ['SubmissionController', 'SubmissionPage'] + + +class SubmissionController(BaseController): + character_map = {} + class SubmissionPage(BasePage): def __init__(self, stdscr, reddit, url=None, submission=None): + self.controller = SubmissionController(self) self.loader = LoadScreen(stdscr) - if url is not None: content = SubmissionContent.from_url(reddit, url, self.loader) elif submission is not None: @@ -30,59 +35,13 @@ class SubmissionPage(BasePage): page_index=-1) def loop(self): - - self.draw() - while True: + self.draw() cmd = self.stdscr.getch() + self.controller.trigger(cmd) - if cmd in (curses.KEY_UP, ord('k')): - 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() - + @SubmissionController.register(curses.KEY_RIGHT, 'l') def toggle_comment(self): - current_index = self.nav.absolute_index self.content.toggle(current_index) if self.nav.inverted: @@ -91,19 +50,20 @@ class SubmissionPage(BasePage): # cursor index to go out of bounds. self.nav.page_index, self.nav.cursor_index = current_index, 0 + @SubmissionController.register(curses.KEY_F5, 'r') def refresh_content(self): - url = self.content.name self.content = SubmissionContent.from_url(self.reddit, url, self.loader) self.nav = Navigator(self.content.get, page_index=-1) + @SubmissionController.register(curses.KEY_ENTER, 'o') def open_link(self): - # Always open the page for the submission # May want to expand at some point to open comment permalinks url = self.content.get(-1)['permalink'] open_browser(url) + @SubmissionController.register('c') def add_comment(self): """ Add a comment on the submission if a header is selected. diff --git a/rtv/subreddit.py b/rtv/subreddit.py index 8e6b47a..a75b8da 100644 --- a/rtv/subreddit.py +++ b/rtv/subreddit.py @@ -4,78 +4,41 @@ import sys import requests from .exceptions import SubredditError -from .page import BasePage, Navigator +from .page import BasePage, Navigator, BaseController from .submission import SubmissionPage from .content import SubredditContent from .helpers import clean, open_browser from .curses_helpers import (BULLET, UARROW, DARROW, Color, LoadScreen, 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 opened_links = set() + +class SubredditController(BaseController): + character_map = {} + + class SubredditPage(BasePage): def __init__(self, stdscr, reddit, name): + self.controller = SubredditController(self) self.loader = LoadScreen(stdscr) content = SubredditContent.from_name(reddit, name, self.loader) super(SubredditPage, self).__init__(stdscr, reddit, content) def loop(self): - - self.draw() - while True: + self.draw() cmd = self.stdscr.getch() + self.controller.trigger(cmd) - if cmd in (curses.KEY_UP, ord('k')): - 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() - + @SubredditController.register(curses.KEY_F5, 'r') def refresh_content(self, name=None): - name = name or self.content.name try: @@ -88,6 +51,7 @@ class SubredditPage(BasePage): else: self.nav = Navigator(self.content.get) + @SubredditController.register('/') def prompt_subreddit(self): "Open a prompt to type in a new subreddit" @@ -103,6 +67,7 @@ class SubredditPage(BasePage): if out is not None: self.refresh_content(name=out) + @SubredditController.register(curses.KEY_RIGHT, 'l') def open_submission(self): "Select the current submission to view posts" @@ -114,6 +79,7 @@ class SubredditPage(BasePage): global opened_links opened_links.add(data['url_full']) + @SubredditController.register(curses.KEY_ENTER, 'o') def open_link(self): "Open a link with the webbrowser"