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:
@@ -148,8 +148,12 @@ class ProjectView:
|
|||||||
cv2.putText(canvas, text, (text_x, text_y), font, 1.0, self.TEXT_COLOR, 2)
|
cv2.putText(canvas, text, (text_x, text_y), font, 1.0, self.TEXT_COLOR, 2)
|
||||||
return canvas
|
return canvas
|
||||||
|
|
||||||
# Calculate layout
|
# Calculate layout - dynamically determine items per row based on thumbnail size
|
||||||
items_per_row = min(self.items_per_row, len(self.video_files))
|
# 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
|
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_width = min(item_width, self.THUMBNAIL_SIZE[0])
|
||||||
thumbnail_height = int(thumbnail_width * self.THUMBNAIL_SIZE[1] / 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.putText(canvas, progress_text, (progress_text_x, text_y),
|
||||||
cv2.FONT_HERSHEY_SIMPLEX, 0.4, self.TEXT_COLOR, 1)
|
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
|
# Draw instructions
|
||||||
instructions = [
|
instructions = [
|
||||||
"Project View - Videos in current directory",
|
"Project View - Videos in current directory",
|
||||||
"WASD: Navigate | E: Open video | ESC: Back to editor",
|
"WASD: Navigate | E: Open video | Q: Larger thumbnails | Y: Smaller thumbnails | ESC: Back to editor",
|
||||||
f"Showing {len(self.video_files)} videos"
|
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):
|
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):
|
if self.video_files and 0 <= self.selected_index < len(self.video_files):
|
||||||
return f"open_video:{self.video_files[self.selected_index]}"
|
return f"open_video:{self.video_files[self.selected_index]}"
|
||||||
elif key == ord('w') or key == ord('W'): # W - Up
|
elif key == ord('w') or key == ord('W'): # W - Up
|
||||||
if self.selected_index >= self.items_per_row:
|
# Calculate current items per row dynamically
|
||||||
self.selected_index -= self.items_per_row
|
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:
|
else:
|
||||||
self.selected_index = 0
|
self.selected_index = 0
|
||||||
self._update_scroll()
|
self._update_scroll()
|
||||||
elif key == ord('s') or key == ord('S'): # S - Down
|
elif key == ord('s') or key == ord('S'): # S - Down
|
||||||
if self.selected_index + self.items_per_row < len(self.video_files):
|
# Calculate current items per row dynamically
|
||||||
self.selected_index += self.items_per_row
|
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:
|
else:
|
||||||
self.selected_index = len(self.video_files) - 1
|
self.selected_index = len(self.video_files) - 1
|
||||||
self._update_scroll()
|
self._update_scroll()
|
||||||
@@ -266,6 +285,20 @@ class ProjectView:
|
|||||||
if self.selected_index < len(self.video_files) - 1:
|
if self.selected_index < len(self.video_files) - 1:
|
||||||
self.selected_index += 1
|
self.selected_index += 1
|
||||||
self._update_scroll()
|
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"
|
return "none"
|
||||||
|
|
||||||
@@ -273,8 +306,12 @@ class ProjectView:
|
|||||||
"""Update scroll offset based on selected item"""
|
"""Update scroll offset based on selected item"""
|
||||||
if not self.video_files:
|
if not self.video_files:
|
||||||
return
|
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
|
selected_row = self.selected_index // items_per_row
|
||||||
visible_rows = max(1, self.window_height // self.ITEM_HEIGHT)
|
visible_rows = max(1, self.window_height // self.ITEM_HEIGHT)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user