Commit 33723056459adec972927aa46331bd5675b02886

Authored by Denis Dovzhenko
Committed by David Gräff
1 parent dc4cbc9c

Add sliders to the zoom view

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&lt;Exporter&gt; 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 {
... ...