mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-26 09:48:45 -05:00
Merge pull request #1462 from srcejon/spec_measurements_size
Spectrum measurements - Size splitter to table
This commit is contained in:
commit
8a9662cf3f
@ -32,6 +32,7 @@ GLSpectrum::GLSpectrum(QWidget *parent) :
|
|||||||
m_spectrum->setMeasurements(m_measurements);
|
m_spectrum->setMeasurements(m_measurements);
|
||||||
m_splitter->addWidget(m_spectrum);
|
m_splitter->addWidget(m_spectrum);
|
||||||
m_splitter->addWidget(m_measurements);
|
m_splitter->addWidget(m_measurements);
|
||||||
|
m_position = SpectrumSettings::PositionBelow;
|
||||||
QVBoxLayout *layout = new QVBoxLayout(this);
|
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||||
layout->setContentsMargins(0, 0, 0, 0);
|
layout->setContentsMargins(0, 0, 0, 0);
|
||||||
layout->addWidget(m_splitter);
|
layout->addWidget(m_splitter);
|
||||||
@ -66,4 +67,77 @@ void GLSpectrum::setMeasurementsPosition(SpectrumSettings::MeasurementsPosition
|
|||||||
m_splitter->insertWidget(0, m_spectrum);
|
m_splitter->insertWidget(0, m_spectrum);
|
||||||
break;
|
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 setUseCalibration(bool useCalibration) { m_spectrum->setUseCalibration(useCalibration); }
|
||||||
void setMeasurementParams(SpectrumSettings::Measurement measurement,
|
void setMeasurementParams(SpectrumSettings::Measurement measurement,
|
||||||
int centerFrequencyOffset, int bandwidth, int chSpacing, int adjChBandwidth,
|
int centerFrequencyOffset, int bandwidth, int chSpacing, int adjChBandwidth,
|
||||||
int harmonics, int peaks, bool highlight, int precision)
|
int harmonics, int peaks, bool highlight, int precision);
|
||||||
{
|
|
||||||
m_spectrum->setMeasurementParams(measurement, centerFrequencyOffset, bandwidth, chSpacing, adjChBandwidth, harmonics, peaks, highlight, precision);
|
|
||||||
}
|
|
||||||
qint32 getSampleRate() const { return m_spectrum->getSampleRate(); }
|
qint32 getSampleRate() const { return m_spectrum->getSampleRate(); }
|
||||||
void addChannelMarker(ChannelMarker* channelMarker) { m_spectrum->addChannelMarker(channelMarker); }
|
void addChannelMarker(ChannelMarker* channelMarker) { m_spectrum->addChannelMarker(channelMarker); }
|
||||||
void removeChannelMarker(ChannelMarker* channelMarker) { m_spectrum->removeChannelMarker(channelMarker); }
|
void removeChannelMarker(ChannelMarker* channelMarker) { m_spectrum->removeChannelMarker(channelMarker); }
|
||||||
@ -110,6 +107,7 @@ private:
|
|||||||
QSplitter *m_splitter;
|
QSplitter *m_splitter;
|
||||||
GLSpectrumView *m_spectrum;
|
GLSpectrumView *m_spectrum;
|
||||||
SpectrumMeasurements *m_measurements;
|
SpectrumMeasurements *m_measurements;
|
||||||
|
SpectrumSettings::MeasurementsPosition m_position;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -373,6 +373,10 @@ bool RollupContents::event(QEvent* event)
|
|||||||
((QChildEvent*)event)->child()->removeEventFilter(this);
|
((QChildEvent*)event)->child()->removeEventFilter(this);
|
||||||
arrangeRollups();
|
arrangeRollups();
|
||||||
}
|
}
|
||||||
|
else if (event->type() == QEvent::LayoutRequest)
|
||||||
|
{
|
||||||
|
arrangeRollups();
|
||||||
|
}
|
||||||
|
|
||||||
return QWidget::event(event);
|
return QWidget::event(event);
|
||||||
}
|
}
|
||||||
|
@ -576,6 +576,10 @@ bool RollupWidget::event(QEvent* event)
|
|||||||
((QChildEvent*)event)->child()->removeEventFilter(this);
|
((QChildEvent*)event)->child()->removeEventFilter(this);
|
||||||
arrangeRollups();
|
arrangeRollups();
|
||||||
}
|
}
|
||||||
|
else if (event->type() == QEvent::LayoutRequest)
|
||||||
|
{
|
||||||
|
arrangeRollups();
|
||||||
|
}
|
||||||
|
|
||||||
return QWidget::event(event);
|
return QWidget::event(event);
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,39 @@
|
|||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
#include <QStyledItemDelegate>
|
||||||
|
|
||||||
#include "gui/spectrummeasurements.h"
|
#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 {
|
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);
|
painter->drawText(option.rect.x() + option.rect.width() - 1 - sWidth, y, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const QStringList SpectrumMeasurements::m_measurementColumns = {
|
const QStringList SpectrumMeasurements::m_measurementColumns = {
|
||||||
"Current",
|
"Current",
|
||||||
"Mean",
|
"Mean",
|
||||||
@ -184,7 +212,7 @@ SpectrumMeasurements::SpectrumMeasurements(QWidget *parent) :
|
|||||||
|
|
||||||
void SpectrumMeasurements::createMeasurementsTable(const QStringList &rows, const QStringList &units)
|
void SpectrumMeasurements::createMeasurementsTable(const QStringList &rows, const QStringList &units)
|
||||||
{
|
{
|
||||||
m_table = new QTableWidget();
|
m_table = new SpectrumMeasurementsTable();
|
||||||
|
|
||||||
m_table->horizontalHeader()->setSectionsMovable(true);
|
m_table->horizontalHeader()->setSectionsMovable(true);
|
||||||
m_table->verticalHeader()->setSectionsMovable(true);
|
m_table->verticalHeader()->setSectionsMovable(true);
|
||||||
@ -196,16 +224,7 @@ void SpectrumMeasurements::createMeasurementsTable(const QStringList &rows, cons
|
|||||||
item->setToolTip(m_tooltips[i]);
|
item->setToolTip(m_tooltips[i]);
|
||||||
m_table->setHorizontalHeaderItem(i, item);
|
m_table->setHorizontalHeaderItem(i, item);
|
||||||
}
|
}
|
||||||
|
m_table->horizontalHeader()->setStretchLastSection(true);
|
||||||
// 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->setRowCount(rows.size());
|
m_table->setRowCount(rows.size());
|
||||||
for (int i = 0; i < rows.size(); i++)
|
for (int i = 0; i < rows.size(); i++)
|
||||||
@ -232,16 +251,23 @@ void SpectrumMeasurements::createMeasurementsTable(const QStringList &rows, cons
|
|||||||
m_measurements.append(m);
|
m_measurements.append(m);
|
||||||
}
|
}
|
||||||
resizeMeasurementsTable();
|
resizeMeasurementsTable();
|
||||||
|
|
||||||
|
m_table->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||||
|
m_table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
||||||
|
|
||||||
for (int i = 0; i < COL_COUNT; i++) {
|
for (int i = 0; i < COL_COUNT; i++) {
|
||||||
m_table->setItemDelegateForColumn(i, new UnitsDelegate());
|
m_table->setItemDelegateForColumn(i, new UnitsDelegate());
|
||||||
}
|
}
|
||||||
createTableMenus();
|
createTableMenus();
|
||||||
|
|
||||||
|
// Cell context menu
|
||||||
|
m_table->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
connect(m_table, &QTableWidget::customContextMenuRequested, this, &SpectrumMeasurements::tableContextMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpectrumMeasurements::createPeakTable(int peaks)
|
void SpectrumMeasurements::createPeakTable(int peaks)
|
||||||
{
|
{
|
||||||
m_peakTable = new QTableWidget();
|
m_peakTable = new SpectrumMeasurementsTable();
|
||||||
m_peakTable->horizontalHeader()->setSectionsMovable(true);
|
m_peakTable->horizontalHeader()->setSectionsMovable(true);
|
||||||
|
|
||||||
QStringList columns = QStringList{"Frequency", "Power", ""};
|
QStringList columns = QStringList{"Frequency", "Power", ""};
|
||||||
@ -252,6 +278,8 @@ void SpectrumMeasurements::createPeakTable(int peaks)
|
|||||||
for (int i = 0; i < columns.size(); i++) {
|
for (int i = 0; i < columns.size(); i++) {
|
||||||
m_peakTable->setHorizontalHeaderItem(i, new QTableWidgetItem(columns[i]));
|
m_peakTable->setHorizontalHeaderItem(i, new QTableWidgetItem(columns[i]));
|
||||||
}
|
}
|
||||||
|
m_peakTable->horizontalHeader()->setStretchLastSection(true);
|
||||||
|
|
||||||
for (int i = 0; i < peaks; i++)
|
for (int i = 0; i < peaks; i++)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < 3; j++)
|
for (int j = 0; j < 3; j++)
|
||||||
@ -269,15 +297,12 @@ void SpectrumMeasurements::createPeakTable(int peaks)
|
|||||||
}
|
}
|
||||||
resizePeakTable();
|
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->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||||
m_peakTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
m_peakTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
||||||
|
|
||||||
|
m_peakTable->setItemDelegateForColumn(COL_FREQUENCY, new UnitsDelegate());
|
||||||
|
m_peakTable->setItemDelegateForColumn(COL_POWER, new UnitsDelegate());
|
||||||
|
|
||||||
// Cell context menu
|
// Cell context menu
|
||||||
m_peakTable->setContextMenuPolicy(Qt::CustomContextMenu);
|
m_peakTable->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
connect(m_peakTable, &QTableWidget::customContextMenuRequested, this, &SpectrumMeasurements::peakTableContextMenu);
|
connect(m_peakTable, &QTableWidget::customContextMenuRequested, this, &SpectrumMeasurements::peakTableContextMenu);
|
||||||
@ -287,7 +312,7 @@ void SpectrumMeasurements::createTableMenus()
|
|||||||
{
|
{
|
||||||
// Add context menu to allow hiding/showing of columns
|
// Add context menu to allow hiding/showing of columns
|
||||||
m_rowMenu = new QMenu(m_table);
|
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();
|
QString text = m_table->verticalHeaderItem(i)->text();
|
||||||
m_rowMenu->addAction(createCheckableItem(text, i, true, true));
|
m_rowMenu->addAction(createCheckableItem(text, i, true, true));
|
||||||
@ -495,6 +520,18 @@ void SpectrumMeasurements::setMeasurementParams(SpectrumSettings::Measurement me
|
|||||||
default:
|
default:
|
||||||
break;
|
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 "dsp/spectrumsettings.h"
|
||||||
#include "export.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
|
// Displays spectrum measurements in a table
|
||||||
class SDRGUI_API SpectrumMeasurements : public QWidget {
|
class SDRGUI_API SpectrumMeasurements : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -113,12 +121,12 @@ private:
|
|||||||
SpectrumSettings::Measurement m_measurement;
|
SpectrumSettings::Measurement m_measurement;
|
||||||
int m_precision;
|
int m_precision;
|
||||||
|
|
||||||
QTableWidget *m_table;
|
SpectrumMeasurementsTable *m_table;
|
||||||
QMenu *m_rowMenu;
|
QMenu *m_rowMenu;
|
||||||
QMenu *m_columnMenu;
|
QMenu *m_columnMenu;
|
||||||
QList<Measurement> m_measurements;
|
QList<Measurement> m_measurements;
|
||||||
|
|
||||||
QTableWidget *m_peakTable;
|
SpectrumMeasurementsTable *m_peakTable;
|
||||||
QBrush m_textBrush;
|
QBrush m_textBrush;
|
||||||
QBrush m_redBrush;
|
QBrush m_redBrush;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user