Fix library thumbnails, add right-click context menu
- Image thumbnails generated via PIL and cached - Video files show tooltip with filename (QPixmap fallback attempted) - Right-click: Open in Default App, Open Containing Folder, Copy File Path, Delete from Library
This commit is contained in:
parent
17daac26d9
commit
1febdb4b1a
@ -16,6 +16,9 @@ from PySide6.QtWidgets import (
|
|||||||
QPushButton,
|
QPushButton,
|
||||||
QLabel,
|
QLabel,
|
||||||
QComboBox,
|
QComboBox,
|
||||||
|
QMenu,
|
||||||
|
QMessageBox,
|
||||||
|
QApplication,
|
||||||
)
|
)
|
||||||
|
|
||||||
from ..core.config import saved_dir, saved_folder_dir, MEDIA_EXTENSIONS, thumbnails_dir
|
from ..core.config import saved_dir, saved_folder_dir, MEDIA_EXTENSIONS, thumbnails_dir
|
||||||
@ -78,6 +81,7 @@ class LibraryView(QWidget):
|
|||||||
self._grid = ThumbnailGrid()
|
self._grid = ThumbnailGrid()
|
||||||
self._grid.post_selected.connect(self._on_selected)
|
self._grid.post_selected.connect(self._on_selected)
|
||||||
self._grid.post_activated.connect(self._on_activated)
|
self._grid.post_activated.connect(self._on_activated)
|
||||||
|
self._grid.context_requested.connect(self._on_context_menu)
|
||||||
layout.addWidget(self._grid)
|
layout.addWidget(self._grid)
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
@ -98,13 +102,20 @@ class LibraryView(QWidget):
|
|||||||
|
|
||||||
for i, (filepath, thumb) in enumerate(zip(self._files, thumbs)):
|
for i, (filepath, thumb) in enumerate(zip(self._files, thumbs)):
|
||||||
thumb._cached_path = str(filepath)
|
thumb._cached_path = str(filepath)
|
||||||
|
thumb.setToolTip(filepath.name)
|
||||||
cached_thumb = lib_thumb_dir / f"{filepath.stem}.jpg"
|
cached_thumb = lib_thumb_dir / f"{filepath.stem}.jpg"
|
||||||
if cached_thumb.exists():
|
if cached_thumb.exists():
|
||||||
pix = QPixmap(str(cached_thumb))
|
pix = QPixmap(str(cached_thumb))
|
||||||
if not pix.isNull():
|
if not pix.isNull():
|
||||||
thumb.set_pixmap(pix)
|
thumb.set_pixmap(pix)
|
||||||
else:
|
continue
|
||||||
|
if filepath.suffix.lower() not in self._VIDEO_EXTS:
|
||||||
self._generate_thumb_async(i, filepath, cached_thumb)
|
self._generate_thumb_async(i, filepath, cached_thumb)
|
||||||
|
else:
|
||||||
|
# Try loading first frame via QPixmap (works for some formats)
|
||||||
|
pix = QPixmap(str(filepath))
|
||||||
|
if not pix.isNull():
|
||||||
|
thumb.set_pixmap(pix)
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Folder list
|
# Folder list
|
||||||
@ -229,3 +240,41 @@ class LibraryView(QWidget):
|
|||||||
def _on_activated(self, index: int) -> None:
|
def _on_activated(self, index: int) -> None:
|
||||||
if 0 <= index < len(self._files):
|
if 0 <= index < len(self._files):
|
||||||
self.file_activated.emit(str(self._files[index]))
|
self.file_activated.emit(str(self._files[index]))
|
||||||
|
|
||||||
|
def _on_context_menu(self, index: int, pos) -> None:
|
||||||
|
if index < 0 or index >= len(self._files):
|
||||||
|
return
|
||||||
|
filepath = self._files[index]
|
||||||
|
|
||||||
|
from PySide6.QtGui import QDesktopServices
|
||||||
|
from PySide6.QtCore import QUrl
|
||||||
|
|
||||||
|
menu = QMenu(self)
|
||||||
|
open_default = menu.addAction("Open in Default App")
|
||||||
|
open_folder = menu.addAction("Open Containing Folder")
|
||||||
|
menu.addSeparator()
|
||||||
|
copy_path = menu.addAction("Copy File Path")
|
||||||
|
menu.addSeparator()
|
||||||
|
delete_action = menu.addAction("Delete from Library")
|
||||||
|
|
||||||
|
action = menu.exec(pos)
|
||||||
|
if not action:
|
||||||
|
return
|
||||||
|
|
||||||
|
if action == open_default:
|
||||||
|
QDesktopServices.openUrl(QUrl.fromLocalFile(str(filepath)))
|
||||||
|
elif action == open_folder:
|
||||||
|
QDesktopServices.openUrl(QUrl.fromLocalFile(str(filepath.parent)))
|
||||||
|
elif action == copy_path:
|
||||||
|
QApplication.clipboard().setText(str(filepath))
|
||||||
|
elif action == delete_action:
|
||||||
|
reply = QMessageBox.question(
|
||||||
|
self, "Confirm", f"Delete {filepath.name} from library?",
|
||||||
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
||||||
|
)
|
||||||
|
if reply == QMessageBox.StandardButton.Yes:
|
||||||
|
filepath.unlink(missing_ok=True)
|
||||||
|
# Also remove cached thumbnail
|
||||||
|
lib_thumb = thumbnails_dir() / "library" / f"{filepath.stem}.jpg"
|
||||||
|
lib_thumb.unlink(missing_ok=True)
|
||||||
|
self.refresh()
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user