From 68906b2a672a3ea94711ba27b3993382178c2869 Mon Sep 17 00:00:00 2001 From: Michael Lazar Date: Wed, 20 Sep 2017 01:04:23 -0400 Subject: [PATCH] Refactoring and adding some new themes --- rtv/content.py | 1 + rtv/page.py | 23 ++- rtv/submission_page.py | 8 +- rtv/theme.py | 248 +++++++++++++-------------------- rtv/themes/default.cfg.example | 11 +- rtv/themes/high_contrast.cfg | 50 +++++++ rtv/themes/molokai.cfg | 73 ++++++++++ rtv/themes/papercolor.cfg | 71 ++++++++++ rtv/themes/solarized-dark.cfg | 22 +-- rtv/themes/solarized-light.cfg | 28 ++-- scripts/demo_theme.py | 34 +++-- 11 files changed, 356 insertions(+), 213 deletions(-) create mode 100644 rtv/themes/high_contrast.cfg create mode 100644 rtv/themes/molokai.cfg create mode 100644 rtv/themes/papercolor.cfg diff --git a/rtv/content.py b/rtv/content.py index 2b6d799..d191709 100644 --- a/rtv/content.py +++ b/rtv/content.py @@ -217,6 +217,7 @@ class Content(object): data['title'] = sub.title data['text'] = sub.selftext data['created'] = cls.humanize_timestamp(sub.created_utc) + data['created_long'] = cls.humanize_timestamp(sub.created_utc, True) data['comments'] = '{0} comments'.format(sub.num_comments) data['score'] = '{0} pts'.format('-' if sub.hide_score else sub.score) data['author'] = name diff --git a/rtv/page.py b/rtv/page.py index ae3553e..06e7657 100644 --- a/rtv/page.py +++ b/rtv/page.py @@ -11,7 +11,7 @@ import six from kitchen.text.display import textual_width from . import docs -from .theme import ThemeList +from .theme import get_next_theme, get_previous_theme from .objects import Controller, Command from .clipboard import copy from .exceptions import TemporaryFileError, ProgramError @@ -52,9 +52,6 @@ class Page(object): self.controller = None self.copy_to_clipboard = copy - # TODO: does this need to be a global? - self.theme_list = ThemeList(term.theme) - self.active = True self._row = 0 self._subwindows = None @@ -101,7 +98,7 @@ class Page(object): @PageController.register(Command('PREVIOUS_THEME')) def previous_theme(self): - theme = self.theme_list.previous() + theme = get_previous_theme(self.term.theme) self.term.set_theme(theme) self.draw() message = self.term.theme.display_string @@ -109,7 +106,7 @@ class Page(object): @PageController.register(Command('NEXT_THEME')) def next_theme(self): - theme = self.theme_list.next() + theme = get_next_theme(self.term.theme) self.term.set_theme(theme) self.draw() message = self.term.theme.display_string @@ -367,7 +364,7 @@ class Page(object): window = self.term.stdscr.derwin(1, n_cols, self._row, 0) window.erase() # curses.bkgd expects bytes in py2 and unicode in py3 - window.bkgd(str(' '), self.term.attr('PageTitle')) + window.bkgd(str(' '), self.term.attr('TitleBar')) sub_name = self.content.name sub_name = sub_name.replace('/r/front', 'Front Page') @@ -420,7 +417,7 @@ class Page(object): n_rows, n_cols = self.term.stdscr.getmaxyx() window = self.term.stdscr.derwin(1, n_cols, self._row, 0) window.erase() - window.bkgd(str(' '), self.term.attr('PageOrder')) + window.bkgd(str(' '), self.term.attr('OrderBar')) banner = docs.BANNER_SEARCH if self.content.query else docs.BANNER items = banner.strip().split(' ') @@ -432,7 +429,7 @@ class Page(object): if self.content.order is not None: order = self.content.order.split('-')[0] col = text.find(order) - 3 - attr = self.term.attr('PageOrderHighlight') + attr = self.term.attr('OrderBarHighlight') window.chgat(0, col, 3, attr) self._row += 1 @@ -499,12 +496,10 @@ class Page(object): # pushed out of bounds self.nav.cursor_index = len(self._subwindows) - 1 - # TODO: Don't highlight the submission box - # Now that the windows are setup, we can take a second pass through - # to draw the content + # to draw the text onto each subwindow for index, (win, data, inverted) in enumerate(self._subwindows): - if index == self.nav.cursor_index: + if self.nav.absolute_index >= 0 and index == self.nav.cursor_index: win.bkgd(str(' '), self.term.attr('Selected')) with self.term.theme.turn_on_selected(): self._draw_item(win, data, inverted) @@ -519,7 +514,7 @@ class Page(object): n_rows, n_cols = self.term.stdscr.getmaxyx() window = self.term.stdscr.derwin(1, n_cols, self._row, 0) window.erase() - window.bkgd(str(' '), self.term.attr('Help')) + window.bkgd(str(' '), self.term.attr('HelpBar')) text = self.FOOTER.strip() self.term.add_line(window, text, 0, 0) diff --git a/rtv/submission_page.py b/rtv/submission_page.py index fee0dd3..3e23c22 100644 --- a/rtv/submission_page.py +++ b/rtv/submission_page.py @@ -400,14 +400,14 @@ class SubmissionPage(Page): self.term.add_space(win) self.term.add_line(win, '{flair}'.format(**data), attr=attr) - attr = self.term.attr('Created') - self.term.add_space(win) - self.term.add_line(win, '{created}'.format(**data), attr=attr) - attr = self.term.attr('SubmissionSubreddit') self.term.add_space(win) self.term.add_line(win, '/r/{subreddit}'.format(**data), attr=attr) + attr = self.term.attr('Created') + self.term.add_space(win) + self.term.add_line(win, '{created_long}'.format(**data), attr=attr) + row = len(data['split_title']) + 2 if data['url_full'] in self.config.history: attr = self.term.attr('LinkSeen') diff --git a/rtv/theme.py b/rtv/theme.py index 2049407..11870c6 100644 --- a/rtv/theme.py +++ b/rtv/theme.py @@ -50,114 +50,70 @@ class Theme(object): for i in range(256): COLOR_CODES['ansi_{0}'.format(i)] = i - # TODO: Do another pass through these names + # TODO: Apply selected on top of items, not underneath them # For compatibility with as many terminals as possible, the default theme # can only use the 8 basic colors with the default color as the background DEFAULT_THEME = { - 'Normal': (None, None, None), - 'Selected': (None, None, None), - 'SelectedCursor': (None, None, curses.A_REVERSE), - - 'PageTitle': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE), - 'PageOrder': (curses.COLOR_YELLOW, None, curses.A_BOLD), - 'PageOrderHighlight': (curses.COLOR_YELLOW, None, curses.A_BOLD | curses.A_REVERSE), - 'Help': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE), - 'Prompt': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE), - 'NoticeInfo': (None, None, curses.A_BOLD), - 'NoticeLoading': (None, None, curses.A_BOLD), - 'NoticeError': (None, None, curses.A_BOLD), - 'NoticeSuccess': (None, None, curses.A_BOLD), - - 'CursorBlock': (None, None, None), - 'CursorBar1': (curses.COLOR_MAGENTA, None, None), - 'CursorBar2': (curses.COLOR_CYAN, None, None), - 'CursorBar3': (curses.COLOR_GREEN, None, None), - 'CursorBar4': (curses.COLOR_YELLOW, None, None), - - 'CommentAuthor': (curses.COLOR_BLUE, None, curses.A_BOLD), - 'CommentAuthorSelf': (curses.COLOR_GREEN, None, curses.A_BOLD), - 'CommentCount': (None, None, None), - 'CommentText': (None, None, None), - 'Created': (None, None, None), - 'Downvote': (curses.COLOR_RED, None, curses.A_BOLD), - 'Gold': (curses.COLOR_YELLOW, None, curses.A_BOLD), - 'HiddenCommentExpand': (None, None, curses.A_BOLD), - 'HiddenCommentText': (None, None, None), - 'MultiredditName': (curses.COLOR_YELLOW, None, curses.A_BOLD), - 'MultiredditText': (None, None, None), - 'NeutralVote': (None, None, curses.A_BOLD), - 'NSFW': (curses.COLOR_RED, None, curses.A_BOLD), - 'Saved': (curses.COLOR_GREEN, None, None), - 'Score': (None, None, None), - 'Separator': (None, None, curses.A_BOLD), - 'Stickied': (curses.COLOR_GREEN, None, None), - 'SubscriptionName': (curses.COLOR_YELLOW, None, curses.A_BOLD), - 'SubscriptionText': (None, None, None), - 'SubmissionAuthor': (curses.COLOR_GREEN, None, None), - 'SubmissionFlair': (curses.COLOR_RED, None, None), - 'SubmissionSubreddit': (curses.COLOR_YELLOW, None, None), - 'SubmissionText': (None, None, None), - 'SubmissionTitle': (None, None, curses.A_BOLD), - 'Upvote': (curses.COLOR_GREEN, None, curses.A_BOLD), - 'Link': (curses.COLOR_BLUE, None, curses.A_UNDERLINE), - 'LinkSeen': (curses.COLOR_MAGENTA, None, curses.A_UNDERLINE), - 'UserFlair': (curses.COLOR_YELLOW, None, curses.A_BOLD) + 'modifiers': { + 'Normal': (None, None, None), + 'Selected': (None, None, None), + 'SelectedCursor': (None, None, curses.A_REVERSE), + }, + 'page': { + 'TitleBar': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE), + 'OrderBar': (curses.COLOR_YELLOW, None, curses.A_BOLD), + 'OrderBarHighlight': (curses.COLOR_YELLOW, None, curses.A_BOLD | curses.A_REVERSE), + 'HelpBar': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE), + 'Prompt': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE), + 'NoticeInfo': (None, None, curses.A_BOLD), + 'NoticeLoading': (None, None, curses.A_BOLD), + 'NoticeError': (None, None, curses.A_BOLD), + 'NoticeSuccess': (None, None, curses.A_BOLD), + }, + # Fields that might be highlighted by the "SelectedCursor" element + 'cursor': { + 'CursorBlock': (None, None, None), + 'CursorBar1': (curses.COLOR_MAGENTA, None, None), + 'CursorBar2': (curses.COLOR_CYAN, None, None), + 'CursorBar3': (curses.COLOR_GREEN, None, None), + 'CursorBar4': (curses.COLOR_YELLOW, None, None), + }, + # Fields that might be highlighted by the "Selected" element + 'normal': { + 'CommentAuthor': (curses.COLOR_BLUE, None, curses.A_BOLD), + 'CommentAuthorSelf': (curses.COLOR_GREEN, None, curses.A_BOLD), + 'CommentCount': (None, None, None), + 'CommentText': (None, None, None), + 'Created': (None, None, None), + 'Downvote': (curses.COLOR_RED, None, curses.A_BOLD), + 'Gold': (curses.COLOR_YELLOW, None, curses.A_BOLD), + 'HiddenCommentExpand': (None, None, curses.A_BOLD), + 'HiddenCommentText': (None, None, None), + 'MultiredditName': (curses.COLOR_YELLOW, None, curses.A_BOLD), + 'MultiredditText': (None, None, None), + 'NeutralVote': (None, None, curses.A_BOLD), + 'NSFW': (curses.COLOR_RED, None, curses.A_BOLD), + 'Saved': (curses.COLOR_GREEN, None, None), + 'Score': (None, None, None), + 'Separator': (None, None, curses.A_BOLD), + 'Stickied': (curses.COLOR_GREEN, None, None), + 'SubscriptionName': (curses.COLOR_YELLOW, None, curses.A_BOLD), + 'SubscriptionText': (None, None, None), + 'SubmissionAuthor': (curses.COLOR_GREEN, None, None), + 'SubmissionFlair': (curses.COLOR_RED, None, None), + 'SubmissionSubreddit': (curses.COLOR_YELLOW, None, None), + 'SubmissionText': (None, None, None), + 'SubmissionTitle': (None, None, curses.A_BOLD), + 'Upvote': (curses.COLOR_GREEN, None, curses.A_BOLD), + 'Link': (curses.COLOR_BLUE, None, curses.A_UNDERLINE), + 'LinkSeen': (curses.COLOR_MAGENTA, None, curses.A_UNDERLINE), + 'UserFlair': (curses.COLOR_YELLOW, None, curses.A_BOLD) + } } - # List of elements that might be highlighted by the "Selected" row - SELECTED_ELEMENTS = [ - 'CommentAuthor', - 'CommentAuthorSelf', - 'CommentCount', - 'CommentText', - 'Created', - 'Downvote', - 'Gold', - 'HiddenCommentExpand', - 'HiddenCommentText', - 'MultiredditName', - 'MultiredditText', - 'NeutralVote', - 'NSFW', - 'Saved', - 'Score', - 'Separator', - 'Stickied', - 'SubscriptionName', - 'SubscriptionText', - 'SubmissionAuthor', - 'SubmissionFlair', - 'SubmissionSubreddit', - 'SubmissionText', - 'SubmissionTitle', - 'Upvote', - 'Link', - 'LinkSeen', - 'UserFlair' - ] - - # List of elements that might be highlighted by the "SelectedCursor" row - SELECTED_CURSOR_ELEMENTS = [ - 'CursorBlock', - 'CursorBar1', - 'CursorBar2', - 'CursorBar3', - 'CursorBar4' - ] - - # List of page elements that cannot be selected - PAGE_ELEMENTS = [ - 'PageOrder', - 'PageOrderHighlight', - 'PageTitle', - 'Help', - 'Prompt', - 'NoticeInfo', - 'NoticeLoading', - 'NoticeError', - 'NoticeSuccess', - ] + DEFAULT_ELEMENTS = {k: v for group in DEFAULT_THEME.values() + for k, v in group.items()} # The SubmissionPage uses this to determine which color bar to use CURSOR_BARS = ['CursorBar1', 'CursorBar2', 'CursorBar3', 'CursorBar4'] @@ -194,11 +150,11 @@ class Theme(object): self.required_colors = 0 if elements is None: - elements = self.DEFAULT_THEME.copy() + elements = self.DEFAULT_ELEMENTS.copy() # Set any elements that weren't defined by the config to fallback to # the default color and attributes - for key in self.DEFAULT_THEME.keys(): + for key in self.DEFAULT_ELEMENTS.keys(): if key not in elements: elements[key] = (None, None, None) @@ -210,17 +166,17 @@ class Theme(object): # 1. The default state - inherits from "Normal" # 2. The selected state - inherits from "Selected" and is # prefixed by the "@" sign. - for name in self.SELECTED_ELEMENTS: + for name in self.DEFAULT_THEME['normal']: dest = '@{0}'.format(name) self._set_fallback(elements, name, 'Selected', dest) self._set_fallback(elements, name, 'Normal') - for name in self.SELECTED_CURSOR_ELEMENTS: + for name in self.DEFAULT_THEME['cursor']: dest = '@{0}'.format(name) self._set_fallback(elements, name, 'SelectedCursor', dest) self._set_fallback(elements, name, 'Normal') - for name in self.PAGE_ELEMENTS: + for name in self.DEFAULT_THEME['page']: self._set_fallback(elements, name, 'Normal') self.elements = elements @@ -233,14 +189,15 @@ class Theme(object): colors.add(bg) color_pairs.add((fg, bg)) - # Don't count the default (-1, -1) as a color pair because it doesn't - # need to be initialized by curses.init_pair(). + # Don't count the default (-1, -1) as a color pair because it + # doesn't need to be initialized by curses.init_pair(). color_pairs.discard((-1, -1)) self.required_color_pairs = len(color_pairs) - # Determine how many colors the terminal needs to support in order to - # be able to use the theme. This uses the common breakpoints that 99% - # of terminals follow and doesn't take into account 88 color themes. + # Determine how many colors the terminal needs to support in order + # to be able to use the theme. This uses the common breakpoints + # that 99% of terminals follow and doesn't take into account + # 88 color themes. self.required_colors = None for marker in [0, 8, 16, 256]: if max(colors) < marker: @@ -353,7 +310,7 @@ class Theme(object): @classmethod def print_themes(cls, path=THEMES): """ - Prints a human-readable summary of all of the installed themes to stdout. + Prints a human-readable summary of the installed themes to stdout. This is intended to be used as a command-line utility, outside of the main curses display loop. @@ -436,7 +393,7 @@ class Theme(object): elements = {} for element, line in config.items('theme'): - if element not in cls.DEFAULT_THEME: + if element not in cls.DEFAULT_ELEMENTS: # Could happen if using a new config with an older version # of the software _logger.info('Skipping element %s', element) @@ -550,52 +507,47 @@ class ThemeList(object): to cycle through all of the available themes. """ - def __init__(self, current_theme=None): - - self.index = 0 - self.current_theme = current_theme + def __init__(self): self.themes = None self.errors = None - def load(self): + def reload(self): """ This acts as a lazy load, it won't read all of the theme files from disk until the first time somebody tries to access the theme list. """ self.themes, self.errors = Theme.list_themes() - if self.current_theme is not None: - # Try to find the starting index - key = (self.current_theme.source, self.current_theme.name) - for i, theme in enumerate(self.themes): - if (theme.source, theme.name) == key: - self.index = i - break - else: - # If the current_theme was set from a custom source it might - # not be a part of the list returned by list_themes(). - self.themes.insert(0, self.current_theme) - - self.current_theme = self.themes[self.index] - - def next(self): + def _step(self, theme, direction): """ - Retrieve the next theme in the list + Traverse the list in the given direction and return the next theme """ if not self.themes: - self.load() + self.reload() - self.index = (self.index + 1) % len(self.themes) - self.current_theme = self.themes[self.index] - return self.current_theme + # Try to find the starting index + key = (theme.source, theme.name) + for i, theme in enumerate(self.themes): + if (theme.source, theme.name) == key: + index = i + break + else: + # If the theme was set from a custom source it might + # not be a part of the list returned by list_themes(). + self.themes.insert(0, theme) + index = 0 - def previous(self): - """ - Retrieve the previous theme in the list - """ - if not self.themes: - self.load() + index = (index + direction) % len(self.themes) + new_theme = self.themes[index] + return new_theme - self.index = (self.index - 1) % len(self.themes) - self.current_theme = self.themes[self.index] - return self.current_theme + def next(self, theme): + return self._step(theme, 1) + + def previous(self, theme): + return self._step(theme, -1) + + +theme_list = ThemeList() +get_next_theme = theme_list.next +get_previous_theme = theme_list.previous diff --git a/rtv/themes/default.cfg.example b/rtv/themes/default.cfg.example index d9b2a5a..5773510 100644 --- a/rtv/themes/default.cfg.example +++ b/rtv/themes/default.cfg.example @@ -1,16 +1,13 @@ -# http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html -# https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg - [theme] ; = Normal = default default - Selected = - - - SelectedCursor = - - reverse -PageTitle = cyan - bold+reverse -PageOrder = yellow - bold -PageOrderHighlight = yellow - bold+reverse -Help = cyan - bold+reverse +TitleBar = cyan - bold+reverse +OrderBar = yellow - bold +OrderBarHighlight = yellow - bold+reverse +HelpBar = cyan - bold+reverse Prompt = cyan - bold+reverse NoticeInfo = - - bold NoticeLoading = - - bold diff --git a/rtv/themes/high_contrast.cfg b/rtv/themes/high_contrast.cfg new file mode 100644 index 0000000..a86df95 --- /dev/null +++ b/rtv/themes/high_contrast.cfg @@ -0,0 +1,50 @@ +[theme] +; = +Normal = default default - +Selected = - - - +SelectedCursor = - - reverse + +TitleBar = cyan - bold+reverse +OrderBar = yellow - bold +OrderBarHighlight = yellow - bold+reverse +HelpBar = cyan - bold+reverse +Prompt = cyan - bold+reverse +NoticeInfo = - - bold +NoticeLoading = - - bold +NoticeError = - - bold +NoticeSuccess = - - bold + +CursorBlock = - - - +CursorBar1 = magenta - - +CursorBar2 = cyan - - +CursorBar3 = green - - +CursorBar4 = yellow - - + +CommentAuthor = cyan - bold +CommentAuthorSelf = green - bold +CommentCount = - - - +CommentText = - - - +Created = - - - +Downvote = red - bold +Gold = yellow - bold +HiddenCommentExpand = - - bold +HiddenCommentText = - - - +MultiredditName = yellow - bold +MultiredditText = - - - +NeutralVote = - - bold +NSFW = red - bold+reverse +Saved = green - - +Score = - - - +Separator = - - bold +Stickied = green - - +SubscriptionName = yellow - bold +SubscriptionText = - - - +SubmissionAuthor = green - bold +SubmissionFlair = red - - +SubmissionSubreddit = yellow - - +SubmissionText = - - - +SubmissionTitle = - - bold +Upvote = green - bold +Link = cyan - underline +LinkSeen = magenta - underline +UserFlair = yellow - bold \ No newline at end of file diff --git a/rtv/themes/molokai.cfg b/rtv/themes/molokai.cfg new file mode 100644 index 0000000..0806d75 --- /dev/null +++ b/rtv/themes/molokai.cfg @@ -0,0 +1,73 @@ +# https://github.com/tomasr/molokai + +# normal ansi_252, ansi_234 +# line number ansi_239, ansi_235 +# cursor ansi_252, ansi_236 +# pmenusel ansi_255, ansi_242 + +# text - normal ansi_252 +# text - dim ansi_244 +# text - ultra dim ansi_241 + +# purple ansi_141 +# green ansi_154 +# magenta ansi_199, ansi_16 +# gold ansi_222, ansi_233 +# red ansi_197 +# red - dim ansi_203 +# orange ansi_208 +# blue ansi_81 +# blue - dim ansi_67, ansi_16 + + + +[theme] +; = +Normal = ansi_252 ansi_234 - +Selected = - ansi_236 - +SelectedCursor = - - bold+reverse + +TitleBar = ansi_81 - bold+reverse +OrderBar = ansi_244 ansi_235 - +OrderBarHighlight = ansi_244 ansi_235 bold+reverse +HelpBar = ansi_81 - bold+reverse +Prompt = ansi_208 - bold+reverse +NoticeInfo = - - bold +NoticeLoading = - - bold +NoticeError = ansi_199 - bold +NoticeSuccess = ansi_154 - bold + +CursorBlock = ansi_252 - - +CursorBar1 = ansi_141 - - +CursorBar2 = ansi_197 - - +CursorBar3 = ansi_154 - - +CursorBar4 = ansi_208 - - + +CommentAuthor = ansi_81 - - +CommentAuthorSelf = ansi_154 - - +CommentCount = - - - +CommentText = - - - +Created = - - - +Downvote = ansi_197 - bold +Gold = ansi_222 - bold +HiddenCommentExpand = ansi_244 - bold +HiddenCommentText = ansi_244 - - +MultiredditName = - - bold +MultiredditText = ansi_244 - - +NeutralVote = - - bold +NSFW = ansi_197 - bold+reverse +Saved = ansi_199 - - +Score = - - bold +Separator = ansi_241 - bold +Stickied = ansi_208 - - +SubscriptionName = - - bold +SubscriptionText = ansi_244 - - +SubmissionAuthor = ansi_154 - - +SubmissionFlair = ansi_197 - - +SubmissionSubreddit = ansi_222 - - +SubmissionText = - - - +SubmissionTitle = - - bold +Upvote = ansi_154 - bold +Link = ansi_67 - underline +LinkSeen = ansi_141 - underline +UserFlair = ansi_222 - bold \ No newline at end of file diff --git a/rtv/themes/papercolor.cfg b/rtv/themes/papercolor.cfg new file mode 100644 index 0000000..4c68793 --- /dev/null +++ b/rtv/themes/papercolor.cfg @@ -0,0 +1,71 @@ +# https://github.com/NLKNguyen/papercolor-theme + +# background ansi_255 +# negative ansi_124 +# positive ansi_28 +# olive ansi_64 +# neutral ansi_31 +# comment ansi_102 +# navy ansi_24 +# foreground ansi_238 +# nontext ansi_250 +# red ansi_160 +# pink ansi_162 +# purple ansi_91 +# accent ansi_166 +# orange ansi_166 +# blue ansi_25 +# highlight ansi_24 +# aqua ansi_31 +# green ansi_28 + +[theme] +; = +Normal = ansi_238 ansi_255 - +Selected = - ansi_254 - +SelectedCursor = - - bold+reverse + +TitleBar = ansi_24 - bold+reverse +OrderBar = ansi_25 - bold +OrderBarHighlight = ansi_25 - bold+reverse +HelpBar = ansi_24 - bold+reverse +Prompt = ansi_31 - bold+reverse +NoticeInfo = ansi_238 ansi_252 bold +NoticeLoading = ansi_238 ansi_252 bold +NoticeError = ansi_124 ansi_225 bold +NoticeSuccess = ansi_28 ansi_157 bold + +CursorBlock = ansi_102 - - +CursorBar1 = ansi_162 - - +CursorBar2 = ansi_166 - - +CursorBar3 = ansi_25 - - +CursorBar4 = ansi_91 - - + +CommentAuthor = ansi_25 - bold +CommentAuthorSelf = ansi_64 - bold +CommentCount = - - - +CommentText = - - - +Created = - - - +Downvote = ansi_124 - bold +Gold = ansi_166 - bold +HiddenCommentExpand = ansi_102 - bold +HiddenCommentText = ansi_102 - - +MultiredditName = - - bold +MultiredditText = ansi_102 - - +NeutralVote = - - bold +NSFW = ansi_160 - bold+reverse +Saved = ansi_31 - bold +Score = - - bold +Separator = - - bold +Stickied = ansi_166 - bold +SubscriptionName = - - bold +SubscriptionText = ansi_102 - - +SubmissionAuthor = ansi_64 - bold +SubmissionFlair = ansi_162 - bold +SubmissionSubreddit = ansi_166 - bold +SubmissionText = - - - +SubmissionTitle = - - bold +Upvote = ansi_28 - bold +Link = ansi_24 - underline +LinkSeen = ansi_91 - underline +UserFlair = ansi_162 - bold \ No newline at end of file diff --git a/rtv/themes/solarized-dark.cfg b/rtv/themes/solarized-dark.cfg index cc486fa..a963ce6 100644 --- a/rtv/themes/solarized-dark.cfg +++ b/rtv/themes/solarized-dark.cfg @@ -23,10 +23,10 @@ Normal = ansi_244 ansi_234 - Selected = ansi_244 ansi_235 - SelectedCursor = ansi_244 ansi_235 bold+reverse -PageTitle = ansi_37 - bold+reverse -PageOrder = ansi_240 - bold -PageOrderHighlight = ansi_240 - bold+reverse -Help = ansi_37 - bold+reverse +TitleBar = ansi_37 - bold+reverse +OrderBar = ansi_245 - bold +OrderBarHighlight = ansi_245 - bold+reverse +HelpBar = ansi_37 - bold+reverse Prompt = ansi_33 - bold+reverse NoticeInfo = - - bold NoticeLoading = - - bold @@ -46,18 +46,18 @@ CommentText = - - - Created = - - - Downvote = ansi_160 - bold Gold = ansi_136 - bold -HiddenCommentExpand = ansi_245 - bold -HiddenCommentText = ansi_245 - - -MultiredditName = ansi_240 - bold -MultiredditText = ansi_245 - - +HiddenCommentExpand = ansi_240 - bold +HiddenCommentText = ansi_240 - - +MultiredditName = ansi_245 - bold +MultiredditText = ansi_240 - - NeutralVote = - - bold -NSFW = ansi_125 - bold+reverse +NSFW = ansi_160 - bold+reverse Saved = ansi_125 - - Score = - - - Separator = - - bold Stickied = ansi_136 - - -SubscriptionName = ansi_240 - bold -SubscriptionText = ansi_245 - - +SubscriptionName = ansi_245 - bold +SubscriptionText = ansi_240 - - SubmissionAuthor = ansi_64 - bold SubmissionFlair = ansi_160 - - SubmissionSubreddit = ansi_166 - - diff --git a/rtv/themes/solarized-light.cfg b/rtv/themes/solarized-light.cfg index ecac0f3..b997e88 100644 --- a/rtv/themes/solarized-light.cfg +++ b/rtv/themes/solarized-light.cfg @@ -21,12 +21,12 @@ ; = Normal = ansi_241 ansi_230 - Selected = ansi_241 ansi_254 - -SelectedCursor = ansi_241 ansi_254 reverse +SelectedCursor = ansi_241 ansi_254 bold+reverse -PageTitle = ansi_37 - bold+reverse -PageOrder = ansi_245 - bold -PageOrderHighlight = ansi_245 - bold+reverse -Help = ansi_37 - bold+reverse +TitleBar = ansi_37 - bold+reverse +OrderBar = ansi_245 - bold +OrderBarHighlight = ansi_245 - bold+reverse +HelpBar = ansi_37 - bold+reverse Prompt = ansi_33 - bold+reverse NoticeInfo = - - bold NoticeLoading = - - bold @@ -34,10 +34,10 @@ NoticeError = ansi_160 - bold NoticeSuccess = ansi_64 - bold CursorBlock = ansi_245 - - -CursorBar1 = ansi_125 - - -CursorBar2 = ansi_160 - - -CursorBar3 = ansi_61 - - -CursorBar4 = ansi_37 - - +CursorBar1 = ansi_125 - bold +CursorBar2 = ansi_160 - bold +CursorBar3 = ansi_61 - bold +CursorBar4 = ansi_37 - bold CommentAuthor = ansi_33 - bold CommentAuthorSelf = ansi_64 - bold @@ -51,16 +51,16 @@ HiddenCommentText = ansi_245 - - MultiredditName = ansi_240 - bold MultiredditText = ansi_245 - - NeutralVote = - - bold -NSFW = ansi_125 - bold+reverse -Saved = ansi_125 - - +NSFW = ansi_160 - bold+reverse +Saved = ansi_125 - bold Score = - - - Separator = - - bold -Stickied = ansi_136 - - +Stickied = ansi_136 - bold SubscriptionName = ansi_240 - bold SubscriptionText = ansi_245 - - SubmissionAuthor = ansi_64 - bold -SubmissionFlair = ansi_160 - - -SubmissionSubreddit = ansi_166 - - +SubmissionFlair = ansi_160 - bold +SubmissionSubreddit = ansi_166 - bold SubmissionText = - - - SubmissionTitle = ansi_240 - bold Upvote = ansi_64 - bold diff --git a/scripts/demo_theme.py b/scripts/demo_theme.py index e91fa83..16ee199 100755 --- a/scripts/demo_theme.py +++ b/scripts/demo_theme.py @@ -7,6 +7,7 @@ import os import sys import time import curses +import locale import threading from types import MethodType from collections import Counter @@ -14,7 +15,7 @@ from collections import Counter from vcr import VCR from six.moves.urllib.parse import urlparse, parse_qs -from rtv.theme import ThemeList +from rtv.theme import Theme, get_next_theme, get_previous_theme, theme_list from rtv.config import Config from rtv.packages import praw from rtv.oauth import OAuthHelper @@ -151,7 +152,7 @@ def draw_screen(stdscr, reddit, config, theme, oauth): term.getch = MethodType(notification_getch, term) thread = threading.Thread(target=term.show_notification, args=('Success',), - kwargs={'style': 'success'}) + kwargs={'style': 'Success'}) thread.start() threads.append((thread, term)) @@ -172,7 +173,7 @@ def draw_screen(stdscr, reddit, config, theme, oauth): term.getch = MethodType(notification_getch, term) thread = threading.Thread(target=term.show_notification, args=('Error',), - kwargs={'style': 'error'}) + kwargs={'style': 'Error'}) thread.start() threads.append((thread, term)) @@ -193,7 +194,7 @@ def draw_screen(stdscr, reddit, config, theme, oauth): term.getch = MethodType(notification_getch, term) thread = threading.Thread(target=term.show_notification, args=('Info',), - kwargs={'style': 'info'}) + kwargs={'style': 'Info'}) thread.start() threads.append((thread, term)) @@ -212,14 +213,12 @@ def draw_screen(stdscr, reddit, config, theme, oauth): def main(): - if len(sys.argv) > 1: - current_theme = sys.argv[1] - else: - current_theme = None + locale.setlocale(locale.LC_ALL, '') - theme_list = ThemeList(current_theme) - theme_list.load() - theme = theme_list.current_theme + if len(sys.argv) > 1: + theme = Theme.from_name(sys.argv[1]) + else: + theme = Theme() vcr = initialize_vcr() with vcr.use_cassette('demo_theme.yaml') as cassette, \ @@ -234,6 +233,7 @@ def main(): reddit = praw.Reddit(user_agent='RTV Theme Demo', decode_html_entities=False, disable_update_check=True) + reddit.config.api_request_delay = 0 config.history.add('https://api.reddit.com/comments/6llvsl/_/djutc3s') config.history.add('http://i.imgur.com/Z9iGKWv.gifv') @@ -245,7 +245,6 @@ def main(): oauth.authorize() while True: - term = Terminal(stdscr, config) term.set_theme(theme) threads = draw_screen(stdscr, reddit, config, theme, oauth) @@ -264,12 +263,17 @@ def main(): else: cassette.play_counts = Counter() + theme_list.reload() + if ch == curses.KEY_RIGHT: - theme = theme_list.next() + theme = get_next_theme(theme) elif ch == curses.KEY_LEFT: - theme = theme_list.previous() + theme = get_previous_theme(theme) elif ch == Terminal.ESCAPE: break - + else: + # Force the theme to reload + theme = get_next_theme(theme) + theme = get_previous_theme(theme) sys.exit(main())