Forráskód Böngészése

add tag filter on explorer

olinox 4 éve
szülő
commit
85c4bed961
7 módosított fájl, 1562 hozzáadás és 1475 törlés
  1. 3 0
      notes
  2. 6 6
      ui/qt/dlg_tag_ui.py
  3. 33 34
      ui/qt/main.ui
  4. 32 38
      ui/qt/main_ui.py
  5. 1416 1395
      ui/qt/rsc_rc.py
  6. 55 1
      ui/qt/widgets/explorertable.py
  7. 17 1
      ui/window.py

+ 3 - 0
notes

@@ -15,6 +15,9 @@ Bugs:
 
 Priorité 1:
 
+* explorer: combiner les recherches par tag et texte
+* indexer: mettre à jour l'explorer de manière intelligente après l'indexation
+* explorer: afficher le statut des morceaux
 * indexer: clarifier ce qu'il se passe lorsqu'un morceau apparait plusieurs fois dans les répertoires indexés, et
   que le morceau indéxé est suppr. Est-ce que ses versions jumelles sont bien indéxées à sa place?
 * mettre à jour l'explorer au fur et à mesure de l'indexation

+ 6 - 6
ui/qt/dlg_tag_ui.py

@@ -25,11 +25,11 @@ class Ui_dlgTag(object):
         self.verticalLayout = QtWidgets.QVBoxLayout()
         self.verticalLayout.setContentsMargins(-1, 10, -1, -1)
         self.verticalLayout.setObjectName("verticalLayout")
-        self.lineEdit = QtWidgets.QLineEdit(dlgTag)
-        self.lineEdit.setMinimumSize(QtCore.QSize(0, 28))
-        self.lineEdit.setMaximumSize(QtCore.QSize(16777215, 28))
-        self.lineEdit.setObjectName("lineEdit")
-        self.verticalLayout.addWidget(self.lineEdit)
+        self.lineTagLabel = QtWidgets.QLineEdit(dlgTag)
+        self.lineTagLabel.setMinimumSize(QtCore.QSize(0, 28))
+        self.lineTagLabel.setMaximumSize(QtCore.QSize(16777215, 28))
+        self.lineTagLabel.setObjectName("lineTagLabel")
+        self.verticalLayout.addWidget(self.lineTagLabel)
         spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
         self.verticalLayout.addItem(spacerItem)
         self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
@@ -55,6 +55,6 @@ class Ui_dlgTag(object):
     def retranslateUi(self, dlgTag):
         _translate = QtCore.QCoreApplication.translate
         dlgTag.setWindowTitle(_translate("dlgTag", "Créer / éditer une étiquette"))
-        self.lineEdit.setPlaceholderText(_translate("dlgTag", "Nouvelle étiquette..."))
+        self.lineTagLabel.setPlaceholderText(_translate("dlgTag", "Nouvelle étiquette..."))
         self.btnCancel.setText(_translate("dlgTag", "Annuler"))
         self.btnSave.setText(_translate("dlgTag", "Enregistrer"))

+ 33 - 34
ui/qt/main.ui

@@ -383,44 +383,31 @@
                     </property>
                    </widget>
                   </item>
-                  <item>
-                   <widget class="QToolButton" name="explorerBtnFilter">
-                    <property name="enabled">
-                     <bool>false</bool>
-                    </property>
-                    <property name="minimumSize">
-                     <size>
-                      <width>28</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>28</width>
-                      <height>28</height>
-                     </size>
-                    </property>
-                    <property name="text">
-                     <string>...</string>
-                    </property>
-                    <property name="icon">
-                     <iconset resource="rsc.qrc">
-                      <normaloff>:/img/rsc/filter.png</normaloff>:/img/rsc/filter.png</iconset>
-                    </property>
-                   </widget>
-                  </item>
                  </layout>
                 </item>
                 <item>
-                 <widget class="QComboBox" name="filterTags">
-                  <item>
-                   <property name="text">
-                    <string>Feu rapide</string>
-                   </property>
-                  </item>
+                 <widget class="QComboBox" name="explorerFilterTags">
+                  <property name="minimumSize">
+                   <size>
+                    <width>0</width>
+                    <height>28</height>
+                   </size>
+                  </property>
+                  <property name="maximumSize">
+                   <size>
+                    <width>16777215</width>
+                    <height>28</height>
+                   </size>
+                  </property>
+                  <property name="currentIndex">
+                   <number>0</number>
+                  </property>
+                  <property name="placeholderText">
+                   <string>(Filtrer par étiquette)</string>
+                  </property>
                   <item>
                    <property name="text">
-                    <string>Terre lent</string>
+                    <string>Toutes les étiquettes</string>
                    </property>
                   </item>
                  </widget>
@@ -1360,7 +1347,13 @@
                  <widget class="QPushButton" name="tableTagsRemoveButton">
                   <property name="minimumSize">
                    <size>
-                    <width>0</width>
+                    <width>100</width>
+                    <height>32</height>
+                   </size>
+                  </property>
+                  <property name="maximumSize">
+                   <size>
+                    <width>100</width>
                     <height>32</height>
                    </size>
                   </property>
@@ -1394,6 +1387,12 @@
                     <height>32</height>
                    </size>
                   </property>
+                  <property name="maximumSize">
+                   <size>
+                    <width>128</width>
+                    <height>32</height>
+                   </size>
+                  </property>
                   <property name="text">
                    <string>Ajouter</string>
                   </property>

+ 32 - 38
ui/qt/main_ui.py

@@ -171,21 +171,13 @@ class Ui_mainWindow(object):
         self.explorerLineSearch.setClearButtonEnabled(True)
         self.explorerLineSearch.setObjectName("explorerLineSearch")
         self.horizontalLayout_21.addWidget(self.explorerLineSearch)
-        self.explorerBtnFilter = QtWidgets.QToolButton(self.page_3)
-        self.explorerBtnFilter.setEnabled(False)
-        self.explorerBtnFilter.setMinimumSize(QtCore.QSize(28, 28))
-        self.explorerBtnFilter.setMaximumSize(QtCore.QSize(28, 28))
-        icon4 = QtGui.QIcon()
-        icon4.addPixmap(QtGui.QPixmap(":/img/rsc/filter.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerBtnFilter.setIcon(icon4)
-        self.explorerBtnFilter.setObjectName("explorerBtnFilter")
-        self.horizontalLayout_21.addWidget(self.explorerBtnFilter)
         self.verticalLayout_8.addLayout(self.horizontalLayout_21)
-        self.comboBox = QtWidgets.QComboBox(self.page_3)
-        self.comboBox.setObjectName("comboBox")
-        self.comboBox.addItem("")
-        self.comboBox.addItem("")
-        self.verticalLayout_8.addWidget(self.comboBox)
+        self.explorerFilterTags = QtWidgets.QComboBox(self.page_3)
+        self.explorerFilterTags.setMinimumSize(QtCore.QSize(0, 28))
+        self.explorerFilterTags.setMaximumSize(QtCore.QSize(16777215, 28))
+        self.explorerFilterTags.setObjectName("explorerFilterTags")
+        self.explorerFilterTags.addItem("")
+        self.verticalLayout_8.addWidget(self.explorerFilterTags)
         self.explorerTable = ExplorerTable(self.page_3)
         self.explorerTable.setMinimumSize(QtCore.QSize(320, 0))
         self.explorerTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
@@ -240,9 +232,9 @@ class Ui_mainWindow(object):
         self.explorerTrackEdit.setMinimumSize(QtCore.QSize(28, 28))
         self.explorerTrackEdit.setMaximumSize(QtCore.QSize(28, 28))
         self.explorerTrackEdit.setText("")
-        icon5 = QtGui.QIcon()
-        icon5.addPixmap(QtGui.QPixmap(":/img/rsc/edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerTrackEdit.setIcon(icon5)
+        icon4 = QtGui.QIcon()
+        icon4.addPixmap(QtGui.QPixmap(":/img/rsc/edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerTrackEdit.setIcon(icon4)
         self.explorerTrackEdit.setObjectName("explorerTrackEdit")
         self.horizontalLayout_13.addWidget(self.explorerTrackEdit)
         self.verticalLayout_9.addLayout(self.horizontalLayout_13)
@@ -370,26 +362,26 @@ class Ui_mainWindow(object):
         self.explorerTrackPlay = QtWidgets.QPushButton(self.page_3)
         self.explorerTrackPlay.setEnabled(False)
         self.explorerTrackPlay.setMinimumSize(QtCore.QSize(220, 0))
-        icon6 = QtGui.QIcon()
-        icon6.addPixmap(QtGui.QPixmap(":/img/rsc/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerTrackPlay.setIcon(icon6)
+        icon5 = QtGui.QIcon()
+        icon5.addPixmap(QtGui.QPixmap(":/img/rsc/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerTrackPlay.setIcon(icon5)
         self.explorerTrackPlay.setIconSize(QtCore.QSize(12, 12))
         self.explorerTrackPlay.setObjectName("explorerTrackPlay")
         self.verticalLayout_5.addWidget(self.explorerTrackPlay)
         self.explorerAddToPlaylist = QtWidgets.QPushButton(self.page_3)
         self.explorerAddToPlaylist.setEnabled(False)
         self.explorerAddToPlaylist.setMinimumSize(QtCore.QSize(220, 0))
-        icon7 = QtGui.QIcon()
-        icon7.addPixmap(QtGui.QPixmap(":/img/rsc/double-right-arrows-symbol.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerAddToPlaylist.setIcon(icon7)
+        icon6 = QtGui.QIcon()
+        icon6.addPixmap(QtGui.QPixmap(":/img/rsc/double-right-arrows-symbol.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerAddToPlaylist.setIcon(icon6)
         self.explorerAddToPlaylist.setObjectName("explorerAddToPlaylist")
         self.verticalLayout_5.addWidget(self.explorerAddToPlaylist)
         self.explorerRemoveFromPlaylist = QtWidgets.QPushButton(self.page_3)
         self.explorerRemoveFromPlaylist.setEnabled(False)
         self.explorerRemoveFromPlaylist.setMinimumSize(QtCore.QSize(220, 0))
-        icon8 = QtGui.QIcon()
-        icon8.addPixmap(QtGui.QPixmap(":/img/rsc/double-left-arrows-symbol.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerRemoveFromPlaylist.setIcon(icon8)
+        icon7 = QtGui.QIcon()
+        icon7.addPixmap(QtGui.QPixmap(":/img/rsc/double-left-arrows-symbol.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerRemoveFromPlaylist.setIcon(icon7)
         self.explorerRemoveFromPlaylist.setObjectName("explorerRemoveFromPlaylist")
         self.verticalLayout_5.addWidget(self.explorerRemoveFromPlaylist)
         self.horizontalLayout_6.addLayout(self.verticalLayout_5)
@@ -505,18 +497,18 @@ class Ui_mainWindow(object):
         self.horizontalLayout_7.setObjectName("horizontalLayout_7")
         self.musicFoldersRemoveButton = QtWidgets.QPushButton(self.page_5)
         self.musicFoldersRemoveButton.setMinimumSize(QtCore.QSize(0, 32))
-        icon9 = QtGui.QIcon()
-        icon9.addPixmap(QtGui.QPixmap(":/img/rsc/delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.musicFoldersRemoveButton.setIcon(icon9)
+        icon8 = QtGui.QIcon()
+        icon8.addPixmap(QtGui.QPixmap(":/img/rsc/delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.musicFoldersRemoveButton.setIcon(icon8)
         self.musicFoldersRemoveButton.setObjectName("musicFoldersRemoveButton")
         self.horizontalLayout_7.addWidget(self.musicFoldersRemoveButton)
         spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.horizontalLayout_7.addItem(spacerItem1)
         self.musicFoldersAddButton = QtWidgets.QPushButton(self.page_5)
         self.musicFoldersAddButton.setMinimumSize(QtCore.QSize(128, 32))
-        icon10 = QtGui.QIcon()
-        icon10.addPixmap(QtGui.QPixmap(":/img/rsc/plus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.musicFoldersAddButton.setIcon(icon10)
+        icon9 = QtGui.QIcon()
+        icon9.addPixmap(QtGui.QPixmap(":/img/rsc/plus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.musicFoldersAddButton.setIcon(icon9)
         self.musicFoldersAddButton.setObjectName("musicFoldersAddButton")
         self.horizontalLayout_7.addWidget(self.musicFoldersAddButton)
         self.verticalLayout_6.addLayout(self.horizontalLayout_7)
@@ -558,15 +550,17 @@ class Ui_mainWindow(object):
         self.horizontalLayout_20.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
         self.horizontalLayout_20.setObjectName("horizontalLayout_20")
         self.tableTagsRemoveButton = QtWidgets.QPushButton(self.page_5)
-        self.tableTagsRemoveButton.setMinimumSize(QtCore.QSize(0, 32))
-        self.tableTagsRemoveButton.setIcon(icon9)
+        self.tableTagsRemoveButton.setMinimumSize(QtCore.QSize(100, 32))
+        self.tableTagsRemoveButton.setMaximumSize(QtCore.QSize(100, 32))
+        self.tableTagsRemoveButton.setIcon(icon8)
         self.tableTagsRemoveButton.setObjectName("tableTagsRemoveButton")
         self.horizontalLayout_20.addWidget(self.tableTagsRemoveButton)
         spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.horizontalLayout_20.addItem(spacerItem2)
         self.tagsTableAddButton = QtWidgets.QPushButton(self.page_5)
         self.tagsTableAddButton.setMinimumSize(QtCore.QSize(128, 32))
-        self.tagsTableAddButton.setIcon(icon10)
+        self.tagsTableAddButton.setMaximumSize(QtCore.QSize(128, 32))
+        self.tagsTableAddButton.setIcon(icon9)
         self.tagsTableAddButton.setObjectName("tagsTableAddButton")
         self.horizontalLayout_20.addWidget(self.tagsTableAddButton)
         self.verticalLayout_6.addLayout(self.horizontalLayout_20)
@@ -594,6 +588,7 @@ class Ui_mainWindow(object):
         self.retranslateUi(mainWindow)
         self.menu.setCurrentRow(-1)
         self.stack.setCurrentIndex(1)
+        self.explorerFilterTags.setCurrentIndex(0)
         self.explorerTrackMetaStack.setCurrentIndex(1)
         QtCore.QMetaObject.connectSlotsByName(mainWindow)
 
@@ -613,9 +608,8 @@ class Ui_mainWindow(object):
         self.btnExplorerRefresh.setToolTip(_translate("mainWindow", "Rafraichir la liste"))
         self.explorerBtnSearch.setText(_translate("mainWindow", "..."))
         self.explorerLineSearch.setPlaceholderText(_translate("mainWindow", "Rechercher un morceau..."))
-        self.explorerBtnFilter.setText(_translate("mainWindow", "..."))
-        self.comboBox.setItemText(0, _translate("mainWindow", "Feu rapide"))
-        self.comboBox.setItemText(1, _translate("mainWindow", "Terre lent"))
+        self.explorerFilterTags.setPlaceholderText(_translate("mainWindow", "(Filtrer par étiquette)"))
+        self.explorerFilterTags.setItemText(0, _translate("mainWindow", "Toutes les étiquettes"))
         self.explorerTable.headerItem().setText(1, _translate("mainWindow", "2"))
         self.label_2.setText(_translate("mainWindow", "Sélectionnez une piste"))
         self.label_11.setText(_translate("mainWindow", "Informations sur la piste"))

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 1416 - 1395
ui/qt/rsc_rc.py


+ 55 - 1
ui/qt/widgets/explorertable.py

@@ -1,4 +1,4 @@
-from PyQt5.QtCore import pyqtSlot, pyqtSignal
+from PyQt5.QtCore import pyqtSignal
 from PyQt5.QtGui import QIcon
 from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QTreeWidgetItemIterator
 
@@ -146,5 +146,59 @@ class ExplorerTable(QTreeWidget):
 
         if searchText:
             self.expandAll()
+        else:
+            self.collapseAll()
+
+        self.setUpdatesEnabled(True)
+
+    def filterByTagId(self, tag_id):
+        track_ids = []
+        if tag_id:
+            track_repo = TrackRepository()
+            track_ids = [t.id for t in track_repo.get_by_tag_id(tag_id)]
+
+        self.setUpdatesEnabled(False)
+
+        iterator = QTreeWidgetItemIterator(self)
+        while True:
+            item = iterator.value()
+            if item is not None:
+
+                if not item.data(2, 0):
+                    # not a track
+                    item.setHidden(True)
+                    iterator += 1
+                    continue
+
+                hide = tag_id and item.data(2, 0) not in track_ids
+
+                item.setHidden(hide)
+
+                iterator += 1
+            else:
+                break
+
+        iterator = QTreeWidgetItemIterator(self)
+        while True:
+            item = iterator.value()
+            if item is not None:
+                if not item.data(2, 0) or item.isHidden():
+                    # not a track or hidden
+                    iterator += 1
+                    continue
+
+                if item.parent():
+                    item.parent().setHidden(False)
+                if item.parent() and item.parent().parent():
+                    item.parent().parent().setHidden(False)
+
+                iterator += 1
+            else:
+                break
+
+        if tag_id:
+            self.expandAll()
+        else:
+            self.collapseAll()
 
         self.setUpdatesEnabled(True)

+ 17 - 1
ui/window.py

@@ -13,7 +13,7 @@ from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFil
 from core.logging_ import Logger
 from core.models import MusicFolder, TrackTag
 from core.repositories import MusicFolderRepository, TrackRepository, SessionTrackRepository, SessionRepository, \
-    TrackTagRepository
+    TrackTagRepository, TagRepository
 from ui.qt.dlg_meta_editor import DlgMetaEditor
 from ui.qt.dlg_playlist import DlgPlaylist
 from ui.qt.dlg_select_playlist import DlgSelectPlaylist
@@ -76,6 +76,9 @@ class MainWindow(QMainWindow):
         self.ui.explorerLineSearch.textChanged.connect(lambda s: (s or self.explorerSearchChanged())) # when search bar is cleared
         self.ui.explorerBtnSearch.clicked.connect(self.explorerSearchChanged)
 
+        self.populate_explorer_filter_tags()
+        self.ui.explorerFilterTags.currentIndexChanged.connect(self.tagFilterChanged)
+
         self.ui.explorerTrackEdit.clicked.connect(self.showMetaEditor)
 
         self.ui.lineSearchTags.textChanged.connect(self.ui.explorerTrackTagsTable.filter)
@@ -193,6 +196,15 @@ class MainWindow(QMainWindow):
             str(track_num if track_num is not None else "")
         )
 
+    def populate_explorer_filter_tags(self):
+        tag_repo = TagRepository()
+        self.ui.explorerFilterTags.clear()
+
+        self.ui.explorerFilterTags.addItem("Toutes les étiquettes", 0)
+        self.ui.explorerFilterTags.setCurrentIndex(0)
+        for tag in tag_repo.get_all():
+            self.ui.explorerFilterTags.addItem(tag.label, tag.id)
+
     def populate_music_folders_table(self):
         music_folders = MusicFolderRepository().get_all()
         self.ui.settingsMusicFoldersTable.setRowCount(0)
@@ -362,6 +374,10 @@ class MainWindow(QMainWindow):
         searchText = self.ui.explorerLineSearch.text()
         self.ui.explorerTable.filterBySearchText(searchText)
 
+    def tagFilterChanged(self, _):
+        tag_id = int(self.ui.explorerFilterTags.currentData())
+        self.ui.explorerTable.filterByTagId(tag_id)
+
     def filesIndexed(self, tracks):
         self.statusBar().showMessage(f"{len(tracks)} fichiers indexés", 3000)
         self.refresh_explorer_tree(tracks)

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott