Work in progress.
This commit is contained in:
@@ -316,7 +316,7 @@ class Navigator(object):
|
|||||||
page_index=0,
|
page_index=0,
|
||||||
cursor_index=0,
|
cursor_index=0,
|
||||||
inverted=False,
|
inverted=False,
|
||||||
top_height=None):
|
top_item_height=None):
|
||||||
"""
|
"""
|
||||||
Params:
|
Params:
|
||||||
valid_page_callback (func): This function, usually `Content.get`,
|
valid_page_callback (func): This function, usually `Content.get`,
|
||||||
@@ -332,12 +332,16 @@ class Navigator(object):
|
|||||||
inverted - The page is drawn from the bottom of the screen,
|
inverted - The page is drawn from the bottom of the screen,
|
||||||
starting with the page index, up to the top of the
|
starting with the page index, up to the top of the
|
||||||
screen.
|
screen.
|
||||||
|
top_item_height (int): If this is set to a non-null value
|
||||||
|
The number of columns that the top-most item
|
||||||
|
should utilize if non-inverted. This is used for a special mode
|
||||||
|
where all items are drawn non-inverted except for the top one.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.page_index = page_index
|
self.page_index = page_index
|
||||||
self.cursor_index = cursor_index
|
self.cursor_index = cursor_index
|
||||||
self.inverted = inverted
|
self.inverted = inverted
|
||||||
self.top_height = top_height
|
self.top_item_height = top_item_height
|
||||||
self._page_cb = valid_page_cb
|
self._page_cb = valid_page_cb
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -398,17 +402,21 @@ class Navigator(object):
|
|||||||
# Flip the orientation and reset the cursor
|
# Flip the orientation and reset the cursor
|
||||||
self.flip(self.cursor_index)
|
self.flip(self.cursor_index)
|
||||||
self.cursor_index = 0
|
self.cursor_index = 0
|
||||||
self.top_height = None
|
self.top_item_height = None
|
||||||
redraw = True
|
redraw = True
|
||||||
else:
|
else:
|
||||||
if self.cursor_index > 0:
|
if self.cursor_index > 0:
|
||||||
self.cursor_index -= 1
|
self.cursor_index -= 1
|
||||||
|
if self.top_item_height and self.cursor_index == 0:
|
||||||
|
# Selecting the partially displayed item
|
||||||
|
self.top_item_height = None
|
||||||
|
redraw = True
|
||||||
else:
|
else:
|
||||||
self.page_index -= self.step
|
self.page_index -= self.step
|
||||||
if self._is_valid(self.absolute_index):
|
if self._is_valid(self.absolute_index):
|
||||||
# We have reached the beginning of the page - move the
|
# We have reached the beginning of the page - move the
|
||||||
# index
|
# index
|
||||||
self.top_height = None
|
self.top_item_height = None
|
||||||
redraw = True
|
redraw = True
|
||||||
else:
|
else:
|
||||||
self.page_index += self.step
|
self.page_index += self.step
|
||||||
@@ -482,6 +490,7 @@ class Navigator(object):
|
|||||||
self.page_index += (self.step * n_windows)
|
self.page_index += (self.step * n_windows)
|
||||||
self.cursor_index = n_windows - self.cursor_index
|
self.cursor_index = n_windows - self.cursor_index
|
||||||
self.inverted = not self.inverted
|
self.inverted = not self.inverted
|
||||||
|
self.top_item_height = None
|
||||||
|
|
||||||
def _is_valid(self, page_index):
|
def _is_valid(self, page_index):
|
||||||
"""
|
"""
|
||||||
|
|||||||
19
rtv/page.py
19
rtv/page.py
@@ -328,8 +328,7 @@ class Page(object):
|
|||||||
# 4.) Otherwise, this should ensure that the bottom element is always
|
# 4.) Otherwise, this should ensure that the bottom element is always
|
||||||
# full visible and the cursor doesn't jump lines.
|
# full visible and the cursor doesn't jump lines.
|
||||||
|
|
||||||
# Note: Should also disable drawing inverted if only one element
|
# TODO: If only one comment, add (Not enough space to display)
|
||||||
# Note: If only one comment, add (Not enough space to display)
|
|
||||||
|
|
||||||
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(
|
||||||
@@ -347,20 +346,24 @@ class Page(object):
|
|||||||
cancel_inverted = True
|
cancel_inverted = True
|
||||||
current_row = (win_n_rows - 1) if inverted else 0
|
current_row = (win_n_rows - 1) if inverted else 0
|
||||||
available_rows = (win_n_rows - 1) if inverted else win_n_rows
|
available_rows = (win_n_rows - 1) if inverted else win_n_rows
|
||||||
top_height = self.nav.top_height if not inverted else None
|
top_item_height = None if inverted else self.nav.top_item_height
|
||||||
for data in self.content.iterate(page_index, step, win_n_cols - 2):
|
for data in self.content.iterate(page_index, step, win_n_cols - 2):
|
||||||
subwin_n_rows = min(available_rows, data['n_rows'])
|
subwin_n_rows = min(available_rows, data['n_rows'])
|
||||||
if top_height:
|
subwin_inverted = inverted
|
||||||
subwin_n_rows = min(subwin_n_rows, top_height)
|
if top_item_height is not None:
|
||||||
|
# Special case when top_item_height is given. This will only
|
||||||
|
# be applied to the first item that is drawn.
|
||||||
|
subwin_n_rows = min(subwin_n_rows, top_item_height)
|
||||||
|
subwin_inverted = True
|
||||||
|
top_item_height = None
|
||||||
subwin_n_cols = win_n_cols - data['offset']
|
subwin_n_cols = win_n_cols - data['offset']
|
||||||
start = current_row - subwin_n_rows if inverted else current_row
|
start = current_row - subwin_n_rows if inverted else current_row
|
||||||
subwindow = window.derwin(
|
subwindow = window.derwin(
|
||||||
subwin_n_rows, subwin_n_cols, start, data['offset'])
|
subwin_n_rows, subwin_n_cols, start, data['offset'])
|
||||||
attr = self._draw_item(subwindow, data, top_height or inverted)
|
attr = self._draw_item(subwindow, data, subwin_inverted)
|
||||||
self._subwindows.append((subwindow, attr, subwin_n_rows))
|
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)
|
||||||
top_height = None
|
|
||||||
if available_rows <= 0:
|
if available_rows <= 0:
|
||||||
# Indicate the page is full and we can keep the inverted screen.
|
# Indicate the page is full and we can keep the inverted screen.
|
||||||
cancel_inverted = False
|
cancel_inverted = False
|
||||||
|
|||||||
@@ -34,8 +34,14 @@ class SubmissionPage(Page):
|
|||||||
current_index = self.nav.absolute_index
|
current_index = self.nav.absolute_index
|
||||||
self.content.toggle(current_index)
|
self.content.toggle(current_index)
|
||||||
if self.nav.inverted:
|
if self.nav.inverted:
|
||||||
self.nav.top_height = self._subwindows[-1][2]
|
# Special case when inverted and toggling a comment. We want to
|
||||||
|
# ensure that when we re-draw the page, the cursor stays at its
|
||||||
|
# current absolute position. Do this by turning off inversion and
|
||||||
|
# applying an offset to the top item.
|
||||||
|
window = self._subwindows[-1]
|
||||||
|
n_rows, _ = window.getmaxyx()
|
||||||
self.nav.flip(len(self._subwindows) - 1)
|
self.nav.flip(len(self._subwindows) - 1)
|
||||||
|
self.nav.top_item_height = n_rows
|
||||||
|
|
||||||
@SubmissionController.register(Command('SUBMISSION_EXIT'))
|
@SubmissionController.register(Command('SUBMISSION_EXIT'))
|
||||||
def exit_submission(self):
|
def exit_submission(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user