def __init__(self): QMainWindow.__init__(self) Ui_MainWindow.setupUi(self, self) self.playlistDrop.dragEnterEvent = self.playlistDragEnterEvent self.playlistDrop.dropEvent = self.playlistDropEvent self.playlistModel = PlaylistModel() self.playlistTable.setModel(self.playlistModel) self.playlistTable.customContextMenuRequested.connect( self.playlistContextMenu) self.playlistTable.doubleClicked.connect(self.onPlaylistDoubleClick) self.playButton.clicked.connect(self.onPlaySelected) self.pauseButton.clicked.connect(self.onPauseClicked) self.stopButton.clicked.connect(self.onStopClicked) self.nextButton.clicked.connect(self.onNextClicked) self.prevButton.clicked.connect(self.onPrevClicked) self.libraryDock.setTitleBarWidget(QWidget()) self.toggleLibraryButton.clicked.connect(self.onToggleLibrary) self.library = LibraryWidget(self) self.libraryDock.setWidget(self.library) self.library.rescanStarted.connect(self.onLibraryRescanStarted) self.library.itemsActivated.connect(self.onLibraryItemActivated) self.infoStreamStart() QTimer.singleShot(200, self.fetchLibrary)
def __init__(self): QMainWindow.__init__(self) Ui_MainWindow.setupUi(self, self) self.playlistDrop.dragEnterEvent = self.playlistDragEnterEvent self.playlistDrop.dropEvent = self.playlistDropEvent self.playlistModel = PlaylistModel() self.playlistTable.setModel(self.playlistModel) self.playlistTable.customContextMenuRequested.connect(self.playlistContextMenu) self.playlistTable.doubleClicked.connect(self.onPlaylistDoubleClick) self.playback = PlaybackWidget(self) self.playbackLayout.addWidget(self.playback) self.playback.playButton.clicked.connect(self.onPlaySelected) self.playback.nextButton.clicked.connect(self.onNextClicked) self.playback.prevButton.clicked.connect(self.onPrevClicked) self.libraryDock.setTitleBarWidget(QWidget()) self.playlistsDock.setTitleBarWidget(QWidget()) self.toggleLibraryButton.clicked.connect(self.onToggleLibrary) self.togglePlaylistsButton.clicked.connect(self.onTogglePlaylists) self.library = LibraryWidget(self) self.libraryDock.setWidget(self.library) self.libraryDock.hide() self.library.itemsActivated.connect(self.onLibraryItemActivated) self.playlists = PlaylistsWidget(self) self.playlistsDock.setWidget(self.playlists) self.playlistsDock.hide() self.playlists.loadPlaylist.connect(self.onPlaylistLoad) self.dockState = 0 self.settings = QSettings('txplaya', 'txplaya') if u'geometry/main' in self.settings.allKeys(): self.setGeometry(self.settings.value(u'geometry/main')) for col in range(self.playlistModel.columnCount()): width = self.settings.value(u'geometry/playlist/col/%d' % col) self.playlistTable.setColumnWidth(col, int(width)) dockState = int(self.settings.value(u'geometry/dock/state')) self.dockShow(dockState) self.systemTray = QSystemTrayIcon(self.windowIcon()) self.systemTray.setToolTip('Playa') self.systemTray.show() self.systemTray.activated.connect(self.systemTrayToggle) systemTrayMenu = QMenu() systemTrayMenu.addAction(self.restore) systemTrayMenu.addAction(self.quit) self.systemTray.setContextMenu(systemTrayMenu) self.restore.triggered.connect(self.restoreWindow) self.quit.triggered.connect(self.quitEvent) self.quitButton.clicked.connect(self.quitEvent) self.quitFlag = False # keyboard shortcuts focusLibraryShortcut = QShortcut(QKeySequence('Ctrl+F'), self) focusLibraryShortcut.activated.connect(self.onFocusLibrary) deleteTrackShortcut = QShortcut(QKeySequence('Del'), self.playlistTable) deleteTrackShortcut.setContext(Qt.WidgetShortcut) deleteTrackShortcut.activated.connect(self.onDeleteTrack) togglePlaybackShortcut = QShortcut(QKeySequence('Space'), self) togglePlaybackShortcut.activated.connect(self.onTogglePlayback) startShortcut = QShortcut(QKeySequence(Qt.Key_Return), self.playlistTable) startShortcut.setContext(Qt.WidgetShortcut) startShortcut.activated.connect(self.onPlaySelected) undoShortcut = QShortcut(QKeySequence('Ctrl+Z'), self) undoShortcut.activated.connect(self.onPlaylistUndo) redoShortcut = QShortcut(QKeySequence('Ctrl+Shift+Z'), self) redoShortcut.activated.connect(self.onPlaylistRedo) saveShortcut = QShortcut(QKeySequence('Ctrl+S'), self) saveShortcut.activated.connect(self.onPlaylistSave) self.infoStreamStart() QTimer.singleShot(200, self.fetchLibrary)
class MainWindow(Ui_MainWindow, QMainWindow): def __init__(self): QMainWindow.__init__(self) Ui_MainWindow.setupUi(self, self) self.playlistDrop.dragEnterEvent = self.playlistDragEnterEvent self.playlistDrop.dropEvent = self.playlistDropEvent self.playlistModel = PlaylistModel() self.playlistTable.setModel(self.playlistModel) self.playlistTable.customContextMenuRequested.connect(self.playlistContextMenu) self.playlistTable.doubleClicked.connect(self.onPlaylistDoubleClick) self.playback = PlaybackWidget(self) self.playbackLayout.addWidget(self.playback) self.playback.playButton.clicked.connect(self.onPlaySelected) self.playback.nextButton.clicked.connect(self.onNextClicked) self.playback.prevButton.clicked.connect(self.onPrevClicked) self.libraryDock.setTitleBarWidget(QWidget()) self.playlistsDock.setTitleBarWidget(QWidget()) self.toggleLibraryButton.clicked.connect(self.onToggleLibrary) self.togglePlaylistsButton.clicked.connect(self.onTogglePlaylists) self.library = LibraryWidget(self) self.libraryDock.setWidget(self.library) self.libraryDock.hide() self.library.itemsActivated.connect(self.onLibraryItemActivated) self.playlists = PlaylistsWidget(self) self.playlistsDock.setWidget(self.playlists) self.playlistsDock.hide() self.playlists.loadPlaylist.connect(self.onPlaylistLoad) self.dockState = 0 self.settings = QSettings('txplaya', 'txplaya') if u'geometry/main' in self.settings.allKeys(): self.setGeometry(self.settings.value(u'geometry/main')) for col in range(self.playlistModel.columnCount()): width = self.settings.value(u'geometry/playlist/col/%d' % col) self.playlistTable.setColumnWidth(col, int(width)) dockState = int(self.settings.value(u'geometry/dock/state')) self.dockShow(dockState) self.systemTray = QSystemTrayIcon(self.windowIcon()) self.systemTray.setToolTip('Playa') self.systemTray.show() self.systemTray.activated.connect(self.systemTrayToggle) systemTrayMenu = QMenu() systemTrayMenu.addAction(self.restore) systemTrayMenu.addAction(self.quit) self.systemTray.setContextMenu(systemTrayMenu) self.restore.triggered.connect(self.restoreWindow) self.quit.triggered.connect(self.quitEvent) self.quitButton.clicked.connect(self.quitEvent) self.quitFlag = False # keyboard shortcuts focusLibraryShortcut = QShortcut(QKeySequence('Ctrl+F'), self) focusLibraryShortcut.activated.connect(self.onFocusLibrary) deleteTrackShortcut = QShortcut(QKeySequence('Del'), self.playlistTable) deleteTrackShortcut.setContext(Qt.WidgetShortcut) deleteTrackShortcut.activated.connect(self.onDeleteTrack) togglePlaybackShortcut = QShortcut(QKeySequence('Space'), self) togglePlaybackShortcut.activated.connect(self.onTogglePlayback) startShortcut = QShortcut(QKeySequence(Qt.Key_Return), self.playlistTable) startShortcut.setContext(Qt.WidgetShortcut) startShortcut.activated.connect(self.onPlaySelected) undoShortcut = QShortcut(QKeySequence('Ctrl+Z'), self) undoShortcut.activated.connect(self.onPlaylistUndo) redoShortcut = QShortcut(QKeySequence('Ctrl+Shift+Z'), self) redoShortcut.activated.connect(self.onPlaylistRedo) saveShortcut = QShortcut(QKeySequence('Ctrl+S'), self) saveShortcut.activated.connect(self.onPlaylistSave) self.infoStreamStart() QTimer.singleShot(200, self.fetchLibrary) def infoStreamStart(self): self.infoStream = QInfoStream() self.infoStream.trackStarted.connect(self.playback.trackStarted) self.infoStream.trackStarted.connect(self.playlistModel.trackActivated) self.infoStream.playbackFinished.connect(self.playback.finished) self.infoStream.playbackFinished.connect(self.playlistModel.trackActivated) self.infoStream.playbackPaused.connect(self.playback.paused) self.infoStream.playlistChanged.connect(self.onPlaylistChanged) self.infoStream.disconnected.connect(self.reconnectDialog) self.infoStream.timerUpdated.connect(self.playback.timerUpdated) self.infoStream.playlistRegistryUpdated.connect(self.playlistRegistryUpdated) def fetchLibrary(self): from txplayagui.client import getLibrary onHttpResponse(getLibrary(), self.onLibraryLoaded) def playlistDragEnterEvent(self, event): self._playlistDragDropHandle(event, isDropped=False) def playlistDropEvent(self, event): self._playlistDragDropHandle(event, isDropped=True) def _playlistDragDropHandle(self, event, isDropped): from txplayagui.client import moveTrack, libraryInsert mimeData = event.mimeData() # get row rowPosition = event.pos().y() - self.playlistTable.rowHeight(0) rowTarget = self.playlistTable.rowAt(rowPosition) if rowTarget == -1: # new row rowTarget = self.playlistModel.rowCount() if mimeData.hasUrls(): urls = mimeData.urls() if len(urls) > 0: url = urls[0] if url.isLocalFile(): if not isDropped: event.acceptProposedAction() return # file dropped filepath = url.toLocalFile() from txplayagui.client import insert _ = insert(filepath, rowTarget) return # no urls or not local file if not mimeData.hasText(): return try: data = unwrapMime(mimeData) except ValueError: # invalid data passed return # check for proper flag source = data.get('source') if source not in ('playlist', 'library'): return if not isDropped: # drag entered event.acceptProposedAction() return if source == 'playlist': rowSource = data['row'] moveTrack(rowSource, rowTarget) elif source == 'library': hashes = [item['hash'] for item in data['items']] libraryInsert(hashes, position=rowTarget) def onLibraryLoaded(self, response): try: data = json.loads(response.data) self.library.rescanFinished(data['library']) if 'msg' in data: print data['msg'] except Exception, err: print 'Library load error:', repr(err)
class MainWindow(Ui_MainWindow, QMainWindow): def __init__(self): QMainWindow.__init__(self) Ui_MainWindow.setupUi(self, self) self.playlistDrop.dragEnterEvent = self.playlistDragEnterEvent self.playlistDrop.dropEvent = self.playlistDropEvent self.playlistModel = PlaylistModel() self.playlistTable.setModel(self.playlistModel) self.playlistTable.customContextMenuRequested.connect( self.playlistContextMenu) self.playlistTable.doubleClicked.connect(self.onPlaylistDoubleClick) self.playButton.clicked.connect(self.onPlaySelected) self.pauseButton.clicked.connect(self.onPauseClicked) self.stopButton.clicked.connect(self.onStopClicked) self.nextButton.clicked.connect(self.onNextClicked) self.prevButton.clicked.connect(self.onPrevClicked) self.libraryDock.setTitleBarWidget(QWidget()) self.toggleLibraryButton.clicked.connect(self.onToggleLibrary) self.library = LibraryWidget(self) self.libraryDock.setWidget(self.library) self.library.rescanStarted.connect(self.onLibraryRescanStarted) self.library.itemsActivated.connect(self.onLibraryItemActivated) self.infoStreamStart() QTimer.singleShot(200, self.fetchLibrary) def infoStreamStart(self): self.infoStream = QInfoStream() self.infoStream.trackStarted.connect(self.onTrackStarted) self.infoStream.playbackFinished.connect(self.onPlaybackFinished) self.infoStream.playlistChanged.connect(self.onPlaylistChanged) self.infoStream.disconnected.connect(self.reconnectDialog) self.infoStream.timerUpdated.connect(self.timerUpdated) def fetchLibrary(self): from txplayagui.client import getLibrary response = getLibrary() response.finished.connect(self.getCallbackLibraryLoaded(response)) def playlistDragEnterEvent(self, event): self._playlistDragDropHandle(event, isDropped=False) def playlistDropEvent(self, event): self._playlistDragDropHandle(event, isDropped=True) def _playlistDragDropHandle(self, event, isDropped): mimeData = event.mimeData() rowPosition = event.pos().y() - self.playlistTable.rowHeight(0) rowTarget = self.playlistTable.rowAt(rowPosition) if rowTarget == -1: rowTarget = self.playlistModel.rowCount() if mimeData.hasUrls(): urls = mimeData.urls() if len(urls) > 0: url = urls[0] if url.isLocalFile(): if not isDropped: event.acceptProposedAction() return # file dropped filepath = url.toLocalFile() from txplayagui.client import insert _ = insert(filepath, rowTarget) return # no urls or not local file if not mimeData.hasText(): return text = mimeData.text() try: data = json.loads(text) except ValueError: # invalid data passed return # check for proper flag and position if data.get('source') != 'playlist': return rowSource = data.get('row') if not isinstance(rowSource, int): return if not isDropped: event.acceptProposedAction() return from txplayagui.client import moveTrack moveTrack(rowSource, rowTarget) def getCallbackLogServer(self, response): @pyqtSlot() def logServer(): print '[%d] %s' % (response.statusCode, response.data) return logServer def getCallbackLibraryLoaded(self, response): @pyqtSlot() def libraryLoaded(): try: data = json.loads(response.data) self.library.rescanFinished(data['library']) if 'msg' in data: print data['msg'] except Exception, err: print 'Library load error:', repr(err) return libraryLoaded