| @@ -87,6 +87,7 @@ UIs = \ | |||||
| source/ui_carla_about.py \ | source/ui_carla_about.py \ | ||||
| source/ui_carla_database.py \ | source/ui_carla_database.py \ | ||||
| source/ui_carla_edit.py \ | source/ui_carla_edit.py \ | ||||
| source/ui_carla_host.py \ | |||||
| source/ui_carla_parameter.py \ | source/ui_carla_parameter.py \ | ||||
| source/ui_carla_plugin.py \ | source/ui_carla_plugin.py \ | ||||
| source/ui_carla_refresh.py \ | source/ui_carla_refresh.py \ | ||||
| @@ -31,6 +31,7 @@ except: | |||||
| from carla_host import * | from carla_host import * | ||||
| from carla_rack import CarlaRackW | from carla_rack import CarlaRackW | ||||
| #from carla_patchbay import CarlaPatchbayW | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Main Window | # Main Window | ||||
| @@ -38,40 +39,21 @@ from carla_rack import CarlaRackW | |||||
| class CarlaMiniW(HostWindow): | class CarlaMiniW(HostWindow): | ||||
| def __init__(self, parent=None): | def __init__(self, parent=None): | ||||
| HostWindow.__init__(self, parent) | HostWindow.__init__(self, parent) | ||||
| #self.ui = ui_carla.Ui_CarlaMainW() | |||||
| #self.ui.setupUi(self) | |||||
| Carla.host.engine_init("JACK", "Carla") | |||||
| self.fContainer = CarlaRackW(self) | self.fContainer = CarlaRackW(self) | ||||
| #self.fContainer = CarlaPatchbayW(self) | |||||
| self.setCentralWidget(self.fContainer) | self.setCentralWidget(self.fContainer) | ||||
| Carla.host.engine_init("JACK", "Carla") | |||||
| self.init() | self.init() | ||||
| QTimer.singleShot(0, self.slot_pluginAdd) | |||||
| Carla.host.patchbay_refresh() | |||||
| def closeEvent(self, event): | def closeEvent(self, event): | ||||
| Carla.host.engine_close() | Carla.host.engine_close() | ||||
| HostWindow.closeEvent(self, event) | HostWindow.closeEvent(self, event) | ||||
| @pyqtSlot() | |||||
| def slot_pluginAdd(self): | |||||
| dialog = PluginDatabaseW(self) | |||||
| if not dialog.exec_(): | |||||
| return | |||||
| btype = dialog.fRetPlugin['build'] | |||||
| ptype = dialog.fRetPlugin['type'] | |||||
| filename = dialog.fRetPlugin['binary'] | |||||
| label = dialog.fRetPlugin['label'] | |||||
| if not Carla.host.add_plugin(btype, ptype, filename, None, label, c_nullptr): | |||||
| CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), cString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) | |||||
| return | |||||
| self.fContainer.addPlugin(0) | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # --------------- main ------------------ | # --------------- main ------------------ | ||||
| @@ -96,6 +78,8 @@ if __name__ == '__main__': | |||||
| # Create GUI and start engine | # Create GUI and start engine | ||||
| Carla.gui = CarlaMiniW() | Carla.gui = CarlaMiniW() | ||||
| Carla.host.patchbay_refresh() | |||||
| # Show GUI | # Show GUI | ||||
| Carla.gui.show() | Carla.gui.show() | ||||
| @@ -32,15 +32,6 @@ import ui_carla | |||||
| from carla_shared import * | from carla_shared import * | ||||
| # ------------------------------------------------------------------------------------------------------------ | |||||
| # Try Import OpenGL | |||||
| try: | |||||
| from PyQt4.QtOpenGL import QGLWidget | |||||
| hasGL = True | |||||
| except: | |||||
| hasGL = False | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Static Variables | # Static Variables | ||||
| @@ -20,13 +20,15 @@ | |||||
| # Imports (Global) | # Imports (Global) | ||||
| try: | try: | ||||
| from PyQt5.QtWidgets import QMainWindow | |||||
| from PyQt5.QtWidgets import QApplication, QMainWindow | |||||
| except: | except: | ||||
| from PyQt4.QtGui import QMainWindow | |||||
| from PyQt4.QtGui import QApplication, QMainWindow | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Imports (Custom) | # Imports (Custom) | ||||
| import ui_carla_host | |||||
| from carla_database import * | from carla_database import * | ||||
| from carla_settings import * | from carla_settings import * | ||||
| from carla_widgets import * | from carla_widgets import * | ||||
| @@ -38,15 +40,111 @@ class CarlaDummyW(object): | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| object.__init__(self) | object.__init__(self) | ||||
| def addPlugin(self, pluginId): | |||||
| # ----------------------------------------------------------------- | |||||
| def getPluginCount(self): | |||||
| return 0 | |||||
| def getPlugin(self, pluginId): | |||||
| return None | |||||
| # ----------------------------------------------------------------- | |||||
| def addPlugin(self, pluginId, isProjectLoading): | |||||
| pass | pass | ||||
| def removePlugin(self, pluginId): | def removePlugin(self, pluginId): | ||||
| pass | pass | ||||
| def renamePlugin(self, pluginId, newName): | |||||
| pass | |||||
| def removeAllPlugins(self): | def removeAllPlugins(self): | ||||
| pass | pass | ||||
| # ----------------------------------------------------------------- | |||||
| def setParameterValue(self, pluginId, index, value): | |||||
| pass | |||||
| def setParameterDefault(self, pluginId, index, value): | |||||
| pass | |||||
| def setParameterMidiChannel(self, pluginId, index, channel): | |||||
| pass | |||||
| def setParameterMidiCC(self, pluginId, index, cc): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def setProgram(self, pluginId, index): | |||||
| pass | |||||
| def setMidiProgram(self, pluginId, index): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def noteOn(self, pluginId, channel, note, velocity): | |||||
| pass | |||||
| def noteOff(self, pluginId, channel, note): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def setGuiState(self, pluginId, state): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def updateInfo(self, pluginId): | |||||
| pass | |||||
| def reloadInfo(self, pluginId): | |||||
| pass | |||||
| def reloadParameters(self, pluginId): | |||||
| pass | |||||
| def reloadPrograms(self, pluginId): | |||||
| pass | |||||
| def reloadAll(self, pluginId): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def patchbayClientAdded(self, clientId, clientIcon, clientName): | |||||
| pass | |||||
| def patchbayClientRemoved(self, clientId, clientName): | |||||
| pass | |||||
| def patchbayClientRenamed(self, clientId, newClientName): | |||||
| pass | |||||
| def patchbayPortAdded(self, clientId, portId, portFlags, portName): | |||||
| pass | |||||
| def patchbayPortRemoved(self, groupId, portId, fullPortName): | |||||
| pass | |||||
| def patchbayPortRenamed(self, groupId, portId, newPortName): | |||||
| pass | |||||
| def patchbayConnectionAdded(self, connectionId, portOutId, portInId): | |||||
| pass | |||||
| def patchbayConnectionRemoved(self, connectionId): | |||||
| pass | |||||
| def patchbayIconChanged(self, clientId, clientIcon): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def idleFast(self): | def idleFast(self): | ||||
| pass | pass | ||||
| @@ -97,8 +195,8 @@ class HostWindow(QMainWindow): | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| QMainWindow.__init__(self, parent) | QMainWindow.__init__(self, parent) | ||||
| #self.ui = ui_carla_plugin.Ui_PluginWidget() | |||||
| #self.ui.setupUi(self) | |||||
| self.ui = ui_carla_host.Ui_CarlaHostW() | |||||
| self.ui.setupUi(self) | |||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Set bridge paths | # Set bridge paths | ||||
| @@ -169,6 +267,7 @@ class HostWindow(QMainWindow): | |||||
| self.fIdleTimerFast = 0 | self.fIdleTimerFast = 0 | ||||
| self.fIdleTimerSlow = 0 | self.fIdleTimerSlow = 0 | ||||
| self.fIsProjectLoading = False | |||||
| self.fLadspaRdfNeedsUpdate = True | self.fLadspaRdfNeedsUpdate = True | ||||
| self.fLadspaRdfList = [] | self.fLadspaRdfList = [] | ||||
| @@ -176,6 +275,107 @@ class HostWindow(QMainWindow): | |||||
| self.fContainer = CarlaDummyW(self) | self.fContainer = CarlaDummyW(self) | ||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Connect actions to functions | |||||
| #self.connect(self.ui.act_file_new, SIGNAL("triggered()"), SLOT("slot_fileNew()")) | |||||
| #self.connect(self.ui.act_file_open, SIGNAL("triggered()"), SLOT("slot_fileOpen()")) | |||||
| #self.connect(self.ui.act_file_save, SIGNAL("triggered()"), SLOT("slot_fileSave()")) | |||||
| #self.connect(self.ui.act_file_save_as, SIGNAL("triggered()"), SLOT("slot_fileSaveAs()")) | |||||
| ##self.connect(self.ui.act_file_export_lv2, SIGNAL("triggered()"), SLOT("slot_fileExportLv2Preset()")) | |||||
| #self.connect(self.ui.act_engine_start, SIGNAL("triggered()"), SLOT("slot_engineStart()")) | |||||
| #self.connect(self.ui.act_engine_stop, SIGNAL("triggered()"), SLOT("slot_engineStop()")) | |||||
| self.ui.act_plugin_add.triggered.connect(self.slot_pluginAdd) | |||||
| self.ui.act_plugin_add2.triggered.connect(self.slot_pluginAdd) | |||||
| self.ui.act_plugin_remove_all.triggered.connect(self.slot_pluginRemoveAll) | |||||
| #self.connect(self.ui.act_plugins_enable, SIGNAL("triggered()"), SLOT("slot_pluginsEnable()")) | |||||
| #self.connect(self.ui.act_plugins_disable, SIGNAL("triggered()"), SLOT("slot_pluginsDisable()")) | |||||
| #self.connect(self.ui.act_plugins_panic, SIGNAL("triggered()"), SLOT("slot_pluginsDisable()")) | |||||
| #self.connect(self.ui.act_plugins_volume100, SIGNAL("triggered()"), SLOT("slot_pluginsVolume100()")) | |||||
| #self.connect(self.ui.act_plugins_mute, SIGNAL("triggered()"), SLOT("slot_pluginsMute()")) | |||||
| #self.connect(self.ui.act_plugins_wet100, SIGNAL("triggered()"), SLOT("slot_pluginsWet100()")) | |||||
| #self.connect(self.ui.act_plugins_bypass, SIGNAL("triggered()"), SLOT("slot_pluginsBypass()")) | |||||
| #self.connect(self.ui.act_plugins_center, SIGNAL("triggered()"), SLOT("slot_pluginsCenter()")) | |||||
| #self.connect(self.ui.act_transport_play, SIGNAL("triggered(bool)"), SLOT("slot_transportPlayPause(bool)")) | |||||
| #self.connect(self.ui.act_transport_stop, SIGNAL("triggered()"), SLOT("slot_transportStop()")) | |||||
| #self.connect(self.ui.act_transport_backwards, SIGNAL("triggered()"), SLOT("slot_transportBackwards()")) | |||||
| #self.connect(self.ui.act_transport_forwards, SIGNAL("triggered()"), SLOT("slot_transportForwards()")) | |||||
| #self.ui.act_canvas_arrange.setEnabled(False) # TODO, later | |||||
| #self.connect(self.ui.act_canvas_arrange, SIGNAL("triggered()"), SLOT("slot_canvasArrange()")) | |||||
| #self.connect(self.ui.act_canvas_refresh, SIGNAL("triggered()"), SLOT("slot_canvasRefresh()")) | |||||
| #self.connect(self.ui.act_canvas_zoom_fit, SIGNAL("triggered()"), SLOT("slot_canvasZoomFit()")) | |||||
| #self.connect(self.ui.act_canvas_zoom_in, SIGNAL("triggered()"), SLOT("slot_canvasZoomIn()")) | |||||
| #self.connect(self.ui.act_canvas_zoom_out, SIGNAL("triggered()"), SLOT("slot_canvasZoomOut()")) | |||||
| #self.connect(self.ui.act_canvas_zoom_100, SIGNAL("triggered()"), SLOT("slot_canvasZoomReset()")) | |||||
| #self.connect(self.ui.act_canvas_print, SIGNAL("triggered()"), SLOT("slot_canvasPrint()")) | |||||
| #self.connect(self.ui.act_canvas_save_image, SIGNAL("triggered()"), SLOT("slot_canvasSaveImage()")) | |||||
| self.ui.act_settings_configure.triggered.connect(self.slot_configureCarla) | |||||
| self.ui.act_help_about.triggered.connect(self.slot_aboutCarla) | |||||
| self.ui.act_help_about_qt.triggered.connect(self.slot_aboutQt) | |||||
| #self.connect(self.ui.splitter, SIGNAL("splitterMoved.connect(self.slot_splitterMoved()")) | |||||
| #self.connect(self.ui.cb_disk, SIGNAL("currentIndexChanged.connect(self.slot_diskFolderChanged) | |||||
| #self.connect(self.ui.b_disk_add, SIGNAL("clicked()"), SLOT("slot_diskFolderAdd()")) | |||||
| #self.connect(self.ui.b_disk_remove, SIGNAL("clicked()"), SLOT("slot_diskFolderRemove()")) | |||||
| #self.connect(self.ui.fileTreeView, SIGNAL("doubleClicked(QModelIndex)"), SLOT("slot_fileTreeDoubleClicked(QModelIndex)")) | |||||
| #self.connect(self.ui.miniCanvasPreview, SIGNAL("miniCanvasMoved(double, double)"), SLOT("slot_miniCanvasMoved(double, double)")) | |||||
| #self.connect(self.ui.graphicsView.horizontalScrollBar(), SIGNAL("valueChanged.connect(self.slot_horizontalScrollBarChanged) | |||||
| #self.connect(self.ui.graphicsView.verticalScrollBar(), SIGNAL("valueChanged.connect(self.slot_verticalScrollBarChanged) | |||||
| #self.connect(self.scene, SIGNAL("sceneGroupMoved(int, int, QPointF)"), SLOT("slot_canvasItemMoved(int, int, QPointF)")) | |||||
| #self.connect(self.scene, SIGNAL("scaleChanged(double)"), SLOT("slot_canvasScaleChanged(double)")) | |||||
| self.DebugCallback.connect(self.slot_handleDebugCallback) | |||||
| self.PluginAddedCallback.connect(self.slot_handlePluginAddedCallback) | |||||
| self.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback) | |||||
| self.PluginRenamedCallback.connect(self.slot_handlePluginRenamedCallback) | |||||
| self.ParameterValueChangedCallback.connect(self.slot_handleParameterValueChangedCallback) | |||||
| self.ParameterDefaultChangedCallback.connect(self.slot_handleParameterDefaultChangedCallback) | |||||
| self.ParameterMidiChannelChangedCallback.connect(self.slot_handleParameterMidiChannelChangedCallback) | |||||
| self.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback) | |||||
| self.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback) | |||||
| self.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback) | |||||
| self.NoteOnCallback.connect(self.slot_handleNoteOnCallback) | |||||
| self.NoteOffCallback.connect(self.slot_handleNoteOffCallback) | |||||
| self.ShowGuiCallback.connect(self.slot_handleShowGuiCallback) | |||||
| self.UpdateCallback.connect(self.slot_handleUpdateCallback) | |||||
| self.ReloadInfoCallback.connect(self.slot_handleReloadInfoCallback) | |||||
| self.ReloadParametersCallback.connect(self.slot_handleReloadParametersCallback) | |||||
| self.ReloadProgramsCallback.connect(self.slot_handleReloadProgramsCallback) | |||||
| self.ReloadAllCallback.connect(self.slot_handleReloadAllCallback) | |||||
| self.PatchbayClientAddedCallback.connect(self.slot_handlePatchbayClientAddedCallback) | |||||
| self.PatchbayClientRemovedCallback.connect(self.slot_handlePatchbayClientRemovedCallback) | |||||
| self.PatchbayClientRenamedCallback.connect(self.slot_handlePatchbayClientRenamedCallback) | |||||
| self.PatchbayPortAddedCallback.connect(self.slot_handlePatchbayPortAddedCallback) | |||||
| self.PatchbayPortRemovedCallback.connect(self.slot_handlePatchbayPortRemovedCallback) | |||||
| self.PatchbayPortRenamedCallback.connect(self.slot_handlePatchbayPortRenamedCallback) | |||||
| self.PatchbayConnectionAddedCallback.connect(self.slot_handlePatchbayConnectionAddedCallback) | |||||
| self.PatchbayConnectionRemovedCallback.connect(self.slot_handlePatchbayConnectionRemovedCallback) | |||||
| self.PatchbayIconChangedCallback.connect(self.slot_handlePatchbayIconChangedCallback) | |||||
| #self.BufferSizeChangedCallback.connect(self.slot_handleBufferSizeChangedCallback) | |||||
| #self.SampleRateChangedCallback(double)"), SLOT("slot_handleSampleRateChangedCallback(double)")) | |||||
| #self.NSM_AnnounceCallback(QString)"), SLOT("slot_handleNSM_AnnounceCallback(QString)")) | |||||
| #self.NSM_OpenCallback(QString)"), SLOT("slot_handleNSM_OpenCallback(QString)")) | |||||
| #self.NSM_SaveCallback()"), SLOT("slot_handleNSM_SaveCallback()")) | |||||
| #self.ErrorCallback(QString)"), SLOT("slot_handleErrorCallback(QString)")) | |||||
| #self.QuitCallback()"), SLOT("slot_handleQuitCallback()")) | |||||
| self.SIGUSR1.connect(self.slot_handleSIGUSR1) | |||||
| self.SIGTERM.connect(self.slot_handleSIGTERM) | |||||
| # ----------------------------------------------------------------- | |||||
| def init(self): | |||||
| self.fIdleTimerFast = self.startTimer(50) | |||||
| self.fIdleTimerSlow = self.startTimer(50*2) | |||||
| def getExtraStuff(self, plugin): | def getExtraStuff(self, plugin): | ||||
| ptype = plugin['type'] | ptype = plugin['type'] | ||||
| @@ -225,9 +425,204 @@ class HostWindow(QMainWindow): | |||||
| def setLoadRDFsNeeded(self): | def setLoadRDFsNeeded(self): | ||||
| self.fLadspaRdfNeedsUpdate = True | self.fLadspaRdfNeedsUpdate = True | ||||
| def init(self): | |||||
| self.fIdleTimerFast = self.startTimer(50) | |||||
| self.fIdleTimerSlow = self.startTimer(50*2) | |||||
| # ----------------------------------------------------------------- | |||||
| @pyqtSlot() | |||||
| def slot_pluginAdd(self): | |||||
| dialog = PluginDatabaseW(self) | |||||
| if not dialog.exec_(): | |||||
| return | |||||
| if not Carla.host.is_engine_running(): | |||||
| QMessageBox.warning(self, self.tr("Warning"), self.tr("Cannot add new plugins while engine is stopped")) | |||||
| return | |||||
| btype = dialog.fRetPlugin['build'] | |||||
| ptype = dialog.fRetPlugin['type'] | |||||
| filename = dialog.fRetPlugin['binary'] | |||||
| label = dialog.fRetPlugin['label'] | |||||
| extraStuff = self.getExtraStuff(dialog.fRetPlugin) | |||||
| if not Carla.host.add_plugin(btype, ptype, filename, None, label, c_nullptr): | |||||
| CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), cString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) | |||||
| return | |||||
| @pyqtSlot() | |||||
| def slot_pluginRemoveAll(self): | |||||
| self.fContainer.removeAllPlugins() | |||||
| Carla.host.remove_all_plugins() | |||||
| @pyqtSlot() | |||||
| def slot_configureCarla(self): | |||||
| dialog = CarlaSettingsW(self, False) # TODO - hasGL | |||||
| if not dialog.exec_(): | |||||
| return | |||||
| #self.loadSettings(False) | |||||
| #patchcanvas.clear() | |||||
| #pOptions = patchcanvas.options_t() | |||||
| #pOptions.theme_name = self.fSavedSettings["Canvas/Theme"] | |||||
| #pOptions.auto_hide_groups = self.fSavedSettings["Canvas/AutoHideGroups"] | |||||
| #pOptions.use_bezier_lines = self.fSavedSettings["Canvas/UseBezierLines"] | |||||
| #pOptions.antialiasing = self.fSavedSettings["Canvas/Antialiasing"] | |||||
| #pOptions.eyecandy = self.fSavedSettings["Canvas/EyeCandy"] | |||||
| #pFeatures = patchcanvas.features_t() | |||||
| #pFeatures.group_info = False | |||||
| #pFeatures.group_rename = False | |||||
| #pFeatures.port_info = False | |||||
| #pFeatures.port_rename = False | |||||
| #pFeatures.handle_group_pos = True | |||||
| #patchcanvas.setOptions(pOptions) | |||||
| #patchcanvas.setFeatures(pFeatures) | |||||
| #patchcanvas.init("Carla", self.scene, canvasCallback, False) | |||||
| #if self.fEngineStarted: | |||||
| #Carla.host.patchbay_refresh() | |||||
| @pyqtSlot() | |||||
| def slot_aboutCarla(self): | |||||
| CarlaAboutW(self).exec_() | |||||
| @pyqtSlot() | |||||
| def slot_aboutQt(self): | |||||
| QApplication.instance().aboutQt() | |||||
| # ----------------------------------------------------------------- | |||||
| @pyqtSlot(int, int, int, float, str) | |||||
| def slot_handleDebugCallback(self, pluginId, value1, value2, value3, valueStr): | |||||
| print("DEBUG:", pluginId, value1, value2, value3, valueStr) | |||||
| #self.ui.pte_log.appendPlainText(valueStr.replace("[30;1m", "DEBUG: ").replace("[31m", "ERROR: ").replace("[0m", "").replace("\n", "")) | |||||
| @pyqtSlot(int) | |||||
| def slot_handlePluginAddedCallback(self, pluginId): | |||||
| self.fContainer.addPlugin(pluginId, self.fIsProjectLoading) | |||||
| if self.fContainer.getPluginCount() == 1: | |||||
| self.ui.act_plugin_remove_all.setEnabled(True) | |||||
| @pyqtSlot(int) | |||||
| def slot_handlePluginRemovedCallback(self, pluginId): | |||||
| self.fContainer.removePlugin(pluginId) | |||||
| if self.fContainer.getPluginCount() == 0: | |||||
| self.ui.act_plugin_remove_all.setEnabled(False) | |||||
| @pyqtSlot(int, str) | |||||
| def slot_handlePluginRenamedCallback(self, pluginId, newName): | |||||
| self.fContainer.renamePlugin(pluginId, newName) | |||||
| @pyqtSlot(int, int, float) | |||||
| def slot_handleParameterValueChangedCallback(self, pluginId, parameterId, value): | |||||
| self.fContainer.setParameterValue(parameterId, value) | |||||
| @pyqtSlot(int, int, float) | |||||
| def slot_handleParameterDefaultChangedCallback(self, pluginId, parameterId, value): | |||||
| self.fContainer.setParameterDefault(parameterId, value) | |||||
| @pyqtSlot(int, int, int) | |||||
| def slot_handleParameterMidiChannelChangedCallback(self, pluginId, parameterId, channel): | |||||
| self.fContainer.setParameterMidiChannel(parameterId, channel) | |||||
| @pyqtSlot(int, int, int) | |||||
| def slot_handleParameterMidiCcChangedCallback(self, pluginId, parameterId, cc): | |||||
| self.fContainer.setParameterMidiCC(parameterId, cc) | |||||
| @pyqtSlot(int, int) | |||||
| def slot_handleProgramChangedCallback(self, pluginId, programId): | |||||
| self.fContainer.setProgram(programId) | |||||
| @pyqtSlot(int, int) | |||||
| def slot_handleMidiProgramChangedCallback(self, pluginId, midiProgramId): | |||||
| self.fContainer.setMidiProgram(midiProgramId) | |||||
| @pyqtSlot(int, int, int, int) | |||||
| def slot_handleNoteOnCallback(self, pluginId, channel, note, velo): | |||||
| self.fContainer.noteOn(channel, note) | |||||
| @pyqtSlot(int, int, int) | |||||
| def slot_handleNoteOffCallback(self, pluginId, channel, note): | |||||
| self.fContainer.noteOff(channel, note) | |||||
| @pyqtSlot(int, int) | |||||
| def slot_handleShowGuiCallback(self, pluginId, state): | |||||
| self.fContainer.setGuiState(pluginId, state) | |||||
| @pyqtSlot(int) | |||||
| def slot_handleUpdateCallback(self, pluginId): | |||||
| self.fContainer.updateInfo(pluginId) | |||||
| @pyqtSlot(int) | |||||
| def slot_handleReloadInfoCallback(self, pluginId): | |||||
| self.fContainer.reloadInfo(pluginId) | |||||
| @pyqtSlot(int) | |||||
| def slot_handleReloadParametersCallback(self, pluginId): | |||||
| self.fContainer.reloadParameters(pluginId) | |||||
| @pyqtSlot(int) | |||||
| def slot_handleReloadProgramsCallback(self, pluginId): | |||||
| self.fContainer.reloadPrograms(pluginId) | |||||
| @pyqtSlot(int) | |||||
| def slot_handleReloadAllCallback(self, pluginId): | |||||
| self.fContainer.reloadAll(pluginId) | |||||
| @pyqtSlot(int, int, str) | |||||
| def slot_handlePatchbayClientAddedCallback(self, clientId, clientIcon, clientName): | |||||
| self.fContainer.patchbayClientAdded(clientId, clientIcon, clientName) | |||||
| @pyqtSlot(int, str) | |||||
| def slot_handlePatchbayClientRemovedCallback(self, clientId, clientName): | |||||
| self.fContainer.patchbayClientRemoved(clientId, clientName) | |||||
| @pyqtSlot(int, str) | |||||
| def slot_handlePatchbayClientRenamedCallback(self, clientId, newClientName): | |||||
| self.fContainer.patchbayClientRenamed(clientId, newClientName) | |||||
| @pyqtSlot(int, int, int, str) | |||||
| def slot_handlePatchbayPortAddedCallback(self, clientId, portId, portFlags, portName): | |||||
| self.fContainer.patchbayPortAdded(clientId, portId, portFlags, portName) | |||||
| @pyqtSlot(int, int, str) | |||||
| def slot_handlePatchbayPortRemovedCallback(self, groupId, portId, fullPortName): | |||||
| self.fContainer.patchbayPortRemoved(groupId, portId, fullPortName) | |||||
| @pyqtSlot(int, int, str) | |||||
| def slot_handlePatchbayPortRenamedCallback(self, groupId, portId, newPortName): | |||||
| self.fContainer.patchbayPortRenamed(groupId, portId, newPortName) | |||||
| @pyqtSlot(int, int, int) | |||||
| def slot_handlePatchbayConnectionAddedCallback(self, connectionId, portOutId, portInId): | |||||
| self.fContainer.patchbayConnectionAdded(connectionId, portOutId, portInId) | |||||
| @pyqtSlot(int) | |||||
| def slot_handlePatchbayConnectionRemovedCallback(self, connectionId): | |||||
| self.fContainer.patchbayConnectionRemoved(connectionId) | |||||
| @pyqtSlot(int, int) | |||||
| def slot_handlePatchbayIconChangedCallback(self, clientId, clientIcon): | |||||
| self.fContainer.patchbayIconChanged(clientId, clientIcon) | |||||
| # ----------------------------------------------------------------- | |||||
| @pyqtSlot() | |||||
| def slot_handleSIGUSR1(self): | |||||
| print("Got SIGUSR1 -> Saving project now") | |||||
| #QTimer.singleShot(0, self, SLOT("slot_fileSave()")) | |||||
| @pyqtSlot() | |||||
| def slot_handleSIGTERM(self): | |||||
| print("Got SIGTERM -> Closing now") | |||||
| self.close() | |||||
| # ----------------------------------------------------------------- | |||||
| def timerEvent(self, event): | def timerEvent(self, event): | ||||
| if event.timerId() == self.fIdleTimerFast: | if event.timerId() == self.fIdleTimerFast: | ||||
| @@ -19,6 +19,11 @@ | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Imports (Global) | # Imports (Global) | ||||
| try: | |||||
| from PyQt5.QtWidgets import QGraphicsView | |||||
| except: | |||||
| from PyQt4.QtGui import QGraphicsView | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Imports (Custom Stuff) | # Imports (Custom Stuff) | ||||
| @@ -26,29 +31,47 @@ import patchcanvas | |||||
| from carla_widgets import * | from carla_widgets import * | ||||
| # ------------------------------------------------------------------------------------------------------------ | |||||
| # Try Import OpenGL | |||||
| try: | |||||
| #try: | |||||
| from PyQt5.QtOpenGL import QGLWidget | |||||
| #except: | |||||
| #from PyQt4.QtOpenGL import QGLWidget | |||||
| hasGL = True | |||||
| except: | |||||
| hasGL = False | |||||
| # ------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------ | ||||
| # Patchbay widget | # Patchbay widget | ||||
| class CarlaPatchbayW(QWidget): | |||||
| class CarlaPatchbayW(QGraphicsView): | |||||
| def __init__(self, parent): | def __init__(self, parent): | ||||
| QWidget.__init__(self, parent) | |||||
| QGraphicsView.__init__(self, parent) | |||||
| # ------------------------------------------------------------- | |||||
| # Internal stuff | |||||
| self.fPluginCount = 0 | |||||
| self.fPluginList = [] | |||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Set-up Canvas | # Set-up Canvas | ||||
| self.scene = patchcanvas.PatchScene(self, self.ui.graphicsView) | |||||
| self.ui.graphicsView.setScene(self.scene) | |||||
| self.ui.graphicsView.setRenderHint(QPainter.Antialiasing, bool(self.fSavedSettings["Canvas/Antialiasing"] == patchcanvas.ANTIALIASING_FULL)) | |||||
| if self.fSavedSettings["Canvas/UseOpenGL"] and hasGL: | |||||
| self.ui.graphicsView.setViewport(QGLWidget(self.ui.graphicsView)) | |||||
| self.ui.graphicsView.setRenderHint(QPainter.HighQualityAntialiasing, self.fSavedSettings["Canvas/HighQualityAntialiasing"]) | |||||
| self.scene = patchcanvas.PatchScene(self, self) # FIXME? | |||||
| self.setScene(self.scene) | |||||
| #self.setRenderHint(QPainter.Antialiasing, bool(self.fSavedSettings["Canvas/Antialiasing"] == patchcanvas.ANTIALIASING_FULL)) | |||||
| #if self.fSavedSettings["Canvas/UseOpenGL"] and hasGL: | |||||
| #self.setViewport(QGLWidget(self)) | |||||
| #self.setRenderHint(QPainter.HighQualityAntialiasing, self.fSavedSettings["Canvas/HighQualityAntialiasing"]) | |||||
| pOptions = patchcanvas.options_t() | |||||
| pOptions.theme_name = self.fSavedSettings["Canvas/Theme"] | |||||
| pOptions.auto_hide_groups = self.fSavedSettings["Canvas/AutoHideGroups"] | |||||
| pOptions.use_bezier_lines = self.fSavedSettings["Canvas/UseBezierLines"] | |||||
| pOptions.antialiasing = self.fSavedSettings["Canvas/Antialiasing"] | |||||
| pOptions.eyecandy = self.fSavedSettings["Canvas/EyeCandy"] | |||||
| #pOptions = patchcanvas.options_t() | |||||
| #pOptions.theme_name = self.fSavedSettings["Canvas/Theme"] | |||||
| #pOptions.auto_hide_groups = self.fSavedSettings["Canvas/AutoHideGroups"] | |||||
| #pOptions.use_bezier_lines = self.fSavedSettings["Canvas/UseBezierLines"] | |||||
| #pOptions.antialiasing = self.fSavedSettings["Canvas/Antialiasing"] | |||||
| #pOptions.eyecandy = self.fSavedSettings["Canvas/EyeCandy"] | |||||
| pFeatures = patchcanvas.features_t() | pFeatures = patchcanvas.features_t() | ||||
| pFeatures.group_info = False | pFeatures.group_info = False | ||||
| @@ -57,13 +80,319 @@ class CarlaPatchbayW(QWidget): | |||||
| pFeatures.port_rename = False | pFeatures.port_rename = False | ||||
| pFeatures.handle_group_pos = True | pFeatures.handle_group_pos = True | ||||
| patchcanvas.setOptions(pOptions) | |||||
| #patchcanvas.setOptions(pOptions) | |||||
| patchcanvas.setFeatures(pFeatures) | patchcanvas.setFeatures(pFeatures) | ||||
| patchcanvas.init("Carla", self.scene, canvasCallback, False) | |||||
| patchcanvas.init("Carla", self.scene, CanvasCallback, True) | |||||
| #patchcanvas.setCanvasSize(0, 0, DEFAULT_CANVAS_WIDTH, DEFAULT_CANVAS_HEIGHT) | |||||
| #patchcanvas.setInitialPos(DEFAULT_CANVAS_WIDTH / 2, DEFAULT_CANVAS_HEIGHT / 2) | |||||
| #self.setSceneRect(0, 0, DEFAULT_CANVAS_WIDTH, DEFAULT_CANVAS_HEIGHT) | |||||
| # ----------------------------------------------------------------- | |||||
| def recheckPluginHints(self, hints): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def getPluginCount(self): | |||||
| return self.fPluginCount | |||||
| def getPlugin(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return None | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return None | |||||
| return pitem | |||||
| # ----------------------------------------------------------------- | |||||
| def addPlugin(self, pluginId, isProjectLoading): | |||||
| pitem = PluginEdit(self, pluginId) | |||||
| self.fPluginList.append(pitem) | |||||
| self.fPluginCount += 1 | |||||
| def removePlugin(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| self.fPluginCount -= 1 | |||||
| self.fPluginList.pop(pluginId) | |||||
| pitem.close() | |||||
| del pitem | |||||
| # push all plugins 1 slot back | |||||
| for i in range(pluginId, self.fPluginCount): | |||||
| self.fPluginList[i].fPluginId = i # FIXME ? | |||||
| def renamePlugin(self, pluginId, newName): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.setName(name) | |||||
| def removeAllPlugins(self): | |||||
| for i in range(self.fPluginCount): | |||||
| pitem = self.fPluginList[i] | |||||
| if pitem is None: | |||||
| break | |||||
| pitem.close() | |||||
| del pitem | |||||
| self.fPluginCount = 0 | |||||
| self.fPluginList = [] | |||||
| # ----------------------------------------------------------------- | |||||
| def setParameterValue(self, pluginId, index, value): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.setParameterValue(index, value) | |||||
| def setParameterDefault(self, pluginId, index, value): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.setParameterDefault(index, value) | |||||
| def setParameterMidiChannel(self, pluginId, index, channel): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.setParameterMidiChannel(index, channel) | |||||
| def setParameterMidiCC(self, pluginId, index, cc): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.setParameterMidiControl(index, cc) | |||||
| # ----------------------------------------------------------------- | |||||
| def setProgram(self, pluginId, index): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.setProgram(index) | |||||
| def setMidiProgram(self, pluginId, index): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.setMidiProgram(index) | |||||
| # ----------------------------------------------------------------- | |||||
| def noteOn(self, pluginId, channel, note, velocity): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.sendNoteOn(channel, note) | |||||
| def noteOff(self, pluginId, channel, note): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.sendNoteOff(channel, note) | |||||
| # ----------------------------------------------------------------- | |||||
| def setGuiState(self, pluginId, state): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def updateInfo(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.updateInfo() | |||||
| def reloadInfo(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.reloadInfo() | |||||
| def reloadParameters(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.reloadParameters() | |||||
| def reloadPrograms(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.reloadPrograms() | |||||
| def reloadAll(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.reloadAll() | |||||
| # ----------------------------------------------------------------- | |||||
| def patchbayClientAdded(self, clientId, clientIcon, clientName): | |||||
| pcSplit = patchcanvas.SPLIT_UNDEF | |||||
| pcIcon = patchcanvas.ICON_APPLICATION | |||||
| if clientIcon == PATCHBAY_ICON_HARDWARE: | |||||
| pcSplit = patchcanvas.SPLIT_YES | |||||
| pcIcon = patchcanvas.ICON_HARDWARE | |||||
| elif clientIcon == PATCHBAY_ICON_DISTRHO: | |||||
| pcIcon = patchcanvas.ICON_DISTRHO | |||||
| elif clientIcon == PATCHBAY_ICON_FILE: | |||||
| pcIcon = patchcanvas.ICON_FILE | |||||
| elif clientIcon == PATCHBAY_ICON_PLUGIN: | |||||
| pcIcon = patchcanvas.ICON_PLUGIN | |||||
| patchcanvas.addGroup(clientId, clientName, pcSplit, pcIcon) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayClientRemoved(self, clientId, clientName): | |||||
| #if not self.fEngineStarted: return | |||||
| patchcanvas.removeGroup(clientId) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayClientRenamed(self, clientId, newClientName): | |||||
| patchcanvas.renameGroup(clientId, newClientName) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayPortAdded(self, clientId, portId, portFlags, portName): | |||||
| if (portFlags & PATCHBAY_PORT_IS_INPUT): | |||||
| portMode = patchcanvas.PORT_MODE_INPUT | |||||
| elif (portFlags & PATCHBAY_PORT_IS_OUTPUT): | |||||
| portMode = patchcanvas.PORT_MODE_OUTPUT | |||||
| else: | |||||
| portMode = patchcanvas.PORT_MODE_NULL | |||||
| if (portFlags & PATCHBAY_PORT_IS_AUDIO): | |||||
| portType = patchcanvas.PORT_TYPE_AUDIO_JACK | |||||
| elif (portFlags & PATCHBAY_PORT_IS_MIDI): | |||||
| portType = patchcanvas.PORT_TYPE_MIDI_JACK | |||||
| else: | |||||
| portType = patchcanvas.PORT_TYPE_NULL | |||||
| patchcanvas.addPort(clientId, portId, portName, portMode, portType) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayPortRemoved(self, groupId, portId, fullPortName): | |||||
| #if not self.fEngineStarted: return | |||||
| patchcanvas.removePort(portId) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayPortRenamed(self, groupId, portId, newPortName): | |||||
| patchcanvas.renamePort(portId, newPortName) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayConnectionAdded(self, connectionId, portOutId, portInId): | |||||
| patchcanvas.connectPorts(connectionId, portOutId, portInId) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayConnectionRemoved(self, connectionId): | |||||
| #if not self.fEngineStarted: return | |||||
| patchcanvas.disconnectPorts(connectionId) | |||||
| #QTimer.singleShot(0, self.ui.miniCanvasPreview, SLOT("update()")) | |||||
| def patchbayIconChanged(self, clientId, clientIcon): | |||||
| pcIcon = patchcanvas.ICON_APPLICATION | |||||
| if clientIcon == PATCHBAY_ICON_HARDWARE: | |||||
| pcIcon = patchcanvas.ICON_HARDWARE | |||||
| elif clientIcon == PATCHBAY_ICON_DISTRHO: | |||||
| pcIcon = patchcanvas.ICON_DISTRHO | |||||
| elif clientIcon == PATCHBAY_ICON_FILE: | |||||
| pcIcon = patchcanvas.ICON_FILE | |||||
| elif clientIcon == PATCHBAY_ICON_PLUGIN: | |||||
| pcIcon = patchcanvas.ICON_PLUGIN | |||||
| patchcanvas.setGroupIcon(clientId, pcIcon) | |||||
| # ----------------------------------------------------------------- | |||||
| def idleFast(self): | |||||
| pass | |||||
| def idleSlow(self): | |||||
| for i in range(self.fPluginCount): | |||||
| pitem = self.fPluginList[i] | |||||
| if pitem is None: | |||||
| break | |||||
| pitem.idleSlow() | |||||
| patchcanvas.setCanvasSize(0, 0, DEFAULT_CANVAS_WIDTH, DEFAULT_CANVAS_HEIGHT) | |||||
| patchcanvas.setInitialPos(DEFAULT_CANVAS_WIDTH / 2, DEFAULT_CANVAS_HEIGHT / 2) | |||||
| self.ui.graphicsView.setSceneRect(0, 0, DEFAULT_CANVAS_WIDTH, DEFAULT_CANVAS_HEIGHT) | |||||
| # ----------------------------------------------------------------- | |||||
| @pyqtSlot() | @pyqtSlot() | ||||
| def slot_canvasArrange(self): | def slot_canvasArrange(self): | ||||
| @@ -48,12 +48,11 @@ class CarlaRackItem(QListWidgetItem): | |||||
| parent.setItemWidget(self, self.fWidget) | parent.setItemWidget(self, self.fWidget) | ||||
| # ----------------------------------------------------------------- | |||||
| def close(self): | def close(self): | ||||
| self.fWidget.ui.edit_dialog.close() | self.fWidget.ui.edit_dialog.close() | ||||
| def getWidget(self): | |||||
| return self.fWidget | |||||
| def setId(self, idx): | def setId(self, idx): | ||||
| self.fWidget.setId(idx) | self.fWidget.setId(idx) | ||||
| @@ -73,10 +72,10 @@ class CarlaRackW(QListWidget): | |||||
| # ------------------------------------------------------------- | # ------------------------------------------------------------- | ||||
| # Set-up GUI stuff | # Set-up GUI stuff | ||||
| self.setFixedWidth(800) | |||||
| #self.setMnimumWidth(800) | |||||
| self.setSortingEnabled(False) | self.setSortingEnabled(False) | ||||
| app = QApplication.instance() | |||||
| app = QApplication.instance() | |||||
| pal1 = app.palette().base().color() | pal1 = app.palette().base().color() | ||||
| pal2 = app.palette().button().color() | pal2 = app.palette().button().color() | ||||
| col1 = "stop:0 rgb(%i, %i, %i)" % (pal1.red(), pal1.green(), pal1.blue()) | col1 = "stop:0 rgb(%i, %i, %i)" % (pal1.red(), pal1.green(), pal1.blue()) | ||||
| @@ -93,34 +92,31 @@ class CarlaRackW(QListWidget): | |||||
| } | } | ||||
| """ % (col1, col2)) | """ % (col1, col2)) | ||||
| # ------------------------------------------------------------- | |||||
| # ----------------------------------------------------------------- | |||||
| def idleFast(self): | |||||
| for i in range(self.fPluginCount): | |||||
| pitem = self.fPluginList[i] | |||||
| def getPluginCount(self): | |||||
| return self.fPluginCount | |||||
| if pitem is None: | |||||
| break | |||||
| pitem.fWidget.idleFast() | |||||
| def getPlugin(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return None | |||||
| def idleSlow(self): | |||||
| for i in range(self.fPluginCount): | |||||
| pitem = self.fPluginList[i] | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return None | |||||
| if pitem is None: | |||||
| break | |||||
| return pitem | |||||
| pitem.fWidget.idleSlow() | |||||
| # ----------------------------------------------------------------- | |||||
| def addPlugin(self, pluginId): | |||||
| def addPlugin(self, pluginId, isProjectLoading): | |||||
| pitem = CarlaRackItem(self, pluginId) | pitem = CarlaRackItem(self, pluginId) | ||||
| self.fPluginList.append(pitem) | self.fPluginList.append(pitem) | ||||
| self.fPluginCount += 1 | self.fPluginCount += 1 | ||||
| #if not self.fProjectLoading: | |||||
| #pwidget.setActive(True, True, True) | |||||
| if not isProjectLoading: | |||||
| pitem.fWidget.setActive(True, True, True) | |||||
| def removePlugin(self, pluginId): | def removePlugin(self, pluginId): | ||||
| if pluginId >= self.fPluginCount: | if pluginId >= self.fPluginCount: | ||||
| @@ -142,6 +138,17 @@ class CarlaRackW(QListWidget): | |||||
| for i in range(pluginId, self.fPluginCount): | for i in range(pluginId, self.fPluginCount): | ||||
| self.fPluginList[i].setId(i) | self.fPluginList[i].setId(i) | ||||
| def renamePlugin(self, pluginId, newName): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.ui.label_name.setText(name) | |||||
| pitem.fWidget.ui.edit_dialog.setName(name) | |||||
| def removeAllPlugins(self): | def removeAllPlugins(self): | ||||
| while (self.takeItem(0)): | while (self.takeItem(0)): | ||||
| pass | pass | ||||
| @@ -158,6 +165,213 @@ class CarlaRackW(QListWidget): | |||||
| self.fPluginCount = 0 | self.fPluginCount = 0 | ||||
| self.fPluginList = [] | self.fPluginList = [] | ||||
| # ----------------------------------------------------------------- | |||||
| def setParameterValue(self, pluginId, index, value): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.setParameterValue(index, value) | |||||
| def setParameterDefault(self, pluginId, index, value): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.setParameterDefault(index, value) | |||||
| def setParameterMidiChannel(self, pluginId, index, channel): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.setParameterMidiChannel(index, channel) | |||||
| def setParameterMidiCC(self, pluginId, index, cc): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.setParameterMidiControl(index, cc) | |||||
| # ----------------------------------------------------------------- | |||||
| def setProgram(self, pluginId, index): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.setProgram(index) | |||||
| def setMidiProgram(self, pluginId, index): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.setMidiProgram(index) | |||||
| # ----------------------------------------------------------------- | |||||
| def noteOn(self, pluginId, channel, note, velocity): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.sendNoteOn(channel, note) | |||||
| def noteOff(self, pluginId, channel, note): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.fWidget.sendNoteOff(channel, note) | |||||
| # ----------------------------------------------------------------- | |||||
| def setGuiState(self, pluginId, state): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| if state == 0: | |||||
| pitem.fWidget.ui.b_gui.setChecked(False) | |||||
| pitem.fWidget.ui.b_gui.setEnabled(True) | |||||
| elif state == 1: | |||||
| pitem.fWidget.ui.b_gui.setChecked(True) | |||||
| pitem.fWidget.ui.b_gui.setEnabled(True) | |||||
| elif state == -1: | |||||
| pitem.fWidget.ui.b_gui.setChecked(False) | |||||
| pitem.fWidget.ui.b_gui.setEnabled(False) | |||||
| # ----------------------------------------------------------------- | |||||
| def updateInfo(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.ui.edit_dialog.updateInfo() | |||||
| def reloadInfo(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.ui.edit_dialog.reloadInfo() | |||||
| def reloadParameters(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.ui.edit_dialog.reloadParameters() | |||||
| def reloadPrograms(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.ui.edit_dialog.reloadPrograms() | |||||
| def reloadAll(self, pluginId): | |||||
| if pluginId >= self.fPluginCount: | |||||
| return | |||||
| pitem = self.fPluginList[pluginId] | |||||
| if pitem is None: | |||||
| return | |||||
| pitem.ui.edit_dialog.reloadAll() | |||||
| # ----------------------------------------------------------------- | |||||
| def patchbayClientAdded(self, clientId, clientIcon, clientName): | |||||
| pass | |||||
| def patchbayClientRemoved(self, clientId, clientName): | |||||
| pass | |||||
| def patchbayClientRenamed(self, clientId, newClientName): | |||||
| pass | |||||
| def patchbayPortAdded(self, clientId, portId, portFlags, portName): | |||||
| pass | |||||
| def patchbayPortRemoved(self, groupId, portId, fullPortName): | |||||
| pass | |||||
| def patchbayPortRenamed(self, groupId, portId, newPortName): | |||||
| pass | |||||
| def patchbayConnectionAdded(self, connectionId, portOutId, portInId): | |||||
| pass | |||||
| def patchbayConnectionRemoved(self, connectionId): | |||||
| pass | |||||
| def patchbayIconChanged(self, clientId, clientIcon): | |||||
| pass | |||||
| # ----------------------------------------------------------------- | |||||
| def idleFast(self): | |||||
| for i in range(self.fPluginCount): | |||||
| pitem = self.fPluginList[i] | |||||
| if pitem is None: | |||||
| break | |||||
| pitem.fWidget.idleFast() | |||||
| def idleSlow(self): | |||||
| for i in range(self.fPluginCount): | |||||
| pitem = self.fPluginList[i] | |||||
| if pitem is None: | |||||
| break | |||||
| pitem.fWidget.idleSlow() | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # TESTING | # TESTING | ||||
| @@ -838,6 +838,10 @@ class PluginEdit(QDialog): | |||||
| self.fPlayingNotes = [] | self.fPlayingNotes = [] | ||||
| self.ui.keyboard.allNotesOff() | self.ui.keyboard.allNotesOff() | ||||
| def setName(self, name): | |||||
| self.ui.label_plugin.setText("\n%s\n" % name) | |||||
| self.setWindowTitle(name) | |||||
| def setParameterValue(self, parameterId, value): | def setParameterValue(self, parameterId, value): | ||||
| for paramItem in self.fParametersToUpdate: | for paramItem in self.fParametersToUpdate: | ||||
| if paramItem[0] == parameterId: | if paramItem[0] == parameterId: | ||||
| @@ -1490,9 +1494,6 @@ class PluginWidget(QFrame): | |||||
| self.ui.edit_dialog.clearNotes() | self.ui.edit_dialog.clearNotes() | ||||
| self.ui.led_midi.setChecked(False) | self.ui.led_midi.setChecked(False) | ||||
| def setParameterDefault(self, parameterId, value): | |||||
| self.ui.edit_dialog.setParameterDefault(parameterId, value) | |||||
| def setParameterValue(self, parameterId, value): | def setParameterValue(self, parameterId, value): | ||||
| self.fParameterIconTimer = ICON_STATE_ON | self.fParameterIconTimer = ICON_STATE_ON | ||||
| @@ -1501,6 +1502,9 @@ class PluginWidget(QFrame): | |||||
| self.ui.edit_dialog.setParameterValue(parameterId, value) | self.ui.edit_dialog.setParameterValue(parameterId, value) | ||||
| def setParameterDefault(self, parameterId, value): | |||||
| self.ui.edit_dialog.setParameterDefault(parameterId, value) | |||||
| def setParameterMidiControl(self, parameterId, control): | def setParameterMidiControl(self, parameterId, control): | ||||
| self.ui.edit_dialog.setParameterMidiControl(parameterId, control) | self.ui.edit_dialog.setParameterMidiControl(parameterId, control) | ||||
| @@ -16,17 +16,25 @@ | |||||
| # | # | ||||
| # For a full copy of the GNU General Public License see the GPL.txt file | # For a full copy of the GNU General Public License see the GPL.txt file | ||||
| # TODO - SIGNAL, SLOT | |||||
| # Imports (Global) | # Imports (Global) | ||||
| from PyQt5.QtCore import pyqtSlot, qDebug, qCritical, qFatal, qWarning, Qt, QObject | |||||
| from PyQt5.QtCore import QAbstractAnimation, QLineF, QPointF, QRectF, QSizeF, QSettings, QTimer | |||||
| from PyQt5.QtGui import QColor, QLinearGradient, QPen, QPolygonF, QPainter, QPainterPath | |||||
| from PyQt5.QtGui import QCursor, QFont, QFontMetrics | |||||
| from PyQt5.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||||
| from PyQt5.QtWidgets import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem | |||||
| from PyQt5.QtWidgets import QGraphicsColorizeEffect, QGraphicsDropShadowEffect | |||||
| from PyQt5.QtWidgets import QInputDialog, QLineEdit, QMenu | |||||
| try: | |||||
| from PyQt5.QtCore import pyqtSignal, pyqtSlot, qDebug, qCritical, qFatal, qWarning, Qt, QObject | |||||
| from PyQt5.QtCore import QAbstractAnimation, QLineF, QPointF, QRectF, QSizeF, QSettings, QTimer | |||||
| from PyQt5.QtGui import QColor, QLinearGradient, QPen, QPolygonF, QPainter, QPainterPath | |||||
| from PyQt5.QtGui import QCursor, QFont, QFontMetrics | |||||
| from PyQt5.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||||
| from PyQt5.QtWidgets import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem | |||||
| from PyQt5.QtWidgets import QGraphicsColorizeEffect, QGraphicsDropShadowEffect | |||||
| from PyQt5.QtWidgets import QInputDialog, QLineEdit, QMenu | |||||
| except: | |||||
| from PyQt4.QtCore import pyqtSignal, pyqtSlot, qDebug, qCritical, qFatal, qWarning, Qt, QObject | |||||
| from PyQt4.QtCore import QAbstractAnimation, QLineF, QPointF, QRectF, QSizeF, QSettings, QTimer | |||||
| from PyQt4.QtGui import QColor, QLinearGradient, QPen, QPolygonF, QPainter, QPainterPath | |||||
| from PyQt4.QtGui import QCursor, QFont, QFontMetrics | |||||
| from PyQt4.QtGui import QGraphicsScene, QGraphicsItem, QGraphicsLineItem, QGraphicsPathItem | |||||
| from PyQt4.QtGui import QGraphicsColorizeEffect, QGraphicsDropShadowEffect | |||||
| from PyQt4.QtGui import QInputDialog, QLineEdit, QMenu | |||||
| from PyQt4.QtSvg import QGraphicsSvgItem, QSvgRenderer | |||||
| # Imports (Theme) | # Imports (Theme) | ||||
| from patchcanvas_theme import * | from patchcanvas_theme import * | ||||
| @@ -196,10 +204,6 @@ class CanvasObject(QObject): | |||||
| CanvasRemoveItemFX(item) | CanvasRemoveItemFX(item) | ||||
| CanvasRemoveAnimation(animation) | CanvasRemoveAnimation(animation) | ||||
| @pyqtSlot() | |||||
| def CanvasPostponedGroups(self): | |||||
| CanvasPostponedGroups() | |||||
| @pyqtSlot() | @pyqtSlot() | ||||
| def PortContextMenuDisconnect(self): | def PortContextMenuDisconnect(self): | ||||
| try: | try: | ||||
| @@ -458,7 +462,7 @@ def addGroup(group_id, group_name, split=SPLIT_UNDEF, icon=ICON_APPLICATION): | |||||
| if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups: | if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups: | ||||
| CanvasItemFX(group_box, True) | CanvasItemFX(group_box, True) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| def removeGroup(group_id): | def removeGroup(group_id): | ||||
| if canvas.debug: | if canvas.debug: | ||||
| @@ -498,7 +502,7 @@ def removeGroup(group_id): | |||||
| canvas.group_list.remove(group) | canvas.group_list.remove(group) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| return | return | ||||
| qCritical("PatchCanvas::removeGroup(%i) - unable to find group to remove" % group_id) | qCritical("PatchCanvas::removeGroup(%i) - unable to find group to remove" % group_id) | ||||
| @@ -515,7 +519,7 @@ def renameGroup(group_id, new_group_name): | |||||
| if group.split and group.widgets[1]: | if group.split and group.widgets[1]: | ||||
| group.widgets[1].setGroupName(new_group_name) | group.widgets[1].setGroupName(new_group_name) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| return | return | ||||
| qCritical("PatchCanvas::renameGroup(%i, %s) - unable to find group to rename" % (group_id, new_group_name.encode())) | qCritical("PatchCanvas::renameGroup(%i, %s) - unable to find group to rename" % (group_id, new_group_name.encode())) | ||||
| @@ -586,7 +590,7 @@ def splitGroup(group_id): | |||||
| for conn in conns_data: | for conn in conns_data: | ||||
| connectPorts(conn.connection_id, conn.port_out_id, conn.port_in_id) | connectPorts(conn.connection_id, conn.port_out_id, conn.port_in_id) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| def joinGroup(group_id): | def joinGroup(group_id): | ||||
| if canvas.debug: | if canvas.debug: | ||||
| @@ -662,7 +666,7 @@ def joinGroup(group_id): | |||||
| for conn in conns_data: | for conn in conns_data: | ||||
| connectPorts(conn.connection_id, conn.port_out_id, conn.port_in_id) | connectPorts(conn.connection_id, conn.port_out_id, conn.port_in_id) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| def getGroupPos(group_id, port_mode=PORT_MODE_OUTPUT): | def getGroupPos(group_id, port_mode=PORT_MODE_OUTPUT): | ||||
| if canvas.debug: | if canvas.debug: | ||||
| @@ -697,7 +701,7 @@ def setGroupPosFull(group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group | |||||
| if group.split and group.widgets[1]: | if group.split and group.widgets[1]: | ||||
| group.widgets[1].setPos(group_pos_x_i, group_pos_y_i) | group.widgets[1].setPos(group_pos_x_i, group_pos_y_i) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| return | return | ||||
| qCritical("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i) - unable to find group to reposition" % (group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i)) | qCritical("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i) - unable to find group to reposition" % (group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i)) | ||||
| @@ -714,7 +718,7 @@ def setGroupIcon(group_id, icon): | |||||
| if group.split and group.widgets[1]: | if group.split and group.widgets[1]: | ||||
| group.widgets[1].setIcon(icon) | group.widgets[1].setIcon(icon) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| return | return | ||||
| qCritical("PatchCanvas::setGroupIcon(%i, %s) - unable to find group to change icon" % (group_id, icon2str(icon))) | qCritical("PatchCanvas::setGroupIcon(%i, %s) - unable to find group to change icon" % (group_id, icon2str(icon))) | ||||
| @@ -759,7 +763,7 @@ def addPort(group_id, port_id, port_name, port_mode, port_type): | |||||
| box_widget.updatePositions() | box_widget.updatePositions() | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| def removePort(port_id): | def removePort(port_id): | ||||
| if canvas.debug: | if canvas.debug: | ||||
| @@ -774,7 +778,7 @@ def removePort(port_id): | |||||
| canvas.port_list.remove(port) | canvas.port_list.remove(port) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| return | return | ||||
| qCritical("PatchCanvas::removePort(%i) - Unable to find port to remove" % port_id) | qCritical("PatchCanvas::removePort(%i) - Unable to find port to remove" % port_id) | ||||
| @@ -789,7 +793,7 @@ def renamePort(port_id, new_port_name): | |||||
| port.widget.setPortName(new_port_name) | port.widget.setPortName(new_port_name) | ||||
| port.widget.parentItem().updatePositions() | port.widget.parentItem().updatePositions() | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| return | return | ||||
| qCritical("PatchCanvas::renamePort(%i, %s) - Unable to find port to rename" % (port_id, new_port_name.encode())) | qCritical("PatchCanvas::renamePort(%i, %s) - Unable to find port to rename" % (port_id, new_port_name.encode())) | ||||
| @@ -826,6 +830,8 @@ def connectPorts(connection_id, port_out_id, port_in_id): | |||||
| else: | else: | ||||
| connection_dict.widget = CanvasLine(port_out, port_in, None) | connection_dict.widget = CanvasLine(port_out, port_in, None) | ||||
| canvas.scene.addItem(connection_dict.widget) | |||||
| port_out_parent.addLineFromGroup(connection_dict.widget, connection_id) | port_out_parent.addLineFromGroup(connection_dict.widget, connection_id) | ||||
| port_in_parent.addLineFromGroup(connection_dict.widget, connection_id) | port_in_parent.addLineFromGroup(connection_dict.widget, connection_id) | ||||
| @@ -842,7 +848,7 @@ def connectPorts(connection_id, port_out_id, port_in_id): | |||||
| item = connection_dict.widget | item = connection_dict.widget | ||||
| CanvasItemFX(item, True) | CanvasItemFX(item, True) | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| def disconnectPorts(connection_id): | def disconnectPorts(connection_id): | ||||
| if canvas.debug: | if canvas.debug: | ||||
| @@ -891,7 +897,7 @@ def disconnectPorts(connection_id): | |||||
| else: | else: | ||||
| line.deleteFromScene() | line.deleteFromScene() | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| def arrange(): | def arrange(): | ||||
| if canvas.debug: | if canvas.debug: | ||||
| @@ -1008,10 +1014,6 @@ def CanvasRemoveAnimation(f_animation): | |||||
| del animation.animation | del animation.animation | ||||
| break | break | ||||
| def CanvasPostponedGroups(): | |||||
| if canvas.debug: | |||||
| qDebug("PatchCanvas::CanvasPostponedGroups()") | |||||
| def CanvasCallback(action, value1, value2, value_str): | def CanvasCallback(action, value1, value2, value_str): | ||||
| if canvas.debug: | if canvas.debug: | ||||
| qDebug("PatchCanvas::CanvasCallback(%i, %i, %i, %s)" % (action, value1, value2, value_str.encode())) | qDebug("PatchCanvas::CanvasCallback(%i, %i, %i, %s)" % (action, value1, value2, value_str.encode())) | ||||
| @@ -1039,12 +1041,12 @@ def CanvasItemFX(item, show, destroy=False): | |||||
| canvas.animation_list.append(animation_dict) | canvas.animation_list.append(animation_dict) | ||||
| if show: | if show: | ||||
| canvas.qobject.connect(animation, SIGNAL("finished()"), SLOT("AnimationIdle()")) | |||||
| animation.finished.connect(canvas.qobject.AnimationIdle) | |||||
| else: | else: | ||||
| if destroy: | if destroy: | ||||
| canvas.qobject.connect(animation, SIGNAL("finished()"), SLOT("AnimationDestroy()")) | |||||
| animation.finished.connect(canvas.qobject.AnimationDestroy) | |||||
| else: | else: | ||||
| canvas.qobject.connect(animation, SIGNAL("finished()"), SLOT("AnimationHide()")) | |||||
| animation.finished.connect(canvas.qobject.AnimationHide) | |||||
| animation.start() | animation.start() | ||||
| @@ -1070,6 +1072,9 @@ def CanvasRemoveItemFX(item): | |||||
| # patchscene.cpp | # patchscene.cpp | ||||
| class PatchScene(QGraphicsScene): | class PatchScene(QGraphicsScene): | ||||
| scaleChanged = pyqtSignal(float) | |||||
| sceneGroupMoved = pyqtSignal(int, int, QPointF) | |||||
| def __init__(self, parent, view): | def __init__(self, parent, view): | ||||
| QGraphicsScene.__init__(self, parent) | QGraphicsScene.__init__(self, parent) | ||||
| @@ -1104,7 +1109,7 @@ class PatchScene(QGraphicsScene): | |||||
| elif scale < 0.2: | elif scale < 0.2: | ||||
| self.m_view.resetTransform() | self.m_view.resetTransform() | ||||
| self.m_view.scale(0.2, 0.2) | self.m_view.scale(0.2, 0.2) | ||||
| self.emit(SIGNAL("scaleChanged(double)"), self.m_view.transform().m11()) | |||||
| self.scaleChanged.emit(self.m_view.transform().m11()) | |||||
| def updateTheme(self): | def updateTheme(self): | ||||
| self.setBackgroundBrush(canvas.theme.canvas_bg) | self.setBackgroundBrush(canvas.theme.canvas_bg) | ||||
| @@ -1152,16 +1157,16 @@ class PatchScene(QGraphicsScene): | |||||
| def zoom_in(self): | def zoom_in(self): | ||||
| if self.m_view.transform().m11() < 3.0: | if self.m_view.transform().m11() < 3.0: | ||||
| self.m_view.scale(1.2, 1.2) | self.m_view.scale(1.2, 1.2) | ||||
| self.emit(SIGNAL("scaleChanged(double)"), self.m_view.transform().m11()) | |||||
| self.scaleChanged.emit(self.m_view.transform().m11()) | |||||
| def zoom_out(self): | def zoom_out(self): | ||||
| if self.m_view.transform().m11() > 0.2: | if self.m_view.transform().m11() > 0.2: | ||||
| self.m_view.scale(0.8, 0.8) | self.m_view.scale(0.8, 0.8) | ||||
| self.emit(SIGNAL("scaleChanged(double)"), self.m_view.transform().m11()) | |||||
| self.scaleChanged.emit(self.m_view.transform().m11()) | |||||
| def zoom_reset(self): | def zoom_reset(self): | ||||
| self.m_view.resetTransform() | self.m_view.resetTransform() | ||||
| self.emit(SIGNAL("scaleChanged(double)"), 1.0) | |||||
| self.scaleChanged.emit(1.0) | |||||
| def keyPressEvent(self, event): | def keyPressEvent(self, event): | ||||
| if not self.m_view: | if not self.m_view: | ||||
| @@ -1247,7 +1252,7 @@ class PatchScene(QGraphicsScene): | |||||
| for item in items_list: | for item in items_list: | ||||
| if item and item.isVisible() and item.type() == CanvasBoxType: | if item and item.isVisible() and item.type() == CanvasBoxType: | ||||
| item.checkItemPos() | item.checkItemPos() | ||||
| self.emit(SIGNAL("sceneGroupMoved(int, int, QPointF)"), item.getGroupId(), item.getSplittedMode(), item.scenePos()) | |||||
| self.sceneGroupMoved.emit(item.getGroupId(), item.getSplittedMode(), item.scenePos()) | |||||
| if len(items_list) > 1: | if len(items_list) > 1: | ||||
| canvas.scene.update() | canvas.scene.update() | ||||
| @@ -1318,7 +1323,7 @@ class CanvasFadeAnimation(QAbstractAnimation): | |||||
| class CanvasLine(QGraphicsLineItem): | class CanvasLine(QGraphicsLineItem): | ||||
| def __init__(self, item1, item2, parent): | def __init__(self, item1, item2, parent): | ||||
| QGraphicsLineItem.__init__(self, parent, canvas.scene) | |||||
| QGraphicsLineItem.__init__(self, parent) | |||||
| self.item1 = item1 | self.item1 = item1 | ||||
| self.item2 = item2 | self.item2 = item2 | ||||
| @@ -1414,7 +1419,7 @@ class CanvasLine(QGraphicsLineItem): | |||||
| class CanvasBezierLine(QGraphicsPathItem): | class CanvasBezierLine(QGraphicsPathItem): | ||||
| def __init__(self, item1, item2, parent): | def __init__(self, item1, item2, parent): | ||||
| QGraphicsPathItem.__init__(self, parent, canvas.scene) | |||||
| QGraphicsPathItem.__init__(self, parent) | |||||
| self.item1 = item1 | self.item1 = item1 | ||||
| self.item2 = item2 | self.item2 = item2 | ||||
| @@ -1521,7 +1526,7 @@ class CanvasBezierLine(QGraphicsPathItem): | |||||
| class CanvasLineMov(QGraphicsLineItem): | class CanvasLineMov(QGraphicsLineItem): | ||||
| def __init__(self, port_mode, port_type, parent): | def __init__(self, port_mode, port_type, parent): | ||||
| QGraphicsLineItem.__init__(self, parent, canvas.scene) | |||||
| QGraphicsLineItem.__init__(self, parent) | |||||
| self.m_port_mode = port_mode | self.m_port_mode = port_mode | ||||
| self.m_port_type = port_type | self.m_port_type = port_type | ||||
| @@ -1578,7 +1583,7 @@ class CanvasLineMov(QGraphicsLineItem): | |||||
| class CanvasBezierLineMov(QGraphicsPathItem): | class CanvasBezierLineMov(QGraphicsPathItem): | ||||
| def __init__(self, port_mode, port_type, parent): | def __init__(self, port_mode, port_type, parent): | ||||
| QGraphicsPathItem.__init__(self, parent, canvas.scene) | |||||
| QGraphicsPathItem.__init__(self, parent) | |||||
| self.m_port_mode = port_mode | self.m_port_mode = port_mode | ||||
| self.m_port_type = port_type | self.m_port_type = port_type | ||||
| @@ -1642,7 +1647,7 @@ class CanvasBezierLineMov(QGraphicsPathItem): | |||||
| class CanvasPort(QGraphicsItem): | class CanvasPort(QGraphicsItem): | ||||
| def __init__(self, port_id, port_name, port_mode, port_type, parent): | def __init__(self, port_id, port_name, port_mode, port_type, parent): | ||||
| QGraphicsItem.__init__(self, parent, canvas.scene) | |||||
| QGraphicsItem.__init__(self, parent) | |||||
| # Save Variables, useful for later | # Save Variables, useful for later | ||||
| self.m_port_id = port_id | self.m_port_id = port_id | ||||
| @@ -1695,14 +1700,14 @@ class CanvasPort(QGraphicsItem): | |||||
| def setPortName(self, port_name): | def setPortName(self, port_name): | ||||
| if QFontMetrics(self.m_port_font).width(port_name) < QFontMetrics(self.m_port_font).width(self.m_port_name): | if QFontMetrics(self.m_port_font).width(port_name) < QFontMetrics(self.m_port_font).width(self.m_port_name): | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| self.m_port_name = port_name | self.m_port_name = port_name | ||||
| self.update() | self.update() | ||||
| def setPortWidth(self, port_width): | def setPortWidth(self, port_width): | ||||
| if port_width < self.m_port_width: | if port_width < self.m_port_width: | ||||
| QTimer.singleShot(0, canvas.scene, SLOT("update()")) | |||||
| QTimer.singleShot(0, canvas.scene.update) | |||||
| self.m_port_width = port_width | self.m_port_width = port_width | ||||
| self.update() | self.update() | ||||
| @@ -1815,7 +1820,7 @@ class CanvasPort(QGraphicsItem): | |||||
| port_con_id = CanvasGetConnectedPort(port_id, self.m_port_id) | port_con_id = CanvasGetConnectedPort(port_id, self.m_port_id) | ||||
| act_x_disc = discMenu.addAction(CanvasGetFullPortName(port_con_id)) | act_x_disc = discMenu.addAction(CanvasGetFullPortName(port_con_id)) | ||||
| act_x_disc.setData(port_id) | act_x_disc.setData(port_id) | ||||
| QObject.connect(act_x_disc, SIGNAL("triggered()"), canvas.qobject, SLOT("PortContextMenuDisconnect()")) | |||||
| act_x_disc.triggered.connect(canvas.qobject.PortContextMenuDisconnect) | |||||
| else: | else: | ||||
| act_x_disc = discMenu.addAction("No connections") | act_x_disc = discMenu.addAction("No connections") | ||||
| act_x_disc.setEnabled(False) | act_x_disc.setEnabled(False) | ||||
| @@ -1978,7 +1983,7 @@ class cb_line_t(object): | |||||
| class CanvasBox(QGraphicsItem): | class CanvasBox(QGraphicsItem): | ||||
| def __init__(self, group_id, group_name, icon, parent=None): | def __init__(self, group_id, group_name, icon, parent=None): | ||||
| QGraphicsItem.__init__(self, parent, canvas.scene) | |||||
| QGraphicsItem.__init__(self, parent) | |||||
| # Save Variables, useful for later | # Save Variables, useful for later | ||||
| self.m_group_id = group_id | self.m_group_id = group_id | ||||
| @@ -2026,6 +2031,8 @@ class CanvasBox(QGraphicsItem): | |||||
| self.updatePositions() | self.updatePositions() | ||||
| canvas.scene.addItem(self) | |||||
| def getGroupId(self): | def getGroupId(self): | ||||
| return self.m_group_id | return self.m_group_id | ||||
| @@ -2354,7 +2361,7 @@ class CanvasBox(QGraphicsItem): | |||||
| port_con_id = CanvasGetConnectedPort(port_con_list[i], port_con_list_ids[i]) | port_con_id = CanvasGetConnectedPort(port_con_list[i], port_con_list_ids[i]) | ||||
| act_x_disc = discMenu.addAction(CanvasGetFullPortName(port_con_id)) | act_x_disc = discMenu.addAction(CanvasGetFullPortName(port_con_id)) | ||||
| act_x_disc.setData(port_con_list[i]) | act_x_disc.setData(port_con_list[i]) | ||||
| QObject.connect(act_x_disc, SIGNAL("triggered()"), canvas.qobject, SLOT("PortContextMenuDisconnect()")) | |||||
| act_x_disc.triggered.connect(canvas.qobject.PortContextMenuDisconnect) | |||||
| else: | else: | ||||
| act_x_disc = discMenu.addAction("No connections") | act_x_disc = discMenu.addAction("No connections") | ||||
| act_x_disc.setEnabled(False) | act_x_disc.setEnabled(False) | ||||
| @@ -19,8 +19,12 @@ | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # Imports (Global) | # Imports (Global) | ||||
| from PyQt5.QtCore import Qt | |||||
| from PyQt5.QtGui import QColor, QFont, QPen, QPixmap | |||||
| try: | |||||
| from PyQt5.QtCore import Qt | |||||
| from PyQt5.QtGui import QColor, QFont, QPen, QPixmap | |||||
| except: | |||||
| from PyQt4.QtCore import Qt | |||||
| from PyQt4.QtGui import QColor, QFont, QPen, QPixmap | |||||
| # ------------------------------------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------------------------------------ | ||||
| # patchcanvas-theme.cpp | # patchcanvas-theme.cpp | ||||
| @@ -30,12 +30,6 @@ endif | |||||
| # Common | # Common | ||||
| # LINK_FLAGS += $(shell pkg-config --libs liblo) | # LINK_FLAGS += $(shell pkg-config --libs liblo) | ||||
| # | |||||
| # ifeq ($(HAVE_QT4),true) | |||||
| # LINK_FLAGS += $(shell pkg-config --libs QtCore QtGui QtXml) | |||||
| # else | |||||
| # LINK_FLAGS += $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Xml Qt5Widgets) | |||||
| # endif | |||||
| # -------------------------------------------------------------- | # -------------------------------------------------------------- | ||||
| # Plugin | # Plugin | ||||
| @@ -71,7 +65,7 @@ endif | |||||
| ifeq ($(HAVE_ZYN_DEPS),true) | ifeq ($(HAVE_ZYN_DEPS),true) | ||||
| LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml zlib) | LINK_FLAGS += $(shell pkg-config --libs fftw3 mxml zlib) | ||||
| ifeq ($(HAVE_ZYN_UI_DEPS),true) | ifeq ($(HAVE_ZYN_UI_DEPS),true) | ||||
| LINK_FLAGS += $(shell pkg-config --libs ntk ntk_images) | |||||
| LINK_FLAGS += $(shell pkg-config --libs ntk_images ntk) -lfreetype # FIXME | |||||
| endif | endif | ||||
| endif | endif | ||||
| @@ -57,6 +57,8 @@ void carla_register_native_plugin_PingPongPan(); | |||||
| #endif | #endif | ||||
| // DISTRHO plugins (PyQt) | // DISTRHO plugins (PyQt) | ||||
| void carla_register_native_plugin_BigMeter(); | |||||
| void carla_register_native_plugin_BigMeterM(); | |||||
| void carla_register_native_plugin_Notes(); | void carla_register_native_plugin_Notes(); | ||||
| #ifdef WANT_ZYNADDSUBFX | #ifdef WANT_ZYNADDSUBFX | ||||
| @@ -103,6 +105,8 @@ struct PluginListManager { | |||||
| #endif | #endif | ||||
| // DISTRHO plugins (PyQt) | // DISTRHO plugins (PyQt) | ||||
| carla_register_native_plugin_BigMeter(); | |||||
| carla_register_native_plugin_BigMeterM(); | |||||
| carla_register_native_plugin_Notes(); // unfinished | carla_register_native_plugin_Notes(); // unfinished | ||||
| #ifdef WANT_ZYNADDSUBFX | #ifdef WANT_ZYNADDSUBFX | ||||