Browse Source

update UI

Olivier Massot 4 years ago
parent
commit
0734aca8be

+ 2 - 2
core/models.py

@@ -68,8 +68,8 @@ class TrackTag(Model):
 class Session(Model):
     __tablename__ = 'Sessions'
 
-    name = Column(String, nullable=False)
-    date = Column(DateTime)
+    name = Column(String, nullable=False, default="Ma session")
+    date = Column(DateTime, default=datetime.now())
     notes = Column(String)
 
 

+ 3 - 0
core/repositories.py

@@ -111,6 +111,9 @@ class SessionRepository(Repository):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
+    def get_all(self):
+        return self.query().order_by(Session.date.desc()).order_by(Session.created_on.desc()).all()
+
     def get_by_track_id(self, track_id):
         return self.session.query(Session)\
             .join(SessionTrack, Track.id == SessionTrack.track_id)\

+ 50 - 0
ui/qt/dlg_playlist.py

@@ -0,0 +1,50 @@
+from datetime import datetime
+
+from PyQt5 import QtWidgets
+
+from core.models import Session
+from core.repositories import SessionRepository
+from ui.qt.dlg_playlist_ui import Ui_dlgPlaylist
+
+
+class DlgPlaylist(QtWidgets.QDialog):
+    def __init__(self, playlist=None, parent=None):
+        super().__init__(parent)
+
+        self.playlist = playlist if playlist is not None else Session()
+        self.createWidgets()
+
+    def createWidgets(self):
+        self.ui = Ui_dlgPlaylist()
+        self.ui.setupUi(self)
+
+        self.ui.lineName.setText(self.playlist.name)
+        if self.playlist.date:
+            self.ui.lineDate.setDateTime(self.playlist.date)
+        self.ui.textNotes.setText(self.playlist.notes or "")
+
+        self.ui.btnSave.clicked.connect(self.save)
+        self.ui.btnCancel.clicked.connect(self.cancel)
+
+    @classmethod
+    def edit(cls, parent, playlist=None):
+        dlg = cls(playlist, parent)
+        r = dlg.exec_()
+        return r
+
+    def cancel(self):
+        self.done(0)
+
+    def save(self):
+        self.playlist.name = self.ui.lineName.text()
+        if self.ui.lineDate.dateTime():
+            self.playlist.date = self.ui.lineDate.dateTime().toPyDateTime()
+        self.playlist.notes = self.ui.textNotes.toPlainText()
+
+        repo = SessionRepository()
+        if not self.playlist.id:
+            repo.create(self.playlist)
+        repo.commit()
+
+
+

+ 247 - 0
ui/qt/dlg_playlist.ui

@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>dlgPlaylist</class>
+ <widget class="QDialog" name="dlgPlaylist">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>682</width>
+    <height>436</height>
+   </rect>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>902</width>
+    <height>810</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Ma Session</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="rsc.qrc">
+    <normaloff>:/img/rsc/constellations.svg</normaloff>:/img/rsc/constellations.svg</iconset>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <property name="leftMargin">
+        <number>24</number>
+       </property>
+       <property name="rightMargin">
+        <number>24</number>
+       </property>
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="minimumSize">
+          <size>
+           <width>140</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>140</width>
+           <height>16777215</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>Nom de la session: </string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="lineName">
+         <property name="minimumSize">
+          <size>
+           <width>320</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>320</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>Ma session</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>
+      </layout>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_3">
+       <property name="leftMargin">
+        <number>24</number>
+       </property>
+       <property name="rightMargin">
+        <number>24</number>
+       </property>
+       <item>
+        <widget class="QLabel" name="label_2">
+         <property name="minimumSize">
+          <size>
+           <width>140</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>140</width>
+           <height>16777215</height>
+          </size>
+         </property>
+         <property name="font">
+          <font>
+           <italic>true</italic>
+          </font>
+         </property>
+         <property name="text">
+          <string>Date (facultatif)</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QDateTimeEdit" name="lineDate">
+         <property name="minimumSize">
+          <size>
+           <width>320</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>320</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="calendarPopup">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_3">
+       <property name="text">
+        <string>Notes:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QTextEdit" name="textNotes">
+       <property name="autoFormatting">
+        <set>QTextEdit::AutoAll</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_4">
+       <item>
+        <widget class="QPushButton" name="btnCancel">
+         <property name="minimumSize">
+          <size>
+           <width>120</width>
+           <height>32</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>120</width>
+           <height>32</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>  Annuler</string>
+         </property>
+         <property name="icon">
+          <iconset resource="rsc.qrc">
+           <normaloff>:/img/rsc/remove.png</normaloff>:/img/rsc/remove.png</iconset>
+         </property>
+         <property name="shortcut">
+          <string>Ctrl+S</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_3">
+         <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>32</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>140</width>
+           <height>32</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>  Enregistrer</string>
+         </property>
+         <property name="icon">
+          <iconset resource="rsc.qrc">
+           <normaloff>:/img/rsc/save.png</normaloff>:/img/rsc/save.png</iconset>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="rsc.qrc"/>
+ </resources>
+ <connections/>
+</ui>

+ 106 - 0
ui/qt/dlg_playlist_ui.py

@@ -0,0 +1,106 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'dlg_playlist.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.2
+#
+# 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_dlgPlaylist(object):
+    def setupUi(self, dlgPlaylist):
+        dlgPlaylist.setObjectName("dlgPlaylist")
+        dlgPlaylist.resize(682, 436)
+        dlgPlaylist.setMaximumSize(QtCore.QSize(902, 810))
+        icon = QtGui.QIcon()
+        icon.addPixmap(QtGui.QPixmap(":/img/rsc/constellations.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        dlgPlaylist.setWindowIcon(icon)
+        dlgPlaylist.setModal(True)
+        self.horizontalLayout = QtWidgets.QHBoxLayout(dlgPlaylist)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setContentsMargins(24, -1, 24, -1)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.label = QtWidgets.QLabel(dlgPlaylist)
+        self.label.setMinimumSize(QtCore.QSize(140, 0))
+        self.label.setMaximumSize(QtCore.QSize(140, 16777215))
+        self.label.setObjectName("label")
+        self.horizontalLayout_2.addWidget(self.label)
+        self.lineName = QtWidgets.QLineEdit(dlgPlaylist)
+        self.lineName.setMinimumSize(QtCore.QSize(320, 28))
+        self.lineName.setMaximumSize(QtCore.QSize(320, 28))
+        self.lineName.setObjectName("lineName")
+        self.horizontalLayout_2.addWidget(self.lineName)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_3.setContentsMargins(24, -1, 24, -1)
+        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
+        self.label_2 = QtWidgets.QLabel(dlgPlaylist)
+        self.label_2.setMinimumSize(QtCore.QSize(140, 0))
+        self.label_2.setMaximumSize(QtCore.QSize(140, 16777215))
+        font = QtGui.QFont()
+        font.setItalic(True)
+        self.label_2.setFont(font)
+        self.label_2.setObjectName("label_2")
+        self.horizontalLayout_3.addWidget(self.label_2)
+        self.lineDate = QtWidgets.QDateTimeEdit(dlgPlaylist)
+        self.lineDate.setMinimumSize(QtCore.QSize(320, 28))
+        self.lineDate.setMaximumSize(QtCore.QSize(320, 28))
+        self.lineDate.setCalendarPopup(True)
+        self.lineDate.setObjectName("lineDate")
+        self.horizontalLayout_3.addWidget(self.lineDate)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_3.addItem(spacerItem1)
+        self.verticalLayout.addLayout(self.horizontalLayout_3)
+        self.label_3 = QtWidgets.QLabel(dlgPlaylist)
+        self.label_3.setObjectName("label_3")
+        self.verticalLayout.addWidget(self.label_3)
+        self.textNotes = QtWidgets.QTextEdit(dlgPlaylist)
+        self.textNotes.setAutoFormatting(QtWidgets.QTextEdit.AutoAll)
+        self.textNotes.setObjectName("textNotes")
+        self.verticalLayout.addWidget(self.textNotes)
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        self.btnCancel = QtWidgets.QPushButton(dlgPlaylist)
+        self.btnCancel.setMinimumSize(QtCore.QSize(120, 32))
+        self.btnCancel.setMaximumSize(QtCore.QSize(120, 32))
+        icon1 = QtGui.QIcon()
+        icon1.addPixmap(QtGui.QPixmap(":/img/rsc/remove.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnCancel.setIcon(icon1)
+        self.btnCancel.setObjectName("btnCancel")
+        self.horizontalLayout_4.addWidget(self.btnCancel)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem2)
+        self.btnSave = QtWidgets.QPushButton(dlgPlaylist)
+        self.btnSave.setMinimumSize(QtCore.QSize(140, 32))
+        self.btnSave.setMaximumSize(QtCore.QSize(140, 32))
+        icon2 = QtGui.QIcon()
+        icon2.addPixmap(QtGui.QPixmap(":/img/rsc/save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnSave.setIcon(icon2)
+        self.btnSave.setObjectName("btnSave")
+        self.horizontalLayout_4.addWidget(self.btnSave)
+        self.verticalLayout.addLayout(self.horizontalLayout_4)
+        self.horizontalLayout.addLayout(self.verticalLayout)
+
+        self.retranslateUi(dlgPlaylist)
+        QtCore.QMetaObject.connectSlotsByName(dlgPlaylist)
+
+    def retranslateUi(self, dlgPlaylist):
+        _translate = QtCore.QCoreApplication.translate
+        dlgPlaylist.setWindowTitle(_translate("dlgPlaylist", "Ma Session"))
+        self.label.setText(_translate("dlgPlaylist", "Nom de la session: "))
+        self.lineName.setText(_translate("dlgPlaylist", "Ma session"))
+        self.label_2.setText(_translate("dlgPlaylist", "Date (facultatif)"))
+        self.label_3.setText(_translate("dlgPlaylist", "Notes:"))
+        self.btnCancel.setText(_translate("dlgPlaylist", "  Annuler"))
+        self.btnCancel.setShortcut(_translate("dlgPlaylist", "Ctrl+S"))
+        self.btnSave.setText(_translate("dlgPlaylist", "  Enregistrer"))
+from . import rsc_rc

+ 1 - 0
ui/qt/gen.cmd

@@ -1,3 +1,4 @@
 pyrcc5 rsc.qrc -o rsc_rc.py
 pyuic5 main.ui -o main_ui.py --from-imports
+pyuic5 dlg_playlist.ui -o dlg_playlist_ui.py --from-imports
 pyuic5 widgets/vlcframe.ui -o widgets/vlcframe_ui.py --import-from=..

+ 393 - 324
ui/qt/main.ui

@@ -6,13 +6,13 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>987</width>
+    <width>1042</width>
     <height>783</height>
    </rect>
   </property>
   <property name="minimumSize">
    <size>
-    <width>804</width>
+    <width>859</width>
     <height>618</height>
    </size>
   </property>
@@ -198,7 +198,7 @@
           <widget class="QWidget" name="page_3">
            <layout class="QHBoxLayout" name="horizontalLayout_4">
             <item>
-             <layout class="QHBoxLayout" name="horizontalLayout_6">
+             <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="1,1,1">
               <property name="leftMargin">
                <number>10</number>
               </property>
@@ -216,11 +216,53 @@
                 <property name="bottomMargin">
                  <number>0</number>
                 </property>
+                <item>
+                 <layout class="QHBoxLayout" name="horizontalLayout_12">
+                  <item>
+                   <widget class="QLabel" name="label_3">
+                    <property name="font">
+                     <font>
+                      <underline>true</underline>
+                     </font>
+                    </property>
+                    <property name="text">
+                     <string>Mes musiques</string>
+                    </property>
+                   </widget>
+                  </item>
+                  <item>
+                   <widget class="QPushButton" name="btnExplorerRefresh">
+                    <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="toolTip">
+                     <string>Rafraichir la liste</string>
+                    </property>
+                    <property name="text">
+                     <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>
                  <widget class="ExplorerTable" name="explorerTable">
                   <property name="minimumSize">
                    <size>
-                    <width>383</width>
+                    <width>320</width>
                     <height>0</height>
                    </size>
                   </property>
@@ -254,27 +296,10 @@
                   </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,0,0,0">
+               <layout class="QVBoxLayout" name="verticalLayout_5" stretch="0,0,0,0,0,0">
                 <property name="leftMargin">
                  <number>10</number>
                 </property>
@@ -288,369 +313,408 @@
                  <number>10</number>
                 </property>
                 <item>
-                 <widget class="QFrame" name="explorerTrackMetaFrame">
+                 <widget class="QStackedWidget" name="explorerTrackMetaStack">
                   <property name="minimumSize">
                    <size>
                     <width>0</width>
-                    <height>240</height>
+                    <height>50</height>
                    </size>
                   </property>
-                  <property name="maximumSize">
+                  <property name="currentIndex">
+                   <number>1</number>
+                  </property>
+                  <widget class="QWidget" name="page">
+                   <layout class="QVBoxLayout" name="verticalLayout_11">
+                    <item>
+                     <widget class="QLabel" name="label_2">
+                      <property name="text">
+                       <string>Sélectionnez une piste</string>
+                      </property>
+                      <property name="alignment">
+                       <set>Qt::AlignCenter</set>
+                      </property>
+                     </widget>
+                    </item>
+                   </layout>
+                  </widget>
+                  <widget class="QWidget" name="page_6">
+                   <layout class="QHBoxLayout" name="horizontalLayout_16">
+                    <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>
+                      <item>
+                       <layout class="QHBoxLayout" name="horizontalLayout_13">
+                        <item>
+                         <widget class="QLabel" name="label_11">
+                          <property name="font">
+                           <font>
+                            <underline>true</underline>
+                           </font>
+                          </property>
+                          <property name="text">
+                           <string>Informations sur la piste</string>
+                          </property>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QToolButton" name="explorerTrackEdit">
+                          <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/>
+                          </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>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLabel" name="explorerLblTrackTitle">
+                          <property name="text">
+                           <string/>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                      <item>
+                       <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>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLabel" name="explorerLblTrackArtist">
+                          <property name="text">
+                           <string/>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                      <item>
+                       <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>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLabel" name="explorerLblTrackAlbum">
+                          <property name="text">
+                           <string/>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                      <item>
+                       <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>
+                         </widget>
+                        </item>
+                        <item>
+                         <widget class="QLabel" name="explorerLblTrackNumber">
+                          <property name="text">
+                           <string/>
+                          </property>
+                         </widget>
+                        </item>
+                       </layout>
+                      </item>
+                      <item>
+                       <spacer name="verticalSpacer_3">
+                        <property name="orientation">
+                         <enum>Qt::Vertical</enum>
+                        </property>
+                        <property name="sizeType">
+                         <enum>QSizePolicy::Fixed</enum>
+                        </property>
+                        <property name="sizeHint" stdset="0">
+                         <size>
+                          <width>20</width>
+                          <height>20</height>
+                         </size>
+                        </property>
+                       </spacer>
+                      </item>
+                      <item>
+                       <widget class="QLabel" name="label_10">
+                        <property name="maximumSize">
+                         <size>
+                          <width>361</width>
+                          <height>14</height>
+                         </size>
+                        </property>
+                        <property name="font">
+                         <font>
+                          <underline>true</underline>
+                         </font>
+                        </property>
+                        <property name="text">
+                         <string>Notes</string>
+                        </property>
+                       </widget>
+                      </item>
+                      <item>
+                       <widget class="QTextBrowser" name="explorerTrackNotepad">
+                        <property name="minimumSize">
+                         <size>
+                          <width>0</width>
+                          <height>120</height>
+                         </size>
+                        </property>
+                        <property name="undoRedoEnabled">
+                         <bool>true</bool>
+                        </property>
+                       </widget>
+                      </item>
+                     </layout>
+                    </item>
+                   </layout>
+                  </widget>
+                 </widget>
+                </item>
+                <item>
+                 <spacer name="verticalSpacer_4">
+                  <property name="orientation">
+                   <enum>Qt::Vertical</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
                    <size>
-                    <width>16777215</width>
-                    <height>240</height>
+                    <width>20</width>
+                    <height>40</height>
                    </size>
                   </property>
-                  <property name="frameShape">
-                   <enum>QFrame::StyledPanel</enum>
+                 </spacer>
+                </item>
+                <item>
+                 <widget class="QPushButton" name="explorerTrackPlay">
+                  <property name="enabled">
+                   <bool>false</bool>
                   </property>
-                  <property name="frameShadow">
-                   <enum>QFrame::Raised</enum>
+                  <property name="text">
+                   <string>  Lire le morceau sélectionné</string>
+                  </property>
+                  <property name="icon">
+                   <iconset resource="rsc.qrc">
+                    <normaloff>:/img/rsc/play.png</normaloff>:/img/rsc/play.png</iconset>
+                  </property>
+                  <property name="iconSize">
+                   <size>
+                    <width>12</width>
+                    <height>12</height>
+                   </size>
                   </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>
-                    <widget class="QStackedWidget" name="explorerTrackMetaStack">
-                     <property name="minimumSize">
-                      <size>
-                       <width>0</width>
-                       <height>50</height>
-                      </size>
-                     </property>
-                     <property name="currentIndex">
-                      <number>1</number>
-                     </property>
-                     <widget class="QWidget" name="page">
-                      <layout class="QVBoxLayout" name="verticalLayout_11">
-                       <item>
-                        <widget class="QLabel" name="label_2">
-                         <property name="text">
-                          <string>Pas de piste sélectionnée</string>
-                         </property>
-                        </widget>
-                       </item>
-                      </layout>
-                     </widget>
-                     <widget class="QWidget" name="page_6">
-                      <layout class="QHBoxLayout" name="horizontalLayout_16">
-                       <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>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="explorerTrackEdit">
-                             <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/>
-                             </property>
-                             <property name="icon">
-                              <iconset resource="rsc.qrc">
-                               <normaloff>:/img/rsc/edit.png</normaloff>:/img/rsc/edit.png</iconset>
-                             </property>
-                            </widget>
-                           </item>
-                           <item>
-                            <widget class="QToolButton" name="explorerTrackPlay">
-                             <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>
-                               <normaloff>rsc/play.png</normaloff>rsc/play.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>
-                            </widget>
-                           </item>
-                           <item>
-                            <widget class="QLabel" name="explorerLblTrackTitle">
-                             <property name="text">
-                              <string/>
-                             </property>
-                            </widget>
-                           </item>
-                          </layout>
-                         </item>
-                         <item>
-                          <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>
-                            </widget>
-                           </item>
-                           <item>
-                            <widget class="QLabel" name="explorerLblTrackArtist">
-                             <property name="text">
-                              <string/>
-                             </property>
-                            </widget>
-                           </item>
-                          </layout>
-                         </item>
-                         <item>
-                          <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>
-                            </widget>
-                           </item>
-                           <item>
-                            <widget class="QLabel" name="explorerLblTrackAlbum">
-                             <property name="text">
-                              <string/>
-                             </property>
-                            </widget>
-                           </item>
-                          </layout>
-                         </item>
-                         <item>
-                          <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>
-                            </widget>
-                           </item>
-                           <item>
-                            <widget class="QLabel" name="explorerLblTrackNumber">
-                             <property name="text">
-                              <string/>
-                             </property>
-                            </widget>
-                           </item>
-                          </layout>
-                         </item>
-                         <item>
-                          <widget class="QLabel" name="label_10">
-                           <property name="minimumSize">
-                            <size>
-                             <width>361</width>
-                             <height>14</height>
-                            </size>
-                           </property>
-                           <property name="maximumSize">
-                            <size>
-                             <width>361</width>
-                             <height>14</height>
-                            </size>
-                           </property>
-                           <property name="text">
-                            <string>Notes</string>
-                           </property>
-                          </widget>
-                         </item>
-                         <item>
-                          <widget class="QTextBrowser" name="explorerTrackNotepad">
-                           <property name="minimumSize">
-                            <size>
-                             <width>0</width>
-                             <height>120</height>
-                            </size>
-                           </property>
-                           <property name="undoRedoEnabled">
-                            <bool>true</bool>
-                           </property>
-                          </widget>
-                         </item>
-                        </layout>
-                       </item>
-                      </layout>
-                     </widget>
-                    </widget>
-                   </item>
-                  </layout>
                  </widget>
                 </item>
+                <item>
+                 <widget class="QPushButton" name="explorerAddToPlaylist">
+                  <property name="enabled">
+                   <bool>false</bool>
+                  </property>
+                  <property name="text">
+                   <string>  Ajouter à la playlist</string>
+                  </property>
+                  <property name="icon">
+                   <iconset resource="rsc.qrc">
+                    <normaloff>:/img/rsc/double-right-arrows-symbol.png</normaloff>:/img/rsc/double-right-arrows-symbol.png</iconset>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QPushButton" name="explorerRemoveFromPlaylist">
+                  <property name="enabled">
+                   <bool>false</bool>
+                  </property>
+                  <property name="text">
+                   <string>  Retirer de la playlist</string>
+                  </property>
+                  <property name="icon">
+                   <iconset resource="rsc.qrc">
+                    <normaloff>:/img/rsc/double-left-arrows-symbol.png</normaloff>:/img/rsc/double-left-arrows-symbol.png</iconset>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <spacer name="verticalSpacer_2">
+                  <property name="orientation">
+                   <enum>Qt::Vertical</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>20</width>
+                    <height>40</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+               </layout>
+              </item>
+              <item>
+               <layout class="QVBoxLayout" name="verticalLayout_12">
                 <item>
                  <widget class="QLabel" name="label_9">
+                  <property name="font">
+                   <font>
+                    <underline>true</underline>
+                   </font>
+                  </property>
                   <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>
+                 <layout class="QHBoxLayout" name="horizontalLayout_18">
                   <item>
-                   <widget class="QToolButton" name="explorerAddToPlaylist">
+                   <widget class="QComboBox" name="explorerSelectPlaylist">
                     <property name="minimumSize">
                      <size>
-                      <width>28</width>
+                      <width>0</width>
                       <height>28</height>
                      </size>
                     </property>
                     <property name="maximumSize">
                      <size>
-                      <width>28</width>
+                      <width>16777215</width>
                       <height>28</height>
                      </size>
                     </property>
-                    <property name="text">
-                     <string>+</string>
+                    <property name="maxVisibleItems">
+                     <number>24</number>
                     </property>
-                    <property name="icon">
-                     <iconset resource="rsc.qrc">
-                      <normaloff>:/img/rsc/plus.png</normaloff>:/img/rsc/plus.png</iconset>
+                    <property name="insertPolicy">
+                     <enum>QComboBox::InsertAtTop</enum>
                     </property>
                    </widget>
                   </item>
                   <item>
-                   <widget class="QToolButton" name="explorerRemoveFromPlaylist">
+                   <widget class="QToolButton" name="toolButton">
                     <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>
+                     <string>...</string>
                     </property>
                     <property name="icon">
                      <iconset resource="rsc.qrc">
-                      <normaloff>:/img/rsc/minus.png</normaloff>:/img/rsc/minus.png</iconset>
+                      <normaloff>:/img/rsc/edit.png</normaloff>:/img/rsc/edit.png</iconset>
                     </property>
                    </widget>
                   </item>
                   <item>
-                   <widget class="QComboBox" name="explorerSelectPlaylist">
+                   <widget class="QToolButton" name="explorerCreatePlaylist">
                     <property name="minimumSize">
                      <size>
-                      <width>0</width>
+                      <width>28</width>
                       <height>28</height>
                      </size>
                     </property>
-                    <property name="maximumSize">
-                     <size>
-                      <width>16777215</width>
-                      <height>28</height>
-                     </size>
+                    <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>
                  </layout>
                 </item>
                 <item>
-                 <widget class="QTableWidget" name="explorerPlaylist"/>
+                 <widget class="PlaylistTable" name="explorerPlaylist">
+                  <property name="minimumSize">
+                   <size>
+                    <width>240</width>
+                    <height>0</height>
+                   </size>
+                  </property>
+                 </widget>
                 </item>
                </layout>
               </item>
@@ -876,6 +940,11 @@
    <header location="global">.widgets.vlcframe.h</header>
    <container>1</container>
   </customwidget>
+  <customwidget>
+   <class>PlaylistTable</class>
+   <extends>QTableWidget</extends>
+   <header location="global">.widgets.playlist_table.h</header>
+  </customwidget>
  </customwidgets>
  <resources>
   <include location="rsc.qrc"/>

+ 104 - 69
ui/qt/main_ui.py

@@ -14,8 +14,8 @@ from PyQt5 import QtCore, QtGui, QtWidgets
 class Ui_mainWindow(object):
     def setupUi(self, mainWindow):
         mainWindow.setObjectName("mainWindow")
-        mainWindow.resize(987, 783)
-        mainWindow.setMinimumSize(QtCore.QSize(804, 618))
+        mainWindow.resize(1042, 783)
+        mainWindow.setMinimumSize(QtCore.QSize(859, 618))
         font = QtGui.QFont()
         font.setFamily("Verdana")
         font.setPointSize(8)
@@ -118,8 +118,26 @@ class Ui_mainWindow(object):
         self.verticalLayout_8 = QtWidgets.QVBoxLayout()
         self.verticalLayout_8.setContentsMargins(-1, -1, -1, 0)
         self.verticalLayout_8.setObjectName("verticalLayout_8")
+        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
+        self.label_3 = QtWidgets.QLabel(self.page_3)
+        font = QtGui.QFont()
+        font.setUnderline(True)
+        self.label_3.setFont(font)
+        self.label_3.setObjectName("label_3")
+        self.horizontalLayout_12.addWidget(self.label_3)
+        self.btnExplorerRefresh = QtWidgets.QPushButton(self.page_3)
+        self.btnExplorerRefresh.setMinimumSize(QtCore.QSize(28, 28))
+        self.btnExplorerRefresh.setMaximumSize(QtCore.QSize(28, 28))
+        self.btnExplorerRefresh.setText("")
+        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.horizontalLayout_12.addWidget(self.btnExplorerRefresh)
+        self.verticalLayout_8.addLayout(self.horizontalLayout_12)
         self.explorerTable = ExplorerTable(self.page_3)
-        self.explorerTable.setMinimumSize(QtCore.QSize(383, 0))
+        self.explorerTable.setMinimumSize(QtCore.QSize(320, 0))
         self.explorerTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
         self.explorerTable.setAlternatingRowColors(True)
         self.explorerTable.setIndentation(10)
@@ -129,28 +147,11 @@ class Ui_mainWindow(object):
         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)
         self.verticalLayout_5 = QtWidgets.QVBoxLayout()
         self.verticalLayout_5.setContentsMargins(10, 10, 10, 10)
         self.verticalLayout_5.setObjectName("verticalLayout_5")
-        self.explorerTrackMetaFrame = QtWidgets.QFrame(self.page_3)
-        self.explorerTrackMetaFrame.setMinimumSize(QtCore.QSize(0, 240))
-        self.explorerTrackMetaFrame.setMaximumSize(QtCore.QSize(16777215, 240))
-        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.explorerTrackMetaStack = QtWidgets.QStackedWidget(self.explorerTrackMetaFrame)
+        self.explorerTrackMetaStack = QtWidgets.QStackedWidget(self.page_3)
         self.explorerTrackMetaStack.setMinimumSize(QtCore.QSize(0, 50))
         self.explorerTrackMetaStack.setObjectName("explorerTrackMetaStack")
         self.page = QtWidgets.QWidget()
@@ -158,6 +159,7 @@ class Ui_mainWindow(object):
         self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.page)
         self.verticalLayout_11.setObjectName("verticalLayout_11")
         self.label_2 = QtWidgets.QLabel(self.page)
+        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
         self.label_2.setObjectName("label_2")
         self.verticalLayout_11.addWidget(self.label_2)
         self.explorerTrackMetaStack.addWidget(self.page)
@@ -169,12 +171,14 @@ class Ui_mainWindow(object):
         self.horizontalLayout_16.setObjectName("horizontalLayout_16")
         self.verticalLayout_9 = QtWidgets.QVBoxLayout()
         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.page_6)
+        font = QtGui.QFont()
+        font.setUnderline(True)
+        self.label_11.setFont(font)
         self.label_11.setObjectName("label_11")
         self.horizontalLayout_13.addWidget(self.label_11)
         self.explorerTrackEdit = QtWidgets.QToolButton(self.page_6)
@@ -186,14 +190,6 @@ class Ui_mainWindow(object):
         self.explorerTrackEdit.setIcon(icon3)
         self.explorerTrackEdit.setObjectName("explorerTrackEdit")
         self.horizontalLayout_13.addWidget(self.explorerTrackEdit)
-        self.explorerTrackPlay = QtWidgets.QToolButton(self.page_6)
-        self.explorerTrackPlay.setMinimumSize(QtCore.QSize(28, 28))
-        self.explorerTrackPlay.setMaximumSize(QtCore.QSize(28, 28))
-        icon4 = QtGui.QIcon()
-        icon4.addPixmap(QtGui.QPixmap("rsc/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerTrackPlay.setIcon(icon4)
-        self.explorerTrackPlay.setObjectName("explorerTrackPlay")
-        self.horizontalLayout_13.addWidget(self.explorerTrackPlay)
         self.verticalLayout_9.addLayout(self.horizontalLayout_13)
         self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_8.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
@@ -241,9 +237,13 @@ class Ui_mainWindow(object):
         self.explorerLblTrackNumber.setObjectName("explorerLblTrackNumber")
         self.horizontalLayout_11.addWidget(self.explorerLblTrackNumber)
         self.verticalLayout_9.addLayout(self.horizontalLayout_11)
+        spacerItem = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+        self.verticalLayout_9.addItem(spacerItem)
         self.label_10 = QtWidgets.QLabel(self.page_6)
-        self.label_10.setMinimumSize(QtCore.QSize(361, 14))
         self.label_10.setMaximumSize(QtCore.QSize(361, 14))
+        font = QtGui.QFont()
+        font.setUnderline(True)
+        self.label_10.setFont(font)
         self.label_10.setObjectName("label_10")
         self.verticalLayout_9.addWidget(self.label_10)
         self.explorerTrackNotepad = QtWidgets.QTextBrowser(self.page_6)
@@ -253,43 +253,74 @@ class Ui_mainWindow(object):
         self.verticalLayout_9.addWidget(self.explorerTrackNotepad)
         self.horizontalLayout_16.addLayout(self.verticalLayout_9)
         self.explorerTrackMetaStack.addWidget(self.page_6)
-        self.verticalLayout_10.addWidget(self.explorerTrackMetaStack)
-        self.verticalLayout_5.addWidget(self.explorerTrackMetaFrame)
-        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))
-        self.explorerAddToPlaylist.setMaximumSize(QtCore.QSize(28, 28))
+        self.verticalLayout_5.addWidget(self.explorerTrackMetaStack)
+        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_5.addItem(spacerItem1)
+        self.explorerTrackPlay = QtWidgets.QPushButton(self.page_3)
+        self.explorerTrackPlay.setEnabled(False)
+        icon4 = QtGui.QIcon()
+        icon4.addPixmap(QtGui.QPixmap(":/img/rsc/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerTrackPlay.setIcon(icon4)
+        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)
         icon5 = QtGui.QIcon()
-        icon5.addPixmap(QtGui.QPixmap(":/img/rsc/plus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon5.addPixmap(QtGui.QPixmap(":/img/rsc/double-right-arrows-symbol.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.explorerAddToPlaylist.setIcon(icon5)
         self.explorerAddToPlaylist.setObjectName("explorerAddToPlaylist")
-        self.horizontalLayout_12.addWidget(self.explorerAddToPlaylist)
-        self.explorerRemoveFromPlaylist = QtWidgets.QToolButton(self.page_3)
-        self.explorerRemoveFromPlaylist.setMinimumSize(QtCore.QSize(28, 28))
-        self.explorerRemoveFromPlaylist.setMaximumSize(QtCore.QSize(28, 28))
+        self.verticalLayout_5.addWidget(self.explorerAddToPlaylist)
+        self.explorerRemoveFromPlaylist = QtWidgets.QPushButton(self.page_3)
+        self.explorerRemoveFromPlaylist.setEnabled(False)
         icon6 = QtGui.QIcon()
-        icon6.addPixmap(QtGui.QPixmap(":/img/rsc/minus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon6.addPixmap(QtGui.QPixmap(":/img/rsc/double-left-arrows-symbol.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.explorerRemoveFromPlaylist.setIcon(icon6)
         self.explorerRemoveFromPlaylist.setObjectName("explorerRemoveFromPlaylist")
-        self.horizontalLayout_12.addWidget(self.explorerRemoveFromPlaylist)
+        self.verticalLayout_5.addWidget(self.explorerRemoveFromPlaylist)
+        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_5.addItem(spacerItem2)
+        self.horizontalLayout_6.addLayout(self.verticalLayout_5)
+        self.verticalLayout_12 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_12.setObjectName("verticalLayout_12")
+        self.label_9 = QtWidgets.QLabel(self.page_3)
+        font = QtGui.QFont()
+        font.setUnderline(True)
+        self.label_9.setFont(font)
+        self.label_9.setObjectName("label_9")
+        self.verticalLayout_12.addWidget(self.label_9)
+        self.horizontalLayout_18 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_18.setObjectName("horizontalLayout_18")
         self.explorerSelectPlaylist = QtWidgets.QComboBox(self.page_3)
         self.explorerSelectPlaylist.setMinimumSize(QtCore.QSize(0, 28))
         self.explorerSelectPlaylist.setMaximumSize(QtCore.QSize(16777215, 28))
+        self.explorerSelectPlaylist.setMaxVisibleItems(24)
+        self.explorerSelectPlaylist.setInsertPolicy(QtWidgets.QComboBox.InsertAtTop)
         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.horizontalLayout_18.addWidget(self.explorerSelectPlaylist)
+        self.toolButton = QtWidgets.QToolButton(self.page_3)
+        self.toolButton.setMinimumSize(QtCore.QSize(28, 28))
+        self.toolButton.setIcon(icon3)
+        self.toolButton.setObjectName("toolButton")
+        self.horizontalLayout_18.addWidget(self.toolButton)
+        self.explorerCreatePlaylist = QtWidgets.QToolButton(self.page_3)
+        self.explorerCreatePlaylist.setMinimumSize(QtCore.QSize(28, 28))
+        icon7 = QtGui.QIcon()
+        icon7.addPixmap(QtGui.QPixmap(":/img/rsc/plus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerCreatePlaylist.setIcon(icon7)
+        self.explorerCreatePlaylist.setObjectName("explorerCreatePlaylist")
+        self.horizontalLayout_18.addWidget(self.explorerCreatePlaylist)
+        self.verticalLayout_12.addLayout(self.horizontalLayout_18)
+        self.explorerPlaylist = PlaylistTable(self.page_3)
+        self.explorerPlaylist.setMinimumSize(QtCore.QSize(240, 0))
         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.horizontalLayout_6.addLayout(self.verticalLayout_5)
+        self.verticalLayout_12.addWidget(self.explorerPlaylist)
+        self.horizontalLayout_6.addLayout(self.verticalLayout_12)
+        self.horizontalLayout_6.setStretch(0, 1)
+        self.horizontalLayout_6.setStretch(1, 1)
+        self.horizontalLayout_6.setStretch(2, 1)
         self.horizontalLayout_4.addLayout(self.horizontalLayout_6)
         self.stack.addWidget(self.page_3)
         self.page_4 = QtWidgets.QWidget()
@@ -341,16 +372,16 @@ class Ui_mainWindow(object):
         self.horizontalLayout_7.setObjectName("horizontalLayout_7")
         self.musicFoldersRemoveButton = QtWidgets.QPushButton(self.page_5)
         self.musicFoldersRemoveButton.setMinimumSize(QtCore.QSize(0, 32))
-        icon7 = QtGui.QIcon()
-        icon7.addPixmap(QtGui.QPixmap(":/img/rsc/delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.musicFoldersRemoveButton.setIcon(icon7)
+        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)
-        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
-        self.horizontalLayout_7.addItem(spacerItem)
+        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_7.addItem(spacerItem3)
         self.musicFoldersAddButton = QtWidgets.QPushButton(self.page_5)
         self.musicFoldersAddButton.setMinimumSize(QtCore.QSize(128, 32))
-        self.musicFoldersAddButton.setIcon(icon5)
+        self.musicFoldersAddButton.setIcon(icon7)
         self.musicFoldersAddButton.setObjectName("musicFoldersAddButton")
         self.horizontalLayout_7.addWidget(self.musicFoldersAddButton)
         self.verticalLayout_6.addLayout(self.horizontalLayout_7)
@@ -359,8 +390,8 @@ class Ui_mainWindow(object):
         self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
         self.line.setObjectName("line")
         self.verticalLayout_6.addWidget(self.line)
-        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.verticalLayout_6.addItem(spacerItem1)
+        spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.verticalLayout_6.addItem(spacerItem4)
         self.horizontalLayout_5.addLayout(self.verticalLayout_6)
         self.stack.addWidget(self.page_5)
         self.verticalLayout_7.addWidget(self.stack)
@@ -397,19 +428,22 @@ class Ui_mainWindow(object):
         item.setText(_translate("mainWindow", "Ordre"))
         item = self.sessionPlaylist.horizontalHeaderItem(2)
         item.setText(_translate("mainWindow", "Titre"))
+        self.label_3.setText(_translate("mainWindow", "Mes musiques"))
+        self.btnExplorerRefresh.setToolTip(_translate("mainWindow", "Rafraichir la liste"))
         self.explorerTable.headerItem().setText(1, _translate("mainWindow", "2"))
-        self.btnExplorerRefresh.setText(_translate("mainWindow", "Rafraichir"))
-        self.label_2.setText(_translate("mainWindow", "Pas de piste sélectionnée"))
-        self.label_11.setText(_translate("mainWindow", "Informations sur la piste:"))
-        self.explorerTrackPlay.setText(_translate("mainWindow", "..."))
+        self.label_2.setText(_translate("mainWindow", "Sélectionnez une piste"))
+        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_10.setText(_translate("mainWindow", "Notes"))
+        self.explorerTrackPlay.setText(_translate("mainWindow", "  Lire le morceau sélectionné"))
+        self.explorerAddToPlaylist.setText(_translate("mainWindow", "  Ajouter à la playlist"))
+        self.explorerRemoveFromPlaylist.setText(_translate("mainWindow", "  Retirer de la playlist"))
         self.label_9.setText(_translate("mainWindow", "Liste de lecture"))
-        self.explorerAddToPlaylist.setText(_translate("mainWindow", "+"))
-        self.explorerRemoveFromPlaylist.setText(_translate("mainWindow", "-"))
+        self.toolButton.setText(_translate("mainWindow", "..."))
+        self.explorerCreatePlaylist.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)
@@ -421,5 +455,6 @@ class Ui_mainWindow(object):
         self.musicFoldersRemoveButton.setText(_translate("mainWindow", "Supprimer"))
         self.musicFoldersAddButton.setText(_translate("mainWindow", "Ajouter"))
 from .widgets.explorertable import ExplorerTable
+from .widgets.playlist_table import PlaylistTable
 from .widgets.vlcframe import VlcFrame
 from . import rsc_rc

+ 3 - 0
ui/qt/rsc.qrc

@@ -1,6 +1,9 @@
 <RCC>
   <qresource prefix="/img">
+    <file>rsc/double-left-arrows-symbol.png</file>
+    <file>rsc/double-right-arrows-symbol.png</file>
     <file>rsc/sound-frecuency.png</file>
+    <file>rsc/playlist.png</file>
     <file>rsc/mute.png</file>
     <file>rsc/volume.png</file>
     <file>rsc/pause.png</file>

BIN
ui/qt/rsc/double-left-arrows-symbol.png


BIN
ui/qt/rsc/double-right-arrows-symbol.png


BIN
ui/qt/rsc/playlist.png


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


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

@@ -11,12 +11,14 @@ logger = Logger.get()
 
 class ExplorerTable(QTreeWidget):
     trackSelected = pyqtSignal(object)
+    trackDoubleClicked = pyqtSignal(object)
 
     def __init__(self, parent):
         super(QTreeWidget, self).__init__(parent)
         self.setColumnCount(3)
         self.setColumnWidth(0, 54)
         self.hideColumn(2)
+        self.itemDoubleClicked.connect(self._itemDoubleClicked)
 
     def populate(self):
         session = db.Session()
@@ -72,3 +74,9 @@ class ExplorerTable(QTreeWidget):
         else:
             track = None
         self.trackSelected.emit(track)
+
+    def _itemDoubleClicked(self, item, _):
+        track_id = item.data(2, 0)
+        if track_id:
+            track = TrackRepository().get_by_id(int(track_id))
+            self.trackDoubleClicked.emit(track)

+ 20 - 0
ui/qt/widgets/playlist_table.py

@@ -0,0 +1,20 @@
+from PyQt5.QtWidgets import QTableWidget
+
+from core import db
+from core.repositories import SessionRepository
+
+
+class PlaylistTable(QTableWidget):
+    def __init__(self, parent):
+        super(QTableWidget, self).__init__(parent)
+
+        self.playlist = None
+
+    def load_playlist(self, playlist):
+        session = db.Session()
+        playlist_repo = SessionRepository(session)
+
+        self.clear()
+
+        playlists = playlist_repo.get_all()
+

+ 7 - 0
ui/qt/widgets/vlcframe.py

@@ -120,6 +120,10 @@ class VlcFrame(QtWidgets.QFrame):
     def set_volume(self, volume):
         """Set the volume
         """
+        # if muted: unmute
+        if self._is_muted:
+            self.toggle_muted()
+
         self._mediaplayer.audio_set_volume(volume)
         self.volume = volume
 
@@ -149,3 +153,6 @@ class VlcFrame(QtWidgets.QFrame):
             self._mediaplayer.audio_set_volume(self.volume)
             self.ui.btnMute.setIcon(QIcon(":/img/rsc/volume.png"))
             self._is_muted = False
+
+    def current(self):
+        return self.currentTrack

+ 26 - 11
ui/window.py

@@ -15,6 +15,7 @@ from core import constants
 from core.logging_ import Logger
 from core.models import MusicFolder
 from core.repositories import MusicFolderRepository, TrackRepository
+from ui.qt.dlg_playlist import DlgPlaylist
 from ui.qt.main_ui import Ui_mainWindow
 
 logger = Logger.get()
@@ -38,15 +39,15 @@ class MainWindow(QMainWindow):
         # Stack and menus
         self.ui.stack.setCurrentIndex(0)
 
-        menu_items = [
-            (':/img/rsc/dancing.png', 'Ma séance'),
-            (':/img/rsc/writing-tool.png', 'Préparer'),
-            (':/img/rsc/map.png', 'Explorer'),
-            (':/img/rsc/calendar.png', 'Agenda'),
-            (':/img/rsc/settings.png', 'Paramètres'),
-        ]
+        menu_items = {
+            0: (':/img/rsc/dancing.png', 'Ma séance'),
+            # 1: (':/img/rsc/writing-tool.png', 'Préparer'),
+            2: (':/img/rsc/map.png', 'Explorer'),
+            # 3: (':/img/rsc/calendar.png', 'Agenda'),
+            4: (':/img/rsc/settings.png', 'Paramètres'),
+        }
 
-        for i, item in enumerate(menu_items):
+        for i, item in menu_items.items():
             icon, lbl = item
             item = QListWidgetItem(QIcon(icon), lbl)
             item.index = i
@@ -58,9 +59,12 @@ class MainWindow(QMainWindow):
         # Page 3 - explorer
         self.ui.explorerTable.populate()
         self.ui.explorerTable.trackSelected.connect(self.explorer_tree_selection_changed)
+        self.ui.explorerTable.trackDoubleClicked.connect(self.play_track)
         self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree)
         self.ui.explorerTrackMetaStack.setCurrentIndex(0)
-        self.ui.explorerTrackPlay.clicked.connect(self.play_track)
+        self.ui.explorerTrackPlay.clicked.connect(self.explorerPlaySelected)
+
+        self.ui.explorerCreatePlaylist.clicked.connect(self.createOrEditPlaylist)
 
         # Page 5 - settings
         self.ui.musicFoldersTable.setColumnHidden(0, 1)
@@ -89,8 +93,12 @@ class MainWindow(QMainWindow):
                 str(track.track_num if track.track_num is not None else "")
             )
             self.ui.explorerTrackMetaStack.setCurrentIndex(1)
+            self.ui.explorerTrackPlay.setEnabled(True)
+            self.ui.explorerAddToPlaylist.setEnabled(True)
         else:
             self.ui.explorerTrackMetaStack.setCurrentIndex(0)
+            self.ui.explorerTrackPlay.setEnabled(False)
+            self.ui.explorerAddToPlaylist.setEnabled(False)
 
     def populate_music_folders_table(self):
         music_folders = MusicFolderRepository().get_all()
@@ -109,10 +117,14 @@ class MainWindow(QMainWindow):
 
             self.ui.musicFoldersTable.setItem(i, 2, QTableWidgetItem(music_folder.path))
 
-    def play_track(self):
+    def explorerPlaySelected(self):
         track = self.ui.explorerTable.selected_track()
-        print("play ", track)
+        if track is None:
+            return
+        self.play_track(track)
 
+    def play_track(self, track):
+        logger.info("Start playing: %s" % track)
         self.ui.vlcFrame.play_track(track)
 
     def add_music_folder(self):
@@ -142,6 +154,9 @@ class MainWindow(QMainWindow):
     def remove_music_folder(self):
         pass
 
+    def createOrEditPlaylist(self):
+        r = DlgPlaylist.edit(self)
+
     def run(self):
         pass
 

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