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, "")