Переглянути джерело

add explorerTree and vlc basic frame

olinox 4 роки тому
батько
коміт
1c2650a711
16 змінених файлів з 1583 додано та 1737 видалено
  1. 7 24
      core/db.py
  2. 34 17
      core/indexer.py
  3. 1 1
      core/models.py
  4. 10 9
      core/repositories.py
  5. 3 3
      main.py
  6. 251 156
      ui/qt/main.ui
  7. 92 46
      ui/qt/main_ui.py
  8. 27 26
      ui/qt/rsc.qrc
  9. 0 0
      ui/qt/rsc/album.png
  10. 0 0
      ui/qt/rsc/artist.png
  11. 0 0
      ui/qt/rsc/music.png
  12. BIN
      ui/qt/rsc/play.png
  13. 926 1425
      ui/qt/rsc_rc.py
  14. 36 13
      ui/qt/widgets/explorertable.py
  15. 175 0
      ui/qt/widgets/vlcframe.py
  16. 21 17
      ui/window.py

+ 7 - 24
core/db.py

@@ -2,7 +2,7 @@ from contextlib import contextmanager
 
 from sqlalchemy import create_engine
 from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy.orm import Session
+# from sqlalchemy.orm import Session
 from sqlalchemy.orm import sessionmaker
 from sqlalchemy.orm.scoping import scoped_session
 
@@ -14,29 +14,12 @@ engine = create_engine(
     echo=constants.SQL_ALCHEMY_VERBOSE)
 Base = declarative_base()
 
-# session_factory = sessionmaker(autocommit=False, autoflush=False, bind=engine)
-# session = scoped_session(session_factory)
-# # session_ = Session()
-# #
-# #
+session_factory = sessionmaker(autocommit=False, autoflush=False, bind=engine)
+Session = scoped_session(session_factory)
+# session_ = Session()
 
-
-def session():
-    return Session(engine)
-
-
-@contextmanager
-def session_scope():
-    """Provide a transactional scope around a series of operations."""
-    session = Session()
-    try:
-        yield session
-        session.commit()
-    except:
-        session.rollback()
-        raise
-    finally:
-        session.close()
+# def session():
+#     return Session(engine)
 
 
 def create():
@@ -46,5 +29,5 @@ def create():
 
 
 def close():
-    # session.remove()
+    Session.remove()
     engine.dispose()

+ 34 - 17
core/indexer.py

@@ -6,6 +6,7 @@ from threading import Thread, Lock
 import vlc
 from path import Path
 
+from core import db
 from core.exceptions import NotSupportedFile
 from core.file_utilities import is_media_file_ext, hash_file
 from core.logging_ import Logger
@@ -14,6 +15,7 @@ from core.repositories import MusicFolderRepository, TrackRepository
 
 logger = Logger.get()
 
+
 class CyclicThread(Thread):
     DELAY = 0
 
@@ -38,6 +40,8 @@ class CyclicThread(Thread):
             if self.interrupted:
                 break
 
+            time.sleep(0.1)
+
     def trigger(self):
         self.last_exec = 0
 
@@ -53,12 +57,16 @@ class Discoverer(CyclicThread):
         self.indexer = indexer
 
     def act(self):
-        music_folder_repo = MusicFolderRepository()
-        track_repo = TrackRepository()
+        session = db.Session()
+        music_folder_repo = MusicFolderRepository(session)
+        music_folders = music_folder_repo.get_all()
+
+        track_repo = TrackRepository(session)
+        tracks = track_repo.get_all()
 
-        index = {t.path: t for t in track_repo.get_all()}
+        index = {t.path: t for t in tracks}
 
-        for music_folder in music_folder_repo.get_all():
+        for music_folder in music_folders:
             music_folder_path = Path(music_folder.path)
 
             for filename in music_folder_path.walkfiles():
@@ -82,6 +90,8 @@ class Discoverer(CyclicThread):
 
 
 class Indexer(CyclicThread):
+    DELAY = 2
+    BUFFER_SIZE = 100
 
     def __init__(self):
         CyclicThread.__init__(self)
@@ -97,12 +107,27 @@ class Indexer(CyclicThread):
         super().start()
 
     def act(self):
-        if self.deque:
+        buffer = []
+        session = db.Session()
+        track_repo = TrackRepository(session)
+
+        for _ in range(self.BUFFER_SIZE):
             try:
-                track = self.index(self.deque.pop())
+                track = self.index(track_repo, self.deque.pop())
+                buffer.append(track)
             except (FileNotFoundError, NotSupportedFile) as e:
                 logger.warning("Error during indexation: %s" % e)
-                return
+                continue
+            except IndexError:
+                break
+
+        if buffer:
+            for track in buffer:
+                if track.id is None:
+                    track_repo.create(track)
+
+            logger.info(f"{len(buffer)} tracks indexed")
+            track_repo.commit()
 
     def put(self, filename_or_track_id):
         self.deque.appendleft(filename_or_track_id)
@@ -111,9 +136,8 @@ class Indexer(CyclicThread):
         return filename_or_track_id in self.deque
 
     @staticmethod
-    def index(filename_or_track_id):
+    def index(track_repo, filename_or_track_id):
         """ index a media file from the filesystem or a track id """
-        track_repo = TrackRepository()
 
         if type(filename_or_track_id) is int:
             track = track_repo.get_by_id(filename_or_track_id)
@@ -123,8 +147,7 @@ class Indexer(CyclicThread):
             if not filename.exists() and track.status != Track.STATUS_UNAVAILABLE:
                 logger.debug('Index - missing: %s' % filename)
                 track.status = Track.STATUS_UNAVAILABLE
-                track_repo.commit()
-                return
+                return track
         else:
             filename = Path(filename_or_track_id)
             if not filename.exists():
@@ -158,12 +181,6 @@ class Indexer(CyclicThread):
         track.path = filename
         track.hash = track_hash
 
-        if track.id is None:
-            track_repo.create(track)
-
-        logger.debug('Index - updated: %s' % filename)
-
-        track_repo.commit()
         return track
 
     def stop(self):

+ 1 - 1
core/models.py

@@ -83,6 +83,6 @@ class SessionTrack(Model):
 if __name__ == "__main__":
     from core import constants
 
-    session = db.session()
+    session = db.Session()
     for track in session.query(Track).all():
         print(track)

+ 10 - 9
core/repositories.py

@@ -5,8 +5,8 @@ from core.models import MusicFolder, Track, Tag, TrackTag, SessionTrack, Session
 class Repository:
     MODEL_CLS = None
 
-    def __init__(self):
-        self.session = db.session()
+    def __init__(self, session=None):
+        self.session = session if session else db.Session()
 
     def query(self):
         return self.session.query(self.MODEL_CLS)
@@ -40,21 +40,21 @@ class Repository:
             self.commit()
 
     # def __del__(self):
-    #     self.session.close()
+    #     self.session.remove()
 
 
 class MusicFolderRepository(Repository):
     MODEL_CLS = MusicFolder
 
-    def __init__(self):
-        super().__init__()
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
 
 
 class TagRepository(Repository):
     MODEL_CLS = Tag
 
-    def __init__(self):
-        super().__init__()
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
 
     def get_by_track_id(self, track_id):
         return self.session.query(Tag)\
@@ -103,12 +103,13 @@ class TrackRepository(Repository):
             .group_by(Track.album)\
             .all()
 
+
 class SessionRepository(Repository):
     TABLE_NAME = "Sessions"
     MODEL_CLS = Track
 
-    def __init__(self):
-        super().__init__()
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
 
     def get_by_track_id(self, track_id):
         return self.session.query(Session)\

+ 3 - 3
main.py

@@ -44,14 +44,14 @@ except FileExistsError:
 # Start UI
 logger.info("-- Start --")
 app = QApplication(sys.argv)
-# indexer = Indexer()
-# indexer.start()
+indexer = Indexer()
+indexer.start()
 main_window = MainWindow()
 main_window.show()
 try:
     r = app.exec_()
 finally:
-    # indexer.stop()
+    indexer.stop()
     db.close()
 
 logger.info("-- Closed --")

+ 251 - 156
ui/qt/main.ui

@@ -227,6 +227,18 @@
                   <property name="editTriggers">
                    <set>QAbstractItemView::NoEditTriggers</set>
                   </property>
+                  <property name="alternatingRowColors">
+                   <bool>true</bool>
+                  </property>
+                  <property name="indentation">
+                   <number>10</number>
+                  </property>
+                  <property name="animated">
+                   <bool>true</bool>
+                  </property>
+                  <property name="wordWrap">
+                   <bool>true</bool>
+                  </property>
                   <attribute name="headerVisible">
                    <bool>false</bool>
                   </attribute>
@@ -235,6 +247,11 @@
                     <string notr="true">1</string>
                    </property>
                   </column>
+                  <column>
+                   <property name="text">
+                    <string>2</string>
+                   </property>
+                  </column>
                  </widget>
                 </item>
                 <item>
@@ -307,179 +324,251 @@
                     <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>
+                    <widget class="QStackedWidget" name="explorerTrackMetaStack">
+                     <property name="minimumSize">
+                      <size>
+                       <width>0</width>
+                       <height>50</height>
+                      </size>
                      </property>
-                     <property name="bottomMargin">
-                      <number>0</number>
+                     <property name="currentIndex">
+                      <number>1</number>
                      </property>
-                     <item>
-                      <layout class="QHBoxLayout" name="horizontalLayout_13">
+                     <widget class="QWidget" name="page">
+                      <layout class="QVBoxLayout" name="verticalLayout_11">
                        <item>
-                        <widget class="QLabel" name="label_11">
+                        <widget class="QLabel" name="label_2">
                          <property name="text">
-                          <string>Informations sur la piste:</string>
-                         </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QToolButton" name="toolButton_3">
-                         <property name="minimumSize">
-                          <size>
-                           <width>28</width>
-                           <height>28</height>
-                          </size>
-                         </property>
-                         <property name="text">
-                          <string/>
-                         </property>
-                         <property name="icon">
-                          <iconset resource="rsc.qrc">
-                           <normaloff>:/img/rsc/edit.png</normaloff>:/img/rsc/edit.png</iconset>
+                          <string>Pas de piste sélectionnée</string>
                          </property>
                         </widget>
                        </item>
                       </layout>
-                     </item>
-                     <item>
-                      <layout class="QHBoxLayout" name="horizontalLayout_8">
+                     </widget>
+                     <widget class="QWidget" name="page_6">
+                      <layout class="QHBoxLayout" name="horizontalLayout_16">
                        <property name="spacing">
                         <number>0</number>
                        </property>
-                       <property name="sizeConstraint">
-                        <enum>QLayout::SetMinimumSize</enum>
+                       <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="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="lblTrackTitle">
-                         <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="lblTrackArtist">
-                         <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="lblTrackAlbum">
-                         <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>
+                        <layout class="QVBoxLayout" name="verticalLayout_9">
+                         <property name="spacing">
+                          <number>0</number>
                          </property>
-                         <property name="text">
-                          <string>N°</string>
+                         <property name="sizeConstraint">
+                          <enum>QLayout::SetMinimumSize</enum>
                          </property>
-                        </widget>
-                       </item>
-                       <item>
-                        <widget class="QLabel" name="lblTrackNumber">
-                         <property name="text">
-                          <string/>
+                         <property name="bottomMargin">
+                          <number>0</number>
                          </property>
-                        </widget>
+                         <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>
-                     </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>
+                     </widget>
+                    </widget>
                    </item>
                   </layout>
                  </widget>
@@ -746,7 +835,7 @@
          </widget>
         </item>
         <item>
-         <widget class="QFrame" name="vlcFrame">
+         <widget class="VlcFrame" name="vlcFrame">
           <property name="minimumSize">
            <size>
             <width>500</width>
@@ -781,6 +870,12 @@
    <extends>QTreeWidget</extends>
    <header location="global">.widgets.explorertable.h</header>
   </customwidget>
+  <customwidget>
+   <class>VlcFrame</class>
+   <extends>QFrame</extends>
+   <header location="global">.widgets.vlcframe.h</header>
+   <container>1</container>
+  </customwidget>
  </customwidgets>
  <resources>
   <include location="rsc.qrc"/>

+ 92 - 46
ui/qt/main_ui.py

@@ -21,7 +21,7 @@ class Ui_mainWindow(object):
         font.setPointSize(8)
         mainWindow.setFont(font)
         icon = QtGui.QIcon()
-        icon.addPixmap(QtGui.QPixmap(":/img/rsc/dancing.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon.addPixmap(QtGui.QPixmap(":/img/rsc/constellations.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         mainWindow.setWindowIcon(icon)
         self.centralwidget = QtWidgets.QWidget(mainWindow)
         self.centralwidget.setObjectName("centralwidget")
@@ -121,6 +121,10 @@ class Ui_mainWindow(object):
         self.explorerTable = ExplorerTable(self.page_3)
         self.explorerTable.setMinimumSize(QtCore.QSize(383, 0))
         self.explorerTable.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.explorerTable.setAlternatingRowColors(True)
+        self.explorerTable.setIndentation(10)
+        self.explorerTable.setAnimated(True)
+        self.explorerTable.setWordWrap(True)
         self.explorerTable.setObjectName("explorerTable")
         self.explorerTable.headerItem().setText(0, "1")
         self.explorerTable.header().setVisible(False)
@@ -137,7 +141,8 @@ class Ui_mainWindow(object):
         self.verticalLayout_5.setContentsMargins(10, 10, 10, 10)
         self.verticalLayout_5.setObjectName("verticalLayout_5")
         self.explorerTrackMetaFrame = QtWidgets.QFrame(self.page_3)
-        self.explorerTrackMetaFrame.setMaximumSize(QtCore.QSize(16777215, 100))
+        self.explorerTrackMetaFrame.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")
@@ -145,6 +150,23 @@ class Ui_mainWindow(object):
         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.setMinimumSize(QtCore.QSize(0, 50))
+        self.explorerTrackMetaStack.setObjectName("explorerTrackMetaStack")
+        self.page = QtWidgets.QWidget()
+        self.page.setObjectName("page")
+        self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.page)
+        self.verticalLayout_11.setObjectName("verticalLayout_11")
+        self.label_2 = QtWidgets.QLabel(self.page)
+        self.label_2.setObjectName("label_2")
+        self.verticalLayout_11.addWidget(self.label_2)
+        self.explorerTrackMetaStack.addWidget(self.page)
+        self.page_6 = QtWidgets.QWidget()
+        self.page_6.setObjectName("page_6")
+        self.horizontalLayout_16 = QtWidgets.QHBoxLayout(self.page_6)
+        self.horizontalLayout_16.setContentsMargins(0, 0, 0, 0)
+        self.horizontalLayout_16.setSpacing(0)
+        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)
@@ -152,72 +174,87 @@ class Ui_mainWindow(object):
         self.verticalLayout_9.setObjectName("verticalLayout_9")
         self.horizontalLayout_13 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_13.setObjectName("horizontalLayout_13")
-        self.label_11 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_11 = QtWidgets.QLabel(self.page_6)
         self.label_11.setObjectName("label_11")
         self.horizontalLayout_13.addWidget(self.label_11)
-        self.toolButton_3 = QtWidgets.QToolButton(self.explorerTrackMetaFrame)
-        self.toolButton_3.setMinimumSize(QtCore.QSize(28, 28))
-        self.toolButton_3.setText("")
+        self.explorerTrackEdit = QtWidgets.QToolButton(self.page_6)
+        self.explorerTrackEdit.setMinimumSize(QtCore.QSize(28, 28))
+        self.explorerTrackEdit.setMaximumSize(QtCore.QSize(28, 28))
+        self.explorerTrackEdit.setText("")
         icon3 = QtGui.QIcon()
         icon3.addPixmap(QtGui.QPixmap(":/img/rsc/edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.toolButton_3.setIcon(icon3)
-        self.toolButton_3.setObjectName("toolButton_3")
-        self.horizontalLayout_13.addWidget(self.toolButton_3)
+        self.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)
         self.horizontalLayout_8.setSpacing(0)
         self.horizontalLayout_8.setObjectName("horizontalLayout_8")
-        self.label_4 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_4 = QtWidgets.QLabel(self.page_6)
         self.label_4.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_4.setObjectName("label_4")
         self.horizontalLayout_8.addWidget(self.label_4)
-        self.lblTrackTitle = QtWidgets.QLabel(self.explorerTrackMetaFrame)
-        self.lblTrackTitle.setText("")
-        self.lblTrackTitle.setObjectName("lblTrackTitle")
-        self.horizontalLayout_8.addWidget(self.lblTrackTitle)
+        self.explorerLblTrackTitle = QtWidgets.QLabel(self.page_6)
+        self.explorerLblTrackTitle.setText("")
+        self.explorerLblTrackTitle.setObjectName("explorerLblTrackTitle")
+        self.horizontalLayout_8.addWidget(self.explorerLblTrackTitle)
         self.verticalLayout_9.addLayout(self.horizontalLayout_8)
         self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_9.setObjectName("horizontalLayout_9")
-        self.label_6 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_6 = QtWidgets.QLabel(self.page_6)
         self.label_6.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_6.setObjectName("label_6")
         self.horizontalLayout_9.addWidget(self.label_6)
-        self.lblTrackArtist = QtWidgets.QLabel(self.explorerTrackMetaFrame)
-        self.lblTrackArtist.setText("")
-        self.lblTrackArtist.setObjectName("lblTrackArtist")
-        self.horizontalLayout_9.addWidget(self.lblTrackArtist)
+        self.explorerLblTrackArtist = QtWidgets.QLabel(self.page_6)
+        self.explorerLblTrackArtist.setText("")
+        self.explorerLblTrackArtist.setObjectName("explorerLblTrackArtist")
+        self.horizontalLayout_9.addWidget(self.explorerLblTrackArtist)
         self.verticalLayout_9.addLayout(self.horizontalLayout_9)
         self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_10.setObjectName("horizontalLayout_10")
-        self.label_7 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_7 = QtWidgets.QLabel(self.page_6)
         self.label_7.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_7.setObjectName("label_7")
         self.horizontalLayout_10.addWidget(self.label_7)
-        self.lblTrackAlbum = QtWidgets.QLabel(self.explorerTrackMetaFrame)
-        self.lblTrackAlbum.setText("")
-        self.lblTrackAlbum.setObjectName("lblTrackAlbum")
-        self.horizontalLayout_10.addWidget(self.lblTrackAlbum)
+        self.explorerLblTrackAlbum = QtWidgets.QLabel(self.page_6)
+        self.explorerLblTrackAlbum.setText("")
+        self.explorerLblTrackAlbum.setObjectName("explorerLblTrackAlbum")
+        self.horizontalLayout_10.addWidget(self.explorerLblTrackAlbum)
         self.verticalLayout_9.addLayout(self.horizontalLayout_10)
         self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_11.setObjectName("horizontalLayout_11")
-        self.label_8 = QtWidgets.QLabel(self.explorerTrackMetaFrame)
+        self.label_8 = QtWidgets.QLabel(self.page_6)
         self.label_8.setMaximumSize(QtCore.QSize(80, 16777215))
         self.label_8.setObjectName("label_8")
         self.horizontalLayout_11.addWidget(self.label_8)
-        self.lblTrackNumber = QtWidgets.QLabel(self.explorerTrackMetaFrame)
-        self.lblTrackNumber.setText("")
-        self.lblTrackNumber.setObjectName("lblTrackNumber")
-        self.horizontalLayout_11.addWidget(self.lblTrackNumber)
+        self.explorerLblTrackNumber = QtWidgets.QLabel(self.page_6)
+        self.explorerLblTrackNumber.setText("")
+        self.explorerLblTrackNumber.setObjectName("explorerLblTrackNumber")
+        self.horizontalLayout_11.addWidget(self.explorerLblTrackNumber)
         self.verticalLayout_9.addLayout(self.horizontalLayout_11)
-        self.verticalLayout_10.addLayout(self.verticalLayout_9)
-        self.verticalLayout_5.addWidget(self.explorerTrackMetaFrame)
-        self.label_10 = QtWidgets.QLabel(self.page_3)
+        self.label_10 = QtWidgets.QLabel(self.page_6)
+        self.label_10.setMinimumSize(QtCore.QSize(361, 14))
+        self.label_10.setMaximumSize(QtCore.QSize(361, 14))
         self.label_10.setObjectName("label_10")
-        self.verticalLayout_5.addWidget(self.label_10)
-        self.explorerTrackNotepad = QtWidgets.QTextBrowser(self.page_3)
+        self.verticalLayout_9.addWidget(self.label_10)
+        self.explorerTrackNotepad = QtWidgets.QTextBrowser(self.page_6)
+        self.explorerTrackNotepad.setMinimumSize(QtCore.QSize(0, 120))
+        self.explorerTrackNotepad.setUndoRedoEnabled(True)
         self.explorerTrackNotepad.setObjectName("explorerTrackNotepad")
-        self.verticalLayout_5.addWidget(self.explorerTrackNotepad)
+        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)
@@ -226,20 +263,23 @@ class Ui_mainWindow(object):
         self.horizontalLayout_12.setObjectName("horizontalLayout_12")
         self.explorerAddToPlaylist = QtWidgets.QToolButton(self.page_3)
         self.explorerAddToPlaylist.setMinimumSize(QtCore.QSize(28, 28))
-        icon4 = QtGui.QIcon()
-        icon4.addPixmap(QtGui.QPixmap(":/img/rsc/plus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerAddToPlaylist.setIcon(icon4)
+        self.explorerAddToPlaylist.setMaximumSize(QtCore.QSize(28, 28))
+        icon5 = QtGui.QIcon()
+        icon5.addPixmap(QtGui.QPixmap(":/img/rsc/plus.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))
-        icon5 = QtGui.QIcon()
-        icon5.addPixmap(QtGui.QPixmap(":/img/rsc/delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
-        self.explorerRemoveFromPlaylist.setIcon(icon5)
+        self.explorerRemoveFromPlaylist.setMaximumSize(QtCore.QSize(28, 28))
+        icon6 = QtGui.QIcon()
+        icon6.addPixmap(QtGui.QPixmap(":/img/rsc/minus.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.explorerRemoveFromPlaylist.setIcon(icon6)
         self.explorerRemoveFromPlaylist.setObjectName("explorerRemoveFromPlaylist")
         self.horizontalLayout_12.addWidget(self.explorerRemoveFromPlaylist)
         self.explorerSelectPlaylist = QtWidgets.QComboBox(self.page_3)
         self.explorerSelectPlaylist.setMinimumSize(QtCore.QSize(0, 28))
+        self.explorerSelectPlaylist.setMaximumSize(QtCore.QSize(16777215, 28))
         self.explorerSelectPlaylist.setObjectName("explorerSelectPlaylist")
         self.horizontalLayout_12.addWidget(self.explorerSelectPlaylist)
         self.verticalLayout_5.addLayout(self.horizontalLayout_12)
@@ -249,7 +289,6 @@ class Ui_mainWindow(object):
         self.explorerPlaylist.setRowCount(0)
         self.verticalLayout_5.addWidget(self.explorerPlaylist)
         self.verticalLayout_5.setStretch(0, 1)
-        self.verticalLayout_5.setStretch(2, 1)
         self.horizontalLayout_6.addLayout(self.verticalLayout_5)
         self.horizontalLayout_4.addLayout(self.horizontalLayout_6)
         self.stack.addWidget(self.page_3)
@@ -302,14 +341,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))
-        self.musicFoldersRemoveButton.setIcon(icon5)
+        icon7 = QtGui.QIcon()
+        icon7.addPixmap(QtGui.QPixmap(":/img/rsc/delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.musicFoldersRemoveButton.setIcon(icon7)
         self.musicFoldersRemoveButton.setObjectName("musicFoldersRemoveButton")
         self.horizontalLayout_7.addWidget(self.musicFoldersRemoveButton)
         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.horizontalLayout_7.addItem(spacerItem)
         self.musicFoldersAddButton = QtWidgets.QPushButton(self.page_5)
         self.musicFoldersAddButton.setMinimumSize(QtCore.QSize(128, 32))
-        self.musicFoldersAddButton.setIcon(icon4)
+        self.musicFoldersAddButton.setIcon(icon5)
         self.musicFoldersAddButton.setObjectName("musicFoldersAddButton")
         self.horizontalLayout_7.addWidget(self.musicFoldersAddButton)
         self.verticalLayout_6.addLayout(self.horizontalLayout_7)
@@ -323,7 +364,7 @@ class Ui_mainWindow(object):
         self.horizontalLayout_5.addLayout(self.verticalLayout_6)
         self.stack.addWidget(self.page_5)
         self.verticalLayout_7.addWidget(self.stack)
-        self.vlcFrame = QtWidgets.QFrame(self.centralwidget)
+        self.vlcFrame = VlcFrame(self.centralwidget)
         self.vlcFrame.setMinimumSize(QtCore.QSize(500, 100))
         self.vlcFrame.setMaximumSize(QtCore.QSize(16777215, 100))
         self.vlcFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
@@ -341,7 +382,8 @@ class Ui_mainWindow(object):
 
         self.retranslateUi(mainWindow)
         self.menu.setCurrentRow(-1)
-        self.stack.setCurrentIndex(0)
+        self.stack.setCurrentIndex(2)
+        self.explorerTrackMetaStack.setCurrentIndex(1)
         QtCore.QMetaObject.connectSlotsByName(mainWindow)
 
     def retranslateUi(self, mainWindow):
@@ -355,8 +397,11 @@ class Ui_mainWindow(object):
         item.setText(_translate("mainWindow", "Ordre"))
         item = self.sessionPlaylist.horizontalHeaderItem(2)
         item.setText(_translate("mainWindow", "Titre"))
+        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_4.setText(_translate("mainWindow", "Titre"))
         self.label_6.setText(_translate("mainWindow", "Artiste"))
         self.label_7.setText(_translate("mainWindow", "Album"))
@@ -376,4 +421,5 @@ class Ui_mainWindow(object):
         self.musicFoldersRemoveButton.setText(_translate("mainWindow", "Supprimer"))
         self.musicFoldersAddButton.setText(_translate("mainWindow", "Ajouter"))
 from .widgets.explorertable import ExplorerTable
+from .widgets.vlcframe import VlcFrame
 from . import rsc_rc

+ 27 - 26
ui/qt/rsc.qrc

@@ -1,28 +1,29 @@
 <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/man-user.png</file>
-    <file>rsc/music-album.png</file>
-    <file>rsc/music-note.png</file>
-    <file>rsc/next.png</file>
-    <file>rsc/pdf.png</file>
-    <file>rsc/plus.png</file>
-    <file>rsc/previous.png</file>
-    <file>rsc/question.png</file>
-    <file>rsc/refresh-page-option.png</file>
-    <file>rsc/remove.png</file>
-    <file>rsc/save.png</file>
-    <file>rsc/edit.png</file>
-    <file>rsc/swap.png</file>
-    <file>rsc/constellations.svg</file>
-  </qresource>
+    <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>
 </RCC>

+ 0 - 0
ui/qt/rsc/music-album.png → ui/qt/rsc/album.png


+ 0 - 0
ui/qt/rsc/man-user.png → ui/qt/rsc/artist.png


+ 0 - 0
ui/qt/rsc/music-note.png → ui/qt/rsc/music.png


BIN
ui/qt/rsc/play.png


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


+ 36 - 13
ui/qt/widgets/explorertable.py

@@ -1,5 +1,8 @@
+from PyQt5.QtCore import pyqtSlot, pyqtSignal
+from PyQt5.QtGui import QIcon
 from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem
 
+from core import db
 from core.logging_ import Logger
 from core.repositories import TrackRepository
 
@@ -7,45 +10,65 @@ logger = Logger.get()
 
 
 class ExplorerTable(QTreeWidget):
+    trackSelected = pyqtSignal(object)
+
     def __init__(self, parent):
         super(QTreeWidget, self).__init__(parent)
+        self.setColumnCount(3)
+        self.setColumnWidth(0, 54)
+        self.hideColumn(2)
 
     def populate(self):
-        track_repo = TrackRepository()
+        session = db.Session()
+        track_repo = TrackRepository(session)
         self.clear()
 
         artist_folders = {}
         album_folders = {}
-        orphans = []
         tracks = track_repo.get_all()
 
-        logger.info(".. start populating explorer table - 1")
+        self.setUpdatesEnabled(False)
 
         for track in tracks:
-            # list artists
             if track.artist and track.artist not in artist_folders:
-                item = QTreeWidgetItem([track.artist])
+                item = QTreeWidgetItem(self)
+                item.setIcon(0, QIcon(":/img/rsc/artist.png"))
+                item.setText(1, track.artist)
                 artist_folders[track.artist] = item
 
         for track in tracks:
             # list albums with artists
             if track.artist and track.album and (track.artist, track.album) not in album_folders:
-                item = QTreeWidgetItem([track.album])
+                item = QTreeWidgetItem(artist_folders[track.artist])
+                item.setIcon(0, QIcon(":/img/rsc/album.png"))
+                item.setText(1, track.album)
                 album_folders[(track.artist, track.album)] = item
 
         for track in tracks:
-            # list tracks
-
             if track.artist and track.album:
                 parent = album_folders[(track.artist, track.album)]
             elif track.artist:
                 parent = artist_folders[track.artist]
             else:
-                orphans.append(QTreeWidgetItem([track.title]))
+                parent = self
+
+            item = QTreeWidgetItem(parent)
+            item.setIcon(0, QIcon(":/img/rsc/music.png"))
+            item.setText(1, track.title)
+            item.setData(2, 0, track.id)
 
-        self.setUpdatesEnabled(False)
-        self.insertTopLevelItems(0, orphans)
-        self.insertTopLevelItems(0, artist_folders.values())
         self.setUpdatesEnabled(True)
 
-        logger.info(".. explorer table populated")
+    def selected_track(self):
+        track_id = self.selectionModel().selection().indexes()[2].data(2)
+        if not track_id:
+            return None
+        return TrackRepository().get_by_id(int(track_id))
+
+    def selectionChanged(self, selected, _):
+        track_id = selected.indexes()[2].data(2)
+        if track_id:
+            track = TrackRepository().get_by_id(int(track_id))
+        else:
+            track = None
+        self.trackSelected.emit(track)

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

@@ -0,0 +1,175 @@
+import platform
+import sys
+
+import vlc
+from PyQt5 import QtWidgets, QtGui, QtCore
+
+
+class VlcFrame(QtWidgets.QFrame):
+
+    def __init__(self, master=None):
+        super().__init__(master)
+
+        # Create a basic vlc instance
+        self.instance = vlc.Instance()
+
+        self.media = None
+
+        # Create an empty vlc media player
+        self.mediaplayer = self.instance.media_player_new()
+
+        self.create_ui()
+        self.is_paused = False
+
+    def create_ui(self):
+        """Set up the user interface, signals & slots
+        """
+        self.widget = QtWidgets.QWidget(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.timer = QtCore.QTimer(self)
+        self.timer.setInterval(100)
+        self.timer.timeout.connect(self.update_ui)
+
+    def play_pause(self):
+        """Toggle play/pause status
+        """
+        if self.mediaplayer.is_playing():
+            self.mediaplayer.pause()
+            self.playbutton.setText("Play")
+            self.is_paused = True
+            self.timer.stop()
+        else:
+            if self.mediaplayer.play() == -1:
+                self.open_file()
+                return
+
+            self.mediaplayer.play()
+            self.playbutton.setText("Pause")
+            self.timer.start()
+            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
+        """
+
+        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])
+
+        # 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 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()))
+
+        self.play_pause()
+
+    def set_volume(self, volume):
+        """Set the volume
+        """
+        self.mediaplayer.audio_set_volume(volume)
+
+    def set_position(self):
+        """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).
+
+        # Set the media position to where the slider was dragged
+        self.timer.stop()
+        pos = self.positionslider.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()

+ 21 - 17
ui/window.py

@@ -19,14 +19,15 @@ from ui.qt.main_ui import Ui_mainWindow
 
 logger = Logger.get()
 
+
 class MainWindow(QMainWindow):
     def __init__(self):
         super(MainWindow, self).__init__()
 
         # db
-        self.qdb = QSqlDatabase.addDatabase("QSQLITE")
-        self.qdb.setDatabaseName(constants.DB_PATH)
-        self.qdb.open()
+        # self.qdb = QSqlDatabase.addDatabase("QSQLITE")
+        # self.qdb.setDatabaseName(constants.DB_PATH)
+        # self.qdb.open()
 
         self.createWidgets()
 
@@ -45,30 +46,28 @@ class MainWindow(QMainWindow):
             (':/img/rsc/settings.png', 'Paramètres'),
         ]
 
-
-
         for i, item in enumerate(menu_items):
             icon, lbl = item
             item = QListWidgetItem(QIcon(icon), lbl)
             item.index = i
             self.ui.menu.addItem(item)
 
-
         # Menu item clicked
         self.ui.menu.itemClicked.connect(self.menu_item_selected)
 
         # Page 3 - explorer
         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.explorerTrackPlay.clicked.connect(self.play_track)
+
         # Page 5 - settings
         self.ui.musicFoldersTable.setColumnHidden(0, 1)
         self.ui.musicFoldersAddButton.clicked.connect(self.add_music_folder)
         self.ui.musicFoldersRemoveButton.clicked.connect(self.remove_music_folder)
         self.populate_music_folders_table()
 
-        logger.info("d")
-
     def menu_item_selected(self, e):
         self.ui.stack.setCurrentIndex(e.index)
 
@@ -81,15 +80,16 @@ class MainWindow(QMainWindow):
     def refresh_explorer_tree(self):
         self.ui.explorerTable.populate()
 
-    def explorer_tree_selection_changed(self, model_index):
-        track_id = model_index.indexes()[0].data(0)
-        track = TrackRepository().get_by_id(int(track_id))
-
-        self.ui.lblTrackTitle.setText(track.title)
-        self.ui.lblTrackArtist.setText(track.artist)
-        self.ui.lblTrackAlbum.setText(track.album)
-        self.ui.lblTrackNumber.setText(str(track.track_num))
-        # self.ui.lblTrackPath.setText(track.path)
+    def explorer_tree_selection_changed(self, track):
+        if track:
+            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.explorerTrackMetaStack.setCurrentIndex(1)
+        else:
+            self.ui.explorerTrackMetaStack.setCurrentIndex(0)
 
     def populate_music_folders_table(self):
         music_folders = MusicFolderRepository().get_all()
@@ -108,6 +108,10 @@ class MainWindow(QMainWindow):
 
             self.ui.musicFoldersTable.setItem(i, 2, QTableWidgetItem(music_folder.path))
 
+    def play_track(self):
+        track = self.ui.explorerTable.selected_track()
+        print("play ", track)
+
     def add_music_folder(self):
         path = QFileDialog.getExistingDirectory(self, "Sélectionnez le dossier à ajouter")
         if not path:

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