self._stack.addWidget(self._taxonomy_view)
self._page_taxonomy = self._stack.count() - 1
- # Remaining placeholders
- for name in ["media"]:
- w = QLabel(f"[{name}]")
- w.setAlignment(Qt.AlignmentFlag.AlignCenter)
- self._stack.addWidget(w)
- setattr(self, f"_page_{name}", self._stack.count() - 1)
+ from ui.media_view import MediaView
+
+ self._media_view = MediaView(Path(self.config.blog_repo), parent=self)
+ self._stack.addWidget(self._media_view)
+ self._page_media = self._stack.count() - 1
def _build_sidebar(self) -> QWidget:
w = QWidget()
--- /dev/null
+from __future__ import annotations
+import shutil
+from datetime import date
+from pathlib import Path
+from PyQt6.QtWidgets import (
+ QWidget, QVBoxLayout, QHBoxLayout,
+ QLabel, QPushButton, QListWidget, QListWidgetItem, QFileDialog,
+)
+from PyQt6.QtCore import Qt
+from PyQt6.QtGui import QDragEnterEvent, QDropEvent
+
+class MediaView(QWidget):
+ def __init__(self, blog_root: Path, parent=None):
+ super().__init__(parent)
+ self._blog_root = blog_root
+ self.setAcceptDrops(True)
+ self._build_ui()
+ self._refresh_list()
+
+ def _target_dir(self) -> Path:
+ today = date.today()
+ return self._blog_root / "static" / "uppies" / str(today.year) / f"{today.month:02d}"
+
+ def _build_ui(self):
+ layout = QVBoxLayout(self)
+
+ header = QLabel("🖼 Media — static/uppies/YYYY/MM/")
+ header.setStyleSheet("color:#fff;font-weight:bold;font-size:13px;padding:10px;")
+ layout.addWidget(header)
+
+ drop_zone = QLabel("Trascina file qui, oppure usa il pulsante sotto.")
+ drop_zone.setAlignment(Qt.AlignmentFlag.AlignCenter)
+ drop_zone.setStyleSheet("border:2px dashed #2a2a4e;color:#555;padding:20px;border-radius:6px;margin:10px;")
+ drop_zone.setMinimumHeight(80)
+ layout.addWidget(drop_zone)
+
+ btns = QHBoxLayout()
+ add_btn = QPushButton("📂 Aggiungi file...")
+ add_btn.clicked.connect(self._pick_files)
+ btns.addWidget(add_btn)
+ btns.addStretch()
+ self._path_label = QLabel("")
+ self._path_label.setStyleSheet("color:#a855f7;font-size:10px;")
+ btns.addWidget(self._path_label)
+ layout.addLayout(btns)
+
+ self._list = QListWidget()
+ layout.addWidget(self._list, stretch=1)
+
+ self._status = QLabel("")
+ self._status.setStyleSheet("color:#888;font-size:10px;padding:4px;")
+ layout.addWidget(self._status)
+
+ def _copy_files(self, paths: list[str]):
+ target = self._target_dir()
+ target.mkdir(parents=True, exist_ok=True)
+ last_web_path = ""
+ for src in paths:
+ dest = target / Path(src).name
+ shutil.copy2(src, dest)
+ today = date.today()
+ last_web_path = f"/uppies/{today.year}/{today.month:02d}/{Path(src).name}"
+
+ if last_web_path:
+ from PyQt6.QtWidgets import QApplication
+ QApplication.clipboard().setText(last_web_path)
+ self._status.setText(f"Copiato in clipboard: {last_web_path}")
+
+ self._refresh_list()
+
+ def _pick_files(self):
+ files, _ = QFileDialog.getOpenFileNames(self, "Seleziona file media")
+ if files:
+ self._copy_files(files)
+
+ def _refresh_list(self):
+ self._list.clear()
+ target = self._target_dir()
+ today = date.today()
+ self._path_label.setText(f"Cartella: static/uppies/{today.year}/{today.month:02d}/")
+ if not target.exists():
+ return
+ for f in sorted(target.iterdir()):
+ if f.is_file():
+ self._list.addItem(QListWidgetItem(f.name))
+
+ def dragEnterEvent(self, event: QDragEnterEvent):
+ if event.mimeData().hasUrls():
+ event.acceptProposedAction()
+
+ def dropEvent(self, event: QDropEvent):
+ paths = [u.toLocalFile() for u in event.mimeData().urls() if u.isLocalFile()]
+ if paths:
+ self._copy_files(paths)