Refactor thumbnail layout and navigation in ProjectView: dynamically calculate items per row based on window width and thumbnail size, and add keyboard shortcuts for resizing thumbnails. Update instructions to reflect new functionality.

This commit is contained in:
2025-09-16 09:43:01 +02:00
parent cfd919a377
commit d60828d787

View File

@@ -148,8 +148,12 @@ class ProjectView:
cv2.putText(canvas, text, (text_x, text_y), font, 1.0, self.TEXT_COLOR, 2)
return canvas
# Calculate layout
items_per_row = min(self.items_per_row, len(self.video_files))
# Calculate layout - dynamically determine items per row based on thumbnail size
# Calculate how many thumbnails can fit in the window width
available_width = self.window_width - self.THUMBNAIL_MARGIN # Account for left margin
items_per_row = max(1, (available_width + self.THUMBNAIL_MARGIN) // (self.THUMBNAIL_SIZE[0] + self.THUMBNAIL_MARGIN))
items_per_row = min(items_per_row, len(self.video_files)) # Don't exceed number of videos
item_width = (self.window_width - (items_per_row + 1) * self.THUMBNAIL_MARGIN) // items_per_row
thumbnail_width = min(item_width, self.THUMBNAIL_SIZE[0])
thumbnail_height = int(thumbnail_width * self.THUMBNAIL_SIZE[1] / self.THUMBNAIL_SIZE[0])
@@ -225,11 +229,16 @@ class ProjectView:
cv2.putText(canvas, progress_text, (progress_text_x, text_y),
cv2.FONT_HERSHEY_SIMPLEX, 0.4, self.TEXT_COLOR, 1)
# Calculate current items per row for display
available_width = self.window_width - self.THUMBNAIL_MARGIN
current_items_per_row = max(1, (available_width + self.THUMBNAIL_MARGIN) // (self.THUMBNAIL_SIZE[0] + self.THUMBNAIL_MARGIN))
current_items_per_row = min(current_items_per_row, len(self.video_files))
# Draw instructions
instructions = [
"Project View - Videos in current directory",
"WASD: Navigate | E: Open video | ESC: Back to editor",
f"Showing {len(self.video_files)} videos"
"WASD: Navigate | E: Open video | Q: Larger thumbnails | Y: Smaller thumbnails | ESC: Back to editor",
f"Showing {len(self.video_files)} videos | {current_items_per_row} per row | Thumbnail: {self.THUMBNAIL_SIZE[0]}x{self.THUMBNAIL_SIZE[1]}"
]
for i, instruction in enumerate(instructions):
@@ -247,14 +256,24 @@ class ProjectView:
if self.video_files and 0 <= self.selected_index < len(self.video_files):
return f"open_video:{self.video_files[self.selected_index]}"
elif key == ord('w') or key == ord('W'): # W - Up
if self.selected_index >= self.items_per_row:
self.selected_index -= self.items_per_row
# Calculate current items per row dynamically
available_width = self.window_width - self.THUMBNAIL_MARGIN
current_items_per_row = max(1, (available_width + self.THUMBNAIL_MARGIN) // (self.THUMBNAIL_SIZE[0] + self.THUMBNAIL_MARGIN))
current_items_per_row = min(current_items_per_row, len(self.video_files))
if self.selected_index >= current_items_per_row:
self.selected_index -= current_items_per_row
else:
self.selected_index = 0
self._update_scroll()
elif key == ord('s') or key == ord('S'): # S - Down
if self.selected_index + self.items_per_row < len(self.video_files):
self.selected_index += self.items_per_row
# Calculate current items per row dynamically
available_width = self.window_width - self.THUMBNAIL_MARGIN
current_items_per_row = max(1, (available_width + self.THUMBNAIL_MARGIN) // (self.THUMBNAIL_SIZE[0] + self.THUMBNAIL_MARGIN))
current_items_per_row = min(current_items_per_row, len(self.video_files))
if self.selected_index + current_items_per_row < len(self.video_files):
self.selected_index += current_items_per_row
else:
self.selected_index = len(self.video_files) - 1
self._update_scroll()
@@ -266,6 +285,20 @@ class ProjectView:
if self.selected_index < len(self.video_files) - 1:
self.selected_index += 1
self._update_scroll()
elif key == ord('q') or key == ord('Q'): # Q - Make thumbnails LARGER
# Increase thumbnail size (maximum 300x225)
new_width = min(300, self.THUMBNAIL_SIZE[0] + 20)
new_height = int(new_width * self.THUMBNAIL_SIZE[1] / self.THUMBNAIL_SIZE[0])
self.THUMBNAIL_SIZE = (new_width, new_height)
self.ITEM_HEIGHT = self.THUMBNAIL_SIZE[1] + self.PROGRESS_BAR_HEIGHT + self.TEXT_HEIGHT + self.THUMBNAIL_MARGIN
print(f"Thumbnail size: {self.THUMBNAIL_SIZE}")
elif key == ord('y') or key == ord('Y'): # Y - Make thumbnails SMALLER
# Decrease thumbnail size (minimum 100x75)
new_width = max(100, self.THUMBNAIL_SIZE[0] - 20)
new_height = int(new_width * self.THUMBNAIL_SIZE[1] / self.THUMBNAIL_SIZE[0])
self.THUMBNAIL_SIZE = (new_width, new_height)
self.ITEM_HEIGHT = self.THUMBNAIL_SIZE[1] + self.PROGRESS_BAR_HEIGHT + self.TEXT_HEIGHT + self.THUMBNAIL_MARGIN
print(f"Thumbnail size: {self.THUMBNAIL_SIZE}")
return "none"
@@ -273,8 +306,12 @@ class ProjectView:
"""Update scroll offset based on selected item"""
if not self.video_files:
return
items_per_row = min(self.items_per_row, len(self.video_files))
# Calculate current items per row dynamically
available_width = self.window_width - self.THUMBNAIL_MARGIN
items_per_row = max(1, (available_width + self.THUMBNAIL_MARGIN) // (self.THUMBNAIL_SIZE[0] + self.THUMBNAIL_MARGIN))
items_per_row = min(items_per_row, len(self.video_files))
selected_row = self.selected_index // items_per_row
visible_rows = max(1, self.window_height // self.ITEM_HEIGHT)