Browse Source

Start merging separate rack/patchbay code into one

tags/1.9.5
falkTX 10 years ago
parent
commit
2b55509622
6 changed files with 609 additions and 556 deletions
  1. +1
    -1
      bin/carla.lv2/resources
  2. +1
    -1
      bin/carla.lv2/styles
  3. +82
    -6
      resources/ui/carla_host.ui
  4. +2
    -11
      source/carla
  5. +473
    -37
      source/carla_host.py
  6. +50
    -500
      source/carla_patchbay.py

+ 1
- 1
bin/carla.lv2/resources View File

@@ -1 +1 @@
../../source/modules/native-plugins/resources/
../../../share/carla/resources

+ 1
- 1
bin/carla.lv2/styles View File

@@ -1 +1 @@
../../source/modules/theme/styles/
../../carla/styles

+ 82
- 6
resources/ui/carla_host.ui View File

@@ -6,21 +6,92 @@
<rect>
<x>0</x>
<y>0</y>
<width>739</width>
<height>467</height>
<width>870</width>
<height>681</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget"/>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="plugins">
<attribute name="title">
<string>Plugins</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="pad_left">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QListWidget" name="listWidget"/>
</item>
<item>
<widget class="QLabel" name="pad_right">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="patchbay">
<attribute name="title">
<string>Patchbay</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<property name="spacing">
<number>1</number>
</property>
<item row="0" column="1">
<widget class="QGraphicsView" name="graphicsView"/>
</item>
<item row="0" column="2">
<widget class="DigitalPeakMeter" name="peak_out" native="true"/>
</item>
<item row="0" column="0">
<widget class="DigitalPeakMeter" name="peak_in" native="true"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>739</width>
<height>19</height>
<width>870</width>
<height>17</height>
</rect>
</property>
<widget class="QMenu" name="menu_File">
@@ -310,7 +381,6 @@
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
<zorder>tabUtils</zorder>
</widget>
</item>
</layout>
@@ -688,6 +758,12 @@
<header>canvaspreviewframe.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>DigitalPeakMeter</class>
<extends>QWidget</extends>
<header>digitalpeakmeter.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="../resources.qrc"/>


+ 2
- 11
source/carla View File

@@ -67,7 +67,7 @@ class CarlaMultiW(QTabWidget):
#self.fPatchbay.setWindowTitle(parent.windowTitle())
#self.fPatchbay.show()

self.scene = self.fPatchbay.scene
#self.scene = self.fPatchbay.scene

parent.ui.act_plugins_enable.triggered.connect(self.fRack.slot_pluginsEnable)
parent.ui.act_plugins_disable.triggered.connect(self.fRack.slot_pluginsDisable)
@@ -136,10 +136,6 @@ class CarlaMultiW(QTabWidget):

# -----------------------------------------------------------------

def fixCanvasPreviewSize(self):
self.fPatchbay.resize(self.fRack.size())
self.fPatchbay.slot_miniCanvasCheckSize()

# -----------------------------------------------------------------

def paintEvent(self, event):
@@ -170,7 +166,7 @@ class CarlaHostW(HostWindow):
# Set-up container

self.fContainer = CarlaMultiW(self, host)
self.setupContainer(True, self.fContainer.fPatchbay.themeData)
self.setupContainer(False)

# -------------------------------------------------------------
# Set-up GUI stuff
@@ -249,11 +245,6 @@ class CarlaHostW(HostWindow):
self.fInfoLabel.move(x, y)
self.fInfoLabel.resize(self.fContainer.width()-tabBar.width()-20, tabBar.height())

# FIXME: Qt4 needs this so it properly creates & resizes the canvas
self.fContainer.setCurrentIndex(1)
self.fContainer.setCurrentIndex(0)
self.fContainer.fixCanvasPreviewSize()

@pyqtSlot(bool)
def slot_dockTopLevelChanged(self, top):
self.fDockFloating = 1 if top else 0


+ 473
- 37
source/carla_host.py View File

@@ -25,28 +25,37 @@ from carla_config import *
# Imports (Global)

if config_UseQt5:
from PyQt5.QtCore import qCritical, QFileInfo, QModelIndex, QTimer
from PyQt5.QtCore import qCritical, QFileInfo, QModelIndex, QPointF, QTimer
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QAction, QApplication, QFileSystemModel, QListWidgetItem, QMainWindow
else:
from PyQt4.QtCore import qCritical, QFileInfo, QModelIndex, QTimer
from PyQt4.QtCore import qCritical, QFileInfo, QModelIndex, QPointF, QTimer
from PyQt4.QtGui import QApplication, QFileSystemModel, QListWidgetItem, QMainWindow, QPalette

# ------------------------------------------------------------------------------------------------------------
# Imports (Custom)

import patchcanvas
import ui_carla_host

from carla_app import *
from carla_database import *
from carla_settings import *
from carla_widgets import *
from digitalpeakmeter import DigitalPeakMeter
from pixmapkeyboard import PixmapKeyboardHArea

# ------------------------------------------------------------------------------------------------------------
# PatchCanvas defines
# Try Import OpenGL

CANVAS_ANTIALIASING_SMALL = 1
CANVAS_EYECANDY_SMALL = 1
try:
if config_UseQt5:
from PyQt5.QtOpenGL import QGLWidget
else:
from PyQt4.QtOpenGL import QGLWidget
hasGL = True
except:
hasGL = False

# ------------------------------------------------------------------------------------------------------------
# Session Management support
@@ -99,7 +108,7 @@ class HostWindow(QMainWindow):

# --------------------------------------------------------------------------------------------------------

def __init__(self, host, parent=None):
def __init__(self, host, withCanvas=True, parent=None):
QMainWindow.__init__(self, parent)
self.host = host
self.ui = ui_carla_host.Ui_CarlaHostW()
@@ -149,6 +158,17 @@ class HostWindow(QMainWindow):
self.fClientName = "Carla"
self.fSessionManagerName = ""

self.fMovingViaMiniCanvas = False
self.fPeaksCleared = True
self.fPluginCount = 0
self.fPluginList = []

self.fExternalPatchbay = False
self.fSelectedPlugins = []

self.fCanvasWidth = 0
self.fCanvasHeight = 0

# ----------------------------------------------------------------------------------------------------
# Set up GUI (engine stopped)

@@ -192,6 +212,30 @@ class HostWindow(QMainWindow):
self.ui.fileTreeView.setColumnHidden(3, True)
self.ui.fileTreeView.setHeaderHidden(True)

# ----------------------------------------------------------------------------------------------------
# Set up GUI (plugins)

# ----------------------------------------------------------------------------------------------------
# Set up GUI (patchbay)

self.ui.peak_in.setColor(DigitalPeakMeter.BLUE)
self.ui.peak_in.setChannels(2)
self.ui.peak_in.setOrientation(DigitalPeakMeter.VERTICAL)
self.ui.peak_in.setFixedWidth(25)

self.ui.peak_out.setColor(DigitalPeakMeter.GREEN)
self.ui.peak_out.setChannels(2)
self.ui.peak_out.setOrientation(DigitalPeakMeter.VERTICAL)
self.ui.peak_out.setFixedWidth(25)

self.ui.scrollArea = PixmapKeyboardHArea(self.ui.patchbay)
self.ui.keyboard = self.ui.scrollArea.keyboard
self.ui.patchbay.layout().addWidget(self.ui.scrollArea, 1, 0, 1, 0)

self.ui.scrollArea.setEnabled(False)

self.ui.miniCanvasPreview.setRealParent(self)

# ----------------------------------------------------------------------------------------------------
# Set up GUI (special stuff for Mac OS)

@@ -209,6 +253,22 @@ class HostWindow(QMainWindow):

self.loadSettings(True)

# ----------------------------------------------------------------------------------------------------
# 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[CARLA_KEY_CANVAS_ANTIALIASING] == patchcanvas.ANTIALIASING_FULL))

if self.fSavedSettings[CARLA_KEY_CANVAS_USE_OPENGL] and hasGL:
self.ui.glView = QGLWidget(self)
self.ui.graphicsView.setViewport(self.ui.glView)
self.ui.graphicsView.setRenderHint(QPainter.HighQualityAntialiasing, self.fSavedSettings[CARLA_KEY_CANVAS_HQ_ANTIALIASING])

self.setupCanvas()

QTimer.singleShot(100, self.slot_restoreScrollbarValues)

# ----------------------------------------------------------------------------------------------------
# Connect actions to functions

@@ -229,6 +289,9 @@ class HostWindow(QMainWindow):
self.ui.act_transport_backwards.triggered.connect(self.slot_transportBackwards)
self.ui.act_transport_forwards.triggered.connect(self.slot_transportForwards)

self.ui.act_settings_show_meters.toggled.connect(self.slot_showCanvasMeters)
self.ui.act_settings_show_keyboard.toggled.connect(self.slot_showCanvasKeyboard)

self.ui.act_help_about.triggered.connect(self.slot_aboutCarla)
self.ui.act_help_about_juce.triggered.connect(self.slot_aboutJuce)
self.ui.act_help_about_qt.triggered.connect(self.slot_aboutQt)
@@ -238,6 +301,15 @@ class HostWindow(QMainWindow):
self.ui.b_disk_remove.clicked.connect(self.slot_diskFolderRemove)
self.ui.fileTreeView.doubleClicked.connect(self.slot_fileTreeDoubleClicked)

self.ui.graphicsView.horizontalScrollBar().valueChanged.connect(self.slot_horizontalScrollBarChanged)
self.ui.graphicsView.verticalScrollBar().valueChanged.connect(self.slot_verticalScrollBarChanged)

self.scene.scaleChanged.connect(self.slot_canvasScaleChanged)
self.scene.sceneGroupMoved.connect(self.slot_canvasItemMoved)
self.scene.pluginSelected.connect(self.slot_canvasPluginSelected)

self.ui.miniCanvasPreview.miniCanvasMoved.connect(self.slot_miniCanvasMoved)

self.SIGUSR1.connect(self.slot_handleSIGUSR1)
self.SIGTERM.connect(self.slot_handleSIGTERM)

@@ -248,6 +320,16 @@ class HostWindow(QMainWindow):
host.PluginAddedCallback.connect(self.slot_handlePluginAddedCallback)
host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback)

host.PatchbayClientAddedCallback.connect(self.slot_handlePatchbayClientAddedCallback)
host.PatchbayClientRemovedCallback.connect(self.slot_handlePatchbayClientRemovedCallback)
host.PatchbayClientRenamedCallback.connect(self.slot_handlePatchbayClientRenamedCallback)
host.PatchbayClientDataChangedCallback.connect(self.slot_handlePatchbayClientDataChangedCallback)
host.PatchbayPortAddedCallback.connect(self.slot_handlePatchbayPortAddedCallback)
host.PatchbayPortRemovedCallback.connect(self.slot_handlePatchbayPortRemovedCallback)
host.PatchbayPortRenamedCallback.connect(self.slot_handlePatchbayPortRenamedCallback)
host.PatchbayConnectionAddedCallback.connect(self.slot_handlePatchbayConnectionAddedCallback)
host.PatchbayConnectionRemovedCallback.connect(self.slot_handlePatchbayConnectionRemovedCallback)

host.DebugCallback.connect(self.slot_handleDebugCallback)
host.InfoCallback.connect(self.slot_handleInfoCallback)
host.ErrorCallback.connect(self.slot_handleErrorCallback)
@@ -258,6 +340,11 @@ class HostWindow(QMainWindow):

self.setProperWindowTitle()

# FIXME: Qt4 needs this so it properly creates & resizes the canvas
self.ui.tabWidget.setCurrentIndex(1)
self.ui.tabWidget.setCurrentIndex(0)
self.fixCanvasPreviewSize()

QTimer.singleShot(0, self.slot_engineStart)

# --------------------------------------------------------------------------------------------------------
@@ -272,6 +359,120 @@ class HostWindow(QMainWindow):

self.setWindowTitle(title)

def setupCanvas(self):
pOptions = patchcanvas.options_t()
pOptions.theme_name = self.fSavedSettings[CARLA_KEY_CANVAS_THEME]
pOptions.auto_hide_groups = self.fSavedSettings[CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS]
pOptions.use_bezier_lines = self.fSavedSettings[CARLA_KEY_CANVAS_USE_BEZIER_LINES]
pOptions.antialiasing = self.fSavedSettings[CARLA_KEY_CANVAS_ANTIALIASING]
pOptions.eyecandy = self.fSavedSettings[CARLA_KEY_CANVAS_EYE_CANDY]

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("Carla2", self.scene, canvasCallback, False)

tryCanvasSize = self.fSavedSettings[CARLA_KEY_CANVAS_SIZE].split("x")

if len(tryCanvasSize) == 2 and tryCanvasSize[0].isdigit() and tryCanvasSize[1].isdigit():
self.fCanvasWidth = int(tryCanvasSize[0])
self.fCanvasHeight = int(tryCanvasSize[1])
else:
self.fCanvasWidth = CARLA_DEFAULT_CANVAS_SIZE_WIDTH
self.fCanvasHeight = CARLA_DEFAULT_CANVAS_SIZE_HEIGHT

patchcanvas.setCanvasSize(0, 0, self.fCanvasWidth, self.fCanvasHeight)
patchcanvas.setInitialPos(self.fCanvasWidth / 2, self.fCanvasHeight / 2)
self.ui.graphicsView.setSceneRect(0, 0, self.fCanvasWidth, self.fCanvasHeight)

self.fThemeData = [self.fCanvasWidth, self.fCanvasHeight, patchcanvas.canvas.theme.canvas_bg, patchcanvas.canvas.theme.rubberband_brush, patchcanvas.canvas.theme.rubberband_pen.color()]

self.updateContainer(self.fThemeData)

def updateCanvasInitialPos(self):
x = self.ui.graphicsView.horizontalScrollBar().value() + self.width()/4
y = self.ui.graphicsView.verticalScrollBar().value() + self.height()/4
patchcanvas.setInitialPos(x, y)

# -----------------------------------------------------------------

@pyqtSlot(bool)
def slot_showCanvasMeters(self, yesNo):
self.ui.peak_in.setVisible(yesNo)
self.ui.peak_out.setVisible(yesNo)

@pyqtSlot(bool)
def slot_showCanvasKeyboard(self, yesNo):
self.ui.scrollArea.setVisible(yesNo)

@pyqtSlot()
def slot_restoreScrollbarValues(self):
settings = QSettings()
self.ui.graphicsView.horizontalScrollBar().setValue(settings.value("HorizontalScrollBarValue", self.ui.graphicsView.horizontalScrollBar().maximum()/2, type=int))
self.ui.graphicsView.verticalScrollBar().setValue(settings.value("VerticalScrollBarValue", self.ui.graphicsView.verticalScrollBar().maximum()/2, type=int))

@pyqtSlot()
def slot_miniCanvasCheckAll(self):
self.slot_miniCanvasCheckSize()
self.slot_horizontalScrollBarChanged(self.ui.graphicsView.horizontalScrollBar().value())
self.slot_verticalScrollBarChanged(self.ui.graphicsView.verticalScrollBar().value())

@pyqtSlot()
def slot_miniCanvasCheckSize(self):
self.ui.miniCanvasPreview.setViewSize(float(self.width()) / self.fCanvasWidth, float(self.height()) / self.fCanvasHeight)

@pyqtSlot(int)
def slot_horizontalScrollBarChanged(self, value):
if self.fMovingViaMiniCanvas: return

maximum = self.ui.graphicsView.horizontalScrollBar().maximum()
if maximum == 0:
xp = 0
else:
xp = float(value) / maximum
self.ui.miniCanvasPreview.setViewPosX(xp)
self.updateCanvasInitialPos()

@pyqtSlot(int)
def slot_verticalScrollBarChanged(self, value):
if self.fMovingViaMiniCanvas: return

maximum = self.ui.graphicsView.verticalScrollBar().maximum()
if maximum == 0:
yp = 0
else:
yp = float(value) / maximum
self.ui.miniCanvasPreview.setViewPosY(yp)
self.updateCanvasInitialPos()

@pyqtSlot(float)
def slot_canvasScaleChanged(self, scale):
self.ui.miniCanvasPreview.setViewScale(scale)

@pyqtSlot(int, int, QPointF)
def slot_canvasItemMoved(self, group_id, split_mode, pos):
self.ui.miniCanvasPreview.update()

@pyqtSlot(list)
def slot_canvasPluginSelected(self, pluginList):
self.ui.keyboard.allNotesOff(False)
self.ui.scrollArea.setEnabled(len(pluginList) != 0) # and self.fPluginCount > 0
self.fSelectedPlugins = pluginList

@pyqtSlot(float, float)
def slot_miniCanvasMoved(self, xp, yp):
self.fMovingViaMiniCanvas = True
self.ui.graphicsView.horizontalScrollBar().setValue(xp * self.ui.graphicsView.horizontalScrollBar().maximum())
self.ui.graphicsView.verticalScrollBar().setValue(yp * self.ui.graphicsView.verticalScrollBar().maximum())
self.fMovingViaMiniCanvas = False
self.updateCanvasInitialPos()

# --------------------------------------------------------------------------------------------------------
# Called by containers

@@ -285,36 +486,37 @@ class HostWindow(QMainWindow):
self.fLadspaRdfNeedsUpdate = True

def setupContainer(self, showCanvas, canvasThemeData = []):
if showCanvas:
canvasWidth, canvasHeight, canvasBg, canvasBrush, canvasPen = canvasThemeData
self.ui.miniCanvasPreview.setViewTheme(canvasBg, canvasBrush, canvasPen)
self.ui.miniCanvasPreview.init(self.fContainer.scene, canvasWidth, canvasHeight, self.fSavedSettings[CARLA_KEY_CUSTOM_PAINTING])
else:
self.ui.act_canvas_show_internal.setEnabled(False)
self.ui.act_canvas_show_external.setEnabled(False)
self.ui.act_canvas_arrange.setVisible(False)
self.ui.act_canvas_print.setVisible(False)
self.ui.act_canvas_refresh.setVisible(False)
self.ui.act_canvas_save_image.setVisible(False)
self.ui.act_canvas_zoom_100.setVisible(False)
self.ui.act_canvas_zoom_fit.setVisible(False)
self.ui.act_canvas_zoom_in.setVisible(False)
self.ui.act_canvas_zoom_out.setVisible(False)
self.ui.act_settings_show_meters.setVisible(False)
self.ui.act_settings_show_keyboard.setVisible(False)
self.ui.menu_Canvas.setEnabled(False)
self.ui.menu_Canvas.setVisible(False)
self.ui.menu_Canvas_Zoom.setEnabled(False)
self.ui.menu_Canvas_Zoom.setVisible(False)
self.ui.miniCanvasPreview.hide()

self.setCentralWidget(self.fContainer)
self.ui.centralwidget = self.fContainer
#if showCanvas:
#canvasWidth, canvasHeight, canvasBg, canvasBrush, canvasPen = canvasThemeData
#self.ui.miniCanvasPreview.setViewTheme(canvasBg, canvasBrush, canvasPen)
#self.ui.miniCanvasPreview.init(self.fContainer.scene, canvasWidth, canvasHeight, self.fSavedSettings[CARLA_KEY_CUSTOM_PAINTING])
#else:
#self.ui.act_canvas_show_internal.setEnabled(False)
#self.ui.act_canvas_show_external.setEnabled(False)
#self.ui.act_canvas_arrange.setVisible(False)
#self.ui.act_canvas_print.setVisible(False)
#self.ui.act_canvas_refresh.setVisible(False)
#self.ui.act_canvas_save_image.setVisible(False)
#self.ui.act_canvas_zoom_100.setVisible(False)
#self.ui.act_canvas_zoom_fit.setVisible(False)
#self.ui.act_canvas_zoom_in.setVisible(False)
#self.ui.act_canvas_zoom_out.setVisible(False)
#self.ui.act_settings_show_meters.setVisible(False)
#self.ui.act_settings_show_keyboard.setVisible(False)
#self.ui.menu_Canvas.setEnabled(False)
#self.ui.menu_Canvas.setVisible(False)
#self.ui.menu_Canvas_Zoom.setEnabled(False)
#self.ui.menu_Canvas_Zoom.setVisible(False)
#self.ui.miniCanvasPreview.hide()

self.fContainer.hide()
#self.setCentralWidget(self.fContainer)
#self.ui.centralwidget = self.fContainer

def updateContainer(self, canvasThemeData):
canvasWidth, canvasHeight, canvasBg, canvasBrush, canvasPen = canvasThemeData
self.ui.miniCanvasPreview.setViewTheme(canvasBg, canvasBrush, canvasPen)
self.ui.miniCanvasPreview.init(self.fContainer.scene, canvasWidth, canvasHeight, self.fSavedSettings[CARLA_KEY_CUSTOM_PAINTING])
self.ui.miniCanvasPreview.init(self.scene, canvasWidth, canvasHeight, self.fSavedSettings[CARLA_KEY_CUSTOM_PAINTING])

# --------------------------------------------------------------------------------------------------------
# Called by the signal handler
@@ -665,6 +867,117 @@ class HostWindow(QMainWindow):
def slot_handlePluginRemovedCallback(self, pluginId):
self.ui.act_plugin_remove_all.setEnabled(self.host.get_current_plugin_count() > 0)

# -----------------------------------------------------------------

@pyqtSlot(int, int, int, str)
def slot_handlePatchbayClientAddedCallback(self, clientId, clientIcon, pluginId, clientName):
pcSplit = patchcanvas.SPLIT_UNDEF
pcIcon = patchcanvas.ICON_APPLICATION

if clientIcon == PATCHBAY_ICON_PLUGIN:
pcIcon = patchcanvas.ICON_PLUGIN
if clientIcon == PATCHBAY_ICON_HARDWARE:
pcIcon = patchcanvas.ICON_HARDWARE
elif clientIcon == PATCHBAY_ICON_CARLA:
pass
elif clientIcon == PATCHBAY_ICON_DISTRHO:
pcIcon = patchcanvas.ICON_DISTRHO
elif clientIcon == PATCHBAY_ICON_FILE:
pcIcon = patchcanvas.ICON_FILE

patchcanvas.addGroup(clientId, clientName, pcSplit, pcIcon)

QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

if pluginId < 0:
return
if pluginId >= self.fPluginCount:
print("sorry, can't map this plugin to canvas client", pluginId, self.fPluginCount)
return

patchcanvas.setGroupAsPlugin(clientId, pluginId, bool(self.host.get_plugin_info(pluginId)['hints'] & PLUGIN_HAS_CUSTOM_UI))

@pyqtSlot(int)
def slot_handlePatchbayClientRemovedCallback(self, clientId):
#if not self.fEngineStarted: return
patchcanvas.removeGroup(clientId)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

@pyqtSlot(int, str)
def slot_handlePatchbayClientRenamedCallback(self, clientId, newClientName):
patchcanvas.renameGroup(clientId, newClientName)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

@pyqtSlot(int, int, int)
def slot_handlePatchbayClientDataChangedCallback(self, clientId, clientIcon, pluginId):
pcIcon = patchcanvas.ICON_APPLICATION

if clientIcon == PATCHBAY_ICON_PLUGIN:
pcIcon = patchcanvas.ICON_PLUGIN
if clientIcon == PATCHBAY_ICON_HARDWARE:
pcIcon = patchcanvas.ICON_HARDWARE
elif clientIcon == PATCHBAY_ICON_CARLA:
pass
elif clientIcon == PATCHBAY_ICON_DISTRHO:
pcIcon = patchcanvas.ICON_DISTRHO
elif clientIcon == PATCHBAY_ICON_FILE:
pcIcon = patchcanvas.ICON_FILE

patchcanvas.setGroupIcon(clientId, pcIcon)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

if pluginId < 0:
return
if pluginId >= self.fPluginCount:
print("sorry, can't map this plugin to canvas client", pluginId, self.fPluginCount)
return

patchcanvas.setGroupAsPlugin(clientId, pluginId, bool(self.host.get_plugin_info(pluginId)['hints'] & PLUGIN_HAS_CUSTOM_UI))

@pyqtSlot(int, int, int, str)
def slot_handlePatchbayPortAddedCallback(self, clientId, portId, portFlags, portName):
isAlternate = False

if (portFlags & PATCHBAY_PORT_IS_INPUT):
portMode = patchcanvas.PORT_MODE_INPUT
else:
portMode = patchcanvas.PORT_MODE_OUTPUT

if (portFlags & PATCHBAY_PORT_TYPE_AUDIO):
portType = patchcanvas.PORT_TYPE_AUDIO_JACK
elif (portFlags & PATCHBAY_PORT_TYPE_CV):
isAlternate = True
portType = patchcanvas.PORT_TYPE_AUDIO_JACK
elif (portFlags & PATCHBAY_PORT_TYPE_MIDI):
portType = patchcanvas.PORT_TYPE_MIDI_JACK
else:
portType = patchcanvas.PORT_TYPE_NULL

patchcanvas.addPort(clientId, portId, portName, portMode, portType, isAlternate)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

@pyqtSlot(int, int)
def slot_handlePatchbayPortRemovedCallback(self, groupId, portId):
#if not self.fEngineStarted: return
patchcanvas.removePort(groupId, portId)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

@pyqtSlot(int, int, str)
def slot_handlePatchbayPortRenamedCallback(self, groupId, portId, newPortName):
patchcanvas.renamePort(groupId, portId, newPortName)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

@pyqtSlot(int, int, int, int, int)
def slot_handlePatchbayConnectionAddedCallback(self, connectionId, groupOutId, portOutId, groupInId, portInId):
patchcanvas.connectPorts(connectionId, groupOutId, portOutId, groupInId, portInId)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

@pyqtSlot(int, int, int)
def slot_handlePatchbayConnectionRemovedCallback(self, connectionId, portOutId, portInId):
#if not self.fEngineStarted: return
patchcanvas.disconnectPorts(connectionId)
QTimer.singleShot(0, self.ui.miniCanvasPreview.update)

# --------------------------------------------------------------------------------------------------------
# Internal stuff (plugin data)

@@ -852,6 +1165,15 @@ class HostWindow(QMainWindow):
#if MACOS and not settings.value(CARLA_KEY_MAIN_USE_PRO_THEME, True, type=bool):
# self.setUnifiedTitleAndToolBarOnMac(True)

showMeters = settings.value("ShowMeters", False, type=bool)
self.ui.act_settings_show_meters.setChecked(showMeters)
self.ui.peak_in.setVisible(showMeters)
self.ui.peak_out.setVisible(showMeters)

showKeyboard = settings.value("ShowKeyboard", not(MACOS or WINDOWS), type=bool)
self.ui.act_settings_show_keyboard.setChecked(showKeyboard)
self.ui.scrollArea.setVisible(showKeyboard)

# ---------------------------------------------

# TODO
@@ -894,6 +1216,11 @@ class HostWindow(QMainWindow):

settings.setValue("DiskFolders", diskFolders)

settings.setValue("ShowMeters", self.ui.act_settings_show_meters.isChecked())
settings.setValue("ShowKeyboard", self.ui.act_settings_show_keyboard.isChecked())
settings.setValue("HorizontalScrollBarValue", self.ui.graphicsView.horizontalScrollBar().value())
settings.setValue("VerticalScrollBarValue", self.ui.graphicsView.verticalScrollBar().value())

self.fContainer.saveSettings(settings)

# -----------------------------------------------------------------
@@ -994,15 +1321,58 @@ class HostWindow(QMainWindow):

# -----------------------------------------------------------------

def fixCanvasPreviewSize(self):
self.ui.patchbay.resize(self.ui.plugins.size())
self.slot_miniCanvasCheckSize()

def resizeEvent(self, event):
QMainWindow.resizeEvent(self, event)

if self.ui.tabWidget.currentIndex() == 0:
self.fixCanvasPreviewSize()
else:
self.slot_miniCanvasCheckSize()

# -----------------------------------------------------------------

def idleFast(self):
self.host.engine_idle()
self.refreshTransport()

if self.fPluginCount == 0:
return

for pluginId in self.fSelectedPlugins:
self.fPeaksCleared = False
if self.ui.peak_in.isVisible():
self.ui.peak_in.displayMeter(1, self.host.get_input_peak_value(pluginId, True))
self.ui.peak_in.displayMeter(2, self.host.get_input_peak_value(pluginId, False))
if self.ui.peak_out.isVisible():
self.ui.peak_out.displayMeter(1, self.host.get_output_peak_value(pluginId, True))
self.ui.peak_out.displayMeter(2, self.host.get_output_peak_value(pluginId, False))
return

if self.fPeaksCleared:
return

self.fPeaksCleared = True
self.ui.peak_in.displayMeter(1, 0.0, True)
self.ui.peak_in.displayMeter(2, 0.0, True)
self.ui.peak_out.displayMeter(1, 0.0, True)
self.ui.peak_out.displayMeter(2, 0.0, True)

def idleSlow(self):
for pedit in self.fPluginList:
if pedit is None:
break
pedit.idleSlow()

def timerEvent(self, event):
if event.timerId() == self.fIdleTimerFast:
#if not self.host.isPlugin:
self.fContainer.idleFast()
self.refreshTransport()
self.host.engine_idle()
self.idleFast()

elif event.timerId() == self.fIdleTimerSlow:
self.fContainer.idleSlow()
self.idleSlow()

QMainWindow.timerEvent(self, event)

@@ -1037,6 +1407,72 @@ class HostWindow(QMainWindow):

QMainWindow.closeEvent(self, event)

# ------------------------------------------------------------------------------------------------
# Canvas callback

def canvasCallback(action, value1, value2, valueStr):
host = gCarla.gui.host

if action == patchcanvas.ACTION_GROUP_INFO:
pass

elif action == patchcanvas.ACTION_GROUP_RENAME:
pass

elif action == patchcanvas.ACTION_GROUP_SPLIT:
groupId = value1
patchcanvas.splitGroup(groupId)
gCarla.gui.ui.miniCanvasPreview.update()

elif action == patchcanvas.ACTION_GROUP_JOIN:
groupId = value1
patchcanvas.joinGroup(groupId)
gCarla.gui.ui.miniCanvasPreview.update()

elif action == patchcanvas.ACTION_PORT_INFO:
pass

elif action == patchcanvas.ACTION_PORT_RENAME:
pass

elif action == patchcanvas.ACTION_PORTS_CONNECT:
gOut, pOut, gIn, pIn = [int(i) for i in valueStr.split(":")]

if not host.patchbay_connect(gOut, pOut, gIn, pIn):
print("Connection failed:", host.get_last_error())

elif action == patchcanvas.ACTION_PORTS_DISCONNECT:
connectionId = value1

if not host.patchbay_disconnect(connectionId):
print("Disconnect failed:", host.get_last_error())

elif action == patchcanvas.ACTION_PLUGIN_CLONE:
pluginId = value1

host.clone_plugin(pluginId)

elif action == patchcanvas.ACTION_PLUGIN_EDIT:
pluginId = value1

gCarla.gui.fContainer.showEditDialog(pluginId)

elif action == patchcanvas.ACTION_PLUGIN_RENAME:
pluginId = value1
newName = valueStr

host.rename_plugin(pluginId, newName)

elif action == patchcanvas.ACTION_PLUGIN_REMOVE:
pluginId = value1

host.remove_plugin(pluginId)

elif action == patchcanvas.ACTION_PLUGIN_SHOW_UI:
pluginId = value1

host.show_custom_ui(pluginId, True)

# ------------------------------------------------------------------------------------------------------------
# Engine callback



+ 50
- 500
source/carla_patchbay.py View File

@@ -42,24 +42,6 @@ from carla_host import *
from digitalpeakmeter import DigitalPeakMeter
from pixmapkeyboard import PixmapKeyboardHArea

# ------------------------------------------------------------------------------------------------------------
# Try Import OpenGL

try:
if config_UseQt5:
from PyQt5.QtOpenGL import QGLWidget
else:
from PyQt4.QtOpenGL import QGLWidget
hasGL = True
except:
hasGL = False

# ------------------------------------------------------------------------------------------------------------
# Carla Canvas defaults

CARLA_DEFAULT_CANVAS_SIZE_WIDTH = 3100
CARLA_DEFAULT_CANVAS_SIZE_HEIGHT = 2400

# ------------------------------------------------------------------------------------------------
# Dummy class used in main carla as replacement for PluginEdit

@@ -111,150 +93,44 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta, HostWidgetMeta):
QFrame.__init__(self, parent)
self.host = host

if False:
# kdevelop likes this :)
host = CarlaHostMeta()
self.host = host

# -------------------------------------------------------------

self.fLayout = QGridLayout(self)
self.fLayout.setContentsMargins(0, 0, 0, 0)
self.fLayout.setSpacing(1)
self.setLayout(self.fLayout)

self.fView = QGraphicsView(self)
self.fKeys = PixmapKeyboardHArea(self)

self.fPeaksIn = DigitalPeakMeter(self)
self.fPeaksOut = DigitalPeakMeter(self)
self.fPeaksCleared = True

self.fPeaksIn.setColor(DigitalPeakMeter.BLUE)
self.fPeaksIn.setChannels(2)
self.fPeaksIn.setOrientation(DigitalPeakMeter.VERTICAL)
self.fPeaksIn.setFixedWidth(25)

self.fPeaksOut.setColor(DigitalPeakMeter.GREEN)
self.fPeaksOut.setChannels(2)
self.fPeaksOut.setOrientation(DigitalPeakMeter.VERTICAL)
self.fPeaksOut.setFixedWidth(25)

self.fLayout.addWidget(self.fPeaksIn, 0, 0)
self.fLayout.addWidget(self.fView, 0, 1) # self.fViewWidget if is3D else
self.fLayout.addWidget(self.fPeaksOut, 0, 2)
self.fLayout.addWidget(self.fKeys, 1, 0, 1, 0)

# -------------------------------------------------------------
# Internal stuff

self.fParent = parent
self.fPluginCount = 0
self.fPluginList = []

self.fExternalPatchbay = False
self.fIsOnlyPatchbay = onlyPatchbay
self.fSelectedPlugins = []

self.fCanvasWidth = 0
self.fCanvasHeight = 0

# -------------------------------------------------------------
# Set-up Canvas Preview

self.fMiniCanvasPreview = self.fParent.ui.miniCanvasPreview
self.fMiniCanvasPreview.setRealParent(self)
self.fMovingViaMiniCanvas = False

# -------------------------------------------------------------
# Set-up Canvas

self.scene = patchcanvas.PatchScene(self, self.fView)
self.fView.setScene(self.scene)
self.fView.setRenderHint(QPainter.Antialiasing, bool(parent.fSavedSettings[CARLA_KEY_CANVAS_ANTIALIASING] == patchcanvas.ANTIALIASING_FULL))

if parent.fSavedSettings[CARLA_KEY_CANVAS_USE_OPENGL] and hasGL: # and not is3D:
self.fViewWidget = QGLWidget(self)
self.fView.setViewport(self.fViewWidget)
self.fView.setRenderHint(QPainter.HighQualityAntialiasing, parent.fSavedSettings[CARLA_KEY_CANVAS_HQ_ANTIALIASING])

self.setupCanvas()

QTimer.singleShot(100, self.slot_restoreScrollbarValues)

# -------------------------------------------------------------
# Connect actions to functions

parent.ui.act_settings_show_meters.toggled.connect(self.slot_showCanvasMeters)
parent.ui.act_settings_show_keyboard.toggled.connect(self.slot_showCanvasKeyboard)

self.fView.horizontalScrollBar().valueChanged.connect(self.slot_horizontalScrollBarChanged)
self.fView.verticalScrollBar().valueChanged.connect(self.slot_verticalScrollBarChanged)

self.scene.scaleChanged.connect(self.slot_canvasScaleChanged)
self.scene.sceneGroupMoved.connect(self.slot_canvasItemMoved)
self.scene.pluginSelected.connect(self.slot_canvasPluginSelected)

self.fMiniCanvasPreview.miniCanvasMoved.connect(self.slot_miniCanvasMoved)

self.fKeys.keyboard.noteOn.connect(self.slot_noteOn)
self.fKeys.keyboard.noteOff.connect(self.slot_noteOff)

# -------------------------------------------------------------
# Load Settings

settings = QSettings()

showMeters = settings.value("ShowMeters", False, type=bool)
self.fParent.ui.act_settings_show_meters.setChecked(showMeters)
self.fPeaksIn.setVisible(showMeters)
self.fPeaksOut.setVisible(showMeters)

showKeyboard = settings.value("ShowKeyboard", not(MACOS or WINDOWS), type=bool)
self.fParent.ui.act_settings_show_keyboard.setChecked(showKeyboard)
self.fKeys.setVisible(showKeyboard)
#self.fKeys.keyboard.noteOn.connect(self.slot_noteOn)
#self.fKeys.keyboard.noteOff.connect(self.slot_noteOff)

# -------------------------------------------------------------
# Connect actions to functions (part 2)

host.PluginAddedCallback.connect(self.slot_handlePluginAddedCallback)
host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback)
host.NoteOnCallback.connect(self.slot_handleNoteOnCallback)
host.NoteOffCallback.connect(self.slot_handleNoteOffCallback)
host.PatchbayClientAddedCallback.connect(self.slot_handlePatchbayClientAddedCallback)
host.PatchbayClientRemovedCallback.connect(self.slot_handlePatchbayClientRemovedCallback)
host.PatchbayClientRenamedCallback.connect(self.slot_handlePatchbayClientRenamedCallback)
host.PatchbayClientDataChangedCallback.connect(self.slot_handlePatchbayClientDataChangedCallback)
host.PatchbayPortAddedCallback.connect(self.slot_handlePatchbayPortAddedCallback)
host.PatchbayPortRemovedCallback.connect(self.slot_handlePatchbayPortRemovedCallback)
host.PatchbayPortRenamedCallback.connect(self.slot_handlePatchbayPortRenamedCallback)
host.PatchbayConnectionAddedCallback.connect(self.slot_handlePatchbayConnectionAddedCallback)
host.PatchbayConnectionRemovedCallback.connect(self.slot_handlePatchbayConnectionRemovedCallback)

if not doSetup: return

parent.ui.act_plugins_enable.triggered.connect(self.slot_pluginsEnable)
parent.ui.act_plugins_disable.triggered.connect(self.slot_pluginsDisable)
parent.ui.act_plugins_volume100.triggered.connect(self.slot_pluginsVolume100)
parent.ui.act_plugins_mute.triggered.connect(self.slot_pluginsMute)
parent.ui.act_plugins_wet100.triggered.connect(self.slot_pluginsWet100)
parent.ui.act_plugins_bypass.triggered.connect(self.slot_pluginsBypass)
parent.ui.act_plugins_center.triggered.connect(self.slot_pluginsCenter)
parent.ui.act_plugins_panic.triggered.connect(self.slot_pluginsDisable)

parent.ui.act_canvas_show_internal.triggered.connect(self.slot_canvasShowInternal)
parent.ui.act_canvas_show_external.triggered.connect(self.slot_canvasShowExternal)
parent.ui.act_canvas_arrange.setEnabled(False) # TODO, later
parent.ui.act_canvas_arrange.triggered.connect(self.slot_canvasArrange)
parent.ui.act_canvas_refresh.triggered.connect(self.slot_canvasRefresh)
parent.ui.act_canvas_zoom_fit.triggered.connect(self.slot_canvasZoomFit)
parent.ui.act_canvas_zoom_in.triggered.connect(self.slot_canvasZoomIn)
parent.ui.act_canvas_zoom_out.triggered.connect(self.slot_canvasZoomOut)
parent.ui.act_canvas_zoom_100.triggered.connect(self.slot_canvasZoomReset)
parent.ui.act_canvas_print.triggered.connect(self.slot_canvasPrint)
parent.ui.act_canvas_save_image.triggered.connect(self.slot_canvasSaveImage)

parent.ui.act_settings_configure.triggered.connect(self.slot_configureCarla)
#host.PluginAddedCallback.connect(self.slot_handlePluginAddedCallback)
#host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback)
#host.NoteOnCallback.connect(self.slot_handleNoteOnCallback)
#host.NoteOffCallback.connect(self.slot_handleNoteOffCallback)

#if not doSetup: return

#parent.ui.act_plugins_enable.triggered.connect(self.slot_pluginsEnable)
#parent.ui.act_plugins_disable.triggered.connect(self.slot_pluginsDisable)
#parent.ui.act_plugins_volume100.triggered.connect(self.slot_pluginsVolume100)
#parent.ui.act_plugins_mute.triggered.connect(self.slot_pluginsMute)
#parent.ui.act_plugins_wet100.triggered.connect(self.slot_pluginsWet100)
#parent.ui.act_plugins_bypass.triggered.connect(self.slot_pluginsBypass)
#parent.ui.act_plugins_center.triggered.connect(self.slot_pluginsCenter)
#parent.ui.act_plugins_panic.triggered.connect(self.slot_pluginsDisable)

#parent.ui.act_canvas_show_internal.triggered.connect(self.slot_canvasShowInternal)
#parent.ui.act_canvas_show_external.triggered.connect(self.slot_canvasShowExternal)
#parent.ui.act_canvas_arrange.setEnabled(False) # TODO, later
#parent.ui.act_canvas_arrange.triggered.connect(self.slot_canvasArrange)
#parent.ui.act_canvas_refresh.triggered.connect(self.slot_canvasRefresh)
#parent.ui.act_canvas_zoom_fit.triggered.connect(self.slot_canvasZoomFit)
#parent.ui.act_canvas_zoom_in.triggered.connect(self.slot_canvasZoomIn)
#parent.ui.act_canvas_zoom_out.triggered.connect(self.slot_canvasZoomOut)
#parent.ui.act_canvas_zoom_100.triggered.connect(self.slot_canvasZoomReset)
#parent.ui.act_canvas_print.triggered.connect(self.slot_canvasPrint)
#parent.ui.act_canvas_save_image.triggered.connect(self.slot_canvasSaveImage)

#parent.ui.act_settings_configure.triggered.connect(self.slot_configureCarla)

# -----------------------------------------------------------------

@@ -320,7 +196,7 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta, HostWidgetMeta):
# HostWidgetMeta methods

def removeAllPlugins(self):
patchcanvas.handleAllPluginsRemoved()
#patchcanvas.handleAllPluginsRemoved()

for pedit in self.fPluginList:
if pedit is None:
@@ -337,49 +213,20 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta, HostWidgetMeta):
pass

def engineStopped(self):
patchcanvas.clear()

def idleFast(self):
if self.fPluginCount == 0:
return

for pluginId in self.fSelectedPlugins:
self.fPeaksCleared = False
if self.fPeaksIn.isVisible():
self.fPeaksIn.displayMeter(1, self.host.get_input_peak_value(pluginId, True))
self.fPeaksIn.displayMeter(2, self.host.get_input_peak_value(pluginId, False))
if self.fPeaksOut.isVisible():
self.fPeaksOut.displayMeter(1, self.host.get_output_peak_value(pluginId, True))
self.fPeaksOut.displayMeter(2, self.host.get_output_peak_value(pluginId, False))
return

if self.fPeaksCleared:
return

self.fPeaksCleared = True
self.fPeaksIn.displayMeter(1, 0.0, True)
self.fPeaksIn.displayMeter(2, 0.0, True)
self.fPeaksOut.displayMeter(1, 0.0, True)
self.fPeaksOut.displayMeter(2, 0.0, True)

def idleSlow(self):
for pedit in self.fPluginList:
if pedit is None:
break
pedit.idleSlow()
pass
#patchcanvas.clear()

def projectLoadingStarted(self):
self.fView.setEnabled(False)
pass
#self.fView.setEnabled(False)

def projectLoadingFinished(self):
self.fView.setEnabled(True)
QTimer.singleShot(1000, self.slot_canvasRefresh)
pass
#self.fView.setEnabled(True)
#QTimer.singleShot(1000, self.slot_canvasRefresh)

def saveSettings(self, settings):
settings.setValue("ShowMeters", self.fParent.ui.act_settings_show_meters.isChecked())
settings.setValue("ShowKeyboard", self.fParent.ui.act_settings_show_keyboard.isChecked())
settings.setValue("HorizontalScrollBarValue", self.fView.horizontalScrollBar().value())
settings.setValue("VerticalScrollBarValue", self.fView.verticalScrollBar().value())
pass

def showEditDialog(self, pluginId):
pedit = self.getPluginEditDialog(pluginId)
@@ -419,134 +266,18 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta, HostWidgetMeta):
# -----------------------------------------------------------------

def clearSideStuff(self):
self.scene.clearSelection()
#self.scene.clearSelection()

self.fSelectedPlugins = []

self.fKeys.keyboard.allNotesOff(False)
self.fKeys.setEnabled(False)

self.fPeaksCleared = True
self.fPeaksIn.displayMeter(1, 0.0, True)
self.fPeaksIn.displayMeter(2, 0.0, True)
self.fPeaksOut.displayMeter(1, 0.0, True)
self.fPeaksOut.displayMeter(2, 0.0, True)

def setupCanvas(self):
pOptions = patchcanvas.options_t()
pOptions.theme_name = self.fParent.fSavedSettings[CARLA_KEY_CANVAS_THEME]
pOptions.auto_hide_groups = self.fParent.fSavedSettings[CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS]
pOptions.use_bezier_lines = self.fParent.fSavedSettings[CARLA_KEY_CANVAS_USE_BEZIER_LINES]
pOptions.antialiasing = self.fParent.fSavedSettings[CARLA_KEY_CANVAS_ANTIALIASING]
pOptions.eyecandy = self.fParent.fSavedSettings[CARLA_KEY_CANVAS_EYE_CANDY]

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("Carla2", self.scene, canvasCallback, False)

tryCanvasSize = self.fParent.fSavedSettings[CARLA_KEY_CANVAS_SIZE].split("x")

if len(tryCanvasSize) == 2 and tryCanvasSize[0].isdigit() and tryCanvasSize[1].isdigit():
self.fCanvasWidth = int(tryCanvasSize[0])
self.fCanvasHeight = int(tryCanvasSize[1])
else:
self.fCanvasWidth = CARLA_DEFAULT_CANVAS_SIZE_WIDTH
self.fCanvasHeight = CARLA_DEFAULT_CANVAS_SIZE_HEIGHT

patchcanvas.setCanvasSize(0, 0, self.fCanvasWidth, self.fCanvasHeight)
patchcanvas.setInitialPos(self.fCanvasWidth / 2, self.fCanvasHeight / 2)
self.fView.setSceneRect(0, 0, self.fCanvasWidth, self.fCanvasHeight)

self.themeData = [self.fCanvasWidth, self.fCanvasHeight, patchcanvas.canvas.theme.canvas_bg, patchcanvas.canvas.theme.rubberband_brush, patchcanvas.canvas.theme.rubberband_pen.color()]
#self.fKeys.keyboard.allNotesOff(False)
#self.fKeys.setEnabled(False)

def updateCanvasInitialPos(self):
x = self.fView.horizontalScrollBar().value() + self.width()/4
y = self.fView.verticalScrollBar().value() + self.height()/4
patchcanvas.setInitialPos(x, y)

# -----------------------------------------------------------------

@pyqtSlot(bool)
def slot_showCanvasMeters(self, yesNo):
self.fPeaksIn.setVisible(yesNo)
self.fPeaksOut.setVisible(yesNo)

@pyqtSlot(bool)
def slot_showCanvasKeyboard(self, yesNo):
self.fKeys.setVisible(yesNo)

# -----------------------------------------------------------------

@pyqtSlot()
def slot_miniCanvasCheckAll(self):
self.slot_miniCanvasCheckSize()
self.slot_horizontalScrollBarChanged(self.fView.horizontalScrollBar().value())
self.slot_verticalScrollBarChanged(self.fView.verticalScrollBar().value())

@pyqtSlot()
def slot_miniCanvasCheckSize(self):
self.fMiniCanvasPreview.setViewSize(float(self.width()) / self.fCanvasWidth, float(self.height()) / self.fCanvasHeight)

@pyqtSlot(int)
def slot_horizontalScrollBarChanged(self, value):
if self.fMovingViaMiniCanvas: return

maximum = self.fView.horizontalScrollBar().maximum()
if maximum == 0:
xp = 0
else:
xp = float(value) / maximum
self.fMiniCanvasPreview.setViewPosX(xp)
self.updateCanvasInitialPos()

@pyqtSlot(int)
def slot_verticalScrollBarChanged(self, value):
if self.fMovingViaMiniCanvas: return

maximum = self.fView.verticalScrollBar().maximum()
if maximum == 0:
yp = 0
else:
yp = float(value) / maximum
self.fMiniCanvasPreview.setViewPosY(yp)
self.updateCanvasInitialPos()

@pyqtSlot()
def slot_restoreScrollbarValues(self):
settings = QSettings()
self.fView.horizontalScrollBar().setValue(settings.value("HorizontalScrollBarValue", self.fView.horizontalScrollBar().maximum()/2, type=int))
self.fView.verticalScrollBar().setValue(settings.value("VerticalScrollBarValue", self.fView.verticalScrollBar().maximum()/2, type=int))

# -----------------------------------------------------------------

@pyqtSlot(float)
def slot_canvasScaleChanged(self, scale):
self.fMiniCanvasPreview.setViewScale(scale)

@pyqtSlot(int, int, QPointF)
def slot_canvasItemMoved(self, group_id, split_mode, pos):
self.fMiniCanvasPreview.update()

@pyqtSlot(list)
def slot_canvasPluginSelected(self, pluginList):
self.fKeys.keyboard.allNotesOff(False)
self.fKeys.setEnabled(len(pluginList) != 0) # and self.fPluginCount > 0
self.fSelectedPlugins = pluginList

@pyqtSlot(float, float)
def slot_miniCanvasMoved(self, xp, yp):
self.fMovingViaMiniCanvas = True
self.fView.horizontalScrollBar().setValue(xp * self.fView.horizontalScrollBar().maximum())
self.fView.verticalScrollBar().setValue(yp * self.fView.verticalScrollBar().maximum())
self.fMovingViaMiniCanvas = False
self.updateCanvasInitialPos()
#self.fPeaksCleared = True
#self.fPeaksIn.displayMeter(1, 0.0, True)
#self.fPeaksIn.displayMeter(2, 0.0, True)
#self.fPeaksOut.displayMeter(1, 0.0, True)
#self.fPeaksOut.displayMeter(2, 0.0, True)

# -----------------------------------------------------------------

@@ -674,124 +405,13 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta, HostWidgetMeta):

self.setupCanvas()
self.fParent.updateContainer(self.themeData)
self.slot_miniCanvasCheckAll()
#self.slot_miniCanvasCheckAll()

if self.host.is_engine_running():
self.host.patchbay_refresh(self.fExternalPatchbay)

# -----------------------------------------------------------------

@pyqtSlot(int, int, int, str)
def slot_handlePatchbayClientAddedCallback(self, clientId, clientIcon, pluginId, clientName):
pcSplit = patchcanvas.SPLIT_UNDEF
pcIcon = patchcanvas.ICON_APPLICATION

if clientIcon == PATCHBAY_ICON_PLUGIN:
pcIcon = patchcanvas.ICON_PLUGIN
if clientIcon == PATCHBAY_ICON_HARDWARE:
pcIcon = patchcanvas.ICON_HARDWARE
elif clientIcon == PATCHBAY_ICON_CARLA:
pass
elif clientIcon == PATCHBAY_ICON_DISTRHO:
pcIcon = patchcanvas.ICON_DISTRHO
elif clientIcon == PATCHBAY_ICON_FILE:
pcIcon = patchcanvas.ICON_FILE

patchcanvas.addGroup(clientId, clientName, pcSplit, pcIcon)

QTimer.singleShot(0, self.fMiniCanvasPreview.update)

if pluginId < 0:
return
if pluginId >= self.fPluginCount:
print("sorry, can't map this plugin to canvas client", pluginId, self.fPluginCount)
return

patchcanvas.setGroupAsPlugin(clientId, pluginId, bool(self.host.get_plugin_info(pluginId)['hints'] & PLUGIN_HAS_CUSTOM_UI))

@pyqtSlot(int)
def slot_handlePatchbayClientRemovedCallback(self, clientId):
#if not self.fEngineStarted: return
patchcanvas.removeGroup(clientId)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

@pyqtSlot(int, str)
def slot_handlePatchbayClientRenamedCallback(self, clientId, newClientName):
patchcanvas.renameGroup(clientId, newClientName)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

@pyqtSlot(int, int, int)
def slot_handlePatchbayClientDataChangedCallback(self, clientId, clientIcon, pluginId):
pcIcon = patchcanvas.ICON_APPLICATION

if clientIcon == PATCHBAY_ICON_PLUGIN:
pcIcon = patchcanvas.ICON_PLUGIN
if clientIcon == PATCHBAY_ICON_HARDWARE:
pcIcon = patchcanvas.ICON_HARDWARE
elif clientIcon == PATCHBAY_ICON_CARLA:
pass
elif clientIcon == PATCHBAY_ICON_DISTRHO:
pcIcon = patchcanvas.ICON_DISTRHO
elif clientIcon == PATCHBAY_ICON_FILE:
pcIcon = patchcanvas.ICON_FILE

patchcanvas.setGroupIcon(clientId, pcIcon)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

if pluginId < 0:
return
if pluginId >= self.fPluginCount:
print("sorry, can't map this plugin to canvas client", pluginId, self.fPluginCount)
return

patchcanvas.setGroupAsPlugin(clientId, pluginId, bool(self.host.get_plugin_info(pluginId)['hints'] & PLUGIN_HAS_CUSTOM_UI))

@pyqtSlot(int, int, int, str)
def slot_handlePatchbayPortAddedCallback(self, clientId, portId, portFlags, portName):
isAlternate = False

if (portFlags & PATCHBAY_PORT_IS_INPUT):
portMode = patchcanvas.PORT_MODE_INPUT
else:
portMode = patchcanvas.PORT_MODE_OUTPUT

if (portFlags & PATCHBAY_PORT_TYPE_AUDIO):
portType = patchcanvas.PORT_TYPE_AUDIO_JACK
elif (portFlags & PATCHBAY_PORT_TYPE_CV):
isAlternate = True
portType = patchcanvas.PORT_TYPE_AUDIO_JACK
elif (portFlags & PATCHBAY_PORT_TYPE_MIDI):
portType = patchcanvas.PORT_TYPE_MIDI_JACK
else:
portType = patchcanvas.PORT_TYPE_NULL

patchcanvas.addPort(clientId, portId, portName, portMode, portType, isAlternate)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

@pyqtSlot(int, int)
def slot_handlePatchbayPortRemovedCallback(self, groupId, portId):
#if not self.fEngineStarted: return
patchcanvas.removePort(groupId, portId)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

@pyqtSlot(int, int, str)
def slot_handlePatchbayPortRenamedCallback(self, groupId, portId, newPortName):
patchcanvas.renamePort(groupId, portId, newPortName)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

@pyqtSlot(int, int, int, int, int)
def slot_handlePatchbayConnectionAddedCallback(self, connectionId, groupOutId, portOutId, groupInId, portInId):
patchcanvas.connectPorts(connectionId, groupOutId, portOutId, groupInId, portInId)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

@pyqtSlot(int, int, int)
def slot_handlePatchbayConnectionRemovedCallback(self, connectionId, portOutId, portInId):
#if not self.fEngineStarted: return
patchcanvas.disconnectPorts(connectionId)
QTimer.singleShot(0, self.fMiniCanvasPreview.update)

# -----------------------------------------------------------------

@pyqtSlot()
def slot_canvasArrange(self):
patchcanvas.arrange()
@@ -820,7 +440,7 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta, HostWidgetMeta):

@pyqtSlot()
def slot_canvasRefresh(self):
patchcanvas.clear()
#patchcanvas.clear()

if self.host.is_engine_running():
self.host.patchbay_refresh(self.fExternalPatchbay)
@@ -892,73 +512,3 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta, HostWidgetMeta):
painter.restore()

# -----------------------------------------------------------------

def resizeEvent(self, event):
QFrame.resizeEvent(self, event)
self.slot_miniCanvasCheckSize()

# ------------------------------------------------------------------------------------------------
# Canvas callback

def canvasCallback(action, value1, value2, valueStr):
host = gCarla.gui.host

if action == patchcanvas.ACTION_GROUP_INFO:
pass

elif action == patchcanvas.ACTION_GROUP_RENAME:
pass

elif action == patchcanvas.ACTION_GROUP_SPLIT:
groupId = value1
patchcanvas.splitGroup(groupId)
gCarla.gui.ui.miniCanvasPreview.update()

elif action == patchcanvas.ACTION_GROUP_JOIN:
groupId = value1
patchcanvas.joinGroup(groupId)
gCarla.gui.ui.miniCanvasPreview.update()

elif action == patchcanvas.ACTION_PORT_INFO:
pass

elif action == patchcanvas.ACTION_PORT_RENAME:
pass

elif action == patchcanvas.ACTION_PORTS_CONNECT:
gOut, pOut, gIn, pIn = [int(i) for i in valueStr.split(":")]

if not host.patchbay_connect(gOut, pOut, gIn, pIn):
print("Connection failed:", host.get_last_error())

elif action == patchcanvas.ACTION_PORTS_DISCONNECT:
connectionId = value1

if not host.patchbay_disconnect(connectionId):
print("Disconnect failed:", host.get_last_error())

elif action == patchcanvas.ACTION_PLUGIN_CLONE:
pluginId = value1

host.clone_plugin(pluginId)

elif action == patchcanvas.ACTION_PLUGIN_EDIT:
pluginId = value1

gCarla.gui.fContainer.showEditDialog(pluginId)

elif action == patchcanvas.ACTION_PLUGIN_RENAME:
pluginId = value1
newName = valueStr

host.rename_plugin(pluginId, newName)

elif action == patchcanvas.ACTION_PLUGIN_REMOVE:
pluginId = value1

host.remove_plugin(pluginId)

elif action == patchcanvas.ACTION_PLUGIN_SHOW_UI:
pluginId = value1

host.show_custom_ui(pluginId, True)

Loading…
Cancel
Save