From bd69c320985ba7863c5c56fff3c1d11183f8ba13 Mon Sep 17 00:00:00 2001 From: 283375 Date: Sun, 24 Sep 2023 02:07:42 +0800 Subject: [PATCH] feat: `ProjectEntry_Samples` --- ui/components/projectEntry.py | 1 + ui/components/projectEntry.ui | 8 ++- ui/components/projectEntry_Samples.py | 64 +++++++++++++++++ ui/components/projectEntry_Samples.ui | 78 +++++++++++++++++++++ ui/components/projectEntry_Samples_ui.py | 88 ++++++++++++++++++++++++ ui/components/projectEntry_ui.py | 3 +- 6 files changed, 240 insertions(+), 2 deletions(-) create mode 100644 ui/components/projectEntry_Samples.py create mode 100644 ui/components/projectEntry_Samples.ui create mode 100644 ui/components/projectEntry_Samples_ui.py diff --git a/ui/components/projectEntry.py b/ui/components/projectEntry.py index 252e597..94cb8dc 100644 --- a/ui/components/projectEntry.py +++ b/ui/components/projectEntry.py @@ -17,6 +17,7 @@ class ProjectEntry(Ui_ProjectEntry, QWidget): self.project = project self.tabManage.setProject(project) self.tabClassify.setProject(project) + self.tabSamples.setProject(project) def reloadProject(self): self.project.reload() diff --git a/ui/components/projectEntry.ui b/ui/components/projectEntry.ui index d12d51f..e6bebdd 100644 --- a/ui/components/projectEntry.ui +++ b/ui/components/projectEntry.ui @@ -29,7 +29,7 @@ Classify - + Samples @@ -51,6 +51,12 @@
ui.components.projectEntry_Classify
1 + + ProjectEntry_Samples + QWidget +
ui.components.projectEntry_Samples
+ 1 +
diff --git a/ui/components/projectEntry_Samples.py b/ui/components/projectEntry_Samples.py new file mode 100644 index 0000000..18442bd --- /dev/null +++ b/ui/components/projectEntry_Samples.py @@ -0,0 +1,64 @@ +import logging + +from PySide6.QtCore import Qt, Slot +from PySide6.QtWidgets import QListWidgetItem, QWidget + +from project import Project + +from ..extends.samplesListWidget import SamplesListWidget +from .blockLabelDialog import BlockLabelDialog +from .projectEntry_Samples_ui import Ui_ProjectEntry_Samples + +logger = logging.getLogger(__name__) + + +class ProjectEntry_Samples(Ui_ProjectEntry_Samples, QWidget): + TagRole = Qt.ItemDataRole.UserRole + 1 + + def __init__(self, parent=None): + super().__init__(parent) + self.setupUi(self) + + self.samplesListWidget.setDragEnabled(False) + + self.project = None + + def setProject(self, project: Project): + self.project = project + self.updateSampleTags() + + def updateSampleTags(self): + self.tagsListWidget.clear() + + with BlockLabelDialog(self) as block: + block.setText(f"{self.project.name}
Loading tags") + block.show() + for tag in self.project.tags + ["ignored"]: + samples = self.project.samplesByTag(tag) + item = QListWidgetItem(f"{tag} ({len(samples)} samples)") + item.setData(self.TagRole, tag) + self.tagsListWidget.addItem(item) + + @Slot() + def on_loadSamplesButton_clicked(self): + tag = self.tagsListWidget.currentItem().data(self.TagRole) + samples = self.project.samplesByTag(tag) + self.samplesListWidget.setSamples(samples, cancellable=False) + + @Slot() + def on_reloadButton_clicked(self): + self.updateSampleTags() + + @Slot() + def on_unclassifyButton_clicked(self): + selectedSampleItems = self.samplesListWidget.selectedItems() + paths = [ + item.data(SamplesListWidget.PathlibPathRole) for item in selectedSampleItems + ] + for item, path in zip(selectedSampleItems, paths): + try: + self.project.unclassify(path) + index = self.samplesListWidget.indexFromItem(item) + self.samplesListWidget.model().removeRow(index.row()) + except Exception: + logger.exception(f"cannot unclassify {path}") diff --git a/ui/components/projectEntry_Samples.ui b/ui/components/projectEntry_Samples.ui new file mode 100644 index 0000000..63dbf6c --- /dev/null +++ b/ui/components/projectEntry_Samples.ui @@ -0,0 +1,78 @@ + + + ProjectEntry_Samples + + + + 0 + 0 + 648 + 504 + + + + ProjectEntry_Samples + + + + + + + + + 0 + 0 + + + + + + + + Load > + + + + + + + Reload + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Unclassify + + + + + + + + + + + SamplesListWidget + QListWidget +
ui.extends.samplesListWidget
+
+
+ + +
diff --git a/ui/components/projectEntry_Samples_ui.py b/ui/components/projectEntry_Samples_ui.py new file mode 100644 index 0000000..d762539 --- /dev/null +++ b/ui/components/projectEntry_Samples_ui.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'projectEntry_Samples.ui' +## +## Created by: Qt User Interface Compiler version 6.5.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QFrame, QHBoxLayout, QListWidget, + QListWidgetItem, QPushButton, QSizePolicy, QVBoxLayout, + QWidget) + +from ui.extends.samplesListWidget import SamplesListWidget + +class Ui_ProjectEntry_Samples(object): + def setupUi(self, ProjectEntry_Samples): + if not ProjectEntry_Samples.objectName(): + ProjectEntry_Samples.setObjectName(u"ProjectEntry_Samples") + ProjectEntry_Samples.resize(648, 504) + ProjectEntry_Samples.setWindowTitle(u"ProjectEntry_Samples") + self.horizontalLayout = QHBoxLayout(ProjectEntry_Samples) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.verticalLayout_2 = QVBoxLayout() + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.tagsListWidget = QListWidget(ProjectEntry_Samples) + self.tagsListWidget.setObjectName(u"tagsListWidget") + sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tagsListWidget.sizePolicy().hasHeightForWidth()) + self.tagsListWidget.setSizePolicy(sizePolicy) + + self.verticalLayout_2.addWidget(self.tagsListWidget) + + self.loadSamplesButton = QPushButton(ProjectEntry_Samples) + self.loadSamplesButton.setObjectName(u"loadSamplesButton") + + self.verticalLayout_2.addWidget(self.loadSamplesButton) + + self.reloadButton = QPushButton(ProjectEntry_Samples) + self.reloadButton.setObjectName(u"reloadButton") + + self.verticalLayout_2.addWidget(self.reloadButton) + + + self.horizontalLayout.addLayout(self.verticalLayout_2) + + self.samplesListWidget = SamplesListWidget(ProjectEntry_Samples) + self.samplesListWidget.setObjectName(u"samplesListWidget") + + self.horizontalLayout.addWidget(self.samplesListWidget) + + self.frame = QFrame(ProjectEntry_Samples) + self.frame.setObjectName(u"frame") + self.frame.setFrameShape(QFrame.StyledPanel) + self.frame.setFrameShadow(QFrame.Raised) + self.verticalLayout = QVBoxLayout(self.frame) + self.verticalLayout.setObjectName(u"verticalLayout") + self.unclassifyButton = QPushButton(self.frame) + self.unclassifyButton.setObjectName(u"unclassifyButton") + + self.verticalLayout.addWidget(self.unclassifyButton) + + + self.horizontalLayout.addWidget(self.frame) + + + self.retranslateUi(ProjectEntry_Samples) + + QMetaObject.connectSlotsByName(ProjectEntry_Samples) + # setupUi + + def retranslateUi(self, ProjectEntry_Samples): + self.loadSamplesButton.setText(QCoreApplication.translate("ProjectEntry_Samples", u"Load >", None)) + self.reloadButton.setText(QCoreApplication.translate("ProjectEntry_Samples", u"Reload", None)) + self.unclassifyButton.setText(QCoreApplication.translate("ProjectEntry_Samples", u"Unclassify", None)) + pass + # retranslateUi + diff --git a/ui/components/projectEntry_ui.py b/ui/components/projectEntry_ui.py index c6f2844..e21cce5 100644 --- a/ui/components/projectEntry_ui.py +++ b/ui/components/projectEntry_ui.py @@ -20,6 +20,7 @@ from PySide6.QtWidgets import (QApplication, QSizePolicy, QTabWidget, QVBoxLayou from ui.components.projectEntry_Classify import ProjectEntry_Classify from ui.components.projectEntry_Manage import ProjectEntry_Manage +from ui.components.projectEntry_Samples import ProjectEntry_Samples class Ui_ProjectEntry(object): def setupUi(self, ProjectEntry): @@ -36,7 +37,7 @@ class Ui_ProjectEntry(object): self.tabClassify = ProjectEntry_Classify() self.tabClassify.setObjectName(u"tabClassify") self.tabWidget.addTab(self.tabClassify, "") - self.tabSamples = QWidget() + self.tabSamples = ProjectEntry_Samples() self.tabSamples.setObjectName(u"tabSamples") self.tabWidget.addTab(self.tabSamples, "")