From 5f7e39ebb50e88714744e1f881795b60ceeb7776 Mon Sep 17 00:00:00 2001 From: Elliott Liggett Date: Mon, 5 Feb 2024 21:03:08 -0800 Subject: [PATCH] Double-click a meter to change the type. --- meter.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ meter.h | 15 +++++++++ wfmain.cpp | 21 +++++++++++++ wfviewtypes.h | 49 ++++++++++++++++++++++++++++++ 4 files changed, 169 insertions(+) diff --git a/meter.cpp b/meter.cpp index 2c1ebc4..075ea2a 100644 --- a/meter.cpp +++ b/meter.cpp @@ -46,6 +46,26 @@ meter::meter(QWidget *parent) : QWidget(parent) avgLevels.resize(averageBalisticLength, 0); peakLevels.resize(peakBalisticLength, 0); + combo = new QComboBox(this); + combo->blockSignals(true); + combo->addItem("None", meterNone); + combo->addItem("SWR", meterSWR); + combo->addItem("ALC", meterALC); + combo->addItem("Compression", meterComp); + combo->addItem("Voltage", meterVoltage); + combo->addItem("Current", meterCurrent); + combo->addItem("Center", meterCenter); + combo->addItem("TxRxAudio", meterAudio); + combo->addItem("RxAudio", meterRxAudio); + combo->addItem("TxAudio", meterTxMod); + combo->blockSignals(false); + + connect(combo, SIGNAL(activated(int)), this, SLOT(acceptComboItem(int))); + //connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(acceptComboItem(int))); + + combo->hide(); + this->installEventFilter(this); + } void meter::setColors(QColor current, QColor peakScale, QColor peakLevel, @@ -111,6 +131,16 @@ void meter::setMeterType(meter_t type) this->clearMeter(); } +void meter::blockMeterType(meter_t mtype) { + // TODO: Code to block off duplicate meter types from the selection menu + enableAllComboBoxItems(combo); + qDebug() << "Asked to block meter of type: " << getMeterDebug(mtype); + if(mtype != meterNone) { + int m_index = combo->findData(mtype); + setComboBoxItemEnabled(combo, m_index, false); + } +} + meter_t meter::getMeterType() { return meterType; @@ -126,8 +156,38 @@ QString meter::getMeterShortString() return meterShortString; } +void meter::acceptComboItem(int item) { + qDebug() << "Meter selected combo item number: " << item; + + meter_t meterTypeRequested = static_cast(combo->itemData(item).toInt()); + if(meterType != meterTypeRequested) { + qDebug() << "Changing meter to type: " << getMeterDebug(meterTypeRequested) << ", with item index: " << item; + emit configureMeterSignal(meterTypeRequested); + } + + combo->hide(); + freezeDrawing = false; +} + +void meter::handleDoubleClick() { + freezeDrawing = true; + combo->show(); +} + +bool meter::eventFilter(QObject *object, QEvent *event) { + if(event->type() == QEvent::MouseButtonDblClick) { + qDebug() << "Mouse double click event in meter widget"; + handleDoubleClick(); + return true; + } + (void)object; + return false; +} + void meter::paintEvent(QPaintEvent *) { + if(freezeDrawing) + return; QPainter painter(this); // This next line sets up a canvis within the // space of the widget, and gives it coordinates. @@ -714,3 +774,27 @@ void meter::drawScaleS(QPainter *qp) qp->setPen(highLineColor); qp->drawLine(peakRedLevel+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart); } + +void meter::muteSingleComboItem(QComboBox *comboBox, int index) { + enableAllComboBoxItems(comboBox); + setComboBoxItemEnabled(comboBox, index, false); +} + +void meter::enableAllComboBoxItems(QComboBox *combobox) { + for(int i=0; i < combobox->count(); i++) { + setComboBoxItemEnabled(combobox, i, true); + } +} + +void meter::setComboBoxItemEnabled(QComboBox * comboBox, int index, bool enabled) +{ + auto * model = qobject_cast(comboBox->model()); + assert(model); + if(!model) return; + + auto * item = model->item(index); + assert(item); + if(!item) return; + item->setEnabled(enabled); +} + diff --git a/meter.h b/meter.h index 36c85bf..3dcae52 100644 --- a/meter.h +++ b/meter.h @@ -1,6 +1,9 @@ #ifndef METER_H #define METER_H +#include +#include +#include #include #include #include @@ -18,6 +21,7 @@ public: explicit meter(QWidget *parent = nullptr); signals: + void configureMeterSignal(meter_t type); public slots: void paintEvent(QPaintEvent *); @@ -35,10 +39,17 @@ public slots: void setColors(QColor current, QColor peakScale, QColor peakLevel, QColor average, QColor lowLine, QColor lowText); + void blockMeterType(meter_t type); +private slots: + void acceptComboItem(int item); private: //QPainter painter; + bool eventFilter(QObject *object, QEvent *event); + void handleDoubleClick(); + bool freezeDrawing = false; + QComboBox *combo = NULL; meter_t meterType; QString meterShortString; int fontSize = 10; @@ -78,6 +89,10 @@ private: void drawLabel(QPainter *qp); + void muteSingleComboItem(QComboBox *comboBox, int index); + void enableAllComboBoxItems(QComboBox *combobox); + void setComboBoxItemEnabled(QComboBox * comboBox, int index, bool enabled); + QString label; QColor currentColor; diff --git a/wfmain.cpp b/wfmain.cpp index fb2fdcf..03f5e56 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -247,6 +247,27 @@ wfmain::wfmain(const QString settingsFile, const QString logFile, bool debugMode QToolTip::showText(QCursor::pos(), QString("%1").arg(value*100/255), nullptr); }); + connect(ui->meter2Widget, &meter::configureMeterSignal, + [=](const meter_t &meterTypeRequested) { + // Change the preferences and update settings widget to reflect new meter selection: + prefs.meter2Type = meterTypeRequested; + setupui->updateIfPref(if_meter2Type); + // Change the meter locally: + changeMeterType(meterTypeRequested, 2); + // Block duplicate meter selection in the other meter: + ui->meter3Widget->blockMeterType(meterTypeRequested); + }); + + connect(ui->meter3Widget, &meter::configureMeterSignal, + [=](const meter_t &meterTypeRequested) { + // Change the preferences and update settings widget to reflect new meter selection: + prefs.meter3Type = meterTypeRequested; + setupui->updateIfPref(if_meter3Type); + // Change the meter locally: + changeMeterType(meterTypeRequested, 3); + // Block duplicate meter selection in the other meter: + ui->meter2Widget->blockMeterType(meterTypeRequested); + }); #if defined(USB_CONTROLLER) #if defined(USB_HOTPLUG) && defined(Q_OS_LINUX) diff --git a/wfviewtypes.h b/wfviewtypes.h index fb065d9..a2706e4 100644 --- a/wfviewtypes.h +++ b/wfviewtypes.h @@ -29,6 +29,7 @@ enum meter_t { meterLatency }; + enum spectrumMode_t { spectModeCenter=0x00, spectModeFixed=0x01, @@ -412,6 +413,54 @@ enum usbCommandType{ commandButton, commandKnob, commandAny }; enum usbFeatureType { featureReset,featureResetKeys, featureEventsA, featureEventsB, featureFirmware, featureSerial, featureButton, featureSensitivity, featureBrightness, featureOrientation, featureSpeed, featureColor, featureOverlay, featureTimeout, featureLCD, featureGraph, featureLEDControl }; +inline QString getMeterDebug(meter_t m) { + QString rtn = QString("Meter name: "); + switch(m) { + case meterNone: + rtn.append("meterNone"); + break; + case meterS: + rtn.append("meterS"); + break; + case meterCenter: + rtn.append("meterCenter"); + break; + case meterSWR: + rtn.append("meterSWR"); + break; + case meterPower: + rtn.append("meterPower"); + break; + case meterALC: + rtn.append("meterALC"); + break; + case meterComp: + rtn.append("meterComp"); + break; + case meterVoltage: + rtn.append("meterVoltage"); + break; + case meterCurrent: + rtn.append("meterCurrent"); + break; + case meterRxdB: + rtn.append("meterRxdB"); + break; + case meterTxMod: + rtn.append("meterTxMod"); + break; + case meterRxAudio: + rtn.append("meterRxAudio"); + break; + case meterLatency: + rtn.append("meterLatency"); + break; + default: + rtn.append("UNKNOWN"); + break; + } + return rtn; +} Q_DECLARE_METATYPE(freqt) Q_DECLARE_METATYPE(spectrumMode_t)