Browse Source

Cleanup

tags/1.9.5
falkTX 11 years ago
parent
commit
412d9571b9
9 changed files with 265 additions and 552 deletions
  1. +0
    -19
      source/carla
  2. +10
    -4
      source/carla_backend.py
  3. +8
    -24
      source/carla_host.py
  4. +12
    -212
      source/carla_patchbay.py
  5. +120
    -273
      source/carla_rack.py
  6. +2
    -5
      source/carla_settings.py
  7. +4
    -10
      source/carla_shared.py
  8. +75
    -4
      source/carla_skin.py
  9. +34
    -1
      source/carla_widgets.py

+ 0
- 19
source/carla View File

@@ -102,26 +102,7 @@ class CarlaMultiW(QTabWidget):
host.PluginUnavailableCallback.connect(self.fRack.slot_handlePluginUnavailableCallback) host.PluginUnavailableCallback.connect(self.fRack.slot_handlePluginUnavailableCallback)
host.PluginUnavailableCallback.connect(self.fPatchbay.slot_handlePluginUnavailableCallback) host.PluginUnavailableCallback.connect(self.fPatchbay.slot_handlePluginUnavailableCallback)


host.ParameterValueChangedCallback.connect(self.fRack.slot_handleParameterValueChangedCallback)
host.ParameterValueChangedCallback.connect(self.fPatchbay.slot_handleParameterValueChangedCallback)
host.ParameterDefaultChangedCallback.connect(self.fRack.slot_handleParameterDefaultChangedCallback)
host.ParameterMidiChannelChangedCallback.connect(self.fRack.slot_handleParameterMidiChannelChangedCallback)
host.ParameterMidiCcChangedCallback.connect(self.fRack.slot_handleParameterMidiCcChangedCallback)
host.ProgramChangedCallback.connect(self.fRack.slot_handleProgramChangedCallback)
host.MidiProgramChangedCallback.connect(self.fRack.slot_handleMidiProgramChangedCallback)
host.OptionChangedCallback.connect(self.fRack.slot_handleOptionChangedCallback)
host.UiStateChangedCallback.connect(self.fRack.slot_handleUiStateChangedCallback)
host.NoteOnCallback.connect(self.fRack.slot_handleNoteOnCallback)
host.NoteOnCallback.connect(self.fPatchbay.slot_handleNoteOnCallback)
host.NoteOffCallback.connect(self.fRack.slot_handleNoteOffCallback)
host.NoteOffCallback.connect(self.fPatchbay.slot_handleNoteOffCallback)
host.UpdateCallback.connect(self.fRack.slot_handleUpdateCallback)
host.ReloadInfoCallback.connect(self.fRack.slot_handleReloadInfoCallback)
host.ReloadParametersCallback.connect(self.fRack.slot_handleReloadParametersCallback)
host.ReloadParametersCallback.connect(self.fPatchbay.slot_handleReloadParametersCallback)
host.ReloadProgramsCallback.connect(self.fRack.slot_handleReloadProgramsCallback)
host.ReloadAllCallback.connect(self.fRack.slot_handleReloadAllCallback) host.ReloadAllCallback.connect(self.fRack.slot_handleReloadAllCallback)
host.ReloadAllCallback.connect(self.fPatchbay.slot_handleReloadAllCallback)


host.PatchbayClientAddedCallback.connect(self.fPatchbay.slot_handlePatchbayClientAddedCallback) host.PatchbayClientAddedCallback.connect(self.fPatchbay.slot_handlePatchbayClientAddedCallback)
host.PatchbayClientRemovedCallback.connect(self.fPatchbay.slot_handlePatchbayClientRemovedCallback) host.PatchbayClientRemovedCallback.connect(self.fPatchbay.slot_handlePatchbayClientRemovedCallback)


+ 10
- 4
source/carla_backend.py View File

@@ -31,9 +31,9 @@ from platform import architecture
from sys import platform, maxsize from sys import platform, maxsize


if config_UseQt5: if config_UseQt5:
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtCore import pyqtSignal, pyqtWrapperType, QObject
else: else:
from PyQt4.QtCore import pyqtSignal, QObject
from PyQt4.QtCore import pyqtSignal, pyqtWrapperType, QObject


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# 64bit check # 64bit check
@@ -1244,11 +1244,17 @@ elif WINDOWS:
else: else:
BINARY_NATIVE = BINARY_OTHER BINARY_NATIVE = BINARY_OTHER


# ------------------------------------------------------------------------------------------------------------
# An empty class used to resolve metaclass conflicts between ABC and PyQt modules

class PyQtMetaClass(pyqtWrapperType, ABCMeta):
pass

# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# Carla Host object (Meta) # Carla Host object (Meta)


class CarlaHostMeta(QObject): class CarlaHostMeta(QObject):
#class CarlaHostMeta(QObject, metaclass=ABCMeta):
#class CarlaHostMeta(QObject, metaclass=PyQtMetaClass):
# signals # signals
DebugCallback = pyqtSignal(int, int, int, float, str) DebugCallback = pyqtSignal(int, int, int, float, str)
PluginAddedCallback = pyqtSignal(int, str) PluginAddedCallback = pyqtSignal(int, str)
@@ -2820,7 +2826,7 @@ class PluginStoreInfo(object):
# Carla Host object for plugins (using pipes) # Carla Host object for plugins (using pipes)


class CarlaHostPlugin(CarlaHostMeta): class CarlaHostPlugin(CarlaHostMeta):
#class CarlaHostPlugin(CarlaHostMeta, metaclass=ABCMeta):
#class CarlaHostPlugin(CarlaHostMeta, metaclass=PyQtMetaClass):
def __init__(self): def __init__(self):
CarlaHostMeta.__init__(self) CarlaHostMeta.__init__(self)




+ 8
- 24
source/carla_host.py View File

@@ -62,18 +62,6 @@ class HostWidgetMeta(object):


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


#def addPlugin(self, pluginId, isProjectLoading):
#raise NotImplementedError

#def removePlugin(self, pluginId):
#raise NotImplementedError

#def renamePlugin(self, pluginId, newName):
#raise NotImplementedError

#def disablePlugin(self, pluginId, errorMsg):
#raise NotImplementedError

def removeAllPlugins(self): def removeAllPlugins(self):
raise NotImplementedError raise NotImplementedError


@@ -297,8 +285,7 @@ class HostWindow(QMainWindow):
self.fLadspaRdfNeedsUpdate = True self.fLadspaRdfNeedsUpdate = True


def openSettingsWindow(self, hasCanvas, hasCanvasGL): def openSettingsWindow(self, hasCanvas, hasCanvasGL):
hasEngine = bool(self.fSessionManagerName != "Non Session Manager")
dialog = CarlaSettingsW(self, self.host, hasCanvas, hasCanvasGL, hasEngine)
dialog = CarlaSettingsW(self, self.host, hasCanvas, hasCanvasGL)
return dialog.exec_() return dialog.exec_()


def setupContainer(self, showCanvas, canvasThemeData = []): def setupContainer(self, showCanvas, canvasThemeData = []):
@@ -1070,16 +1057,13 @@ def engineCallback(host, action, pluginId, value1, value2, value3, valueStr):
# FIXME # FIXME
if host is None: host = gCarla.gui.host if host is None: host = gCarla.gui.host


if action in (ENGINE_CALLBACK_ENGINE_STARTED,
ENGINE_CALLBACK_PROCESS_MODE_CHANGED,
ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED):
if action == ENGINE_CALLBACK_ENGINE_STARTED:
host.processMode = value1
host.transportMode = value2
elif action == ENGINE_CALLBACK_PROCESS_MODE_CHANGED:
host.processMode = value1
elif action == ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED:
host.transportMode = value1
if action == ENGINE_CALLBACK_ENGINE_STARTED:
host.processMode = value1
host.transportMode = value2
elif action == ENGINE_CALLBACK_PROCESS_MODE_CHANGED:
host.processMode = value1
elif action == ENGINE_CALLBACK_TRANSPORT_MODE_CHANGED:
host.transportMode = value1


valueStr = charPtrToString(valueStr) valueStr = charPtrToString(valueStr)




+ 12
- 212
source/carla_patchbay.py View File

@@ -235,20 +235,6 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta):
host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback) host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback)
host.PluginRenamedCallback.connect(self.slot_handlePluginRenamedCallback) host.PluginRenamedCallback.connect(self.slot_handlePluginRenamedCallback)
host.PluginUnavailableCallback.connect(self.slot_handlePluginUnavailableCallback) host.PluginUnavailableCallback.connect(self.slot_handlePluginUnavailableCallback)
host.ParameterValueChangedCallback.connect(self.slot_handleParameterValueChangedCallback)
host.ParameterDefaultChangedCallback.connect(self.slot_handleParameterDefaultChangedCallback)
host.ParameterMidiChannelChangedCallback.connect(self.slot_handleParameterMidiChannelChangedCallback)
host.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback)
host.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback)
host.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback)
host.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback)
host.NoteOnCallback.connect(self.slot_handleNoteOnCallback)
host.NoteOffCallback.connect(self.slot_handleNoteOffCallback)
host.UpdateCallback.connect(self.slot_handleUpdateCallback)
host.ReloadInfoCallback.connect(self.slot_handleReloadInfoCallback)
host.ReloadParametersCallback.connect(self.slot_handleReloadParametersCallback)
host.ReloadProgramsCallback.connect(self.slot_handleReloadProgramsCallback)
host.ReloadAllCallback.connect(self.slot_handleReloadAllCallback)
host.PatchbayClientAddedCallback.connect(self.slot_handlePatchbayClientAddedCallback) host.PatchbayClientAddedCallback.connect(self.slot_handlePatchbayClientAddedCallback)
host.PatchbayClientRemovedCallback.connect(self.slot_handlePatchbayClientRemovedCallback) host.PatchbayClientRemovedCallback.connect(self.slot_handlePatchbayClientRemovedCallback)
host.PatchbayClientRenamedCallback.connect(self.slot_handlePatchbayClientRenamedCallback) host.PatchbayClientRenamedCallback.connect(self.slot_handlePatchbayClientRenamedCallback)
@@ -266,7 +252,8 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta):


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


def addPlugin(self, pluginId, isProjectLoading):
@pyqtSlot(int, str)
def slot_handlePluginAddedCallback(self, pluginId, pluginName):
if self.fIsOnlyPatchbay: if self.fIsOnlyPatchbay:
pitem = PluginEdit(self, self.host, pluginId) pitem = PluginEdit(self, self.host, pluginId)
else: else:
@@ -275,10 +262,11 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta):
self.fPluginList.append(pitem) self.fPluginList.append(pitem)
self.fPluginCount += 1 self.fPluginCount += 1


if self.fIsOnlyPatchbay and not isProjectLoading:
if self.fIsOnlyPatchbay and not self.fParent.isProjectLoading():
self.host.set_active(pluginId, True) self.host.set_active(pluginId, True)


def removePlugin(self, pluginId):
@pyqtSlot(int)
def slot_handlePluginRemovedCallback(self, pluginId):
patchcanvas.handlePluginRemoved(pluginId) patchcanvas.handlePluginRemoved(pluginId)


if pluginId in self.fSelectedPlugins: if pluginId in self.fSelectedPlugins:
@@ -300,9 +288,10 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta):
# push all plugins 1 slot back # push all plugins 1 slot back
for i in range(pluginId, self.fPluginCount): for i in range(pluginId, self.fPluginCount):
pitem = self.fPluginList[i] pitem = self.fPluginList[i]
pitem.setId(i)
pitem.setPluginId(i)


def renamePlugin(self, pluginId, newName):
@pyqtSlot(int, str)
def slot_handlePluginRenamedCallback(self, pluginId, newName):
if pluginId >= self.fPluginCount: if pluginId >= self.fPluginCount:
return return


@@ -312,7 +301,8 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta):


pitem.setName(newName) pitem.setName(newName)


def disablePlugin(self, pluginId, errorMsg):
@pyqtSlot(int, str)
def slot_handlePluginUnavailableCallback(self, pluginId, errorMsg):
if pluginId >= self.fPluginCount: if pluginId >= self.fPluginCount:
return return


@@ -320,6 +310,8 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta):
if pitem is None: if pitem is None:
return return


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

def removeAllPlugins(self): def removeAllPlugins(self):
for pitem in self.fPluginList: for pitem in self.fPluginList:
if pitem is None: if pitem is None:
@@ -681,198 +673,6 @@ class CarlaPatchbayW(QFrame, PluginEditParentMeta):


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


@pyqtSlot(int, str)
def slot_handlePluginAddedCallback(self, pluginId, pluginName):
self.addPlugin(pluginId, self.fParent.isProjectLoading())

@pyqtSlot(int)
def slot_handlePluginRemovedCallback(self, pluginId):
self.removePlugin(pluginId)

@pyqtSlot(int, str)
def slot_handlePluginRenamedCallback(self, pluginId, newName):
self.renamePlugin(pluginId, newName)

@pyqtSlot(int, str)
def slot_handlePluginUnavailableCallback(self, pluginId, errorMsg):
self.disablePlugin(pluginId, errorMsg)

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

@pyqtSlot(int, int, float)
def slot_handleParameterValueChangedCallback(self, pluginId, index, value):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.setParameterValue(index, value)

@pyqtSlot(int, int, float)
def slot_handleParameterDefaultChangedCallback(self, pluginId, index, value):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.setParameterDefault(index, value)

@pyqtSlot(int, int, int)
def slot_handleParameterMidiCcChangedCallback(self, pluginId, index, cc):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.setParameterMidiControl(index, cc)

@pyqtSlot(int, int, int)
def slot_handleParameterMidiChannelChangedCallback(self, pluginId, index, channel):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.setParameterMidiChannel(index, channel)

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

@pyqtSlot(int, int)
def slot_handleProgramChangedCallback(self, pluginId, index):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.setProgram(index)

@pyqtSlot(int, int)
def slot_handleMidiProgramChangedCallback(self, pluginId, index):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.setMidiProgram(index)

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

@pyqtSlot(int, int, bool)
def slot_handleOptionChangedCallback(self, pluginId, option, yesNo):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.setOption(option, yesNo)

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

@pyqtSlot(int, int, int, int)
def slot_handleNoteOnCallback(self, pluginId, channel, note, velo):
if pluginId in self.fSelectedPlugins:
self.fKeys.keyboard.sendNoteOn(note, False)

if not self.fIsOnlyPatchbay:
return
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.sendNoteOn(channel, note)

@pyqtSlot(int, int, int)
def slot_handleNoteOffCallback(self, pluginId, channel, note):
if pluginId in self.fSelectedPlugins:
self.fKeys.keyboard.sendNoteOff(note, False)

if not self.fIsOnlyPatchbay:
return
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.sendNoteOff(channel, note)

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

@pyqtSlot(int)
def slot_handleUpdateCallback(self, pluginId):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.updateInfo()

@pyqtSlot(int)
def slot_handleReloadInfoCallback(self, pluginId):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.reloadInfo()

@pyqtSlot(int)
def slot_handleReloadParametersCallback(self, pluginId):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.reloadParameters()

@pyqtSlot(int)
def slot_handleReloadProgramsCallback(self, pluginId):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.reloadPrograms()

@pyqtSlot(int)
def slot_handleReloadAllCallback(self, pluginId):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.reloadAll()

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

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


+ 120
- 273
source/carla_rack.py View File

@@ -43,35 +43,58 @@ from carla_skin import *
class CarlaRackItem(QListWidgetItem): class CarlaRackItem(QListWidgetItem):
kRackItemType = QListWidgetItem.UserType + 1 kRackItemType = QListWidgetItem.UserType + 1


def __init__(self, parent, pluginId):
def __init__(self, parent, pluginId, useSkins):
QListWidgetItem.__init__(self, parent, self.kRackItemType) QListWidgetItem.__init__(self, parent, self.kRackItemType)


self.fParent = parent
# ----------------------------------------------------------------------------------------------------
# Internal stuff

self.fParent = parent
self.fPluginId = pluginId
self.fUseSkins = useSkins
self.fWidget = None


self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled) self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled)
#self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled|Qt.ItemIsDragEnabled|Qt.ItemIsDropEnabled) #self.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled|Qt.ItemIsDragEnabled|Qt.ItemIsDropEnabled)


self.createWidget(pluginId)
# ----------------------------------------------------------------------------------------------------
# Set-up GUI


# -----------------------------------------------------------------
self.recreateWidget()


def createWidget(self, pluginId):
self.widget = createPluginSlot(self.fParent, self.fParent.host, pluginId, True) # FIXME useSkins opt
self.widget.setFixedHeight(self.widget.getFixedHeight())
if False:
self.fWidget = AbstractPluginSlot(parent, parent.host, pluginId)


self.setSizeHint(QSize(640, self.widget.getFixedHeight()))
# --------------------------------------------------------------------------------------------------------


self.fParent.setItemWidget(self, self.widget)
def setPluginId(self, pluginId):
self.fPluginId = pluginId
self.fWidget.setPluginId(pluginId)


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

def getEditDialog(self):
return self.fWidget.fEditDialog

def closeEditDialog(self):
self.fWidget.fEditDialog.close()


def close(self):
self.widget.fEditDialog.close()
# --------------------------------------------------------------------------------------------------------


def reloadAll(self, pluginId):
self.widget.fEditDialog.close()
del self.widget
self.createWidget(pluginId)
def getWidget(self):
return self.fWidget

def recreateWidget(self):
if self.fWidget is not None:
#self.fWidget.fEditDialog.close()
del self.fWidget

self.fWidget = createPluginSlot(self.fParent, self.fParent.host, self.fPluginId, self.fUseSkins)
self.fWidget.setFixedHeight(self.fWidget.getFixedHeight())

self.setSizeHint(QSize(640, self.fWidget.getFixedHeight()))

self.fParent.setItemWidget(self, self.fWidget)


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# Rack widget list # Rack widget list
@@ -311,83 +334,64 @@ class CarlaRackW(QFrame):
host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback) host.PluginRemovedCallback.connect(self.slot_handlePluginRemovedCallback)
host.PluginRenamedCallback.connect(self.slot_handlePluginRenamedCallback) host.PluginRenamedCallback.connect(self.slot_handlePluginRenamedCallback)
host.PluginUnavailableCallback.connect(self.slot_handlePluginUnavailableCallback) host.PluginUnavailableCallback.connect(self.slot_handlePluginUnavailableCallback)
host.ParameterValueChangedCallback.connect(self.slot_handleParameterValueChangedCallback)
host.ParameterDefaultChangedCallback.connect(self.slot_handleParameterDefaultChangedCallback)
host.ParameterMidiChannelChangedCallback.connect(self.slot_handleParameterMidiChannelChangedCallback)
host.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback)
host.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback)
host.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback)
host.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback)
host.UiStateChangedCallback.connect(self.slot_handleUiStateChangedCallback)
host.NoteOnCallback.connect(self.slot_handleNoteOnCallback)
host.NoteOffCallback.connect(self.slot_handleNoteOffCallback)
host.UpdateCallback.connect(self.slot_handleUpdateCallback)
host.ReloadInfoCallback.connect(self.slot_handleReloadInfoCallback)
host.ReloadParametersCallback.connect(self.slot_handleReloadParametersCallback)
host.ReloadProgramsCallback.connect(self.slot_handleReloadProgramsCallback)
host.ReloadAllCallback.connect(self.slot_handleReloadAllCallback) host.ReloadAllCallback.connect(self.slot_handleReloadAllCallback)


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


def addPlugin(self, pluginId, isProjectLoading):
pitem = CarlaRackItem(self.fRack, pluginId)
@pyqtSlot(int, str)
def slot_handlePluginAddedCallback(self, pluginId, pluginName):
pitem = CarlaRackItem(self.fRack, pluginId, self.fParent.getSavedSettings()[CARLA_KEY_MAIN_USE_CUSTOM_SKINS])


self.fPluginList.append(pitem) self.fPluginList.append(pitem)
self.fPluginCount += 1 self.fPluginCount += 1


if not isProjectLoading:
pitem.widget.setActive(True, True, True)
if not self.fParent.isProjectLoading():
pitem.getWidget().setActive(True, True, True)


def removePlugin(self, pluginId):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return
@pyqtSlot(int)
def slot_handlePluginRemovedCallback(self, pluginId):
pitem = self.getPluginItem(pluginId)


self.fPluginCount -= 1 self.fPluginCount -= 1
self.fPluginList.pop(pluginId) self.fPluginList.pop(pluginId)

self.fRack.takeItem(pluginId) self.fRack.takeItem(pluginId)


pitem.close()
del pitem
if pitem is not None:
pitem.closeEditDialog()
del pitem


# push all plugins 1 slot back # push all plugins 1 slot back
for i in range(pluginId, self.fPluginCount): for i in range(pluginId, self.fPluginCount):
pitem = self.fPluginList[i] pitem = self.fPluginList[i]
pitem.widget.setId(i)
pitem.setPluginId(i)


def renamePlugin(self, pluginId, newName):
if pluginId >= self.fPluginCount:
return
@pyqtSlot(int, str)
def slot_handlePluginRenamedCallback(self, pluginId, newName):
widget = self.getPluginSlotWidget(pluginId)


pitem = self.fPluginList[pluginId]
if pitem is None:
if widget is None:
return return


pitem.widget.setName(newName)
widget.setName(newName)


def disablePlugin(self, pluginId, errorMsg):
if pluginId >= self.fPluginCount:
return
@pyqtSlot(int, str)
def slot_handlePluginUnavailableCallback(self, pluginId, errorMsg):
widget = self.getPluginSlotWidget(pluginId)


pitem = self.fPluginList[pluginId]
if pitem is None:
if widget is None:
return return


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

def removeAllPlugins(self): def removeAllPlugins(self):
while self.fRack.takeItem(0): while self.fRack.takeItem(0):
pass pass


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]

for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.close()
pitem.closeEditDialog()
del pitem del pitem


self.fPluginCount = 0 self.fPluginCount = 0
@@ -404,22 +408,18 @@ class CarlaRackW(QFrame):
# ----------------------------------------------------------------- # -----------------------------------------------------------------


def idleFast(self): def idleFast(self):
for i in range(self.fPluginCount):
pitem = self.fPluginList[i]

for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.idleFast()
pitem.getWidget().idleFast()


def idleSlow(self): def idleSlow(self):
for i in range(self.fPluginCount):
pitem = self.fPluginList[i]

for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.idleSlow()
pitem.getWidget().idleSlow()


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


@@ -435,14 +435,12 @@ class CarlaRackW(QFrame):
pass pass


def showEditDialog(self, pluginId): def showEditDialog(self, pluginId):
if pluginId >= self.fPluginCount:
return
dialog = self.getPluginEditDialog(pluginId)


pitem = self.fPluginList[pluginId]
if pitem is None:
if dialog is None:
return return


pitem.widget.slot_showEditDialog(True)
dialog.show()


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


@@ -451,86 +449,79 @@ class CarlaRackW(QFrame):
if not self.host.is_engine_running(): if not self.host.is_engine_running():
return return


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]
for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.setActive(True, True, True)
pitem.getWidget().setActive(True, True, True)


@pyqtSlot() @pyqtSlot()
def slot_pluginsDisable(self): def slot_pluginsDisable(self):
if not self.host.is_engine_running(): if not self.host.is_engine_running():
return return


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]
for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.setActive(False, True, True)
pitem.getWidget().setActive(False, True, True)


@pyqtSlot() @pyqtSlot()
def slot_pluginsVolume100(self): def slot_pluginsVolume100(self):
if not self.host.is_engine_running(): if not self.host.is_engine_running():
return return


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]
for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.setInternalParameter(PLUGIN_CAN_VOLUME, 1.0)
pitem.getWidget().setInternalParameter(PLUGIN_CAN_VOLUME, 1.0)


@pyqtSlot() @pyqtSlot()
def slot_pluginsMute(self): def slot_pluginsMute(self):
if not self.host.is_engine_running(): if not self.host.is_engine_running():
return return


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]
for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.setInternalParameter(PLUGIN_CAN_VOLUME, 0.0)
pitem.getWidget().setInternalParameter(PLUGIN_CAN_VOLUME, 0.0)


@pyqtSlot() @pyqtSlot()
def slot_pluginsWet100(self): def slot_pluginsWet100(self):
if not self.host.is_engine_running(): if not self.host.is_engine_running():
return return


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]
for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.setInternalParameter(PLUGIN_CAN_DRYWET, 1.0)
pitem.getWidget().setInternalParameter(PLUGIN_CAN_DRYWET, 1.0)


@pyqtSlot() @pyqtSlot()
def slot_pluginsBypass(self): def slot_pluginsBypass(self):
if not self.host.is_engine_running(): if not self.host.is_engine_running():
return return


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]
for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.setInternalParameter(PLUGIN_CAN_DRYWET, 0.0)
pitem.getWidget().setInternalParameter(PLUGIN_CAN_DRYWET, 0.0)


@pyqtSlot() @pyqtSlot()
def slot_pluginsCenter(self): def slot_pluginsCenter(self):
if not self.host.is_engine_running(): if not self.host.is_engine_running():
return return


for i in range(self.fPluginCount):
pitem = self.fPluginList[i]
for pitem in self.fPluginList:
if pitem is None: if pitem is None:
break break


pitem.widget.setInternalParameter(PARAMETER_BALANCE_LEFT, -1.0)
pitem.widget.setInternalParameter(PARAMETER_BALANCE_RIGHT, 1.0)
pitem.widget.setInternalParameter(PARAMETER_PANNING, 0.0)
pitem.getWidget().setInternalParameter(PARAMETER_BALANCE_LEFT, -1.0)
pitem.getWidget().setInternalParameter(PARAMETER_BALANCE_RIGHT, 1.0)
pitem.getWidget().setInternalParameter(PARAMETER_PANNING, 0.0)


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


@@ -543,122 +534,8 @@ class CarlaRackW(QFrame):


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


@pyqtSlot(int, str)
def slot_handlePluginAddedCallback(self, pluginId, pluginName):
self.addPlugin(pluginId, self.fParent.isProjectLoading())

@pyqtSlot(int) @pyqtSlot(int)
def slot_handlePluginRemovedCallback(self, pluginId):
self.removePlugin(pluginId)

@pyqtSlot(int, str)
def slot_handlePluginRenamedCallback(self, pluginId, newName):
self.renamePlugin(pluginId, newName)

@pyqtSlot(int, str)
def slot_handlePluginUnavailableCallback(self, pluginId, errorMsg):
self.disablePlugin(pluginId, errorMsg)

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

@pyqtSlot(int, int, float)
def slot_handleParameterValueChangedCallback(self, pluginId, index, value):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.setParameterValue(index, value, True)

@pyqtSlot(int, int, float)
def slot_handleParameterDefaultChangedCallback(self, pluginId, index, value):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.setParameterDefault(index, value)

@pyqtSlot(int, int, int)
def slot_handleParameterMidiCcChangedCallback(self, pluginId, index, cc):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.setParameterMidiControl(index, cc)

@pyqtSlot(int, int, int)
def slot_handleParameterMidiChannelChangedCallback(self, pluginId, index, channel):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.setParameterMidiChannel(index, channel)

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

@pyqtSlot(int, int)
def slot_handleProgramChangedCallback(self, pluginId, index):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.setProgram(index, True)

@pyqtSlot(int, int)
def slot_handleMidiProgramChangedCallback(self, pluginId, index):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.setMidiProgram(index, True)

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

@pyqtSlot(int, int, bool)
def slot_handleOptionChangedCallback(self, pluginId, option, yesNo):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.setOption(option, yesNo)

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

@pyqtSlot(int, int)
def slot_handleUiStateChangedCallback(self, pluginId, state):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return

pitem.widget.customUiStateChanged(state)

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

@pyqtSlot(int, int, int, int)
def slot_handleNoteOnCallback(self, pluginId, channel, note, velo):
def slot_handleReloadAllCallback(self, pluginId):
if pluginId >= self.fPluginCount: if pluginId >= self.fPluginCount:
return return


@@ -666,95 +543,65 @@ class CarlaRackW(QFrame):
if pitem is None: if pitem is None:
return return


pitem.widget.sendNoteOn(channel, note)

@pyqtSlot(int, int, int)
def slot_handleNoteOffCallback(self, pluginId, channel, note):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return
self.fRack.setCurrentRow(-1)
self.fCurrentRow = -1
self.fLastSelectedItem = None


pitem.widget.sendNoteOff(channel, note)
pitem.recreateWidget()


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


@pyqtSlot(int) @pyqtSlot(int)
def slot_handleUpdateCallback(self, pluginId):
if pluginId >= self.fPluginCount:
return

pitem = self.fPluginList[pluginId]
if pitem is None:
return
def slot_currentRowChanged(self, row):
self.fCurrentRow = row


pitem.widget.fEditDialog.updateInfo()
if self.fLastSelectedItem is not None:
self.fLastSelectedItem.setSelected(False)


@pyqtSlot(int)
def slot_handleReloadInfoCallback(self, pluginId):
if pluginId >= self.fPluginCount:
if row < 0 or row >= self.fPluginCount or self.fPluginList[row] is None:
self.fLastSelectedItem = None
return return


pitem = self.fPluginList[pluginId]
if pitem is None:
return
pitem = self.fPluginList[row]
pitem.getWidget().setSelected(True)
self.fLastSelectedItem = pitem.getWidget()


pitem.widget.fEditDialog.reloadInfo()
# -----------------------------------------------------------------


@pyqtSlot(int)
def slot_handleReloadParametersCallback(self, pluginId):
def getPluginItem(self, pluginId):
if pluginId >= self.fPluginCount: if pluginId >= self.fPluginCount:
return
return None


pitem = self.fPluginList[pluginId] pitem = self.fPluginList[pluginId]
if pitem is None: if pitem is None:
return
return None
if False:
pitem = CarlaRackItem(self, 0, False)


pitem.widget.fEditDialog.reloadParameters()
return pitem


@pyqtSlot(int)
def slot_handleReloadProgramsCallback(self, pluginId):
def getPluginEditDialog(self, pluginId):
if pluginId >= self.fPluginCount: if pluginId >= self.fPluginCount:
return
return None


pitem = self.fPluginList[pluginId] pitem = self.fPluginList[pluginId]
if pitem is None: if pitem is None:
return
return None
if False:
pitem = CarlaRackItem(self, 0, False)


pitem.widget.fEditDialog.reloadPrograms()
return pitem.getEditDialog()


@pyqtSlot(int)
def slot_handleReloadAllCallback(self, pluginId):
def getPluginSlotWidget(self, pluginId):
if pluginId >= self.fPluginCount: if pluginId >= self.fPluginCount:
return
return None


pitem = self.fPluginList[pluginId] pitem = self.fPluginList[pluginId]
if pitem is None: if pitem is None:
return

self.fRack.setCurrentRow(-1)
self.fCurrentRow = -1
self.fLastSelectedItem = None

pitem.reloadAll(pluginId)

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

@pyqtSlot(int)
def slot_currentRowChanged(self, row):
self.fCurrentRow = row

if self.fLastSelectedItem is not None:
self.fLastSelectedItem.setSelected(False)

if row < 0 or row >= self.fPluginCount or self.fPluginList[row] is None:
self.fLastSelectedItem = None
return
return None
if False:
pitem = CarlaRackItem(self, 0, False)


pitem = self.fPluginList[row]
pitem.widget.setSelected(True)
self.fLastSelectedItem = pitem.widget
return pitem.getWidget()


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

+ 2
- 5
source/carla_settings.py View File

@@ -207,7 +207,7 @@ class CarlaSettingsW(QDialog):


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


def __init__(self, parent, host, hasCanvas, hasCanvasGL, hasEngine):
def __init__(self, parent, host, hasCanvas, hasCanvasGL):
QDialog.__init__(self, parent) QDialog.__init__(self, parent)
self.host = host self.host = host
self.ui = ui_carla_settings.Ui_CarlaSettingsW() self.ui = ui_carla_settings.Ui_CarlaSettingsW()
@@ -244,9 +244,6 @@ class CarlaSettingsW(QDialog):
self.ui.cb_canvas_use_opengl.setEnabled(False) self.ui.cb_canvas_use_opengl.setEnabled(False)
self.ui.cb_canvas_render_hq_aa.setEnabled(False) self.ui.cb_canvas_render_hq_aa.setEnabled(False)


if not hasEngine:
self.ui.lw_page.hideRow(self.TAB_INDEX_ENGINE)

if host.isPlugin: if host.isPlugin:
self.ui.cb_engine_audio_driver.setEnabled(False) self.ui.cb_engine_audio_driver.setEnabled(False)


@@ -685,7 +682,7 @@ class CarlaSettingsW(QDialog):
@pyqtSlot() @pyqtSlot()
def slot_getAndSetProjectPath(self): def slot_getAndSetProjectPath(self):
# FIXME # FIXME
getAndSetPath(self, self.ui.le_main_proj_folder.text(), self.ui.le_main_proj_folder)
getAndSetPath(self, self.ui.le_main_proj_folder)


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




+ 4
- 10
source/carla_shared.py View File

@@ -29,12 +29,12 @@ import sys


if config_UseQt5: if config_UseQt5:
from PyQt5.Qt import PYQT_VERSION_STR from PyQt5.Qt import PYQT_VERSION_STR
from PyQt5.QtCore import pyqtWrapperType, qFatal, qVersion, qWarning, QDir
from PyQt5.QtCore import qFatal, qVersion, qWarning, QDir
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QFileDialog, QMessageBox from PyQt5.QtWidgets import QFileDialog, QMessageBox
else: else:
from PyQt4.Qt import PYQT_VERSION_STR from PyQt4.Qt import PYQT_VERSION_STR
from PyQt4.QtCore import pyqtWrapperType, qFatal, qVersion, qWarning, QDir
from PyQt4.QtCore import qFatal, qVersion, qWarning, QDir
from PyQt4.QtGui import QFileDialog, QIcon, QMessageBox from PyQt4.QtGui import QFileDialog, QIcon, QMessageBox


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
@@ -554,8 +554,8 @@ def setUpSignals():
# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# QLineEdit and QPushButton combo # QLineEdit and QPushButton combo


def getAndSetPath(parent, currentPath, lineEdit):
newPath = QFileDialog.getExistingDirectory(parent, parent.tr("Set Path"), currentPath, QFileDialog.ShowDirsOnly)
def getAndSetPath(parent, lineEdit):
newPath = QFileDialog.getExistingDirectory(parent, parent.tr("Set Path"), lineEdit.text(), QFileDialog.ShowDirsOnly)
if newPath: if newPath:
lineEdit.setText(newPath) lineEdit.setText(newPath)
return newPath return newPath
@@ -574,9 +574,3 @@ def CustomMessageBox(parent, icon, title, text, extraText="", buttons=QMessageBo
return msgBox.exec_() return msgBox.exec_()


# ------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------
# An empty class used to resolve metaclass conflicts between ABC and PyQt modules

class PyQtMetaClass(pyqtWrapperType, ABCMeta):
pass

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

+ 75
- 4
source/carla_skin.py View File

@@ -91,6 +91,11 @@ class AbstractPluginSlot(QFrame, PluginEditParentMeta):
QFrame.__init__(self, parent) QFrame.__init__(self, parent)
self.host = host self.host = host


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

# ------------------------------------------------------------- # -------------------------------------------------------------
# Get plugin info # Get plugin info


@@ -153,6 +158,72 @@ class AbstractPluginSlot(QFrame, PluginEditParentMeta):
self.peak_in = None self.peak_in = None
self.peak_out = None self.peak_out = None


# -------------------------------------------------------------
# Set-up connections

host.ParameterValueChangedCallback.connect(self.slot_handleParameterValueChangedCallback)
host.ParameterDefaultChangedCallback.connect(self.slot_handleParameterDefaultChangedCallback)
host.ParameterMidiChannelChangedCallback.connect(self.slot_handleParameterMidiChannelChangedCallback)
host.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback)
host.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback)
host.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback)
host.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback)
host.UiStateChangedCallback.connect(self.slot_handleUiStateChangedCallback)
host.NoteOnCallback.connect(self.slot_handleNoteOnCallback)
host.NoteOffCallback.connect(self.slot_handleNoteOffCallback)

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

@pyqtSlot(int, int, float)
def slot_handleParameterValueChangedCallback(self, pluginId, index, value):
if self.fPluginId == pluginId:
self.setParameterValue(index, value, True)

@pyqtSlot(int, int, float)
def slot_handleParameterDefaultChangedCallback(self, pluginId, index, value):
if self.fPluginId == pluginId:
self.setParameterDefault(index, value)

@pyqtSlot(int, int, int)
def slot_handleParameterMidiCcChangedCallback(self, pluginId, index, cc):
if self.fPluginId == pluginId:
self.setParameterMidiControl(index, cc)

@pyqtSlot(int, int, int)
def slot_handleParameterMidiChannelChangedCallback(self, pluginId, index, channel):
if self.fPluginId == pluginId:
self.setParameterMidiChannel(index, channel)

@pyqtSlot(int, int)
def slot_handleProgramChangedCallback(self, pluginId, index):
if self.fPluginId == pluginId:
self.setProgram(index, True)

@pyqtSlot(int, int)
def slot_handleMidiProgramChangedCallback(self, pluginId, index):
if self.fPluginId == pluginId:
self.setMidiProgram(index, True)

@pyqtSlot(int, int, bool)
def slot_handleOptionChangedCallback(self, pluginId, option, yesNo):
if self.fPluginId == pluginId:
self.setOption(option, yesNo)

@pyqtSlot(int, int)
def slot_handleUiStateChangedCallback(self, pluginId, state):
if self.fPluginId == pluginId:
self.customUiStateChanged(state)

@pyqtSlot(int, int, int, int)
def slot_handleNoteOnCallback(self, pluginId, channel, note, velo):
if self.fPluginId == pluginId:
self.sendNoteOn(channel, note)

@pyqtSlot(int, int, int)
def slot_handleNoteOffCallback(self, pluginId, channel, note):
if self.fPluginId == pluginId:
self.sendNoteOff(channel, note)

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


def ready(self): def ready(self):
@@ -226,9 +297,9 @@ class AbstractPluginSlot(QFrame, PluginEditParentMeta):


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


def setId(self, idx):
def setPluginId(self, idx):
self.fPluginId = idx self.fPluginId = idx
self.fEditDialog.setId(idx)
self.fEditDialog.setPluginId(idx)


def setName(self, name): def setName(self, name):
self.fEditDialog.setName(name) self.fEditDialog.setName(name)
@@ -1560,8 +1631,8 @@ class PluginSlot_ZynFX(AbstractPluginSlot):


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


def createPluginSlot(parent, host, pluginId, useCustomSkins):
if not useCustomSkins:
def createPluginSlot(parent, host, pluginId, useSkins):
if not useSkins:
return PluginSlot_Default(parent, host, pluginId) return PluginSlot_Default(parent, host, pluginId)


pluginInfo = host.get_plugin_info(pluginId) pluginInfo = host.get_plugin_info(pluginId)


+ 34
- 1
source/carla_widgets.py View File

@@ -574,6 +574,39 @@ class PluginEdit(QDialog):
self.ui.b_save_state.clicked.connect(self.slot_stateSave) self.ui.b_save_state.clicked.connect(self.slot_stateSave)
self.ui.b_load_state.clicked.connect(self.slot_stateLoad) self.ui.b_load_state.clicked.connect(self.slot_stateLoad)


host.UpdateCallback.connect(self.slot_handleUpdateCallback)
host.ReloadInfoCallback.connect(self.slot_handleReloadInfoCallback)
host.ReloadParametersCallback.connect(self.slot_handleReloadParametersCallback)
host.ReloadProgramsCallback.connect(self.slot_handleReloadProgramsCallback)
host.ReloadAllCallback.connect(self.slot_handleReloadAllCallback)

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

@pyqtSlot(int)
def slot_handleUpdateCallback(self, pluginId):
if self.fPluginId == pluginId:
self.updateInfo()

@pyqtSlot(int)
def slot_handleReloadInfoCallback(self, pluginId):
if self.fPluginId == pluginId:
self.reloadInfo()

@pyqtSlot(int)
def slot_handleReloadParametersCallback(self, pluginId):
if self.fPluginId == pluginId:
self.reloadParameters()

@pyqtSlot(int)
def slot_handleReloadProgramsCallback(self, pluginId):
if self.fPluginId == pluginId:
self.reloadPrograms()

@pyqtSlot(int)
def slot_handleReloadAllCallback(self, pluginId):
if self.fPluginId == pluginId:
self.reloadAll()

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


def updateInfo(self): def updateInfo(self):
@@ -913,7 +946,7 @@ class PluginEdit(QDialog):
def getHints(self): def getHints(self):
return self.fPluginInfo['hints'] return self.fPluginInfo['hints']


def setId(self, idx):
def setPluginId(self, idx):
self.fPluginId = idx self.fPluginId = idx


def setName(self, name): def setName(self, name):


Loading…
Cancel
Save