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

add dlgtags, sqtablewidget, minor fixes

olinox 4 éve
szülő
commit
92667220a5

+ 5 - 0
core/utils.py

@@ -0,0 +1,5 @@
+
+
+def norm_search(s):
+    return s.lower().replace("é", "e").replace("è", "e").replace("ê", "e").replace("ë", "e").replace("ç", "c") \
+        .replace("à", "a").replace("ö", "o").replace("ü", "u").replace("'", " ")

+ 42 - 0
ui/qt/dlg_tag.py

@@ -0,0 +1,42 @@
+from PyQt5.QtWidgets import QDialog
+
+from core.models import Tag
+from core.repositories import TagRepository
+from ui.qt.dlg_tag_ui import Ui_dlgTag
+
+
+class DlgTag(QDialog):
+    def __init__(self, tag, parent=None):
+        super().__init__(parent)
+        self.tag = tag
+        self.createWidgets()
+
+    def createWidgets(self):
+        self.ui = Ui_dlgTag()
+        self.ui.setupUi(self)
+
+        if self.tag.label:
+            self.ui.lineTagLabel.setText(self.tag.label)
+
+        self.ui.btnSave.clicked.connect(self.save)
+        self.ui.btnCancel.clicked.connect(self.cancel)
+
+    @classmethod
+    def edit(cls, tag=None, parent=None):
+        if tag is None:
+            tag = Tag()
+        dlg = cls(tag, parent)
+        r = dlg.exec_()
+        return r
+
+    def ok(self):
+        new_label = self.ui.lineTagLabel.text()
+        if not new_label:
+            return
+        tag_repo = TagRepository()
+        self.tag = new_label
+        tag_repo.commit()
+        self.done(1)
+
+    def cancel(self):
+        self.done(0)

+ 129 - 0
ui/qt/dlg_tag.ui

@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>dlgTag</class>
+ <widget class="QDialog" name="dlgTag">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>336</width>
+    <height>129</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>336</width>
+    <height>129</height>
+   </size>
+  </property>
+  <property name="font">
+   <font>
+    <family>Verdana</family>
+   </font>
+  </property>
+  <property name="windowTitle">
+   <string>Créer / éditer une étiquette</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <property name="topMargin">
+      <number>10</number>
+     </property>
+     <item>
+      <widget class="QLineEdit" name="lineTagLabel">
+       <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="placeholderText">
+        <string>Nouvelle étiquette...</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <widget class="QPushButton" name="btnCancel">
+         <property name="minimumSize">
+          <size>
+           <width>120</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>120</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>Annuler</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btnSave">
+         <property name="minimumSize">
+          <size>
+           <width>140</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>140</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>Enregistrer</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 60 - 0
ui/qt/dlg_tag_ui.py

@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'dlg_tag.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_dlgTag(object):
+    def setupUi(self, dlgTag):
+        dlgTag.setObjectName("dlgTag")
+        dlgTag.setWindowModality(QtCore.Qt.ApplicationModal)
+        dlgTag.resize(336, 129)
+        dlgTag.setMinimumSize(QtCore.QSize(336, 129))
+        font = QtGui.QFont()
+        font.setFamily("Verdana")
+        dlgTag.setFont(font)
+        self.horizontalLayout = QtWidgets.QHBoxLayout(dlgTag)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        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)
+        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout.addItem(spacerItem)
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.btnCancel = QtWidgets.QPushButton(dlgTag)
+        self.btnCancel.setMinimumSize(QtCore.QSize(120, 28))
+        self.btnCancel.setMaximumSize(QtCore.QSize(120, 28))
+        self.btnCancel.setObjectName("btnCancel")
+        self.horizontalLayout_2.addWidget(self.btnCancel)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem1)
+        self.btnSave = QtWidgets.QPushButton(dlgTag)
+        self.btnSave.setMinimumSize(QtCore.QSize(140, 28))
+        self.btnSave.setMaximumSize(QtCore.QSize(140, 28))
+        self.btnSave.setObjectName("btnSave")
+        self.horizontalLayout_2.addWidget(self.btnSave)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout.addLayout(self.verticalLayout)
+
+        self.retranslateUi(dlgTag)
+        QtCore.QMetaObject.connectSlotsByName(dlgTag)
+
+    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.btnCancel.setText(_translate("dlgTag", "Annuler"))
+        self.btnSave.setText(_translate("dlgTag", "Enregistrer"))

+ 1 - 0
ui/qt/gen.cmd

@@ -4,5 +4,6 @@ pyuic5 dlg_select_playlist.ui -o dlg_select_playlist_ui.py --from-imports
 pyuic5 dlg_playlist.ui -o dlg_playlist_ui.py --from-imports
 pyuic5 dlg_tag_editor.ui -o dlg_tag_editor_ui.py --from-imports
 pyuic5 dlg_meta_editor.ui -o dlg_meta_editor_ui.py --from-imports
+pyuic5 dlg_tag.ui -o dlg_tag_ui.py --from-imports
 pyuic5 widgets/frame_notes.ui -o widgets/frame_notes_ui.py --import-from=..
 pyuic5 widgets/vlcframe.ui -o widgets/vlcframe_ui.py --import-from=..

+ 22 - 30
ui/qt/main.ui

@@ -154,6 +154,18 @@
                   <property name="enabled">
                    <bool>false</bool>
                   </property>
+                  <property name="minimumSize">
+                   <size>
+                    <width>160</width>
+                    <height>0</height>
+                   </size>
+                  </property>
+                  <property name="maximumSize">
+                   <size>
+                    <width>320</width>
+                    <height>16777215</height>
+                   </size>
+                  </property>
                   <property name="editTriggers">
                    <set>QAbstractItemView::NoEditTriggers</set>
                   </property>
@@ -400,7 +412,7 @@
                  </layout>
                 </item>
                 <item>
-                 <widget class="QComboBox" name="comboBox">
+                 <widget class="QComboBox" name="filterTags">
                   <item>
                    <property name="text">
                     <string>Feu rapide</string>
@@ -736,6 +748,12 @@
                        <layout class="QHBoxLayout" name="horizontalLayout_19">
                         <item>
                          <widget class="QLabel" name="label_12">
+                          <property name="minimumSize">
+                           <size>
+                            <width>80</width>
+                            <height>0</height>
+                           </size>
+                          </property>
                           <property name="font">
                            <font>
                             <family>Verdana</family>
@@ -751,7 +769,7 @@
                         <item>
                          <widget class="QLineEdit" name="lineSearchTags">
                           <property name="enabled">
-                           <bool>false</bool>
+                           <bool>true</bool>
                           </property>
                           <property name="minimumSize">
                            <size>
@@ -761,7 +779,7 @@
                           </property>
                           <property name="maximumSize">
                            <size>
-                            <width>100</width>
+                            <width>200</width>
                             <height>16777215</height>
                            </size>
                           </property>
@@ -773,32 +791,6 @@
                           </property>
                          </widget>
                         </item>
-                        <item>
-                         <widget class="QToolButton" name="btnEditTags">
-                          <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/edit.png</normaloff>:/img/rsc/edit.png</iconset>
-                          </property>
-                         </widget>
-                        </item>
                        </layout>
                       </item>
                       <item>
@@ -812,7 +804,7 @@
                         <property name="maximumSize">
                          <size>
                           <width>16777215</width>
-                          <height>160</height>
+                          <height>16777215</height>
                          </size>
                         </property>
                         <property name="horizontalScrollBarPolicy">

+ 8 - 21
ui/qt/main_ui.py

@@ -83,6 +83,8 @@ class Ui_mainWindow(object):
         self.horizontalLayout_14.setObjectName("horizontalLayout_14")
         self.sessionPlaylist = PlaylistTable(self.page_1)
         self.sessionPlaylist.setEnabled(False)
+        self.sessionPlaylist.setMinimumSize(QtCore.QSize(160, 0))
+        self.sessionPlaylist.setMaximumSize(QtCore.QSize(320, 16777215))
         self.sessionPlaylist.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
         self.sessionPlaylist.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
         self.sessionPlaylist.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
@@ -122,14 +124,6 @@ class Ui_mainWindow(object):
         self.verticalLayout_3.addLayout(self.horizontalLayout_17)
         self.horizontalLayout_2.addLayout(self.verticalLayout_3)
         self.stack.addWidget(self.page_1)
-        self.page_2 = QtWidgets.QWidget()
-        self.page_2.setObjectName("page_2")
-        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.page_2)
-        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
-        self.verticalLayout_4 = QtWidgets.QVBoxLayout()
-        self.verticalLayout_4.setObjectName("verticalLayout_4")
-        self.horizontalLayout_3.addLayout(self.verticalLayout_4)
-        self.stack.addWidget(self.page_2)
         self.page_3 = QtWidgets.QWidget()
         self.page_3.setObjectName("page_3")
         self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.page_3)
@@ -312,6 +306,7 @@ class Ui_mainWindow(object):
         self.horizontalLayout_19 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_19.setObjectName("horizontalLayout_19")
         self.label_12 = QtWidgets.QLabel(self.page_6)
+        self.label_12.setMinimumSize(QtCore.QSize(80, 0))
         font = QtGui.QFont()
         font.setFamily("Verdana")
         font.setPointSize(8)
@@ -320,23 +315,16 @@ class Ui_mainWindow(object):
         self.label_12.setObjectName("label_12")
         self.horizontalLayout_19.addWidget(self.label_12)
         self.lineSearchTags = QtWidgets.QLineEdit(self.page_6)
-        self.lineSearchTags.setEnabled(False)
+        self.lineSearchTags.setEnabled(True)
         self.lineSearchTags.setMinimumSize(QtCore.QSize(0, 25))
-        self.lineSearchTags.setMaximumSize(QtCore.QSize(100, 16777215))
+        self.lineSearchTags.setMaximumSize(QtCore.QSize(200, 16777215))
         self.lineSearchTags.setClearButtonEnabled(True)
         self.lineSearchTags.setObjectName("lineSearchTags")
         self.horizontalLayout_19.addWidget(self.lineSearchTags)
-        self.btnEditTags = QtWidgets.QToolButton(self.page_6)
-        self.btnEditTags.setEnabled(False)
-        self.btnEditTags.setMinimumSize(QtCore.QSize(28, 28))
-        self.btnEditTags.setMaximumSize(QtCore.QSize(28, 28))
-        self.btnEditTags.setIcon(icon5)
-        self.btnEditTags.setObjectName("btnEditTags")
-        self.horizontalLayout_19.addWidget(self.btnEditTags)
         self.verticalLayout_9.addLayout(self.horizontalLayout_19)
         self.explorerTrackTagsTable = TagsTable(self.page_6)
         self.explorerTrackTagsTable.setMinimumSize(QtCore.QSize(0, 160))
-        self.explorerTrackTagsTable.setMaximumSize(QtCore.QSize(16777215, 160))
+        self.explorerTrackTagsTable.setMaximumSize(QtCore.QSize(16777215, 16777215))
         self.explorerTrackTagsTable.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
         self.explorerTrackTagsTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
         self.explorerTrackTagsTable.setAlternatingRowColors(True)
@@ -451,7 +439,7 @@ class Ui_mainWindow(object):
         self.explorerPlaylist.setHorizontalHeaderItem(2, item)
         self.explorerPlaylist.horizontalHeader().setVisible(False)
         self.explorerPlaylist.horizontalHeader().setStretchLastSection(True)
-        self.explorerPlaylist.verticalHeader().setVisible(False)
+        self.explorerPlaylist.verticalHeader().setVisible(True)
         self.verticalLayout_12.addWidget(self.explorerPlaylist)
         self.horizontalLayout_6.addLayout(self.verticalLayout_12)
         self.horizontalLayout_6.setStretch(0, 1)
@@ -605,7 +593,7 @@ class Ui_mainWindow(object):
 
         self.retranslateUi(mainWindow)
         self.menu.setCurrentRow(-1)
-        self.stack.setCurrentIndex(0)
+        self.stack.setCurrentIndex(1)
         self.explorerTrackMetaStack.setCurrentIndex(1)
         QtCore.QMetaObject.connectSlotsByName(mainWindow)
 
@@ -637,7 +625,6 @@ class Ui_mainWindow(object):
         self.label_8.setText(_translate("mainWindow", "N°"))
         self.label_12.setText(_translate("mainWindow", "Etiquettes"))
         self.lineSearchTags.setPlaceholderText(_translate("mainWindow", "Rechercher..."))
-        self.btnEditTags.setText(_translate("mainWindow", "..."))
         item = self.explorerTrackTagsTable.horizontalHeaderItem(0)
         item.setText(_translate("mainWindow", "id"))
         item = self.explorerTrackTagsTable.horizontalHeaderItem(1)

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


+ 3 - 1
ui/qt/widgets/DragDropTableWidget.py

@@ -1,8 +1,10 @@
 from PyQt5.QtCore import Qt, QModelIndex
 from PyQt5.QtWidgets import QTableWidget, QAbstractItemView, QTableWidgetItem, QTableView
 
+from ui.qt.widgets.sqt.SQTableWidget import SQTableWidget
 
-class DragDropTableWidget(QTableWidget):
+
+class DragDropTableWidget(SQTableWidget):
     def __init__(self, *args, **kwargs):
         QTableWidget.__init__(self, *args, **kwargs)
 

+ 3 - 7
ui/qt/widgets/explorertable.py

@@ -5,6 +5,7 @@ from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QTreeWidgetItemIterato
 from core import db
 from core.logging_ import Logger
 from core.repositories import TrackRepository
+from core.utils import norm_search
 
 logger = Logger.get()
 
@@ -90,13 +91,8 @@ class ExplorerTable(QTreeWidget):
             track = TrackRepository().get_by_id(int(track_id))
             self.trackDoubleClicked.emit(track)
 
-    @staticmethod
-    def _norm_search(s):
-        return s.lower().replace("é", "e").replace("è", "e").replace("ê", "e").replace("ë", "e").replace("ç", "c")\
-                .replace("à", "a").replace("ö", "o").replace("ü", "u").replace("'", " ")
-
     def filterBySearchText(self, searchText):
-        searchText = self._norm_search(searchText)
+        searchText = norm_search(searchText)
 
         self.setUpdatesEnabled(False)
 
@@ -121,7 +117,7 @@ class ExplorerTable(QTreeWidget):
                 if grand_parent_item:
                     keys.append(grand_parent_item.text(1))
 
-                s = self._norm_search(" ".join(keys))
+                s = norm_search(" ".join(keys))
                 hide = searchText not in s
 
                 track_item.setHidden(hide)

+ 1 - 1
ui/qt/widgets/playlist_table.py

@@ -80,7 +80,7 @@ class PlaylistTable(DragDropTableWidget):
         return SessionTrackRepository().get_by_id(int(session_track_id))
 
     def set_is_playing(self, track=None):
-        for i in range(self.rowCount()):
+        for i in self.rows():
             track_id = self.item(i, 1).data(0)
 
             if track is not None and track_id == track.id:

+ 12 - 0
ui/qt/widgets/sqt/SQTableWidget.py

@@ -0,0 +1,12 @@
+from PyQt5.QtWidgets import QTableWidget
+
+
+class SQTableWidget(QTableWidget):
+
+    def rows(self):
+        for index in range(self.rowCount()):
+            yield index
+
+    def columns(self):
+        for index in range(self.columnCount()):
+            yield index

+ 18 - 5
ui/qt/widgets/tags_table.py

@@ -1,14 +1,17 @@
 from PyQt5.QtCore import pyqtSignal, Qt
-from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QCheckBox, QTableWidgetSelectionRange, QMessageBox
+from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem, QCheckBox, QTableWidgetSelectionRange, QMessageBox, \
+    QHBoxLayout, QWidget
 
 from core.logging_ import Logger
 from core.models import Tag
 from core.repositories import TagRepository
+from core.utils import norm_search
+from ui.qt.widgets.sqt.SQTableWidget import SQTableWidget
 
 logger = Logger.get()
 
 
-class TagsTable(QTableWidget):
+class TagsTable(SQTableWidget):
     contentChanged = pyqtSignal()
     tagChecked = pyqtSignal(int)
     tagUnchecked = pyqtSignal(int)
@@ -47,12 +50,18 @@ class TagsTable(QTableWidget):
             self.setItem(i, 0, item)
 
             if self.selectable:
+                widget = QWidget()
                 checkBox = QCheckBox()
                 if tag.id in checked:
                     checkBox.setChecked(True)
+                layout = QHBoxLayout(widget)
+                layout.addWidget(checkBox)
+                layout.setAlignment(Qt.AlignCenter)
+                layout.setContentsMargins(0, 0, 0, 0)
+                widget.setLayout(layout)
                 checkBox.tag_id = tag.id
                 checkBox.stateChanged.connect(self.tagStateChanged)
-                self.setCellWidget(i, 1, checkBox)
+                self.setCellWidget(i, 1, widget)
 
             self.setItem(i, 2, QTableWidgetItem(tag.label))
             i += 1
@@ -69,7 +78,7 @@ class TagsTable(QTableWidget):
         self.contentChanged.emit()
 
     def selectTag(self, tag_id):
-        for i in range(self.rowCount()):
+        for i in self.rows():
             item = self.item(i, 0)
             if item.data(0) == tag_id:
                 self.setCurrentItem(item)
@@ -115,10 +124,14 @@ class TagsTable(QTableWidget):
         if not self.selectable:
             raise RuntimeError("TagsTable is not selectable")
         selected = []
-        for i in range(self.rowCount()):
+        for i in self.rows():
             checked = self.cellWidget(i, 1).isChecked()
             if checked:
                 tag_id = self.item(i, 0).data(0)
                 selected.append(tag_id)
         return selected
 
+    def filter(self, search):
+        for i in self.rows():
+            hide = norm_search(search) not in norm_search(self.item(i, 2).text())
+            self.setRowHidden(i, hide)

+ 1 - 2
ui/window.py

@@ -17,7 +17,6 @@ from core.repositories import MusicFolderRepository, TrackRepository, SessionTra
 from ui.qt.dlg_meta_editor import DlgMetaEditor
 from ui.qt.dlg_playlist import DlgPlaylist
 from ui.qt.dlg_select_playlist import DlgSelectPlaylist
-from ui.qt.dlg_tag_editor import DlgTagEditor
 from ui.qt.main_ui import Ui_mainWindow
 from ui.qt.widgets.explorertable import ExplorerTable
 from ui.qt.widgets.playlist_table import PlaylistTable
@@ -79,7 +78,7 @@ class MainWindow(QMainWindow):
 
         self.ui.explorerTrackEdit.clicked.connect(self.showMetaEditor)
 
-        # self.ui.btnEditTags.clicked.connect(self.showTagsEditor)
+        self.ui.lineSearchTags.textChanged.connect(self.ui.explorerTrackTagsTable.filter)
         self.ui.explorerTrackTagsTable.tagChecked.connect(self.addTrackTags)
         self.ui.explorerTrackTagsTable.tagUnchecked.connect(self.removeTrackTags)
 

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