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 +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&lt;Exporter&gt; exporter) @@ -243,27 +271,38 @@ void DsoWidget::setExporterForNextFrame(std::unique_ptr&lt;Exporter&gt; 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 {