Adding the ability to highlight

This commit is contained in:
Michael Lazar
2017-07-22 19:35:01 -04:00
parent 862d0e756d
commit d0fef21c3e
12 changed files with 416 additions and 342 deletions

View File

@@ -55,11 +55,12 @@ class Page(object):
self.active = True self.active = True
self._row = 0 self._row = 0
self._subwindows = None self._subwindows = None
self._theme_list = None
def refresh_content(self, order=None, name=None): def refresh_content(self, order=None, name=None):
raise NotImplementedError raise NotImplementedError
def _draw_item(self, window, data, inverted): def _draw_item(self, window, data, inverted, highlight):
raise NotImplementedError raise NotImplementedError
def get_selected_item(self): def get_selected_item(self):
@@ -91,6 +92,24 @@ class Page(object):
def force_exit(self): def force_exit(self):
sys.exit() sys.exit()
@PageController.register(Command('NEXT_THEME'))
def next_theme(self):
if self._theme_list is None:
self._theme_list = self.term.theme.list_themes()['default']
names = sorted(self._theme_list.keys())
if self.term.theme.name in self._theme_list:
index = names.index(self.term.theme.name) + 1
if index >= len(names):
index = 0
else:
index = 0
new_theme = self._theme_list[names[index]]
self.term.set_theme(new_theme)
self.draw()
self.term.show_notification(new_theme.name, timeout=1)
@PageController.register(Command('HELP')) @PageController.register(Command('HELP'))
def show_help(self): def show_help(self):
self.term.open_pager(docs.HELP.strip()) self.term.open_pager(docs.HELP.strip())
@@ -385,7 +404,6 @@ class Page(object):
self._draw_banner() self._draw_banner()
self._draw_content() self._draw_content()
self._draw_footer() self._draw_footer()
self._add_cursor()
self.term.clear_screen() self.term.clear_screen()
self.term.stdscr.refresh() self.term.stdscr.refresh()
@@ -456,7 +474,7 @@ class Page(object):
if self.content.order is not None: if self.content.order is not None:
order = self.content.order.split('-')[0] order = self.content.order.split('-')[0]
col = text.find(order) - 3 col = text.find(order) - 3
window.chgat(0, col, 3, self.term.attr('order_selected')) window.chgat(0, col, 3, self.term.attr('order_bar', True))
self._row += 1 self._row += 1
@@ -466,8 +484,7 @@ class Page(object):
""" """
n_rows, n_cols = self.term.stdscr.getmaxyx() n_rows, n_cols = self.term.stdscr.getmaxyx()
window = self.term.stdscr.derwin( window = self.term.stdscr.derwin(n_rows - self._row - 1, n_cols, self._row, 0)
n_rows - self._row - 1, n_cols, self._row, 0)
window.erase() window.erase()
win_n_rows, win_n_cols = window.getmaxyx() win_n_rows, win_n_cols = window.getmaxyx()
@@ -494,11 +511,8 @@ class Page(object):
top_item_height = None top_item_height = None
subwin_n_cols = win_n_cols - data['h_offset'] subwin_n_cols = win_n_cols - data['h_offset']
start = current_row - subwin_n_rows + 1 if inverted else current_row start = current_row - subwin_n_rows + 1 if inverted else current_row
subwindow = window.derwin( subwindow = window.derwin(subwin_n_rows, subwin_n_cols, start, data['h_offset'])
subwin_n_rows, subwin_n_cols, start, data['h_offset']) self._subwindows.append((subwindow, data, subwin_inverted))
attr = self._draw_item(subwindow, data, subwin_inverted)
self._subwindows.append((subwindow, attr))
available_rows -= (subwin_n_rows + 1) # Add one for the blank line available_rows -= (subwin_n_rows + 1) # Add one for the blank line
current_row += step * (subwin_n_rows + 1) current_row += step * (subwin_n_rows + 1)
if available_rows <= 0: if available_rows <= 0:
@@ -520,6 +534,22 @@ class Page(object):
self.nav.flip((len(self._subwindows) - 1)) self.nav.flip((len(self._subwindows) - 1))
return self._draw_content() return self._draw_content()
if self.nav.cursor_index >= len(self._subwindows):
# Don't allow the cursor to go over the number of subwindows
# This could happen if the window is resized and the cursor index is
# pushed out of bounds
self.nav.cursor_index = len(self._subwindows) - 1
# Now that the windows are setup, we can take a second pass through
# to draw the content
for index, (win, data, inverted) in enumerate(self._subwindows):
highlight = (index == self.nav.cursor_index)
if highlight:
win.bkgd(str(' '), self.term.attr('@highlight'))
else:
win.bkgd(str(' '), self.term.attr('@normal'))
self._draw_item(win, data, inverted, highlight)
self._row += win_n_rows self._row += win_n_rows
def _draw_footer(self): def _draw_footer(self):
@@ -544,25 +574,3 @@ class Page(object):
valid, redraw = self.nav.move_page(direction, len(self._subwindows)-1) valid, redraw = self.nav.move_page(direction, len(self._subwindows)-1)
if not valid: if not valid:
self.term.flash() self.term.flash()
def _add_cursor(self):
# Don't allow the cursor to go below page index 0
if self.nav.absolute_index < 0:
return
# Don't allow the cursor to go over the number of subwindows
# This could happen if the window is resized and the cursor index is
# pushed out of bounds
if self.nav.cursor_index >= len(self._subwindows):
self.nav.cursor_index = len(self._subwindows) - 1
window, cursor_attr = self._subwindows[self.nav.cursor_index]
if cursor_attr is None:
attr = self.term.attr('cursor')
else:
attr = cursor_attr | curses.A_REVERSE
n_rows, _ = window.getmaxyx()
for row in range(n_rows):
window.chgat(row, 0, 1, attr)

View File

@@ -199,18 +199,16 @@ class SubmissionPage(Page):
else: else:
self.term.flash() self.term.flash()
def _draw_item(self, win, data, inverted): def _draw_item(self, win, data, inverted, highlight):
if data['type'] == 'MoreComments': if data['type'] in ('MoreComments', 'HiddenComment'):
return self._draw_more_comments(win, data) self._draw_more_comments(win, data, highlight)
elif data['type'] == 'HiddenComment':
return self._draw_more_comments(win, data)
elif data['type'] == 'Comment': elif data['type'] == 'Comment':
return self._draw_comment(win, data, inverted) self._draw_comment(win, data, inverted, highlight)
else: else:
return self._draw_submission(win, data) self._draw_submission(win, data, highlight)
def _draw_comment(self, win, data, inverted): def _draw_comment(self, win, data, inverted, highlight):
n_rows, n_cols = win.getmaxyx() n_rows, n_cols = win.getmaxyx()
n_cols -= 1 n_cols -= 1
@@ -232,105 +230,102 @@ class SubmissionPage(Page):
row = offset row = offset
if row in valid_rows: if row in valid_rows:
if data['is_author']: if data['is_author']:
attr = self.term.attr('comment_author_self') attr = self.term.attr('comment_author_self', highlight)
else: else:
attr = self.term.attr('comment_author') attr = self.term.attr('comment_author', highlight)
self.term.add_line(win, '{author}'.format(**data), row, 1, attr) self.term.add_line(win, '{author}'.format(**data), row, 1, attr)
if data['flair']: if data['flair']:
attr = self.term.attr('user_flair') attr = self.term.attr('user_flair', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{flair}'.format(**data), attr=attr) self.term.add_line(win, '{flair}'.format(**data), attr=attr)
arrow, attr = self.term.get_arrow(data['likes']) arrow, attr = self.term.get_arrow(data['likes'], highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, arrow, attr=attr) self.term.add_line(win, arrow, attr=attr)
attr = self.term.attr('score') attr = self.term.attr('score', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{score}'.format(**data), attr=attr) self.term.add_line(win, '{score}'.format(**data), attr=attr)
attr = self.term.attr('created') attr = self.term.attr('created', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{created}'.format(**data), attr=attr) self.term.add_line(win, '{created}'.format(**data), attr=attr)
if data['gold']: if data['gold']:
attr = self.term.attr('gold') attr = self.term.attr('gold', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, self.term.guilded, attr=attr) self.term.add_line(win, self.term.guilded, attr=attr)
if data['stickied']: if data['stickied']:
attr = self.term.attr('stickied') attr = self.term.attr('stickied', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '[stickied]', attr=attr) self.term.add_line(win, '[stickied]', attr=attr)
if data['saved']: if data['saved']:
attr = self.term.attr('saved') attr = self.term.attr('saved', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '[saved]', attr=attr) self.term.add_line(win, '[saved]', attr=attr)
for row, text in enumerate(split_body, start=offset+1): for row, text in enumerate(split_body, start=offset+1):
attr = self.term.attr('comment_text') attr = self.term.attr('comment_text', highlight)
if row in valid_rows: if row in valid_rows:
self.term.add_line(win, text, row, 1, attr=attr) self.term.add_line(win, text, row, 1, attr=attr)
# Unfortunately vline() doesn't support custom color so we have to # Unfortunately vline() doesn't support custom color so we have to
# build it one segment at a time. # build it one segment at a time.
attr = self.term.theme.get_bar_level(data['level']) index = data['level'] % len(self.term.theme.BAR_LEVELS)
x = 0 attr = self.term.attr(self.term.theme.BAR_LEVELS[index], highlight)
for y in range(n_rows): for y in range(n_rows):
self.term.addch(win, y, x, self.term.vline, attr) self.term.addch(win, y, 0, self.term.vline, attr)
return attr | self.term.vline def _draw_more_comments(self, win, data, highlight):
def _draw_more_comments(self, win, data):
n_rows, n_cols = win.getmaxyx() n_rows, n_cols = win.getmaxyx()
n_cols -= 1 n_cols -= 1
attr = self.term.attr('hidden_comment_text') attr = self.term.attr('hidden_comment_text', highlight)
self.term.add_line(win, '{body}'.format(**data), 0, 1, attr=attr) self.term.add_line(win, '{body}'.format(**data), 0, 1, attr=attr)
attr = self.term.attr('hidden_comment_expand') attr = self.term.attr('hidden_comment_expand', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '[{count}]'.format(**data), attr=attr) self.term.add_line(win, '[{count}]'.format(**data), attr=attr)
attr = self.term.theme.get_bar_level(data['level']) index = data['level'] % len(self.term.theme.BAR_LEVELS)
attr = self.term.attr(self.term.theme.BAR_LEVELS[index], highlight)
self.term.addch(win, 0, 0, self.term.vline, attr) self.term.addch(win, 0, 0, self.term.vline, attr)
return attr | self.term.vline def _draw_submission(self, win, data, highlight):
def _draw_submission(self, win, data):
n_rows, n_cols = win.getmaxyx() n_rows, n_cols = win.getmaxyx()
n_cols -= 3 # one for each side of the border + one for offset n_cols -= 3 # one for each side of the border + one for offset
attr = self.term.attr('submission_title') attr = self.term.attr('submission_title', highlight)
for row, text in enumerate(data['split_title'], start=1): for row, text in enumerate(data['split_title'], start=1):
self.term.add_line(win, text, row, 1, attr) self.term.add_line(win, text, row, 1, attr)
row = len(data['split_title']) + 1 row = len(data['split_title']) + 1
attr = self.term.attr('submission_author') attr = self.term.attr('submission_author', highlight)
self.term.add_line(win, '{author}'.format(**data), row, 1, attr) self.term.add_line(win, '{author}'.format(**data), row, 1, attr)
if data['flair']: if data['flair']:
attr = self.term.attr('submission_flair') attr = self.term.attr('submission_flair', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{flair}'.format(**data), attr=attr) self.term.add_line(win, '{flair}'.format(**data), attr=attr)
attr = self.term.attr('created') attr = self.term.attr('created', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{created}'.format(**data), attr=attr) self.term.add_line(win, '{created}'.format(**data), attr=attr)
attr = self.term.attr('submission_subreddit') attr = self.term.attr('submission_subreddit', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '/r/{subreddit}'.format(**data), attr=attr) self.term.add_line(win, '/r/{subreddit}'.format(**data), attr=attr)
row = len(data['split_title']) + 2 row = len(data['split_title']) + 2
if data['url_full'] in self.config.history: if data['url_full'] in self.config.history:
attr = self.term.attr('url_seen') attr = self.term.attr('url_seen', highlight)
else: else:
attr = self.term.attr('url') attr = self.term.attr('url', highlight)
self.term.add_line(win, '{url}'.format(**data), row, 1, attr) self.term.add_line(win, '{url}'.format(**data), row, 1, attr)
offset = len(data['split_title']) + 3 offset = len(data['split_title']) + 3
@@ -342,34 +337,34 @@ class SubmissionPage(Page):
split_text = split_text[:-cutoff] split_text = split_text[:-cutoff]
split_text.append('(Not enough space to display)') split_text.append('(Not enough space to display)')
attr = self.term.attr('submission_text') attr = self.term.attr('submission_text', highlight)
for row, text in enumerate(split_text, start=offset): for row, text in enumerate(split_text, start=offset):
self.term.add_line(win, text, row, 1, attr=attr) self.term.add_line(win, text, row, 1, attr=attr)
row = len(data['split_title']) + len(split_text) + 3 row = len(data['split_title']) + len(split_text) + 3
attr = self.term.attr('score') attr = self.term.attr('score', highlight)
self.term.add_line(win, '{score}'.format(**data), row, 1, attr=attr) self.term.add_line(win, '{score}'.format(**data), row, 1, attr=attr)
arrow, attr = self.term.get_arrow(data['likes']) arrow, attr = self.term.get_arrow(data['likes'], highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, arrow, attr=attr) self.term.add_line(win, arrow, attr=attr)
attr = self.term.attr('comment_count') attr = self.term.attr('comment_count', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{comments}'.format(**data), attr=attr) self.term.add_line(win, '{comments}'.format(**data), attr=attr)
if data['gold']: if data['gold']:
attr = self.term.attr('gold') attr = self.term.attr('gold', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, self.term.guilded, attr=attr) self.term.add_line(win, self.term.guilded, attr=attr)
if data['nsfw']: if data['nsfw']:
attr = self.term.attr('nsfw') attr = self.term.attr('nsfw', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, 'NSFW', attr=attr) self.term.add_line(win, 'NSFW', attr=attr)
if data['saved']: if data['saved']:
attr = self.term.attr('saved') attr = self.term.attr('saved', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '[saved]', attr=attr) self.term.add_line(win, '[saved]', attr=attr)

View File

@@ -233,7 +233,7 @@ class SubredditPage(Page):
self.content = page.selected_subreddit self.content = page.selected_subreddit
self.nav = Navigator(self.content.get) self.nav = Navigator(self.content.get)
def _draw_item(self, win, data, inverted): def _draw_item(self, win, data, inverted, highlight):
n_rows, n_cols = win.getmaxyx() n_rows, n_cols = win.getmaxyx()
n_cols -= 1 # Leave space for the cursor in the first column n_cols -= 1 # Leave space for the cursor in the first column
@@ -244,71 +244,75 @@ class SubredditPage(Page):
n_title = len(data['split_title']) n_title = len(data['split_title'])
for row, text in enumerate(data['split_title'], start=offset): for row, text in enumerate(data['split_title'], start=offset):
attr = self.term.attr('submission_title') attr = self.term.attr('submission_title', highlight)
if row in valid_rows: if row in valid_rows:
self.term.add_line(win, text, row, 1, attr) self.term.add_line(win, text, row, 1, attr)
row = n_title + offset row = n_title + offset
if row in valid_rows: if row in valid_rows:
if data['url_full'] in self.config.history: if data['url_full'] in self.config.history:
attr = self.term.attr('url_seen') attr = self.term.attr('url_seen', highlight)
else: else:
attr = self.term.attr('url') attr = self.term.attr('url', highlight)
self.term.add_line(win, '{url}'.format(**data), row, 1, attr) self.term.add_line(win, '{url}'.format(**data), row, 1, attr)
row = n_title + offset + 1 row = n_title + offset + 1
if row in valid_rows: if row in valid_rows:
attr = self.term.attr('score') attr = self.term.attr('score', highlight)
self.term.add_line(win, '{score}'.format(**data), row, 1, attr) self.term.add_line(win, '{score}'.format(**data), row, 1, attr)
self.term.add_space(win) self.term.add_space(win)
arrow, attr = self.term.get_arrow(data['likes']) arrow, attr = self.term.get_arrow(data['likes'], highlight)
self.term.add_line(win, arrow, attr=attr) self.term.add_line(win, arrow, attr=attr)
self.term.add_space(win) self.term.add_space(win)
attr = self.term.attr('created') attr = self.term.attr('created', highlight)
self.term.add_line(win, '{created}'.format(**data), attr=attr) self.term.add_line(win, '{created}'.format(**data), attr=attr)
if data['comments'] is not None: if data['comments'] is not None:
attr = self.term.attr('separator') attr = self.term.attr('separator', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '-', attr=attr) self.term.add_line(win, '-', attr=attr)
attr = self.term.attr('comment_count') attr = self.term.attr('comment_count', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{comments}'.format(**data), attr=attr) self.term.add_line(win, '{comments}'.format(**data), attr=attr)
if data['saved']: if data['saved']:
attr = self.term.attr('saved') attr = self.term.attr('saved', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '[saved]', attr=attr) self.term.add_line(win, '[saved]', attr=attr)
if data['stickied']: if data['stickied']:
attr = self.term.attr('stickied') attr = self.term.attr('stickied', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '[stickied]', attr=attr) self.term.add_line(win, '[stickied]', attr=attr)
if data['gold']: if data['gold']:
attr = self.term.attr('gold') attr = self.term.attr('gold', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, self.term.guilded, attr=attr) self.term.add_line(win, self.term.guilded, attr=attr)
if data['nsfw']: if data['nsfw']:
attr = self.term.attr('nsfw') attr = self.term.attr('nsfw', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, 'NSFW', attr=attr) self.term.add_line(win, 'NSFW', attr=attr)
row = n_title + offset + 2 row = n_title + offset + 2
if row in valid_rows: if row in valid_rows:
attr = self.term.attr('submission_author') attr = self.term.attr('submission_author', highlight)
self.term.add_line(win, '{author}'.format(**data), row, 1, attr) self.term.add_line(win, '{author}'.format(**data), row, 1, attr)
self.term.add_space(win) self.term.add_space(win)
attr = self.term.attr('submission_subreddit') attr = self.term.attr('submission_subreddit', highlight)
self.term.add_line(win, '/r/{subreddit}'.format(**data), attr=attr) self.term.add_line(win, '/r/{subreddit}'.format(**data), attr=attr)
if data['flair']: if data['flair']:
attr = self.term.attr('submission_flair') attr = self.term.attr('submission_flair', highlight)
self.term.add_space(win) self.term.add_space(win)
self.term.add_line(win, '{flair}'.format(**data), attr=attr) self.term.add_line(win, '{flair}'.format(**data), attr=attr)
attr = self.term.attr('cursor', highlight)
for y in range(n_rows):
self.term.addch(win, y, 0, str(' '), attr)

View File

@@ -83,7 +83,7 @@ class SubscriptionPage(Page):
# Subscriptions can't be sorted, so disable showing the order menu # Subscriptions can't be sorted, so disable showing the order menu
pass pass
def _draw_item(self, win, data, inverted): def _draw_item(self, win, data, inverted, highlight):
n_rows, n_cols = win.getmaxyx() n_rows, n_cols = win.getmaxyx()
n_cols -= 1 # Leave space for the cursor in the first column n_cols -= 1 # Leave space for the cursor in the first column
@@ -94,16 +94,20 @@ class SubscriptionPage(Page):
row = offset row = offset
if row in valid_rows: if row in valid_rows:
if data['type'] == 'Multireddit': if data['type'] == 'Multireddit':
attr = self.term.attr('multireddit_name') attr = self.term.attr('multireddit_name', highlight)
else: else:
attr = self.term.attr('subscription_name') attr = self.term.attr('subscription_name', highlight)
self.term.add_line(win, '{name}'.format(**data), row, 1, attr) self.term.add_line(win, '{name}'.format(**data), row, 1, attr)
row = offset + 1 row = offset + 1
for row, text in enumerate(data['split_title'], start=row): for row, text in enumerate(data['split_title'], start=row):
if row in valid_rows: if row in valid_rows:
if data['type'] == 'Multireddit': if data['type'] == 'Multireddit':
attr = self.term.attr('multireddit_text') attr = self.term.attr('multireddit_text', highlight)
else: else:
attr = self.term.attr('subscription_text') attr = self.term.attr('subscription_text', highlight)
self.term.add_line(win, text, row, 1, attr) self.term.add_line(win, text, row, 1, attr)
attr = self.term.attr('cursor', highlight)
for y in range(n_rows):
self.term.addch(win, y, 0, str(' '), attr)

View File

@@ -105,6 +105,7 @@ SORT_NEW = 4
SORT_CONTROVERSIAL = 5 SORT_CONTROVERSIAL = 5
MOVE_UP = k, <KEY_UP> MOVE_UP = k, <KEY_UP>
MOVE_DOWN = j, <KEY_DOWN> MOVE_DOWN = j, <KEY_DOWN>
NEXT_THEME = <KEY_F3>
PAGE_UP = m, <KEY_PPAGE>, <NAK> PAGE_UP = m, <KEY_PPAGE>, <NAK>
PAGE_DOWN = n, <KEY_NPAGE>, <EOT> PAGE_DOWN = n, <KEY_NPAGE>, <EOT>
PAGE_TOP = gg PAGE_TOP = gg

View File

@@ -180,7 +180,7 @@ class Terminal(object):
finally: finally:
self.stdscr.nodelay(0) self.stdscr.nodelay(0)
def get_arrow(self, likes): def get_arrow(self, likes, highlight=False):
""" """
Curses does define constants for symbols (e.g. curses.ACS_BULLET). Curses does define constants for symbols (e.g. curses.ACS_BULLET).
However, they rely on using the curses.addch() function, which has been However, they rely on using the curses.addch() function, which has been
@@ -190,11 +190,11 @@ class Terminal(object):
""" """
if likes is None: if likes is None:
return self.neutral_arrow, self.attr('neutral_vote') return self.neutral_arrow, self.attr('neutral_vote', highlight)
elif likes: elif likes:
return self.up_arrow, self.attr('upvote') return self.up_arrow, self.attr('upvote', highlight)
else: else:
return self.down_arrow, self.attr('downvote') return self.down_arrow, self.attr('downvote', highlight)
def clean(self, string, n_cols=None): def clean(self, string, n_cols=None):
""" """
@@ -816,11 +816,11 @@ class Terminal(object):
else: else:
self.stdscr.clearok(True) self.stdscr.clearok(True)
def attr(self, element): def attr(self, element, highlight=False):
""" """
Shortcut for fetching the color + attribute code for an element. Shortcut for fetching the color + attribute code for an element.
""" """
return self.theme.get(element) return self.theme.get(element, highlight=highlight)
def set_theme(self, theme=None): def set_theme(self, theme=None):
""" """
@@ -855,6 +855,6 @@ class Terminal(object):
theme.bind_curses() theme.bind_curses()
# Apply the default color to the whole screen # Apply the default color to the whole screen
self.stdscr.bkgd(str(' '), theme.get('default')) self.stdscr.bkgd(str(' '), theme.get('@normal'))
self.theme = theme self.theme = theme

View File

@@ -13,6 +13,7 @@ _logger = logging.getLogger(__name__)
class Theme(object): class Theme(object):
ATTRIBUTE_CODES = { ATTRIBUTE_CODES = {
'-': None,
'': curses.A_NORMAL, '': curses.A_NORMAL,
'bold': curses.A_BOLD, 'bold': curses.A_BOLD,
'reverse': curses.A_REVERSE, 'reverse': curses.A_REVERSE,
@@ -21,6 +22,7 @@ class Theme(object):
} }
COLOR_CODES = { COLOR_CODES = {
'-': None,
'default': -1, 'default': -1,
'black': curses.COLOR_BLACK, 'black': curses.COLOR_BLACK,
'red': curses.COLOR_RED, 'red': curses.COLOR_RED,
@@ -47,51 +49,59 @@ class Theme(object):
# For compatibility with as many terminals as possible, the default theme # For compatibility with as many terminals as possible, the default theme
# can only use the 8 basic colors with the default background. # can only use the 8 basic colors with the default background.
DEFAULT_THEME = { DEFAULT_THEME = {
'bar_level_1': (curses.COLOR_MAGENTA, -1, curses.A_NORMAL), '@normal': (-1, -1, curses.A_NORMAL),
'bar_level_2': (curses.COLOR_CYAN, -1, curses.A_NORMAL), '@highlight': (-1, -1, curses.A_NORMAL),
'bar_level_3': (curses.COLOR_GREEN, -1, curses.A_NORMAL), 'bar_level_1': (curses.COLOR_MAGENTA, None, curses.A_NORMAL),
'bar_level_4': (curses.COLOR_YELLOW, -1, curses.A_NORMAL), 'bar_level_1.highlight': (curses.COLOR_MAGENTA, None, curses.A_REVERSE),
'comment_author': (curses.COLOR_BLUE, -1, curses.A_BOLD), 'bar_level_2': (curses.COLOR_CYAN, None, curses.A_NORMAL),
'comment_author_self': (curses.COLOR_GREEN, -1, curses.A_BOLD), 'bar_level_2.highlight': (curses.COLOR_CYAN, None, curses.A_REVERSE),
'comment_count': (-1, -1, curses.A_NORMAL), 'bar_level_3': (curses.COLOR_GREEN, None, curses.A_NORMAL),
'comment_text': (-1, -1, curses.A_NORMAL), 'bar_level_3.highlight': (curses.COLOR_GREEN, None, curses.A_REVERSE),
'created': (-1, -1, curses.A_NORMAL), 'bar_level_4': (curses.COLOR_YELLOW, None, curses.A_NORMAL),
'cursor': (-1, -1, curses.A_REVERSE), 'bar_level_4.highlight': (curses.COLOR_YELLOW, None, curses.A_REVERSE),
'default': (-1, -1, curses.A_NORMAL), 'comment_author': (curses.COLOR_BLUE, None, curses.A_BOLD),
'downvote': (curses.COLOR_RED, -1, curses.A_BOLD), 'comment_author_self': (curses.COLOR_GREEN, None, curses.A_BOLD),
'gold': (curses.COLOR_YELLOW, -1, curses.A_BOLD), 'comment_count': (None, None, curses.A_NORMAL),
'help_bar': (curses.COLOR_CYAN, -1, curses.A_BOLD | curses.A_REVERSE), 'comment_text': (None, None, curses.A_NORMAL),
'hidden_comment_expand': (-1, -1, curses.A_BOLD), 'created': (None, None, curses.A_NORMAL),
'hidden_comment_text': (-1, -1, curses.A_NORMAL), 'cursor': (None, None, curses.A_NORMAL),
'multireddit_name': (curses.COLOR_YELLOW, -1, curses.A_BOLD), 'cursor.highlight': (None, None, curses.A_REVERSE),
'multireddit_text': (-1, -1, curses.A_NORMAL), 'downvote': (curses.COLOR_RED, None, curses.A_BOLD),
'neutral_vote': (-1, -1, curses.A_BOLD), 'gold': (curses.COLOR_YELLOW, None, curses.A_BOLD),
'notice_info': (-1, -1, curses.A_NORMAL), 'help_bar': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE),
'notice_loading': (-1, -1, curses.A_NORMAL), 'hidden_comment_expand': (None, None, curses.A_BOLD),
'notice_error': (curses.COLOR_RED, -1, curses.A_NORMAL), 'hidden_comment_text': (None, None, curses.A_NORMAL),
'notice_success': (curses.COLOR_GREEN, -1, curses.A_NORMAL), 'multireddit_name': (curses.COLOR_YELLOW, None, curses.A_BOLD),
'nsfw': (curses.COLOR_RED, -1, curses.A_BOLD), 'multireddit_text': (None, None, curses.A_NORMAL),
'order_bar': (curses.COLOR_YELLOW, -1, curses.A_BOLD), 'neutral_vote': (None, None, curses.A_BOLD),
'order_selected': (curses.COLOR_YELLOW, -1, curses.A_BOLD | curses.A_REVERSE), 'notice_info': (None, None, curses.A_NORMAL),
'prompt': (curses.COLOR_CYAN, -1, curses.A_BOLD | curses.A_REVERSE), 'notice_loading': (None, None, curses.A_NORMAL),
'saved': (curses.COLOR_GREEN, -1, curses.A_NORMAL), 'notice_error': (curses.COLOR_RED, None, curses.A_NORMAL),
'score': (-1, -1, curses.A_NORMAL), 'notice_success': (curses.COLOR_GREEN, None, curses.A_NORMAL),
'separator': (-1, -1, curses.A_BOLD), 'nsfw': (curses.COLOR_RED, None, curses.A_BOLD),
'stickied': (curses.COLOR_GREEN, -1, curses.A_NORMAL), 'order_bar': (curses.COLOR_YELLOW, None, curses.A_BOLD),
'subscription_name': (curses.COLOR_YELLOW, -1, curses.A_BOLD), 'order_bar.highlight': (curses.COLOR_YELLOW, None, curses.A_BOLD | curses.A_REVERSE),
'subscription_text': (-1, -1, curses.A_NORMAL), 'prompt': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE),
'submission_author': (curses.COLOR_GREEN, -1, curses.A_NORMAL), 'saved': (curses.COLOR_GREEN, None, curses.A_NORMAL),
'submission_flair': (curses.COLOR_RED, -1, curses.A_NORMAL), 'score': (None, None, curses.A_NORMAL),
'submission_subreddit': (curses.COLOR_YELLOW, -1, curses.A_NORMAL), 'separator': (None, None, curses.A_BOLD),
'submission_text': (-1, -1, curses.A_NORMAL), 'stickied': (curses.COLOR_GREEN, None, curses.A_NORMAL),
'submission_title': (-1, -1, curses.A_BOLD), 'subscription_name': (curses.COLOR_YELLOW, None, curses.A_BOLD),
'title_bar': (curses.COLOR_CYAN, -1, curses.A_BOLD | curses.A_REVERSE), 'subscription_text': (None, None, curses.A_NORMAL),
'upvote': (curses.COLOR_GREEN, -1, curses.A_BOLD), 'submission_author': (curses.COLOR_GREEN, None, curses.A_NORMAL),
'url': (curses.COLOR_BLUE, -1, curses.A_UNDERLINE), 'submission_flair': (curses.COLOR_RED, None, curses.A_NORMAL),
'url_seen': (curses.COLOR_MAGENTA, -1, curses.A_UNDERLINE), 'submission_subreddit': (curses.COLOR_YELLOW, None, curses.A_NORMAL),
'user_flair': (curses.COLOR_YELLOW, -1, curses.A_BOLD) 'submission_text': (None, None, curses.A_NORMAL),
'submission_title': (None, None, curses.A_BOLD),
'title_bar': (curses.COLOR_CYAN, None, curses.A_BOLD | curses.A_REVERSE),
'upvote': (curses.COLOR_GREEN, None, curses.A_BOLD),
'url': (curses.COLOR_BLUE, None, curses.A_UNDERLINE),
'url_seen': (curses.COLOR_MAGENTA, None, curses.A_UNDERLINE),
'user_flair': (curses.COLOR_YELLOW, None, curses.A_BOLD)
} }
BAR_LEVELS = ['bar_level_1', 'bar_level_2', 'bar_level_3', 'bar_level_4']
def __init__(self, name='default', elements=None, monochrome=False): def __init__(self, name='default', elements=None, monochrome=False):
""" """
Params: Params:
@@ -102,10 +112,6 @@ class Theme(object):
terminal's default foreground/background color. terminal's default foreground/background color.
""" """
self.elements = self.DEFAULT_THEME.copy()
if elements:
self.elements.update(elements)
self.name = name self.name = name
self.monochrome = monochrome self.monochrome = monochrome
self._color_pair_map = None self._color_pair_map = None
@@ -114,6 +120,44 @@ class Theme(object):
self.required_color_pairs = 0 self.required_color_pairs = 0
self.required_colors = 0 self.required_colors = 0
if elements is None:
elements = self.DEFAULT_THEME.copy()
# Fill in missing elements
for key in self.DEFAULT_THEME.keys():
# Set undefined modifiers to the system default
if key.startswith('@'):
if key not in elements:
elements[key] = self.DEFAULT_THEME[key]
continue
if key.endswith('.highlight'):
continue
# Set undefined elements to bubble up to the modifier
if key not in elements:
elements[key] = (None, None, None)
# Set undefined highlight elements to match their base element
modifier_key = key + '.highlight'
if modifier_key not in elements:
elements[modifier_key] = elements[key]
# Replace ``None`` attributes with their default modifiers
for key, val in elements.items():
if key.endswith('.highlight'):
default = elements['@highlight']
else:
default = elements['@normal']
elements[key] = (
default[0] if val[0] is None else val[0],
default[1] if val[1] is None else val[1],
default[2] if val[2] is None else val[2])
self.elements = elements
if not self.monochrome: if not self.monochrome:
colors, color_pairs = set(), set() colors, color_pairs = set(), set()
for fg, bg, _ in self.elements.values(): for fg, bg, _ in self.elements.values():
@@ -162,24 +206,19 @@ class Theme(object):
self._attribute_map[element] = attrs self._attribute_map[element] = attrs
def get(self, val): def get(self, val, highlight=False):
""" """
Returns the curses attribute code for the given element. Returns the curses attribute code for the given element.
""" """
if self._attribute_map is None: if self._attribute_map is None:
raise RuntimeError('Attempted to access theme attribute before ' raise RuntimeError('Attempted to access theme attribute before '
'calling initialize_curses_theme()') 'calling initialize_curses_theme()')
if highlight:
val = val + '.highlight'
return self._attribute_map[val] return self._attribute_map[val]
def get_bar_level(self, indentation_level):
"""
Helper method for loading the bar format given the indentation level.
"""
levels = ['bar_level_1', 'bar_level_2', 'bar_level_3', 'bar_level_4']
level = levels[indentation_level % len(levels)]
return self.get(level)
@classmethod @classmethod
def list_themes(cls, path=THEMES): def list_themes(cls, path=THEMES):
""" """
@@ -317,26 +356,30 @@ class Theme(object):
if bg.startswith('#'): if bg.startswith('#'):
bg = cls.rgb_to_ansi(bg) bg = cls.rgb_to_ansi(bg)
fg_code = cls.COLOR_CODES.get(fg) if fg not in cls.COLOR_CODES:
if fg_code is None:
raise ConfigError( raise ConfigError(
'Error loading {0}, invalid <foreground>:\n' 'Error loading {0}, invalid <foreground>:\n'
' {1} = {2}'.format(filename, element, line)) ' {1} = {2}'.format(filename, element, line))
fg_code = cls.COLOR_CODES[fg]
bg_code = cls.COLOR_CODES.get(bg) if bg not in cls.COLOR_CODES:
if bg_code is None:
raise ConfigError( raise ConfigError(
'Error loading {0}, invalid <background>:\n' 'Error loading {0}, invalid <background>:\n'
' {1} = {2}'.format(filename, element, line)) ' {1} = {2}'.format(filename, element, line))
bg_code = cls.COLOR_CODES[bg]
attrs_code = curses.A_NORMAL attrs_code = curses.A_NORMAL
for attr in attrs.split('+'): for attr in attrs.split('+'):
attr_code = cls.ATTRIBUTE_CODES.get(attr) if attr not in cls.ATTRIBUTE_CODES:
if attr_code is None:
raise ConfigError( raise ConfigError(
'Error loading {0}, invalid <attributes>:\n' 'Error loading {0}, invalid <attributes>:\n'
' {1} = {2}'.format(filename, element, line)) ' {1} = {2}'.format(filename, element, line))
attrs_code |= attr_code attr_code = cls.ATTRIBUTE_CODES[attr]
if attr_code is None:
attrs_code = None
break
else:
attrs_code |= attr_code
return fg_code, bg_code, attrs_code return fg_code, bg_code, attrs_code

View File

@@ -2,46 +2,53 @@
[theme] [theme]
;<element> = <foreground> <background> <attributes> ;<element> = <foreground> <background> <attributes>
bar_level_1 = magenta default @normal = default default
bar_level_2 = cyan default @highlight = default default
bar_level_3 = green default
bar_level_4 = yellow default bar_level_1 = magenta -
comment_author = blue default bold bar_level_1.highlight = magenta - reverse
comment_author_self = green default bold bar_level_2 = cyan -
comment_count = default default bar_level_2.highlight = cyan - reverse
comment_text = default default bar_level_3 = green -
created = default default bar_level_3.highlight = green - reverse
cursor = default default reverse bar_level_4 = yellow -
default = default default bar_level_4.highlight = yellow - reverse
downvote = red default bold comment_author = blue - bold
gold = yellow default bold comment_author_self = green - bold
help_bar = cyan default bold+reverse comment_count = - -
hidden_comment_expand = default default bold comment_text = - -
hidden_comment_text = default default created = - -
multireddit_name = yellow default bold cursor = - -
multireddit_text = default default cursor.highlight = - - reverse
neutral_vote = default default bold downvote = red - bold
notice_info = default default gold = yellow - bold
notice_loading = default default help_bar = cyan - bold+reverse
notice_error = red default hidden_comment_expand = - - bold
notice_success = green default hidden_comment_text = - -
nsfw = red default bold multireddit_name = yellow - bold
order_bar = yellow default bold multireddit_text = - -
order_selected = yellow default bold+reverse neutral_vote = - - bold
prompt = cyan default bold+reverse notice_info = - -
saved = green default notice_loading = - -
score = default default notice_error = red -
separator = default default bold notice_success = green -
stickied = green default nsfw = red - bold
subscription_name = yellow default bold order_bar = yellow - bold
subscription_text = default default order_bar.highlight = yellow - bold+reverse
submission_author = green default prompt = cyan - bold+reverse
submission_flair = red default saved = green -
submission_subreddit = yellow default score = - -
submission_text = default default separator = - - bold
submission_title = default default bold stickied = green -
title_bar = cyan default bold+reverse subscription_name = yellow - bold
upvote = green default bold subscription_text = - -
url = blue default underline submission_author = green -
url_seen = magenta default underline submission_flair = red -
user_flair = yellow default bold submission_subreddit = yellow -
submission_text = - -
submission_title = - - bold
title_bar = cyan - bold+reverse
upvote = green - bold
url = blue - underline
url_seen = magenta - underline
user_flair = yellow - bold

View File

@@ -2,47 +2,49 @@
[theme] [theme]
;<element> = <foreground> <background> <attributes> ;<element> = <foreground> <background> <attributes>
@normal = default default
@highlight = default default reverse
bar_level_1 = default default bar_level_1 = - -
bar_level_2 = default default bar_level_2 = - -
bar_level_3 = default default bar_level_3 = - -
bar_level_4 = default default bar_level_4 = - -
comment_author = default default bold comment_author = - - bold
comment_author_self = default default bold comment_author_self = - - bold
comment_count = default default comment_count = - -
comment_text = default default comment_text = - -
created = default default created = - -
cursor = default default reverse cursor = - -
default = default default cursor.highlight = - - reverse
downvote = default default bold downvote = - - bold
gold = default default bold gold = - - bold
help_bar = default default bold+reverse help_bar = - - bold+reverse
hidden_comment_expand = default default bold hidden_comment_expand = - - bold
hidden_comment_text = default default hidden_comment_text = - -
multireddit_name = default default bold multireddit_name = - - bold
multireddit_text = default default multireddit_text = - -
neutral_vote = default default bold neutral_vote = - - bold
notice_info = default default notice_info = - -
notice_loading = default default notice_loading = - -
notice_error = default default notice_error = - -
notice_success = default default notice_success = - -
nsfw = default default bold nsfw = - - bold
order_bar = default default bold order_bar = - - bold
order_selected = default default bold+reverse order_bar.highlight = - - bold+reverse
prompt = default default bold+reverse prompt = - - bold+reverse
saved = default default saved = - -
score = default default score = - -
separator = default default bold separator = - - bold
stickied = default default stickied = - -
subscription_name = default default bold subscription_name = - - bold
subscription_text = default default subscription_text = - -
submission_author = default default submission_author = - -
submission_flair = default default bold submission_flair = - - bold
submission_subreddit = default default submission_subreddit = - -
submission_text = default default submission_text = - -
submission_title = default default bold submission_title = - - bold
title_bar = default default bold+reverse title_bar = - - bold+reverse
upvote = default default bold upvote = - - bold
url = default default underline url = - - underline
url_seen = default default underline url_seen = - - underline
user_flair = default default bold user_flair = - - bold

View File

@@ -19,47 +19,53 @@
[theme] [theme]
;<element> = <foreground> <background> <attributes> ;<element> = <foreground> <background> <attributes>
@normal = ansi_244 ansi_234
@highlight = ansi_244 ansi_235
bar_level_1 = ansi_125 ansi_234 bar_level_1 = ansi_125 -
bar_level_2 = ansi_160 ansi_234 bar_level_1.highlight = ansi_125 - reverse
bar_level_3 = ansi_61 ansi_234 bar_level_2 = ansi_160 -
bar_level_4 = ansi_37 ansi_234 bar_level_2.highlight = ansi_125 - reverse
comment_author = ansi_33 ansi_234 bold bar_level_3 = ansi_61 -
comment_author_self = ansi_64 ansi_234 bold bar_level_3.highlight = ansi_125 - reverse
comment_count = ansi_244 ansi_234 bar_level_4 = ansi_37 -
comment_text = ansi_244 ansi_234 bar_level_4.highlight = ansi_125 - reverse
created = ansi_244 ansi_234 comment_author = ansi_33 - bold
cursor = ansi_244 ansi_234 reverse comment_author_self = ansi_64 - bold
default = ansi_244 ansi_234 comment_count = - -
downvote = ansi_160 ansi_234 bold comment_text = - -
gold = ansi_136 ansi_234 bold created = - -
help_bar = ansi_37 ansi_234 bold+reverse cursor = - -
hidden_comment_expand = ansi_240 ansi_234 bold cursor.highlight = ansi_240 - reverse
hidden_comment_text = ansi_240 ansi_234 downvote = ansi_160 - bold
multireddit_name = ansi_245 ansi_234 bold gold = ansi_136 - bold
multireddit_text = ansi_240 ansi_234 help_bar = ansi_37 - bold+reverse
neutral_vote = ansi_244 ansi_234 bold hidden_comment_expand = ansi_245 - bold
notice_info = ansi_244 ansi_234 bold hidden_comment_text = ansi_245 -
notice_loading = ansi_244 ansi_234 bold multireddit_name = ansi_240 - bold
notice_error = ansi_160 ansi_234 bold multireddit_text = ansi_245 -
notice_success = ansi_64 ansi_234 bold neutral_vote = - - bold
nsfw = ansi_125 ansi_234 bold+reverse notice_info = - - bold
order_bar = ansi_240 ansi_235 bold notice_loading = - - bold
order_selected = ansi_240 ansi_235 bold+reverse notice_error = ansi_160 - bold
prompt = ansi_33 ansi_234 bold+reverse notice_success = ansi_64 - bold
saved = ansi_125 ansi_234 nsfw = ansi_125 - bold+reverse
score = ansi_244 ansi_234 order_bar = ansi_245 - bold
separator = ansi_244 ansi_234 bold order_bar.highlight = ansi_245 - bold+reverse
stickied = ansi_136 ansi_234 prompt = ansi_33 - bold+reverse
subscription_name = ansi_245 ansi_234 bold saved = ansi_125 -
subscription_text = ansi_240 ansi_234 score = - -
submission_author = ansi_64 ansi_234 bold separator = - - bold
submission_flair = ansi_160 ansi_234 stickied = ansi_136 -
submission_subreddit = ansi_166 ansi_234 subscription_name = ansi_240 - bold
submission_text = ansi_244 ansi_234 subscription_text = ansi_245 -
submission_title = ansi_245 ansi_234 bold submission_author = ansi_64 - bold
title_bar = ansi_37 ansi_234 bold+reverse submission_flair = ansi_160 -
upvote = ansi_64 ansi_234 bold submission_subreddit = ansi_166 -
url = ansi_33 ansi_234 underline submission_text = - -
url_seen = ansi_61 ansi_234 underline submission_title = ansi_244 - bold
user_flair = ansi_136 ansi_234 bold title_bar = ansi_37 - bold+reverse
upvote = ansi_64 - bold
url = ansi_33 - underline
url_seen = ansi_61 - underline
user_flair = ansi_136 - bold

View File

@@ -19,47 +19,53 @@
[theme] [theme]
;<element> = <foreground> <background> <attributes> ;<element> = <foreground> <background> <attributes>
@normal = ansi_241 ansi_230
@highlight = ansi_241 ansi_254
bar_level_1 = ansi_125 ansi_230 bar_level_1 = ansi_125 -
bar_level_2 = ansi_160 ansi_230 bar_level_1.highlight = ansi_125 - reverse
bar_level_3 = ansi_61 ansi_230 bar_level_2 = ansi_160 -
bar_level_4 = ansi_37 ansi_230 bar_level_2.highlight = ansi_125 - reverse
comment_author = ansi_33 ansi_230 bold bar_level_3 = ansi_61 -
comment_author_self = ansi_64 ansi_230 bold bar_level_3.highlight = ansi_125 - reverse
comment_count = ansi_241 ansi_230 bar_level_4 = ansi_37 -
comment_text = ansi_241 ansi_230 bar_level_4.highlight = ansi_125 - reverse
created = ansi_241 ansi_230 comment_author = ansi_33 - bold
cursor = ansi_244 ansi_230 reverse comment_author_self = ansi_64 - bold
default = ansi_241 ansi_230 comment_count = - -
downvote = ansi_160 ansi_230 bold comment_text = - -
gold = ansi_136 ansi_230 bold created = - -
help_bar = ansi_37 ansi_230 bold+reverse cursor = - -
hidden_comment_expand = ansi_245 ansi_230 bold cursor.highlight = ansi_245 - reverse
hidden_comment_text = ansi_245 ansi_230 downvote = ansi_160 - bold
multireddit_name = ansi_240 ansi_230 bold gold = ansi_136 - bold
multireddit_text = ansi_245 ansi_230 help_bar = ansi_37 - bold+reverse
neutral_vote = ansi_241 ansi_230 bold hidden_comment_expand = ansi_245 - bold
notice_info = ansi_241 ansi_230 bold hidden_comment_text = ansi_245 -
notice_loading = ansi_241 ansi_230 bold multireddit_name = ansi_240 - bold
notice_error = ansi_160 ansi_230 bold multireddit_text = ansi_245 -
notice_success = ansi_64 ansi_230 bold neutral_vote = - - bold
nsfw = ansi_125 ansi_230 bold+reverse notice_info = - - bold
order_bar = ansi_245 ansi_254 bold notice_loading = - - bold
order_selected = ansi_245 ansi_254 bold+reverse notice_error = ansi_160 - bold
prompt = ansi_33 ansi_230 bold+reverse notice_success = ansi_64 - bold
saved = ansi_125 ansi_230 nsfw = ansi_125 - bold+reverse
score = ansi_241 ansi_230 order_bar = ansi_245 - bold
separator = ansi_241 ansi_230 bold order_bar.highlight = ansi_245 - bold+reverse
stickied = ansi_136 ansi_230 prompt = ansi_33 - bold+reverse
subscription_name = ansi_240 ansi_230 bold saved = ansi_125 -
subscription_text = ansi_245 ansi_230 score = - -
submission_author = ansi_64 ansi_230 bold separator = - - bold
submission_flair = ansi_160 ansi_230 stickied = ansi_136 -
submission_subreddit = ansi_166 ansi_230 subscription_name = ansi_240 - bold
submission_text = ansi_241 ansi_230 subscription_text = ansi_245 -
submission_title = ansi_240 ansi_230 bold submission_author = ansi_64 - bold
title_bar = ansi_37 ansi_230 bold+reverse submission_flair = ansi_160 -
upvote = ansi_64 ansi_230 bold submission_subreddit = ansi_166 -
url = ansi_33 ansi_230 underline submission_text = - -
url_seen = ansi_61 ansi_230 underline submission_title = ansi_240 - bold
user_flair = ansi_136 ansi_230 bold title_bar = ansi_37 - bold+reverse
upvote = ansi_64 - bold
url = ansi_33 - underline
url_seen = ansi_61 - underline
user_flair = ansi_136 - bold

View File

@@ -144,8 +144,6 @@ def test_theme_initialize_attributes(stdscr):
for element in Theme.DEFAULT_THEME: for element in Theme.DEFAULT_THEME:
assert isinstance(theme.get(element), int) assert isinstance(theme.get(element), int)
assert theme.get_bar_level(0) == theme.get_bar_level(4)
def test_theme_initialize_attributes_monochrome(stdscr): def test_theme_initialize_attributes_monochrome(stdscr):