Commit 33723056459adec972927aa46331bd5675b02886
Committed by
David Gräff
1 parent
dc4cbc9c
Add sliders to the zoom view
Showing
3 changed files
with
222 additions
and
108 deletions
openhantek/src/dsowidget.cpp
| @@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
| 6 | #include <QGridLayout> | 6 | #include <QGridLayout> |
| 7 | #include <QLabel> | 7 | #include <QLabel> |
| 8 | #include <QTimer> | 8 | #include <QTimer> |
| 9 | +#include <QSignalBlocker> | ||
| 9 | 10 | ||
| 10 | #include "dsowidget.h" | 11 | #include "dsowidget.h" |
| 11 | 12 | ||
| @@ -20,6 +21,8 @@ | @@ -20,6 +21,8 @@ | ||
| 20 | #include "viewconstants.h" | 21 | #include "viewconstants.h" |
| 21 | #include "analyse/dataanalyzerresult.h" | 22 | #include "analyse/dataanalyzerresult.h" |
| 22 | 23 | ||
| 24 | +static int zoomScopeRow = 0; | ||
| 25 | + | ||
| 23 | DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso::ControlSpecification *spec, QWidget *parent, Qt::WindowFlags flags) | 26 | DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso::ControlSpecification *spec, QWidget *parent, Qt::WindowFlags flags) |
| 24 | : QWidget(parent, flags), scope(scope), view(view), spec(spec), generator(new GlGenerator()), | 27 | : QWidget(parent, flags), scope(scope), view(view), spec(spec), generator(new GlGenerator()), |
| 25 | mainScope(GlScope::createNormal(scope, view, generator)), zoomScope(GlScope::createZoomed(scope, view, generator)) { | 28 | mainScope(GlScope::createNormal(scope, view, generator)), zoomScope(GlScope::createZoomed(scope, view, generator)) { |
| @@ -29,61 +32,13 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | @@ -29,61 +32,13 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | ||
| 29 | palette.setColor(QPalette::Background, view->screen.background); | 32 | palette.setColor(QPalette::Background, view->screen.background); |
| 30 | palette.setColor(QPalette::WindowText, view->screen.text); | 33 | palette.setColor(QPalette::WindowText, view->screen.text); |
| 31 | 34 | ||
| 32 | - // The offset sliders for all possible channels | ||
| 33 | - offsetSlider = new LevelSlider(Qt::RightArrow); | ||
| 34 | - for (ChannelID channel = 0; channel < scope->voltage.size(); ++channel) { | ||
| 35 | - offsetSlider->addSlider(scope->voltage[channel].name, channel); | ||
| 36 | - offsetSlider->setColor(channel, view->screen.voltage[channel]); | ||
| 37 | - offsetSlider->setLimits(channel, -DIVS_VOLTAGE / 2, DIVS_VOLTAGE / 2); | ||
| 38 | - offsetSlider->setStep(channel, 0.2); | ||
| 39 | - offsetSlider->setValue(channel, scope->voltage[channel].offset); | ||
| 40 | - offsetSlider->setIndexVisible(channel, scope->voltage[channel].used); | ||
| 41 | - } | ||
| 42 | - for (ChannelID channel = 0; channel < scope->voltage.size(); ++channel) { | ||
| 43 | - offsetSlider->addSlider(scope->spectrum[channel].name, scope->voltage.size() + channel); | ||
| 44 | - offsetSlider->setColor(scope->voltage.size() + channel, view->screen.spectrum[channel]); | ||
| 45 | - offsetSlider->setLimits(scope->voltage.size() + channel, -DIVS_VOLTAGE / 2, DIVS_VOLTAGE / 2); | ||
| 46 | - offsetSlider->setStep(scope->voltage.size() + channel, 0.2); | ||
| 47 | - offsetSlider->setValue(scope->voltage.size() + channel, scope->spectrum[channel].offset); | ||
| 48 | - offsetSlider->setIndexVisible(scope->voltage.size() + channel, scope->spectrum[channel].used); | ||
| 49 | - } | ||
| 50 | - | ||
| 51 | - // The triggerPosition slider | ||
| 52 | - triggerPositionSlider = new LevelSlider(Qt::DownArrow); | ||
| 53 | - triggerPositionSlider->addSlider(); | ||
| 54 | - triggerPositionSlider->setLimits(0, 0.0, 1.0); | ||
| 55 | - triggerPositionSlider->setStep(0, 0.2 / (double)DIVS_TIME); | ||
| 56 | - triggerPositionSlider->setValue(0, scope->trigger.position); | ||
| 57 | - triggerPositionSlider->setIndexVisible(0, true); | ||
| 58 | - | ||
| 59 | - // The sliders for the trigger levels | ||
| 60 | - triggerLevelSlider = new LevelSlider(Qt::LeftArrow); | ||
| 61 | - for (ChannelID channel = 0; channel < spec->channels; ++channel) { | ||
| 62 | - triggerLevelSlider->addSlider((int)channel); | ||
| 63 | - triggerLevelSlider->setColor( | ||
| 64 | - channel, | ||
| 65 | - (!scope->trigger.special && channel == scope->trigger.source) | ||
| 66 | - ? view->screen.voltage[channel] | ||
| 67 | - : view->screen.voltage[channel].darker()); | ||
| 68 | - adaptTriggerLevelSlider(channel); | ||
| 69 | - triggerLevelSlider->setValue(channel, scope->voltage[channel].trigger); | ||
| 70 | - triggerLevelSlider->setIndexVisible(channel, scope->voltage[channel].used); | ||
| 71 | - } | ||
| 72 | - | ||
| 73 | - // The marker slider | ||
| 74 | - markerSlider = new LevelSlider(Qt::UpArrow); | ||
| 75 | - for (int marker = 0; marker < MARKER_COUNT; ++marker) { | ||
| 76 | - markerSlider->addSlider(QString::number(marker + 1), marker); | ||
| 77 | - markerSlider->setLimits(marker, -DIVS_TIME / 2, DIVS_TIME / 2); | ||
| 78 | - markerSlider->setStep(marker, DIVS_TIME / 100.0); | ||
| 79 | - markerSlider->setValue(marker, scope->horizontal.marker[marker]); | ||
| 80 | - markerSlider->setIndexVisible(marker, true); | ||
| 81 | - } | 35 | + setupSliders(mainSliders); |
| 36 | + setupSliders(zoomSliders); | ||
| 82 | 37 | ||
| 83 | connect(mainScope, &GlScope::markerMoved, [this] (int marker, double position) { | 38 | connect(mainScope, &GlScope::markerMoved, [this] (int marker, double position) { |
| 84 | - double step = this->markerSlider->step(marker); | 39 | + double step = this->mainSliders.markerSlider->step(marker); |
| 85 | this->scope->horizontal.marker[marker] = | 40 | this->scope->horizontal.marker[marker] = |
| 86 | - this->markerSlider->setValue(marker, std::round(position / step) * step); | 41 | + this->mainSliders.markerSlider->setValue(marker, std::round(position / step) * step); |
| 87 | }); | 42 | }); |
| 88 | 43 | ||
| 89 | // The table for the settings | 44 | // The table for the settings |
| @@ -166,7 +121,7 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | @@ -166,7 +121,7 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | ||
| 166 | measurementFrequencyLabel.push_back(new QLabel()); | 121 | measurementFrequencyLabel.push_back(new QLabel()); |
| 167 | measurementFrequencyLabel[channel]->setAlignment(Qt::AlignRight); | 122 | measurementFrequencyLabel[channel]->setAlignment(Qt::AlignRight); |
| 168 | measurementFrequencyLabel[channel]->setPalette(palette); | 123 | measurementFrequencyLabel[channel]->setPalette(palette); |
| 169 | - setMeasurementVisible(channel, scope->voltage[channel].used); | 124 | + setMeasurementVisible(channel); |
| 170 | measurementLayout->addWidget(measurementNameLabel[channel], (int)channel, 0); | 125 | measurementLayout->addWidget(measurementNameLabel[channel], (int)channel, 0); |
| 171 | measurementLayout->addWidget(measurementMiscLabel[channel], (int)channel, 1); | 126 | measurementLayout->addWidget(measurementMiscLabel[channel], (int)channel, 1); |
| 172 | measurementLayout->addWidget(measurementGainLabel[channel], (int)channel, 2); | 127 | measurementLayout->addWidget(measurementGainLabel[channel], (int)channel, 2); |
| @@ -184,26 +139,37 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | @@ -184,26 +139,37 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | ||
| 184 | // The layout for the widgets | 139 | // The layout for the widgets |
| 185 | mainLayout = new QGridLayout(); | 140 | mainLayout = new QGridLayout(); |
| 186 | mainLayout->setColumnStretch(2, 1); // Scopes increase their size | 141 | mainLayout->setColumnStretch(2, 1); // Scopes increase their size |
| 187 | - mainLayout->setRowStretch(3, 1); | ||
| 188 | // Bars around the scope, needed because the slider-drawing-area is outside | 142 | // Bars around the scope, needed because the slider-drawing-area is outside |
| 189 | // the scope at min/max | 143 | // the scope at min/max |
| 190 | - mainLayout->setColumnMinimumWidth(1, triggerPositionSlider->preMargin()); | ||
| 191 | - mainLayout->setColumnMinimumWidth(3, triggerPositionSlider->postMargin()); | ||
| 192 | - mainLayout->setRowMinimumHeight(2, offsetSlider->preMargin()); | ||
| 193 | - mainLayout->setRowMinimumHeight(4, offsetSlider->postMargin()); | ||
| 194 | - mainLayout->setRowMinimumHeight(6, 4); | ||
| 195 | - mainLayout->setRowMinimumHeight(8, 4); | ||
| 196 | - mainLayout->setRowMinimumHeight(10, 8); | 144 | + mainLayout->setColumnMinimumWidth(1, mainSliders.triggerPositionSlider->preMargin()); |
| 145 | + mainLayout->setColumnMinimumWidth(3, mainSliders.triggerPositionSlider->postMargin()); | ||
| 197 | mainLayout->setSpacing(0); | 146 | mainLayout->setSpacing(0); |
| 198 | - mainLayout->addLayout(settingsLayout, 0, 0, 1, 5); | ||
| 199 | - mainLayout->addWidget(mainScope, 3, 2); | ||
| 200 | - mainLayout->addWidget(offsetSlider, 2, 0, 3, 2, Qt::AlignRight); | ||
| 201 | - mainLayout->addWidget(triggerPositionSlider, 1, 1, 2, 3, Qt::AlignBottom); | ||
| 202 | - mainLayout->addWidget(triggerLevelSlider, 2, 3, 3, 2, Qt::AlignLeft); | ||
| 203 | - mainLayout->addWidget(markerSlider, 4, 1, 2, 3, Qt::AlignTop); | ||
| 204 | - mainLayout->addLayout(markerLayout, 7, 0, 1, 5); | ||
| 205 | - mainLayout->addWidget(zoomScope, 9, 2); | ||
| 206 | - mainLayout->addLayout(measurementLayout, 11, 0, 1, 5); | 147 | + int row = 0; |
| 148 | + mainLayout->addLayout(settingsLayout, row++, 0, 1, 5); | ||
| 149 | + // 5x5 box for mainScope & mainSliders | ||
| 150 | + mainLayout->setRowMinimumHeight(row + 1, mainSliders.offsetSlider->preMargin()); | ||
| 151 | + mainLayout->setRowMinimumHeight(row + 3, mainSliders.offsetSlider->postMargin()); | ||
| 152 | + mainLayout->setRowStretch(row + 2, 1); | ||
| 153 | + mainLayout->addWidget(mainScope, row + 2, 2); | ||
| 154 | + mainLayout->addWidget(mainSliders.offsetSlider, row + 1, 0, 3, 2, Qt::AlignRight); | ||
| 155 | + mainLayout->addWidget(mainSliders.triggerPositionSlider, row, 1, 2, 3, Qt::AlignBottom); | ||
| 156 | + mainLayout->addWidget(mainSliders.triggerLevelSlider, row + 1, 3, 3, 2, Qt::AlignLeft); | ||
| 157 | + mainLayout->addWidget(mainSliders.markerSlider, row + 3, 1, 2, 3, Qt::AlignTop); | ||
| 158 | + row += 5; | ||
| 159 | + // Separators and markerLayout | ||
| 160 | + mainLayout->setRowMinimumHeight(row++, 4); | ||
| 161 | + mainLayout->addLayout(markerLayout, row++, 0, 1, 5); | ||
| 162 | + mainLayout->setRowMinimumHeight(row++, 4); | ||
| 163 | + // 5x5 box for zoomScope & zoomSliders | ||
| 164 | + zoomScopeRow = row + 2; | ||
| 165 | + mainLayout->addWidget(zoomScope, zoomScopeRow, 2); | ||
| 166 | + mainLayout->addWidget(zoomSliders.offsetSlider, row + 1, 0, 3, 2, Qt::AlignRight); | ||
| 167 | + mainLayout->addWidget(zoomSliders.triggerPositionSlider, row, 1, 2, 3, Qt::AlignBottom); | ||
| 168 | + mainLayout->addWidget(zoomSliders.triggerLevelSlider, row + 1, 3, 3, 2, Qt::AlignLeft); | ||
| 169 | + row += 5; | ||
| 170 | + // Separator and embedded measurementLayout | ||
| 171 | + mainLayout->setRowMinimumHeight(row++, 8); | ||
| 172 | + mainLayout->addLayout(measurementLayout, row++, 0, 1, 5); | ||
| 207 | 173 | ||
| 208 | // Apply settings and update measured values | 174 | // Apply settings and update measured values |
| 209 | updateTriggerDetails(); | 175 | updateTriggerDetails(); |
| @@ -220,15 +186,77 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | @@ -220,15 +186,77 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: | ||
| 220 | setLayout(mainLayout); | 186 | setLayout(mainLayout); |
| 221 | 187 | ||
| 222 | // Connect change-signals of sliders | 188 | // Connect change-signals of sliders |
| 223 | - connect(offsetSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateOffset); | ||
| 224 | - connect(triggerPositionSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateTriggerPosition); | ||
| 225 | - connect(triggerLevelSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateTriggerLevel); | ||
| 226 | - connect(markerSlider, &LevelSlider::valueChanged, [this](int index, double value) { | 189 | + connect(mainSliders.offsetSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateOffset); |
| 190 | + connect(zoomSliders.offsetSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateOffset); | ||
| 191 | + | ||
| 192 | + connect(mainSliders.triggerPositionSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateTriggerPosition); | ||
| 193 | + zoomSliders.triggerPositionSlider->setEnabled(false); | ||
| 194 | + | ||
| 195 | + connect(mainSliders.triggerLevelSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateTriggerLevel); | ||
| 196 | + connect(zoomSliders.triggerLevelSlider, &LevelSlider::valueChanged, this, &DsoWidget::updateTriggerLevel); | ||
| 197 | + | ||
| 198 | + connect(mainSliders.markerSlider, &LevelSlider::valueChanged, [this](int index, double value) { | ||
| 227 | updateMarker(index, value); | 199 | updateMarker(index, value); |
| 228 | mainScope->update(); | 200 | mainScope->update(); |
| 229 | zoomScope->update(); | 201 | zoomScope->update(); |
| 230 | }); | 202 | }); |
| 203 | + zoomSliders.markerSlider->setEnabled(false); | ||
| 204 | + | ||
| 231 | updateTriggerSource(); | 205 | updateTriggerSource(); |
| 206 | + adaptTriggerPositionSlider(); | ||
| 207 | +} | ||
| 208 | + | ||
| 209 | +void DsoWidget::setupSliders(DsoWidget::Sliders &sliders) { | ||
| 210 | + // The offset sliders for all possible channels | ||
| 211 | + sliders.offsetSlider = new LevelSlider(Qt::RightArrow); | ||
| 212 | + for (ChannelID channel = 0; channel < scope->voltage.size(); ++channel) { | ||
| 213 | + sliders.offsetSlider->addSlider(scope->voltage[channel].name, channel); | ||
| 214 | + sliders.offsetSlider->setColor(channel, view->screen.voltage[channel]); | ||
| 215 | + sliders.offsetSlider->setLimits(channel, -DIVS_VOLTAGE / 2, DIVS_VOLTAGE / 2); | ||
| 216 | + sliders.offsetSlider->setStep(channel, 0.2); | ||
| 217 | + sliders.offsetSlider->setValue(channel, scope->voltage[channel].offset); | ||
| 218 | + sliders.offsetSlider->setIndexVisible(channel, scope->voltage[channel].used); | ||
| 219 | + } | ||
| 220 | + for (ChannelID channel = 0; channel < scope->voltage.size(); ++channel) { | ||
| 221 | + sliders.offsetSlider->addSlider(scope->spectrum[channel].name, scope->voltage.size() + channel); | ||
| 222 | + sliders.offsetSlider->setColor(scope->voltage.size() + channel, view->screen.spectrum[channel]); | ||
| 223 | + sliders.offsetSlider->setLimits(scope->voltage.size() + channel, -DIVS_VOLTAGE / 2, DIVS_VOLTAGE / 2); | ||
| 224 | + sliders.offsetSlider->setStep(scope->voltage.size() + channel, 0.2); | ||
| 225 | + sliders.offsetSlider->setValue(scope->voltage.size() + channel, scope->spectrum[channel].offset); | ||
| 226 | + sliders.offsetSlider->setIndexVisible(scope->voltage.size() + channel, scope->spectrum[channel].used); | ||
| 227 | + } | ||
| 228 | + | ||
| 229 | + // The triggerPosition slider | ||
| 230 | + sliders.triggerPositionSlider = new LevelSlider(Qt::DownArrow); | ||
| 231 | + sliders.triggerPositionSlider->addSlider(); | ||
| 232 | + sliders.triggerPositionSlider->setLimits(0, 0.0, 1.0); | ||
| 233 | + sliders.triggerPositionSlider->setStep(0, 0.2 / (double)DIVS_TIME); | ||
| 234 | + sliders.triggerPositionSlider->setValue(0, scope->trigger.position); | ||
| 235 | + sliders.triggerPositionSlider->setIndexVisible(0, true); | ||
| 236 | + | ||
| 237 | + // The sliders for the trigger levels | ||
| 238 | + sliders.triggerLevelSlider = new LevelSlider(Qt::LeftArrow); | ||
| 239 | + for (ChannelID channel = 0; channel < spec->channels; ++channel) { | ||
| 240 | + sliders.triggerLevelSlider->addSlider((int)channel); | ||
| 241 | + sliders.triggerLevelSlider->setColor( | ||
| 242 | + channel, | ||
| 243 | + (!scope->trigger.special && channel == scope->trigger.source) | ||
| 244 | + ? view->screen.voltage[channel] | ||
| 245 | + : view->screen.voltage[channel].darker()); | ||
| 246 | + adaptTriggerLevelSlider(sliders, channel); | ||
| 247 | + sliders.triggerLevelSlider->setValue(channel, scope->voltage[channel].trigger); | ||
| 248 | + sliders.triggerLevelSlider->setIndexVisible(channel, scope->voltage[channel].used); | ||
| 249 | + } | ||
| 250 | + | ||
| 251 | + // The marker slider | ||
| 252 | + sliders.markerSlider = new LevelSlider(Qt::UpArrow); | ||
| 253 | + for (int marker = 0; marker < MARKER_COUNT; ++marker) { | ||
| 254 | + sliders.markerSlider->addSlider(QString::number(marker + 1), marker); | ||
| 255 | + sliders.markerSlider->setLimits(marker, -DIVS_TIME / 2, DIVS_TIME / 2); | ||
| 256 | + sliders.markerSlider->setStep(marker, DIVS_TIME / 100.0); | ||
| 257 | + sliders.markerSlider->setValue(marker, scope->horizontal.marker[marker]); | ||
| 258 | + sliders.markerSlider->setIndexVisible(marker, true); | ||
| 259 | + } | ||
| 232 | } | 260 | } |
| 233 | 261 | ||
| 234 | void DsoWidget::showNewData(std::unique_ptr<DataAnalyzerResult> data) { | 262 | void DsoWidget::showNewData(std::unique_ptr<DataAnalyzerResult> data) { |
| @@ -243,27 +271,38 @@ void DsoWidget::setExporterForNextFrame(std::unique_ptr<Exporter> exporter) | @@ -243,27 +271,38 @@ void DsoWidget::setExporterForNextFrame(std::unique_ptr<Exporter> exporter) | ||
| 243 | } | 271 | } |
| 244 | 272 | ||
| 245 | /// \brief Set the trigger level sliders minimum and maximum to the new values. | 273 | /// \brief Set the trigger level sliders minimum and maximum to the new values. |
| 246 | -void DsoWidget::adaptTriggerLevelSlider(ChannelID channel) { | ||
| 247 | - triggerLevelSlider->setLimits( | 274 | +void DsoWidget::adaptTriggerLevelSlider(DsoWidget::Sliders &sliders, ChannelID channel) { |
| 275 | + sliders.triggerLevelSlider->setLimits( | ||
| 248 | (int)channel, (-DIVS_VOLTAGE / 2 - scope->voltage[channel].offset) * scope->gain(channel), | 276 | (int)channel, (-DIVS_VOLTAGE / 2 - scope->voltage[channel].offset) * scope->gain(channel), |
| 249 | (DIVS_VOLTAGE / 2 - scope->voltage[channel].offset) * scope->gain(channel)); | 277 | (DIVS_VOLTAGE / 2 - scope->voltage[channel].offset) * scope->gain(channel)); |
| 250 | - triggerLevelSlider->setStep((int)channel, scope->gain(channel) * 0.05); | 278 | + sliders.triggerLevelSlider->setStep((int)channel, scope->gain(channel) * 0.05); |
| 251 | } | 279 | } |
| 252 | 280 | ||
| 253 | /// \brief Show/Hide a line of the measurement table. | 281 | /// \brief Show/Hide a line of the measurement table. |
| 254 | -void DsoWidget::setMeasurementVisible(ChannelID channel, bool visible) { | 282 | +void DsoWidget::setMeasurementVisible(ChannelID channel) { |
| 283 | + | ||
| 284 | + bool visible = scope->voltage[channel].used || scope->spectrum[channel].used; | ||
| 285 | + | ||
| 255 | measurementNameLabel[channel]->setVisible(visible); | 286 | measurementNameLabel[channel]->setVisible(visible); |
| 256 | measurementMiscLabel[channel]->setVisible(visible); | 287 | measurementMiscLabel[channel]->setVisible(visible); |
| 257 | - measurementGainLabel[channel]->setVisible(visible); | ||
| 258 | - measurementMagnitudeLabel[channel]->setVisible(visible); | 288 | + |
| 259 | measurementAmplitudeLabel[channel]->setVisible(visible); | 289 | measurementAmplitudeLabel[channel]->setVisible(visible); |
| 260 | measurementFrequencyLabel[channel]->setVisible(visible); | 290 | measurementFrequencyLabel[channel]->setVisible(visible); |
| 261 | if (!visible) { | 291 | if (!visible) { |
| 262 | measurementGainLabel[channel]->setText(QString()); | 292 | measurementGainLabel[channel]->setText(QString()); |
| 263 | - measurementMagnitudeLabel[channel]->setText(QString()); | ||
| 264 | measurementAmplitudeLabel[channel]->setText(QString()); | 293 | measurementAmplitudeLabel[channel]->setText(QString()); |
| 265 | measurementFrequencyLabel[channel]->setText(QString()); | 294 | measurementFrequencyLabel[channel]->setText(QString()); |
| 266 | } | 295 | } |
| 296 | + | ||
| 297 | + measurementGainLabel[channel]->setVisible(scope->voltage[channel].used); | ||
| 298 | + if (!scope->voltage[channel].used) { | ||
| 299 | + measurementGainLabel[channel]->setText(QString()); | ||
| 300 | + } | ||
| 301 | + | ||
| 302 | + measurementMagnitudeLabel[channel]->setVisible(scope->spectrum[channel].used); | ||
| 303 | + if (!scope->spectrum[channel].used) { | ||
| 304 | + measurementMagnitudeLabel[channel]->setText(QString()); | ||
| 305 | + } | ||
| 267 | } | 306 | } |
| 268 | 307 | ||
| 269 | /// \brief Update the label about the marker measurements | 308 | /// \brief Update the label about the marker measurements |
| @@ -288,7 +327,7 @@ void DsoWidget::updateMarkerDetails() { | @@ -288,7 +327,7 @@ void DsoWidget::updateMarkerDetails() { | ||
| 288 | 327 | ||
| 289 | /// \brief Update the label about the trigger settings | 328 | /// \brief Update the label about the trigger settings |
| 290 | void DsoWidget::updateSpectrumDetails(ChannelID channel) { | 329 | void DsoWidget::updateSpectrumDetails(ChannelID channel) { |
| 291 | - setMeasurementVisible(channel, scope->voltage[channel].used || scope->spectrum[channel].used); | 330 | + setMeasurementVisible(channel); |
| 292 | 331 | ||
| 293 | if (scope->spectrum[channel].used) | 332 | if (scope->spectrum[channel].used) |
| 294 | measurementMagnitudeLabel[channel]->setText( | 333 | measurementMagnitudeLabel[channel]->setText( |
| @@ -317,7 +356,7 @@ void DsoWidget::updateTriggerDetails() { | @@ -317,7 +356,7 @@ void DsoWidget::updateTriggerDetails() { | ||
| 317 | void DsoWidget::updateVoltageDetails(ChannelID channel) { | 356 | void DsoWidget::updateVoltageDetails(ChannelID channel) { |
| 318 | if (channel >= scope->voltage.size()) return; | 357 | if (channel >= scope->voltage.size()) return; |
| 319 | 358 | ||
| 320 | - setMeasurementVisible(channel, scope->voltage[channel].used || scope->spectrum[channel].used); | 359 | + setMeasurementVisible(channel); |
| 321 | 360 | ||
| 322 | if (scope->voltage[channel].used) | 361 | if (scope->voltage[channel].used) |
| 323 | measurementGainLabel[channel]->setText(valueToString(scope->gain(channel), UNIT_VOLTS, 3) + | 362 | measurementGainLabel[channel]->setText(valueToString(scope->gain(channel), UNIT_VOLTS, 3) + |
| @@ -356,7 +395,8 @@ void DsoWidget::updateSpectrumMagnitude(ChannelID channel) { updateSpectrumDetai | @@ -356,7 +395,8 @@ void DsoWidget::updateSpectrumMagnitude(ChannelID channel) { updateSpectrumDetai | ||
| 356 | void DsoWidget::updateSpectrumUsed(ChannelID channel, bool used) { | 395 | void DsoWidget::updateSpectrumUsed(ChannelID channel, bool used) { |
| 357 | if (channel >= (unsigned int)scope->voltage.size()) return; | 396 | if (channel >= (unsigned int)scope->voltage.size()) return; |
| 358 | 397 | ||
| 359 | - offsetSlider->setIndexVisible(scope->voltage.size() + channel, used); | 398 | + mainSliders.offsetSlider->setIndexVisible(scope->voltage.size() + channel, used); |
| 399 | + zoomSliders.offsetSlider->setIndexVisible(scope->voltage.size() + channel, used); | ||
| 360 | 400 | ||
| 361 | updateSpectrumDetails(channel); | 401 | updateSpectrumDetails(channel); |
| 362 | } | 402 | } |
| @@ -370,17 +410,22 @@ void DsoWidget::updateTriggerSlope() { updateTriggerDetails(); } | @@ -370,17 +410,22 @@ void DsoWidget::updateTriggerSlope() { updateTriggerDetails(); } | ||
| 370 | /// \brief Handles sourceChanged signal from the trigger dock. | 410 | /// \brief Handles sourceChanged signal from the trigger dock. |
| 371 | void DsoWidget::updateTriggerSource() { | 411 | void DsoWidget::updateTriggerSource() { |
| 372 | // Change the colors of the trigger sliders | 412 | // Change the colors of the trigger sliders |
| 373 | - if (scope->trigger.special || scope->trigger.source >= spec->channels) | ||
| 374 | - triggerPositionSlider->setColor(0, view->screen.border); | ||
| 375 | - else | ||
| 376 | - triggerPositionSlider->setColor(0, view->screen.voltage[scope->trigger.source]); | 413 | + if (scope->trigger.special || scope->trigger.source >= spec->channels) { |
| 414 | + mainSliders.triggerPositionSlider->setColor(0, view->screen.border); | ||
| 415 | + zoomSliders.triggerPositionSlider->setColor(0, view->screen.border); | ||
| 416 | + } | ||
| 417 | + else { | ||
| 418 | + mainSliders.triggerPositionSlider->setColor(0, view->screen.voltage[scope->trigger.source]); | ||
| 419 | + zoomSliders.triggerPositionSlider->setColor(0, view->screen.voltage[scope->trigger.source]); | ||
| 420 | + } | ||
| 377 | 421 | ||
| 378 | - for (ChannelID channel = 0; channel < spec->channels; ++channel) | ||
| 379 | - triggerLevelSlider->setColor( | ||
| 380 | - channel, | ||
| 381 | - (!scope->trigger.special && channel == scope->trigger.source) | ||
| 382 | - ? view->screen.voltage[channel] | ||
| 383 | - : view->screen.voltage[channel].darker()); | 422 | + for (ChannelID channel = 0; channel < spec->channels; ++channel) { |
| 423 | + QColor color = (!scope->trigger.special && channel == scope->trigger.source) | ||
| 424 | + ? view->screen.voltage[channel] | ||
| 425 | + : view->screen.voltage[channel].darker(); | ||
| 426 | + mainSliders.triggerLevelSlider->setColor(channel, color); | ||
| 427 | + zoomSliders.triggerLevelSlider->setColor(channel, color); | ||
| 428 | + } | ||
| 384 | 429 | ||
| 385 | updateTriggerDetails(); | 430 | updateTriggerDetails(); |
| 386 | } | 431 | } |
| @@ -404,7 +449,10 @@ void DsoWidget::updateMathMode() { | @@ -404,7 +449,10 @@ void DsoWidget::updateMathMode() { | ||
| 404 | void DsoWidget::updateVoltageGain(ChannelID channel) { | 449 | void DsoWidget::updateVoltageGain(ChannelID channel) { |
| 405 | if (channel >= (unsigned int)scope->voltage.size()) return; | 450 | if (channel >= (unsigned int)scope->voltage.size()) return; |
| 406 | 451 | ||
| 407 | - if (channel < spec->channels) adaptTriggerLevelSlider(channel); | 452 | + if (channel < spec->channels) { |
| 453 | + adaptTriggerLevelSlider(mainSliders, channel); | ||
| 454 | + adaptTriggerLevelSlider(zoomSliders, channel); | ||
| 455 | + } | ||
| 408 | 456 | ||
| 409 | updateVoltageDetails(channel); | 457 | updateVoltageDetails(channel); |
| 410 | } | 458 | } |
| @@ -415,10 +463,13 @@ void DsoWidget::updateVoltageGain(ChannelID channel) { | @@ -415,10 +463,13 @@ void DsoWidget::updateVoltageGain(ChannelID channel) { | ||
| 415 | void DsoWidget::updateVoltageUsed(ChannelID channel, bool used) { | 463 | void DsoWidget::updateVoltageUsed(ChannelID channel, bool used) { |
| 416 | if (channel >= (unsigned int)scope->voltage.size()) return; | 464 | if (channel >= (unsigned int)scope->voltage.size()) return; |
| 417 | 465 | ||
| 418 | - offsetSlider->setIndexVisible(channel, used); | ||
| 419 | - triggerLevelSlider->setIndexVisible(channel, used); | ||
| 420 | - setMeasurementVisible(channel, scope->voltage[channel].used); | 466 | + mainSliders.offsetSlider->setIndexVisible(channel, used); |
| 467 | + zoomSliders.offsetSlider->setIndexVisible(channel, used); | ||
| 468 | + | ||
| 469 | + mainSliders.triggerLevelSlider->setIndexVisible(channel, used); | ||
| 470 | + zoomSliders.triggerLevelSlider->setIndexVisible(channel, used); | ||
| 421 | 471 | ||
| 472 | + setMeasurementVisible(channel); | ||
| 422 | updateVoltageDetails(channel); | 473 | updateVoltageDetails(channel); |
| 423 | } | 474 | } |
| 424 | 475 | ||
| @@ -427,11 +478,22 @@ void DsoWidget::updateRecordLength(unsigned long size) { | @@ -427,11 +478,22 @@ void DsoWidget::updateRecordLength(unsigned long size) { | ||
| 427 | settingsRecordLengthLabel->setText(valueToString(size, UNIT_SAMPLES, 4)); | 478 | settingsRecordLengthLabel->setText(valueToString(size, UNIT_SAMPLES, 4)); |
| 428 | } | 479 | } |
| 429 | 480 | ||
| 430 | -/// \brief Stop the oscilloscope. | 481 | +/// \brief Show/hide the zoom view. |
| 431 | void DsoWidget::updateZoom(bool enabled) { | 482 | void DsoWidget::updateZoom(bool enabled) { |
| 432 | - mainLayout->setRowStretch(9, enabled ? 1 : 0); | 483 | + mainLayout->setRowStretch(zoomScopeRow, enabled ? 1 : 0); |
| 433 | zoomScope->setVisible(enabled); | 484 | zoomScope->setVisible(enabled); |
| 434 | 485 | ||
| 486 | + if (enabled) { | ||
| 487 | + zoomSliders.offsetSlider->show(); | ||
| 488 | + zoomSliders.triggerPositionSlider->show(); | ||
| 489 | + zoomSliders.triggerLevelSlider->show(); | ||
| 490 | + } | ||
| 491 | + else { | ||
| 492 | + zoomSliders.offsetSlider->hide(); | ||
| 493 | + zoomSliders.triggerPositionSlider->hide(); | ||
| 494 | + zoomSliders.triggerLevelSlider->hide(); | ||
| 495 | + } | ||
| 496 | + | ||
| 435 | // Show time-/frequencybase and zoom factor if the magnified scope is shown | 497 | // Show time-/frequencybase and zoom factor if the magnified scope is shown |
| 436 | markerLayout->setStretch(3, enabled ? 1 : 0); | 498 | markerLayout->setStretch(3, enabled ? 1 : 0); |
| 437 | markerTimebaseLabel->setVisible(enabled); | 499 | markerTimebaseLabel->setVisible(enabled); |
| @@ -477,13 +539,43 @@ void DsoWidget::updateOffset(ChannelID channel, double value) { | @@ -477,13 +539,43 @@ void DsoWidget::updateOffset(ChannelID channel, double value) { | ||
| 477 | if (channel < scope->voltage.size()) { | 539 | if (channel < scope->voltage.size()) { |
| 478 | scope->voltage[channel].offset = value; | 540 | scope->voltage[channel].offset = value; |
| 479 | 541 | ||
| 480 | - if (channel < spec->channels) adaptTriggerLevelSlider(channel); | 542 | + if (channel < spec->channels) { |
| 543 | + adaptTriggerLevelSlider(mainSliders, channel); | ||
| 544 | + adaptTriggerLevelSlider(zoomSliders, channel); | ||
| 545 | + } | ||
| 481 | } else if (channel < scope->voltage.size() * 2) | 546 | } else if (channel < scope->voltage.size() * 2) |
| 482 | scope->spectrum[channel - scope->voltage.size()].offset = value; | 547 | scope->spectrum[channel - scope->voltage.size()].offset = value; |
| 483 | 548 | ||
| 549 | + if (channel < scope->voltage.size() * 2) { | ||
| 550 | + if (mainSliders.offsetSlider->value(channel) != value) { | ||
| 551 | + QSignalBlocker blocker(mainSliders.offsetSlider); | ||
| 552 | + mainSliders.offsetSlider->setValue(channel, value); | ||
| 553 | + } | ||
| 554 | + if (zoomSliders.offsetSlider->value(channel) != value) { | ||
| 555 | + QSignalBlocker blocker(zoomSliders.offsetSlider); | ||
| 556 | + zoomSliders.offsetSlider->setValue(channel, value); | ||
| 557 | + } | ||
| 558 | + } | ||
| 559 | + | ||
| 484 | emit offsetChanged(channel, value); | 560 | emit offsetChanged(channel, value); |
| 485 | } | 561 | } |
| 486 | 562 | ||
| 563 | +/// \brief Handles signals affecting trigger position in the zoom view. | ||
| 564 | +void DsoWidget::adaptTriggerPositionSlider() { | ||
| 565 | + double m1 = scope->horizontal.marker[0]; | ||
| 566 | + double m2 = scope->horizontal.marker[1]; | ||
| 567 | + | ||
| 568 | + if (m1 > m2) std::swap(m1, m2); | ||
| 569 | + double value = (scope->trigger.position - 0.5) * DIVS_TIME; | ||
| 570 | + if (m1 != m2 && m1 <= value && value <= m2) { | ||
| 571 | + zoomSliders.triggerPositionSlider->setIndexVisible(0, true); | ||
| 572 | + zoomSliders.triggerPositionSlider->setValue(0, (value - m1) / (m2 - m1)); | ||
| 573 | + } | ||
| 574 | + else { | ||
| 575 | + zoomSliders.triggerPositionSlider->setIndexVisible(0, false); | ||
| 576 | + } | ||
| 577 | +} | ||
| 578 | + | ||
| 487 | /// \brief Handles valueChanged signal from the triggerPosition slider. | 579 | /// \brief Handles valueChanged signal from the triggerPosition slider. |
| 488 | /// \param index The index of the slider. | 580 | /// \param index The index of the slider. |
| 489 | /// \param value The new triggerPosition in seconds relative to the first | 581 | /// \param value The new triggerPosition in seconds relative to the first |
| @@ -492,8 +584,10 @@ void DsoWidget::updateTriggerPosition(int index, double value) { | @@ -492,8 +584,10 @@ void DsoWidget::updateTriggerPosition(int index, double value) { | ||
| 492 | if (index != 0) return; | 584 | if (index != 0) return; |
| 493 | 585 | ||
| 494 | scope->trigger.position = value; | 586 | scope->trigger.position = value; |
| 587 | + adaptTriggerPositionSlider(); | ||
| 495 | 588 | ||
| 496 | updateTriggerDetails(); | 589 | updateTriggerDetails(); |
| 590 | + updateMarkerDetails(); | ||
| 497 | 591 | ||
| 498 | emit triggerPositionChanged(value * scope->horizontal.timebase * DIVS_TIME); | 592 | emit triggerPositionChanged(value * scope->horizontal.timebase * DIVS_TIME); |
| 499 | } | 593 | } |
| @@ -504,6 +598,15 @@ void DsoWidget::updateTriggerPosition(int index, double value) { | @@ -504,6 +598,15 @@ void DsoWidget::updateTriggerPosition(int index, double value) { | ||
| 504 | void DsoWidget::updateTriggerLevel(ChannelID channel, double value) { | 598 | void DsoWidget::updateTriggerLevel(ChannelID channel, double value) { |
| 505 | scope->voltage[channel].trigger = value; | 599 | scope->voltage[channel].trigger = value; |
| 506 | 600 | ||
| 601 | + if (mainSliders.triggerLevelSlider->value(channel) != value) { | ||
| 602 | + QSignalBlocker blocker(mainSliders.triggerLevelSlider); | ||
| 603 | + mainSliders.triggerLevelSlider->setValue(channel, value); | ||
| 604 | + } | ||
| 605 | + if (zoomSliders.triggerLevelSlider->value(channel) != value) { | ||
| 606 | + QSignalBlocker blocker(zoomSliders.triggerLevelSlider); | ||
| 607 | + zoomSliders.triggerLevelSlider->setValue(channel, value); | ||
| 608 | + } | ||
| 609 | + | ||
| 507 | updateTriggerDetails(); | 610 | updateTriggerDetails(); |
| 508 | 611 | ||
| 509 | emit triggerLevelChanged(channel, value); | 612 | emit triggerLevelChanged(channel, value); |
| @@ -515,6 +618,7 @@ void DsoWidget::updateTriggerLevel(ChannelID channel, double value) { | @@ -515,6 +618,7 @@ void DsoWidget::updateTriggerLevel(ChannelID channel, double value) { | ||
| 515 | void DsoWidget::updateMarker(int marker, double value) { | 618 | void DsoWidget::updateMarker(int marker, double value) { |
| 516 | scope->horizontal.marker[marker] = value; | 619 | scope->horizontal.marker[marker] = value; |
| 517 | 620 | ||
| 621 | + adaptTriggerPositionSlider(); | ||
| 518 | updateMarkerDetails(); | 622 | updateMarkerDetails(); |
| 519 | 623 | ||
| 520 | emit markerChanged(marker, value); | 624 | emit markerChanged(marker, value); |
openhantek/src/dsowidget.h
| @@ -23,6 +23,13 @@ struct DsoSettingsView; | @@ -23,6 +23,13 @@ struct DsoSettingsView; | ||
| 23 | class DsoWidget : public QWidget { | 23 | class DsoWidget : public QWidget { |
| 24 | Q_OBJECT | 24 | Q_OBJECT |
| 25 | 25 | ||
| 26 | + struct Sliders { | ||
| 27 | + LevelSlider *offsetSlider; ///< The sliders for the graph offsets | ||
| 28 | + LevelSlider *triggerPositionSlider; ///< The slider for the pretrigger | ||
| 29 | + LevelSlider *triggerLevelSlider; ///< The sliders for the trigger level | ||
| 30 | + LevelSlider *markerSlider; ///< The sliders for the markers | ||
| 31 | + }; | ||
| 32 | + | ||
| 26 | public: | 33 | public: |
| 27 | /// \brief Initializes the components of the oszilloscope-screen. | 34 | /// \brief Initializes the components of the oszilloscope-screen. |
| 28 | /// \param settings The settings object containing the oscilloscope settings. | 35 | /// \param settings The settings object containing the oscilloscope settings. |
| @@ -34,18 +41,19 @@ class DsoWidget : public QWidget { | @@ -34,18 +41,19 @@ class DsoWidget : public QWidget { | ||
| 34 | void setExporterForNextFrame(std::unique_ptr<Exporter> exporter); | 41 | void setExporterForNextFrame(std::unique_ptr<Exporter> exporter); |
| 35 | 42 | ||
| 36 | protected: | 43 | protected: |
| 37 | - void adaptTriggerLevelSlider(ChannelID channel); | ||
| 38 | - void setMeasurementVisible(ChannelID channel, bool visible); | 44 | + void setupSliders(Sliders &sliders); |
| 45 | + void adaptTriggerLevelSlider(DsoWidget::Sliders &sliders, ChannelID channel); | ||
| 46 | + void adaptTriggerPositionSlider(); | ||
| 47 | + void setMeasurementVisible(ChannelID channel); | ||
| 39 | void updateMarkerDetails(); | 48 | void updateMarkerDetails(); |
| 40 | void updateSpectrumDetails(ChannelID channel); | 49 | void updateSpectrumDetails(ChannelID channel); |
| 41 | void updateTriggerDetails(); | 50 | void updateTriggerDetails(); |
| 42 | void updateVoltageDetails(ChannelID channel); | 51 | void updateVoltageDetails(ChannelID channel); |
| 43 | 52 | ||
| 53 | + Sliders mainSliders; | ||
| 54 | + Sliders zoomSliders; | ||
| 55 | + | ||
| 44 | QGridLayout *mainLayout; ///< The main layout for this widget | 56 | QGridLayout *mainLayout; ///< The main layout for this widget |
| 45 | - LevelSlider *offsetSlider; ///< The sliders for the graph offsets | ||
| 46 | - LevelSlider *triggerPositionSlider; ///< The slider for the pretrigger | ||
| 47 | - LevelSlider *triggerLevelSlider; ///< The sliders for the trigger level | ||
| 48 | - LevelSlider *markerSlider; ///< The sliders for the markers | ||
| 49 | 57 | ||
| 50 | QHBoxLayout *settingsLayout; ///< The table for the settings info | 58 | QHBoxLayout *settingsLayout; ///< The table for the settings info |
| 51 | QLabel *settingsTriggerLabel; ///< The trigger details | 59 | QLabel *settingsTriggerLabel; ///< The trigger details |
| @@ -80,6 +88,7 @@ class DsoWidget : public QWidget { | @@ -80,6 +88,7 @@ class DsoWidget : public QWidget { | ||
| 80 | GlScope *zoomScope; ///< The optional magnified scope screen | 88 | GlScope *zoomScope; ///< The optional magnified scope screen |
| 81 | std::unique_ptr<Exporter> exportNextFrame; | 89 | std::unique_ptr<Exporter> exportNextFrame; |
| 82 | std::unique_ptr<DataAnalyzerResult> data; | 90 | std::unique_ptr<DataAnalyzerResult> data; |
| 91 | + | ||
| 83 | public slots: | 92 | public slots: |
| 84 | // Horizontal axis | 93 | // Horizontal axis |
| 85 | // void horizontalFormatChanged(HorizontalFormat format); | 94 | // void horizontalFormatChanged(HorizontalFormat format); |
openhantek/src/widgets/levelslider.cpp
| @@ -311,6 +311,7 @@ void LevelSlider::mouseMoveEvent(QMouseEvent *event) { | @@ -311,6 +311,7 @@ void LevelSlider::mouseMoveEvent(QMouseEvent *event) { | ||
| 311 | this->setValue(this->pressedSlider, | 311 | this->setValue(this->pressedSlider, |
| 312 | floor(value / this->slider[pressedSlider]->step + 0.5) * this->slider[pressedSlider]->step); | 312 | floor(value / this->slider[pressedSlider]->step + 0.5) * this->slider[pressedSlider]->step); |
| 313 | 313 | ||
| 314 | + emit valueChanged(pressedSlider, slider[pressedSlider]->value); | ||
| 314 | event->accept(); | 315 | event->accept(); |
| 315 | } | 316 | } |
| 316 | 317 | ||
| @@ -414,7 +415,7 @@ void LevelSlider::paintEvent(QPaintEvent *event) { | @@ -414,7 +415,7 @@ void LevelSlider::paintEvent(QPaintEvent *event) { | ||
| 414 | break; | 415 | break; |
| 415 | } | 416 | } |
| 416 | 417 | ||
| 417 | - painter.setBrush(QBrush((*slider)->color, Qt::SolidPattern)); | 418 | + painter.setBrush(QBrush((*slider)->color, isEnabled() ? Qt::SolidPattern : Qt::NoBrush)); |
| 418 | painter.drawPolygon(QPolygon(needlePoints)); | 419 | painter.drawPolygon(QPolygon(needlePoints)); |
| 419 | painter.setBrush(Qt::NoBrush); | 420 | painter.setBrush(Qt::NoBrush); |
| 420 | } else { | 421 | } else { |