diff --git a/companion/src/helpers.cpp b/companion/src/helpers.cpp index bb6e7da4c..62ced5a75 100644 --- a/companion/src/helpers.cpp +++ b/companion/src/helpers.cpp @@ -465,85 +465,6 @@ void Helpers::getFileComboBoxValue(QComboBox * b, char * dest, int length) } } -void Helpers::addRawSourceItems(QStandardItemModel * itemModel, const RawSourceType & type, int count, const GeneralSettings * const generalSettings, - const ModelData * const model, const int start) -{ - for (int i = start; i < start + count; i++) { - RawSource src = RawSource(type, i); - if (!src.isAvailable(model, generalSettings, getCurrentBoard())) - continue; - - QStandardItem * modelItem = new QStandardItem(src.toString(model, generalSettings)); - modelItem->setData(src.toValue(), Qt::UserRole); - itemModel->appendRow(modelItem); - } -} - -QStandardItemModel * Helpers::getRawSourceItemModel(const GeneralSettings * const generalSettings, const ModelData * const model, unsigned int flags) -{ - QStandardItemModel * itemModel = new QStandardItemModel(); - Boards board = Boards(getCurrentBoard()); - Firmware * fw = getCurrentFirmware(); - - if (flags & POPULATE_NONE) { - addRawSourceItems(itemModel, SOURCE_TYPE_NONE, 1, generalSettings, model); - } - - if (flags & POPULATE_SCRIPT_OUTPUTS) { - for (int i=0; i < getCurrentFirmware()->getCapability(LuaScripts); i++) { - addRawSourceItems(itemModel, SOURCE_TYPE_LUA_OUTPUT, fw->getCapability(LuaOutputsPerScript), generalSettings, model, i * 16); - } - } - - if (model && (flags & POPULATE_VIRTUAL_INPUTS)) { - addRawSourceItems(itemModel, SOURCE_TYPE_VIRTUAL_INPUT, fw->getCapability(VirtualInputs), generalSettings, model); - } - - if (flags & POPULATE_SOURCES) { - int totalSources = CPN_MAX_STICKS + board.getCapability(Board::Pots) + board.getCapability(Board::Sliders) + board.getCapability(Board::MouseAnalogs); - addRawSourceItems(itemModel, SOURCE_TYPE_STICK, totalSources, generalSettings, model); - addRawSourceItems(itemModel, SOURCE_TYPE_ROTARY_ENCODER, fw->getCapability(RotaryEncoders), generalSettings, model); - } - - if (flags & POPULATE_TRIMS) { - addRawSourceItems(itemModel, SOURCE_TYPE_TRIM, board.getCapability(Board::NumTrims), generalSettings, model); - } - - if (flags & POPULATE_SOURCES) { - addRawSourceItems(itemModel, SOURCE_TYPE_MAX, 1, generalSettings, model); - } - - if (flags & POPULATE_SWITCHES) { - addRawSourceItems(itemModel, SOURCE_TYPE_SWITCH, board.getCapability(Board::Switches), generalSettings, model); - addRawSourceItems(itemModel, SOURCE_TYPE_CUSTOM_SWITCH, fw->getCapability(LogicalSwitches), generalSettings, model); - } - - if (flags & POPULATE_SOURCES) { - addRawSourceItems(itemModel, SOURCE_TYPE_CYC, CPN_MAX_CYC, generalSettings, model); - addRawSourceItems(itemModel, SOURCE_TYPE_PPM, fw->getCapability(TrainerInputs), generalSettings, model); - addRawSourceItems(itemModel, SOURCE_TYPE_CH, fw->getCapability(Outputs), generalSettings, model); - } - - if (flags & POPULATE_TELEMETRY) { - int count = 0; - if (IS_ARM(board.getBoardType())) { - addRawSourceItems(itemModel, SOURCE_TYPE_SPECIAL, 5, generalSettings, model); - count = CPN_MAX_SENSORS * 3; - } - else { - count = ((flags & POPULATE_TELEMETRYEXT) ? TELEMETRY_SOURCES_STATUS_COUNT : TELEMETRY_SOURCES_COUNT); - } - if (model && count) - addRawSourceItems(itemModel, SOURCE_TYPE_TELEMETRY, count, generalSettings, model); - } - - if (flags & POPULATE_GVARS) { - addRawSourceItems(itemModel, SOURCE_TYPE_GVAR, fw->getCapability(Gvars), generalSettings, model); - } - - return itemModel; -} - void Helpers::exportAppSettings(QWidget * dlgParent) { static QString lastExpFile = CPN_SETTINGS_INI_PATH.arg(QDateTime::currentDateTime().toString("dd-MMM-yy")); diff --git a/companion/src/helpers.h b/companion/src/helpers.h index e1e404847..88fdb598c 100644 --- a/companion/src/helpers.h +++ b/companion/src/helpers.h @@ -117,26 +117,8 @@ class CurveGroup : public QObject { int lastType; }; - -#define POPULATE_NONE (1<<0) -#define POPULATE_SOURCES (1<<1) -#define POPULATE_TRIMS (1<<2) -#define POPULATE_SWITCHES (1<<3) -#define POPULATE_GVARS (1<<4) -#define POPULATE_TELEMETRY (1<<5) -#define POPULATE_TELEMETRYEXT (1<<6) -#define POPULATE_VIRTUAL_INPUTS (1<<7) -#define POPULATE_SCRIPT_OUTPUTS (1<<8) - -#define GVARS_VARIANT 0x0001 -#define FRSKY_VARIANT 0x0002 - namespace Helpers { - void addRawSourceItems(QStandardItemModel * itemModel, const RawSourceType & type, int count, const GeneralSettings * const generalSettings = NULL, - const ModelData * const model = NULL, const int start = 0); - QStandardItemModel * getRawSourceItemModel(const GeneralSettings * const generalSettings = NULL, const ModelData * const model = NULL, unsigned int flags = 0); - void populateGvarUseCB(QComboBox *b, unsigned int phase); void populateGVCB(QComboBox & b, int value, const ModelData & model); QString getAdjustmentString(int16_t val, const ModelData * model = NULL, bool sign = false); diff --git a/companion/src/modeledit/customfunctions.cpp b/companion/src/modeledit/customfunctions.cpp index 8852a5646..113403787 100644 --- a/companion/src/modeledit/customfunctions.cpp +++ b/companion/src/modeledit/customfunctions.cpp @@ -20,6 +20,7 @@ #include "customfunctions.h" #include "switchitemmodel.h" +#include "rawsourceitemmodel.h" #include "helpers.h" #include "appdata.h" @@ -69,9 +70,6 @@ void RepeatComboBox::update() CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, GeneralSettings & generalSettings, Firmware * firmware): GenericPanel(parent, model, generalSettings, firmware), functions(model ? model->customFn : generalSettings.customFn), - rawSwitchItemModel(NULL), - rawSrcInputsItemModel(NULL), - rawSrcAllItemModel(NULL), mediaPlayerCurrent(-1), mediaPlayer(NULL) { @@ -79,7 +77,10 @@ CustomFunctionsPanel::CustomFunctionsPanel(QWidget * parent, ModelData * model, lock = true; int num_fsw = model ? firmware->getCapability(CustomFunctions) : firmware->getCapability(GlobalFunctions); - setDataModels(); + rawSwitchItemModel = new RawSwitchFilterItemModel(&generalSettings, model, model ? SpecialFunctionsContext : GlobalFunctionsContext); + rawSrcAllItemModel = new RawSourceFilterItemModel(&generalSettings, model, this); + rawSrcInputsItemModel = new RawSourceFilterItemModel(rawSrcAllItemModel->sourceModel(), RawSource::InputSourceGroups, this); + rawSrcGVarsItemModel = new RawSourceFilterItemModel(rawSrcAllItemModel->sourceModel(), RawSource::GVarsGroup, this); if (!firmware->getCapability(VoicesAsNumbers)) { tracksSet = getFilesSet(getSoundsPath(generalSettings), QStringList() << "*.wav" << "*.WAV", firmware->getCapability(VoicesMaxLength)); @@ -253,24 +254,13 @@ CustomFunctionsPanel::~CustomFunctionsPanel() stopSound(mediaPlayerCurrent); } -void CustomFunctionsPanel::setDataModels() +void CustomFunctionsPanel::updateDataModels() { - if (rawSwitchItemModel) - rawSwitchItemModel->update(); - else - rawSwitchItemModel = new RawSwitchFilterItemModel(&generalSettings, model, model ? SpecialFunctionsContext : GlobalFunctionsContext); - - // The RawSource item models have to be reloaded on every update(). TODO: convert to filtered model like for RawSwitches - - if (rawSrcInputsItemModel) - rawSrcInputsItemModel->deleteLater(); - if (rawSrcAllItemModel) - rawSrcAllItemModel->deleteLater(); - - rawSrcInputsItemModel = Helpers::getRawSourceItemModel(&generalSettings, model, POPULATE_NONE|POPULATE_SOURCES|POPULATE_VIRTUAL_INPUTS|POPULATE_TRIMS|POPULATE_SWITCHES); - rawSrcInputsItemModel->setParent(this); - rawSrcAllItemModel = Helpers::getRawSourceItemModel(&generalSettings, model, POPULATE_NONE|POPULATE_SOURCES|POPULATE_VIRTUAL_INPUTS|POPULATE_SWITCHES|POPULATE_GVARS|POPULATE_TRIMS|POPULATE_TELEMETRY|POPULATE_TELEMETRYEXT|POPULATE_SCRIPT_OUTPUTS); - rawSrcAllItemModel->setParent(this); + const bool oldLock = lock; + lock = true; + rawSwitchItemModel->update(); + rawSrcAllItemModel->update(); + lock = oldLock; } void CustomFunctionsPanel::onMediaPlayerStateChanged(QMediaPlayer::State state) @@ -391,6 +381,7 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) unsigned int widgetsMask = 0; if (modified) { + const bool wasEmpty = cfn.isEmpty(); cfn.swtch = RawSwitch(fswtchSwtch[i]->currentData().toInt()); cfn.func = func; cfn.enabled = fswtchEnable[i]->isChecked(); @@ -603,8 +594,7 @@ void CustomFunctionsPanel::refreshCustomFunction(int i, bool modified) void CustomFunctionsPanel::update() { - setDataModels(); - + updateDataModels(); lock = true; int num_fsw = model ? firmware->getCapability(CustomFunctions) : firmware->getCapability(GlobalFunctions); for (int i=0; isetCurrentIndex(b->findData(value)); break; case 2: - b->setModel(Helpers::getRawSourceItemModel(&generalSettings, model, POPULATE_GVARS)); + b->setModel(rawSrcGVarsItemModel); b->setCurrentIndex(b->findData(value)); break; } diff --git a/companion/src/modeledit/customfunctions.h b/companion/src/modeledit/customfunctions.h index a7d3ca8da..26cb4b273 100644 --- a/companion/src/modeledit/customfunctions.h +++ b/companion/src/modeledit/customfunctions.h @@ -26,6 +26,7 @@ #include +class RawSourceFilterItemModel; class RawSwitchFilterItemModel; class TimerEdit; @@ -61,7 +62,7 @@ class CustomFunctionsPanel : public GenericPanel CustomFunctionData * functions; private slots: - void setDataModels(); + void updateDataModels(); void customFunctionEdited(); void functionEdited(); void fsw_customContextMenuRequested(QPoint pos); @@ -82,8 +83,9 @@ class CustomFunctionsPanel : public GenericPanel void populateGVmodeCB(QComboBox *b, unsigned int value); void populateFuncParamCB(QComboBox *b, uint function, unsigned int value, unsigned int adjustmode=0); RawSwitchFilterItemModel * rawSwitchItemModel; - QStandardItemModel * rawSrcInputsItemModel; - QStandardItemModel * rawSrcAllItemModel; + RawSourceFilterItemModel * rawSrcAllItemModel; + RawSourceFilterItemModel * rawSrcInputsItemModel; + RawSourceFilterItemModel * rawSrcGVarsItemModel; QSet tracksSet; QSet scriptsSet; diff --git a/companion/src/modeledit/expodialog.cpp b/companion/src/modeledit/expodialog.cpp index 5d3746e79..6e2a41ce8 100644 --- a/companion/src/modeledit/expodialog.cpp +++ b/companion/src/modeledit/expodialog.cpp @@ -21,6 +21,7 @@ #include "expodialog.h" #include "ui_expodialog.h" #include "switchitemmodel.h" +#include "rawsourceitemmodel.h" #include "helpers.h" ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, GeneralSettings & generalSettings, @@ -93,7 +94,7 @@ ExpoDialog::ExpoDialog(QWidget *parent, ModelData & model, ExpoData *expoData, G if (firmware->getCapability(VirtualInputs)) { ui->inputName->setMaxLength(firmware->getCapability(InputsLength)); - ui->sourceCB->setModel(Helpers::getRawSourceItemModel(&generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SWITCHES | POPULATE_TRIMS | POPULATE_TELEMETRY)); + ui->sourceCB->setModel(new RawSourceFilterItemModel(&generalSettings, &model, (RawSource::InputSourceGroups & ~RawSource::InputsGroup) | RawSource::TelemGroup, this)); ui->sourceCB->setCurrentIndex(ui->sourceCB->findData(ed->srcRaw.toValue())); ui->sourceCB->removeItem(0); ui->inputName->setValidator(new QRegExpValidator(rx, this)); diff --git a/companion/src/modeledit/heli.cpp b/companion/src/modeledit/heli.cpp index bc8fd74fc..fb70d081a 100644 --- a/companion/src/modeledit/heli.cpp +++ b/companion/src/modeledit/heli.cpp @@ -21,15 +21,15 @@ #include "heli.h" #include "ui_heli.h" #include "helpers.h" +#include "rawsourceitemmodel.h" HeliPanel::HeliPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): ModelPanel(parent, model, generalSettings, firmware), - ui(new Ui::Heli), - rawSourceItemModel(nullptr) + ui(new Ui::Heli) { ui->setupUi(this); - setDataModels(); + rawSourceItemModel = new RawSourceFilterItemModel(&generalSettings, &model, RawSource::InputSourceGroups, this); connect(ui->swashType, SIGNAL(currentIndexChanged(int)), this, SLOT(edited())); connect(ui->swashRingVal, SIGNAL(editingFinished()), this, SLOT(edited())); @@ -66,19 +66,18 @@ HeliPanel::~HeliPanel() delete ui; } -void HeliPanel::setDataModels() +void HeliPanel::updateDataModels() { - if (rawSourceItemModel) - rawSourceItemModel->deleteLater(); - - rawSourceItemModel = Helpers::getRawSourceItemModel(&generalSettings, model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS); - rawSourceItemModel->setParent(this); + const bool oldLock = lock; + lock = true; + rawSourceItemModel->update(); + lock = oldLock; } void HeliPanel::update() { lock = true; - setDataModels(); + updateDataModels(); ui->swashType->setCurrentIndex(model->swashRingData.type); ui->swashCollectiveSource->setModel(rawSourceItemModel); diff --git a/companion/src/modeledit/heli.h b/companion/src/modeledit/heli.h index 6944fcafe..5a27c7c26 100644 --- a/companion/src/modeledit/heli.h +++ b/companion/src/modeledit/heli.h @@ -23,6 +23,8 @@ #include "modeledit.h" +class RawSourceFilterItemModel; + namespace Ui { class Heli; } @@ -37,12 +39,12 @@ class HeliPanel : public ModelPanel void update(); private slots: - void setDataModels(); + void updateDataModels(); void edited(); private: Ui::Heli *ui; - QStandardItemModel * rawSourceItemModel; + RawSourceFilterItemModel * rawSourceItemModel; }; #endif // _HELI_H_ diff --git a/companion/src/modeledit/logicalswitches.cpp b/companion/src/modeledit/logicalswitches.cpp index cc2394554..c060cfb95 100644 --- a/companion/src/modeledit/logicalswitches.cpp +++ b/companion/src/modeledit/logicalswitches.cpp @@ -20,21 +20,21 @@ #include "logicalswitches.h" #include "switchitemmodel.h" +#include "rawsourceitemmodel.h" #include "helpers.h" #include LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware): ModelPanel(parent, model, generalSettings, firmware), - rawSourceItemModel(NULL), selectedSwitch(0) { Stopwatch s1("LogicalSwitchesPanel"); - int channelsMax = model.getChannelsMax(true); rawSwitchItemModel = new RawSwitchFilterItemModel(&generalSettings, &model, LogicalSwitchesContext); - setDataModels(); + const unsigned srcGroups = firmware->getCapability(GvarsInCS) ? RawSource::AllSourceGroups : (RawSource::AllSourceGroups & ~RawSource::GVarsGroup); + rawSourceItemModel = new RawSourceFilterItemModel(&generalSettings, &model, srcGroups, this); QStringList headerLabels; headerLabels << "#" << tr("Function") << tr("V1") << tr("V2") << tr("AND Switch"); @@ -45,6 +45,8 @@ LogicalSwitchesPanel::LogicalSwitchesPanel(QWidget * parent, ModelData & model, s1.report("header"); + const int channelsMax = model.getChannelsMax(true); + lock = true; for (int i=0; igetCapability(LogicalSwitches); i++) { // The label @@ -161,14 +163,13 @@ LogicalSwitchesPanel::~LogicalSwitchesPanel() { } -void LogicalSwitchesPanel::setDataModels() +void LogicalSwitchesPanel::updateDataModels() { - if (rawSourceItemModel) - rawSourceItemModel->deleteLater(); - - int srcFlags = POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_TRIMS | POPULATE_SWITCHES | POPULATE_TELEMETRY | (firmware->getCapability(GvarsInCS) ? POPULATE_GVARS : 0); - rawSourceItemModel = Helpers::getRawSourceItemModel(&generalSettings, model, srcFlags); - rawSourceItemModel->setParent(this); + const bool oldLock = lock; + lock = true; + rawSwitchItemModel->update(); + rawSourceItemModel->update(); + lock = oldLock; } void LogicalSwitchesPanel::functionChanged() @@ -179,6 +180,7 @@ void LogicalSwitchesPanel::functionChanged() if (model->logicalSw[i].func == newFunc) return; + const unsigned oldFunc = model->logicalSw[i].func; CSFunctionFamily oldFuncFamily = model->logicalSw[i].getFunctionFamily(); model->logicalSw[i].func = newFunc; CSFunctionFamily newFuncFamily = model->logicalSw[i].getFunctionFamily(); @@ -194,7 +196,11 @@ void LogicalSwitchesPanel::functionChanged() model->logicalSw[i].val2 = -129; } } - update(); + if (bool(oldFunc) != bool(newFunc)) + update(); + else + updateLine(i); + emit modified(); } @@ -435,7 +441,6 @@ void LogicalSwitchesPanel::updateLine(int i) cswitchDelay[i]->setValue(model->logicalSw[i].delay/10.0); } - rawSwitchItemModel->update(); lock = false; } @@ -508,7 +513,7 @@ void LogicalSwitchesPanel::populateAndSwitchCB(QComboBox *b) void LogicalSwitchesPanel::update() { - setDataModels(); + updateDataModels(); for (int i=0; igetCapability(LogicalSwitches); i++) { updateLine(i); } diff --git a/companion/src/modeledit/logicalswitches.h b/companion/src/modeledit/logicalswitches.h index 0fed61bfa..fde3df0f4 100644 --- a/companion/src/modeledit/logicalswitches.h +++ b/companion/src/modeledit/logicalswitches.h @@ -25,6 +25,7 @@ #include "radiodata.h" class RawSwitchFilterItemModel; +class RawSourceFilterItemModel; class TimerEdit; class LogicalSwitchesPanel : public ModelPanel @@ -38,7 +39,7 @@ class LogicalSwitchesPanel : public ModelPanel virtual void update(); private slots: - void setDataModels(); + void updateDataModels(); void functionChanged(); void v1Edited(int value); void v2Edited(int value); @@ -66,7 +67,7 @@ class LogicalSwitchesPanel : public ModelPanel QComboBox * cswitchSource1[CPN_MAX_LOGICAL_SWITCHES]; QComboBox * cswitchSource2[CPN_MAX_LOGICAL_SWITCHES]; RawSwitchFilterItemModel * rawSwitchItemModel; - QStandardItemModel * rawSourceItemModel; + RawSourceFilterItemModel * rawSourceItemModel; int selectedSwitch; void populateCSWCB(QComboBox *b); diff --git a/companion/src/modeledit/mixerdialog.cpp b/companion/src/modeledit/mixerdialog.cpp index afcfb4754..0a424087f 100644 --- a/companion/src/modeledit/mixerdialog.cpp +++ b/companion/src/modeledit/mixerdialog.cpp @@ -22,6 +22,7 @@ #include "ui_mixerdialog.h" #include "radiodata.h" #include "switchitemmodel.h" +#include "rawsourceitemmodel.h" #include "helpers.h" MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, GeneralSettings & generalSettings, Firmware * firmware) : @@ -43,7 +44,7 @@ MixerDialog::MixerDialog(QWidget *parent, ModelData & model, MixData * mixdata, this->setWindowTitle(tr("DEST -> %1").arg(RawSource(SOURCE_TYPE_CH, md->destCh-1).toString(&model, &generalSettings))); - ui->sourceCB->setModel(Helpers::getRawSourceItemModel(&generalSettings, &model, POPULATE_NONE | POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_SWITCHES | POPULATE_TRIMS)); + ui->sourceCB->setModel(new RawSourceFilterItemModel(&generalSettings, &model, RawSource::InputSourceGroups | RawSource::ScriptsGroup, this)); ui->sourceCB->setCurrentIndex(ui->sourceCB->findData(md->srcRaw.toValue())); ui->sourceCB->removeItem(0); diff --git a/companion/src/modeledit/telemetry.cpp b/companion/src/modeledit/telemetry.cpp index c9a0d5c2a..3a0cdc0d9 100644 --- a/companion/src/modeledit/telemetry.cpp +++ b/companion/src/modeledit/telemetry.cpp @@ -25,6 +25,7 @@ #include "ui_telemetry_sensor.h" #include "helpers.h" #include "appdata.h" +#include "rawsourceitemmodel.h" #include @@ -316,10 +317,11 @@ TelemetryAnalog::~TelemetryAnalog() /******************************************************/ -TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model, FrSkyScreenData & screen, GeneralSettings & generalSettings, Firmware * firmware): +TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model, FrSkyScreenData & screen, GeneralSettings & generalSettings, Firmware * firmware, RawSourceFilterItemModel * srcModel): ModelPanel(parent, model, generalSettings, firmware), ui(new Ui::TelemetryCustomScreen), - screen(screen) + screen(screen), + rawSourceItemModel(srcModel) { ui->setupUi(this); @@ -327,15 +329,17 @@ TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model, for (int c=0; cgetCapability(TelemetryCustomScreensFieldsPerLine); c++) { fieldsCB[l][c] = new QComboBox(this); fieldsCB[l][c]->setProperty("index", c + (l<<8)); + fieldsCB[l][c]->setModel(rawSourceItemModel); ui->screenNumsLayout->addWidget(fieldsCB[l][c], l, c, 1, 1); - connect(fieldsCB[l][c], SIGNAL(currentIndexChanged(int)), this, SLOT(customFieldChanged(int))); + connect(fieldsCB[l][c], SIGNAL(activated(int)), this, SLOT(customFieldChanged(int))); } } for (int l=0; l<4; l++) { barsCB[l] = new QComboBox(this); barsCB[l]->setProperty("index", l); - connect(barsCB[l], SIGNAL(currentIndexChanged(int)), this, SLOT(barSourceChanged(int))); + barsCB[l]->setModel(rawSourceItemModel); + connect(barsCB[l], SIGNAL(activated(int)), this, SLOT(barSourceChanged(int))); ui->screenBarsLayout->addWidget(barsCB[l], l, 0, 1, 1); minSB[l] = new QDoubleSpinBox(this); @@ -393,19 +397,6 @@ TelemetryCustomScreen::TelemetryCustomScreen(QWidget *parent, ModelData & model, update(); } -void TelemetryCustomScreen::populateTelemetrySourceCB(QComboBox * b, RawSource & source, bool last) -{ - int flags = POPULATE_NONE | POPULATE_TELEMETRY; - if (IS_ARM(firmware->getBoard())) { - flags |= POPULATE_SOURCES | POPULATE_SCRIPT_OUTPUTS | POPULATE_VIRTUAL_INPUTS | POPULATE_TRIMS | POPULATE_SWITCHES | (firmware->getCapability(GvarsInCS) ? POPULATE_GVARS : 0); - } - else if (last) { - flags |= POPULATE_TELEMETRYEXT; - } - b->setModel(Helpers::getRawSourceItemModel(&generalSettings, model, flags)); - b->setCurrentIndex(b->findData(source.toValue())); -} - TelemetryCustomScreen::~TelemetryCustomScreen() { delete ui; @@ -421,12 +412,12 @@ void TelemetryCustomScreen::update() for (int l=0; l<4; l++) { for (int c=0; cgetCapability(TelemetryCustomScreensFieldsPerLine); c++) { - populateTelemetrySourceCB(fieldsCB[l][c], screen.body.lines[l].source[c], l==3); + fieldsCB[l][c]->setCurrentIndex(fieldsCB[l][c]->findData(screen.body.lines[l].source[c].toValue())); } } for (int l=0; l<4; l++) { - populateTelemetrySourceCB(barsCB[l], screen.body.bars[l].source); + barsCB[l]->setCurrentIndex(barsCB[l]->findData(screen.body.bars[l].source.toValue())); } if (screen.type == TELEMETRY_SCREEN_BARS) { @@ -526,24 +517,36 @@ void TelemetryCustomScreen::scriptNameEdited() void TelemetryCustomScreen::customFieldChanged(int value) { - if (!lock) { - int index = sender()->property("index").toInt(); - screen.body.lines[index/256].source[index%256] = RawSource(((QComboBox *)sender())->itemData(value).toInt()); + if (lock || !sender() || !qobject_cast(sender())) + return; + + bool ok; + const int index = sender()->property("index").toInt(&ok), + i = index / 256, + m = index % 256; + const RawSource src(qobject_cast(sender())->itemData(value).toInt()); + if (ok && screen.body.lines[i].source[m].toValue() != src.toValue()) { + screen.body.lines[i].source[m] = src; emit modified(); } } void TelemetryCustomScreen::barSourceChanged(int value) { - if (!lock) { - QComboBox * cb = qobject_cast(sender()); - int index = cb->property("index").toInt(); - screen.body.bars[index].source = RawSource(((QComboBox *)sender())->itemData(value).toInt()); - screen.body.bars[index].barMin = 0; - screen.body.bars[index].barMax = 0; - updateBar(index); - emit modified(); - } + if (lock || !sender() || !qobject_cast(sender())) + return; + + bool ok; + const int index = sender()->property("index").toInt(&ok); + const RawSource src(qobject_cast(sender())->itemData(value).toInt()); + if (!ok || screen.body.bars[index].source.toValue() == src.toValue()) + return; + + screen.body.bars[index].source = src; + screen.body.bars[index].barMin = 0; + screen.body.bars[index].barMax = 0; + updateBar(index); + emit modified(); } void TelemetryCustomScreen::barMinChanged(double value) @@ -854,11 +857,15 @@ TelemetryPanel::TelemetryPanel(QWidget *parent, ModelData & model, GeneralSettin ui->topbarGB->hide(); } + RawSourceFilterItemModel * srcModel = (new RawSourceFilterItemModel(&generalSettings, &model, this)); + connect(this, &TelemetryPanel::updated, srcModel, &RawSourceFilterItemModel::update); + for (int i=0; igetCapability(TelemetryCustomScreens); i++) { - TelemetryCustomScreen * tab = new TelemetryCustomScreen(this, model, model.frsky.screens[i], generalSettings, firmware); + TelemetryCustomScreen * tab = new TelemetryCustomScreen(this, model, model.frsky.screens[i], generalSettings, firmware, srcModel); ui->customScreens->addTab(tab, tr("Telemetry screen %1").arg(i+1)); telemetryCustomScreens[i] = tab; - connect(tab, SIGNAL(modified()), this, SLOT(onModified())); + connect(tab, &TelemetryCustomScreen::modified, this, &TelemetryPanel::onModified); + connect(this, &TelemetryPanel::updated, tab, &TelemetryCustomScreen::update); } disableMouseScrolling(); @@ -891,10 +898,9 @@ void TelemetryPanel::update() for (int i=0; iupdate(); } - for (int i=0; igetCapability(TelemetryCustomScreens); i++) { - telemetryCustomScreens[i]->update(); - } } + + emit updated(); } void TelemetryPanel::setup() diff --git a/companion/src/modeledit/telemetry.h b/companion/src/modeledit/telemetry.h index 09758d38b..a69b27e27 100644 --- a/companion/src/modeledit/telemetry.h +++ b/companion/src/modeledit/telemetry.h @@ -25,6 +25,7 @@ #include "eeprominterface.h" class AutoComboBox; +class RawSourceFilterItemModel; class TimerEdit; namespace Ui { @@ -72,7 +73,7 @@ class TelemetryCustomScreen: public ModelPanel Q_OBJECT public: - TelemetryCustomScreen(QWidget *parent, ModelData & model, FrSkyScreenData & screen, GeneralSettings & generalSettings, Firmware * firmware); + TelemetryCustomScreen(QWidget *parent, ModelData & model, FrSkyScreenData & screen, GeneralSettings & generalSettings, Firmware * firmware, RawSourceFilterItemModel * srcModel); ~TelemetryCustomScreen(); void update(); @@ -85,13 +86,11 @@ class TelemetryCustomScreen: public ModelPanel void barMaxChanged(double value); void barTimeChanged(); - protected: - void populateTelemetrySourceCB(QComboBox * b, RawSource & source, bool last=false); - private: void updateBar(int line); Ui::TelemetryCustomScreen * ui; FrSkyScreenData & screen; + RawSourceFilterItemModel * rawSourceItemModel; QComboBox * fieldsCB[4][3]; QComboBox * barsCB[4]; QDoubleSpinBox * minSB[4]; @@ -137,6 +136,9 @@ class TelemetryPanel : public ModelPanel virtual ~TelemetryPanel(); virtual void update(); + signals: + void updated(); + private slots: void on_telemetryProtocol_currentIndexChanged(int index); void onModified();