From 21b5478200443b73d8e540c98be795b7422cec46 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sun, 5 Jul 2020 22:32:41 +0000 Subject: [PATCH 01/21] Updated work on Carla parameters to latest LMMS master branch. --- plugins/carlabase/carla.cpp | 615 +++++++++++++++++++++++++++++++++++- plugins/carlabase/carla.h | 200 +++++++++++- 2 files changed, 804 insertions(+), 11 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 728a6d804af..0c16bd02b47 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -22,22 +22,42 @@ * */ + /* TODO + * - Carla inline param ui doesn't update. + * - Flow layout for knobs. + * - Search other TODO + */ + #include "carla.h" #include "Engine.h" #include "Song.h" -#include "gui_templates.h" +#include "GuiApplication.h" #include "InstrumentPlayHandle.h" #include "InstrumentTrack.h" #include "MidiEventToByteSeq.h" +#include "MainWindow.h" #include "Mixer.h" +#include "Song.h" +#include "gui_templates.h" #include +#include #include #include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include #include +#include #include @@ -135,7 +155,9 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D kIsPatchbay(isPatchbay), fHandle(NULL), fDescriptor(isPatchbay ? carla_get_native_patchbay_plugin() : carla_get_native_rack_plugin()), - fMidiEventCount(0) + fMidiEventCount(0), + m_paramModels(), + m_subWindow(NULL) { fHost.handle = this; fHost.uiName = NULL; @@ -177,6 +199,24 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D InstrumentPlayHandle * iph = new InstrumentPlayHandle( this, instrumentTrack ); Engine::mixer()->addPlayHandle( iph ); +#if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION + // text filter completion + m_completerModel = new QStringListModel(this); + m_paramsCompleter = new QCompleter(m_completerModel, this); + m_paramsCompleter->setCaseSensitivity(Qt::CaseInsensitive); + m_paramsCompleter->setCompletionMode(QCompleter::PopupCompletion); + + // Add static amount of CarlaParamFloatModel's. + int paramCount = fDescriptor->get_parameter_count(fHandle); + m_paramModels.reserve(paramCount+1); + for (int i=0; i < paramCount; ++i) + { + m_paramModels.push_back(new CarlaParamFloatModel(this)); + connect(m_paramModels[i], &CarlaParamFloatModel::dataChanged, + this, [=]() {knobModelChanged(i);}, Qt::DirectConnection); + } +#endif + connect(Engine::mixer(), SIGNAL(sampleRateChanged()), this, SLOT(sampleRateChanged())); } @@ -206,6 +246,17 @@ CarlaInstrument::~CarlaInstrument() fDescriptor->cleanup(fHandle); fHandle = NULL; + +#if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION + if (p_subWindow != NULL) { + delete p_subWindow; + p_subWindow = NULL; + } + + if (!m_paramModels.isEmpty()) { + m_paramModels.clear(); + } +#endif } // ------------------------------------------------------------------- @@ -230,8 +281,12 @@ const NativeTimeInfo* CarlaInstrument::handleGetTimeInfo() const return &fTimeInfo; } -void CarlaInstrument::handleUiParameterChanged(const uint32_t /*index*/, const float /*value*/) const +void CarlaInstrument::handleUiParameterChanged(const uint32_t index, const float value) const { + if (m_paramModels.count() > index) + { + m_paramModels[index]->setValue(value); + } } void CarlaInstrument::handleUiClosed() @@ -239,10 +294,23 @@ void CarlaInstrument::handleUiClosed() emit uiClosed(); } -intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t, const intptr_t, void* const, const float) +intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t index, const intptr_t value, void* const ptr, const float opt) { intptr_t ret = 0; + // source/includes/CarlaNative.h + // NATIVE_HOST_OPCODE_NULL = 0, nothing + // NATIVE_HOST_OPCODE_UPDATE_PARAMETER = 1, uses index, -1 for all + // NATIVE_HOST_OPCODE_UPDATE_MIDI_PROGRAM = 2, uses index, -1 for all; may use value for channel + // NATIVE_HOST_OPCODE_RELOAD_PARAMETERS = 3, nothing + // NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS = 4, nothing + // NATIVE_HOST_OPCODE_RELOAD_ALL = 5, nothing + // NATIVE_HOST_OPCODE_UI_UNAVAILABLE = 6, nothing + // NATIVE_HOST_OPCODE_HOST_IDLE = 7, nothing + // NATIVE_HOST_OPCODE_INTERNAL_PLUGIN = 8, nothing + // NATIVE_HOST_OPCODE_QUEUE_INLINE_DISPLAY = 9, nothing + // NATIVE_HOST_OPCODE_UI_TOUCH_PARAMETER = 10 uses index, value as bool + switch (opcode) { case NATIVE_HOST_OPCODE_UI_UNAVAILABLE: @@ -251,6 +319,31 @@ intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opco case NATIVE_HOST_OPCODE_HOST_IDLE: qApp->processEvents(); break; +#if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION + case NATIVE_HOST_OPCODE_UI_TOUCH_PARAMETER: + // param index, value as bool + // true = mousePress + // false = mouseRelease + if (!value) { + updateKnobModel(index); + } + break; + case NATIVE_HOST_OPCODE_RELOAD_ALL: + refreshParams(); + break; + case NATIVE_HOST_OPCODE_UPDATE_PARAMETER: + qDebug() << "CarlaInstrument::handleDispatcher NATIVE_HOST_OPCODE_UPDATE_PARAMETER"; + break; + case NATIVE_HOST_OPCODE_RELOAD_PARAMETERS: + qDebug() << "CarlaInstrument::handleDispatcher NATIVE_HOST_OPCODE_RELOAD_PARAMETERS"; + refreshParams(); + break; + case NATIVE_HOST_OPCODE_UPDATE_MIDI_PROGRAM: + case NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS: + case NATIVE_HOST_OPCODE_INTERNAL_PLUGIN: + case NATIVE_HOST_OPCODE_QUEUE_INLINE_DISPLAY: + break; +#endif default: break; } @@ -289,6 +382,98 @@ void CarlaInstrument::saveSettings(QDomDocument& doc, QDomElement& parent) } std::free(state); + +#if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION + for (uint32_t index = 0; index < m_paramModels.count(); ++index) + { + QString idStr = CARLA_SETTING_PREFIX + QString::number(index); + m_paramModels[index]->saveSettings(doc, parent, idStr); + } +#endif +} + +void CarlaInstrument::refreshParams(bool init) +{ + if (fDescriptor->get_parameter_count != nullptr && + fDescriptor->get_parameter_info != nullptr && + fDescriptor->get_parameter_value != nullptr && + fDescriptor->set_parameter_value != nullptr) + { + uint32_t param_count = fDescriptor->get_parameter_count(fHandle); + + QList completerData; + + for (uint32_t i=0; i < param_count; ++i) + { + const NativeParameter* paramInfo(fDescriptor->get_parameter_info(fHandle, i)); + + m_paramModels[i]->setOutput((paramInfo->hints & NATIVE_PARAMETER_IS_OUTPUT)); + m_paramModels[i]->setEnabled((paramInfo->hints & NATIVE_PARAMETER_IS_ENABLED)); + + // https://github.com/falkTX/Carla/tree/master/source/native-plugins source/native-plugins/resources/carla-plugin + float param_value = fDescriptor->get_parameter_value(fHandle, i); + + m_paramModels[i]->setValue(param_value); + + + // Get parameter name + QString name = "_NO_NAME_"; + if (paramInfo->name != nullptr){ + name = paramInfo->name; + } + + if (paramInfo->groupName != nullptr){ + // TODO this is unused for now. + m_paramModels[i]->setGroupName(paramInfo->groupName); + } + + completerData.push_back(name); + + m_paramModels[i]->setDisplayName(name); + m_paramModels[i]->setRange(paramInfo->ranges.min, + paramInfo->ranges.max, + paramInfo->ranges.step); + + // Load settings into model. + if (init) + { + QString idStr = CARLA_SETTING_PREFIX + QString::number(i); + m_paramModels[i]->loadSettings(m_settingsElem, idStr); + } + } + // Set completer data + m_completerModel->setStringList(completerData); + } + emit paramsUpdated(); +} + +void CarlaInstrument::clearKnobModels(){ + //Delete the models, this also disconnects all connections (automation and controller connections) + for (uint32_t index=0; index < m_paramModels.count(); ++index) + { + delete m_paramModels[index]; + } + + //Clear the list + m_paramModels.clear(); +} + +void CarlaInstrument::knobModelChanged(uint32_t index) +{ // Update Carla param (LMMS -> Carla) + // TODO fDescriptor->ui_set_parameter_value + if (fDescriptor->set_parameter_value != nullptr && + !m_paramModels[index]->isOutput()){ + fDescriptor->set_parameter_value(fHandle, index, m_paramModels[index]->value()); + } +} + +void CarlaInstrument::updateKnobModel(uint32_t index) +{ // Called on param changed (Carla -> LMMS) + if (fDescriptor->get_parameter_value != nullptr){ + m_paramModels[index]->setValue( + fDescriptor->get_parameter_value(fHandle, index) + ); + } } void CarlaInstrument::loadSettings(const QDomElement& elem) @@ -300,6 +485,12 @@ void CarlaInstrument::loadSettings(const QDomElement& elem) carlaDoc.appendChild(carlaDoc.importNode(elem.firstChildElement(), true )); fDescriptor->set_state(fHandle, carlaDoc.toString(0).toUtf8().constData()); + +#if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION + // Store to load parameter knobs settings when added. + m_settingsElem = const_cast(elem); + refreshParams(true); +#endif } void CarlaInstrument::play(sampleFrame* workingBuffer) @@ -342,7 +533,14 @@ void CarlaInstrument::play(sampleFrame* workingBuffer) { const QMutexLocker ml(&fMutex); +// TODO FIXME this is just here so it compiles. +// https://github.com/falkTX/Carla/blob/8bceb9ed173a10b29038f8abb4383710c0e497c1/source/includes/CarlaNative.h +// FIXME for v3.0, use const for the input buffer +#if CARLA_VERSION_HEX >= CARLA_VERSION_HEX_3 + fDescriptor->process(fHandle, (const float**)rBuf, rBuf, bufsize, fMidiEvents, fMidiEventCount); +#else fDescriptor->process(fHandle, rBuf, rBuf, bufsize, fMidiEvents, fMidiEventCount); +#endif fMidiEventCount = 0; } @@ -405,7 +603,9 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid : InstrumentViewFixedSize(instrument, parent), fHandle(instrument->fHandle), fDescriptor(instrument->fDescriptor), - fTimerId(fHandle != NULL && fDescriptor->ui_idle != NULL ? startTimer(30) : 0) + fTimerId(fHandle != NULL && fDescriptor->ui_idle != NULL ? startTimer(30) : 0), + m_carlaInstrument(instrument), + p_parent(parent) { setAutoFillBackground(true); @@ -413,10 +613,12 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid pal.setBrush(backgroundRole(), instrument->kIsPatchbay ? PLUGIN_NAME::getIconPixmap("artwork-patchbay") : PLUGIN_NAME::getIconPixmap("artwork-rack")); setPalette(pal); - QVBoxLayout * l = new QVBoxLayout( this ); + QHBoxLayout * l = new QHBoxLayout(this); l->setContentsMargins( 20, 180, 10, 10 ); - l->setSpacing( 10 ); + l->setSpacing(3); + l->setAlignment(Qt::AlignTop); + // Show GUI button m_toggleUIButton = new QPushButton( tr( "Show GUI" ), this ); m_toggleUIButton->setCheckable( true ); m_toggleUIButton->setChecked( false ); @@ -424,9 +626,27 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid m_toggleUIButton->setFont( pointSize<8>( m_toggleUIButton->font() ) ); connect( m_toggleUIButton, SIGNAL( clicked(bool) ), this, SLOT( toggleUI( bool ) ) ); + m_toggleUIButton->setToolTip( + tr("Click here to show or hide the graphical user interface (GUI) of Carla.")); + + // Open params sub window button + m_toggleParamsWindowButton = new QPushButton(tr("Params"), this); + m_toggleParamsWindowButton->setIcon(embed::getIconPixmap("controller")); + m_toggleParamsWindowButton->setCheckable(true); + m_toggleParamsWindowButton->setFont(pointSize<8>(m_toggleParamsWindowButton->font())); +#if CARLA_VERSION_HEX < CARLA_MIN_PARAM_VERSION + m_toggleParamsWindowButton->setEnabled(false); + m_toggleParamsWindowButton->setToolTip(tr("Available from Carla version 2.1 and up.")); +#else + connect(m_toggleParamsWindowButton, SIGNAL(clicked(bool)), this, SLOT(toggleParamsWindow())); +#endif + + // Add widgets to layout l->addWidget( m_toggleUIButton ); - l->addStretch(); + l->addWidget(m_toggleParamsWindowButton); + // Connect signals + connect(m_toggleUIButton, SIGNAL(clicked(bool)), this, SLOT(toggleUI(bool))); connect(instrument, SIGNAL(uiClosed()), this, SLOT(uiClosed())); } @@ -471,5 +691,384 @@ void CarlaInstrumentView::timerEvent(QTimerEvent* event) InstrumentView::timerEvent(event); } +void CarlaInstrumentView::toggleParamsWindow() +{ + if (m_carlaInstrument->m_subWindow == NULL) + { + m_carlaInstrument->p_subWindow = new CarlaParamsView(m_carlaInstrument, p_parent); + connect(m_carlaInstrument->m_subWindow, SIGNAL(uiClosed()), this, SLOT(paramsUiClosed())); + } else { + if (m_carlaInstrument->m_subWindow->isVisible()) { + m_carlaInstrument->m_subWindow->hide(); + } else { + m_carlaInstrument->m_subWindow->show(); + } + } +} + +void CarlaInstrumentView::paramsUiClosed() +{ + m_toggleParamsWindowButton->setChecked(false); +} + // ------------------------------------------------------------------- +CarlaParamsView::CarlaParamsView(CarlaInstrument* const instrument, QWidget* const parent) + : InstrumentView(instrument, parent), + m_carlaInstrument(instrument), + m_maxColumns(6), + m_curColumn(0), + m_curRow(0), + m_curOutColumn(0), + m_curOutRow(0) +{ + QWidget* centralWidget = new QWidget(this); + QVBoxLayout* verticalLayout = new QVBoxLayout(centralWidget); + + // -- Toolbar + m_toolBarLayout = new QHBoxLayout(); + + // Toolbar widgets + QSizePolicy sizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + + // Params filter line edit + m_paramsFilterLineEdit = new QLineEdit(this); + m_paramsFilterLineEdit->setPlaceholderText(tr("Search..")); + m_paramsFilterLineEdit->setCompleter(m_carlaInstrument->m_paramsCompleter); + + // Clear filter line edit button + m_clearFilterButton = new QPushButton(tr(""), this); + m_clearFilterButton->setIcon(embed::getIconPixmap("edit_erase")); + m_clearFilterButton->setToolTip(tr("Clear filter text")); + sizePolicy.setHeightForWidth(m_clearFilterButton->sizePolicy().hasHeightForWidth()); + m_clearFilterButton->setSizePolicy(sizePolicy); + + // Show automated only button + m_automatedOnlyButton = new QPushButton(tr(""), this); + m_automatedOnlyButton->setIcon(embed::getIconPixmap("automation")); + m_automatedOnlyButton->setToolTip( + tr("Only show knobs with a connection.")); + m_automatedOnlyButton->setCheckable(true); + sizePolicy.setHeightForWidth(m_automatedOnlyButton->sizePolicy().hasHeightForWidth()); + m_automatedOnlyButton->setSizePolicy(sizePolicy); + + // Group name combobox + m_groupFilterCombo = new QComboBox(this); + m_groupFilterModel = new QStringListModel(this); + m_groupFilterCombo->setModel(m_groupFilterModel); + + // Add stuff to toolbar + m_toolBarLayout->addWidget(m_paramsFilterLineEdit); + m_toolBarLayout->addWidget(m_clearFilterButton); + m_toolBarLayout->addWidget(m_automatedOnlyButton); + m_toolBarLayout->addWidget(m_groupFilterCombo); + + + // -- Input params + QFrame * inputFrame = new QFrame(this); + QVBoxLayout* inputLayout = new QVBoxLayout(inputFrame); + QLabel * inputLabel = new QLabel("Input parameters", inputFrame); + + m_inputScrollArea = new QScrollArea(inputFrame); + m_inputScrollAreaWidgetContent = new QWidget(); + m_inputScrollAreaLayout = new QGridLayout(m_inputScrollAreaWidgetContent); + + m_inputScrollAreaWidgetContent->setLayout(m_inputScrollAreaLayout); + m_inputScrollAreaWidgetContent->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + + m_inputScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + m_inputScrollArea->setWidget(m_inputScrollAreaWidgetContent); + m_inputScrollArea->setWidgetResizable(true); + m_inputScrollArea->setFrameShadow(QFrame::Plain); + m_inputScrollArea->setFrameShape(QFrame::NoFrame); + + m_inputScrollAreaLayout->setContentsMargins(3, 3, 3, 3); + m_inputScrollAreaLayout->setVerticalSpacing(12); + m_inputScrollAreaLayout->setHorizontalSpacing(6); + m_inputScrollAreaLayout->setColumnStretch(m_maxColumns, 1); + + inputLayout->addWidget(inputLabel); + inputLayout->addWidget(m_inputScrollArea); + + // -- Output params + QFrame * outputFrame = new QFrame(this); + QVBoxLayout* outputLayout = new QVBoxLayout(outputFrame); + QLabel * outputLabel = new QLabel("Output parameters", outputFrame); + + m_outputScrollArea = new QScrollArea(outputFrame); + m_outputScrollAreaWidgetContent = new QWidget(); + m_outputScrollAreaLayout = new QGridLayout(m_outputScrollAreaWidgetContent); + + m_outputScrollAreaWidgetContent->setLayout(m_outputScrollAreaLayout); + m_outputScrollAreaWidgetContent->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + + m_outputScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + m_outputScrollArea->setWidget(m_outputScrollAreaWidgetContent); + m_outputScrollArea->setWidgetResizable(true); + m_outputScrollArea->setFrameShadow(QFrame::Plain); + m_outputScrollArea->setFrameShape(QFrame::NoFrame); + + m_outputScrollAreaLayout->setContentsMargins(3, 28, 3, 3); + m_outputScrollAreaLayout->setVerticalSpacing(12); + m_outputScrollAreaLayout->setHorizontalSpacing(6); + m_outputScrollAreaLayout->setColumnStretch(m_maxColumns, 1); + + outputLayout->addWidget(outputLabel); + outputLayout->addWidget(m_outputScrollArea); + + // -- QSplitter + QSplitter * splitter = new QSplitter(Qt::Vertical, this); + + // -- Add layout and widgets. + verticalLayout->addLayout(m_toolBarLayout); + splitter->addWidget(inputFrame); + splitter->addWidget(outputFrame); + verticalLayout->addWidget(splitter); + + // -- Sub window + CarlaParamsSubWindow* win = new CarlaParamsSubWindow(gui->mainWindow()->workspace()->viewport(), Qt::SubWindow | + Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); + m_carlaInstrument->m_subWindow = gui->mainWindow()->workspace()->addSubWindow(win); + m_carlaInstrument->m_subWindow->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding); + m_carlaInstrument->m_subWindow->setMinimumHeight(200); + m_carlaInstrument->m_subWindow->resize(600, 400); + m_carlaInstrument->m_subWindow->setWidget(centralWidget); + centralWidget->setWindowTitle(m_carlaInstrument->instrumentTrack()->name() + tr(" - Parameters")); + + // -- Connect signals + connect(m_paramsFilterLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(filterKnobs())); + connect(m_clearFilterButton, SIGNAL(clicked(bool)), this, SLOT(clearFilterText())); + connect(m_automatedOnlyButton, SIGNAL(toggled(bool)), this, SLOT(filterKnobs())); + connect(m_groupFilterCombo, SIGNAL(currentTextChanged(const QString)), this, SLOT(filterKnobs())); + + connect(m_carlaInstrument, SIGNAL(paramsUpdated()), this, SLOT(refreshKnobs())); + + // -- Add spacer so all knobs go to top + QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + m_inputScrollAreaLayout->addItem(verticalSpacer, m_curRow + 1, 0, 1, 1); + + refreshKnobs(); // Add buttons if there are any already. + m_carlaInstrument->m_subWindow->show(); // Show the subwindow +} + +CarlaParamsView::~CarlaParamsView() +{ + // Close and delete m_subWindow + if (m_carlaInstrument->m_subWindow != NULL ) + { + m_carlaInstrument->m_subWindow->setAttribute(Qt::WA_DeleteOnClose); + m_carlaInstrument->m_subWindow->close(); + + if (m_carlaInstrument->m_subWindow != NULL) + delete m_carlaInstrument->m_subWindow; + m_carlaInstrument->m_subWindow = NULL; + } + + m_carlaInstrument->p_subWindow = NULL; + + // Clear models + if (m_carlaInstrument->m_paramModels.isEmpty() == false) + { + m_carlaInstrument->clearKnobModels(); + } +} + +void CarlaParamsView::clearFilterText() +{ + m_paramsFilterLineEdit->setText(""); +} + +void CarlaParamsView::filterKnobs() +{ + QString text = m_paramsFilterLineEdit->text(); + clearKnobs(); // Remove all knobs from the layout. + + for (uint32_t i=0; i < m_knobs.count(); ++i) + { + // Don't show disabled (unused) knobs. + if (!m_carlaInstrument->m_paramModels[i]->enabled()) + { + continue; + } + + // Filter on automation only + if (m_automatedOnlyButton->isChecked()) + { + if (! m_carlaInstrument->m_paramModels[i]->isAutomatedOrControlled()) + { + continue; + } + } + + // Filter on group name + if (m_groupFilterCombo->currentText() != m_carlaInstrument->m_paramModels[i]->groupName()) + { + continue; + } + + // Filter on text + if (text != "") + { + if (m_knobs[i]->objectName().contains(text, Qt::CaseInsensitive)) + { + addKnob(i); + } + } else { + addKnob(i); + } + } +} + +void CarlaParamsView::refreshKnobs() +{ + // Make sure all the knobs are deleted. + for (uint32_t i=0; i < m_knobs.count(); ++i) + { + delete m_knobs[i]; // Delete knob widgets itself. + } + m_knobs.clear(); // Clear the pointer list. + + // Clear the input layout (posible spacer). + QLayoutItem *item; + while ((item = m_inputScrollAreaLayout->takeAt(0))) + { + if (item->widget()) {delete item->widget();} + delete item; + } + + // Clear the output layout (posible spacer). + while ((item = m_outputScrollAreaLayout->takeAt(0))) + { + if (item->widget()) {delete item->widget();} + delete item; + } + + // Reset position data. + m_curColumn = 0; + m_curRow = 0; + + m_curOutColumn = 0; + m_curOutRow = 0; + + + if (!m_carlaInstrument->m_paramModels.count()) { return; } + + // Make room in QList m_knobs + m_knobs.reserve(m_carlaInstrument->m_paramModels.count()); + + QStringList groupNameList; + + for (uint32_t i=0; i < m_carlaInstrument->m_paramModels.count(); ++i) + { + bool enabled = m_carlaInstrument->m_paramModels[i]->enabled(); + m_knobs.push_back(new Knob(knobDark_28, m_inputScrollAreaWidgetContent)); + QString name = (*m_carlaInstrument->m_paramModels[i]).displayName(); + m_knobs[i]->setHintText(name, ""); + m_knobs[i]->setLabel(name); + m_knobs[i]->setObjectName(name); // this is being used for filtering the knobs. + + // Set the newly created model to the knob. + m_knobs[i]->setModel(m_carlaInstrument->m_paramModels[i]); + + m_knobs[i]->setEnabled(enabled); + + if (enabled) + { + // Collect group names + if (!groupNameList.contains(m_carlaInstrument->m_paramModels[i]->groupName())) + { + groupNameList.append(m_carlaInstrument->m_paramModels[i]->groupName()); + } + + // Add knob to layout + addKnob(i); + } + else + { + m_knobs[i]->hide(); + } + } + + // Set new list with group names to the model + if (!groupNameList.count()) + { + groupNameList.append("No params"); + } + m_groupFilterModel->setStringList(groupNameList); + m_groupFilterCombo->setCurrentIndex(0); + + // Add spacer so all knobs go to top + QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + m_inputScrollAreaLayout->addItem(verticalSpacer, m_curRow + 1, 0, 1, 1); + + adjustWindowWidth(); +} + +void CarlaParamsView::adjustWindowWidth() +{ + // Resize window + int newWidth = m_inputScrollAreaWidgetContent->sizeHint().width() + 100; + newWidth = (newWidth >= 200) ? newWidth : 200; + //m_carlaInstrument->m_subWindow->setFixedWidth(newWidth); + //m_carlaInstrument->m_subWindow->setMinimumWidth(newWidth); + //m_carlaInstrument->m_subWindow->setMaximumWidth(newWidth); + m_carlaInstrument->m_subWindow->resize(newWidth, m_carlaInstrument->m_subWindow->height()); +} + +void CarlaParamsView::addKnob(uint32_t index) +{ + bool output = m_carlaInstrument->m_paramModels[index]->isOutput(); + if (output) + { + m_outputScrollAreaLayout->addWidget(m_knobs[index], m_curOutRow, m_curOutColumn, Qt::AlignHCenter | Qt::AlignTop); + m_knobs[index]->setEnabled(false); // We should not be able to adjust output. + m_knobs[index]->show(); + if (m_curOutColumn < m_maxColumns - 1) + { + m_curOutColumn++; + } else { + m_curOutColumn = 0; + m_curOutRow++; + } + } + else + { + // Add the new knob to layout + m_inputScrollAreaLayout->addWidget(m_knobs[index], m_curRow, m_curColumn, Qt::AlignHCenter | Qt::AlignTop); + + // Chances that we did close() on the widget is big, so show it. + m_knobs[index]->show(); + + // Keep track of current column and row index. + if (m_curColumn < m_maxColumns - 1) + { + m_curColumn++; + } else { + m_curColumn = 0; + m_curRow++; + } + } +} +void CarlaParamsView::clearKnobs() +{ + // Remove knobs from layout. + for (uint32_t i=0; i < m_knobs.count(); ++i) + { + m_knobs[i]->close(); + } + + // Reset position data. + m_curColumn = 0; + m_curRow = 0; + + m_curOutColumn = 0; + m_curOutRow = 0; +} + +void CarlaParamsView::modelChanged() +{ + refreshKnobs(); + filterKnobs(); +} diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index 7efecf681d6..5204b9bcffd 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -25,10 +25,21 @@ #ifndef CARLA_H #define CARLA_H +#define CARLA_SETTING_PREFIX "PARAM_KNOB_" +#define CARLA_MIN_PARAM_VERSION 0x020090 +#define CARLA_VERSION_HEX_3 0x30000 + +// qt +#include +#include +#include +#include +#include +#include #include -#include "carlabase_export.h" -#include "CarlaNative.h" +// carla/source/includes +#include "carlabase_export.h" #if CARLA_VERSION_HEX >= 0x010911 #include "CarlaNativePlugin.h" #else @@ -42,10 +53,120 @@ const NativePluginDescriptor* carla_get_native_rack_plugin(); #endif +// lmms/include/ +#include "EffectControls.h" #include "Instrument.h" #include "InstrumentView.h" +#include "Knob.h" +#include "SubWindow.h" class QPushButton; +class QComboBox; + +class CarlaParamFloatModel : public FloatModel +{ +public: + CarlaParamFloatModel(Model * parent): + FloatModel(0.0, 0.0, 1.0, 0.001, parent, "Unused"), + m_isOutput(false), + m_isEnabled(false) + { + } + + // From AutomatableModel.h, it's private there. + inline static bool mustQuoteName(const QString &name) + { + QRegExp reg("^[A-Za-z0-9._-]+$"); + return !reg.exactMatch(name); + } + + inline virtual void loadSettings(const QDomElement& element, const QString& name = QString("value")) override + { + AutomatableModel::loadSettings(element, name); + bool mustQuote = mustQuoteName(name); + QDomElement me = element.firstChildElement(mustQuote ? QString("automatablemodel") : name); + if (!me.isNull()) { + m_isOutput = (bool)me.attribute("output", "0").toInt(); + m_groupName = QString(me.attribute("groupName", "")); + } + } + + inline virtual void saveSettings(QDomDocument& doc, QDomElement& element, const QString& name = QString( "value" )) override + { + if (m_isEnabled) + { + AutomatableModel::saveSettings(doc, element, name); + bool mustQuote = mustQuoteName(name); + QDomElement me = element.firstChildElement(mustQuote ? QString("automatablemodel") : name); + if (!me.isNull()) + { + me.setAttribute("output", m_isOutput); + me.setAttribute("groupName", m_groupName); + } + } + } + + inline const bool enabled() + { + return m_isEnabled; + } + + inline const bool isOutput() + { + return m_isOutput; + } + + inline void setOutput(bool state = true) + { + m_isOutput = state; + } + + inline void setEnabled(bool state = true) + { + m_isEnabled = state; + } + + inline void setGroupName(QString groupName) + { + m_groupName = groupName; + } + + virtual QString groupName() const + { + return m_groupName; + } + +private: + bool m_isOutput; + bool m_isEnabled; + QString m_groupName; +}; + +// ------------------------------------------------------------------- + +class CarlaParamsSubWindow : public SubWindow +{ + Q_OBJECT + +signals: + void uiClosed(); + +public: + CarlaParamsSubWindow(QWidget * _parent, Qt::WindowFlags windowFlags) : + SubWindow(_parent) + { + setAttribute(Qt::WA_DeleteOnClose, false); + setWindowFlags(windowFlags); + } + + virtual void closeEvent(QCloseEvent * event) override + { + emit uiClosed(); + event->accept(); + } +}; + +// ------------------------------------------------------------------- class CARLABASE_EXPORT CarlaInstrument : public Instrument { @@ -77,9 +198,14 @@ class CARLABASE_EXPORT CarlaInstrument : public Instrument signals: void uiClosed(); + void paramsUpdated(); private slots: void sampleRateChanged(); + void refreshParams(bool init = false); + void clearKnobModels(); + void knobModelChanged(uint32_t index); + void updateKnobModel(uint32_t index); private: const bool kIsPatchbay; @@ -95,9 +221,21 @@ private slots: // this is only needed because note-offs are being sent during play QMutex fMutex; + QList m_paramModels; + QDomElement m_settingsElem; + QMdiSubWindow* m_subWindow; + QObject* p_subWindow; + + QCompleter* m_paramsCompleter; + QStringListModel* m_completerModel; + friend class CarlaInstrumentView; + friend class CarlaParamsView; }; + +// ------------------------------------------------------------------- + class CarlaInstrumentView : public InstrumentViewFixedSize { Q_OBJECT @@ -109,6 +247,8 @@ class CarlaInstrumentView : public InstrumentViewFixedSize private slots: void toggleUI(bool); void uiClosed(); + void toggleParamsWindow(); + void paramsUiClosed(); private: virtual void modelChanged(); @@ -118,7 +258,61 @@ private slots: const NativePluginDescriptor* fDescriptor; int fTimerId; - QPushButton * m_toggleUIButton; + CarlaInstrument* const m_carlaInstrument; + QWidget* const p_parent; + + QPushButton* m_toggleUIButton; + QPushButton* m_toggleParamsWindowButton; +}; + +// ------------------------------------------------------------------- + +class CarlaParamsView : public InstrumentView +{ + Q_OBJECT +public: + CarlaParamsView(CarlaInstrument* const instrument, QWidget* const parent); + virtual ~CarlaParamsView(); + +signals: + void uiClosed(); + +private slots: + void refreshKnobs(); + void filterKnobs(); + void clearFilterText(); + +private: + virtual void modelChanged(); + + void adjustWindowWidth(); + void addKnob(uint32_t index); + void clearKnobs(); + + CarlaInstrument* const m_carlaInstrument; + QList m_knobs; + + const uint32_t m_maxColumns; + uint32_t m_curColumn; + uint32_t m_curRow; + + uint32_t m_curOutColumn; + uint32_t m_curOutRow; + + QScrollArea* m_inputScrollArea; + QGridLayout* m_inputScrollAreaLayout; + QWidget* m_inputScrollAreaWidgetContent; + QScrollArea* m_outputScrollArea; + QGridLayout* m_outputScrollAreaLayout; + QWidget* m_outputScrollAreaWidgetContent; + QHBoxLayout* m_toolBarLayout; + + QLineEdit* m_paramsFilterLineEdit; + QPushButton* m_clearFilterButton; + QPushButton* m_automatedOnlyButton; + + QComboBox* m_groupFilterCombo; + QStringListModel* m_groupFilterModel; }; #endif From 1e29794febcfc0b180bf3fd96bae93444a23673a Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Thu, 23 Jul 2020 21:55:56 +0000 Subject: [PATCH 02/21] Update Carla UI after a knob changed from LMMS --- plugins/carlabase/carla.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 0c16bd02b47..1042761b3ea 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -23,7 +23,6 @@ */ /* TODO - * - Carla inline param ui doesn't update. * - Flow layout for knobs. * - Search other TODO */ @@ -423,7 +422,6 @@ void CarlaInstrument::refreshParams(bool init) } if (paramInfo->groupName != nullptr){ - // TODO this is unused for now. m_paramModels[i]->setGroupName(paramInfo->groupName); } @@ -460,10 +458,16 @@ void CarlaInstrument::clearKnobModels(){ void CarlaInstrument::knobModelChanged(uint32_t index) { // Update Carla param (LMMS -> Carla) - // TODO fDescriptor->ui_set_parameter_value - if (fDescriptor->set_parameter_value != nullptr && - !m_paramModels[index]->isOutput()){ - fDescriptor->set_parameter_value(fHandle, index, m_paramModels[index]->value()); + if (!m_paramModels[index]->isOutput()){ + if (fDescriptor->set_parameter_value != nullptr){ + fDescriptor->set_parameter_value(fHandle, index, m_paramModels[index]->value()); + + } + + // TODO? Shouldn't Carla be doing this? + if (fDescriptor->ui_set_parameter_value != nullptr){ + fDescriptor->ui_set_parameter_value(fHandle, index, m_paramModels[index]->value()); + } } } From 4adf8a51c0ec438e3ae677a48d4a062ed93fc369 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Tue, 8 Dec 2020 00:54:07 +0000 Subject: [PATCH 03/21] Grow/shrink layout when the params subwindow changes width. --- plugins/carlabase/carla.cpp | 95 ++++++++++++++++++++----------------- plugins/carlabase/carla.h | 47 +++++++++++++++++- 2 files changed, 97 insertions(+), 45 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 1042761b3ea..7a1ea8698b8 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -393,6 +393,7 @@ void CarlaInstrument::saveSettings(QDomDocument& doc, QDomElement& parent) void CarlaInstrument::refreshParams(bool init) { + m_knobGroupCount = 0; if (fDescriptor->get_parameter_count != nullptr && fDescriptor->get_parameter_info != nullptr && fDescriptor->get_parameter_value != nullptr && @@ -401,6 +402,7 @@ void CarlaInstrument::refreshParams(bool init) uint32_t param_count = fDescriptor->get_parameter_count(fHandle); QList completerData; + QList groups; // tmp used to count no. groups. for (uint32_t i=0; i < param_count; ++i) { @@ -414,7 +416,6 @@ void CarlaInstrument::refreshParams(bool init) m_paramModels[i]->setValue(param_value); - // Get parameter name QString name = "_NO_NAME_"; if (paramInfo->name != nullptr){ @@ -423,6 +424,12 @@ void CarlaInstrument::refreshParams(bool init) if (paramInfo->groupName != nullptr){ m_paramModels[i]->setGroupName(paramInfo->groupName); + + if (!groups.contains(paramInfo->groupName)) { + groups.push_back(paramInfo->groupName); + m_knobGroupCount++; + } + m_paramModels[i]->setGroupId(groups.indexOf(paramInfo->groupName)); } completerData.push_back(name); @@ -835,25 +842,22 @@ CarlaParamsView::CarlaParamsView(CarlaInstrument* const instrument, QWidget* con CarlaParamsSubWindow* win = new CarlaParamsSubWindow(gui->mainWindow()->workspace()->viewport(), Qt::SubWindow | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); m_carlaInstrument->m_subWindow = gui->mainWindow()->workspace()->addSubWindow(win); - m_carlaInstrument->m_subWindow->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding); + m_carlaInstrument->m_subWindow->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); m_carlaInstrument->m_subWindow->setMinimumHeight(200); + m_carlaInstrument->m_subWindow->setMinimumWidth(200); m_carlaInstrument->m_subWindow->resize(600, 400); m_carlaInstrument->m_subWindow->setWidget(centralWidget); centralWidget->setWindowTitle(m_carlaInstrument->instrumentTrack()->name() + tr(" - Parameters")); // -- Connect signals + connect(m_carlaInstrument->m_subWindow, SIGNAL(resized()), this, SLOT(windowResized())); connect(m_paramsFilterLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(filterKnobs())); connect(m_clearFilterButton, SIGNAL(clicked(bool)), this, SLOT(clearFilterText())); connect(m_automatedOnlyButton, SIGNAL(toggled(bool)), this, SLOT(filterKnobs())); connect(m_groupFilterCombo, SIGNAL(currentTextChanged(const QString)), this, SLOT(filterKnobs())); - connect(m_carlaInstrument, SIGNAL(paramsUpdated()), this, SLOT(refreshKnobs())); - // -- Add spacer so all knobs go to top - QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - m_inputScrollAreaLayout->addItem(verticalSpacer, m_curRow + 1, 0, 1, 1); - - refreshKnobs(); // Add buttons if there are any already. + modelChanged(); // Add buttons if there are any already. m_carlaInstrument->m_subWindow->show(); // Show the subwindow } @@ -889,6 +893,8 @@ void CarlaParamsView::filterKnobs() QString text = m_paramsFilterLineEdit->text(); clearKnobs(); // Remove all knobs from the layout. + m_maxColumns = (m_inputScrollArea->width() / m_maxKnobWidthPerGroup[m_groupFilterCombo->currentIndex()]); + for (uint32_t i=0; i < m_knobs.count(); ++i) { // Don't show disabled (unused) knobs. @@ -923,6 +929,10 @@ void CarlaParamsView::filterKnobs() addKnob(i); } } + + // Add spacer so all knobs go to top + QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + m_inputScrollAreaLayout->addItem(verticalSpacer, m_curRow+1, 0, 1, 1); } void CarlaParamsView::refreshKnobs() @@ -934,21 +944,6 @@ void CarlaParamsView::refreshKnobs() } m_knobs.clear(); // Clear the pointer list. - // Clear the input layout (posible spacer). - QLayoutItem *item; - while ((item = m_inputScrollAreaLayout->takeAt(0))) - { - if (item->widget()) {delete item->widget();} - delete item; - } - - // Clear the output layout (posible spacer). - while ((item = m_outputScrollAreaLayout->takeAt(0))) - { - if (item->widget()) {delete item->widget();} - delete item; - } - // Reset position data. m_curColumn = 0; m_curRow = 0; @@ -956,6 +951,12 @@ void CarlaParamsView::refreshKnobs() m_curOutColumn = 0; m_curOutRow = 0; + // Clear max knob width per group + m_maxKnobWidthPerGroup.clear(); + m_maxKnobWidthPerGroup.reserve(m_carlaInstrument->m_knobGroupCount); + for (uint8_t i = 0; i < m_carlaInstrument->m_knobGroupCount; i++) { + m_maxKnobWidthPerGroup[i] = 0; + } if (!m_carlaInstrument->m_paramModels.count()) { return; } @@ -963,6 +964,7 @@ void CarlaParamsView::refreshKnobs() m_knobs.reserve(m_carlaInstrument->m_paramModels.count()); QStringList groupNameList; + groupNameList.reserve(m_carlaInstrument->m_knobGroupCount); for (uint32_t i=0; i < m_carlaInstrument->m_paramModels.count(); ++i) { @@ -986,12 +988,12 @@ void CarlaParamsView::refreshKnobs() groupNameList.append(m_carlaInstrument->m_paramModels[i]->groupName()); } - // Add knob to layout - addKnob(i); - } - else - { - m_knobs[i]->hide(); + // Store biggest knob width per group (so we can calc how many + // knobs we can horizontaly fit) + if (m_maxKnobWidthPerGroup[m_carlaInstrument->m_paramModels[i]->groupId()] < m_knobs[i]->width()) + { + m_maxKnobWidthPerGroup[m_carlaInstrument->m_paramModels[i]->groupId()] = m_knobs[i]->width() + m_inputScrollAreaLayout->spacing(); + } } } @@ -1002,24 +1004,13 @@ void CarlaParamsView::refreshKnobs() } m_groupFilterModel->setStringList(groupNameList); m_groupFilterCombo->setCurrentIndex(0); +} - // Add spacer so all knobs go to top - QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - m_inputScrollAreaLayout->addItem(verticalSpacer, m_curRow + 1, 0, 1, 1); - adjustWindowWidth(); +void CarlaParamsView::windowResized() { + filterKnobs(); } -void CarlaParamsView::adjustWindowWidth() -{ - // Resize window - int newWidth = m_inputScrollAreaWidgetContent->sizeHint().width() + 100; - newWidth = (newWidth >= 200) ? newWidth : 200; - //m_carlaInstrument->m_subWindow->setFixedWidth(newWidth); - //m_carlaInstrument->m_subWindow->setMinimumWidth(newWidth); - //m_carlaInstrument->m_subWindow->setMaximumWidth(newWidth); - m_carlaInstrument->m_subWindow->resize(newWidth, m_carlaInstrument->m_subWindow->height()); -} void CarlaParamsView::addKnob(uint32_t index) { @@ -1041,6 +1032,7 @@ void CarlaParamsView::addKnob(uint32_t index) { // Add the new knob to layout m_inputScrollAreaLayout->addWidget(m_knobs[index], m_curRow, m_curColumn, Qt::AlignHCenter | Qt::AlignTop); + m_inputScrollAreaLayout->setColumnStretch(m_curColumn, 1); // Chances that we did close() on the widget is big, so show it. m_knobs[index]->show(); @@ -1058,11 +1050,26 @@ void CarlaParamsView::addKnob(uint32_t index) void CarlaParamsView::clearKnobs() { // Remove knobs from layout. - for (uint32_t i=0; i < m_knobs.count(); ++i) + for (uint16_t i=0; i < m_knobs.count(); ++i) { m_knobs[i]->close(); } + // Remove spacers + QLayoutItem * item; + for (int16_t i=m_inputScrollAreaLayout->count() - 1; i > 0; i--) + { + item = m_inputScrollAreaLayout->takeAt(i); + if (item->widget()) {continue;} + delete item; + } + for (int16_t i=m_outputScrollAreaLayout->count() - 1; i > 0; i--) + { + item = m_outputScrollAreaLayout->takeAt(i); + if (item->widget()) {continue;} + delete item; + } + // Reset position data. m_curColumn = 0; m_curRow = 0; diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index 5204b9bcffd..1e582d7641d 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -131,14 +131,25 @@ class CarlaParamFloatModel : public FloatModel m_groupName = groupName; } + inline void setGroupId(uint8_t groupId) + { + m_groupId = groupId; + } + virtual QString groupName() const { return m_groupName; } + virtual uint8_t groupId() const + { + return m_groupId; + } + private: bool m_isOutput; bool m_isEnabled; + uint8_t m_groupId; QString m_groupName; }; @@ -150,6 +161,7 @@ class CarlaParamsSubWindow : public SubWindow signals: void uiClosed(); + void resized(); public: CarlaParamsSubWindow(QWidget * _parent, Qt::WindowFlags windowFlags) : @@ -159,11 +171,39 @@ class CarlaParamsSubWindow : public SubWindow setWindowFlags(windowFlags); } + virtual void resizeEvent(QResizeEvent * event) override + { + if (mousePress) { + resizing = true; + } + SubWindow::resizeEvent(event); + } + + virtual void mousePressEvent(QMouseEvent * event) override + { + mousePress = true; + SubWindow::mousePressEvent(event); + } + + virtual void mouseReleaseEvent(QMouseEvent * event) override + { + if (resizing) { + resizing = false; + mousePress = false; + emit resized(); + } + SubWindow::mouseReleaseEvent(event); + } + virtual void closeEvent(QCloseEvent * event) override { emit uiClosed(); event->accept(); } + +private: + bool resizing = false; + bool mousePress = false; }; // ------------------------------------------------------------------- @@ -221,6 +261,7 @@ private slots: // this is only needed because note-offs are being sent during play QMutex fMutex; + uint8_t m_knobGroupCount; QList m_paramModels; QDomElement m_settingsElem; QMdiSubWindow* m_subWindow; @@ -281,6 +322,7 @@ private slots: void refreshKnobs(); void filterKnobs(); void clearFilterText(); + void windowResized(); private: virtual void modelChanged(); @@ -292,7 +334,10 @@ private slots: CarlaInstrument* const m_carlaInstrument; QList m_knobs; - const uint32_t m_maxColumns; + // Keep track of the biggest knob width per group + QList m_maxKnobWidthPerGroup; + + uint32_t m_maxColumns; uint32_t m_curColumn; uint32_t m_curRow; From 9d9cfe4dbbefebdd7570ef93ded2fadad149f66d Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Tue, 8 Dec 2020 01:46:56 +0000 Subject: [PATCH 04/21] Fix crash on delete last plugin from carla (no params left). --- plugins/carlabase/carla.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 7a1ea8698b8..1095e2ef093 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -425,7 +425,7 @@ void CarlaInstrument::refreshParams(bool init) if (paramInfo->groupName != nullptr){ m_paramModels[i]->setGroupName(paramInfo->groupName); - if (!groups.contains(paramInfo->groupName)) { + if (m_paramModels[i]->enabled() && !groups.contains(paramInfo->groupName)) { groups.push_back(paramInfo->groupName); m_knobGroupCount++; } @@ -461,6 +461,8 @@ void CarlaInstrument::clearKnobModels(){ //Clear the list m_paramModels.clear(); + + m_knobGroupCount = 0; } void CarlaInstrument::knobModelChanged(uint32_t index) @@ -890,10 +892,13 @@ void CarlaParamsView::clearFilterText() void CarlaParamsView::filterKnobs() { - QString text = m_paramsFilterLineEdit->text(); clearKnobs(); // Remove all knobs from the layout. + if (!m_carlaInstrument->m_knobGroupCount) { + return; + } m_maxColumns = (m_inputScrollArea->width() / m_maxKnobWidthPerGroup[m_groupFilterCombo->currentIndex()]); + QString text = m_paramsFilterLineEdit->text(); for (uint32_t i=0; i < m_knobs.count(); ++i) { From ab851c42d5475bdca6673018bfef297bd70d2998 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Tue, 8 Dec 2020 17:06:42 +0000 Subject: [PATCH 05/21] - Display Carla params correctly on first show. - Removed unused function modelChanged(). --- plugins/carlabase/carla.cpp | 16 ++++------------ plugins/carlabase/carla.h | 2 -- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 1095e2ef093..40aa6f1366e 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -22,11 +22,6 @@ * */ - /* TODO - * - Flow layout for knobs. - * - Search other TODO - */ - #include "carla.h" #include "Engine.h" @@ -859,8 +854,11 @@ CarlaParamsView::CarlaParamsView(CarlaInstrument* const instrument, QWidget* con connect(m_groupFilterCombo, SIGNAL(currentTextChanged(const QString)), this, SLOT(filterKnobs())); connect(m_carlaInstrument, SIGNAL(paramsUpdated()), this, SLOT(refreshKnobs())); - modelChanged(); // Add buttons if there are any already. m_carlaInstrument->m_subWindow->show(); // Show the subwindow + + // Add knobs if there are any already. + // Call this after show() so the m_inputScrollArea->width() is set properly. + refreshKnobs(); // Will trigger filterKnobs() due m_groupFilterCombo->setCurrentIndex(0) } CarlaParamsView::~CarlaParamsView() @@ -1082,9 +1080,3 @@ void CarlaParamsView::clearKnobs() m_curOutColumn = 0; m_curOutRow = 0; } - -void CarlaParamsView::modelChanged() -{ - refreshKnobs(); - filterKnobs(); -} diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index 1e582d7641d..6ffe9c22274 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -325,8 +325,6 @@ private slots: void windowResized(); private: - virtual void modelChanged(); - void adjustWindowWidth(); void addKnob(uint32_t index); void clearKnobs(); From 4a26a08c68da9039a5acc3eb14c42b19782a436e Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sat, 12 Dec 2020 22:39:24 +0000 Subject: [PATCH 06/21] Prevent posible division by zero. --- plugins/carlabase/carla.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 40aa6f1366e..bae7bfb7de3 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -895,7 +895,14 @@ void CarlaParamsView::filterKnobs() if (!m_carlaInstrument->m_knobGroupCount) { return; } - m_maxColumns = (m_inputScrollArea->width() / m_maxKnobWidthPerGroup[m_groupFilterCombo->currentIndex()]); + + uint16_t maxWidth = m_maxKnobWidthPerGroup[m_groupFilterCombo->currentIndex()]; + if (!maxWidth) { + // Prevent possible division by zero. + return; + } + + m_maxColumns = (m_inputScrollArea->width() / maxWidth); QString text = m_paramsFilterLineEdit->text(); for (uint32_t i=0; i < m_knobs.count(); ++i) From 8a0f2094ba563094f9af435f046f00887f441505 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sun, 31 Jan 2021 00:32:52 +0100 Subject: [PATCH 07/21] Move GUI stuff from CarlaInstrument to CarlaInstrumentView. Rename NULL to nullptr. Removed unnescerarry check. --- plugins/carlabase/carla.cpp | 67 +++++++++++++++++++------------------ plugins/carlabase/carla.h | 10 ++++-- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index bae7bfb7de3..aa36de8b090 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -150,8 +150,7 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D fHandle(NULL), fDescriptor(isPatchbay ? carla_get_native_patchbay_plugin() : carla_get_native_rack_plugin()), fMidiEventCount(0), - m_paramModels(), - m_subWindow(NULL) + m_paramModels() { fHost.handle = this; fHost.uiName = NULL; @@ -242,11 +241,6 @@ CarlaInstrument::~CarlaInstrument() fHandle = NULL; #if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION - if (p_subWindow != NULL) { - delete p_subWindow; - p_subWindow = NULL; - } - if (!m_paramModels.isEmpty()) { m_paramModels.clear(); } @@ -613,7 +607,9 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid fDescriptor(instrument->fDescriptor), fTimerId(fHandle != NULL && fDescriptor->ui_idle != NULL ? startTimer(30) : 0), m_carlaInstrument(instrument), - p_parent(parent) + p_parent(parent), + m_subWindow(nullptr), + p_subWindow(nullptr) { setAutoFillBackground(true); @@ -662,6 +658,13 @@ CarlaInstrumentView::~CarlaInstrumentView() { if (m_toggleUIButton->isChecked()) toggleUI(false); + +#if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION + if (p_subWindow) { + delete p_subWindow; + p_subWindow = nullptr; + } +#endif } void CarlaInstrumentView::toggleUI(bool visible) @@ -701,15 +704,15 @@ void CarlaInstrumentView::timerEvent(QTimerEvent* event) void CarlaInstrumentView::toggleParamsWindow() { - if (m_carlaInstrument->m_subWindow == NULL) + if (!m_subWindow) { - m_carlaInstrument->p_subWindow = new CarlaParamsView(m_carlaInstrument, p_parent); - connect(m_carlaInstrument->m_subWindow, SIGNAL(uiClosed()), this, SLOT(paramsUiClosed())); + p_subWindow = new CarlaParamsView(this, p_parent); + connect(m_subWindow, SIGNAL(uiClosed()), this, SLOT(paramsUiClosed())); } else { - if (m_carlaInstrument->m_subWindow->isVisible()) { - m_carlaInstrument->m_subWindow->hide(); + if (m_subWindow->isVisible()) { + m_subWindow->hide(); } else { - m_carlaInstrument->m_subWindow->show(); + m_subWindow->show(); } } } @@ -721,9 +724,10 @@ void CarlaInstrumentView::paramsUiClosed() // ------------------------------------------------------------------- -CarlaParamsView::CarlaParamsView(CarlaInstrument* const instrument, QWidget* const parent) - : InstrumentView(instrument, parent), - m_carlaInstrument(instrument), +CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWidget* const parent) + : InstrumentView(instrumentView->m_carlaInstrument, parent), + m_carlaInstrument(instrumentView->m_carlaInstrument), + m_carlaInstrumentView(instrumentView), m_maxColumns(6), m_curColumn(0), m_curRow(0), @@ -838,23 +842,23 @@ CarlaParamsView::CarlaParamsView(CarlaInstrument* const instrument, QWidget* con // -- Sub window CarlaParamsSubWindow* win = new CarlaParamsSubWindow(gui->mainWindow()->workspace()->viewport(), Qt::SubWindow | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); - m_carlaInstrument->m_subWindow = gui->mainWindow()->workspace()->addSubWindow(win); - m_carlaInstrument->m_subWindow->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - m_carlaInstrument->m_subWindow->setMinimumHeight(200); - m_carlaInstrument->m_subWindow->setMinimumWidth(200); - m_carlaInstrument->m_subWindow->resize(600, 400); - m_carlaInstrument->m_subWindow->setWidget(centralWidget); + m_carlaInstrumentView->m_subWindow = gui->mainWindow()->workspace()->addSubWindow(win); + m_carlaInstrumentView->m_subWindow->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + m_carlaInstrumentView->m_subWindow->setMinimumHeight(200); + m_carlaInstrumentView->m_subWindow->setMinimumWidth(200); + m_carlaInstrumentView->m_subWindow->resize(600, 400); + m_carlaInstrumentView->m_subWindow->setWidget(centralWidget); centralWidget->setWindowTitle(m_carlaInstrument->instrumentTrack()->name() + tr(" - Parameters")); // -- Connect signals - connect(m_carlaInstrument->m_subWindow, SIGNAL(resized()), this, SLOT(windowResized())); + connect(m_carlaInstrumentView->m_subWindow, SIGNAL(resized()), this, SLOT(windowResized())); connect(m_paramsFilterLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(filterKnobs())); connect(m_clearFilterButton, SIGNAL(clicked(bool)), this, SLOT(clearFilterText())); connect(m_automatedOnlyButton, SIGNAL(toggled(bool)), this, SLOT(filterKnobs())); connect(m_groupFilterCombo, SIGNAL(currentTextChanged(const QString)), this, SLOT(filterKnobs())); connect(m_carlaInstrument, SIGNAL(paramsUpdated()), this, SLOT(refreshKnobs())); - m_carlaInstrument->m_subWindow->show(); // Show the subwindow + m_carlaInstrumentView->m_subWindow->show(); // Show the subwindow // Add knobs if there are any already. // Call this after show() so the m_inputScrollArea->width() is set properly. @@ -864,17 +868,16 @@ CarlaParamsView::CarlaParamsView(CarlaInstrument* const instrument, QWidget* con CarlaParamsView::~CarlaParamsView() { // Close and delete m_subWindow - if (m_carlaInstrument->m_subWindow != NULL ) + if (m_carlaInstrumentView->m_subWindow) { - m_carlaInstrument->m_subWindow->setAttribute(Qt::WA_DeleteOnClose); - m_carlaInstrument->m_subWindow->close(); + m_carlaInstrumentView->m_subWindow->setAttribute(Qt::WA_DeleteOnClose); + m_carlaInstrumentView->m_subWindow->close(); - if (m_carlaInstrument->m_subWindow != NULL) - delete m_carlaInstrument->m_subWindow; - m_carlaInstrument->m_subWindow = NULL; + delete m_carlaInstrumentView->m_subWindow; + m_carlaInstrumentView->m_subWindow = nullptr; } - m_carlaInstrument->p_subWindow = NULL; + m_carlaInstrumentView->p_subWindow = nullptr; // Clear models if (m_carlaInstrument->m_paramModels.isEmpty() == false) diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index 6ffe9c22274..cb4739b1c78 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -264,8 +264,6 @@ private slots: uint8_t m_knobGroupCount; QList m_paramModels; QDomElement m_settingsElem; - QMdiSubWindow* m_subWindow; - QObject* p_subWindow; QCompleter* m_paramsCompleter; QStringListModel* m_completerModel; @@ -302,8 +300,13 @@ private slots: CarlaInstrument* const m_carlaInstrument; QWidget* const p_parent; + QMdiSubWindow* m_subWindow; + QObject* p_subWindow; + QPushButton* m_toggleUIButton; QPushButton* m_toggleParamsWindowButton; + + friend class CarlaParamsView; }; // ------------------------------------------------------------------- @@ -312,7 +315,7 @@ class CarlaParamsView : public InstrumentView { Q_OBJECT public: - CarlaParamsView(CarlaInstrument* const instrument, QWidget* const parent); + CarlaParamsView(CarlaInstrumentView* const instrumentView, QWidget* const parent); virtual ~CarlaParamsView(); signals: @@ -330,6 +333,7 @@ private slots: void clearKnobs(); CarlaInstrument* const m_carlaInstrument; + CarlaInstrumentView* const m_carlaInstrumentView; QList m_knobs; // Keep track of the biggest knob width per group From df3f7d98a84aa2bedec68ecb389e412ec3ed639d Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sun, 31 Jan 2021 00:45:02 +0100 Subject: [PATCH 08/21] Some better naming. --- plugins/carlabase/carla.cpp | 52 ++++++++++++++++++------------------- plugins/carlabase/carla.h | 6 +++-- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index aa36de8b090..b5dfddf27c8 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -608,8 +608,8 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid fTimerId(fHandle != NULL && fDescriptor->ui_idle != NULL ? startTimer(30) : 0), m_carlaInstrument(instrument), p_parent(parent), - m_subWindow(nullptr), - p_subWindow(nullptr) + m_paramsSubWindow(nullptr), + m_paramsView(nullptr) { setAutoFillBackground(true); @@ -660,9 +660,9 @@ CarlaInstrumentView::~CarlaInstrumentView() toggleUI(false); #if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION - if (p_subWindow) { - delete p_subWindow; - p_subWindow = nullptr; + if (m_paramsView) { + delete m_paramsView; + m_paramsView = nullptr; } #endif } @@ -704,15 +704,15 @@ void CarlaInstrumentView::timerEvent(QTimerEvent* event) void CarlaInstrumentView::toggleParamsWindow() { - if (!m_subWindow) + if (!m_paramsSubWindow) { - p_subWindow = new CarlaParamsView(this, p_parent); - connect(m_subWindow, SIGNAL(uiClosed()), this, SLOT(paramsUiClosed())); + m_paramsView = new CarlaParamsView(this, p_parent); + connect(m_paramsSubWindow, SIGNAL(uiClosed()), this, SLOT(paramsUiClosed())); } else { - if (m_subWindow->isVisible()) { - m_subWindow->hide(); + if (m_paramsSubWindow->isVisible()) { + m_paramsSubWindow->hide(); } else { - m_subWindow->show(); + m_paramsSubWindow->show(); } } } @@ -842,23 +842,23 @@ CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWid // -- Sub window CarlaParamsSubWindow* win = new CarlaParamsSubWindow(gui->mainWindow()->workspace()->viewport(), Qt::SubWindow | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); - m_carlaInstrumentView->m_subWindow = gui->mainWindow()->workspace()->addSubWindow(win); - m_carlaInstrumentView->m_subWindow->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - m_carlaInstrumentView->m_subWindow->setMinimumHeight(200); - m_carlaInstrumentView->m_subWindow->setMinimumWidth(200); - m_carlaInstrumentView->m_subWindow->resize(600, 400); - m_carlaInstrumentView->m_subWindow->setWidget(centralWidget); + m_carlaInstrumentView->m_paramsSubWindow = gui->mainWindow()->workspace()->addSubWindow(win); + m_carlaInstrumentView->m_paramsSubWindow->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + m_carlaInstrumentView->m_paramsSubWindow->setMinimumHeight(200); + m_carlaInstrumentView->m_paramsSubWindow->setMinimumWidth(200); + m_carlaInstrumentView->m_paramsSubWindow->resize(600, 400); + m_carlaInstrumentView->m_paramsSubWindow->setWidget(centralWidget); centralWidget->setWindowTitle(m_carlaInstrument->instrumentTrack()->name() + tr(" - Parameters")); // -- Connect signals - connect(m_carlaInstrumentView->m_subWindow, SIGNAL(resized()), this, SLOT(windowResized())); + connect(m_carlaInstrumentView->m_paramsSubWindow, SIGNAL(resized()), this, SLOT(windowResized())); connect(m_paramsFilterLineEdit, SIGNAL(textChanged(const QString)), this, SLOT(filterKnobs())); connect(m_clearFilterButton, SIGNAL(clicked(bool)), this, SLOT(clearFilterText())); connect(m_automatedOnlyButton, SIGNAL(toggled(bool)), this, SLOT(filterKnobs())); connect(m_groupFilterCombo, SIGNAL(currentTextChanged(const QString)), this, SLOT(filterKnobs())); connect(m_carlaInstrument, SIGNAL(paramsUpdated()), this, SLOT(refreshKnobs())); - m_carlaInstrumentView->m_subWindow->show(); // Show the subwindow + m_carlaInstrumentView->m_paramsSubWindow->show(); // Show the subwindow // Add knobs if there are any already. // Call this after show() so the m_inputScrollArea->width() is set properly. @@ -867,17 +867,17 @@ CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWid CarlaParamsView::~CarlaParamsView() { - // Close and delete m_subWindow - if (m_carlaInstrumentView->m_subWindow) + // Close and delete m_paramsSubWindow + if (m_carlaInstrumentView->m_paramsSubWindow) { - m_carlaInstrumentView->m_subWindow->setAttribute(Qt::WA_DeleteOnClose); - m_carlaInstrumentView->m_subWindow->close(); + m_carlaInstrumentView->m_paramsSubWindow->setAttribute(Qt::WA_DeleteOnClose); + m_carlaInstrumentView->m_paramsSubWindow->close(); - delete m_carlaInstrumentView->m_subWindow; - m_carlaInstrumentView->m_subWindow = nullptr; + delete m_carlaInstrumentView->m_paramsSubWindow; + m_carlaInstrumentView->m_paramsSubWindow = nullptr; } - m_carlaInstrumentView->p_subWindow = nullptr; + m_carlaInstrumentView->m_paramsView = nullptr; // Clear models if (m_carlaInstrument->m_paramModels.isEmpty() == false) diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index cb4739b1c78..56a47158f28 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -63,6 +63,8 @@ class QPushButton; class QComboBox; +class CarlaParamsView; + class CarlaParamFloatModel : public FloatModel { public: @@ -300,8 +302,8 @@ private slots: CarlaInstrument* const m_carlaInstrument; QWidget* const p_parent; - QMdiSubWindow* m_subWindow; - QObject* p_subWindow; + QMdiSubWindow* m_paramsSubWindow; + CarlaParamsView* m_paramsView; QPushButton* m_toggleUIButton; QPushButton* m_toggleParamsWindowButton; From 6f283b4bde3681bcf19cc9b1d6bb141fe8a15796 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sun, 31 Jan 2021 01:05:19 +0100 Subject: [PATCH 09/21] Style: honor max line length of 120 characters. --- plugins/carlabase/carla.cpp | 17 ++++++++++------- plugins/carlabase/carla.h | 3 ++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index b5dfddf27c8..9cce5ba5fb2 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -282,7 +282,8 @@ void CarlaInstrument::handleUiClosed() emit uiClosed(); } -intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t index, const intptr_t value, void* const ptr, const float opt) +intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opcode, const int32_t index, + const intptr_t value, void* const ptr, const float opt) { intptr_t ret = 0; @@ -400,7 +401,6 @@ void CarlaInstrument::refreshParams(bool init) m_paramModels[i]->setOutput((paramInfo->hints & NATIVE_PARAMETER_IS_OUTPUT)); m_paramModels[i]->setEnabled((paramInfo->hints & NATIVE_PARAMETER_IS_ENABLED)); - // https://github.com/falkTX/Carla/tree/master/source/native-plugins source/native-plugins/resources/carla-plugin float param_value = fDescriptor->get_parameter_value(fHandle, i); m_paramModels[i]->setValue(param_value); @@ -841,9 +841,10 @@ CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWid // -- Sub window CarlaParamsSubWindow* win = new CarlaParamsSubWindow(gui->mainWindow()->workspace()->viewport(), Qt::SubWindow | - Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); + Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); m_carlaInstrumentView->m_paramsSubWindow = gui->mainWindow()->workspace()->addSubWindow(win); - m_carlaInstrumentView->m_paramsSubWindow->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + m_carlaInstrumentView->m_paramsSubWindow->setSizePolicy( + QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); m_carlaInstrumentView->m_paramsSubWindow->setMinimumHeight(200); m_carlaInstrumentView->m_paramsSubWindow->setMinimumWidth(200); m_carlaInstrumentView->m_paramsSubWindow->resize(600, 400); @@ -1003,9 +1004,10 @@ void CarlaParamsView::refreshKnobs() // Store biggest knob width per group (so we can calc how many // knobs we can horizontaly fit) - if (m_maxKnobWidthPerGroup[m_carlaInstrument->m_paramModels[i]->groupId()] < m_knobs[i]->width()) + uint8_t groupId = m_carlaInstrument->m_paramModels[i]->groupId(); + if (m_maxKnobWidthPerGroup[groupId] < m_knobs[i]->width()) { - m_maxKnobWidthPerGroup[m_carlaInstrument->m_paramModels[i]->groupId()] = m_knobs[i]->width() + m_inputScrollAreaLayout->spacing(); + m_maxKnobWidthPerGroup[groupId] = (m_knobs[i]->width() + m_inputScrollAreaLayout->spacing(); } } } @@ -1030,7 +1032,8 @@ void CarlaParamsView::addKnob(uint32_t index) bool output = m_carlaInstrument->m_paramModels[index]->isOutput(); if (output) { - m_outputScrollAreaLayout->addWidget(m_knobs[index], m_curOutRow, m_curOutColumn, Qt::AlignHCenter | Qt::AlignTop); + m_outputScrollAreaLayout->addWidget( + m_knobs[index], m_curOutRow, m_curOutColumn, Qt::AlignHCenter | Qt::AlignTop); m_knobs[index]->setEnabled(false); // We should not be able to adjust output. m_knobs[index]->show(); if (m_curOutColumn < m_maxColumns - 1) diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index 56a47158f28..62c71d170d6 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -93,7 +93,8 @@ class CarlaParamFloatModel : public FloatModel } } - inline virtual void saveSettings(QDomDocument& doc, QDomElement& element, const QString& name = QString( "value" )) override + inline virtual void saveSettings(QDomDocument& doc, QDomElement& element, + const QString& name = QString( "value" )) override { if (m_isEnabled) { From 9cd5cf0fa4fdda623fb162e9aec898c4f1380fed Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sun, 31 Jan 2021 01:18:22 +0100 Subject: [PATCH 10/21] Remove some whitespaces and adjusted comment. --- plugins/carlabase/carla.cpp | 4 +--- plugins/carlabase/carla.h | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 9cce5ba5fb2..aa7438d600d 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -392,7 +392,7 @@ void CarlaInstrument::refreshParams(bool init) uint32_t param_count = fDescriptor->get_parameter_count(fHandle); QList completerData; - QList groups; // tmp used to count no. groups. + QList groups; // used to count no. groups. for (uint32_t i=0; i < param_count; ++i) { @@ -777,7 +777,6 @@ CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWid m_toolBarLayout->addWidget(m_automatedOnlyButton); m_toolBarLayout->addWidget(m_groupFilterCombo); - // -- Input params QFrame * inputFrame = new QFrame(this); QVBoxLayout* inputLayout = new QVBoxLayout(inputFrame); @@ -991,7 +990,6 @@ void CarlaParamsView::refreshKnobs() // Set the newly created model to the knob. m_knobs[i]->setModel(m_carlaInstrument->m_paramModels[i]); - m_knobs[i]->setEnabled(enabled); if (enabled) diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index 62c71d170d6..d70c65e2a43 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -345,7 +345,6 @@ private slots: uint32_t m_maxColumns; uint32_t m_curColumn; uint32_t m_curRow; - uint32_t m_curOutColumn; uint32_t m_curOutRow; @@ -356,11 +355,9 @@ private slots: QGridLayout* m_outputScrollAreaLayout; QWidget* m_outputScrollAreaWidgetContent; QHBoxLayout* m_toolBarLayout; - QLineEdit* m_paramsFilterLineEdit; QPushButton* m_clearFilterButton; QPushButton* m_automatedOnlyButton; - QComboBox* m_groupFilterCombo; QStringListModel* m_groupFilterModel; }; From f5fcb274fbf5b3e7daf4301b04cbe1ce1f9935e7 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sun, 31 Jan 2021 01:23:20 +0100 Subject: [PATCH 11/21] Remove debug code. --- plugins/carlabase/carla.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index aa7438d600d..eb065cf9305 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -51,7 +51,6 @@ #include #include #include -#include #include @@ -321,10 +320,8 @@ intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opco refreshParams(); break; case NATIVE_HOST_OPCODE_UPDATE_PARAMETER: - qDebug() << "CarlaInstrument::handleDispatcher NATIVE_HOST_OPCODE_UPDATE_PARAMETER"; break; case NATIVE_HOST_OPCODE_RELOAD_PARAMETERS: - qDebug() << "CarlaInstrument::handleDispatcher NATIVE_HOST_OPCODE_RELOAD_PARAMETERS"; refreshParams(); break; case NATIVE_HOST_OPCODE_UPDATE_MIDI_PROGRAM: From 305bc02ccb15cc636bec2121809febfda0110331 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sun, 31 Jan 2021 16:11:28 +0100 Subject: [PATCH 12/21] Fix fatal typo --- plugins/carlabase/carla.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index eb065cf9305..6a45da4f75e 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -1002,7 +1002,7 @@ void CarlaParamsView::refreshKnobs() uint8_t groupId = m_carlaInstrument->m_paramModels[i]->groupId(); if (m_maxKnobWidthPerGroup[groupId] < m_knobs[i]->width()) { - m_maxKnobWidthPerGroup[groupId] = (m_knobs[i]->width() + m_inputScrollAreaLayout->spacing(); + m_maxKnobWidthPerGroup[groupId] = m_knobs[i]->width() + m_inputScrollAreaLayout->spacing(); } } } From fececb590f6f3d7c422899276df59518d9a295b9 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Sat, 27 Mar 2021 00:06:08 +0100 Subject: [PATCH 13/21] Address some minor [naming] coding conventions issues. --- plugins/carlabase/carla.cpp | 14 +++++--------- plugins/carlabase/carla.h | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 6a45da4f75e..3004e415d95 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -386,21 +386,17 @@ void CarlaInstrument::refreshParams(bool init) fDescriptor->get_parameter_value != nullptr && fDescriptor->set_parameter_value != nullptr) { - uint32_t param_count = fDescriptor->get_parameter_count(fHandle); - QList completerData; QList groups; // used to count no. groups. - for (uint32_t i=0; i < param_count; ++i) + uint32_t paramCount = fDescriptor->get_parameter_count(fHandle); + for (uint32_t i=0; i < paramCount; ++i) { const NativeParameter* paramInfo(fDescriptor->get_parameter_info(fHandle, i)); m_paramModels[i]->setOutput((paramInfo->hints & NATIVE_PARAMETER_IS_OUTPUT)); m_paramModels[i]->setEnabled((paramInfo->hints & NATIVE_PARAMETER_IS_ENABLED)); - - float param_value = fDescriptor->get_parameter_value(fHandle, i); - - m_paramModels[i]->setValue(param_value); + m_paramModels[i]->setValue(fDescriptor->get_parameter_value(fHandle, i)); // Get parameter name QString name = "_NO_NAME_"; @@ -604,7 +600,7 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid fDescriptor(instrument->fDescriptor), fTimerId(fHandle != NULL && fDescriptor->ui_idle != NULL ? startTimer(30) : 0), m_carlaInstrument(instrument), - p_parent(parent), + m_parent(parent), m_paramsSubWindow(nullptr), m_paramsView(nullptr) { @@ -703,7 +699,7 @@ void CarlaInstrumentView::toggleParamsWindow() { if (!m_paramsSubWindow) { - m_paramsView = new CarlaParamsView(this, p_parent); + m_paramsView = new CarlaParamsView(this, m_parent); connect(m_paramsSubWindow, SIGNAL(uiClosed()), this, SLOT(paramsUiClosed())); } else { if (m_paramsSubWindow->isVisible()) { diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index d70c65e2a43..d9c2cc8a1a2 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -301,7 +301,7 @@ private slots: int fTimerId; CarlaInstrument* const m_carlaInstrument; - QWidget* const p_parent; + QWidget* const m_parent; QMdiSubWindow* m_paramsSubWindow; CarlaParamsView* m_paramsView; From 73d9e268a29b9850556150f767b8d64d3f61cac1 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Wed, 9 Jun 2021 13:50:59 +0200 Subject: [PATCH 14/21] Remove the +1, it was left-over from experimenting. --- plugins/carlabase/carla.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 3004e415d95..dfeaca4ca63 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -200,7 +200,7 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D // Add static amount of CarlaParamFloatModel's. int paramCount = fDescriptor->get_parameter_count(fHandle); - m_paramModels.reserve(paramCount+1); + m_paramModels.reserve(paramCount); for (int i=0; i < paramCount; ++i) { m_paramModels.push_back(new CarlaParamFloatModel(this)); From 25fb33b7fde34fe509e723a6fd546a35272c6640 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Wed, 9 Jun 2021 15:26:27 +0200 Subject: [PATCH 15/21] Fix the calculation of how many knobs will fit in a row. + Renamed 'maxWidth' to 'maxKnobWidth' 'cause that's what it is. --- plugins/carlabase/carla.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index dfeaca4ca63..7d67cb3b655 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -892,15 +892,16 @@ void CarlaParamsView::filterKnobs() return; } - uint16_t maxWidth = m_maxKnobWidthPerGroup[m_groupFilterCombo->currentIndex()]; - if (!maxWidth) { + // Calc how many knobs will fit horizontal in the params window. + uint16_t maxKnobWidth = m_maxKnobWidthPerGroup[m_groupFilterCombo->currentIndex()]; + maxKnobWidth += m_inputScrollAreaLayout->spacing(); + if (!maxKnobWidth) { // Prevent possible division by zero. return; } + m_maxColumns = m_inputScrollArea->width() / maxKnobWidth; - m_maxColumns = (m_inputScrollArea->width() / maxWidth); QString text = m_paramsFilterLineEdit->text(); - for (uint32_t i=0; i < m_knobs.count(); ++i) { // Don't show disabled (unused) knobs. @@ -998,7 +999,7 @@ void CarlaParamsView::refreshKnobs() uint8_t groupId = m_carlaInstrument->m_paramModels[i]->groupId(); if (m_maxKnobWidthPerGroup[groupId] < m_knobs[i]->width()) { - m_maxKnobWidthPerGroup[groupId] = m_knobs[i]->width() + m_inputScrollAreaLayout->spacing(); + m_maxKnobWidthPerGroup[groupId] = m_knobs[i]->width(); } } } From c17494bddcfd484a8e7aaf03c71ae7ef33096da0 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Wed, 9 Jun 2021 15:55:06 +0200 Subject: [PATCH 16/21] Make sure param models are deleted in instrument destructor. --- plugins/carlabase/carla.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 7d67cb3b655..0407c953b7a 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -240,9 +240,7 @@ CarlaInstrument::~CarlaInstrument() fHandle = NULL; #if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION - if (!m_paramModels.isEmpty()) { - m_paramModels.clear(); - } + clearKnobModels(); #endif } From ac6b42eb2e67db704b783eddc24a8bcaa98582b6 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Wed, 9 Jun 2021 16:06:05 +0200 Subject: [PATCH 17/21] Renaming of some methods and members from *knob* to *param* for consistency. Methods: - CarlaInstrument::clearKnobModels() to CarlaInstrument::clearParamModels() - CarlaInstrument::knobModelChanged() to CarlaInstrument::paramModelChanged() - CarlaInstrument::updateKnobModel() to CarlaInstrument::updateParamModel() Members: - m_knobGroupCount to m_paramGroupCount --- plugins/carlabase/carla.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 0407c953b7a..eeef149bf84 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -205,7 +205,7 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D { m_paramModels.push_back(new CarlaParamFloatModel(this)); connect(m_paramModels[i], &CarlaParamFloatModel::dataChanged, - this, [=]() {knobModelChanged(i);}, Qt::DirectConnection); + this, [=]() {paramModelChanged(i);}, Qt::DirectConnection); } #endif @@ -240,7 +240,7 @@ CarlaInstrument::~CarlaInstrument() fHandle = NULL; #if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION - clearKnobModels(); + clearParamModels(); #endif } @@ -311,7 +311,7 @@ intptr_t CarlaInstrument::handleDispatcher(const NativeHostDispatcherOpcode opco // true = mousePress // false = mouseRelease if (!value) { - updateKnobModel(index); + updateParamModel(index); } break; case NATIVE_HOST_OPCODE_RELOAD_ALL: @@ -378,7 +378,7 @@ void CarlaInstrument::saveSettings(QDomDocument& doc, QDomElement& parent) void CarlaInstrument::refreshParams(bool init) { - m_knobGroupCount = 0; + m_paramGroupCount = 0; if (fDescriptor->get_parameter_count != nullptr && fDescriptor->get_parameter_info != nullptr && fDescriptor->get_parameter_value != nullptr && @@ -407,7 +407,7 @@ void CarlaInstrument::refreshParams(bool init) if (m_paramModels[i]->enabled() && !groups.contains(paramInfo->groupName)) { groups.push_back(paramInfo->groupName); - m_knobGroupCount++; + m_paramGroupCount++; } m_paramModels[i]->setGroupId(groups.indexOf(paramInfo->groupName)); } @@ -432,7 +432,7 @@ void CarlaInstrument::refreshParams(bool init) emit paramsUpdated(); } -void CarlaInstrument::clearKnobModels(){ +void CarlaInstrument::clearParamModels(){ //Delete the models, this also disconnects all connections (automation and controller connections) for (uint32_t index=0; index < m_paramModels.count(); ++index) { @@ -442,10 +442,10 @@ void CarlaInstrument::clearKnobModels(){ //Clear the list m_paramModels.clear(); - m_knobGroupCount = 0; + m_paramGroupCount = 0; } -void CarlaInstrument::knobModelChanged(uint32_t index) +void CarlaInstrument::paramModelChanged(uint32_t index) { // Update Carla param (LMMS -> Carla) if (!m_paramModels[index]->isOutput()){ if (fDescriptor->set_parameter_value != nullptr){ @@ -460,7 +460,7 @@ void CarlaInstrument::knobModelChanged(uint32_t index) } } -void CarlaInstrument::updateKnobModel(uint32_t index) +void CarlaInstrument::updateParamModel(uint32_t index) { // Called on param changed (Carla -> LMMS) if (fDescriptor->get_parameter_value != nullptr){ m_paramModels[index]->setValue( @@ -873,7 +873,7 @@ CarlaParamsView::~CarlaParamsView() // Clear models if (m_carlaInstrument->m_paramModels.isEmpty() == false) { - m_carlaInstrument->clearKnobModels(); + m_carlaInstrument->clearParamModels(); } } @@ -886,7 +886,7 @@ void CarlaParamsView::filterKnobs() { clearKnobs(); // Remove all knobs from the layout. - if (!m_carlaInstrument->m_knobGroupCount) { + if (!m_carlaInstrument->m_paramGroupCount) { return; } @@ -958,8 +958,8 @@ void CarlaParamsView::refreshKnobs() // Clear max knob width per group m_maxKnobWidthPerGroup.clear(); - m_maxKnobWidthPerGroup.reserve(m_carlaInstrument->m_knobGroupCount); - for (uint8_t i = 0; i < m_carlaInstrument->m_knobGroupCount; i++) { + m_maxKnobWidthPerGroup.reserve(m_carlaInstrument->m_paramGroupCount); + for (uint8_t i = 0; i < m_carlaInstrument->m_paramGroupCount; i++) { m_maxKnobWidthPerGroup[i] = 0; } @@ -969,7 +969,7 @@ void CarlaParamsView::refreshKnobs() m_knobs.reserve(m_carlaInstrument->m_paramModels.count()); QStringList groupNameList; - groupNameList.reserve(m_carlaInstrument->m_knobGroupCount); + groupNameList.reserve(m_carlaInstrument->m_paramGroupCount); for (uint32_t i=0; i < m_carlaInstrument->m_paramModels.count(); ++i) { From 2ff65b20973202c89ad9ba4a82b178b85a2593e5 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Wed, 9 Jun 2021 16:07:51 +0200 Subject: [PATCH 18/21] Forgot to add carla.h in the previous commit. --- plugins/carlabase/carla.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/carlabase/carla.h b/plugins/carlabase/carla.h index d9c2cc8a1a2..6de8e3379a0 100644 --- a/plugins/carlabase/carla.h +++ b/plugins/carlabase/carla.h @@ -246,9 +246,9 @@ class CARLABASE_EXPORT CarlaInstrument : public Instrument private slots: void sampleRateChanged(); void refreshParams(bool init = false); - void clearKnobModels(); - void knobModelChanged(uint32_t index); - void updateKnobModel(uint32_t index); + void clearParamModels(); + void paramModelChanged(uint32_t index); + void updateParamModel(uint32_t index); private: const bool kIsPatchbay; @@ -264,7 +264,7 @@ private slots: // this is only needed because note-offs are being sent during play QMutex fMutex; - uint8_t m_knobGroupCount; + uint8_t m_paramGroupCount; QList m_paramModels; QDomElement m_settingsElem; From a2c6d95957f7f59147ffece6e128fc96447a2443 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Wed, 9 Jun 2021 16:14:19 +0200 Subject: [PATCH 19/21] Code style blocking. --- plugins/carlabase/carla.cpp | 64 ++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index eeef149bf84..8da88b55d88 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -398,14 +398,17 @@ void CarlaInstrument::refreshParams(bool init) // Get parameter name QString name = "_NO_NAME_"; - if (paramInfo->name != nullptr){ + if (paramInfo->name != nullptr) + { name = paramInfo->name; } - if (paramInfo->groupName != nullptr){ + if (paramInfo->groupName != nullptr) + { m_paramModels[i]->setGroupName(paramInfo->groupName); - if (m_paramModels[i]->enabled() && !groups.contains(paramInfo->groupName)) { + if (m_paramModels[i]->enabled() && !groups.contains(paramInfo->groupName)) + { groups.push_back(paramInfo->groupName); m_paramGroupCount++; } @@ -432,7 +435,8 @@ void CarlaInstrument::refreshParams(bool init) emit paramsUpdated(); } -void CarlaInstrument::clearParamModels(){ +void CarlaInstrument::clearParamModels() +{ //Delete the models, this also disconnects all connections (automation and controller connections) for (uint32_t index=0; index < m_paramModels.count(); ++index) { @@ -447,14 +451,17 @@ void CarlaInstrument::clearParamModels(){ void CarlaInstrument::paramModelChanged(uint32_t index) { // Update Carla param (LMMS -> Carla) - if (!m_paramModels[index]->isOutput()){ - if (fDescriptor->set_parameter_value != nullptr){ + if (!m_paramModels[index]->isOutput()) + { + if (fDescriptor->set_parameter_value != nullptr) + { fDescriptor->set_parameter_value(fHandle, index, m_paramModels[index]->value()); } // TODO? Shouldn't Carla be doing this? - if (fDescriptor->ui_set_parameter_value != nullptr){ + if (fDescriptor->ui_set_parameter_value != nullptr) + { fDescriptor->ui_set_parameter_value(fHandle, index, m_paramModels[index]->value()); } } @@ -462,7 +469,8 @@ void CarlaInstrument::paramModelChanged(uint32_t index) void CarlaInstrument::updateParamModel(uint32_t index) { // Called on param changed (Carla -> LMMS) - if (fDescriptor->get_parameter_value != nullptr){ + if (fDescriptor->get_parameter_value != nullptr) + { m_paramModels[index]->setValue( fDescriptor->get_parameter_value(fHandle, index) ); @@ -648,10 +656,13 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid CarlaInstrumentView::~CarlaInstrumentView() { if (m_toggleUIButton->isChecked()) + { toggleUI(false); + } #if CARLA_VERSION_HEX >= CARLA_MIN_PARAM_VERSION - if (m_paramsView) { + if (m_paramsView) + { delete m_paramsView; m_paramsView = nullptr; } @@ -699,10 +710,15 @@ void CarlaInstrumentView::toggleParamsWindow() { m_paramsView = new CarlaParamsView(this, m_parent); connect(m_paramsSubWindow, SIGNAL(uiClosed()), this, SLOT(paramsUiClosed())); - } else { - if (m_paramsSubWindow->isVisible()) { + } + else + { + if (m_paramsSubWindow->isVisible()) + { m_paramsSubWindow->hide(); - } else { + } + else + { m_paramsSubWindow->show(); } } @@ -886,14 +902,16 @@ void CarlaParamsView::filterKnobs() { clearKnobs(); // Remove all knobs from the layout. - if (!m_carlaInstrument->m_paramGroupCount) { + if (!m_carlaInstrument->m_paramGroupCount) + { return; } // Calc how many knobs will fit horizontal in the params window. uint16_t maxKnobWidth = m_maxKnobWidthPerGroup[m_groupFilterCombo->currentIndex()]; maxKnobWidth += m_inputScrollAreaLayout->spacing(); - if (!maxKnobWidth) { + if (!maxKnobWidth) + { // Prevent possible division by zero. return; } @@ -930,7 +948,9 @@ void CarlaParamsView::filterKnobs() { addKnob(i); } - } else { + } + else + { addKnob(i); } } @@ -959,7 +979,8 @@ void CarlaParamsView::refreshKnobs() // Clear max knob width per group m_maxKnobWidthPerGroup.clear(); m_maxKnobWidthPerGroup.reserve(m_carlaInstrument->m_paramGroupCount); - for (uint8_t i = 0; i < m_carlaInstrument->m_paramGroupCount; i++) { + for (uint8_t i = 0; i < m_carlaInstrument->m_paramGroupCount; i++) + { m_maxKnobWidthPerGroup[i] = 0; } @@ -1012,7 +1033,8 @@ void CarlaParamsView::refreshKnobs() } -void CarlaParamsView::windowResized() { +void CarlaParamsView::windowResized() +{ filterKnobs(); } @@ -1029,7 +1051,9 @@ void CarlaParamsView::addKnob(uint32_t index) if (m_curOutColumn < m_maxColumns - 1) { m_curOutColumn++; - } else { + } + else + { m_curOutColumn = 0; m_curOutRow++; } @@ -1047,7 +1071,9 @@ void CarlaParamsView::addKnob(uint32_t index) if (m_curColumn < m_maxColumns - 1) { m_curColumn++; - } else { + } + else + { m_curColumn = 0; m_curRow++; } From 49e91a39fb6e8b1e80cb31d4b6197b82888bb5a9 Mon Sep 17 00:00:00 2001 From: CYBERDEViL Date: Wed, 9 Jun 2021 16:18:54 +0200 Subject: [PATCH 20/21] Code style pointers --- plugins/carlabase/carla.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 8da88b55d88..77d4a944a31 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -616,7 +616,7 @@ CarlaInstrumentView::CarlaInstrumentView(CarlaInstrument* const instrument, QWid pal.setBrush(backgroundRole(), instrument->kIsPatchbay ? PLUGIN_NAME::getIconPixmap("artwork-patchbay") : PLUGIN_NAME::getIconPixmap("artwork-rack")); setPalette(pal); - QHBoxLayout * l = new QHBoxLayout(this); + QHBoxLayout* l = new QHBoxLayout(this); l->setContentsMargins( 20, 180, 10, 10 ); l->setSpacing(3); l->setAlignment(Qt::AlignTop); @@ -785,9 +785,9 @@ CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWid m_toolBarLayout->addWidget(m_groupFilterCombo); // -- Input params - QFrame * inputFrame = new QFrame(this); + QFrame* inputFrame = new QFrame(this); QVBoxLayout* inputLayout = new QVBoxLayout(inputFrame); - QLabel * inputLabel = new QLabel("Input parameters", inputFrame); + QLabel* inputLabel = new QLabel("Input parameters", inputFrame); m_inputScrollArea = new QScrollArea(inputFrame); m_inputScrollAreaWidgetContent = new QWidget(); @@ -811,9 +811,9 @@ CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWid inputLayout->addWidget(m_inputScrollArea); // -- Output params - QFrame * outputFrame = new QFrame(this); + QFrame* outputFrame = new QFrame(this); QVBoxLayout* outputLayout = new QVBoxLayout(outputFrame); - QLabel * outputLabel = new QLabel("Output parameters", outputFrame); + QLabel* outputLabel = new QLabel("Output parameters", outputFrame); m_outputScrollArea = new QScrollArea(outputFrame); m_outputScrollAreaWidgetContent = new QWidget(); @@ -837,7 +837,7 @@ CarlaParamsView::CarlaParamsView(CarlaInstrumentView* const instrumentView, QWid outputLayout->addWidget(m_outputScrollArea); // -- QSplitter - QSplitter * splitter = new QSplitter(Qt::Vertical, this); + QSplitter* splitter = new QSplitter(Qt::Vertical, this); // -- Add layout and widgets. verticalLayout->addLayout(m_toolBarLayout); @@ -1088,7 +1088,7 @@ void CarlaParamsView::clearKnobs() } // Remove spacers - QLayoutItem * item; + QLayoutItem* item; for (int16_t i=m_inputScrollAreaLayout->count() - 1; i > 0; i--) { item = m_inputScrollAreaLayout->takeAt(i); From ffd4662e59122de12fb4cf73f9c31cd73ca83d0b Mon Sep 17 00:00:00 2001 From: Johannes Lorenz Date: Tue, 22 Jun 2021 20:47:44 +0200 Subject: [PATCH 21/21] Fix lambda capture after review --- plugins/carlabase/carla.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/carlabase/carla.cpp b/plugins/carlabase/carla.cpp index 77d4a944a31..ce651d86eb5 100644 --- a/plugins/carlabase/carla.cpp +++ b/plugins/carlabase/carla.cpp @@ -205,7 +205,7 @@ CarlaInstrument::CarlaInstrument(InstrumentTrack* const instrumentTrack, const D { m_paramModels.push_back(new CarlaParamFloatModel(this)); connect(m_paramModels[i], &CarlaParamFloatModel::dataChanged, - this, [=]() {paramModelChanged(i);}, Qt::DirectConnection); + this, [this, i]() {paramModelChanged(i);}, Qt::DirectConnection); } #endif