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 | #include <QGridLayout> |
| 7 | 7 | #include <QLabel> |
| 8 | 8 | #include <QTimer> |
| 9 | +#include <QSignalBlocker> | |
| 9 | 10 | |
| 10 | 11 | #include "dsowidget.h" |
| 11 | 12 | |
| ... | ... | @@ -20,6 +21,8 @@ |
| 20 | 21 | #include "viewconstants.h" |
| 21 | 22 | #include "analyse/dataanalyzerresult.h" |
| 22 | 23 | |
| 24 | +static int zoomScopeRow = 0; | |
| 25 | + | |
| 23 | 26 | DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso::ControlSpecification *spec, QWidget *parent, Qt::WindowFlags flags) |
| 24 | 27 | : QWidget(parent, flags), scope(scope), view(view), spec(spec), generator(new GlGenerator()), |
| 25 | 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 | 32 | palette.setColor(QPalette::Background, view->screen.background); |
| 30 | 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 | 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 | 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 | 44 | // The table for the settings |
| ... | ... | @@ -166,7 +121,7 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: |
| 166 | 121 | measurementFrequencyLabel.push_back(new QLabel()); |
| 167 | 122 | measurementFrequencyLabel[channel]->setAlignment(Qt::AlignRight); |
| 168 | 123 | measurementFrequencyLabel[channel]->setPalette(palette); |
| 169 | - setMeasurementVisible(channel, scope->voltage[channel].used); | |
| 124 | + setMeasurementVisible(channel); | |
| 170 | 125 | measurementLayout->addWidget(measurementNameLabel[channel], (int)channel, 0); |
| 171 | 126 | measurementLayout->addWidget(measurementMiscLabel[channel], (int)channel, 1); |
| 172 | 127 | measurementLayout->addWidget(measurementGainLabel[channel], (int)channel, 2); |
| ... | ... | @@ -184,26 +139,37 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: |
| 184 | 139 | // The layout for the widgets |
| 185 | 140 | mainLayout = new QGridLayout(); |
| 186 | 141 | mainLayout->setColumnStretch(2, 1); // Scopes increase their size |
| 187 | - mainLayout->setRowStretch(3, 1); | |
| 188 | 142 | // Bars around the scope, needed because the slider-drawing-area is outside |
| 189 | 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 | 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 | 174 | // Apply settings and update measured values |
| 209 | 175 | updateTriggerDetails(); |
| ... | ... | @@ -220,15 +186,77 @@ DsoWidget::DsoWidget(DsoSettingsScope *scope, DsoSettingsView *view, const Dso:: |
| 220 | 186 | setLayout(mainLayout); |
| 221 | 187 | |
| 222 | 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 | 199 | updateMarker(index, value); |
| 228 | 200 | mainScope->update(); |
| 229 | 201 | zoomScope->update(); |
| 230 | 202 | }); |
| 203 | + zoomSliders.markerSlider->setEnabled(false); | |
| 204 | + | |
| 231 | 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 | 262 | void DsoWidget::showNewData(std::unique_ptr<DataAnalyzerResult> data) { |
| ... | ... | @@ -243,27 +271,38 @@ void DsoWidget::setExporterForNextFrame(std::unique_ptr<Exporter> exporter) |
| 243 | 271 | } |
| 244 | 272 | |
| 245 | 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 | 276 | (int)channel, (-DIVS_VOLTAGE / 2 - scope->voltage[channel].offset) * scope->gain(channel), |
| 249 | 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 | 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 | 286 | measurementNameLabel[channel]->setVisible(visible); |
| 256 | 287 | measurementMiscLabel[channel]->setVisible(visible); |
| 257 | - measurementGainLabel[channel]->setVisible(visible); | |
| 258 | - measurementMagnitudeLabel[channel]->setVisible(visible); | |
| 288 | + | |
| 259 | 289 | measurementAmplitudeLabel[channel]->setVisible(visible); |
| 260 | 290 | measurementFrequencyLabel[channel]->setVisible(visible); |
| 261 | 291 | if (!visible) { |
| 262 | 292 | measurementGainLabel[channel]->setText(QString()); |
| 263 | - measurementMagnitudeLabel[channel]->setText(QString()); | |
| 264 | 293 | measurementAmplitudeLabel[channel]->setText(QString()); |
| 265 | 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 | 308 | /// \brief Update the label about the marker measurements |
| ... | ... | @@ -288,7 +327,7 @@ void DsoWidget::updateMarkerDetails() { |
| 288 | 327 | |
| 289 | 328 | /// \brief Update the label about the trigger settings |
| 290 | 329 | void DsoWidget::updateSpectrumDetails(ChannelID channel) { |
| 291 | - setMeasurementVisible(channel, scope->voltage[channel].used || scope->spectrum[channel].used); | |
| 330 | + setMeasurementVisible(channel); | |
| 292 | 331 | |
| 293 | 332 | if (scope->spectrum[channel].used) |
| 294 | 333 | measurementMagnitudeLabel[channel]->setText( |
| ... | ... | @@ -317,7 +356,7 @@ void DsoWidget::updateTriggerDetails() { |
| 317 | 356 | void DsoWidget::updateVoltageDetails(ChannelID channel) { |
| 318 | 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 | 361 | if (scope->voltage[channel].used) |
| 323 | 362 | measurementGainLabel[channel]->setText(valueToString(scope->gain(channel), UNIT_VOLTS, 3) + |
| ... | ... | @@ -356,7 +395,8 @@ void DsoWidget::updateSpectrumMagnitude(ChannelID channel) { updateSpectrumDetai |
| 356 | 395 | void DsoWidget::updateSpectrumUsed(ChannelID channel, bool used) { |
| 357 | 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 | 401 | updateSpectrumDetails(channel); |
| 362 | 402 | } |
| ... | ... | @@ -370,17 +410,22 @@ void DsoWidget::updateTriggerSlope() { updateTriggerDetails(); } |
| 370 | 410 | /// \brief Handles sourceChanged signal from the trigger dock. |
| 371 | 411 | void DsoWidget::updateTriggerSource() { |
| 372 | 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 | 430 | updateTriggerDetails(); |
| 386 | 431 | } |
| ... | ... | @@ -404,7 +449,10 @@ void DsoWidget::updateMathMode() { |
| 404 | 449 | void DsoWidget::updateVoltageGain(ChannelID channel) { |
| 405 | 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 | 457 | updateVoltageDetails(channel); |
| 410 | 458 | } |
| ... | ... | @@ -415,10 +463,13 @@ void DsoWidget::updateVoltageGain(ChannelID channel) { |
| 415 | 463 | void DsoWidget::updateVoltageUsed(ChannelID channel, bool used) { |
| 416 | 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 | 473 | updateVoltageDetails(channel); |
| 423 | 474 | } |
| 424 | 475 | |
| ... | ... | @@ -427,11 +478,22 @@ void DsoWidget::updateRecordLength(unsigned long size) { |
| 427 | 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 | 482 | void DsoWidget::updateZoom(bool enabled) { |
| 432 | - mainLayout->setRowStretch(9, enabled ? 1 : 0); | |
| 483 | + mainLayout->setRowStretch(zoomScopeRow, enabled ? 1 : 0); | |
| 433 | 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 | 497 | // Show time-/frequencybase and zoom factor if the magnified scope is shown |
| 436 | 498 | markerLayout->setStretch(3, enabled ? 1 : 0); |
| 437 | 499 | markerTimebaseLabel->setVisible(enabled); |
| ... | ... | @@ -477,13 +539,43 @@ void DsoWidget::updateOffset(ChannelID channel, double value) { |
| 477 | 539 | if (channel < scope->voltage.size()) { |
| 478 | 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 | 546 | } else if (channel < scope->voltage.size() * 2) |
| 482 | 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 | 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 | 579 | /// \brief Handles valueChanged signal from the triggerPosition slider. |
| 488 | 580 | /// \param index The index of the slider. |
| 489 | 581 | /// \param value The new triggerPosition in seconds relative to the first |
| ... | ... | @@ -492,8 +584,10 @@ void DsoWidget::updateTriggerPosition(int index, double value) { |
| 492 | 584 | if (index != 0) return; |
| 493 | 585 | |
| 494 | 586 | scope->trigger.position = value; |
| 587 | + adaptTriggerPositionSlider(); | |
| 495 | 588 | |
| 496 | 589 | updateTriggerDetails(); |
| 590 | + updateMarkerDetails(); | |
| 497 | 591 | |
| 498 | 592 | emit triggerPositionChanged(value * scope->horizontal.timebase * DIVS_TIME); |
| 499 | 593 | } |
| ... | ... | @@ -504,6 +598,15 @@ void DsoWidget::updateTriggerPosition(int index, double value) { |
| 504 | 598 | void DsoWidget::updateTriggerLevel(ChannelID channel, double value) { |
| 505 | 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 | 610 | updateTriggerDetails(); |
| 508 | 611 | |
| 509 | 612 | emit triggerLevelChanged(channel, value); |
| ... | ... | @@ -515,6 +618,7 @@ void DsoWidget::updateTriggerLevel(ChannelID channel, double value) { |
| 515 | 618 | void DsoWidget::updateMarker(int marker, double value) { |
| 516 | 619 | scope->horizontal.marker[marker] = value; |
| 517 | 620 | |
| 621 | + adaptTriggerPositionSlider(); | |
| 518 | 622 | updateMarkerDetails(); |
| 519 | 623 | |
| 520 | 624 | emit markerChanged(marker, value); | ... | ... |
openhantek/src/dsowidget.h
| ... | ... | @@ -23,6 +23,13 @@ struct DsoSettingsView; |
| 23 | 23 | class DsoWidget : public QWidget { |
| 24 | 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 | 33 | public: |
| 27 | 34 | /// \brief Initializes the components of the oszilloscope-screen. |
| 28 | 35 | /// \param settings The settings object containing the oscilloscope settings. |
| ... | ... | @@ -34,18 +41,19 @@ class DsoWidget : public QWidget { |
| 34 | 41 | void setExporterForNextFrame(std::unique_ptr<Exporter> exporter); |
| 35 | 42 | |
| 36 | 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 | 48 | void updateMarkerDetails(); |
| 40 | 49 | void updateSpectrumDetails(ChannelID channel); |
| 41 | 50 | void updateTriggerDetails(); |
| 42 | 51 | void updateVoltageDetails(ChannelID channel); |
| 43 | 52 | |
| 53 | + Sliders mainSliders; | |
| 54 | + Sliders zoomSliders; | |
| 55 | + | |
| 44 | 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 | 58 | QHBoxLayout *settingsLayout; ///< The table for the settings info |
| 51 | 59 | QLabel *settingsTriggerLabel; ///< The trigger details |
| ... | ... | @@ -80,6 +88,7 @@ class DsoWidget : public QWidget { |
| 80 | 88 | GlScope *zoomScope; ///< The optional magnified scope screen |
| 81 | 89 | std::unique_ptr<Exporter> exportNextFrame; |
| 82 | 90 | std::unique_ptr<DataAnalyzerResult> data; |
| 91 | + | |
| 83 | 92 | public slots: |
| 84 | 93 | // Horizontal axis |
| 85 | 94 | // void horizontalFormatChanged(HorizontalFormat format); | ... | ... |
openhantek/src/widgets/levelslider.cpp
| ... | ... | @@ -311,6 +311,7 @@ void LevelSlider::mouseMoveEvent(QMouseEvent *event) { |
| 311 | 311 | this->setValue(this->pressedSlider, |
| 312 | 312 | floor(value / this->slider[pressedSlider]->step + 0.5) * this->slider[pressedSlider]->step); |
| 313 | 313 | |
| 314 | + emit valueChanged(pressedSlider, slider[pressedSlider]->value); | |
| 314 | 315 | event->accept(); |
| 315 | 316 | } |
| 316 | 317 | |
| ... | ... | @@ -414,7 +415,7 @@ void LevelSlider::paintEvent(QPaintEvent *event) { |
| 414 | 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 | 419 | painter.drawPolygon(QPolygon(needlePoints)); |
| 419 | 420 | painter.setBrush(Qt::NoBrush); |
| 420 | 421 | } else { | ... | ... |