""" [Module documentaion here] @author:[author], [year] """ from path import Path from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog from core.logging_ import Logger from core.models import MusicFolder from core.repositories import MusicFolderRepository, TrackRepository, SessionTrackRepository, SessionRepository from ui.qt.dlg_playlist import DlgPlaylist from ui.qt.dlg_select_playlist import DlgSelectPlaylist from ui.qt.main_ui import Ui_mainWindow from ui.qt.widgets.explorertable import ExplorerTable from ui.qt.widgets.playlist_table import PlaylistTable logger = Logger.get() class MainWindow(QMainWindow): def __init__(self, settings=None): super().__init__() self.settings = settings or {} self.createWidgets() def createWidgets(self): self.ui = Ui_mainWindow() self.ui.setupUi(self) # Stack and menus self.ui.stack.setCurrentIndex(0) menu_items = { 0: (':/img/rsc/dancing.png', 'Ma séance'), # 1: (':/img/rsc/writing-tool.png', 'Préparer'), 2: (':/img/rsc/map.png', 'Explorer'), # 3: (':/img/rsc/calendar.png', 'Agenda'), 4: (':/img/rsc/settings.png', 'Paramètres'), } for i, item in menu_items.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.explorerTable.populate() self.ui.explorerTable.trackSelected.connect(self.explorer_selection_changed) self.ui.explorerTable.trackDoubleClicked.connect(self.play_track) self.ui.btnExplorerRefresh.clicked.connect(self.refresh_explorer_tree) self.ui.explorerTrackMetaStack.setCurrentIndex(0) self.ui.explorerTrackPlay.clicked.connect(self.explorerPlaySelected) self.ui.btnSelectPlaylist.clicked.connect(self.selectPlaylist) self.ui.explorerAddToPlaylist.clicked.connect(self.add_to_playlist) self.ui.explorerRemoveFromPlaylist.clicked.connect(self.remove_from_playlist) self.ui.explorerPlaylist.trackSelected.connect(self.explorer_selection_changed) self.ui.explorerPlaylist.trackDoubleClicked.connect(self.play_track) # self.ui.explorerCreatePlaylist.clicked.connect(self.createOrEditPlaylist) # 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() # Apply settings if self.settings: self.ui.vlcFrame.set_volume(int(self.settings['volume'])) playlist_id = int(self.settings['playlist']) if playlist_id > 0: playlist_repo = SessionRepository() playlist = playlist_repo.get_by_id(playlist_id) self.loadPlaylist(playlist) 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.ui.explorerTable.populate() def explorer_selection_changed(self, track): sender = self.sender() self.ui.explorerTrackMetaStack.setCurrentIndex(0) self.ui.explorerTrackPlay.setEnabled(False) self.ui.explorerAddToPlaylist.setEnabled(False) self.ui.explorerRemoveFromPlaylist.setEnabled(False) if not track: return # track infos self.ui.explorerLblTrackTitle.setText(track.title) self.ui.explorerLblTrackArtist.setText(track.artist) self.ui.explorerLblTrackAlbum.setText(track.album) self.ui.explorerLblTrackNumber.setText( str(track.track_num if track.track_num is not None else "") ) self.ui.explorerTrackMetaStack.setCurrentIndex(1) self.ui.explorerTrackPlay.setEnabled(True) if type(sender) is ExplorerTable: self.ui.explorerAddToPlaylist.setEnabled(True) elif type(sender) is PlaylistTable: self.ui.explorerRemoveFromPlaylist.setEnabled(True) else: raise RuntimeError("Unknown sender") 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 explorerPlaySelected(self): track = self.ui.explorerTable.selected_track() if track is None: return self.play_track(track) def play_track(self, track): logger.info("Start playing: %s" % track) self.ui.vlcFrame.play_track(track) 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 createOrEditPlaylist(self): r = DlgPlaylist.edit(self) def selectPlaylist(self): playlist = DlgSelectPlaylist.select(self) if playlist: self.loadPlaylist(playlist) def loadPlaylist(self, playlist): self.ui.explorerPlaylist.setEnabled(True) self.ui.lblPlaylistName.setText(playlist.name) self.ui.explorerPlaylist.populate(playlist) def add_to_playlist(self): track = self.ui.explorerTable.selected_track() if track is None: return playlist = self.ui.explorerPlaylist.playlist if playlist is None: return order = self.ui.explorerPlaylist.count + 1 track_repo = TrackRepository() track_repo.add_to_playlist( track.id, playlist.id ) self.ui.explorerPlaylist.populate(playlist) def remove_from_playlist(self): session_track = self.ui.explorerPlaylist.selected_session_track() if session_track is None: return session_track_repo = SessionTrackRepository() session_track_repo.delete(session_track, True) self.ui.explorerPlaylist.populate() def run(self): pass def currentSettings(self): volume = self.ui.vlcFrame.volume playlist_id = self.ui.explorerPlaylist.playlist.id return { "playlist": playlist_id, "volume": volume } def __del__(self): if self.qdb.isOpen(): self.qdb.close()