diff --git a/companion/src/firmwares/CMakeLists.txt b/companion/src/firmwares/CMakeLists.txt index 772cb62ff..e50d9241b 100644 --- a/companion/src/firmwares/CMakeLists.txt +++ b/companion/src/firmwares/CMakeLists.txt @@ -39,7 +39,7 @@ set(firmwares_QT qt5_wrap_cpp(firmwares_SRCS ${firmwares_QT}) add_library(firmwares ${firmwares_SRCS} ${firmwares_HDRS}) -target_link_libraries(firmwares ${CPN_COMMON_LIB} Qt5::Core Qt5::Xml Qt5::Widgets) +target_link_libraries(firmwares ${CPN_COMMON_LIB} datamodels Qt5::Core Qt5::Xml Qt5::Widgets) target_include_directories(firmwares PRIVATE ${CMAKE_SOURCE_DIR} diff --git a/companion/src/firmwares/curvereference.cpp b/companion/src/firmwares/curvereference.cpp index 820386754..449dc0266 100644 --- a/companion/src/firmwares/curvereference.cpp +++ b/companion/src/firmwares/curvereference.cpp @@ -22,6 +22,7 @@ #include "adjustmentreference.h" #include "helpers.h" #include "modeldata.h" +#include "rawitemfilteredmodel.h" const QString CurveReference::toString(const ModelData * model, bool verbose) const { @@ -109,11 +110,14 @@ constexpr int CURVE_REF_UI_HIDE_NEGATIVE_CURVES { 0x04 }; // static bool CurveReferenceUIManager::firsttime { true }; -int CurveReferenceUIManager::flags{ 0 }; -bool CurveReferenceUIManager::hasCapabilityGvars{ false }; -int CurveReferenceUIManager::numCurves{ 0 }; +int CurveReferenceUIManager::flags { 0 }; +bool CurveReferenceUIManager::hasCapabilityGvars { false }; +int CurveReferenceUIManager::numCurves { 0 }; +RawItemFilteredModel * CurveReferenceUIManager::curveItemModel { nullptr }; +QStandardItemModel * CurveReferenceUIManager::tempModel { nullptr }; -CurveReferenceUIManager::CurveReferenceUIManager(QComboBox * curveValueCB, CurveReference & curve, const ModelData & model, QObject * parent) : +CurveReferenceUIManager::CurveReferenceUIManager(QComboBox * curveValueCB, CurveReference & curve, const ModelData & model, + RawItemFilteredModel * curveItemModel, QObject * parent) : QObject(parent), curveTypeCB(nullptr), curveGVarCB(nullptr), @@ -123,11 +127,12 @@ CurveReferenceUIManager::CurveReferenceUIManager(QComboBox * curveValueCB, Curve model(model), lock(false) { - init(); + init(curveItemModel); } -CurveReferenceUIManager::CurveReferenceUIManager(QComboBox * curveTypeCB, QCheckBox * curveGVarCB, QSpinBox * curveValueSB, QComboBox * curveValueCB, - CurveReference & curve, const ModelData & model, QObject * parent) : +CurveReferenceUIManager::CurveReferenceUIManager(QComboBox * curveTypeCB, QCheckBox * curveGVarCB, QSpinBox * curveValueSB, + QComboBox * curveValueCB, CurveReference & curve, const ModelData & model, + RawItemFilteredModel * curveItemModel, QObject * parent) : QObject(parent), curveTypeCB(curveTypeCB), curveGVarCB(curveGVarCB), @@ -137,20 +142,24 @@ CurveReferenceUIManager::CurveReferenceUIManager(QComboBox * curveTypeCB, QCheck model(model), lock(false) { - init(); + init(curveItemModel); } CurveReferenceUIManager::~CurveReferenceUIManager() { + delete tempModel; } -void CurveReferenceUIManager::init() +void CurveReferenceUIManager::init(RawItemFilteredModel * curveModel) { + tempModel = new QStandardItemModel(); + if (firsttime) { firsttime = false; Firmware * fw = getCurrentFirmware(); hasCapabilityGvars = fw->getCapability(Gvars); numCurves = fw->getCapability(NumCurves); + curveItemModel = curveModel; if (!fw->getCapability(HasInputDiff)) flags |= (CURVE_REF_UI_HIDE_DIFF | CURVE_REF_UI_HIDE_NEGATIVE_CURVES); @@ -276,23 +285,22 @@ void CurveReferenceUIManager::populateTypeCB(QComboBox * cb, const CurveReferenc void CurveReferenceUIManager::populateValueCB(QComboBox * cb, const CurveReference & curveRef, const ModelData * model) { if (cb) { - cb->clear(); + cb->setModel(tempModel); // do not want to clear/alter the shared curves model and set to nullptr is invalid switch (curveRef.type) { case CurveReference::CURVE_REF_DIFF: case CurveReference::CURVE_REF_EXPO: + cb->clear(); Helpers::populateGVCB(*cb, curveRef.value, *model); break; case CurveReference::CURVE_REF_FUNC: + cb->clear(); for (int i = 1; i <= MAX_CURVE_REF_FUNC; i++) { cb->addItem(CurveReference::functionToString(i), i); } break; case CurveReference::CURVE_REF_CUSTOM: - // TODO replace with ui datamodel - for (int i = ((flags & CURVE_REF_UI_HIDE_NEGATIVE_CURVES) ? 0 : -numCurves); i <= numCurves; i++) { - cb->addItem(CurveReference(CurveReference::CURVE_REF_CUSTOM, i).toString(model, false), i); - } + cb->setModel(curveItemModel); break; default: break; diff --git a/companion/src/firmwares/curvereference.h b/companion/src/firmwares/curvereference.h index d8b337914..0a1c7a180 100644 --- a/companion/src/firmwares/curvereference.h +++ b/companion/src/firmwares/curvereference.h @@ -25,9 +25,11 @@ #include #include #include +#include class ModelData; +class RawItemFilteredModel; class CurveReference { @@ -83,11 +85,12 @@ class CurveReferenceUIManager : public QObject { Q_OBJECT public: - CurveReferenceUIManager(QComboBox *curveValueCB, CurveReference & curve, const ModelData & model, QObject * parent = nullptr); + CurveReferenceUIManager(QComboBox *curveValueCB, CurveReference & curve, const ModelData & model, + RawItemFilteredModel * curveItemModel, QObject * parent = nullptr); CurveReferenceUIManager(QComboBox *curveTypeCB, QCheckBox *curveGVarCB, QSpinBox *curveValueSB, QComboBox *curveValueCB, - CurveReference & curve, const ModelData & model, QObject * parent = nullptr); + CurveReference & curve, const ModelData & model, RawItemFilteredModel * curveItemModel, QObject * parent = nullptr); virtual ~CurveReferenceUIManager(); - void init(); + void init(RawItemFilteredModel * curveModel); void update(); protected slots: @@ -109,6 +112,8 @@ class CurveReferenceUIManager : public QObject { static int flags; static bool hasCapabilityGvars; static int numCurves; + static RawItemFilteredModel * curveItemModel; + static QStandardItemModel * tempModel; static void populateTypeCB(QComboBox * cb, const CurveReference & curveRef); static void populateValueCB(QComboBox * cb, const CurveReference & curveRef, const ModelData * model = nullptr); diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index f239886ef..afebbeb27 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -25,7 +25,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, GeneralSettings & generalSettings, Firmware * firmware, QString & inputName, RawItemFilteredModel * rawSourceModel, - RawItemFilteredModel * rawSwitchModel) : + RawItemFilteredModel * rawSwitchModel, RawItemFilteredModel * curveItemModel) : QDialog(parent), ui(new Ui::ExpoDialog), model(model), @@ -50,7 +50,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G gvWeightGroup = new GVarGroup(ui->weightGV, ui->weightSB, ui->weightCB, ed->weight, model, 100, -100, 100); gvOffsetGroup = new GVarGroup(ui->offsetGV, ui->offsetSB, ui->offsetCB, ed->offset, model, 0, -100, 100); - curveGroup = new CurveReferenceUIManager(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueSB, ui->curveValueCB, ed->curve, model, this); + curveGroup = new CurveReferenceUIManager(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueSB, ui->curveValueCB, ed->curve, model, curveItemModel, this); ui->switchesCB->setModel(rawSwitchModel); ui->switchesCB->setCurrentIndex(ui->switchesCB->findData(ed->swtch.toValue())); diff --git a/companion/src/modeledit/expodialog.h b/companion/src/modeledit/expodialog.h index f7155bef9..b77d55852 100644 --- a/companion/src/modeledit/expodialog.h +++ b/companion/src/modeledit/expodialog.h @@ -38,7 +38,7 @@ class ExpoDialog : public QDialog { public: ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expodata, GeneralSettings & generalSettings, Firmware * firmware, QString & inputName, RawItemFilteredModel * rawSourceItemModel, - RawItemFilteredModel * rawSwitchItemModel); + RawItemFilteredModel * rawSwitchItemModel, RawItemFilteredModel * curveItemModel); ~ExpoDialog(); protected: diff --git a/companion/src/modeledit/inputs.cpp b/companion/src/modeledit/inputs.cpp index f50797260..ee2347aee 100644 --- a/companion/src/modeledit/inputs.cpp +++ b/companion/src/modeledit/inputs.cpp @@ -37,6 +37,10 @@ InputsPanel::InputsPanel(QWidget *parent, ModelData & model, GeneralSettings & g connect(rawSwitchFilteredModel, &RawItemFilteredModel::dataAboutToBeUpdated, this, &InputsPanel::onModelDataAboutToBeUpdated); connect(rawSwitchFilteredModel, &RawItemFilteredModel::dataUpdateComplete, this, &InputsPanel::onModelDataUpdateComplete); + curveFilteredModel = new RawItemFilteredModel(commonItemModels->curveItemModel(), RawItemFilteredModel::AllFilter, this); + connect(curveFilteredModel, &RawItemFilteredModel::dataAboutToBeUpdated, this, &InputsPanel::onModelDataAboutToBeUpdated); + connect(curveFilteredModel, &RawItemFilteredModel::dataUpdateComplete, this, &InputsPanel::onModelDataUpdateComplete); + inputsCount = firmware->getCapability(VirtualInputs); if (inputsCount == 0) inputsCount = CPN_MAX_STICKS; @@ -190,7 +194,7 @@ void InputsPanel::gm_openExpo(int index) if (firmware->getCapability(VirtualInputs)) inputName = model->inputNames[ed.chn]; - ExpoDialog *dlg = new ExpoDialog(this, *model, &ed, generalSettings, firmware, inputName, rawSourceFilteredModel, rawSwitchFilteredModel); + ExpoDialog *dlg = new ExpoDialog(this, *model, &ed, generalSettings, firmware, inputName, rawSourceFilteredModel, rawSwitchFilteredModel, curveFilteredModel); if (dlg->exec()) { model->expoData[index] = ed; if (firmware->getCapability(VirtualInputs)) diff --git a/companion/src/modeledit/inputs.h b/companion/src/modeledit/inputs.h index 436d61278..ea1243213 100644 --- a/companion/src/modeledit/inputs.h +++ b/companion/src/modeledit/inputs.h @@ -75,6 +75,7 @@ class InputsPanel : public ModelPanel CommonItemModels * commonItemModels; RawItemFilteredModel *rawSourceFilteredModel; RawItemFilteredModel *rawSwitchFilteredModel; + RawItemFilteredModel *curveFilteredModel; int getExpoIndex(unsigned int dch); bool gm_insertExpo(int idx); diff --git a/companion/src/modeledit/mixerdialog.cpp b/companion/src/modeledit/mixerdialog.cpp index 5b5acbd29..00d2badc8 100644 --- a/companion/src/modeledit/mixerdialog.cpp +++ b/companion/src/modeledit/mixerdialog.cpp @@ -25,7 +25,7 @@ #include "helpers.h" MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, GeneralSettings & generalSettings, Firmware * firmware, - RawItemFilteredModel * rawSourceModel, RawItemFilteredModel * rawSwitchModel) : + RawItemFilteredModel * rawSourceModel, RawItemFilteredModel * rawSwitchModel, RawItemFilteredModel * curveItemModel) : QDialog(parent), ui(new Ui::MixerDialog), model(model), @@ -52,7 +52,7 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, gvWeightGroup = new GVarGroup(ui->weightGV, ui->weightSB, ui->weightCB, md->weight, model, 100, -limit, limit); gvOffsetGroup = new GVarGroup(ui->offsetGV, ui->offsetSB, ui->offsetCB, md->sOffset, model, 0, -limit, limit); - curveGroup = new CurveReferenceUIManager(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueSB, ui->curveValueCB, md->curve, model, this); + curveGroup = new CurveReferenceUIManager(ui->curveTypeCB, ui->curveGVarCB, ui->curveValueSB, ui->curveValueCB, md->curve, model, curveItemModel, this); ui->MixDR_CB->setChecked(md->noExpo == 0); diff --git a/companion/src/modeledit/mixerdialog.h b/companion/src/modeledit/mixerdialog.h index 0a1ad10b0..6d2131de2 100644 --- a/companion/src/modeledit/mixerdialog.h +++ b/companion/src/modeledit/mixerdialog.h @@ -36,7 +36,7 @@ class MixerDialog : public QDialog { Q_OBJECT public: MixerDialog(QWidget *parent, ModelData & model, MixData *mixdata, GeneralSettings & generalSettings, Firmware * firmware, - RawItemFilteredModel * rawSourceModel, RawItemFilteredModel * rawSwitchModel); + RawItemFilteredModel * rawSourceModel, RawItemFilteredModel * rawSwitchModel, RawItemFilteredModel * curveItemModel); ~MixerDialog(); protected: diff --git a/companion/src/modeledit/mixes.cpp b/companion/src/modeledit/mixes.cpp index 1e2097fe9..f02a57417 100644 --- a/companion/src/modeledit/mixes.cpp +++ b/companion/src/modeledit/mixes.cpp @@ -37,6 +37,10 @@ MixesPanel::MixesPanel(QWidget *parent, ModelData & model, GeneralSettings & gen connect(rawSwitchFilteredModel, &RawItemFilteredModel::dataAboutToBeUpdated, this, &MixesPanel::onModelDataAboutToBeUpdated); connect(rawSwitchFilteredModel, &RawItemFilteredModel::dataUpdateComplete, this, &MixesPanel::onModelDataUpdateComplete); + curveFilteredModel = new RawItemFilteredModel(commonItemModels->curveItemModel(), RawItemFilteredModel::AllFilter, this); + connect(curveFilteredModel, &RawItemFilteredModel::dataAboutToBeUpdated, this, &MixesPanel::onModelDataAboutToBeUpdated); + connect(curveFilteredModel, &RawItemFilteredModel::dataUpdateComplete, this, &MixesPanel::onModelDataUpdateComplete); + QGridLayout * mixesLayout = new QGridLayout(this); mixersListWidget = new MixersListWidget(this, false); // TODO enum @@ -185,7 +189,7 @@ void MixesPanel::gm_openMix(int index) MixData mixd(model->mixData[index]); - MixerDialog *dlg = new MixerDialog(this, *model, &mixd, generalSettings, firmware, rawSourceFilteredModel, rawSwitchFilteredModel); + MixerDialog *dlg = new MixerDialog(this, *model, &mixd, generalSettings, firmware, rawSourceFilteredModel, rawSwitchFilteredModel, curveFilteredModel); if(dlg->exec()) { model->mixData[index] = mixd; emit modified(); diff --git a/companion/src/modeledit/mixes.h b/companion/src/modeledit/mixes.h index cba4ed556..014786b74 100644 --- a/companion/src/modeledit/mixes.h +++ b/companion/src/modeledit/mixes.h @@ -71,6 +71,7 @@ class MixesPanel : public ModelPanel CommonItemModels * commonItemModels; RawItemFilteredModel *rawSourceFilteredModel; RawItemFilteredModel *rawSwitchFilteredModel; + RawItemFilteredModel *curveFilteredModel; int getMixerIndex(unsigned int dch); bool gm_insertMix(int idx);