window.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. """
  2. [Module documentaion here]
  3. @author:[author], [year]
  4. """
  5. import re
  6. from path import Path
  7. from PyQt5.QtGui import QIcon
  8. from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog, QDialog, QMessageBox, \
  9. QTreeWidgetItem
  10. from core.file_utilities import is_subdir_of
  11. from core.indexer import Indexer
  12. from core.models import MusicFolder
  13. from core.repositories import MusicFolderRepository, TrackRepository
  14. from ui.qt.main_ui import Ui_mainWindow
  15. class MainWindow(QMainWindow):
  16. def __init__(self):
  17. super(MainWindow, self).__init__()
  18. self.createWidgets()
  19. def createWidgets(self):
  20. self.ui = Ui_mainWindow()
  21. self.ui.setupUi(self)
  22. # Stack and menus
  23. self.ui.stack.setCurrentIndex(0)
  24. menu_items = [
  25. (':/img/rsc/dancing.png', 'Ma séance'),
  26. (':/img/rsc/writing-tool.png', 'Préparer'),
  27. (':/img/rsc/map.png', 'Explorer'),
  28. (':/img/rsc/calendar.png', 'Agenda'),
  29. (':/img/rsc/settings.png', 'Paramètres'),
  30. ]
  31. for i, item in enumerate(menu_items):
  32. icon, lbl = item
  33. item = QListWidgetItem(QIcon(icon), lbl)
  34. item.index = i
  35. self.ui.menu.addItem(item)
  36. # Menu item clicked
  37. self.ui.menu.itemClicked.connect(self.menu_item_selected)
  38. # Page 3 - explorer
  39. self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree)
  40. self.refresh_explorer_tree()
  41. # Page 5 - settings
  42. self.ui.musicFoldersTable.setColumnHidden(0, 1)
  43. self.ui.musicFoldersAddButton.clicked.connect(self.add_music_folder)
  44. self.ui.musicFoldersRemoveButton.clicked.connect(self.remove_music_folder)
  45. self.populate_music_folders_table()
  46. def menu_item_selected(self, e):
  47. self.ui.stack.setCurrentIndex(e.index)
  48. def indexation_started(self):
  49. self.ui.statusbar.setStatusTip("Indexation en cours...")
  50. def indexation_ended(self):
  51. self.ui.statusbar.setStatusTip("Indexation terminée.")
  52. def refresh_explorer_tree(self):
  53. track_repo = TrackRepository()
  54. artist_folders = {}
  55. album_folders = {}
  56. tracks = track_repo.get_all()
  57. for track in tracks:
  58. if track.artist and track.artist not in artist_folders:
  59. item = QTreeWidgetItem(self.ui.explorerTree, [track.artist])
  60. artist_folders[track.artist] = item
  61. for track in tracks:
  62. if track.artist and track.album and (track.artist, track.album) not in album_folders:
  63. item = QTreeWidgetItem(artist_folders[track.artist], [track.album])
  64. album_folders[(track.artist, track.album)] = item
  65. for track in tracks:
  66. if track.artist and track.album:
  67. parent = album_folders[(track.artist, track.album)]
  68. elif track.artist:
  69. parent = artist_folders[track.artist]
  70. else:
  71. parent = self.ui.explorerTree
  72. item = QTreeWidgetItem(parent, [track.title])
  73. def populate_music_folders_table(self):
  74. music_folders = MusicFolderRepository().get_all()
  75. self.ui.musicFoldersTable.setRowCount(0)
  76. self.ui.musicFoldersTable.setRowCount(len(music_folders))
  77. music_folder_statuses = [
  78. ('Inconnu', 'status_unknown.png'),
  79. ('Valide', 'status_found.png'),
  80. ('Inaccessible', 'status_unavailable.png')
  81. ]
  82. for i, music_folder in enumerate(music_folders):
  83. self.ui.musicFoldersTable.setItem(i, 0, QTableWidgetItem(music_folder.id))
  84. status_lbl, status_pic = music_folder_statuses[music_folder.status]
  85. self.ui.musicFoldersTable.setItem(i, 1, QTableWidgetItem(QIcon(status_pic), status_lbl))
  86. self.ui.musicFoldersTable.setItem(i, 2, QTableWidgetItem(music_folder.path))
  87. def add_music_folder(self):
  88. path = QFileDialog.getExistingDirectory(self, "Sélectionnez le dossier à ajouter")
  89. if not path:
  90. return
  91. path = Path(path)
  92. repo = MusicFolderRepository()
  93. music_folders = repo.get_all()
  94. for folder in music_folders:
  95. if path == Path(folder.path):
  96. QMessageBox.warning(self, "Ajout invalide", "Ce dossier a déjà été ajouté")
  97. return
  98. if is_subdir_of(path, Path(folder.path)):
  99. QMessageBox.warning(self, "Ajout invalide", "Ce dossier est contenu dans un dossier existant")
  100. return
  101. folder = MusicFolder(path=path)
  102. repo.create(folder, True)
  103. self.populate_music_folders_table()
  104. def remove_music_folder(self):
  105. pass
  106. def run(self):
  107. pass