class JoystickInvertPreference(QWidget): def __init__(self, parent=None): super(JoystickInvertPreference, self).__init__(parent) layout = QHBoxLayout() self._btnGroup = QButtonGroup() self.btnNormal = ExpandingButton() self.btnNormal.setText('Down') self.btnNormal.setCheckable(True) self.btnNormal.clicked.connect(self.set_preference) self._btnGroup.addButton(self.btnNormal) layout.addWidget(self.btnNormal) self.btnInvert = ExpandingButton() self.btnInvert.setText('Up') self.btnInvert.setCheckable(True) self.btnInvert.clicked.connect(self.set_preference) self._btnGroup.addButton(self.btnInvert) layout.addWidget(self.btnInvert) self.setLayout(layout) self.update_from_preferences() Preferences.subscribe(self.update_from_preferences) def update_from_preferences(self): invert_y = Preferences.get('joystick.invert_y', False) self.btnInvert.setChecked(invert_y) self.btnNormal.setChecked(not invert_y) def set_preference(self): Preferences.set('joystick.invert_y', self.btnInvert.isChecked())
class FadeToBlackControl(QWidget): def __init__(self, ftb, atem, parent=None): super(FadeToBlackControl, self).__init__(parent) self.atem = atem self.ftb = ftb layout = QGridLayout() lblRate = QLabel("Rate") lblRate.setAlignment(Qt.AlignHCenter | Qt.AlignBottom) layout.addWidget(lblRate, 0, 0) self.rate = FrameRateTouchSpinner() self.rate.setValue(self.ftb.rate) layout.addWidget(self.rate, 1, 0) self.btnFade = ExpandingButton() self.btnFade.setText("Fade to Black") self.btnFade.setCheckable(True) self.btnFade.setChecked(self.ftb.active) layout.addWidget(self.btnFade, 1, 1) self.ftb.rateChanged.connect(self.rate.setValue) self.ftb.activeChanged.connect(self.btnFade.setChecked) if self.atem: self.rate.valueChanged.connect(self.atem.setFadeToBlackRate) self.btnFade.clicked.connect(self.atem.performFadeToBlack) layout.setRowStretch(0, 1) layout.setRowStretch(1, 1) self.setLayout(layout)
class RecorderControl(ScreenWithBackButton): def __init__(self, hyperdeck, atem, state, mainWindow): self.hyperdeck = hyperdeck self.atem = atem self.state = state self.mainWindow = mainWindow super(RecorderControl, self).__init__("Recorder", mainWindow) self.state.transportChange.connect(self.updateState) if self.hyperdeck: self.updateState(state.transport) def makeContent(self): layout = QGridLayout() self.btnGroupSDCard = QButtonGroup() self.sdSlotMapper = QSignalMapper() for i in range(2): btn = ExpandingButton() btn.setCheckable(True) btn.setText("SD card {}".format(i + 1)) btn.clicked.connect(self.sdSlotMapper.map) self.sdSlotMapper.setMapping(btn, i + 1) self.btnGroupSDCard.addButton(btn, i) layout.addWidget(btn, 0, i) self.sdSlotMapper.mapped.connect(self.hyperdeck.selectSlot) self.btnSetPreview = ExpandingButton() self.btnSetPreview.setText("To preview") self.btnSetPreview.clicked.connect( lambda: self.atem.setPreview(VideoSource.INPUT_7)) layout.addWidget(self.btnSetPreview, 0, 4) btnClearPeaks = ExpandingButton() btnClearPeaks.setText("Clear VU peaks") btnClearPeaks.clicked.connect(self.atem.resetAudioMixerPeaks) layout.addWidget(btnClearPeaks, 0, 5) self.btnGroupTransportMode = QButtonGroup() self.btnPlaybackMode = ExpandingButton() self.btnPlaybackMode.setCheckable(True) self.btnPlaybackMode.setChecked(True) self.btnPlaybackMode.setText("Playback mode") self.btnGroupTransportMode.addButton(self.btnPlaybackMode) self.btnPlaybackMode.clicked.connect( lambda: self._setRecordMode(False)) layout.addWidget(self.btnPlaybackMode, 1, 1, 1, 2) self.btnRecordMode = ExpandingButton() self.btnRecordMode.setCheckable(True) self.btnRecordMode.setText("Record mode") self.btnGroupTransportMode.addButton(self.btnRecordMode) self.btnRecordMode.clicked.connect(lambda: self._setRecordMode(True)) layout.addWidget(self.btnRecordMode, 1, 3, 1, 2) self.btnSkipBack = _make_button("Back", ":icons/media-skip-backward", self.hyperdeck.prev) layout.addWidget(self.btnSkipBack, 2, 0) self.btngroup = QButtonGroup() self.btnPlay = _make_button("Play", ":icons/media-playback-start", self.hyperdeck.play) self.btnPlay.setCheckable(True) self.btngroup.addButton(self.btnPlay) layout.addWidget(self.btnPlay, 2, 1) self.btnLoopPlay = _make_button("Loop", ":icons/media-playback-loop", lambda: self.hyperdeck.play(loop=True)) layout.addWidget(self.btnLoopPlay, 2, 2) self.btnSkipForward = _make_button("Forward", ":icons/media-skip-forward", self.hyperdeck.next) layout.addWidget(self.btnSkipForward, 2, 3) self.btnStop = _make_button("Stop", ":icons/media-playback-stop", self.hyperdeck.stop) self.btnStop.setCheckable(True) self.btngroup.addButton(self.btnStop) layout.addWidget(self.btnStop, 2, 4) self.btnRecord = _make_button("Record", ":icons/media-record", self.hyperdeck.record) self.btnRecord.setCheckable(True) self.btnRecord.setEnabled(False) self.btngroup.addButton(self.btnRecord) layout.addWidget(self.btnRecord, 2, 5) self.clipSelectionScreen = RecorderClipSelectionScreen( self.hyperdeck, self.state, self.mainWindow) self.state.clipsListChange.connect( self.clipSelectionScreen.populateClipsList) self.state.transportChange.connect( self.clipSelectionScreen._updateClipSelectionFromState) self.btnChooseClip = ExpandingButton() self.btnChooseClip.setText("Select clip") self.btnChooseClip.clicked.connect(self._showClipSelection) layout.addWidget(self.btnChooseClip, 3, 1, 1, 2) layout.setRowStretch(0, 1) layout.setRowStretch(1, 1) layout.setRowStretch(2, 2) layout.setRowStretch(3, 1) return layout def updateState(self, state): if 'status' in state: self.btnRecord.setChecked(state['status'] == TransportState.RECORD) self.btnPlay.setChecked(state['status'] == TransportState.PLAYING) self.btnStop.setChecked( state['status'] != TransportState.RECORD and state['status'] != TransportState.PLAYING) currentSlot = state.get('active slot', 1) self.btnGroupSDCard.button(currentSlot - 1).setChecked(True) def _setRecordMode(self, isRecordMode): if isRecordMode: self.btnSkipBack.setEnabled(False) self.btnSkipForward.setEnabled(False) self.btnPlay.setEnabled(False) self.btnPlay.setChecked(False) self.btnLoopPlay.setEnabled(False) self.btnRecord.setEnabled(True) self.hyperdeck.setTransportMode(TransportMode.RECORD) else: self.btnSkipBack.setEnabled(True) self.btnSkipForward.setEnabled(True) self.btnPlay.setEnabled(True) self.btnLoopPlay.setEnabled(True) self.btnRecord.setEnabled(False) self.btnRecord.setChecked(False) self.hyperdeck.setTransportMode(TransportMode.PLAYBACK) def _showClipSelection(self): self.hyperdeck.broadcastClipsList() self.mainWindow.showScreen(self.clipSelectionScreen)
class OverlayControl(QWidget): def __init__(self, dsk, atem, parent=None): super(OverlayControl, self).__init__(parent) self.atem = atem self.dsk = dsk dsk.changedState.connect(self.update_from_dsk) layout = QGridLayout() lbl = QLabel("Overlay on main output:") lbl.setAlignment(Qt.AlignHCenter) layout.addWidget(lbl, 0, 0, 2, 1) self.onAirButton = ExpandingButton() self.onAirButton.setText("On Air") self.onAirButton.setCheckable(True) self.onAirButton.clicked.connect(self.setOnAir) layout.addWidget(self.onAirButton, 0, 1, 2, 1) self.autoButton = ExpandingButton() self.autoButton.setText("Auto Fade") self.autoButton.clicked.connect(self.takeAuto) layout.addWidget(self.autoButton, 2, 1, 2, 1) lblRate = QLabel("Rate:") lblRate.setAlignment(Qt.AlignHCenter | Qt.AlignBottom) layout.addWidget(lblRate, 2, 0) self.rate = FrameRateTouchSpinner() self.rate.setMinimum(1) self.rate.setMaximum(250) self.rate.setValue(25) self.rate.valueChanged.connect(self.setRate) layout.addWidget(self.rate, 3, 0) layout.setRowStretch(0, 1) layout.setRowStretch(1, 1) layout.setRowStretch(2, 1) layout.setRowStretch(3, 1) self.resetParams() self.update_from_dsk() self.setLayout(layout) def update_from_dsk(self): self.onAirButton.setChecked(self.dsk.onAir) self.onAirButton.setProperty("isLive", self.dsk.onAir) self.onAirButton.style().unpolish(self.onAirButton) self.onAirButton.style().polish(self.onAirButton) self.rate.setValue(self.dsk.rate) @with_atem def setOnAir(self): self.atem.setDSKOnAir(self.dsk.idx, self.onAirButton.isChecked()) @with_atem def takeAuto(self): self.atem.performDSKAuto(self.dsk.idx) @with_atem def setRate(self, rate): self.atem.setDSKRate(self.dsk.idx, rate) @with_atem def resetParams(self): self.atem.setDSKFillSource(self.dsk.idx, VideoSource.INPUT_5) self.atem.setDSKKeySource(self.dsk.idx, VideoSource.INPUT_5) self.atem.setDSKParams(self.dsk.idx, preMultiplied=False, gain=500, clip=210)
class RecorderControl(ScreenWithBackButton): def __init__(self, hyperdeck, atem, state, mainWindow): self.hyperdeck = hyperdeck self.atem = atem self.state = state self.mainWindow = mainWindow super(RecorderControl, self).__init__("Recorder", mainWindow) self.state.transportChange.connect(self.updateState) if self.hyperdeck: self.updateState(state.transport) def makeContent(self): layout = QGridLayout() self.btnGroupSDCard = QButtonGroup() self.sdSlotMapper = QSignalMapper() for i in range(2): btn = ExpandingButton() btn.setCheckable(True) btn.setText("SD card {}".format(i + 1)) btn.clicked.connect(self.sdSlotMapper.map) self.sdSlotMapper.setMapping(btn, i + 1) self.btnGroupSDCard.addButton(btn, i) layout.addWidget(btn, 0, i) self.sdSlotMapper.mapped.connect(self.hyperdeck.selectSlot) self.btnSetPreview = ExpandingButton() self.btnSetPreview.setText("To preview") self.btnSetPreview.clicked.connect(lambda: self.atem.setPreview(VideoSource.INPUT_7)) layout.addWidget(self.btnSetPreview, 0, 4) btnClearPeaks = ExpandingButton() btnClearPeaks.setText("Clear VU peaks") btnClearPeaks.clicked.connect(self.atem.resetAudioMixerPeaks) layout.addWidget(btnClearPeaks, 0, 5) self.btnGroupTransportMode = QButtonGroup() self.btnPlaybackMode = ExpandingButton() self.btnPlaybackMode.setCheckable(True) self.btnPlaybackMode.setChecked(True) self.btnPlaybackMode.setText("Playback mode") self.btnGroupTransportMode.addButton(self.btnPlaybackMode) self.btnPlaybackMode.clicked.connect(lambda: self._setRecordMode(False)) layout.addWidget(self.btnPlaybackMode, 1, 1, 1, 2) self.btnRecordMode = ExpandingButton() self.btnRecordMode.setCheckable(True) self.btnRecordMode.setText("Record mode") self.btnGroupTransportMode.addButton(self.btnRecordMode) self.btnRecordMode.clicked.connect(lambda: self._setRecordMode(True)) layout.addWidget(self.btnRecordMode, 1, 3, 1, 2) self.btnSkipBack = _make_button("Back", ":icons/media-skip-backward", self.hyperdeck.prev) layout.addWidget(self.btnSkipBack, 2, 0) self.btngroup = QButtonGroup() self.btnPlay = _make_button("Play", ":icons/media-playback-start", self.hyperdeck.play) self.btnPlay.setCheckable(True) self.btngroup.addButton(self.btnPlay) layout.addWidget(self.btnPlay, 2, 1) self.btnLoopPlay = _make_button("Loop", ":icons/media-playback-loop", lambda: self.hyperdeck.play(loop=True)) layout.addWidget(self.btnLoopPlay, 2, 2) self.btnSkipForward = _make_button("Forward", ":icons/media-skip-forward", self.hyperdeck.next) layout.addWidget(self.btnSkipForward, 2, 3) self.btnStop = _make_button("Stop", ":icons/media-playback-stop", self.hyperdeck.stop) self.btnStop.setCheckable(True) self.btngroup.addButton(self.btnStop) layout.addWidget(self.btnStop, 2, 4) self.btnRecord = _make_button("Record", ":icons/media-record", self.hyperdeck.record) self.btnRecord.setCheckable(True) self.btnRecord.setEnabled(False) self.btngroup.addButton(self.btnRecord) layout.addWidget(self.btnRecord, 2, 5) self.clipSelectionScreen = RecorderClipSelectionScreen(self.hyperdeck, self.state, self.mainWindow) self.state.clipsListChange.connect(self.clipSelectionScreen.populateClipsList) self.state.transportChange.connect(self.clipSelectionScreen._updateClipSelectionFromState) self.btnChooseClip = ExpandingButton() self.btnChooseClip.setText("Select clip") self.btnChooseClip.clicked.connect(self._showClipSelection) layout.addWidget(self.btnChooseClip, 3, 1, 1, 2) layout.setRowStretch(0, 1) layout.setRowStretch(1, 1) layout.setRowStretch(2, 2) layout.setRowStretch(3, 1) return layout def updateState(self, state): if 'status' in state: self.btnRecord.setChecked(state['status'] == TransportState.RECORD) self.btnPlay.setChecked(state['status'] == TransportState.PLAYING) self.btnStop.setChecked(state['status'] != TransportState.RECORD and state['status'] != TransportState.PLAYING) currentSlot = state.get('active slot', 1) self.btnGroupSDCard.button(currentSlot - 1).setChecked(True) def _setRecordMode(self, isRecordMode): if isRecordMode: self.btnSkipBack.setEnabled(False) self.btnSkipForward.setEnabled(False) self.btnPlay.setEnabled(False) self.btnPlay.setChecked(False) self.btnLoopPlay.setEnabled(False) self.btnRecord.setEnabled(True) self.hyperdeck.setTransportMode(TransportMode.RECORD) else: self.btnSkipBack.setEnabled(True) self.btnSkipForward.setEnabled(True) self.btnPlay.setEnabled(True) self.btnLoopPlay.setEnabled(True) self.btnRecord.setEnabled(False) self.btnRecord.setChecked(False) self.hyperdeck.setTransportMode(TransportMode.PLAYBACK) def _showClipSelection(self): self.hyperdeck.broadcastClipsList() self.mainWindow.showScreen(self.clipSelectionScreen)