mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-12-23 01:55:48 -05:00
Size spectrum measurements table.
This commit is contained in:
parent
cb6f0be85d
commit
ec78344f88
@ -32,6 +32,7 @@ GLSpectrum::GLSpectrum(QWidget *parent) :
|
||||
m_spectrum->setMeasurements(m_measurements);
|
||||
m_splitter->addWidget(m_spectrum);
|
||||
m_splitter->addWidget(m_measurements);
|
||||
m_position = SpectrumSettings::PositionBelow;
|
||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||
layout->setContentsMargins(0, 0, 0, 0);
|
||||
layout->addWidget(m_splitter);
|
||||
@ -66,4 +67,77 @@ void GLSpectrum::setMeasurementsPosition(SpectrumSettings::MeasurementsPosition
|
||||
m_splitter->insertWidget(0, m_spectrum);
|
||||
break;
|
||||
}
|
||||
m_position = position;
|
||||
}
|
||||
|
||||
void GLSpectrum::setMeasurementParams(SpectrumSettings::Measurement measurement,
|
||||
int centerFrequencyOffset, int bandwidth, int chSpacing, int adjChBandwidth,
|
||||
int harmonics, int peaks, bool highlight, int precision)
|
||||
{
|
||||
m_spectrum->setMeasurementParams(measurement, centerFrequencyOffset, bandwidth, chSpacing, adjChBandwidth, harmonics, peaks, highlight, precision);
|
||||
// Resize splitter so there's just enough space for the measurements table
|
||||
// But don't use more than 50%
|
||||
QList<int> sizes = m_splitter->sizes();
|
||||
if ((sizes[0] == 0) && (sizes[1] == 0))
|
||||
{
|
||||
// Initial sizing when first created
|
||||
QSize s = parentWidget()->size();
|
||||
switch (m_position)
|
||||
{
|
||||
case SpectrumSettings::PositionAbove:
|
||||
sizes[0] = m_measurements->sizeHint().height();
|
||||
sizes[1] = s.height() - sizes[0] - m_splitter->handleWidth();
|
||||
sizes[1] = std::max(sizes[1], sizes[0]);
|
||||
break;
|
||||
case SpectrumSettings::PositionLeft:
|
||||
sizes[0] = m_measurements->sizeHint().width();
|
||||
sizes[1] = s.width() - sizes[0] - m_splitter->handleWidth();
|
||||
sizes[1] = std::max(sizes[1], sizes[0]);
|
||||
break;
|
||||
case SpectrumSettings::PositionBelow:
|
||||
sizes[1] = m_measurements->sizeHint().height();
|
||||
sizes[0] = s.height() - sizes[1] - m_splitter->handleWidth();
|
||||
sizes[0] = std::max(sizes[0], sizes[1]);
|
||||
break;
|
||||
case SpectrumSettings::PositionRight:
|
||||
sizes[1] = m_measurements->sizeHint().width();
|
||||
sizes[0] = s.width() - sizes[1] - m_splitter->handleWidth();
|
||||
sizes[0] = std::max(sizes[0], sizes[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// When measurement type is changed when already visible
|
||||
int diff = 0;
|
||||
switch (m_position)
|
||||
{
|
||||
case SpectrumSettings::PositionAbove:
|
||||
diff = m_measurements->sizeHint().height() - sizes[0];
|
||||
sizes[0] += diff;
|
||||
sizes[1] -= diff;
|
||||
sizes[1] = std::max(sizes[1], sizes[0]);
|
||||
break;
|
||||
case SpectrumSettings::PositionLeft:
|
||||
diff = m_measurements->sizeHint().width() - sizes[0];
|
||||
sizes[0] += diff;
|
||||
sizes[1] -= diff;
|
||||
sizes[1] = std::max(sizes[1], sizes[0]);
|
||||
break;
|
||||
case SpectrumSettings::PositionBelow:
|
||||
diff = m_measurements->sizeHint().height() - sizes[1];
|
||||
sizes[1] += diff;
|
||||
sizes[0] -= diff;
|
||||
sizes[0] = std::max(sizes[0], sizes[1]);
|
||||
break;
|
||||
case SpectrumSettings::PositionRight:
|
||||
diff = m_measurements->sizeHint().width() - sizes[1];
|
||||
sizes[1] += diff;
|
||||
sizes[0] -= diff;
|
||||
sizes[0] = std::max(sizes[0], sizes[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_splitter->setSizes(sizes);
|
||||
//resize(size().expandedTo(minimumSizeHint()));
|
||||
}
|
||||
|
@ -67,10 +67,7 @@ public:
|
||||
void setUseCalibration(bool useCalibration) { m_spectrum->setUseCalibration(useCalibration); }
|
||||
void setMeasurementParams(SpectrumSettings::Measurement measurement,
|
||||
int centerFrequencyOffset, int bandwidth, int chSpacing, int adjChBandwidth,
|
||||
int harmonics, int peaks, bool highlight, int precision)
|
||||
{
|
||||
m_spectrum->setMeasurementParams(measurement, centerFrequencyOffset, bandwidth, chSpacing, adjChBandwidth, harmonics, peaks, highlight, precision);
|
||||
}
|
||||
int harmonics, int peaks, bool highlight, int precision);
|
||||
qint32 getSampleRate() const { return m_spectrum->getSampleRate(); }
|
||||
void addChannelMarker(ChannelMarker* channelMarker) { m_spectrum->addChannelMarker(channelMarker); }
|
||||
void removeChannelMarker(ChannelMarker* channelMarker) { m_spectrum->removeChannelMarker(channelMarker); }
|
||||
@ -110,6 +107,7 @@ private:
|
||||
QSplitter *m_splitter;
|
||||
GLSpectrumView *m_spectrum;
|
||||
SpectrumMeasurements *m_measurements;
|
||||
SpectrumSettings::MeasurementsPosition m_position;
|
||||
|
||||
};
|
||||
|
||||
|
@ -24,10 +24,39 @@
|
||||
#include <QGuiApplication>
|
||||
#include <QDebug>
|
||||
#include <QPainter>
|
||||
#include <QStyledItemDelegate>
|
||||
|
||||
#include "gui/spectrummeasurements.h"
|
||||
|
||||
#include <QStyledItemDelegate>
|
||||
QSize SpectrumMeasurementsTable::sizeHint() const
|
||||
{
|
||||
// QAbstractScrollArea::sizeHint() always returns 256x192 when sizeAdjustPolicy == AdjustIgnored
|
||||
// If using AdjustToContents policy, the default sizeHint includes the stretched empty column
|
||||
// which we don't want, as that prevents the Auto Stack feature from reducing it
|
||||
// So we need some custom code to set size ignoring this column
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
for (int i = 0; i < columnCount() - 1; i++) { // -1 to ignore empty column at end of row
|
||||
width += columnWidth(i);
|
||||
}
|
||||
for (int i = 0; i < rowCount(); i++) {
|
||||
height += rowHeight(i);
|
||||
}
|
||||
|
||||
int doubleFrame = 2 * frameWidth();
|
||||
|
||||
width += verticalHeader()->width() + doubleFrame;
|
||||
height += horizontalHeader()->height() + doubleFrame;
|
||||
|
||||
return QSize(width, height);
|
||||
}
|
||||
|
||||
QSize SpectrumMeasurementsTable::minimumSizeHint() const
|
||||
{
|
||||
QSize min1 = QTableWidget::minimumSizeHint(); // This seems to include vertical space for scroll bar, which we don't need
|
||||
int height = horizontalHeader()->height() + 2 * frameWidth() + rowHeight(0);
|
||||
return QSize(min1.width(), height);
|
||||
}
|
||||
|
||||
class SDRGUI_API UnitsDelegate : public QStyledItemDelegate {
|
||||
|
||||
@ -138,7 +167,6 @@ void UnitsDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
|
||||
painter->drawText(option.rect.x() + option.rect.width() - 1 - sWidth, y, s);
|
||||
}
|
||||
|
||||
|
||||
const QStringList SpectrumMeasurements::m_measurementColumns = {
|
||||
"Current",
|
||||
"Mean",
|
||||
@ -184,7 +212,7 @@ SpectrumMeasurements::SpectrumMeasurements(QWidget *parent) :
|
||||
|
||||
void SpectrumMeasurements::createMeasurementsTable(const QStringList &rows, const QStringList &units)
|
||||
{
|
||||
m_table = new QTableWidget();
|
||||
m_table = new SpectrumMeasurementsTable();
|
||||
|
||||
m_table->horizontalHeader()->setSectionsMovable(true);
|
||||
m_table->verticalHeader()->setSectionsMovable(true);
|
||||
@ -196,16 +224,7 @@ void SpectrumMeasurements::createMeasurementsTable(const QStringList &rows, cons
|
||||
item->setToolTip(m_tooltips[i]);
|
||||
m_table->setHorizontalHeaderItem(i, item);
|
||||
}
|
||||
|
||||
// Cell context menu
|
||||
m_table->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_table, &QTableWidget::customContextMenuRequested, this, &SpectrumMeasurements::tableContextMenu);
|
||||
|
||||
m_table->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
m_table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
||||
|
||||
// Fill up space at end of rows
|
||||
m_table->horizontalHeader()->setSectionResizeMode(COL_EMPTY, QHeaderView::Stretch);
|
||||
m_table->horizontalHeader()->setStretchLastSection(true);
|
||||
|
||||
m_table->setRowCount(rows.size());
|
||||
for (int i = 0; i < rows.size(); i++)
|
||||
@ -232,16 +251,23 @@ void SpectrumMeasurements::createMeasurementsTable(const QStringList &rows, cons
|
||||
m_measurements.append(m);
|
||||
}
|
||||
resizeMeasurementsTable();
|
||||
|
||||
m_table->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
m_table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
||||
|
||||
for (int i = 0; i < COL_COUNT; i++) {
|
||||
m_table->setItemDelegateForColumn(i, new UnitsDelegate());
|
||||
}
|
||||
createTableMenus();
|
||||
|
||||
// Cell context menu
|
||||
m_table->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_table, &QTableWidget::customContextMenuRequested, this, &SpectrumMeasurements::tableContextMenu);
|
||||
}
|
||||
|
||||
void SpectrumMeasurements::createPeakTable(int peaks)
|
||||
{
|
||||
m_peakTable = new QTableWidget();
|
||||
m_peakTable = new SpectrumMeasurementsTable();
|
||||
m_peakTable->horizontalHeader()->setSectionsMovable(true);
|
||||
|
||||
QStringList columns = QStringList{"Frequency", "Power", ""};
|
||||
@ -252,6 +278,8 @@ void SpectrumMeasurements::createPeakTable(int peaks)
|
||||
for (int i = 0; i < columns.size(); i++) {
|
||||
m_peakTable->setHorizontalHeaderItem(i, new QTableWidgetItem(columns[i]));
|
||||
}
|
||||
m_peakTable->horizontalHeader()->setStretchLastSection(true);
|
||||
|
||||
for (int i = 0; i < peaks; i++)
|
||||
{
|
||||
for (int j = 0; j < 3; j++)
|
||||
@ -269,15 +297,12 @@ void SpectrumMeasurements::createPeakTable(int peaks)
|
||||
}
|
||||
resizePeakTable();
|
||||
|
||||
m_peakTable->setItemDelegateForColumn(COL_FREQUENCY, new UnitsDelegate());
|
||||
m_peakTable->setItemDelegateForColumn(COL_POWER, new UnitsDelegate());
|
||||
|
||||
// Fill up space at end of rows
|
||||
m_peakTable->horizontalHeader()->setSectionResizeMode(COL_PEAK_EMPTY, QHeaderView::Stretch);
|
||||
|
||||
m_peakTable->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
m_peakTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
||||
|
||||
m_peakTable->setItemDelegateForColumn(COL_FREQUENCY, new UnitsDelegate());
|
||||
m_peakTable->setItemDelegateForColumn(COL_POWER, new UnitsDelegate());
|
||||
|
||||
// Cell context menu
|
||||
m_peakTable->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_peakTable, &QTableWidget::customContextMenuRequested, this, &SpectrumMeasurements::peakTableContextMenu);
|
||||
@ -287,7 +312,7 @@ void SpectrumMeasurements::createTableMenus()
|
||||
{
|
||||
// Add context menu to allow hiding/showing of columns
|
||||
m_rowMenu = new QMenu(m_table);
|
||||
for (int i = 0; i < m_table->verticalHeader()->count(); i++)
|
||||
for (int i = 0; i < m_table->verticalHeader()->count() - 1; i++) // -1 to skip empty column
|
||||
{
|
||||
QString text = m_table->verticalHeaderItem(i)->text();
|
||||
m_rowMenu->addAction(createCheckableItem(text, i, true, true));
|
||||
@ -495,6 +520,18 @@ void SpectrumMeasurements::setMeasurementParams(SpectrumSettings::Measurement me
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Set size to show full table
|
||||
if (m_peakTable)
|
||||
{
|
||||
m_peakTable->show(); // Need to call show() so that sizeHint() is not 0,0
|
||||
resize(sizeHint());
|
||||
}
|
||||
else if (m_table)
|
||||
{
|
||||
m_table->show();
|
||||
resize(sizeHint());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,14 @@
|
||||
#include "dsp/spectrumsettings.h"
|
||||
#include "export.h"
|
||||
|
||||
class SDRGUI_API SpectrumMeasurementsTable : public QTableWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
virtual QSize sizeHint() const override;
|
||||
virtual QSize minimumSizeHint() const override;
|
||||
};
|
||||
|
||||
// Displays spectrum measurements in a table
|
||||
class SDRGUI_API SpectrumMeasurements : public QWidget {
|
||||
Q_OBJECT
|
||||
@ -113,12 +121,12 @@ private:
|
||||
SpectrumSettings::Measurement m_measurement;
|
||||
int m_precision;
|
||||
|
||||
QTableWidget *m_table;
|
||||
SpectrumMeasurementsTable *m_table;
|
||||
QMenu *m_rowMenu;
|
||||
QMenu *m_columnMenu;
|
||||
QList<Measurement> m_measurements;
|
||||
|
||||
QTableWidget *m_peakTable;
|
||||
SpectrumMeasurementsTable *m_peakTable;
|
||||
QBrush m_textBrush;
|
||||
QBrush m_redBrush;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user