| @@ -2,7 +2,7 @@ | |||||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||
| # Carla plugin/slot skin code | # Carla plugin/slot skin code | ||||
| # Copyright (C) 2013 Filipe Coelho <falktx@falktx.com> | |||||
| # Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com> | |||||
| # | # | ||||
| # This program is free software; you can redistribute it and/or | # This program is free software; you can redistribute it and/or | ||||
| # modify it under the terms of the GNU General Public License as | # modify it under the terms of the GNU General Public License as | ||||
| @@ -32,13 +32,14 @@ from carla_widgets import * | |||||
| from pixmapdial import PixmapDial | from pixmapdial import PixmapDial | ||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Abstract plugin slot | |||||
| class PluginSlot(QFrame): | |||||
| class AbstractPluginSlot(QFrame): | |||||
| def __init__(self, parent, pluginId): | def __init__(self, parent, pluginId): | ||||
| QFrame.__init__(self, parent) | QFrame.__init__(self, parent) | ||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Internal stuff | |||||
| # Get plugin info | |||||
| self.fPluginId = pluginId | self.fPluginId = pluginId | ||||
| self.fPluginInfo = Carla.host.get_plugin_info(self.fPluginId) if Carla.host is not None else gFakePluginInfo | self.fPluginInfo = Carla.host.get_plugin_info(self.fPluginId) if Carla.host is not None else gFakePluginInfo | ||||
| @@ -50,15 +51,22 @@ class PluginSlot(QFrame): | |||||
| self.fPluginInfo['copyright'] = charPtrToString(self.fPluginInfo['copyright']) | self.fPluginInfo['copyright'] = charPtrToString(self.fPluginInfo['copyright']) | ||||
| self.fPluginInfo['iconName'] = charPtrToString(self.fPluginInfo['iconName']) | self.fPluginInfo['iconName'] = charPtrToString(self.fPluginInfo['iconName']) | ||||
| self.fParameterIconTimer = ICON_STATE_NULL | |||||
| if not Carla.isLocal: | if not Carla.isLocal: | ||||
| self.fPluginInfo['hints'] &= ~PLUGIN_HAS_CUSTOM_UI | self.fPluginInfo['hints'] &= ~PLUGIN_HAS_CUSTOM_UI | ||||
| # ------------------------------------------------------------- | |||||
| # Internal stuff | |||||
| self.fIsActive = False | |||||
| self.fLastGreenLedState = False | |||||
| self.fLastBlueLedState = False | |||||
| self.fParameterIconTimer = ICON_STATE_NULL | |||||
| if Carla.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK or Carla.host is None: | if Carla.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK or Carla.host is None: | ||||
| self.fPeaksInputCount = 2 | self.fPeaksInputCount = 2 | ||||
| self.fPeaksOutputCount = 2 | self.fPeaksOutputCount = 2 | ||||
| else: | else: | ||||
| audioCountInfo = Carla.host.get_audio_port_count_info(self.fPluginId) | audioCountInfo = Carla.host.get_audio_port_count_info(self.fPluginId) | ||||
| @@ -77,6 +85,68 @@ class PluginSlot(QFrame): | |||||
| self.fEditDialog = PluginEdit(self, self.fPluginId) | self.fEditDialog = PluginEdit(self, self.fPluginId) | ||||
| self.fEditDialog.hide() | self.fEditDialog.hide() | ||||
| # ------------------------------------------------------------- | |||||
| # Set-up common widgets (as none) | |||||
| self.b_enable = None | |||||
| self.b_gui = None | |||||
| self.b_edit = None | |||||
| self.b_remove = None | |||||
| self.label_name = None | |||||
| self.led_control = None | |||||
| self.led_midi = None | |||||
| self.led_audio_in = None | |||||
| self.led_audio_out = None | |||||
| self.peak_in = None | |||||
| self.peak_out = None | |||||
| #------------------------------------------------------------------ | |||||
| def ready(self): | |||||
| if self.b_enable is not None: | |||||
| self.b_enable.clicked.connect(self.slot_enableClicked) | |||||
| if self.b_gui is not None: | |||||
| self.b_gui.clicked.connect(self.slot_showCustomUi) | |||||
| self.b_gui.setEnabled(bool(self.fPluginInfo['hints'] & PLUGIN_HAS_CUSTOM_UI)) | |||||
| if self.b_edit is not None: | |||||
| self.b_edit.clicked.connect(self.slot_showEditDialog) | |||||
| if self.b_remove is not None: | |||||
| self.b_remove.clicked.connect(self.slot_removePlugin) | |||||
| if self.label_name is not None: | |||||
| self.label_name.setText(self.fPluginInfo['name']) | |||||
| if self.led_control is not None: | |||||
| self.led_control.setColor(self.led_control.YELLOW) | |||||
| self.led_control.setEnabled(False) | |||||
| if self.led_midi is not None: | |||||
| self.led_midi.setColor(self.led_midi.RED) | |||||
| self.led_midi.setEnabled(False) | |||||
| if self.led_audio_in is not None: | |||||
| self.led_audio_in.setColor(self.led_audio_in.GREEN) | |||||
| self.led_audio_in.setEnabled(False) | |||||
| if self.led_audio_out is not None: | |||||
| self.led_audio_out.setColor(self.led_audio_out.BLUE) | |||||
| self.led_audio_out.setEnabled(False) | |||||
| if self.peak_in is not None: | |||||
| self.peak_in.setColor(self.peak_in.GREEN) | |||||
| self.peak_in.setChannels(self.fPeaksInputCount) | |||||
| self.peak_in.setOrientation(self.peak_in.HORIZONTAL) | |||||
| if self.peak_out is not None: | |||||
| self.peak_out.setColor(self.peak_in.BLUE) | |||||
| self.peak_out.setChannels(self.fPeaksOutputCount) | |||||
| self.peak_out.setOrientation(self.peak_out.HORIZONTAL) | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def getFixedHeight(self): | def getFixedHeight(self): | ||||
| @@ -90,6 +160,9 @@ class PluginSlot(QFrame): | |||||
| def recheckPluginHints(self, hints): | def recheckPluginHints(self, hints): | ||||
| self.fPluginInfo['hints'] = hints | self.fPluginInfo['hints'] = hints | ||||
| if self.b_gui is not None: | |||||
| self.b_gui.setEnabled(bool(hints & PLUGIN_HAS_CUSTOM_UI)) | |||||
| def setId(self, idx): | def setId(self, idx): | ||||
| self.fPluginId = idx | self.fPluginId = idx | ||||
| self.fEditDialog.setId(idx) | self.fEditDialog.setId(idx) | ||||
| @@ -97,9 +170,14 @@ class PluginSlot(QFrame): | |||||
| def setName(self, name): | def setName(self, name): | ||||
| self.fEditDialog.setName(name) | self.fEditDialog.setName(name) | ||||
| if self.label_name is not None: | |||||
| self.label_name.setText(name) | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def setActive(self, active, sendGui=False, sendCallback=True): | def setActive(self, active, sendGui=False, sendCallback=True): | ||||
| self.fIsActive = active | |||||
| if sendGui: self.activeChanged(active) | if sendGui: self.activeChanged(active) | ||||
| if sendCallback: Carla.host.set_active(self.fPluginId, active) | if sendCallback: Carla.host.set_active(self.fPluginId, active) | ||||
| @@ -112,7 +190,7 @@ class PluginSlot(QFrame): | |||||
| if parameterId <= PARAMETER_MAX or parameterId >= PARAMETER_NULL: | if parameterId <= PARAMETER_MAX or parameterId >= PARAMETER_NULL: | ||||
| return | return | ||||
| if parameterId == PARAMETER_ACTIVE: | |||||
| elif parameterId == PARAMETER_ACTIVE: | |||||
| return self.setActive(bool(value), True, True) | return self.setActive(bool(value), True, True) | ||||
| elif parameterId == PARAMETER_DRYWET: | elif parameterId == PARAMETER_DRYWET: | ||||
| @@ -182,19 +260,50 @@ class PluginSlot(QFrame): | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def activeChanged(self, onOff): | def activeChanged(self, onOff): | ||||
| pass | |||||
| self.fIsActive = onOff | |||||
| if self.b_enable is None: | |||||
| return | |||||
| self.b_enable.blockSignals(True) | |||||
| self.b_enable.setChecked(onOff) | |||||
| self.b_enable.blockSignals(False) | |||||
| def editDialogChanged(self, visible): | def editDialogChanged(self, visible): | ||||
| pass | |||||
| if self.b_edit is None: | |||||
| return | |||||
| self.b_edit.blockSignals(True) | |||||
| self.b_edit.setChecked(visible) | |||||
| self.b_edit.blockSignals(False) | |||||
| def customUiStateChanged(self, state): | def customUiStateChanged(self, state): | ||||
| pass | |||||
| if self.b_gui is None: | |||||
| return | |||||
| self.b_gui.blockSignals(True) | |||||
| if state == 0: | |||||
| self.b_gui.setChecked(False) | |||||
| self.b_gui.setEnabled(True) | |||||
| elif state == 1: | |||||
| self.b_gui.setChecked(True) | |||||
| self.b_gui.setEnabled(True) | |||||
| elif state == -1: | |||||
| self.b_gui.setChecked(False) | |||||
| self.b_gui.setEnabled(False) | |||||
| self.b_gui.blockSignals(False) | |||||
| def parameterActivityChanged(self, onOff): | def parameterActivityChanged(self, onOff): | ||||
| pass | |||||
| if self.led_control is None: | |||||
| return | |||||
| self.led_control.setChecked(onOff) | |||||
| def midiActivityChanged(self, onOff): | def midiActivityChanged(self, onOff): | ||||
| pass | |||||
| if self.led_midi is None: | |||||
| return | |||||
| self.led_midi.setChecked(onOff) | |||||
| def parameterValueChanged(self, parameterId, value): | def parameterValueChanged(self, parameterId, value): | ||||
| pass | pass | ||||
| @@ -214,7 +323,49 @@ class PluginSlot(QFrame): | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def idleFast(self): | def idleFast(self): | ||||
| pass | |||||
| # Input peaks | |||||
| if self.fPeaksInputCount > 0: | |||||
| if self.fPeaksInputCount > 1: | |||||
| peak1 = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_input_peak_value(self.fPluginId, False) | |||||
| ledState = bool(peak1 != 0.0 or peak2 != 0.0) | |||||
| if self.peak_in is not None: | |||||
| self.peak_in.displayMeter(1, peak1) | |||||
| self.peak_in.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| ledState = bool(peak != 0.0) | |||||
| if self.peak_in is not None: | |||||
| self.peak_in.displayMeter(1, peak) | |||||
| if self.fLastGreenLedState != ledState and self.led_audio_in is not None: | |||||
| self.fLastGreenLedState = ledState | |||||
| self.led_audio_in.setChecked(ledState) | |||||
| # Output peaks | |||||
| if self.fPeaksOutputCount > 0: | |||||
| if self.fPeaksOutputCount > 1: | |||||
| peak1 = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_output_peak_value(self.fPluginId, False) | |||||
| ledState = bool(peak1 != 0.0 or peak2 != 0.0) | |||||
| if self.peak_out is not None: | |||||
| self.peak_out.displayMeter(1, peak1) | |||||
| self.peak_out.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| ledState = bool(peak != 0.0) | |||||
| if self.peak_out is not None: | |||||
| self.peak_out.displayMeter(1, peak) | |||||
| if self.fLastBlueLedState != ledState and self.led_audio_out is not None: | |||||
| self.fLastBlueLedState = ledState | |||||
| self.led_audio_out.setChecked(ledState) | |||||
| def idleSlow(self): | def idleSlow(self): | ||||
| if self.fParameterIconTimer == ICON_STATE_ON: | if self.fParameterIconTimer == ICON_STATE_ON: | ||||
| @@ -294,6 +445,16 @@ class PluginSlot(QFrame): | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| @pyqtSlot(bool) | |||||
| def slot_enableClicked(self, yesNo): | |||||
| self.setActive(yesNo, False, True) | |||||
| @pyqtSlot() | |||||
| def slot_showDefaultCustomMenu(self): | |||||
| self.showDefaultMenu(self.fIsActive, self.b_edit, self.b_gui) | |||||
| #------------------------------------------------------------------ | |||||
| @pyqtSlot(bool) | @pyqtSlot(bool) | ||||
| def slot_showCustomUi(self, show): | def slot_showCustomUi(self, show): | ||||
| Carla.host.show_custom_ui(self.fPluginId, show) | Carla.host.show_custom_ui(self.fPluginId, show) | ||||
| @@ -308,18 +469,15 @@ class PluginSlot(QFrame): | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| class PluginSlot_Default(PluginSlot): | |||||
| class PluginSlot_Default(AbstractPluginSlot): | |||||
| def __init__(self, parent, pluginId): | def __init__(self, parent, pluginId): | ||||
| PluginSlot.__init__(self, parent, pluginId) | |||||
| AbstractPluginSlot.__init__(self, parent, pluginId) | |||||
| self.ui = ui_carla_plugin_default.Ui_PluginWidget() | self.ui = ui_carla_plugin_default.Ui_PluginWidget() | ||||
| self.ui.setupUi(self) | self.ui.setupUi(self) | ||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Internal stuff | # Internal stuff | ||||
| self.fLastGreenLedState = False | |||||
| self.fLastBlueLedState = False | |||||
| if self.palette().window().color().lightness() > 100: | if self.palette().window().color().lightness() > 100: | ||||
| # Light background | # Light background | ||||
| labelColor = "333" | labelColor = "333" | ||||
| @@ -367,38 +525,24 @@ class PluginSlot_Default(PluginSlot): | |||||
| else: | else: | ||||
| self.ui.b_gui.setPixmaps(":/bitmaps/button_gui.png", ":/bitmaps/button_gui_down.png", ":/bitmaps/button_gui_hover.png") | self.ui.b_gui.setPixmaps(":/bitmaps/button_gui.png", ":/bitmaps/button_gui_down.png", ":/bitmaps/button_gui_hover.png") | ||||
| self.ui.b_gui.setEnabled((self.fPluginInfo['hints'] & PLUGIN_HAS_CUSTOM_UI) != 0) | |||||
| self.ui.led_control.setColor(self.ui.led_control.YELLOW) | |||||
| self.ui.led_control.setEnabled(False) | |||||
| self.ui.led_midi.setColor(self.ui.led_midi.RED) | |||||
| self.ui.led_midi.setEnabled(False) | |||||
| self.ui.led_audio_in.setColor(self.ui.led_audio_in.GREEN) | |||||
| self.ui.led_audio_in.setEnabled(False) | |||||
| self.ui.led_audio_out.setColor(self.ui.led_audio_out.BLUE) | |||||
| self.ui.led_audio_out.setEnabled(False) | |||||
| self.ui.peak_in.setColor(self.ui.peak_in.GREEN) | |||||
| self.ui.peak_in.setChannels(self.fPeaksInputCount) | |||||
| self.ui.peak_in.setOrientation(self.ui.peak_in.HORIZONTAL) | |||||
| # ------------------------------------------------------------- | |||||
| self.ui.peak_out.setColor(self.ui.peak_in.BLUE) | |||||
| self.ui.peak_out.setChannels(self.fPeaksOutputCount) | |||||
| self.ui.peak_out.setOrientation(self.ui.peak_out.HORIZONTAL) | |||||
| self.b_enable = self.ui.b_enable | |||||
| self.b_gui = self.ui.b_gui | |||||
| self.b_edit = self.ui.b_edit | |||||
| self.ui.label_name.setText(self.fPluginInfo['name']) | |||||
| self.label_name = self.ui.label_name | |||||
| self.led_control = self.ui.led_control | |||||
| self.led_midi = self.ui.led_midi | |||||
| self.led_audio_in = self.ui.led_audio_in | |||||
| self.led_audio_out = self.ui.led_audio_out | |||||
| # ------------------------------------------------------------- | |||||
| # Set-up connections | |||||
| self.peak_in = self.ui.peak_in | |||||
| self.peak_out = self.ui.peak_out | |||||
| self.ui.b_enable.clicked.connect(self.slot_enableClicked) | |||||
| self.ui.b_gui.clicked.connect(self.slot_showCustomUi) | |||||
| self.ui.b_edit.clicked.connect(self.slot_showEditDialog) | |||||
| self.ready() | |||||
| self.customContextMenuRequested.connect(self.slot_showCustomMenu) | |||||
| self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu) | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| @@ -407,100 +551,6 @@ class PluginSlot_Default(PluginSlot): | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def recheckPluginHints(self, hints): | |||||
| self.ui.b_gui.setEnabled(hints & PLUGIN_HAS_CUSTOM_UI) | |||||
| PluginSlot.recheckPluginHints(self, hints) | |||||
| def setName(self, name): | |||||
| self.ui.label_name.setText(name) | |||||
| PluginSlot.setName(self, name) | |||||
| #------------------------------------------------------------------ | |||||
| def activeChanged(self, onOff): | |||||
| self.ui.b_enable.blockSignals(True) | |||||
| self.ui.b_enable.setChecked(onOff) | |||||
| self.ui.b_enable.blockSignals(False) | |||||
| def editDialogChanged(self, visible): | |||||
| self.ui.b_edit.blockSignals(True) | |||||
| self.ui.b_edit.setChecked(visible) | |||||
| self.ui.b_edit.blockSignals(False) | |||||
| def customUiStateChanged(self, state): | |||||
| self.ui.b_gui.blockSignals(True) | |||||
| if state == 0: | |||||
| self.ui.b_gui.setChecked(False) | |||||
| self.ui.b_gui.setEnabled(True) | |||||
| elif state == 1: | |||||
| self.ui.b_gui.setChecked(True) | |||||
| self.ui.b_gui.setEnabled(True) | |||||
| elif state == -1: | |||||
| self.ui.b_gui.setChecked(False) | |||||
| self.ui.b_gui.setEnabled(False) | |||||
| self.ui.b_gui.blockSignals(False) | |||||
| def parameterActivityChanged(self, onOff): | |||||
| self.ui.led_control.setChecked(onOff) | |||||
| def midiActivityChanged(self, onOff): | |||||
| self.ui.led_midi.setChecked(onOff) | |||||
| #------------------------------------------------------------------ | |||||
| def idleFast(self): | |||||
| # Input peaks | |||||
| if self.fPeaksInputCount > 0: | |||||
| if self.fPeaksInputCount > 1: | |||||
| peak1 = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_input_peak_value(self.fPluginId, False) | |||||
| ledState = bool(peak1 != 0.0 or peak2 != 0.0) | |||||
| self.ui.peak_in.displayMeter(1, peak1) | |||||
| self.ui.peak_in.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| ledState = bool(peak != 0.0) | |||||
| self.ui.peak_in.displayMeter(1, peak) | |||||
| if self.fLastGreenLedState != ledState: | |||||
| self.fLastGreenLedState = ledState | |||||
| self.ui.led_audio_in.setChecked(ledState) | |||||
| # Output peaks | |||||
| if self.fPeaksOutputCount > 0: | |||||
| if self.fPeaksOutputCount > 1: | |||||
| peak1 = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_output_peak_value(self.fPluginId, False) | |||||
| ledState = bool(peak1 != 0.0 or peak2 != 0.0) | |||||
| self.ui.peak_out.displayMeter(1, peak1) | |||||
| self.ui.peak_out.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| ledState = bool(peak != 0.0) | |||||
| self.ui.peak_out.displayMeter(1, peak) | |||||
| if self.fLastBlueLedState != ledState: | |||||
| self.fLastBlueLedState = ledState | |||||
| self.ui.led_audio_out.setChecked(ledState) | |||||
| #------------------------------------------------------------------ | |||||
| @pyqtSlot(bool) | |||||
| def slot_enableClicked(self, yesNo): | |||||
| self.setActive(yesNo, False, True) | |||||
| @pyqtSlot() | |||||
| def slot_showCustomMenu(self): | |||||
| self.showDefaultMenu(self.ui.b_enable.isChecked(), self.ui.b_edit, self.ui.b_gui) | |||||
| #------------------------------------------------------------------ | |||||
| def paintEvent(self, event): | def paintEvent(self, event): | ||||
| painter = QPainter(self) | painter = QPainter(self) | ||||
| painter.save() | painter.save() | ||||
| @@ -544,7 +594,7 @@ class PluginSlot_Default(PluginSlot): | |||||
| painter.drawLine(0, height-1, width, height-1) | painter.drawLine(0, height-1, width, height-1) | ||||
| painter.restore() | painter.restore() | ||||
| PluginSlot.paintEvent(self, event) | |||||
| AbstractPluginSlot.paintEvent(self, event) | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| @@ -557,7 +607,7 @@ class PluginSlot_Pixmap(PluginSlot_Default): | |||||
| self.setStyleSheet(""" | self.setStyleSheet(""" | ||||
| QFrame#PluginWidget { | QFrame#PluginWidget { | ||||
| background-image: url(:/bitmaps/background_calf.png); | |||||
| background-image: url(:/bitmaps/background_zynfx.png); | |||||
| background-repeat: repeat-xy; | background-repeat: repeat-xy; | ||||
| }""") | }""") | ||||
| @@ -565,21 +615,19 @@ class PluginSlot_Pixmap(PluginSlot_Default): | |||||
| def paintEvent(self, event): | def paintEvent(self, event): | ||||
| # skip parent paiting | # skip parent paiting | ||||
| PluginSlot.paintEvent(self, event) | |||||
| AbstractPluginSlot.paintEvent(self, event) | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| class PluginSlot_Calf(PluginSlot): | |||||
| class PluginSlot_Calf(AbstractPluginSlot): | |||||
| def __init__(self, parent, pluginId): | def __init__(self, parent, pluginId): | ||||
| PluginSlot.__init__(self, parent, pluginId) | |||||
| AbstractPluginSlot.__init__(self, parent, pluginId) | |||||
| self.ui = ui_carla_plugin_calf.Ui_PluginWidget() | self.ui = ui_carla_plugin_calf.Ui_PluginWidget() | ||||
| self.ui.setupUi(self) | self.ui.setupUi(self) | ||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Internal stuff | # Internal stuff | ||||
| self.fIsActive = False | |||||
| self.fButtonFont = QFont() | self.fButtonFont = QFont() | ||||
| self.fButtonFont.setBold(False) | self.fButtonFont.setBold(False) | ||||
| self.fButtonFont.setPointSize(9) | self.fButtonFont.setPointSize(9) | ||||
| @@ -607,31 +655,17 @@ class PluginSlot_Calf(PluginSlot): | |||||
| self.ui.b_remove.setTopText(self.tr("Remove"), self.fButtonColorOn, self.fButtonFont) | self.ui.b_remove.setTopText(self.tr("Remove"), self.fButtonColorOn, self.fButtonFont) | ||||
| if self.fPluginInfo['hints'] & PLUGIN_HAS_CUSTOM_UI: | if self.fPluginInfo['hints'] & PLUGIN_HAS_CUSTOM_UI: | ||||
| self.ui.b_gui.setEnabled(True) | |||||
| self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOn, self.fButtonFont) | self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOn, self.fButtonFont) | ||||
| else: | else: | ||||
| self.ui.b_gui.setEnabled(False) | |||||
| self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOff, self.fButtonFont) | self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOff, self.fButtonFont) | ||||
| self.ui.led_midi.setColor(self.ui.led_midi.CALF) | |||||
| self.ui.led_midi.setEnabled(False) | |||||
| self.ui.peak_in.setColor(self.ui.peak_in.GREEN) | |||||
| self.ui.peak_in.setChannels(self.fPeaksInputCount) | |||||
| self.ui.peak_in.setOrientation(self.ui.peak_in.HORIZONTAL) | |||||
| self.ui.peak_out.setColor(self.ui.peak_in.BLUE) | |||||
| self.ui.peak_out.setChannels(self.fPeaksOutputCount) | |||||
| self.ui.peak_out.setOrientation(self.ui.peak_out.HORIZONTAL) | |||||
| labelFont = self.ui.label_name.font() | labelFont = self.ui.label_name.font() | ||||
| labelFont.setBold(True) | labelFont.setBold(True) | ||||
| labelFont.setPointSize(labelFont.pointSize()+3) | labelFont.setPointSize(labelFont.pointSize()+3) | ||||
| self.ui.label_name.setFont(labelFont) | self.ui.label_name.setFont(labelFont) | ||||
| self.ui.label_name.setText(self.fPluginInfo['name']) | |||||
| audioCount = Carla.host.get_audio_port_count_info(self.fPluginId) | |||||
| midiCount = Carla.host.get_midi_port_count_info(self.fPluginId) | |||||
| audioCount = Carla.host.get_audio_port_count_info(self.fPluginId) if Carla.host is not None else {'ins': 2, 'outs': 2 } | |||||
| midiCount = Carla.host.get_midi_port_count_info(self.fPluginId) if Carla.host is not None else {'ins': 1, 'outs': 0 } | |||||
| if audioCount['ins'] == 0: | if audioCount['ins'] == 0: | ||||
| self.ui.label_audio_in.hide() | self.ui.label_audio_in.hide() | ||||
| @@ -649,13 +683,20 @@ class PluginSlot_Calf(PluginSlot): | |||||
| self.ui.led_midi.hide() | self.ui.led_midi.hide() | ||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Set-up connections | |||||
| self.ui.b_gui.clicked.connect(self.slot_showCustomUi) | |||||
| self.ui.b_edit.clicked.connect(self.slot_showEditDialog) | |||||
| self.ui.b_remove.clicked.connect(self.slot_removePlugin) | |||||
| self.b_gui = self.ui.b_gui | |||||
| self.b_edit = self.ui.b_edit | |||||
| self.b_remove = self.ui.b_remove | |||||
| self.label_name = self.ui.label_name | |||||
| self.led_midi = self.ui.led_midi | |||||
| self.customContextMenuRequested.connect(self.slot_showCustomMenu) | |||||
| self.peak_in = self.ui.peak_in | |||||
| self.peak_out = self.ui.peak_out | |||||
| self.ready() | |||||
| self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu) | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| @@ -666,84 +707,17 @@ class PluginSlot_Calf(PluginSlot): | |||||
| def recheckPluginHints(self, hints): | def recheckPluginHints(self, hints): | ||||
| if hints & PLUGIN_HAS_CUSTOM_UI: | if hints & PLUGIN_HAS_CUSTOM_UI: | ||||
| self.ui.b_gui.setEnabled(True) | |||||
| self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOn, self.fButtonFont) | self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOn, self.fButtonFont) | ||||
| else: | else: | ||||
| self.ui.b_gui.setEnabled(False) | |||||
| self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOff, self.fButtonFont) | self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOff, self.fButtonFont) | ||||
| PluginSlot.recheckPluginHints(self, hints) | |||||
| def setName(self, name): | |||||
| self.ui.label_name.setText(name) | |||||
| PluginSlot.setName(self, name) | |||||
| #------------------------------------------------------------------ | |||||
| def activeChanged(self, onOff): | |||||
| self.fIsActive = onOff | |||||
| def editDialogChanged(self, visible): | |||||
| self.ui.b_edit.blockSignals(True) | |||||
| self.ui.b_edit.setChecked(visible) | |||||
| self.ui.b_edit.blockSignals(False) | |||||
| def customUiStateChanged(self, state): | |||||
| self.ui.b_gui.blockSignals(True) | |||||
| if state == 0: | |||||
| self.ui.b_gui.setChecked(False) | |||||
| self.ui.b_gui.setEnabled(True) | |||||
| elif state == 1: | |||||
| self.ui.b_gui.setChecked(True) | |||||
| self.ui.b_gui.setEnabled(True) | |||||
| elif state == -1: | |||||
| self.ui.b_gui.setChecked(False) | |||||
| self.ui.b_gui.setEnabled(False) | |||||
| self.ui.b_gui.blockSignals(False) | |||||
| def midiActivityChanged(self, onOff): | |||||
| self.ui.led_midi.setChecked(onOff) | |||||
| #------------------------------------------------------------------ | |||||
| def idleFast(self): | |||||
| # Input peaks | |||||
| if self.fPeaksInputCount > 0: | |||||
| if self.fPeaksInputCount > 1: | |||||
| peak1 = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_input_peak_value(self.fPluginId, False) | |||||
| self.ui.peak_in.displayMeter(1, peak1) | |||||
| self.ui.peak_in.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| self.ui.peak_in.displayMeter(1, peak) | |||||
| # Output peaks | |||||
| if self.fPeaksOutputCount > 0: | |||||
| if self.fPeaksOutputCount > 1: | |||||
| peak1 = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_output_peak_value(self.fPluginId, False) | |||||
| self.ui.peak_out.displayMeter(1, peak1) | |||||
| self.ui.peak_out.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| self.ui.peak_out.displayMeter(1, peak) | |||||
| #------------------------------------------------------------------ | |||||
| @pyqtSlot(bool) | |||||
| def slot_enableClicked(self, yesNo): | |||||
| self.fIsActive = yesNo | |||||
| @pyqtSlot() | |||||
| def slot_showCustomMenu(self): | |||||
| self.showDefaultMenu(self.fIsActive, self.ui.b_edit, self.ui.b_gui) | |||||
| AbstractPluginSlot.recheckPluginHints(self, hints) | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| class PluginSlot_ZynFX(PluginSlot): | |||||
| class PluginSlot_ZynFX(AbstractPluginSlot): | |||||
| def __init__(self, parent, pluginId): | def __init__(self, parent, pluginId): | ||||
| PluginSlot.__init__(self, parent, pluginId) | |||||
| AbstractPluginSlot.__init__(self, parent, pluginId) | |||||
| self.ui = ui_carla_plugin_zynfx.Ui_PluginWidget() | self.ui = ui_carla_plugin_zynfx.Ui_PluginWidget() | ||||
| self.ui.setupUi(self) | self.ui.setupUi(self) | ||||
| @@ -759,24 +733,12 @@ class PluginSlot_ZynFX(PluginSlot): | |||||
| self.ui.b_enable.setPixmaps(":/bitmaps/button_off.png", ":/bitmaps/button_on.png", ":/bitmaps/button_off.png") | self.ui.b_enable.setPixmaps(":/bitmaps/button_off.png", ":/bitmaps/button_on.png", ":/bitmaps/button_off.png") | ||||
| self.ui.b_edit.setPixmaps(":/bitmaps/button_edit.png", ":/bitmaps/button_edit_down.png", ":/bitmaps/button_edit_hover.png") | self.ui.b_edit.setPixmaps(":/bitmaps/button_edit.png", ":/bitmaps/button_edit_down.png", ":/bitmaps/button_edit_hover.png") | ||||
| self.ui.peak_in.setColor(self.ui.peak_in.GREEN) | |||||
| self.ui.peak_in.setChannels(self.fPeaksInputCount) | |||||
| self.ui.peak_in.setLinesEnabled(False) | |||||
| self.ui.peak_in.setOrientation(self.ui.peak_in.VERTICAL) | |||||
| self.ui.peak_out.setColor(self.ui.peak_in.BLUE) | |||||
| self.ui.peak_out.setChannels(self.fPeaksOutputCount) | |||||
| self.ui.peak_out.setLinesEnabled(False) | |||||
| self.ui.peak_out.setOrientation(self.ui.peak_out.VERTICAL) | |||||
| self.ui.label_name.setText(self.fPluginInfo['name']) | |||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Set-up parameters | # Set-up parameters | ||||
| self.fParameterList = [] # index, widget | self.fParameterList = [] # index, widget | ||||
| parameterCount = Carla.host.get_parameter_count(self.fPluginId) | |||||
| parameterCount = Carla.host.get_parameter_count(self.fPluginId) if Carla.host is not None else 0 | |||||
| index = 0 | index = 0 | ||||
| for i in range(parameterCount): | for i in range(parameterCount): | ||||
| @@ -909,47 +871,40 @@ class PluginSlot_ZynFX(PluginSlot): | |||||
| self.ui.label_presets.setVisible(False) | self.ui.label_presets.setVisible(False) | ||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Set-up connections | |||||
| self.ui.b_enable.clicked.connect(self.slot_enableClicked) | |||||
| self.ui.b_edit.clicked.connect(self.slot_showEditDialog) | |||||
| self.ui.cb_presets.currentIndexChanged.connect(self.slot_presetChanged) | |||||
| self.b_enable = self.ui.b_enable | |||||
| self.b_edit = self.ui.b_edit | |||||
| self.customContextMenuRequested.connect(self.slot_showCustomMenu) | |||||
| self.label_name = self.ui.label_name | |||||
| #------------------------------------------------------------------ | |||||
| self.peak_in = self.ui.peak_in | |||||
| self.peak_out = self.ui.peak_out | |||||
| def getFixedHeight(self): | |||||
| return 70 | |||||
| self.ready() | |||||
| self.peak_in.setOrientation(self.peak_in.VERTICAL) | |||||
| self.peak_out.setOrientation(self.peak_out.VERTICAL) | |||||
| self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu) | |||||
| self.ui.cb_presets.currentIndexChanged.connect(self.slot_presetChanged) | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def setName(self, name): | |||||
| self.ui.label_name.setText(name) | |||||
| PluginSlot.setName(self, name) | |||||
| def getFixedHeight(self): | |||||
| return 70 | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def setParameterValue(self, parameterId, value): | def setParameterValue(self, parameterId, value): | ||||
| self.parameterValueChanged(parameterId, value) | self.parameterValueChanged(parameterId, value) | ||||
| PluginSlot.setParameterValue(self, parameterId, value) | |||||
| AbstractPluginSlot.setParameterValue(self, parameterId, value) | |||||
| def setMidiProgram(self, index): | def setMidiProgram(self, index): | ||||
| self.midiProgramChanged(index) | self.midiProgramChanged(index) | ||||
| PluginSlot.setMidiProgram(self, index) | |||||
| AbstractPluginSlot.setMidiProgram(self, index) | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def activeChanged(self, onOff): | |||||
| self.ui.b_enable.blockSignals(True) | |||||
| self.ui.b_enable.setChecked(onOff) | |||||
| self.ui.b_enable.blockSignals(False) | |||||
| def editDialogChanged(self, visible): | |||||
| self.ui.b_edit.blockSignals(True) | |||||
| self.ui.b_edit.setChecked(visible) | |||||
| self.ui.b_edit.blockSignals(False) | |||||
| def parameterValueChanged(self, parameterId, value): | def parameterValueChanged(self, parameterId, value): | ||||
| for paramIndex, paramWidget in self.fParameterList: | for paramIndex, paramWidget in self.fParameterList: | ||||
| if paramIndex != parameterId: | if paramIndex != parameterId: | ||||
| @@ -967,51 +922,18 @@ class PluginSlot_ZynFX(PluginSlot): | |||||
| #------------------------------------------------------------------ | #------------------------------------------------------------------ | ||||
| def idleFast(self): | |||||
| # Input peaks | |||||
| if self.fPeaksInputCount > 0: | |||||
| if self.fPeaksInputCount > 1: | |||||
| peak1 = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_input_peak_value(self.fPluginId, False) | |||||
| self.ui.peak_in.displayMeter(1, peak1) | |||||
| self.ui.peak_in.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_input_peak_value(self.fPluginId, True) | |||||
| self.ui.peak_in.displayMeter(1, peak) | |||||
| # Output peaks | |||||
| if self.fPeaksOutputCount > 0: | |||||
| if self.fPeaksOutputCount > 1: | |||||
| peak1 = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| peak2 = Carla.host.get_output_peak_value(self.fPluginId, False) | |||||
| self.ui.peak_out.displayMeter(1, peak1) | |||||
| self.ui.peak_out.displayMeter(2, peak2) | |||||
| else: | |||||
| peak = Carla.host.get_output_peak_value(self.fPluginId, True) | |||||
| self.ui.peak_out.displayMeter(1, peak) | |||||
| #------------------------------------------------------------------ | |||||
| @pyqtSlot(bool) | |||||
| def slot_enableClicked(self, yesNo): | |||||
| self.setActive(yesNo, False, True) | |||||
| @pyqtSlot(int) | @pyqtSlot(int) | ||||
| def slot_parameterValueChanged(self, value): | def slot_parameterValueChanged(self, value): | ||||
| index = self.sender().getIndex() | index = self.sender().getIndex() | ||||
| value = float(value)/1000.0 | value = float(value)/1000.0 | ||||
| Carla.host.set_parameter_value(self.fPluginId, index, value) | Carla.host.set_parameter_value(self.fPluginId, index, value) | ||||
| PluginSlot.setParameterValue(self, index, value) | |||||
| AbstractPluginSlot.setParameterValue(self, index, value) | |||||
| @pyqtSlot(int) | @pyqtSlot(int) | ||||
| def slot_presetChanged(self, index): | def slot_presetChanged(self, index): | ||||
| Carla.host.set_midi_program(self.fPluginId, index) | Carla.host.set_midi_program(self.fPluginId, index) | ||||
| PluginSlot.setMidiProgram(self, index) | |||||
| @pyqtSlot() | |||||
| def slot_showCustomMenu(self): | |||||
| self.showDefaultMenu(self.ui.b_enable.isChecked(), self.ui.b_edit, None) | |||||
| AbstractPluginSlot.setMidiProgram(self, index) | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| @@ -1033,3 +955,16 @@ def createPluginSlot(parent, pluginId): | |||||
| return PluginSlot_Default(parent, pluginId) | return PluginSlot_Default(parent, pluginId) | ||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Main Testing | |||||
| if __name__ == '__main__': | |||||
| from carla_style import CarlaApplication | |||||
| import resources_rc | |||||
| app = CarlaApplication("Carla-Skins") | |||||
| gui = PluginSlot_Pixmap(None, 0) | |||||
| #gui = PluginSlot_Calf(None, 0) | |||||
| #gui = PluginSlot_ZynFX(None, 0) | |||||
| gui.show() | |||||
| app.exec_() | |||||