window.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. """
  2. [Module documentaion here]
  3. @author:[author], [year]
  4. """
  5. import re
  6. from PyQt5.QtCore import Qt
  7. from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQueryModel
  8. from path import Path
  9. from PyQt5.QtGui import QIcon
  10. from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog, QDialog, QMessageBox, \
  11. QTreeWidgetItem
  12. from core import constants
  13. from core.file_utilities import is_subdir_of
  14. from core.indexer import Indexer
  15. from core.models import MusicFolder
  16. from core.repositories import MusicFolderRepository, TrackRepository
  17. from ui.qt.main_ui import Ui_mainWindow
  18. class MainWindow(QMainWindow):
  19. def __init__(self):
  20. super(MainWindow, self).__init__()
  21. # db
  22. self.qdb = QSqlDatabase.addDatabase("QSQLITE")
  23. self.qdb.setDatabaseName(constants.DB_PATH)
  24. self.qdb.open()
  25. self.createWidgets()
  26. def createWidgets(self):
  27. self.ui = Ui_mainWindow()
  28. self.ui.setupUi(self)
  29. # Stack and menus
  30. self.ui.stack.setCurrentIndex(0)
  31. menu_items = [
  32. (':/img/rsc/dancing.png', 'Ma séance'),
  33. (':/img/rsc/writing-tool.png', 'Préparer'),
  34. (':/img/rsc/map.png', 'Explorer'),
  35. (':/img/rsc/calendar.png', 'Agenda'),
  36. (':/img/rsc/settings.png', 'Paramètres'),
  37. ]
  38. for i, item in enumerate(menu_items):
  39. icon, lbl = item
  40. item = QListWidgetItem(QIcon(icon), lbl)
  41. item.index = i
  42. self.ui.menu.addItem(item)
  43. # Menu item clicked
  44. self.ui.menu.itemClicked.connect(self.menu_item_selected)
  45. # Page 3 - explorer
  46. self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree)
  47. # self.refresh_explorer_tree()
  48. self.track_model = QSqlQueryModel(self)
  49. self.track_model.setQuery(
  50. """
  51. SELECT id, artist, album, title, status
  52. FROM Tracks
  53. ORDER BY artist, album, track_num;"""
  54. )
  55. self.track_model.setHeaderData(0, Qt.Horizontal, "id")
  56. self.track_model.setHeaderData(1, Qt.Horizontal, "Artiste")
  57. self.track_model.setHeaderData(2, Qt.Horizontal, "Album")
  58. self.track_model.setHeaderData(3, Qt.Horizontal, "Titre")
  59. self.track_model.setHeaderData(4, Qt.Horizontal, "Statut")
  60. self.track_model.query()
  61. self.ui.explorerTree.setModel(self.track_model)
  62. self.ui.explorerTree.hideColumn(0)
  63. self.ui.explorerTree.setRootIsDecorated(False)
  64. self.ui.explorerTree.setAlternatingRowColors(True)
  65. self.ui.explorerTree.selectionModel().selectionChanged.connect(self.explorer_tree_selection_changed)
  66. # Page 5 - settings
  67. self.ui.musicFoldersTable.setColumnHidden(0, 1)
  68. self.ui.musicFoldersAddButton.clicked.connect(self.add_music_folder)
  69. self.ui.musicFoldersRemoveButton.clicked.connect(self.remove_music_folder)
  70. self.populate_music_folders_table()
  71. def menu_item_selected(self, e):
  72. self.ui.stack.setCurrentIndex(e.index)
  73. def indexation_started(self):
  74. self.ui.statusbar.setStatusTip("Indexation en cours...")
  75. def indexation_ended(self):
  76. self.ui.statusbar.setStatusTip("Indexation terminée.")
  77. def refresh_explorer_tree(self):
  78. self.track_model.query()
  79. # track_repo = TrackRepository()
  80. #
  81. # artist_folders = {}
  82. # album_folders = {}
  83. # tracks = track_repo.get_all()
  84. #
  85. # for track in tracks:
  86. # if track.artist and track.artist not in artist_folders:
  87. # item = QTreeWidgetItem(self.ui.explorerTree, [track.artist])
  88. # artist_folders[track.artist] = item
  89. #
  90. # for track in tracks:
  91. # if track.artist and track.album and (track.artist, track.album) not in album_folders:
  92. # item = QTreeWidgetItem(artist_folders[track.artist], [track.album])
  93. # album_folders[(track.artist, track.album)] = item
  94. #
  95. # for track in tracks:
  96. # if track.artist and track.album:
  97. # parent = album_folders[(track.artist, track.album)]
  98. # elif track.artist:
  99. # parent = artist_folders[track.artist]
  100. # else:
  101. # parent = self.ui.explorerTree
  102. #
  103. # item = QTreeWidgetItem(parent, [track.title])
  104. def explorer_tree_selection_changed(self, model_index):
  105. track_id = model_index.indexes()[0].data(0)
  106. track = TrackRepository().get_by_id(int(track_id))
  107. self.ui.lblTrackTitle.setText(track.title)
  108. self.ui.lblTrackArtist.setText(track.artist)
  109. self.ui.lblTrackAlbum.setText(track.album)
  110. self.ui.lblTrackNumber.setText(str(track.track_num))
  111. # self.ui.lblTrackPath.setText(track.path)
  112. def populate_music_folders_table(self):
  113. music_folders = MusicFolderRepository().get_all()
  114. self.ui.musicFoldersTable.setRowCount(0)
  115. self.ui.musicFoldersTable.setRowCount(len(music_folders))
  116. music_folder_statuses = [
  117. ('Inconnu', 'status_unknown.png'),
  118. ('Valide', 'status_found.png'),
  119. ('Inaccessible', 'status_unavailable.png')
  120. ]
  121. for i, music_folder in enumerate(music_folders):
  122. self.ui.musicFoldersTable.setItem(i, 0, QTableWidgetItem(music_folder.id))
  123. status_lbl, status_pic = music_folder_statuses[music_folder.status]
  124. self.ui.musicFoldersTable.setItem(i, 1, QTableWidgetItem(QIcon(status_pic), status_lbl))
  125. self.ui.musicFoldersTable.setItem(i, 2, QTableWidgetItem(music_folder.path))
  126. def add_music_folder(self):
  127. path = QFileDialog.getExistingDirectory(self, "Sélectionnez le dossier à ajouter")
  128. if not path:
  129. return
  130. path = Path(path)
  131. repo = MusicFolderRepository()
  132. music_folders = repo.get_all()
  133. for folder in music_folders:
  134. if path == Path(folder.path):
  135. QMessageBox.warning(self, "Ajout invalide", "Ce dossier a déjà été ajouté")
  136. return
  137. if is_subdir_of(path, Path(folder.path)):
  138. QMessageBox.warning(self, "Ajout invalide", "Ce dossier est contenu dans un dossier existant")
  139. return
  140. folder = MusicFolder(path=path)
  141. repo.create(folder, True)
  142. self.populate_music_folders_table()
  143. def remove_music_folder(self):
  144. pass
  145. def run(self):
  146. pass
  147. def __del__(self):
  148. if self.qdb.isOpen():
  149. self.qdb.close()
  150. super().__del__()