Sfoglia il codice sorgente

update explorertable, add resources

olinox 4 anni fa
parent
commit
f75d8867b8

+ 6 - 6
core/file_utilities.py

@@ -1,16 +1,16 @@
 import hashlib
 import mimetypes
 
-MEDIA_EXTS_CACHE = []
+MEDIA_EXTS_CACHE = ['.mp3', '.wma', '.flac', '.mp4']
 
 
 def media_exts():
     """ List of media file extensions from local system mimetypes """
-    if not MEDIA_EXTS_CACHE:
-        mimetypes.init()
-        for ext in mimetypes.types_map:
-            if mimetypes.types_map[ext].split('/')[0] in ('audio', 'video'):
-                MEDIA_EXTS_CACHE.append(ext)
+    # if not MEDIA_EXTS_CACHE:
+    #     mimetypes.init()
+    #     for ext in mimetypes.types_map:
+    #         if mimetypes.types_map[ext].split('/')[0] in ('audio', 'video'):
+    #             MEDIA_EXTS_CACHE.append(ext)
     return MEDIA_EXTS_CACHE
 
 

+ 1 - 1
core/logging.yaml

@@ -21,7 +21,7 @@ handlers:
         level: DEBUG
         formatter: complete
         filename: debug.log
-        maxBytes: 100000
+        maxBytes: 2000000
         backupCount: 1
         encoding: utf8
 

+ 15 - 2
core/repositories.py

@@ -1,5 +1,3 @@
-from abc import abstractmethod
-
 from core import db
 from core.models import MusicFolder, Track, Tag, TrackTag, SessionTrack, Session
 
@@ -68,6 +66,9 @@ class TagRepository(Repository):
 class TrackRepository(Repository):
     MODEL_CLS = Track
 
+    def get_all(self):
+        return self.query().order_by(Track.artist).order_by(Track.album).order_by(Track.track_num).all()
+
     def get_by_hash(self, hash_):
         return self.query().filter(hash == hash_).first()
 
@@ -89,6 +90,18 @@ class TrackRepository(Repository):
             .filter(SessionTrack.session_id == session_id).\
             all()
 
+    def get_artists(self):
+        return self.session.query(Track).group_by(Track.artist).all()
+
+    def get_albums_by_artist(self, artist):
+        return self.session.query(Track).where(Track.artist == artist).group_by(Track.album).all()
+
+    def get_by_artist_and_album(self, artist, album):
+        return self.session.query(Track)\
+            .where(Track.artist == artist)\
+            .where(Track.album == album)\
+            .group_by(Track.album)\
+            .all()
 
 class SessionRepository(Repository):
     TABLE_NAME = "Sessions"

+ 3 - 0
main.py

@@ -44,6 +44,7 @@ except FileExistsError:
     pass
 
 # Start UI
+logger.info("-- Start --")
 app = QApplication(sys.argv)
 indexer = Indexer()
 indexer.start()
@@ -54,3 +55,5 @@ try:
 finally:
     indexer.stop()
     db.engine.dispose()
+
+logger.info("-- Closed --")

+ 36 - 0
notes

@@ -0,0 +1,36 @@
+
+
+
+
+TODO:
+
+Bugs:
+
+* Voir le pbm avec les mimetypes
+* voir le bug avec is_subdir_of() lorsque c'est une rép réseau
+* gérer pbm de loks à l'indexation, ex:
+      File "E:\dev\mew\core\indexer.py", line 159, in index
+        track_repo.commit()
+      sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 4136 and this is thread id 16548.
+
+
+Priorité 1:
+
+* 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
+* ajouter la frame vlc
+* permettre l'ajoute à des playlists
+* permettre l'ajout de tags
+* faire une modale pour l'édition des metadonnées
+* afficher l'activité de l'indextation dans la barre de statut
+* Permettre la lecture d'un morceau
+* Enregistrer les notes pour un morceau et s'assurer qu'elles ne soient pas perdues
+* Permettre d'enregistrer des playlists, de les ordonner, et de les attacher à une date
+
+Priorité 2:
+
+* Optimiser la rapidité de l'indexation (insertions de masse, optim du hashage, ne pas update les metadata si déjà renseignées...)
+* Ajouter le module de téléchargement depuis youtube
+* Permettre de prioriser l'indexation selon certaines actions (sélection d'un artiste, téléchargement, nouveaux morceaux)
+* Charger l'explorer de manière asynchrone

+ 278 - 37
ui/qt/main.ui

@@ -27,7 +27,7 @@
   </property>
   <property name="windowIcon">
    <iconset resource="rsc.qrc">
-    <normaloff>:/img/rsc/dancing.png</normaloff>:/img/rsc/dancing.png</iconset>
+    <normaloff>:/img/rsc/constellations.svg</normaloff>:/img/rsc/constellations.svg</iconset>
   </property>
   <widget class="QWidget" name="centralwidget">
    <layout class="QVBoxLayout" name="verticalLayout">
@@ -96,18 +96,93 @@
         <item>
          <widget class="QStackedWidget" name="stack">
           <property name="currentIndex">
-           <number>2</number>
+           <number>0</number>
           </property>
           <widget class="QWidget" name="page_1">
            <layout class="QHBoxLayout" name="horizontalLayout_2">
             <item>
              <layout class="QVBoxLayout" name="verticalLayout_3">
+              <property name="topMargin">
+               <number>0</number>
+              </property>
               <item>
-               <widget class="QLabel" name="label_2">
-                <property name="text">
-                 <string>Page 1</string>
+               <layout class="QHBoxLayout" name="horizontalLayout_15">
+                <property name="topMargin">
+                 <number>0</number>
                 </property>
-               </widget>
+                <item>
+                 <widget class="QLabel" name="sessionLblTitle">
+                  <property name="text">
+                   <string>Ma séance</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QLabel" name="sessionLblDate">
+                  <property name="text">
+                   <string>dd/mm/yyyy</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QToolButton" name="sessionBtnChange">
+                  <property name="minimumSize">
+                   <size>
+                    <width>28</width>
+                    <height>28</height>
+                   </size>
+                  </property>
+                  <property name="text">
+                   <string/>
+                  </property>
+                  <property name="icon">
+                   <iconset resource="rsc.qrc">
+                    <normaloff>:/img/rsc/swap.png</normaloff>:/img/rsc/swap.png</iconset>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_14">
+                <item>
+                 <widget class="QTableWidget" name="sessionPlaylist">
+                  <property name="editTriggers">
+                   <set>QAbstractItemView::NoEditTriggers</set>
+                  </property>
+                  <property name="selectionMode">
+                   <enum>QAbstractItemView::SingleSelection</enum>
+                  </property>
+                  <property name="selectionBehavior">
+                   <enum>QAbstractItemView::SelectRows</enum>
+                  </property>
+                  <attribute name="horizontalHeaderStretchLastSection">
+                   <bool>true</bool>
+                  </attribute>
+                  <attribute name="verticalHeaderVisible">
+                   <bool>false</bool>
+                  </attribute>
+                  <column>
+                   <property name="text">
+                    <string>id</string>
+                   </property>
+                  </column>
+                  <column>
+                   <property name="text">
+                    <string>Ordre</string>
+                   </property>
+                  </column>
+                  <column>
+                   <property name="text">
+                    <string>Titre</string>
+                   </property>
+                  </column>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QTextBrowser" name="sessionNotes"/>
+                </item>
+               </layout>
               </item>
              </layout>
             </item>
@@ -116,15 +191,7 @@
           <widget class="QWidget" name="page_2">
            <layout class="QHBoxLayout" name="horizontalLayout_3">
             <item>
-             <layout class="QVBoxLayout" name="verticalLayout_4">
-              <item>
-               <widget class="QLabel" name="label_3">
-                <property name="text">
-                 <string>Page 2</string>
-                </property>
-               </widget>
-              </item>
-             </layout>
+             <layout class="QVBoxLayout" name="verticalLayout_4"/>
             </item>
            </layout>
           </widget>
@@ -150,7 +217,7 @@
                  <number>0</number>
                 </property>
                 <item>
-                 <widget class="QTreeView" name="explorerTree">
+                 <widget class="ExplorerTable" name="explorerTable">
                   <property name="minimumSize">
                    <size>
                     <width>383</width>
@@ -160,19 +227,37 @@
                   <property name="editTriggers">
                    <set>QAbstractItemView::NoEditTriggers</set>
                   </property>
+                  <attribute name="headerVisible">
+                   <bool>false</bool>
+                  </attribute>
+                  <column>
+                   <property name="text">
+                    <string notr="true">1</string>
+                   </property>
+                  </column>
                  </widget>
                 </item>
                 <item>
                  <widget class="QPushButton" name="btnExplorerRefresh">
+                  <property name="minimumSize">
+                   <size>
+                    <width>0</width>
+                    <height>28</height>
+                   </size>
+                  </property>
                   <property name="text">
                    <string>Rafraichir</string>
                   </property>
+                  <property name="icon">
+                   <iconset resource="rsc.qrc">
+                    <normaloff>:/img/rsc/refresh-page-option.png</normaloff>:/img/rsc/refresh-page-option.png</iconset>
+                  </property>
                  </widget>
                 </item>
                </layout>
               </item>
               <item>
-               <layout class="QVBoxLayout" name="verticalLayout_5" stretch="1,1">
+               <layout class="QVBoxLayout" name="verticalLayout_5" stretch="1,0,1,0,0,0">
                 <property name="leftMargin">
                  <number>10</number>
                 </property>
@@ -187,6 +272,12 @@
                 </property>
                 <item>
                  <widget class="QFrame" name="explorerTrackMetaFrame">
+                  <property name="maximumSize">
+                   <size>
+                    <width>16777215</width>
+                    <height>100</height>
+                   </size>
+                  </property>
                   <property name="frameShape">
                    <enum>QFrame::StyledPanel</enum>
                   </property>
@@ -194,15 +285,76 @@
                    <enum>QFrame::Raised</enum>
                   </property>
                   <layout class="QVBoxLayout" name="verticalLayout_10">
+                   <property name="spacing">
+                    <number>0</number>
+                   </property>
+                   <property name="leftMargin">
+                    <number>0</number>
+                   </property>
+                   <property name="topMargin">
+                    <number>0</number>
+                   </property>
+                   <property name="rightMargin">
+                    <number>0</number>
+                   </property>
+                   <property name="bottomMargin">
+                    <number>0</number>
+                   </property>
                    <item>
                     <layout class="QVBoxLayout" name="verticalLayout_9">
+                     <property name="spacing">
+                      <number>0</number>
+                     </property>
+                     <property name="sizeConstraint">
+                      <enum>QLayout::SetMinimumSize</enum>
+                     </property>
                      <property name="bottomMargin">
-                      <number>20</number>
+                      <number>0</number>
                      </property>
+                     <item>
+                      <layout class="QHBoxLayout" name="horizontalLayout_13">
+                       <item>
+                        <widget class="QLabel" name="label_11">
+                         <property name="text">
+                          <string>Informations sur la piste:</string>
+                         </property>
+                        </widget>
+                       </item>
+                       <item>
+                        <widget class="QToolButton" name="toolButton_3">
+                         <property name="minimumSize">
+                          <size>
+                           <width>28</width>
+                           <height>28</height>
+                          </size>
+                         </property>
+                         <property name="text">
+                          <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>
                       <layout class="QHBoxLayout" name="horizontalLayout_8">
+                       <property name="spacing">
+                        <number>0</number>
+                       </property>
+                       <property name="sizeConstraint">
+                        <enum>QLayout::SetMinimumSize</enum>
+                       </property>
                        <item>
                         <widget class="QLabel" name="label_4">
+                         <property name="maximumSize">
+                          <size>
+                           <width>80</width>
+                           <height>16777215</height>
+                          </size>
+                         </property>
                          <property name="text">
                           <string>Titre</string>
                          </property>
@@ -221,6 +373,12 @@
                       <layout class="QHBoxLayout" name="horizontalLayout_9">
                        <item>
                         <widget class="QLabel" name="label_6">
+                         <property name="maximumSize">
+                          <size>
+                           <width>80</width>
+                           <height>16777215</height>
+                          </size>
+                         </property>
                          <property name="text">
                           <string>Artiste</string>
                          </property>
@@ -239,6 +397,12 @@
                       <layout class="QHBoxLayout" name="horizontalLayout_10">
                        <item>
                         <widget class="QLabel" name="label_7">
+                         <property name="maximumSize">
+                          <size>
+                           <width>80</width>
+                           <height>16777215</height>
+                          </size>
+                         </property>
                          <property name="text">
                           <string>Album</string>
                          </property>
@@ -257,6 +421,12 @@
                       <layout class="QHBoxLayout" name="horizontalLayout_11">
                        <item>
                         <widget class="QLabel" name="label_8">
+                         <property name="maximumSize">
+                          <size>
+                           <width>80</width>
+                           <height>16777215</height>
+                          </size>
+                         </property>
                          <property name="text">
                           <string>N°</string>
                          </property>
@@ -271,32 +441,82 @@
                        </item>
                       </layout>
                      </item>
-                     <item>
-                      <layout class="QHBoxLayout" name="horizontalLayout_12">
-                       <item>
-                        <widget class="QLabel" name="label_9">
-                         <property name="text">
-                          <string>Emplacement</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QLabel" name="lblTrackPath">
-                         <property name="text">
-                          <string/>
-                         </property>
-                        </widget>
-                       </item>
-                      </layout>
-                     </item>
                     </layout>
                    </item>
                   </layout>
                  </widget>
                 </item>
+                <item>
+                 <widget class="QLabel" name="label_10">
+                  <property name="text">
+                   <string>Notes</string>
+                  </property>
+                 </widget>
+                </item>
                 <item>
                  <widget class="QTextBrowser" name="explorerTrackNotepad"/>
                 </item>
+                <item>
+                 <widget class="QLabel" name="label_9">
+                  <property name="text">
+                   <string>Liste de lecture</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <layout class="QHBoxLayout" name="horizontalLayout_12">
+                  <property name="bottomMargin">
+                   <number>0</number>
+                  </property>
+                  <item>
+                   <widget class="QToolButton" name="explorerAddToPlaylist">
+                    <property name="minimumSize">
+                     <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/plus.png</normaloff>:/img/rsc/plus.png</iconset>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QToolButton" name="explorerRemoveFromPlaylist">
+                    <property name="minimumSize">
+                     <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/delete.png</normaloff>:/img/rsc/delete.png</iconset>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QComboBox" name="explorerSelectPlaylist">
+                    <property name="minimumSize">
+                     <size>
+                      <width>0</width>
+                      <height>28</height>
+                     </size>
+                    </property>
+                   </widget>
+                  </item>
+                 </layout>
+                </item>
+                <item>
+                 <widget class="QTableWidget" name="explorerPlaylist"/>
+                </item>
                </layout>
               </item>
              </layout>
@@ -415,6 +635,10 @@
                   <property name="text">
                    <string>Supprimer</string>
                   </property>
+                  <property name="icon">
+                   <iconset resource="rsc.qrc">
+                    <normaloff>:/img/rsc/delete.png</normaloff>:/img/rsc/delete.png</iconset>
+                  </property>
                  </widget>
                 </item>
                 <item>
@@ -441,6 +665,10 @@
                   <property name="text">
                    <string>Ajouter</string>
                   </property>
+                  <property name="icon">
+                   <iconset resource="rsc.qrc">
+                    <normaloff>:/img/rsc/plus.png</normaloff>:/img/rsc/plus.png</iconset>
+                  </property>
                  </widget>
                 </item>
                </layout>
@@ -475,7 +703,13 @@
          <widget class="QFrame" name="vlcFrame">
           <property name="minimumSize">
            <size>
-            <width>0</width>
+            <width>500</width>
+            <height>100</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>16777215</width>
             <height>100</height>
            </size>
           </property>
@@ -495,6 +729,13 @@
   </widget>
   <widget class="QStatusBar" name="statusbar"/>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ExplorerTable</class>
+   <extends>QTreeWidget</extends>
+   <header location="global">.widgets.explorertable.h</header>
+  </customwidget>
+ </customwidgets>
  <resources>
   <include location="rsc.qrc"/>
  </resources>

+ 132 - 29
ui/qt/main_ui.py

@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'main.ui'
 #
-# Created by: PyQt5 UI code generator 5.15.2
+# 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.
@@ -56,10 +56,48 @@ class Ui_mainWindow(object):
         self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.page_1)
         self.horizontalLayout_2.setObjectName("horizontalLayout_2")
         self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setContentsMargins(-1, 0, -1, -1)
         self.verticalLayout_3.setObjectName("verticalLayout_3")
-        self.label_2 = QtWidgets.QLabel(self.page_1)
-        self.label_2.setObjectName("label_2")
-        self.verticalLayout_3.addWidget(self.label_2)
+        self.horizontalLayout_15 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_15.setContentsMargins(-1, 0, -1, -1)
+        self.horizontalLayout_15.setObjectName("horizontalLayout_15")
+        self.sessionLblTitle = QtWidgets.QLabel(self.page_1)
+        self.sessionLblTitle.setObjectName("sessionLblTitle")
+        self.horizontalLayout_15.addWidget(self.sessionLblTitle)
+        self.sessionLblDate = QtWidgets.QLabel(self.page_1)
+        self.sessionLblDate.setObjectName("sessionLblDate")
+        self.horizontalLayout_15.addWidget(self.sessionLblDate)
+        self.sessionBtnChange = QtWidgets.QToolButton(self.page_1)
+        self.sessionBtnChange.setMinimumSize(QtCore.QSize(28, 28))
+        self.sessionBtnChange.setText("")
+        icon1 = QtGui.QIcon()
+        icon1.addPixmap(QtGui.QPixmap(":/img/rsc/swap.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.sessionBtnChange.setIcon(icon1)
+        self.sessionBtnChange.setObjectName("sessionBtnChange")
+        self.horizontalLayout_15.addWidget(self.sessionBtnChange)
+        self.verticalLayout_3.addLayout(self.horizontalLayout_15)
+        self.horizontalLayout_14 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_14.setObjectName("horizontalLayout_14")
+        self.sessionPlaylist = QtWidgets.QTableWidget(self.page_1)
+        self.sessionPlaylist.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.sessionPlaylist.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
+        self.sessionPlaylist.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
+        self.sessionPlaylist.setObjectName("sessionPlaylist")
+        self.sessionPlaylist.setColumnCount(3)
+        self.sessionPlaylist.setRowCount(0)
+        item = QtWidgets.QTableWidgetItem()
+        self.sessionPlaylist.setHorizontalHeaderItem(0, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.sessionPlaylist.setHorizontalHeaderItem(1, item)
+        item = QtWidgets.QTableWidgetItem()
+        self.sessionPlaylist.setHorizontalHeaderItem(2, item)
+        self.sessionPlaylist.horizontalHeader().setStretchLastSection(True)
+        self.sessionPlaylist.verticalHeader().setVisible(False)
+        self.horizontalLayout_14.addWidget(self.sessionPlaylist)
+        self.sessionNotes = QtWidgets.QTextBrowser(self.page_1)
+        self.sessionNotes.setObjectName("sessionNotes")
+        self.horizontalLayout_14.addWidget(self.sessionNotes)
+        self.verticalLayout_3.addLayout(self.horizontalLayout_14)
         self.horizontalLayout_2.addLayout(self.verticalLayout_3)
         self.stack.addWidget(self.page_1)
         self.page_2 = QtWidgets.QWidget()
@@ -68,9 +106,6 @@ class Ui_mainWindow(object):
         self.horizontalLayout_3.setObjectName("horizontalLayout_3")
         self.verticalLayout_4 = QtWidgets.QVBoxLayout()
         self.verticalLayout_4.setObjectName("verticalLayout_4")
-        self.label_3 = QtWidgets.QLabel(self.page_2)
-        self.label_3.setObjectName("label_3")
-        self.verticalLayout_4.addWidget(self.label_3)
         self.horizontalLayout_3.addLayout(self.verticalLayout_4)
         self.stack.addWidget(self.page_2)
         self.page_3 = QtWidgets.QWidget()
@@ -83,12 +118,18 @@ class Ui_mainWindow(object):
         self.verticalLayout_8 = QtWidgets.QVBoxLayout()
         self.verticalLayout_8.setContentsMargins(-1, -1, -1, 0)
         self.verticalLayout_8.setObjectName("verticalLayout_8")
-        self.explorerTree = QtWidgets.QTreeView(self.page_3)
-        self.explorerTree.setMinimumSize(QtCore.QSize(383, 0))
-        self.explorerTree.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
-        self.explorerTree.setObjectName("explorerTree")
-        self.verticalLayout_8.addWidget(self.explorerTree)
+        self.explorerTable = ExplorerTable(self.page_3)
+        self.explorerTable.setMinimumSize(QtCore.QSize(383, 0))
+        self.explorerTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.explorerTable.setObjectName("explorerTable")
+        self.explorerTable.headerItem().setText(0, "1")
+        self.explorerTable.header().setVisible(False)
+        self.verticalLayout_8.addWidget(self.explorerTable)
         self.btnExplorerRefresh = QtWidgets.QPushButton(self.page_3)
+        self.btnExplorerRefresh.setMinimumSize(QtCore.QSize(0, 28))
+        icon2 = QtGui.QIcon()
+        icon2.addPixmap(QtGui.QPixmap(":/img/rsc/refresh-page-option.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnExplorerRefresh.setIcon(icon2)
         self.btnExplorerRefresh.setObjectName("btnExplorerRefresh")
         self.verticalLayout_8.addWidget(self.btnExplorerRefresh)
         self.horizontalLayout_6.addLayout(self.verticalLayout_8)
@@ -96,17 +137,39 @@ class Ui_mainWindow(object):
         self.verticalLayout_5.setContentsMargins(10, 10, 10, 10)
         self.verticalLayout_5.setObjectName("verticalLayout_5")
         self.explorerTrackMetaFrame = QtWidgets.QFrame(self.page_3)
+        self.explorerTrackMetaFrame.setMaximumSize(QtCore.QSize(16777215, 100))
         self.explorerTrackMetaFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
         self.explorerTrackMetaFrame.setFrameShadow(QtWidgets.QFrame.Raised)
         self.explorerTrackMetaFrame.setObjectName("explorerTrackMetaFrame")
         self.verticalLayout_10 = QtWidgets.QVBoxLayout(self.explorerTrackMetaFrame)
+        self.verticalLayout_10.setContentsMargins(0, 0, 0, 0)
+        self.verticalLayout_10.setSpacing(0)
         self.verticalLayout_10.setObjectName("verticalLayout_10")
         self.verticalLayout_9 = QtWidgets.QVBoxLayout()
-        self.verticalLayout_9.setContentsMargins(-1, -1, -1, 20)
+        self.verticalLayout_9.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
+        self.verticalLayout_9.setContentsMargins(-1, -1, -1, 0)
+        self.verticalLayout_9.setSpacing(0)
         self.verticalLayout_9.setObjectName("verticalLayout_9")
+        self.horizontalLayout_13 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_13.setObjectName("horizontalLayout_13")
+        self.label_11 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_11.setObjectName("label_11")
+        self.horizontalLayout_13.addWidget(self.label_11)
+        self.toolButton_3 = QtWidgets.QToolButton(self.explorerTrackMetaFrame)
+        self.toolButton_3.setMinimumSize(QtCore.QSize(28, 28))
+        self.toolButton_3.setText("")
+        icon3 = QtGui.QIcon()
+        icon3.addPixmap(QtGui.QPixmap(":/img/rsc/edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.toolButton_3.setIcon(icon3)
+        self.toolButton_3.setObjectName("toolButton_3")
+        self.horizontalLayout_13.addWidget(self.toolButton_3)
+        self.verticalLayout_9.addLayout(self.horizontalLayout_13)
         self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_8.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
+        self.horizontalLayout_8.setSpacing(0)
         self.horizontalLayout_8.setObjectName("horizontalLayout_8")
         self.label_4 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_4.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_4.setObjectName("label_4")
         self.horizontalLayout_8.addWidget(self.label_4)
         self.lblTrackTitle = QtWidgets.QLabel(self.explorerTrackMetaFrame)
@@ -117,6 +180,7 @@ class Ui_mainWindow(object):
         self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_9.setObjectName("horizontalLayout_9")
         self.label_6 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_6.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_6.setObjectName("label_6")
         self.horizontalLayout_9.addWidget(self.label_6)
         self.lblTrackArtist = QtWidgets.QLabel(self.explorerTrackMetaFrame)
@@ -127,6 +191,7 @@ class Ui_mainWindow(object):
         self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_10.setObjectName("horizontalLayout_10")
         self.label_7 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_7.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_7.setObjectName("label_7")
         self.horizontalLayout_10.addWidget(self.label_7)
         self.lblTrackAlbum = QtWidgets.QLabel(self.explorerTrackMetaFrame)
@@ -137,6 +202,7 @@ class Ui_mainWindow(object):
         self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_11.setObjectName("horizontalLayout_11")
         self.label_8 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_8.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_8.setObjectName("label_8")
         self.horizontalLayout_11.addWidget(self.label_8)
         self.lblTrackNumber = QtWidgets.QLabel(self.explorerTrackMetaFrame)
@@ -144,23 +210,46 @@ class Ui_mainWindow(object):
         self.lblTrackNumber.setObjectName("lblTrackNumber")
         self.horizontalLayout_11.addWidget(self.lblTrackNumber)
         self.verticalLayout_9.addLayout(self.horizontalLayout_11)
-        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
-        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
-        self.label_9 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
-        self.label_9.setObjectName("label_9")
-        self.horizontalLayout_12.addWidget(self.label_9)
-        self.lblTrackPath = QtWidgets.QLabel(self.explorerTrackMetaFrame)
-        self.lblTrackPath.setText("")
-        self.lblTrackPath.setObjectName("lblTrackPath")
-        self.horizontalLayout_12.addWidget(self.lblTrackPath)
-        self.verticalLayout_9.addLayout(self.horizontalLayout_12)
         self.verticalLayout_10.addLayout(self.verticalLayout_9)
         self.verticalLayout_5.addWidget(self.explorerTrackMetaFrame)
+        self.label_10 = QtWidgets.QLabel(self.page_3)
+        self.label_10.setObjectName("label_10")
+        self.verticalLayout_5.addWidget(self.label_10)
         self.explorerTrackNotepad = QtWidgets.QTextBrowser(self.page_3)
         self.explorerTrackNotepad.setObjectName("explorerTrackNotepad")
         self.verticalLayout_5.addWidget(self.explorerTrackNotepad)
+        self.label_9 = QtWidgets.QLabel(self.page_3)
+        self.label_9.setObjectName("label_9")
+        self.verticalLayout_5.addWidget(self.label_9)
+        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_12.setContentsMargins(-1, -1, -1, 0)
+        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
+        self.explorerAddToPlaylist = QtWidgets.QToolButton(self.page_3)
+        self.explorerAddToPlaylist.setMinimumSize(QtCore.QSize(28, 28))
+        icon4 = QtGui.QIcon()
+        icon4.addPixmap(QtGui.QPixmap(":/img/rsc/plus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerAddToPlaylist.setIcon(icon4)
+        self.explorerAddToPlaylist.setObjectName("explorerAddToPlaylist")
+        self.horizontalLayout_12.addWidget(self.explorerAddToPlaylist)
+        self.explorerRemoveFromPlaylist = QtWidgets.QToolButton(self.page_3)
+        self.explorerRemoveFromPlaylist.setMinimumSize(QtCore.QSize(28, 28))
+        icon5 = QtGui.QIcon()
+        icon5.addPixmap(QtGui.QPixmap(":/img/rsc/delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerRemoveFromPlaylist.setIcon(icon5)
+        self.explorerRemoveFromPlaylist.setObjectName("explorerRemoveFromPlaylist")
+        self.horizontalLayout_12.addWidget(self.explorerRemoveFromPlaylist)
+        self.explorerSelectPlaylist = QtWidgets.QComboBox(self.page_3)
+        self.explorerSelectPlaylist.setMinimumSize(QtCore.QSize(0, 28))
+        self.explorerSelectPlaylist.setObjectName("explorerSelectPlaylist")
+        self.horizontalLayout_12.addWidget(self.explorerSelectPlaylist)
+        self.verticalLayout_5.addLayout(self.horizontalLayout_12)
+        self.explorerPlaylist = QtWidgets.QTableWidget(self.page_3)
+        self.explorerPlaylist.setObjectName("explorerPlaylist")
+        self.explorerPlaylist.setColumnCount(0)
+        self.explorerPlaylist.setRowCount(0)
+        self.verticalLayout_5.addWidget(self.explorerPlaylist)
         self.verticalLayout_5.setStretch(0, 1)
-        self.verticalLayout_5.setStretch(1, 1)
+        self.verticalLayout_5.setStretch(2, 1)
         self.horizontalLayout_6.addLayout(self.verticalLayout_5)
         self.horizontalLayout_4.addLayout(self.horizontalLayout_6)
         self.stack.addWidget(self.page_3)
@@ -213,12 +302,14 @@ class Ui_mainWindow(object):
         self.horizontalLayout_7.setObjectName("horizontalLayout_7")
         self.musicFoldersRemoveButton = QtWidgets.QPushButton(self.page_5)
         self.musicFoldersRemoveButton.setMinimumSize(QtCore.QSize(0, 32))
+        self.musicFoldersRemoveButton.setIcon(icon5)
         self.musicFoldersRemoveButton.setObjectName("musicFoldersRemoveButton")
         self.horizontalLayout_7.addWidget(self.musicFoldersRemoveButton)
         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.horizontalLayout_7.addItem(spacerItem)
         self.musicFoldersAddButton = QtWidgets.QPushButton(self.page_5)
         self.musicFoldersAddButton.setMinimumSize(QtCore.QSize(128, 32))
+        self.musicFoldersAddButton.setIcon(icon4)
         self.musicFoldersAddButton.setObjectName("musicFoldersAddButton")
         self.horizontalLayout_7.addWidget(self.musicFoldersAddButton)
         self.verticalLayout_6.addLayout(self.horizontalLayout_7)
@@ -233,7 +324,8 @@ class Ui_mainWindow(object):
         self.stack.addWidget(self.page_5)
         self.verticalLayout_7.addWidget(self.stack)
         self.vlcFrame = QtWidgets.QFrame(self.centralwidget)
-        self.vlcFrame.setMinimumSize(QtCore.QSize(0, 100))
+        self.vlcFrame.setMinimumSize(QtCore.QSize(500, 100))
+        self.vlcFrame.setMaximumSize(QtCore.QSize(16777215, 100))
         self.vlcFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
         self.vlcFrame.setFrameShadow(QtWidgets.QFrame.Raised)
         self.vlcFrame.setObjectName("vlcFrame")
@@ -249,20 +341,30 @@ class Ui_mainWindow(object):
 
         self.retranslateUi(mainWindow)
         self.menu.setCurrentRow(-1)
-        self.stack.setCurrentIndex(2)
+        self.stack.setCurrentIndex(0)
         QtCore.QMetaObject.connectSlotsByName(mainWindow)
 
     def retranslateUi(self, mainWindow):
         _translate = QtCore.QCoreApplication.translate
         mainWindow.setWindowTitle(_translate("mainWindow", "Mew~"))
-        self.label_2.setText(_translate("mainWindow", "Page 1"))
-        self.label_3.setText(_translate("mainWindow", "Page 2"))
+        self.sessionLblTitle.setText(_translate("mainWindow", "Ma séance"))
+        self.sessionLblDate.setText(_translate("mainWindow", "dd/mm/yyyy"))
+        item = self.sessionPlaylist.horizontalHeaderItem(0)
+        item.setText(_translate("mainWindow", "id"))
+        item = self.sessionPlaylist.horizontalHeaderItem(1)
+        item.setText(_translate("mainWindow", "Ordre"))
+        item = self.sessionPlaylist.horizontalHeaderItem(2)
+        item.setText(_translate("mainWindow", "Titre"))
         self.btnExplorerRefresh.setText(_translate("mainWindow", "Rafraichir"))
+        self.label_11.setText(_translate("mainWindow", "Informations sur la piste:"))
         self.label_4.setText(_translate("mainWindow", "Titre"))
         self.label_6.setText(_translate("mainWindow", "Artiste"))
         self.label_7.setText(_translate("mainWindow", "Album"))
         self.label_8.setText(_translate("mainWindow", "N°"))
-        self.label_9.setText(_translate("mainWindow", "Emplacement"))
+        self.label_10.setText(_translate("mainWindow", "Notes"))
+        self.label_9.setText(_translate("mainWindow", "Liste de lecture"))
+        self.explorerAddToPlaylist.setText(_translate("mainWindow", "+"))
+        self.explorerRemoveFromPlaylist.setText(_translate("mainWindow", "-"))
         self.label.setText(_translate("mainWindow", "Page 4"))
         self.label_5.setText(_translate("mainWindow", "Mes dossiers de musique"))
         item = self.musicFoldersTable.horizontalHeaderItem(0)
@@ -273,4 +375,5 @@ class Ui_mainWindow(object):
         item.setText(_translate("mainWindow", "Emplacement"))
         self.musicFoldersRemoveButton.setText(_translate("mainWindow", "Supprimer"))
         self.musicFoldersAddButton.setText(_translate("mainWindow", "Ajouter"))
+from .widgets.explorertable import ExplorerTable
 from . import rsc_rc

+ 19 - 1
ui/qt/rsc.qrc

@@ -1,9 +1,27 @@
 <RCC>
     <qresource prefix="/img">
         <file>rsc/calendar.png</file>
-        <file>rsc/dancing.png</file>
         <file>rsc/map.png</file>
         <file>rsc/settings.png</file>
         <file>rsc/writing-tool.png</file>
+        <file>rsc/dance.png</file>
+        <file>rsc/delete.png</file>
+        <file>rsc/email.png</file>
+        <file>rsc/folder.png</file>
+        <file>rsc/hourglass.png</file>
+        <file>rsc/man-user.png</file>
+        <file>rsc/music-album.png</file>
+        <file>rsc/music-note.png</file>
+        <file>rsc/next.png</file>
+        <file>rsc/pdf.png</file>
+        <file>rsc/plus.png</file>
+        <file>rsc/previous.png</file>
+        <file>rsc/question.png</file>
+        <file>rsc/refresh-page-option.png</file>
+        <file>rsc/remove.png</file>
+        <file>rsc/save.png</file>
+        <file>rsc/edit.png</file>
+        <file>rsc/swap.png</file>
+        <file>rsc/constellations.svg</file>
     </qresource>
 </RCC>

File diff suppressed because it is too large
+ 0 - 0
ui/qt/rsc/constellations.svg


BIN
ui/qt/rsc/dance.png


BIN
ui/qt/rsc/dancing.png


BIN
ui/qt/rsc/delete.png


BIN
ui/qt/rsc/edit.png


BIN
ui/qt/rsc/man-user.png


BIN
ui/qt/rsc/music-album.png


BIN
ui/qt/rsc/music-note.png


BIN
ui/qt/rsc/next.png


BIN
ui/qt/rsc/plus.png


BIN
ui/qt/rsc/previous.png


BIN
ui/qt/rsc/refresh-page-option.png


BIN
ui/qt/rsc/remove.png


BIN
ui/qt/rsc/swap.png


File diff suppressed because it is too large
+ 605 - 780
ui/qt/rsc_rc.py


+ 34 - 0
ui/qt/widgets/explorertable.py

@@ -0,0 +1,34 @@
+from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem
+
+from core.repositories import TrackRepository
+
+
+class ExplorerTable(QTreeWidget):
+    def __init__(self, parent):
+        super(QTreeWidget, self).__init__(parent)
+
+    def populate(self):
+        track_repo = TrackRepository()
+
+        artist_folders = {}
+        album_folders = {}
+        tracks = track_repo.get_all()
+
+        for track in tracks:
+            if track.artist and track.artist not in artist_folders:
+                item = QTreeWidgetItem(self, [track.artist])
+                artist_folders[track.artist] = item
+
+            if track.artist and track.album and (track.artist, track.album) not in album_folders:
+                item = QTreeWidgetItem(artist_folders[track.artist], [track.album])
+                album_folders[(track.artist, track.album)] = item
+
+            if track.artist and track.album:
+                parent = album_folders[(track.artist, track.album)]
+            elif track.artist:
+                parent = artist_folders[track.artist]
+            else:
+                parent = self
+
+            item = QTreeWidgetItem(parent, [track.title])
+

+ 9 - 57
ui/window.py

@@ -58,30 +58,8 @@ class MainWindow(QMainWindow):
         self.ui.menu.itemClicked.connect(self.menu_item_selected)
 
         # Page 3 - explorer
+        self.ui.explorerTable.populate()
         self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree)
-        # self.refresh_explorer_tree()
-
-        self.track_model = QSqlQueryModel(self)
-        self.track_model.setQuery(
-            """
-            SELECT id, artist, album, title, status 
-            FROM Tracks 
-            ORDER BY artist, album, track_num;"""
-        )
-        self.track_model.setHeaderData(0, Qt.Horizontal, "id")
-        self.track_model.setHeaderData(1, Qt.Horizontal, "Artiste")
-        self.track_model.setHeaderData(2, Qt.Horizontal, "Album")
-        self.track_model.setHeaderData(3, Qt.Horizontal, "Titre")
-        self.track_model.setHeaderData(4, Qt.Horizontal, "Statut")
-        self.track_model.query()
-
-        self.ui.explorerTree.setModel(self.track_model)
-
-        self.ui.explorerTree.hideColumn(0)
-        self.ui.explorerTree.setRootIsDecorated(False)
-        self.ui.explorerTree.setAlternatingRowColors(True)
-
-        self.ui.explorerTree.selectionModel().selectionChanged.connect(self.explorer_tree_selection_changed)
 
         # Page 5 - settings
         self.ui.musicFoldersTable.setColumnHidden(0, 1)
@@ -101,32 +79,6 @@ class MainWindow(QMainWindow):
     def refresh_explorer_tree(self):
         self.track_model.query()
 
-        # track_repo = TrackRepository()
-        #
-        # artist_folders = {}
-        # album_folders = {}
-        # tracks = track_repo.get_all()
-        #
-        # for track in tracks:
-        #     if track.artist and track.artist not in artist_folders:
-        #         item = QTreeWidgetItem(self.ui.explorerTree, [track.artist])
-        #         artist_folders[track.artist] = item
-        #
-        # for track in tracks:
-        #     if track.artist and track.album and (track.artist, track.album) not in album_folders:
-        #         item = QTreeWidgetItem(artist_folders[track.artist], [track.album])
-        #         album_folders[(track.artist, track.album)] = item
-        #
-        # for track in tracks:
-        #     if track.artist and track.album:
-        #         parent = album_folders[(track.artist, track.album)]
-        #     elif track.artist:
-        #         parent = artist_folders[track.artist]
-        #     else:
-        #         parent = self.ui.explorerTree
-        #
-        #     item = QTreeWidgetItem(parent, [track.title])
-
     def explorer_tree_selection_changed(self, model_index):
         track_id = model_index.indexes()[0].data(0)
         track = TrackRepository().get_by_id(int(track_id))
@@ -164,14 +116,14 @@ class MainWindow(QMainWindow):
 
         music_folders = repo.get_all()
 
-        for folder in music_folders:
-            if path == Path(folder.path):
-                QMessageBox.warning(self, "Ajout invalide",  "Ce dossier a déjà été ajouté")
-                return
-
-            if is_subdir_of(path, Path(folder.path)):
-                QMessageBox.warning(self, "Ajout invalide",  "Ce dossier est contenu dans un dossier existant")
-                return
+        # for folder in music_folders:
+        #     if path == Path(folder.path):
+        #         QMessageBox.warning(self, "Ajout invalide",  "Ce dossier a déjà été ajouté")
+        #         return
+        #
+        #     if is_subdir_of(path, Path(folder.path)):
+        #         QMessageBox.warning(self, "Ajout invalide",  "Ce dossier est contenu dans un dossier existant")
+        #         return
 
         folder = MusicFolder(path=path)
         repo.create(folder, True)

Some files were not shown because too many files changed in this diff