kopia lustrzana https://gitlab.com/eliggett/wfview
Proper gain reduction metering now available.
Scale needs work though.creator-widgets
rodzic
562ce95971
commit
7f411a29f8
78
meter.cpp
78
meter.cpp
|
@ -68,6 +68,10 @@ meter::meter(QWidget *parent) : QWidget(parent)
|
|||
|
||||
}
|
||||
|
||||
void meter::setCompReverse(bool reverse) {
|
||||
this->reverseCompMeter = reverse;
|
||||
}
|
||||
|
||||
void meter::setColors(QColor current, QColor peakScale, QColor peakLevel,
|
||||
QColor average, QColor lowLine,
|
||||
QColor lowText)
|
||||
|
@ -242,7 +246,11 @@ void meter::paintEvent(QPaintEvent *)
|
|||
case meterComp:
|
||||
label = "CMP(dB)";
|
||||
peakRedLevel = 100;
|
||||
drawScaleComp(&painter);
|
||||
if(reverseCompMeter) {
|
||||
drawScaleCompInverted(&painter);
|
||||
} else {
|
||||
drawScaleComp(&painter);
|
||||
}
|
||||
break;
|
||||
case meterNone:
|
||||
return;
|
||||
|
@ -304,6 +312,7 @@ void meter::paintEvent(QPaintEvent *)
|
|||
int logAverage = (int)((1-audiopot[255-average])*255);
|
||||
int logPeak = (int)((1-audiopot[255-peak])*255);
|
||||
|
||||
// Current value:
|
||||
// X, Y, Width, Height
|
||||
painter.drawRect(mXstart,mYstart,logCurrent,barHeight);
|
||||
|
||||
|
@ -325,15 +334,22 @@ void meter::paintEvent(QPaintEvent *)
|
|||
|
||||
} else {
|
||||
|
||||
|
||||
// Current value:
|
||||
// X, Y, Width, Height
|
||||
painter.drawRect(mXstart,mYstart,current,barHeight);
|
||||
if(meterType==meterComp && reverseCompMeter) {
|
||||
painter.drawRect(255+mXstart,mYstart,-current,barHeight);
|
||||
} else {
|
||||
painter.drawRect(mXstart,mYstart,current,barHeight);
|
||||
}
|
||||
|
||||
// Average:
|
||||
painter.setPen(averageColor);
|
||||
painter.setBrush(averageColor);
|
||||
painter.drawRect(mXstart+average-1,mYstart,1,barHeight); // bar is 1 pixel wide, height = meter start?
|
||||
|
||||
if(meterType==meterComp && reverseCompMeter) {
|
||||
painter.drawRect(255+mXstart-average,mYstart,-1,barHeight); // bar is 1 pixel wide, height = meter start?
|
||||
} else {
|
||||
painter.drawRect(mXstart+average-1,mYstart,1,barHeight); // bar is 1 pixel wide, height = meter start?
|
||||
}
|
||||
// Peak:
|
||||
painter.setPen(peakColor);
|
||||
painter.setBrush(peakColor);
|
||||
|
@ -342,9 +358,13 @@ void meter::paintEvent(QPaintEvent *)
|
|||
painter.setBrush(Qt::red);
|
||||
painter.setPen(Qt::red);
|
||||
}
|
||||
|
||||
painter.drawRect(mXstart+peak-1,mYstart,2,barHeight);
|
||||
if(meterType==meterComp && reverseCompMeter) {
|
||||
painter.drawRect(255+mXstart-peak+1,mYstart,-1,barHeight);
|
||||
} else {
|
||||
painter.drawRect(mXstart+peak-1,mYstart,2,barHeight);
|
||||
}
|
||||
}
|
||||
|
||||
if(drawLabels)
|
||||
{
|
||||
drawLabel(&painter);
|
||||
|
@ -670,6 +690,50 @@ void meter::drawScaleComp(QPainter *qp)
|
|||
qp->drawLine(peakRedLevel+mXstart,scaleLineYstart,255+mXstart,scaleLineYstart);
|
||||
}
|
||||
|
||||
void meter::drawScaleCompInverted(QPainter *qp) {
|
||||
// inverted scale
|
||||
//
|
||||
// 0000=0 dB, 0130=15 dB,0241=30 dB
|
||||
//
|
||||
|
||||
qp->setPen(lowTextColor);
|
||||
|
||||
int midPointDn = 130;
|
||||
int midPointdB = 15;
|
||||
|
||||
int highPointDn = 241;
|
||||
int highPointdB = 30;
|
||||
float dBperDn = (float)(highPointdB-midPointdB) / float(highPointDn-midPointDn);
|
||||
|
||||
int i=mXstart;
|
||||
//i+=midPointDn/4; // skip the 0 for cleaner label space
|
||||
|
||||
// Vertical graticules and text
|
||||
|
||||
// drawLine expects two sets of coordinates dictating start and end position.
|
||||
for(; i<mXstart+midPointDn; i+=midPointDn/4)
|
||||
{
|
||||
qp->drawText(255+mXstart-i+(midPointDn/4),scaleTextYstart, QString("%1").arg( (int)((i-mXstart) * (float(midPointdB) / float(midPointDn)) )) );
|
||||
qp->drawLine(255+mXstart-i+(midPointDn/4),scaleTextYstart, 255+mXstart-i+(midPointDn/4), scaleTextYstart+5);
|
||||
}
|
||||
|
||||
i = midPointDn+60;
|
||||
// The "-60" blocks the last digit which runs over the label text
|
||||
for(; i<mXstart+255-60; i+= 30)
|
||||
{
|
||||
qp->drawText(255+mXstart-i,scaleTextYstart, QString("%1").arg( (int) std::round( ((i-mXstart-midPointDn) * (dBperDn) ) + (midPointdB) )));
|
||||
qp->drawLine(255+mXstart-i,scaleTextYstart, 255+mXstart-i, scaleTextYstart+5);
|
||||
}
|
||||
|
||||
// Now the lines:
|
||||
qp->setPen(lowLineColor);
|
||||
|
||||
// Line: X1, Y1 -->to--> X2, Y2
|
||||
qp->drawLine(255+mXstart,scaleLineYstart,255-peakRedLevel+mXstart,scaleLineYstart);
|
||||
qp->setPen(highLineColor);
|
||||
qp->drawLine(255-peakRedLevel+mXstart,scaleLineYstart,mXstart,scaleLineYstart);
|
||||
}
|
||||
|
||||
void meter::drawScaleSWR(QPainter *qp)
|
||||
{
|
||||
// From the manual:
|
||||
|
|
3
meter.h
3
meter.h
|
@ -30,6 +30,7 @@ public slots:
|
|||
void setLevels(int current, int peak, int average);
|
||||
void setLevels(int current, int peak); // calculate avg
|
||||
void setLevel(int current);
|
||||
void setCompReverse(bool reverse);
|
||||
void clearMeterOnPTTtoggle();
|
||||
void clearMeter();
|
||||
void setMeterType(meter_t type);
|
||||
|
@ -58,6 +59,7 @@ private:
|
|||
int current=0;
|
||||
int peak = 0;
|
||||
int average = 0;
|
||||
bool reverseCompMeter = true;
|
||||
|
||||
int averageBalisticLength = 30;
|
||||
int peakBalisticLength = 30;
|
||||
|
@ -85,6 +87,7 @@ private:
|
|||
void drawScaleVd(QPainter *qp);
|
||||
void drawScaleId(QPainter *qp);
|
||||
void drawScaleComp(QPainter *qp);
|
||||
void drawScaleCompInverted(QPainter *qp);
|
||||
void drawScale_dBFs(QPainter *qp);
|
||||
void drawScaleRaw(QPainter *qp);
|
||||
|
||||
|
|
12
prefs.h
12
prefs.h
|
@ -26,11 +26,12 @@ enum prefIfItem {
|
|||
if_confirmPowerOff = 1 << 13,
|
||||
if_meter2Type = 1 << 14,
|
||||
if_meter3Type = 1 << 15,
|
||||
if_clickDragTuningEnable = 1 << 16,
|
||||
if_currentColorPresetNumber = 1 << 17,
|
||||
if_rigCreatorEnable = 1 << 18,
|
||||
if_frequencyUnits = 1 << 19,
|
||||
if_all = 1 << 20
|
||||
if_compMeterReverse = 1 << 16,
|
||||
if_clickDragTuningEnable = 1 << 17,
|
||||
if_currentColorPresetNumber = 1 << 18,
|
||||
if_rigCreatorEnable = 1 << 19,
|
||||
if_frequencyUnits = 1 << 20,
|
||||
if_all = 1 << 21
|
||||
};
|
||||
|
||||
enum prefColItem {
|
||||
|
@ -180,6 +181,7 @@ struct preferences {
|
|||
bool confirmPowerOff;
|
||||
meter_t meter2Type;
|
||||
meter_t meter3Type;
|
||||
bool compMeterReverse = false;
|
||||
bool clickDragTuningEnable;
|
||||
int currentColorPresetNumber = 0;
|
||||
bool rigCreatorEnable = false;
|
||||
|
|
|
@ -442,6 +442,11 @@ void settingswidget::updateIfPref(prefIfItem pif)
|
|||
}
|
||||
break;
|
||||
}
|
||||
case if_compMeterReverse:
|
||||
{
|
||||
quietlyUpdateCheckbox(ui->revCompMeterBtn, prefs->compMeterReverse);
|
||||
break;
|
||||
}
|
||||
case if_clickDragTuningEnable:
|
||||
quietlyUpdateCheckbox(ui->clickDragTuningEnableChk, prefs->clickDragTuningEnable);
|
||||
break;
|
||||
|
@ -1536,6 +1541,12 @@ void settingswidget::on_meter3selectionCombo_currentIndexChanged(int index)
|
|||
}
|
||||
}
|
||||
|
||||
void settingswidget::on_revCompMeterBtn_clicked(bool checked)
|
||||
{
|
||||
prefs->compMeterReverse = checked;
|
||||
emit changedIfPref(if_compMeterReverse);
|
||||
}
|
||||
|
||||
void settingswidget::muteSingleComboItem(QComboBox *comboBox, int index) {
|
||||
enableAllComboBoxItems(comboBox);
|
||||
setComboBoxItemEnabled(comboBox, index, false);
|
||||
|
@ -2714,3 +2725,4 @@ void settingswidget::connectionStatus(bool conn)
|
|||
ui->audioSystemServerCombo->setEnabled(!conn);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -238,6 +238,8 @@ private slots:
|
|||
|
||||
void on_meter3selectionCombo_currentIndexChanged(int index);
|
||||
|
||||
void on_revCompMeterBtn_clicked(bool checked);
|
||||
|
||||
private:
|
||||
Ui::settingswidget *ui;
|
||||
void createSettingsListItems();
|
||||
|
|
|
@ -795,9 +795,9 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
|
|||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="clickDragTuningEnableChk">
|
||||
<widget class="QCheckBox" name="pttEnableChk">
|
||||
<property name="text">
|
||||
<string>Allow tuning via click and drag (experimental)</string>
|
||||
<string>Enable PTT Controls</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -848,6 +848,13 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="clickDragTuningEnableChk">
|
||||
<property name="text">
|
||||
<string>Allow tuning via click and drag (experimental)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="useSystemThemeChk">
|
||||
<property name="text">
|
||||
|
@ -1026,13 +1033,6 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
|
|||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_28">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="pttEnableChk">
|
||||
<property name="text">
|
||||
<string>Enable PTT Controls</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_30">
|
||||
<property name="orientation">
|
||||
|
@ -1062,6 +1062,16 @@ ONLY use Manual CI-V when Transceive mode is not supported</string>
|
|||
<item>
|
||||
<widget class="QComboBox" name="meter3selectionCombo"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="revCompMeterBtn">
|
||||
<property name="toolTip">
|
||||
<string>Broadcast-style reduction meter</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Reverse Comp Meter</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="autoPollBtn">
|
||||
<property name="toolTip">
|
||||
|
|
10
wfmain.cpp
10
wfmain.cpp
|
@ -1542,6 +1542,7 @@ void wfmain::setDefPrefs()
|
|||
defPrefs.confirmPowerOff = true;
|
||||
defPrefs.meter2Type = meterNone;
|
||||
defPrefs.meter3Type = meterNone;
|
||||
defPrefs.compMeterReverse = false;
|
||||
|
||||
defPrefs.tcpPort = 0;
|
||||
defPrefs.tciPort = 50001;
|
||||
|
@ -1614,7 +1615,7 @@ void wfmain::loadSettings()
|
|||
prefs.confirmPowerOff = settings->value("ConfirmPowerOff", defPrefs.confirmPowerOff).toBool();
|
||||
prefs.meter2Type = static_cast<meter_t>(settings->value("Meter2Type", defPrefs.meter2Type).toInt());
|
||||
prefs.meter3Type = static_cast<meter_t>(settings->value("Meter3Type", defPrefs.meter3Type).toInt());
|
||||
|
||||
prefs.compMeterReverse = settings->value("compMeterReverse", defPrefs.compMeterReverse).toBool();
|
||||
prefs.clickDragTuningEnable = settings->value("ClickDragTuning", false).toBool();
|
||||
|
||||
prefs.rigCreatorEnable = settings->value("RigCreator",false).toBool();
|
||||
|
@ -2327,6 +2328,10 @@ void wfmain::extChangedIfPref(prefIfItem i)
|
|||
// There's nothing to do here since the code
|
||||
// already uses the preference variable as state.
|
||||
break;
|
||||
case if_compMeterReverse:
|
||||
ui->meter2Widget->setCompReverse(prefs.compMeterReverse);
|
||||
ui->meter3Widget->setCompReverse(prefs.compMeterReverse);
|
||||
break;
|
||||
case if_rigCreatorEnable:
|
||||
ui->rigCreatorBtn->setEnabled(prefs.rigCreatorEnable);
|
||||
break;
|
||||
|
@ -2779,6 +2784,7 @@ void wfmain::saveSettings()
|
|||
settings->setValue("ConfirmPowerOff", prefs.confirmPowerOff);
|
||||
settings->setValue("Meter2Type", (int)prefs.meter2Type);
|
||||
settings->setValue("Meter3Type", (int)prefs.meter3Type);
|
||||
settings->setValue("compMeterReverse", prefs.compMeterReverse);
|
||||
settings->setValue("ClickDragTuning", prefs.clickDragTuningEnable);
|
||||
settings->setValue("RigCreator",prefs.rigCreatorEnable);
|
||||
settings->setValue("FrequencyUnits",prefs.frequencyUnits);
|
||||
|
@ -3930,6 +3936,8 @@ void wfmain::receiveRigID(rigCapabilities rigCaps)
|
|||
// Set the second meter here as I suspect we need to be connected for it to work?
|
||||
changeMeterType(prefs.meter2Type, 2);
|
||||
changeMeterType(prefs.meter3Type, 3);
|
||||
ui->meter2Widget->setCompReverse(prefs.compMeterReverse);
|
||||
ui->meter3Widget->setCompReverse(prefs.compMeterReverse);
|
||||
// for (int i = 0; i < ui->meter2selectionCombo->count(); i++)
|
||||
// {
|
||||
// if (static_cast<meter_t>(ui->meter2selectionCombo->itemData(i).toInt()) == prefs.meter2Type)
|
||||
|
|
Ładowanie…
Reference in New Issue