""" [Module documentaion here] @author:[author], [year] """ import re from PyQt5.QtCore import Qt from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQueryModel from path import Path from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog, QDialog, QMessageBox, \ QTreeWidgetItem from core import constants from core.file_utilities import is_subdir_of from core.indexer import Indexer from core.models import MusicFolder from core.repositories import MusicFolderRepository, TrackRepository from ui.qt.main_ui import Ui_mainWindow 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.createWidgets() def createWidgets(self): self.ui = Ui_mainWindow() self.ui.setupUi(self) # Stack and menus self.ui.stack.setCurrentIndex(0) menu_items = [ (':/img/rsc/dancing.png', 'Ma séance'), (':/img/rsc/writing-tool.png', 'Préparer'), (':/img/rsc/map.png', 'Explorer'), (':/img/rsc/calendar.png', 'Agenda'), (':/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.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree) # self.refresh_explorer_tree() self.track_model = QSqlQueryModel(self) self.track_model.setQuery( """ SELECT id, artist, album, title, status FROM Tracks ORDER BY artist, album, track_num;""" ) self.track_model.setHeaderData(0, Qt.Horizontal, "id") self.track_model.setHeaderData(1, Qt.Horizontal, "Artiste") self.track_model.setHeaderData(2, Qt.Horizontal, "Album") self.track_model.setHeaderData(3, Qt.Horizontal, "Titre") self.track_model.setHeaderData(4, Qt.Horizontal, "Statut") self.track_model.query() self.ui.explorerTree.setModel(self.track_model) self.ui.explorerTree.hideColumn(0) self.ui.explorerTree.setRootIsDecorated(False) self.ui.explorerTree.setAlternatingRowColors(True) self.ui.explorerTree.selectionModel().selectionChanged.connect(self.explorer_tree_selection_changed) # 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() def menu_item_selected(self, e): self.ui.stack.setCurrentIndex(e.index) def indexation_started(self): self.ui.statusbar.setStatusTip("Indexation en cours...") def indexation_ended(self): self.ui.statusbar.setStatusTip("Indexation terminée.") def refresh_explorer_tree(self): self.track_model.query() # track_repo = TrackRepository() # # artist_folders = {} # album_folders = {} # tracks = track_repo.get_all() # # for track in tracks: # if track.artist and track.artist not in artist_folders: # item = QTreeWidgetItem(self.ui.explorerTree, [track.artist]) # artist_folders[track.artist] = item # # for track in tracks: # if track.artist and track.album and (track.artist, track.album) not in album_folders: # item = QTreeWidgetItem(artist_folders[track.artist], [track.album]) # album_folders[(track.artist, track.album)] = item # # for track in tracks: # if track.artist and track.album: # parent = album_folders[(track.artist, track.album)] # elif track.artist: # parent = artist_folders[track.artist] # else: # parent = self.ui.explorerTree # # item = QTreeWidgetItem(parent, [track.title]) 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 populate_music_folders_table(self): music_folders = MusicFolderRepository().get_all() self.ui.musicFoldersTable.setRowCount(0) self.ui.musicFoldersTable.setRowCount(len(music_folders)) music_folder_statuses = [ ('Inconnu', 'status_unknown.png'), ('Valide', 'status_found.png'), ('Inaccessible', 'status_unavailable.png') ] for i, music_folder in enumerate(music_folders): self.ui.musicFoldersTable.setItem(i, 0, QTableWidgetItem(music_folder.id)) status_lbl, status_pic = music_folder_statuses[music_folder.status] self.ui.musicFoldersTable.setItem(i, 1, QTableWidgetItem(QIcon(status_pic), status_lbl)) self.ui.musicFoldersTable.setItem(i, 2, QTableWidgetItem(music_folder.path)) def add_music_folder(self): path = QFileDialog.getExistingDirectory(self, "Sélectionnez le dossier à ajouter") if not path: return path = Path(path) repo = MusicFolderRepository() music_folders = repo.get_all() for folder in music_folders: if path == Path(folder.path): QMessageBox.warning(self, "Ajout invalide", "Ce dossier a déjà été ajouté") return if is_subdir_of(path, Path(folder.path)): QMessageBox.warning(self, "Ajout invalide", "Ce dossier est contenu dans un dossier existant") return folder = MusicFolder(path=path) repo.create(folder, True) self.populate_music_folders_table() def remove_music_folder(self): pass def run(self): pass def __del__(self): if self.qdb.isOpen(): self.qdb.close() super().__del__()