Expirmental improvements to highlight tracking.

This commit is contained in:
Storm Dragon
2025-07-09 01:06:54 -04:00
parent 2ad754a372
commit 5e858cfde1
7 changed files with 543 additions and 1 deletions

View File

@ -382,6 +382,151 @@ class TableManager:
# Check if cursor is within the column bounds
return column_start <= cursor_x < column_end
def move_to_first_cell(self):
"""Move to first cell in current row"""
if not self.env["runtime"]["CursorManager"].is_review_mode():
return None
cursor_pos = self.env["runtime"]["CursorManager"].get_review_or_text_cursor()
if not cursor_pos:
return None
line_text = self.env["runtime"]["ScreenManager"].get_line_text(cursor_pos["y"])
if not line_text:
return None
columns = self.parse_line_into_columns(line_text)
if not columns:
return None
# Set current column to first column
self.currentColumn = 0
# Return info for the first column
return self.get_table_cell_info_by_indices(cursor_pos["y"], 0)
def move_to_last_cell(self):
"""Move to last cell in current row"""
if not self.env["runtime"]["CursorManager"].is_review_mode():
return None
cursor_pos = self.env["runtime"]["CursorManager"].get_review_or_text_cursor()
if not cursor_pos:
return None
line_text = self.env["runtime"]["ScreenManager"].get_line_text(cursor_pos["y"])
if not line_text:
return None
columns = self.parse_line_into_columns(line_text)
if not columns:
return None
# Set current column to last column
self.currentColumn = len(columns) - 1
# Return info for the last column
return self.get_table_cell_info_by_indices(cursor_pos["y"], self.currentColumn)
def move_to_first_char_in_cell(self):
"""Move to first character in current cell"""
if not self.env["runtime"]["CursorManager"].is_review_mode():
return None
cursor_pos = self.env["runtime"]["CursorManager"].get_review_or_text_cursor()
if not cursor_pos:
return None
line_text = self.env["runtime"]["ScreenManager"].get_line_text(cursor_pos["y"])
if not line_text:
return None
columns = self.parse_line_into_columns(line_text)
if not columns or self.currentColumn < 0 or self.currentColumn >= len(columns):
return None
# Get column start position
column_start = self.get_column_start_position(line_text, self.currentColumn)
# Find first non-space character in the column
column_text = columns[self.currentColumn]
first_char_offset = len(column_text) - len(column_text.lstrip())
# Set cursor position to first character in cell
new_x = column_start + first_char_offset
self.env["runtime"]["CursorManager"].set_review_cursor_position(new_x, cursor_pos["y"])
# Get the character at the new position
from fenrirscreenreader.utils import char_utils
(
self.env["screen"]["newCursorReview"]["x"],
self.env["screen"]["newCursorReview"]["y"],
curr_char,
) = char_utils.get_current_char(
new_x,
cursor_pos["y"],
self.env["screen"]["new_content_text"],
)
return {
'cell_content': column_text.strip(),
'column_header': self.get_column_header(self.currentColumn),
'character': curr_char,
'position': 'first'
}
def move_to_last_char_in_cell(self):
"""Move to last character in current cell"""
if not self.env["runtime"]["CursorManager"].is_review_mode():
return None
cursor_pos = self.env["runtime"]["CursorManager"].get_review_or_text_cursor()
if not cursor_pos:
return None
line_text = self.env["runtime"]["ScreenManager"].get_line_text(cursor_pos["y"])
if not line_text:
return None
columns = self.parse_line_into_columns(line_text)
if not columns or self.currentColumn < 0 or self.currentColumn >= len(columns):
return None
# Get column start position
column_start = self.get_column_start_position(line_text, self.currentColumn)
column_text = columns[self.currentColumn]
# Find last non-space character in the column
trimmed_text = column_text.rstrip()
if not trimmed_text:
# If empty cell, go to column start
new_x = column_start
else:
# Find the position of the last character
new_x = column_start + len(trimmed_text) - 1
# Set cursor position to last character in cell
self.env["runtime"]["CursorManager"].set_review_cursor_position(new_x, cursor_pos["y"])
# Get the character at the new position
from fenrirscreenreader.utils import char_utils
(
self.env["screen"]["newCursorReview"]["x"],
self.env["screen"]["newCursorReview"]["y"],
curr_char,
) = char_utils.get_current_char(
new_x,
cursor_pos["y"],
self.env["screen"]["new_content_text"],
)
return {
'cell_content': column_text.strip(),
'column_header': self.get_column_header(self.currentColumn),
'character': curr_char,
'position': 'last'
}
def reset_table_mode(self):
self.set_head_line()