window.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. """
  2. [Module documentaion here]
  3. @author:[author], [year]
  4. """
  5. from PyQt5.QtSql import QSqlDatabase
  6. from path import Path
  7. from PyQt5.QtGui import QIcon
  8. from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog
  9. from core import constants
  10. from core.logging_ import Logger
  11. from core.models import MusicFolder
  12. from core.repositories import MusicFolderRepository, TrackRepository
  13. from ui.qt.dlg_playlist import DlgPlaylist
  14. from ui.qt.dlg_select_playlist import DlgSelectPlaylist
  15. from ui.qt.main_ui import Ui_mainWindow
  16. logger = Logger.get()
  17. class MainWindow(QMainWindow):
  18. def __init__(self):
  19. super().__init__()
  20. # db
  21. # self.qdb = QSqlDatabase.addDatabase("QSQLITE")
  22. # self.qdb.setDatabaseName(constants.DB_PATH)
  23. # self.qdb.open()
  24. self.createWidgets()
  25. def createWidgets(self):
  26. self.ui = Ui_mainWindow()
  27. self.ui.setupUi(self)
  28. # Stack and menus
  29. self.ui.stack.setCurrentIndex(0)
  30. menu_items = {
  31. 0: (':/img/rsc/dancing.png', 'Ma séance'),
  32. # 1: (':/img/rsc/writing-tool.png', 'Préparer'),
  33. 2: (':/img/rsc/map.png', 'Explorer'),
  34. # 3: (':/img/rsc/calendar.png', 'Agenda'),
  35. 4: (':/img/rsc/settings.png', 'Paramètres'),
  36. }
  37. for i, item in menu_items.items():
  38. icon, lbl = item
  39. item = QListWidgetItem(QIcon(icon), lbl)
  40. item.index = i
  41. self.ui.menu.addItem(item)
  42. # Menu item clicked
  43. self.ui.menu.itemClicked.connect(self.menu_item_selected)
  44. # Page 3 - explorer
  45. self.ui.explorerTable.populate()
  46. self.ui.explorerTable.trackSelected.connect(self.explorer_tree_selection_changed)
  47. self.ui.explorerTable.trackDoubleClicked.connect(self.play_track)
  48. self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree)
  49. self.ui.explorerTrackMetaStack.setCurrentIndex(0)
  50. self.ui.explorerTrackPlay.clicked.connect(self.explorerPlaySelected)
  51. self.ui.btnOpenPlaylist.clicked.connect(self.openPlaylist)
  52. # self.ui.explorerCreatePlaylist.clicked.connect(self.createOrEditPlaylist)
  53. # Page 5 - settings
  54. self.ui.musicFoldersTable.setColumnHidden(0, 1)
  55. self.ui.musicFoldersAddButton.clicked.connect(self.add_music_folder)
  56. self.ui.musicFoldersRemoveButton.clicked.connect(self.remove_music_folder)
  57. self.populate_music_folders_table()
  58. def menu_item_selected(self, e):
  59. self.ui.stack.setCurrentIndex(e.index)
  60. def indexation_started(self):
  61. self.ui.statusbar.setStatusTip("Indexation en cours...")
  62. def indexation_ended(self):
  63. self.ui.statusbar.setStatusTip("Indexation terminée.")
  64. def refresh_explorer_tree(self):
  65. self.ui.explorerTable.populate()
  66. def explorer_tree_selection_changed(self, track):
  67. if track:
  68. self.ui.explorerLblTrackTitle.setText(track.title)
  69. self.ui.explorerLblTrackArtist.setText(track.artist)
  70. self.ui.explorerLblTrackAlbum.setText(track.album)
  71. self.ui.explorerLblTrackNumber.setText(
  72. str(track.track_num if track.track_num is not None else "")
  73. )
  74. self.ui.explorerTrackMetaStack.setCurrentIndex(1)
  75. self.ui.explorerTrackPlay.setEnabled(True)
  76. self.ui.explorerAddToPlaylist.setEnabled(True)
  77. else:
  78. self.ui.explorerTrackMetaStack.setCurrentIndex(0)
  79. self.ui.explorerTrackPlay.setEnabled(False)
  80. self.ui.explorerAddToPlaylist.setEnabled(False)
  81. def populate_music_folders_table(self):
  82. music_folders = MusicFolderRepository().get_all()
  83. self.ui.musicFoldersTable.setRowCount(0)
  84. self.ui.musicFoldersTable.setRowCount(len(music_folders))
  85. music_folder_statuses = [
  86. ('Inconnu', 'status_unknown.png'),
  87. ('Valide', 'status_found.png'),
  88. ('Inaccessible', 'status_unavailable.png')
  89. ]
  90. for i, music_folder in enumerate(music_folders):
  91. self.ui.musicFoldersTable.setItem(i, 0, QTableWidgetItem(music_folder.id))
  92. status_lbl, status_pic = music_folder_statuses[music_folder.status]
  93. self.ui.musicFoldersTable.setItem(i, 1, QTableWidgetItem(QIcon(status_pic), status_lbl))
  94. self.ui.musicFoldersTable.setItem(i, 2, QTableWidgetItem(music_folder.path))
  95. def explorerPlaySelected(self):
  96. track = self.ui.explorerTable.selected_track()
  97. if track is None:
  98. return
  99. self.play_track(track)
  100. def play_track(self, track):
  101. logger.info("Start playing: %s" % track)
  102. self.ui.vlcFrame.play_track(track)
  103. def add_music_folder(self):
  104. path = QFileDialog.getExistingDirectory(self, "Sélectionnez le dossier à ajouter")
  105. if not path:
  106. return
  107. path = Path(path)
  108. repo = MusicFolderRepository()
  109. music_folders = repo.get_all()
  110. # for folder in music_folders:
  111. # if path == Path(folder.path):
  112. # QMessageBox.warning(self, "Ajout invalide", "Ce dossier a déjà été ajouté")
  113. # return
  114. #
  115. # if is_subdir_of(path, Path(folder.path)):
  116. # QMessageBox.warning(self, "Ajout invalide", "Ce dossier est contenu dans un dossier existant")
  117. # return
  118. folder = MusicFolder(path=path)
  119. repo.create(folder, True)
  120. self.populate_music_folders_table()
  121. def remove_music_folder(self):
  122. pass
  123. def createOrEditPlaylist(self):
  124. r = DlgPlaylist.edit(self)
  125. def openPlaylist(self):
  126. playlist = DlgSelectPlaylist.select(self)
  127. if playlist:
  128. print(playlist)
  129. def run(self):
  130. pass
  131. def __del__(self):
  132. if self.qdb.isOpen():
  133. self.qdb.close()