window.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. """
  2. [Module documentaion here]
  3. @author:[author], [year]
  4. """
  5. from path import Path
  6. from PyQt5.QtGui import QIcon
  7. from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog
  8. from core.logging_ import Logger
  9. from core.models import MusicFolder
  10. from core.repositories import MusicFolderRepository, TrackRepository, SessionTrackRepository, SessionRepository
  11. from ui.qt.dlg_playlist import DlgPlaylist
  12. from ui.qt.dlg_select_playlist import DlgSelectPlaylist
  13. from ui.qt.main_ui import Ui_mainWindow
  14. from ui.qt.widgets.explorertable import ExplorerTable
  15. from ui.qt.widgets.playlist_table import PlaylistTable
  16. logger = Logger.get()
  17. class MainWindow(QMainWindow):
  18. def __init__(self, settings=None):
  19. super().__init__()
  20. self.settings = settings or {}
  21. self.createWidgets()
  22. def createWidgets(self):
  23. self.ui = Ui_mainWindow()
  24. self.ui.setupUi(self)
  25. # Stack and menus
  26. self.ui.stack.setCurrentIndex(0)
  27. menu_items = {
  28. 0: (':/img/rsc/dancing.png', 'Ma séance'),
  29. # 1: (':/img/rsc/writing-tool.png', 'Préparer'),
  30. 2: (':/img/rsc/map.png', 'Explorer'),
  31. # 3: (':/img/rsc/calendar.png', 'Agenda'),
  32. 4: (':/img/rsc/settings.png', 'Paramètres'),
  33. }
  34. for i, item in menu_items.items():
  35. icon, lbl = item
  36. item = QListWidgetItem(QIcon(icon), lbl)
  37. item.index = i
  38. self.ui.menu.addItem(item)
  39. # Menu item clicked
  40. self.ui.menu.itemClicked.connect(self.menu_item_selected)
  41. # Page 3 - explorer
  42. self.ui.explorerTable.populate()
  43. self.ui.explorerTable.trackSelected.connect(self.explorer_selection_changed)
  44. self.ui.explorerTable.trackDoubleClicked.connect(self.play_track)
  45. self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree)
  46. self.ui.explorerTrackMetaStack.setCurrentIndex(0)
  47. self.ui.explorerTrackPlay.clicked.connect(self.explorerPlaySelected)
  48. self.ui.btnSelectPlaylist.clicked.connect(self.selectPlaylist)
  49. self.ui.explorerAddToPlaylist.clicked.connect(self.add_to_playlist)
  50. self.ui.explorerRemoveFromPlaylist.clicked.connect(self.remove_from_playlist)
  51. self.ui.explorerPlaylist.trackSelected.connect(self.explorer_selection_changed)
  52. self.ui.explorerPlaylist.trackDoubleClicked.connect(self.play_track)
  53. # self.ui.explorerCreatePlaylist.clicked.connect(self.createOrEditPlaylist)
  54. # Page 5 - settings
  55. self.ui.musicFoldersTable.setColumnHidden(0, 1)
  56. self.ui.musicFoldersAddButton.clicked.connect(self.add_music_folder)
  57. self.ui.musicFoldersRemoveButton.clicked.connect(self.remove_music_folder)
  58. self.populate_music_folders_table()
  59. # Apply settings
  60. if self.settings:
  61. self.ui.vlcFrame.set_volume(int(self.settings['volume']))
  62. playlist_id = int(self.settings['playlist'])
  63. if playlist_id > 0:
  64. playlist_repo = SessionRepository()
  65. playlist = playlist_repo.get_by_id(playlist_id)
  66. self.loadPlaylist(playlist)
  67. def menu_item_selected(self, e):
  68. self.ui.stack.setCurrentIndex(e.index)
  69. def indexation_started(self):
  70. self.ui.statusbar.setStatusTip("Indexation en cours...")
  71. def indexation_ended(self):
  72. self.ui.statusbar.setStatusTip("Indexation terminée.")
  73. def refresh_explorer_tree(self):
  74. self.ui.explorerTable.populate()
  75. def explorer_selection_changed(self, track):
  76. sender = self.sender()
  77. self.ui.explorerTrackMetaStack.setCurrentIndex(0)
  78. self.ui.explorerTrackPlay.setEnabled(False)
  79. self.ui.explorerAddToPlaylist.setEnabled(False)
  80. self.ui.explorerRemoveFromPlaylist.setEnabled(False)
  81. if not track:
  82. return
  83. # track infos
  84. self.ui.explorerLblTrackTitle.setText(track.title)
  85. self.ui.explorerLblTrackArtist.setText(track.artist)
  86. self.ui.explorerLblTrackAlbum.setText(track.album)
  87. self.ui.explorerLblTrackNumber.setText(
  88. str(track.track_num if track.track_num is not None else "")
  89. )
  90. self.ui.explorerTrackMetaStack.setCurrentIndex(1)
  91. self.ui.explorerTrackPlay.setEnabled(True)
  92. if type(sender) is ExplorerTable:
  93. self.ui.explorerAddToPlaylist.setEnabled(True)
  94. elif type(sender) is PlaylistTable:
  95. self.ui.explorerRemoveFromPlaylist.setEnabled(True)
  96. else:
  97. raise RuntimeError("Unknown sender")
  98. def populate_music_folders_table(self):
  99. music_folders = MusicFolderRepository().get_all()
  100. self.ui.musicFoldersTable.setRowCount(0)
  101. self.ui.musicFoldersTable.setRowCount(len(music_folders))
  102. music_folder_statuses = [
  103. ('Inconnu', 'status_unknown.png'),
  104. ('Valide', 'status_found.png'),
  105. ('Inaccessible', 'status_unavailable.png')
  106. ]
  107. for i, music_folder in enumerate(music_folders):
  108. self.ui.musicFoldersTable.setItem(i, 0, QTableWidgetItem(music_folder.id))
  109. status_lbl, status_pic = music_folder_statuses[music_folder.status]
  110. self.ui.musicFoldersTable.setItem(i, 1, QTableWidgetItem(QIcon(status_pic), status_lbl))
  111. self.ui.musicFoldersTable.setItem(i, 2, QTableWidgetItem(music_folder.path))
  112. def explorerPlaySelected(self):
  113. track = self.ui.explorerTable.selected_track()
  114. if track is None:
  115. return
  116. self.play_track(track)
  117. def play_track(self, track):
  118. logger.info("Start playing: %s" % track)
  119. self.ui.vlcFrame.play_track(track)
  120. def add_music_folder(self):
  121. path = QFileDialog.getExistingDirectory(self, "Sélectionnez le dossier à ajouter")
  122. if not path:
  123. return
  124. path = Path(path)
  125. repo = MusicFolderRepository()
  126. music_folders = repo.get_all()
  127. # for folder in music_folders:
  128. # if path == Path(folder.path):
  129. # QMessageBox.warning(self, "Ajout invalide", "Ce dossier a déjà été ajouté")
  130. # return
  131. #
  132. # if is_subdir_of(path, Path(folder.path)):
  133. # QMessageBox.warning(self, "Ajout invalide", "Ce dossier est contenu dans un dossier existant")
  134. # return
  135. folder = MusicFolder(path=path)
  136. repo.create(folder, True)
  137. self.populate_music_folders_table()
  138. def remove_music_folder(self):
  139. pass
  140. def createOrEditPlaylist(self):
  141. r = DlgPlaylist.edit(self)
  142. def selectPlaylist(self):
  143. playlist = DlgSelectPlaylist.select(self)
  144. if playlist:
  145. self.loadPlaylist(playlist)
  146. def loadPlaylist(self, playlist):
  147. self.ui.explorerPlaylist.setEnabled(True)
  148. self.ui.lblPlaylistName.setText(playlist.name)
  149. self.ui.explorerPlaylist.populate(playlist)
  150. def add_to_playlist(self):
  151. track = self.ui.explorerTable.selected_track()
  152. if track is None:
  153. return
  154. playlist = self.ui.explorerPlaylist.playlist
  155. if playlist is None:
  156. return
  157. order = self.ui.explorerPlaylist.count + 1
  158. track_repo = TrackRepository()
  159. track_repo.add_to_playlist(
  160. track.id,
  161. playlist.id
  162. )
  163. self.ui.explorerPlaylist.populate(playlist)
  164. def remove_from_playlist(self):
  165. session_track = self.ui.explorerPlaylist.selected_session_track()
  166. if session_track is None:
  167. return
  168. session_track_repo = SessionTrackRepository()
  169. session_track_repo.delete(session_track, True)
  170. self.ui.explorerPlaylist.populate()
  171. def run(self):
  172. pass
  173. def currentSettings(self):
  174. volume = self.ui.vlcFrame.volume
  175. playlist_id = self.ui.explorerPlaylist.playlist.id
  176. return {
  177. "playlist": playlist_id,
  178. "volume": volume
  179. }
  180. def __del__(self):
  181. if self.qdb.isOpen():
  182. self.qdb.close()