Adding the ability to highlight
This commit is contained in:
72
rtv/page.py
72
rtv/page.py
@@ -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)
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
171
rtv/theme.py
171
rtv/theme.py
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user