diff options
| author | Danilo M. <danix@danix.xyz> | 2026-05-03 10:32:47 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-05-03 10:32:47 +0200 |
| commit | 19468b56aa60c0b36ae2e2adabf6f2f3088b47cc (patch) | |
| tree | fe155807f1d81da717d4166816d01bc96e984250 /ui/articles_view.py | |
| parent | 97ed0956eeb88a8ebe7ff1646dfdaf78c6057a6e (diff) | |
| download | publisher-19468b56aa60c0b36ae2e2adabf6f2f3088b47cc.tar.gz publisher-19468b56aa60c0b36ae2e2adabf6f2f3088b47cc.zip | |
feat: articles view with IT/EN tabs and missing translation highlight
Diffstat (limited to 'ui/articles_view.py')
| -rw-r--r-- | ui/articles_view.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/ui/articles_view.py b/ui/articles_view.py new file mode 100644 index 0000000..d3fac93 --- /dev/null +++ b/ui/articles_view.py @@ -0,0 +1,82 @@ +from __future__ import annotations +from PyQt6.QtWidgets import ( + QWidget, QVBoxLayout, QHBoxLayout, QTabWidget, + QListWidget, QListWidgetItem, QLabel, QPushButton, +) +from PyQt6.QtCore import Qt, pyqtSignal +from PyQt6.QtGui import QColor +from core.models import Article + +class ArticleItem(QListWidgetItem): + def __init__(self, article: Article): + super().__init__() + self.article = article + lang_other = "EN" if article.lang == "it" else "IT" + if article.has_translation: + badge = f"🇬🇧 ✓" if article.lang == "it" else "🇮🇹 ✓" + status = f"{article.slug} [{badge}]" + else: + badge = f"🇬🇧 ✗" if article.lang == "it" else "🇮🇹 ✗" + status = f"{article.slug} [{badge}]" + self.setText(status) + if not article.has_translation: + self.setForeground(QColor("#ff6b6b")) + +class ArticlesView(QWidget): + article_selected = pyqtSignal(object) # Article + translate_requested = pyqtSignal(object) # Article + + def __init__(self, parent=None): + super().__init__(parent) + self._articles: list[Article] = [] + self._build_ui() + + def _build_ui(self): + layout = QVBoxLayout(self) + layout.setContentsMargins(0, 0, 0, 0) + self._tabs = QTabWidget() + self._tabs.setStyleSheet("QTabBar::tab { padding: 6px 16px; }") + self._list_it = QListWidget() + self._list_en = QListWidget() + self._tabs.addTab(self._list_it, "🇮🇹 Italiano") + self._tabs.addTab(self._list_en, "🇬🇧 English") + layout.addWidget(self._tabs) + self._list_it.itemClicked.connect(lambda item: self.article_selected.emit(item.article)) + self._list_en.itemClicked.connect(lambda item: self.article_selected.emit(item.article)) + + def set_articles(self, articles: list[Article]): + self._articles = articles + self._list_it.clear() + self._list_en.clear() + for a in articles: + item = ArticleItem(a) + if a.lang == "it": + self._list_it.addItem(item) + else: + self._list_en.addItem(item) + +class MissingTranslationView(QWidget): + article_selected = pyqtSignal(object) # Article + translate_requested = pyqtSignal(object) # Article + + def __init__(self, parent=None): + super().__init__(parent) + self._build_ui() + + def _build_ui(self): + layout = QVBoxLayout(self) + header = QLabel("⚠️ Articoli senza traduzione") + header.setStyleSheet("color: #ff6b6b; font-weight: bold; font-size: 13px; padding: 10px;") + layout.addWidget(header) + self._list = QListWidget() + layout.addWidget(self._list) + self._list.itemClicked.connect(lambda item: self.article_selected.emit(item.article)) + + def set_articles(self, articles: list[Article]): + self._list.clear() + missing = [a for a in articles if not a.has_translation] + for a in missing: + lang_other = "🇬🇧" if a.lang == "it" else "🇮🇹" + item = ArticleItem(a) + item.setText(f"{a.slug} [manca {lang_other}] ({a.lang.upper()})") + self._list.addItem(item) |
