예제 #1
0
파일: ui.py 프로젝트: longedok/zalgo2
class MainWindow(QtGui.QMainWindow):
    def __init__(self, network, parent=None):
        super(MainWindow, self).__init__()

        self.logger = logging.getLogger('MainWindow')

        self.tracklist_model = TracklistModel()
        if network:
            self.network = network.server

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.trackListView.setModel(self.tracklist_model)
        self.ui.trackListView.doubleClicked.connect(self.listDoubleClicked)
        self.ui.trackListView.clicked.connect(self.listClicked)
        self.ui.searchBtn.clicked.connect(self.searchBtnClick)
        self.ui.playBtn.clicked.connect(self.playBtnClick)
        self.ui.stopBtn.clicked.connect(self.stopBtnClick)
        self.ui.pauseBtn.clicked.connect(self.pauseBtnClick)
        self.setWindowTitle(u'Сетевой Проигрыватель')

        self.current_stream_id = None
        self.current_track = None
        self.audio = Audio()
        self.audio.tick.connect(self.tick)
        self.audio.state_changed.connect(self.stateChanged)
        self.audio.finished.connect(self.playingFinished)
        self.ui.seekSlider.setMediaObject(self.audio.get_media_object())
        self.ui.volumeSlider.setAudioOutput(self.audio.get_audio_output())

        self.ui.pauseBtn.setEnabled(False)
        self.ui.playBtn.setEnabled(True)
        self.ui.stopBtn.setEnabled(False)

    def stateChanged(self, newState, oldState):
        self.ui.pauseBtn.setEnabled(False)
        self.ui.playBtn.setEnabled(False)
        self.ui.stopBtn.setEnabled(False)
        
        if newState == Phonon.PlayingState:
            self.ui.pauseBtn.setEnabled(True)
            self.ui.stopBtn.setEnabled(True)
        elif newState == Phonon.StoppedState:
            self.ui.playBtn.setEnabled(True)
            self.ui.timeLbl.setText("00:00")
        elif newState == Phonon.PausedState:
            self.ui.playBtn.setEnabled(True)
            self.ui.stopBtn.setEnabled(True)

    def tick(self, time):
        displayTime = QtCore.QTime(0, (time / 60000) % 60, (time / 1000) % 60)
        self.ui.timeLbl.setText(displayTime.toString('mm:ss'))

    def playingFinished(self):
        current_index = self.ui.trackListView.currentIndex()
        peers, hash = self.tracklist_model.data(current_index, Qt.UserRole)
        if self.current_track != hash:
            pass

    def searchBtnClick(self):
        search_text = self.ui.searchEdit.text()
        if len(search_text) > 0:
            self.tracklist_model.reset()
            self.current_index = None
            self.tracklist_model.request_id = self.network.search(search_text+"%")

    def playBtnClick(self):
        current_index = self.ui.trackListView.currentIndex()
        peers, hash = self.tracklist_model.data(current_index, Qt.UserRole)
        if self.current_track != hash:
            self.current_track = hash
            self.logger.debug("query to stream track [hash: %s]" % hash)
            self.current_stream_id = self.network.initiateFileStream(peers, hash)
            if self.current_stream_id:
                stream_handler = self.network.getStreamHandlerById(self.current_stream_id)
                self.audio.set_audio_buffer(stream_handler.get_audio_buffer())
                self.audio.play()
        else:
            if self.audio.state() == Phonon.PausedState:
                self.audio.play()
            else:
                self.stopBtnClick()
                self.audio.play()


    def stopBtnClick(self):
        if self.current_stream_id:
            self.network.getStreamHandlerById(self.current_stream_id).stop()
        self.audio.stop()

    def pauseBtnClick(self):
        self.audio.pause()

    def listDoubleClicked(self, item):
        current_index = self.ui.trackListView.currentIndex()
        peers, hash = self.tracklist_model.data(current_index, Qt.UserRole)
        if self.current_track != hash:
            self._mediaObject.stop()
        self.playBtnClick()

    def listClicked(self, item):
        self.ui.playBtn.setEnabled(True)