Olivier Massot 4 роки тому
батько
коміт
0ec6758638

+ 0 - 4
core/db.py

@@ -16,10 +16,6 @@ Base = declarative_base()
 
 session_factory = sessionmaker(autocommit=False, autoflush=False, bind=engine)
 Session = scoped_session(session_factory)
-# session_ = Session()
-
-# def session():
-#     return Session(engine)
 
 
 def create():

+ 3 - 2
notes

@@ -12,14 +12,14 @@ Bugs:
       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.
-
+* corriger le pbm d'accès et la lenteur causé par les accès en base de l'indexer
+* bug: si un répertoire de musique est inaccessible, l'indexer plante.
 
 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
@@ -27,6 +27,7 @@ Priorité 1:
 * 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
+* memoriser les données d'une session à l'autre: playlist en cours, volume, ...
 
 Priorité 2:
 

+ 2 - 1
ui/qt/gen.cmd

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

+ 1 - 1
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.4
+# 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.

+ 31 - 27
ui/qt/rsc.qrc

@@ -1,29 +1,33 @@
 <RCC>
-    <qresource prefix="/img">
-        <file>rsc/calendar.png</file>
-        <file>rsc/minus.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/artist.png</file>
-        <file>rsc/album.png</file>
-        <file>rsc/music.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>
-        <file>rsc/play.png</file>
-    </qresource>
+  <qresource prefix="/img">
+    <file>rsc/sound-frecuency.png</file>
+    <file>rsc/mute.png</file>
+    <file>rsc/volume.png</file>
+    <file>rsc/pause.png</file>
+    <file>rsc/calendar.png</file>
+    <file>rsc/minus.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/artist.png</file>
+    <file>rsc/album.png</file>
+    <file>rsc/music.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>
+    <file>rsc/play.png</file>
+  </qresource>
 </RCC>

BIN
ui/qt/rsc/mute.png


BIN
ui/qt/rsc/pause.png


BIN
ui/qt/rsc/sound-frecuency.png


BIN
ui/qt/rsc/volume.png


Різницю між файлами не показано, бо вона завелика
+ 555 - 840
ui/qt/rsc_rc.py


+ 37 - 0
ui/qt/widgets/clickable_slider.py

@@ -0,0 +1,37 @@
+from PyQt5 import QtCore, QtWidgets
+from PyQt5.QtCore import pyqtSignal
+
+
+class ClickableSlider(QtWidgets.QSlider):
+    positionClicked = pyqtSignal(int)
+
+    def mousePressEvent(self, event):
+        super(ClickableSlider, self).mousePressEvent(event)
+        if event.button() == QtCore.Qt.LeftButton:
+            pos = self.pixelPosToRangeValue(event.pos())
+            self.setValue(pos)
+            self.sliderMoved.emit(pos)
+
+    def pixelPosToRangeValue(self, pos):
+        opt = QtWidgets.QStyleOptionSlider()
+        self.initStyleOption(opt)
+        gr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderGroove, self)
+        sr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderHandle, self)
+
+        if self.orientation() == QtCore.Qt.Horizontal:
+            sliderLength = sr.width()
+            sliderMin = gr.x()
+            sliderMax = gr.right() - sliderLength + 1
+        else:
+            sliderLength = sr.height()
+            sliderMin = gr.y()
+            sliderMax = gr.bottom() - sliderLength + 1;
+        pr = pos - sr.center() + sr.topLeft()
+        p = pr.x() if self.orientation() == QtCore.Qt.Horizontal else pr.y()
+        return QtWidgets.QStyle.sliderValueFromPosition(
+            self.minimum(),
+            self.maximum(),
+            p - sliderMin,
+            sliderMax - sliderMin,
+            opt.upsideDown
+        )

+ 99 - 123
ui/qt/widgets/vlcframe.py

@@ -3,173 +3,149 @@ import sys
 
 import vlc
 from PyQt5 import QtWidgets, QtGui, QtCore
+from PyQt5.QtCore import pyqtSignal
+from PyQt5.QtGui import QIcon
+
+from ui.qt.widgets.vlcframe_ui import Ui_VlcFrame
 
 
 class VlcFrame(QtWidgets.QFrame):
+    DEFAULT_VOLUME = 50
+    playStarted = pyqtSignal(object)
+    playEnded = pyqtSignal(object)
 
-    def __init__(self, master=None):
-        super().__init__(master)
+    def __init__(self, parent=None):
+        super().__init__(parent)
 
-        # Create a basic vlc instance
-        self.instance = vlc.Instance()
+        self.currentTrack = None
+        self._media = None
+        self._is_paused = True
+        self._is_muted = False
+        self.volume = self.DEFAULT_VOLUME
 
-        self.media = None
+        # Create a basic vlc instance
+        self._instance = vlc.Instance()
 
         # Create an empty vlc media player
-        self.mediaplayer = self.instance.media_player_new()
+        self._mediaplayer = self._instance.media_player_new()
 
-        self.create_ui()
-        self.is_paused = False
+        self.createWidgets()
 
-    def create_ui(self):
-        """Set up the user interface, signals & slots
-        """
-        self.widget = QtWidgets.QWidget(self)
+    def createWidgets(self):
+        self.ui = Ui_VlcFrame()
+        self.ui.setupUi(self)
 
-        # In this widget, the video will be drawn
-        if platform.system() == "Darwin":  # for MacOS
-            self.videoframe = QtWidgets.QMacCocoaViewContainer(0)
-        else:
-            self.videoframe = QtWidgets.QFrame()
-
-        self.palette = self.videoframe.palette()
-        self.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(0, 0, 0))
-        self.videoframe.setPalette(self.palette)
-        self.videoframe.setAutoFillBackground(True)
-
-        self.positionslider = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
-        self.positionslider.setToolTip("Position")
-        self.positionslider.setMaximum(1000)
-        self.positionslider.sliderMoved.connect(self.set_position)
-        self.positionslider.sliderPressed.connect(self.set_position)
-
-        self.hbuttonbox = QtWidgets.QHBoxLayout()
-        self.playbutton = QtWidgets.QPushButton("Play")
-        self.hbuttonbox.addWidget(self.playbutton)
-        self.playbutton.clicked.connect(self.play_pause)
-
-        self.stopbutton = QtWidgets.QPushButton("Stop")
-        self.hbuttonbox.addWidget(self.stopbutton)
-        self.stopbutton.clicked.connect(self.stop)
-
-        self.hbuttonbox.addStretch(1)
-        self.volumeslider = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
-        self.volumeslider.setMaximum(100)
-        self.volumeslider.setValue(self.mediaplayer.audio_get_volume())
-        self.volumeslider.setToolTip("Volume")
-        self.hbuttonbox.addWidget(self.volumeslider)
-        self.volumeslider.valueChanged.connect(self.set_volume)
-
-        self.vboxlayout = QtWidgets.QVBoxLayout()
-        self.vboxlayout.addWidget(self.videoframe)
-        self.vboxlayout.addWidget(self.positionslider)
-        self.vboxlayout.addLayout(self.hbuttonbox)
-
-        self.widget.setLayout(self.vboxlayout)
-
-        # Add actions to file menu
-        open_action = QtWidgets.QAction("Load Video", self)
-        close_action = QtWidgets.QAction("Close App", self)
-
-        open_action.triggered.connect(self.open_file)
-        close_action.triggered.connect(sys.exit)
+        self.ui.progressionSlider.sliderMoved.connect(self.set_position)
+        self.ui.progressionSlider.sliderPressed.connect(self.set_position)
+        self.ui.progressionSlider.positionClicked.connect(self.set_position)
+
+        self.ui.btnPlayPause.clicked.connect(self.play_pause)
+
+        self.ui.volumeSlider.setValue(self.volume)
+        self._mediaplayer.audio_set_volume(self.volume)
+        self.ui.volumeSlider.valueChanged.connect(self.set_volume)
+        self.ui.volumeSlider.positionClicked.connect(self.set_volume)
+
+        self.ui.btnMute.clicked.connect(self.toggle_muted)
 
         self.timer = QtCore.QTimer(self)
         self.timer.setInterval(100)
         self.timer.timeout.connect(self.update_ui)
 
+        self.setEnabled(False)
+
+    def play_track(self, track):
+
+        self._media = self._instance.media_new(track.path)
+
+        # Put the media in the media player
+        self._mediaplayer.set_media(self._media)
+
+        # Parse the metadata of the file
+        self._media.parse()
+
+        # Set the title of the track
+        self.ui.lblTrack.setText(f"{track.artist or '(artiste inconnu)'} - {track.title}")
+
+        self.play_pause()
+        self.currentTrack = track
+        self.setEnabled(True)
+
+        self.playStarted.emit(self.currentTrack)
+
     def play_pause(self):
         """Toggle play/pause status
         """
-        if self.mediaplayer.is_playing():
-            self.mediaplayer.pause()
-            self.playbutton.setText("Play")
-            self.is_paused = True
+        if self._mediaplayer.is_playing():
+            self._mediaplayer.pause()
+            self.ui.btnPlayPause.setIcon(QIcon(":/img/rsc/play.png"))
+            self._is_paused = True
             self.timer.stop()
         else:
-            if self.mediaplayer.play() == -1:
-                self.open_file()
+            if self._mediaplayer.play() == -1:
                 return
 
-            self.mediaplayer.play()
-            self.playbutton.setText("Pause")
+            self._mediaplayer.play()
+            self.ui.btnPlayPause.setIcon(QIcon(":/img/rsc/pause.png"))
             self.timer.start()
-            self.is_paused = False
+            self._is_paused = False
 
     def stop(self):
         """Stop player
         """
-        self.mediaplayer.stop()
-        self.playbutton.setText("Play")
-
-    def open_file(self):
-        """Open a media file in a MediaPlayer
-        """
+        self._mediaplayer.stop()
+        self.ui.btnPlayPause.setIcon(QIcon(":/img/rsc/play.png"))
+        self.ui.progressionSlider.setSliderPosition(0)
+        self.playEnded.emit(self.currentTrack)
 
-        dialog_txt = "Choose Media File"
-        filename = QtWidgets.QFileDialog.getOpenFileName(self, dialog_txt, os.path.expanduser('~'))
-        if not filename:
-            return
-
-        # getOpenFileName returns a tuple, so use only the actual file name
-        self.media = self.instance.media_new(filename[0])
+    def update_ui(self):
+        """Updates the user interface"""
 
-        # Put the media in the media player
-        self.mediaplayer.set_media(self.media)
+        # Set the slider's position to its corresponding media position
+        # Note that the setValue function only takes values of type int,
+        # so we must first convert the corresponding media position.
+        media_pos = int(self._mediaplayer.get_position() * 1000)
+        self.ui.progressionSlider.setValue(media_pos)
 
-        # Parse the metadata of the file
-        self.media.parse()
-
-        # Set the title of the track as window title
-        self.setWindowTitle(self.media.get_meta(0))
-
-        # The media player has to be 'connected' to the QFrame (otherwise the
-        # video would be displayed in it's own window). This is platform
-        # specific, so we must give the ID of the QFrame (or similar object) to
-        # vlc. Different platforms have different functions for this
-        if platform.system() == "Linux":  # for Linux using the X Server
-            self.mediaplayer.set_xwindow(int(self.videoframe.winId()))
-        elif platform.system() == "Windows":  # for Windows
-            self.mediaplayer.set_hwnd(int(self.videoframe.winId()))
-        elif platform.system() == "Darwin":  # for MacOS
-            self.mediaplayer.set_nsobject(int(self.videoframe.winId()))
+        # No need to call this function if nothing is played
+        if not self._mediaplayer.is_playing():
+            self.timer.stop()
 
-        self.play_pause()
+            # After the video finished, the play button stills shows "Pause",
+            # which is not the desired behavior of a media player.
+            # This fixes that "bug".
+            if not self._is_paused:
+                self.stop()
 
     def set_volume(self, volume):
         """Set the volume
         """
-        self.mediaplayer.audio_set_volume(volume)
+        self._mediaplayer.audio_set_volume(volume)
+        self.volume = volume
 
-    def set_position(self):
+    def set_position(self, position=None):
         """Set the movie position according to the position slider.
         """
-
         # The vlc MediaPlayer needs a float value between 0 and 1, Qt uses
         # integer variables, so you need a factor; the higher the factor, the
         # more precise are the results (1000 should suffice).
 
+        # if paused: resume
+        if self._is_paused:
+            self.play_pause()
+
         # Set the media position to where the slider was dragged
         self.timer.stop()
-        pos = self.positionslider.value()
-        self.mediaplayer.set_position(pos / 1000.0)
+        pos = self.ui.progressionSlider.value()
+        self._mediaplayer.set_position(pos / 1000.0)
         self.timer.start()
 
-    def update_ui(self):
-        """Updates the user interface"""
-
-        # Set the slider's position to its corresponding media position
-        # Note that the setValue function only takes values of type int,
-        # so we must first convert the corresponding media position.
-        media_pos = int(self.mediaplayer.get_position() * 1000)
-        self.positionslider.setValue(media_pos)
-
-        # No need to call this function if nothing is played
-        if not self.mediaplayer.is_playing():
-            self.timer.stop()
-
-            # After the video finished, the play button stills shows "Pause",
-            # which is not the desired behavior of a media player.
-            # This fixes that "bug".
-            if not self.is_paused:
-                self.stop()
+    def toggle_muted(self):
+        if not self._is_muted:
+            self._mediaplayer.audio_set_volume(0)
+            self.ui.btnMute.setIcon(QIcon(":/img/rsc/mute.png"))
+            self._is_muted = True
+        else:
+            self._mediaplayer.audio_set_volume(self.volume)
+            self.ui.btnMute.setIcon(QIcon(":/img/rsc/volume.png"))
+            self._is_muted = False

+ 192 - 0
ui/qt/widgets/vlcframe.ui

@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>VlcFrame</class>
+ <widget class="QFrame" name="VlcFrame">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>424</width>
+    <height>79</height>
+   </rect>
+  </property>
+  <property name="minimumSize">
+   <size>
+    <width>424</width>
+    <height>78</height>
+   </size>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>16777215</width>
+    <height>10000</height>
+   </size>
+  </property>
+  <property name="windowTitle">
+   <string>Frame</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout_2">
+   <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_2">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <property name="spacing">
+        <number>12</number>
+       </property>
+       <property name="leftMargin">
+        <number>12</number>
+       </property>
+       <property name="topMargin">
+        <number>12</number>
+       </property>
+       <property name="rightMargin">
+        <number>12</number>
+       </property>
+       <property name="bottomMargin">
+        <number>12</number>
+       </property>
+       <item>
+        <widget class="QToolButton" name="btnPlayPause">
+         <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>Lire</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../rsc.qrc">
+           <normaloff>:/img/rsc/play.png</normaloff>:/img/rsc/play.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="ClickableSlider" name="progressionSlider">
+         <property name="minimumSize">
+          <size>
+           <width>168</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="maximum">
+          <number>1000</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QToolButton" name="btnMute">
+         <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>Vol.</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../rsc.qrc">
+           <normaloff>:/img/rsc/volume.png</normaloff>:/img/rsc/volume.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="ClickableSlider" name="volumeSlider">
+         <property name="minimumSize">
+          <size>
+           <width>100</width>
+           <height>28</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>100</width>
+           <height>16777215</height>
+          </size>
+         </property>
+         <property name="value">
+          <number>50</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QLabel" name="lblTrack">
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>14</height>
+        </size>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="textFormat">
+        <enum>Qt::PlainText</enum>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="wordWrap">
+        <bool>true</bool>
+       </property>
+       <property name="textInteractionFlags">
+        <set>Qt::NoTextInteraction</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ClickableSlider</class>
+   <extends>QSlider</extends>
+   <header location="global">.clickable_slider.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="../rsc.qrc"/>
+ </resources>
+ <connections/>
+</ui>

+ 81 - 0
ui/qt/widgets/vlcframe_ui.py

@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'widgets/vlcframe.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_VlcFrame(object):
+    def setupUi(self, VlcFrame):
+        VlcFrame.setObjectName("VlcFrame")
+        VlcFrame.resize(424, 79)
+        VlcFrame.setMinimumSize(QtCore.QSize(424, 78))
+        VlcFrame.setMaximumSize(QtCore.QSize(16777215, 10000))
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(VlcFrame)
+        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_2.setSpacing(0)
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setSpacing(0)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setContentsMargins(12, 12, 12, 12)
+        self.horizontalLayout.setSpacing(12)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.btnPlayPause = QtWidgets.QToolButton(VlcFrame)
+        self.btnPlayPause.setMinimumSize(QtCore.QSize(28, 28))
+        self.btnPlayPause.setMaximumSize(QtCore.QSize(28, 28))
+        icon = QtGui.QIcon()
+        icon.addPixmap(QtGui.QPixmap(":/img/rsc/play.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnPlayPause.setIcon(icon)
+        self.btnPlayPause.setObjectName("btnPlayPause")
+        self.horizontalLayout.addWidget(self.btnPlayPause)
+        self.progressionSlider = ClickableSlider(VlcFrame)
+        self.progressionSlider.setMinimumSize(QtCore.QSize(168, 28))
+        self.progressionSlider.setMaximum(1000)
+        self.progressionSlider.setOrientation(QtCore.Qt.Horizontal)
+        self.progressionSlider.setObjectName("progressionSlider")
+        self.horizontalLayout.addWidget(self.progressionSlider)
+        self.btnMute = QtWidgets.QToolButton(VlcFrame)
+        self.btnMute.setMinimumSize(QtCore.QSize(28, 28))
+        self.btnMute.setMaximumSize(QtCore.QSize(28, 28))
+        icon1 = QtGui.QIcon()
+        icon1.addPixmap(QtGui.QPixmap(":/img/rsc/volume.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.btnMute.setIcon(icon1)
+        self.btnMute.setObjectName("btnMute")
+        self.horizontalLayout.addWidget(self.btnMute)
+        self.volumeSlider = ClickableSlider(VlcFrame)
+        self.volumeSlider.setMinimumSize(QtCore.QSize(100, 28))
+        self.volumeSlider.setMaximumSize(QtCore.QSize(100, 16777215))
+        self.volumeSlider.setProperty("value", 50)
+        self.volumeSlider.setOrientation(QtCore.Qt.Horizontal)
+        self.volumeSlider.setObjectName("volumeSlider")
+        self.horizontalLayout.addWidget(self.volumeSlider)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        self.lblTrack = QtWidgets.QLabel(VlcFrame)
+        self.lblTrack.setMinimumSize(QtCore.QSize(0, 14))
+        self.lblTrack.setText("")
+        self.lblTrack.setTextFormat(QtCore.Qt.PlainText)
+        self.lblTrack.setAlignment(QtCore.Qt.AlignCenter)
+        self.lblTrack.setWordWrap(True)
+        self.lblTrack.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+        self.lblTrack.setObjectName("lblTrack")
+        self.verticalLayout_2.addWidget(self.lblTrack)
+        self.horizontalLayout_2.addLayout(self.verticalLayout_2)
+
+        self.retranslateUi(VlcFrame)
+        QtCore.QMetaObject.connectSlotsByName(VlcFrame)
+
+    def retranslateUi(self, VlcFrame):
+        _translate = QtCore.QCoreApplication.translate
+        VlcFrame.setWindowTitle(_translate("VlcFrame", "Frame"))
+        self.btnPlayPause.setText(_translate("VlcFrame", "Lire"))
+        self.btnMute.setText(_translate("VlcFrame", "Vol."))
+from .clickable_slider import ClickableSlider
+from .. import rsc_rc

+ 7 - 4
ui/window.py

@@ -22,7 +22,7 @@ logger = Logger.get()
 
 class MainWindow(QMainWindow):
     def __init__(self):
-        super(MainWindow, self).__init__()
+        super().__init__()
 
         # db
         # self.qdb = QSqlDatabase.addDatabase("QSQLITE")
@@ -59,7 +59,7 @@ class MainWindow(QMainWindow):
         self.ui.explorerTable.populate()
         self.ui.explorerTable.trackSelected.connect(self.explorer_tree_selection_changed)
         self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree)
-
+        self.ui.explorerTrackMetaStack.setCurrentIndex(0)
         self.ui.explorerTrackPlay.clicked.connect(self.play_track)
 
         # Page 5 - settings
@@ -85,8 +85,9 @@ class MainWindow(QMainWindow):
             self.ui.explorerLblTrackTitle.setText(track.title)
             self.ui.explorerLblTrackArtist.setText(track.artist)
             self.ui.explorerLblTrackAlbum.setText(track.album)
-            self.ui.explorerLblTrackNumber.setText(str(track.track_num))
-            # self.ui.lblTrackPath.setText(track.path)
+            self.ui.explorerLblTrackNumber.setText(
+                str(track.track_num if track.track_num is not None else "")
+            )
             self.ui.explorerTrackMetaStack.setCurrentIndex(1)
         else:
             self.ui.explorerTrackMetaStack.setCurrentIndex(0)
@@ -112,6 +113,8 @@ class MainWindow(QMainWindow):
         track = self.ui.explorerTable.selected_track()
         print("play ", track)
 
+        self.ui.vlcFrame.play_track(track)
+
     def add_music_folder(self):
         path = QFileDialog.getExistingDirectory(self, "Sélectionnez le dossier à ajouter")
         if not path:

Деякі файли не було показано, через те що забагато файлів було змінено