~arcachofo/simulide/1.1.0

« back to all changes in this revision

Viewing changes to src/gui/dataplotwidget/dataplotwidget.cpp

  • Committer: arcachofo
  • Date: 2021-01-01 14:23:42 UTC
  • Revision ID: arcachofo@simulide.com-20210101142342-ozfljnll44g5lbl3
Initial Commit 0.5.15-RC3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *   Copyright (C) 2020 by santiago González                               *
 
3
 *   santigoro@gmail.com                                                   *
 
4
 *                                                                         *
 
5
 *   This program is free software; you can redistribute it and/or modify  *
 
6
 *   it under the terms of the GNU General Public License as published by  *
 
7
 *   the Free Software Foundation; either version 3 of the License, or     *
 
8
 *   (at your option) any later version.                                   *
 
9
 *                                                                         *
 
10
 *   This program is distributed in the hope that it will be useful,       *
 
11
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 
12
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 
13
 *   GNU General Public License for more details.                          *
 
14
 *                                                                         *
 
15
 *   You should have received a copy of the GNU General Public License     *
 
16
 *   along with this program; if not, see <http://www.gnu.org/licenses/>.  *
 
17
 *                                                                         *
 
18
 ***************************************************************************/
 
19
 
 
20
#include <math.h>   // fabs(x,y)
 
21
 
 
22
#include "dataplotwidget.h"
 
23
#include "plotbase.h"
 
24
#include "mainwindow.h"
 
25
#include "circuit.h"
 
26
#include "simulator.h"
 
27
 
 
28
DataPlotWidget::DataPlotWidget(  QWidget* parent, PlotBase* plotB  )
 
29
              : QWidget( parent )
 
30
{
 
31
    m_plotB = plotB;
 
32
 
 
33
    this->setVisible( false );
 
34
 
 
35
    for( int i=0; i<2; i++ )
 
36
    {
 
37
        m_vTick[i] = 1;
 
38
        m_hPos[i]  = 0;
 
39
        m_vPos[i]  = 0;
 
40
        m_probe[i] = 0l;
 
41
    }
 
42
 
 
43
    m_numCh = 2;
 
44
 
 
45
    m_prevHscale = 10;
 
46
    m_prevVscale = 1;
 
47
    m_prevVPos = 0;
 
48
    m_prevHPos = 0;
 
49
    m_hTick = 1e9;
 
50
    m_auto = 2;
 
51
    m_trigger = 2;
 
52
 
 
53
    m_paOnCond = false;
 
54
    m_refCond  = None;
 
55
    m_refCondFlag = false;
 
56
}
 
57
 
 
58
DataPlotWidget::~DataPlotWidget()
 
59
{
 
60
}
 
61
 
 
62
void DataPlotWidget::hTickDialChanged( int Hscale ) // Dial changed
 
63
{
 
64
    if( m_auto < 2 ) return;
 
65
    
 
66
    uint64_t delta = m_hTick/10;
 
67
    if( delta < 1 ) delta = 1;
 
68
 
 
69
    if( Hscale < m_prevHscale ) m_hTick += delta;
 
70
    else                        m_hTick -= delta;
 
71
 
 
72
    if( m_hTick < 1 ) m_hTick = 1;
 
73
 
 
74
    m_prevHscale = Hscale;
 
75
 
 
76
    updateHTickBox();
 
77
}
 
78
 
 
79
void DataPlotWidget::hTickBoxChanged() // User entered value
 
80
{
 
81
    if( m_auto < 2 ) return;
 
82
 
 
83
    double  val  = m_hTickBox->value();
 
84
    QString unit = m_hTickBox->suffix();
 
85
 
 
86
    if     ( unit == " ns" ) val *= 1e3;
 
87
    else if( unit == " us")  val *= 1e6;
 
88
    else if( unit == " ms" ) val *= 1e9;
 
89
    else if( unit == " s")   val *= 1e12;
 
90
 
 
91
    if( val < 1 ) val = 1;
 
92
 
 
93
    if( (uint64_t)val == m_hTick ) return;
 
94
 
 
95
    m_hTick = (uint64_t)val;
 
96
 
 
97
    updateHTickBox();
 
98
}
 
99
 
 
100
void DataPlotWidget::setHTick( uint64_t hTick )
 
101
{
 
102
    m_hTick = hTick;
 
103
    updateHTickBox();
 
104
}
 
105
 
 
106
void DataPlotWidget::updateHTickBox()
 
107
{
 
108
    double val  = (double)m_hTick;
 
109
 
 
110
    QString unit = " ps";
 
111
    if( val > 999 )
 
112
    {
 
113
        val /= 1e3; unit = " ns";
 
114
        if( val > 999 )
 
115
        {
 
116
            val /= 1e3; unit = " us";
 
117
            if( val > 999 )
 
118
            {
 
119
                val /= 1e3; unit = " ms";
 
120
                if( val > 999 ) { val /= 1e3; unit = " s"; }
 
121
            }
 
122
        }
 
123
    }
 
124
    int Vdecimals = 0;
 
125
    if     ( val < 10)   Vdecimals = 3;
 
126
    else if( val < 100)  Vdecimals = 2;
 
127
    else if( val < 1000) Vdecimals = 1;
 
128
 
 
129
    m_hTickBox->setDecimals( Vdecimals );
 
130
    m_hTickBox->setValue( val );
 
131
    m_hTickBox->setSuffix( unit );
 
132
    m_display->setXFrame( m_hTick*10 );
 
133
}
 
134
 
 
135
void DataPlotWidget::vTickDialChanged( int ch, int Vscale ) // Changed by Dial
 
136
{
 
137
    if( (ch>2) || (ch<0) ) ch = 2;
 
138
    if( m_auto == ch ) return;
 
139
    
 
140
    double vscale = (double)Vscale;
 
141
    if( vscale < m_prevVscale ) m_vTick[ch] *= 1.01;
 
142
    else                        m_vTick[ch] /= 1.01;
 
143
 
 
144
    if( m_vTick[ch] < 0.001 ) m_vTick[ch] = 0.001;
 
145
    m_prevVscale = vscale;
 
146
    m_display->setVTick( ch, m_vTick[ch] );
 
147
 
 
148
    int activeChan = m_buttonGroup->checkedId();
 
149
    if(( activeChan == 2 )
 
150
    || ( activeChan == ch ))m_vTickBox->setValue( m_vTick[ch] );
 
151
}
 
152
 
 
153
void DataPlotWidget::vTickBoxChanged( int ch )
 
154
{
 
155
    if( (ch>2) || (ch<0) ) ch = 2;
 
156
    if( m_auto == ch ) return;
 
157
    m_vTick[ch] = m_vTickBox->value();
 
158
    m_display->setVTick( ch, m_vTick[ch] );
 
159
}
 
160
 
 
161
void DataPlotWidget::setVTick( int ch, double vTick )
 
162
{
 
163
    m_vTick[ch] = vTick;
 
164
    m_display->setVTick( ch, vTick );
 
165
 
 
166
    int activeChan = m_buttonGroup->checkedId();
 
167
    if(( activeChan == 2 )
 
168
    || ( activeChan == ch ))m_vTickBox->setValue( vTick );
 
169
}
 
170
 
 
171
void DataPlotWidget::hPosDialChanged( int ch, int ihPos ) // Changed by Dial
 
172
{
 
173
    if( (ch>2) || (ch<0) ) ch = 2;
 
174
    if( m_auto == ch ) return;
 
175
 
 
176
    double hPos = (double)ihPos;
 
177
 
 
178
    int delta = m_hTick/10;
 
179
    if( delta < 1 ) delta = 1;
 
180
 
 
181
    if( hPos < m_prevHPos ) m_hPos[ch] += delta;
 
182
    else                    m_hPos[ch] -= delta;
 
183
 
 
184
    m_prevHPos = hPos;
 
185
    updateHPosBox( ch );
 
186
}
 
187
 
 
188
void DataPlotWidget::hPosBoxChanged( int ch )
 
189
{
 
190
    if( (ch>2) || (ch<0) ) ch = 2;
 
191
    if( m_auto == ch ) return;
 
192
 
 
193
    double  val  = m_hPosBox->value();
 
194
    QString unit = m_hPosBox->suffix();
 
195
 
 
196
    if     ( unit == " ns" ) val *= 1e3;
 
197
    else if( unit == " us")  val *= 1e6;
 
198
    else if( unit == " ms")  val *= 1e9;
 
199
    else if( unit == " s")   val *= 1e12;
 
200
 
 
201
    m_hPos[ch] = val;
 
202
    updateHPosBox( ch );
 
203
}
 
204
 
 
205
void DataPlotWidget::setHPos( int ch, double hPos )
 
206
{
 
207
    if( (ch>2) || (ch<0) ) ch = 2;
 
208
    m_hPos[ch] = hPos;
 
209
    updateHPosBox( ch );
 
210
}
 
211
 
 
212
void DataPlotWidget::updateHPosBox( int ch )
 
213
{
 
214
    if( (ch>2) || (ch<0) ) ch = 2;
 
215
    int activeChan = m_buttonGroup->checkedId();
 
216
    if(( activeChan == 2 )
 
217
    || ( activeChan == ch ))
 
218
    {
 
219
        double val  = m_hPos[ch];
 
220
        /*double halfScreen = (double)m_hTick*5;
 
221
        if     ( val > halfScreen ) val = halfScreen;
 
222
        else if( val <-halfScreen ) val =-halfScreen;*/
 
223
        m_hPos[ch] = val;
 
224
 
 
225
        QString unit = " ps";
 
226
        if( fabs( val ) > 999 )
 
227
        {
 
228
            val /= 1e3; unit = " ns";
 
229
            if( fabs( val ) > 999 )
 
230
            {
 
231
                val /= 1e3; unit = " us";
 
232
                if( fabs( val ) > 999 )
 
233
                {
 
234
                    val /= 1e3; unit = " ms";
 
235
                    if( fabs( val ) > 999 ) { val /= 1e3; unit = " s"; }
 
236
                }
 
237
            }
 
238
        }
 
239
 
 
240
        int Vdecimals = 0;
 
241
        double fval = fabs( val );
 
242
        if     ( fval < 10)   Vdecimals = 3;
 
243
        else if( fval < 100)  Vdecimals = 2;
 
244
        else if( fval < 1000) Vdecimals = 1;
 
245
 
 
246
        m_hPosBox->setDecimals( Vdecimals );
 
247
        m_hPosBox->setValue( val );
 
248
        m_hPosBox->setSuffix( unit );
 
249
        m_display->setHPos( ch, m_hPos[ch] );
 
250
    }
 
251
}
 
252
 
 
253
void DataPlotWidget::vPosDialChanged( int ch, int ivPos ) // Changed by Dial
 
254
{
 
255
    if( (ch>2) || (ch<0) ) ch = 2;
 
256
    if( m_auto == ch ) return;
 
257
    
 
258
    double vPos = (double)ivPos;
 
259
    
 
260
    if( vPos < m_prevVPos ) m_vPos[ch] -= 0.05*m_vTick[ch];
 
261
    else                    m_vPos[ch] += 0.05*m_vTick[ch];
 
262
 
 
263
    m_prevVPos = vPos;
 
264
    m_display->setVPos( ch, m_vPos[ch] );
 
265
 
 
266
    int activeChan = m_buttonGroup->checkedId();
 
267
    if(( activeChan == 2 )
 
268
    || ( activeChan == ch )) m_vPosBox->setValue( m_vPos[ch] );
 
269
}
 
270
 
 
271
void DataPlotWidget::vPosBoxChanged( int ch )
 
272
{
 
273
    if( (ch>2) || (ch<0) ) ch = 2;
 
274
    if( m_auto == ch ) return;
 
275
    m_vPos[ch] = m_vPosBox->value();
 
276
    m_display->setVPos( ch, m_vPos[ch] );
 
277
}
 
278
 
 
279
void DataPlotWidget::setVPos( int ch, double vPos )
 
280
{
 
281
    if( (ch>2) || (ch<0) ) ch = 2;
 
282
    m_vPos[ch] = vPos;
 
283
    m_display->setVPos( ch, vPos );
 
284
 
 
285
    int activeChan = m_buttonGroup->checkedId();
 
286
    if(( activeChan == 2 )
 
287
    || ( activeChan == ch )) m_vPosBox->setValue( vPos );
 
288
}
 
289
 
 
290
void DataPlotWidget::setAuto( int ch )
 
291
{
 
292
    if( (ch>2) || (ch<0) ) ch = 2;
 
293
    for( int i=0; i<2; i++ ) m_autoCheck[i]->setChecked( false );
 
294
    if( ch < 2 )
 
295
    {
 
296
        if( m_auto == ch ) // disable
 
297
        {
 
298
            m_autoCheck[ch]->setChecked( false );
 
299
            ch = 2;
 
300
        }
 
301
        else m_autoCheck[ch]->setChecked( true );
 
302
    }
 
303
 
 
304
    m_auto = ch;
 
305
    QString color = m_colorN[ch];
 
306
    if( ch == 2 ) color = m_colorN[3];
 
307
    m_autoLabel->setStyleSheet( "background-color:"+color );
 
308
}
 
309
 
 
310
void DataPlotWidget::setTrigger( int ch )
 
311
{
 
312
    if( (ch>2) || (ch<0) ) ch = 2;
 
313
    for( int i=0; i<2; i++ ) m_trigCheck[i]->setChecked( false );
 
314
    if( ch < 2 )
 
315
    {
 
316
        if( m_trigger == ch ) // disable
 
317
        {
 
318
            m_trigCheck[ch]->setChecked( false );
 
319
            ch = 2;
 
320
        }
 
321
        else m_trigCheck[ch]->setChecked( true );
 
322
    }
 
323
    m_trigger = ch;
 
324
 
 
325
    QString color = m_colorN[ch];
 
326
    if( ch == 2 ) color = m_colorN[3];
 
327
    m_trigLabel->setStyleSheet( "background-color:"+color );
 
328
 
 
329
    m_plotB->updateTrig( ch );
 
330
}
 
331
 
 
332
void DataPlotWidget::buttonChanged( int ch )
 
333
{
 
334
    if( (ch>2) || (ch<0) ) ch = 2;
 
335
    m_hTickBox->setStyleSheet( "background-color:"+m_colorN[2] );
 
336
    m_hPosBox->setStyleSheet( "background-color:"+m_colorN[ch] );
 
337
    m_vTickBox->setStyleSheet( "background-color:"+m_colorN[ch] );
 
338
    m_vPosBox->setStyleSheet( "background-color:"+m_colorN[ch] );
 
339
 
 
340
    if( ch < 2 )
 
341
    {
 
342
        m_vTickBox->setValue( m_vTick[ch] );
 
343
        m_vPosBox->setValue( m_vPos[ch] );
 
344
    }
 
345
}
 
346
 
 
347
void DataPlotWidget::showControlls( bool show )
 
348
{
 
349
    m_hTickDial->setVisible( show );
 
350
    m_hTickBox->setVisible( show );
 
351
    m_hTickLabel->setVisible( show );
 
352
    m_hPosDial->setVisible( show );
 
353
    m_hPosBox->setVisible( show );
 
354
    m_hPosLabel->setVisible( show );
 
355
    m_vTickDial->setVisible( show );
 
356
    m_vTickBox->setVisible( show );
 
357
    m_vTickLabel->setVisible( show );
 
358
    m_vPosDial->setVisible( show );
 
359
    m_vPosBox->setVisible( show );
 
360
    m_vPosLabel->setVisible( show );
 
361
    m_autoLabel->setVisible( show );
 
362
    m_trigLabel->setVisible( show );
 
363
 
 
364
    for( int i=0; i<2; i++ )
 
365
    {
 
366
        m_autoCheck[i]->setVisible( show );
 
367
        m_trigCheck[i]->setVisible( show );
 
368
    }
 
369
 
 
370
    for( int i=0; i<3; i++ )
 
371
    {
 
372
        m_line[i]->setVisible( show );
 
373
        m_button[i]->setVisible( show );
 
374
    }
 
375
}
 
376
 
 
377
void DataPlotWidget::setSize( int width, int height )
 
378
{
 
379
    m_sizeX = width;
 
380
    m_sizeY = height;
 
381
    m_display->setSize( width, height );
 
382
}
 
383
 
 
384
void DataPlotWidget::updateWidgets()
 
385
{
 
386
    double ws = (double)m_sizeY/200;
 
387
    double sc = (6+4*ws)/10;            //qDebug() <<"DataPlotWidget::scale"<<sc;
 
388
    double fs = MainWindow::self()->fontScale();
 
389
    int ds = sc*27;
 
390
 
 
391
    QFont font = this->font();
 
392
    font.setPixelSize( int(9*fs*sc) );
 
393
    font.setBold( true );
 
394
 
 
395
    m_advaCheck->setFixedSize( sc*65, sc*14 );
 
396
    m_advaCheck->setFont( font );
 
397
 
 
398
    m_autoLabel->setFixedSize( sc*42, sc*14 );
 
399
    m_autoLabel->setFont( font );
 
400
    m_trigLabel->setFixedSize( sc*42, sc*14 );
 
401
    m_trigLabel->setFont( font );
 
402
 
 
403
    for( int i=0; i<2; i++ )
 
404
    {
 
405
        m_channel[i]->setFixedSize( sc*65, sc*17 );
 
406
        m_channel[i]->setFont( font );
 
407
 
 
408
        m_data1Label[i]->setFixedSize( sc*65, sc*16 );
 
409
        m_data1Label[i]->setFont( font );
 
410
        m_data2Label[i]->setFixedSize( sc*65, sc*16 );
 
411
        m_data2Label[i]->setFont( font );
 
412
 
 
413
        m_autoCheck[i]->setFont( font );
 
414
        m_trigCheck[i]->setFont( font );
 
415
    }
 
416
 
 
417
    m_hTickLabel->setFont( font );
 
418
    m_hTickLabel->setFixedSize( sc*25, sc*15 );
 
419
    m_hPosLabel->setFont( font );
 
420
    m_hPosLabel->setFixedSize( sc*25, sc*15 );
 
421
    m_vTickLabel->setFont( font );
 
422
    m_vTickLabel->setFixedSize( sc*25, sc*15 );
 
423
    m_vPosLabel->setFont( font );
 
424
    m_vPosLabel->setFixedSize( sc*25, sc*15 );
 
425
 
 
426
    m_hTickDial->setFixedSize( ds, ds );
 
427
    m_hPosDial->setFixedSize( ds, ds );
 
428
    m_vTickDial->setFixedSize( ds, ds );
 
429
    m_vPosDial->setFixedSize( ds, ds );
 
430
 
 
431
    m_hTickBox->setFixedSize( sc*73, sc*20 );
 
432
    m_hTickBox->setFont( font );
 
433
    m_hPosBox->setFixedSize( sc*73, sc*20 );
 
434
    m_hPosBox->setFont( font );
 
435
    m_vTickBox->setFixedSize( sc*73, sc*20 );
 
436
    m_vTickBox->setFont( font );
 
437
    m_vPosBox->setFixedSize( sc*73, sc*20 );
 
438
    m_vPosBox->setFont( font );
 
439
 
 
440
    for( int i=0; i<3; i++ )
 
441
    {
 
442
        if( i!= 1 ) m_line[i]->setFixedHeight( ws*ws*10 );
 
443
        m_button[i]->setFixedSize( sc*38, sc*20);
 
444
        m_button[i]->setFont( font );
 
445
    }
 
446
    m_line[1]->setFixedHeight( ws*ws*4 );
 
447
}
 
448
 
 
449
void DataPlotWidget::setupWidget()
 
450
{
 
451
    //m_palette.setColor( QPalette::Text,Qt::black );
 
452
 
 
453
    m_display = new PlotDisplay( this );
 
454
    for( int i=0; i<3; i++ ) m_colorN[i] = m_display->m_color[i].name() ;
 
455
    m_colorN[3] = m_display->m_scaleColor[2].name() ;
 
456
 
 
457
    m_horizontalLayout = createQHBoxLayout();
 
458
    this->setLayout( m_horizontalLayout );
 
459
    m_horizontalLayout->addStretch();
 
460
 
 
461
    m_vChannelLayout = new QVBoxLayout();
 
462
    m_vChannelLayout->setContentsMargins(0, 0, 0, 0);
 
463
    m_vChannelLayout->setSpacing(0);
 
464
    m_vChannelLayout->setAlignment( Qt::AlignLeft );
 
465
 
 
466
    m_advaCheck = new QCheckBox( "Expand", this );
 
467
    m_advaCheck->setChecked( true );
 
468
    m_vChannelLayout->addWidget( m_advaCheck );
 
469
 
 
470
    m_data2Label[0] = new QLabel( "", this );
 
471
    m_data1Label[0] = new QLabel( "", this );
 
472
    m_vChannelLayout->addWidget( m_data1Label[0] );
 
473
    m_vChannelLayout->addWidget( m_data2Label[0] );
 
474
 
 
475
    for( int i=0; i<2; i++ )
 
476
    {
 
477
        //m_palette.setColor( QPalette::Base, m_display->m_color[i] );
 
478
        m_channel[i] = new QLineEdit( this );
 
479
        m_channel[i]->setObjectName( "Channel"+QString::number(i));
 
480
        m_channel[i]->setStyleSheet( "background-color:"+m_colorN[i] );
 
481
        m_channel[i]->setPlaceholderText( "No Probe" );
 
482
        //m_channel[i]->setPalette( m_palette );
 
483
        m_vChannelLayout->addWidget( m_channel[i] );
 
484
    }
 
485
    m_data2Label[1] = new QLabel( "", this );
 
486
    m_data1Label[1] = new QLabel( "", this );
 
487
    m_vChannelLayout->addWidget( m_data2Label[1] );
 
488
    m_vChannelLayout->addWidget( m_data1Label[1] );
 
489
 
 
490
    m_horizontalLayout->addLayout( m_vChannelLayout );
 
491
 
 
492
    m_horizontalLayout->addWidget( m_display );
 
493
    m_horizontalLayout->addStretch();
 
494
 
 
495
    m_controllsLayout = new QVBoxLayout();
 
496
    m_controllsLayout->setContentsMargins(0, 0, 0, 0);
 
497
    m_controllsLayout->setSpacing(0);
 
498
 
 
499
    QHBoxLayout* buttonLayout = createQHBoxLayout();
 
500
    buttonLayout->addStretch();
 
501
    m_buttonGroup = new QButtonGroup( this );
 
502
    for( int i=0; i<3; i++ )
 
503
    {
 
504
        QString text = "Ch";
 
505
        if( i<2 ) text += QString::number(i+1);
 
506
        else      text = tr("All");
 
507
 
 
508
        m_button[i] = new QPushButton( text, this );
 
509
        m_button[i]->setObjectName( "OscButton"+QString::number(i));
 
510
        m_button[i]->setCheckable( true );
 
511
        //m_palette.setColor( QPalette::Button, m_display->m_color[i] );
 
512
        m_button[i]->setStyleSheet( "background-color:"+m_colorN[i] );
 
513
        //m_button[i]->setPalette( m_palette );
 
514
 
 
515
        m_buttonGroup->addButton( m_button[i] );
 
516
        m_buttonGroup->setId( m_button[i], i );
 
517
 
 
518
        buttonLayout->addWidget( m_button[i] );
 
519
 
 
520
        m_line[i] = new QFrame(this);
 
521
        m_line[i]->setFrameShape( QFrame::HLine ) ;
 
522
        m_line[i]->setFrameShadow( QFrame::Sunken );
 
523
        m_line[i]->setLineWidth( 2 );
 
524
    }
 
525
    m_button[2]->setChecked( true );
 
526
    buttonLayout->addStretch();
 
527
    m_controllsLayout->addLayout( buttonLayout );
 
528
 
 
529
    QHBoxLayout* hTickLayout = createQHBoxLayout();
 
530
    m_hTickDial  = createDial();
 
531
    m_hTickBox   = createSpinBox( " S" );
 
532
    m_hTickBox->installEventFilter( this );
 
533
    m_hTickLabel = new QLabel( " Div", this );
 
534
    hTickLayout->addWidget(m_hTickDial );
 
535
    hTickLayout->addWidget( m_hTickBox );
 
536
    hTickLayout->addWidget( m_hTickLabel );
 
537
    QHBoxLayout* hPosLayout = createQHBoxLayout();
 
538
    m_hPosDial  = createDial();
 
539
    m_hPosBox   = createSpinBox( " S" );
 
540
    m_hPosBox->installEventFilter( this );
 
541
    m_hPosBox->setMinimum( -1000000 );
 
542
    m_hPosBox->setValue( 0 );
 
543
    m_hPosLabel = new QLabel( " Pos", this );
 
544
    hPosLayout->addWidget( m_hPosDial );
 
545
    hPosLayout->addWidget( m_hPosBox );
 
546
    hPosLayout->addWidget( m_hPosLabel );
 
547
    m_line[1]->setLineWidth( 1 );
 
548
    QHBoxLayout* vTickLayout = createQHBoxLayout();
 
549
    m_vTickDial  = createDial();
 
550
    m_vTickBox   = createSpinBox( " V" );
 
551
    m_vTickBox->installEventFilter( this );
 
552
    m_vTickLabel = new QLabel( " Div", this );
 
553
    vTickLayout->addWidget( m_vTickDial );
 
554
    vTickLayout->addWidget( m_vTickBox );
 
555
    vTickLayout->addWidget( m_vTickLabel );
 
556
    QHBoxLayout* vPosLayout = createQHBoxLayout();
 
557
    m_vPosDial  = createDial();
 
558
    m_vPosBox   = createSpinBox( " V" );
 
559
    m_vPosBox->installEventFilter( this );
 
560
    m_vPosBox->setMinimum( -1000000 );
 
561
    m_vPosLabel = new QLabel( " Pos", this );
 
562
    vPosLayout->addWidget( m_vPosDial );
 
563
    vPosLayout->addWidget( m_vPosBox );
 
564
    vPosLayout->addWidget( m_vPosLabel );
 
565
 
 
566
    m_controllsLayout->addWidget( m_line[0] );
 
567
    m_controllsLayout->addLayout( hTickLayout );
 
568
    m_controllsLayout->addLayout( hPosLayout );
 
569
    m_controllsLayout->addWidget( m_line[1] );
 
570
    m_controllsLayout->addLayout( vTickLayout );
 
571
    m_controllsLayout->addLayout( vPosLayout );
 
572
    m_controllsLayout->addWidget( m_line[2] );
 
573
 
 
574
    QHBoxLayout* autoLayout = createQHBoxLayout();
 
575
    autoLayout->setSpacing( 5 );
 
576
    m_autoLabel = new QLabel( " Auto", this );
 
577
    m_autoLabel->setObjectName( "autoLabel");
 
578
    autoLayout->addWidget( m_autoLabel );
 
579
    m_autoGroup = new QButtonGroup( this );
 
580
    m_autoGroup->setExclusive( false );
 
581
    for( int i=0; i<2; ++i )
 
582
    {
 
583
        m_autoCheck[i] = new QRadioButton( QString::number(i+1), this );
 
584
        m_autoCheck[i]->setObjectName( "autoCheck"+QString::number(i));
 
585
        m_autoCheck[i]->setStyleSheet( "background-color:"+m_colorN[i] );
 
586
        m_autoCheck[i]->setChecked( false );
 
587
        m_autoGroup->addButton( m_autoCheck[i] );
 
588
        m_autoGroup->setId( m_autoCheck[i], i );
 
589
        autoLayout->addWidget( m_autoCheck[i] );
 
590
    }
 
591
    //autoLayout->addStretch();
 
592
 
 
593
    QHBoxLayout* triggerLayout = createQHBoxLayout();
 
594
    triggerLayout->setSpacing( 5 );
 
595
    m_trigLabel = new QLabel( " Trigger", this );
 
596
    m_trigLabel->setObjectName( "trigLabel");
 
597
    triggerLayout->addWidget( m_trigLabel );
 
598
    m_trigGroup = new QButtonGroup( this );
 
599
    m_trigGroup->setExclusive( false );
 
600
    for( int i=0; i<2; ++i )
 
601
    {
 
602
        m_trigCheck[i] = new QRadioButton( QString::number(i+1), this );
 
603
        m_trigCheck[i]->setObjectName( "trigCheck"+QString::number(i));
 
604
        m_trigCheck[i]->setStyleSheet( "background-color:"+m_colorN[i] );
 
605
        m_trigCheck[i]->setChecked( false );
 
606
        m_trigGroup->addButton( m_trigCheck[i] );
 
607
        m_trigGroup->setId( m_trigCheck[i], i );
 
608
        triggerLayout->addWidget( m_trigCheck[i] );
 
609
    }
 
610
    //triggerLayout->addStretch();
 
611
 
 
612
    m_controllsLayout->addLayout( autoLayout );
 
613
    m_controllsLayout->addLayout( triggerLayout );
 
614
    m_horizontalLayout->addLayout( m_controllsLayout );
 
615
    m_horizontalLayout->addStretch();
 
616
 
 
617
    connect( m_advaCheck, SIGNAL( clicked(bool) ),
 
618
             m_plotB,     SLOT  ( setAdvanc(bool)), Qt::UniqueConnection );
 
619
 
 
620
    connect( m_channel[0], SIGNAL( editingFinished()  ),
 
621
             this,        SLOT  ( channel1Changed()), Qt::UniqueConnection );
 
622
 
 
623
    connect( m_channel[1], SIGNAL( editingFinished()  ),
 
624
             this,        SLOT  ( channel2Changed()), Qt::UniqueConnection );
 
625
 
 
626
 
 
627
    connect( m_hTickDial, SIGNAL( valueChanged(int) ),
 
628
             this,        SLOT  ( hTickDialChanged(int)), Qt::UniqueConnection );
 
629
             
 
630
    connect( m_vTickDial, SIGNAL( valueChanged(int) ),
 
631
             this,         SLOT  ( vTickDial1Changed(int)), Qt::UniqueConnection );
 
632
 
 
633
    connect( m_hPosDial, SIGNAL( valueChanged(int) ),
 
634
             this,       SLOT  ( hPosDial1Changed(int)), Qt::UniqueConnection );
 
635
 
 
636
    connect( m_vPosDial, SIGNAL( valueChanged(int) ),
 
637
             this,       SLOT  ( vPosDial1Changed(int)), Qt::UniqueConnection );
 
638
 
 
639
    connect( m_hTickBox, &QDoubleSpinBox::editingFinished,
 
640
             this,  &DataPlotWidget::hTickBoxChanged, Qt::UniqueConnection );
 
641
 
 
642
    connect( m_vTickBox, &QDoubleSpinBox::editingFinished,
 
643
             this,  &DataPlotWidget::vTickBox1Changed, Qt::UniqueConnection );
 
644
 
 
645
    connect( m_hPosBox, &QDoubleSpinBox::editingFinished,
 
646
             this,  &DataPlotWidget::hPosBox1Changed, Qt::UniqueConnection );
 
647
 
 
648
    connect( m_vPosBox, &QDoubleSpinBox::editingFinished,
 
649
             this,  &DataPlotWidget::vPosBox1Changed, Qt::UniqueConnection );
 
650
 
 
651
    connect( m_buttonGroup, SIGNAL( buttonClicked(int)),
 
652
             this,          SLOT  ( buttonChanged(int)), Qt::UniqueConnection );
 
653
 
 
654
    connect( m_autoGroup, SIGNAL( buttonClicked(int)),
 
655
             this,        SLOT  ( setAuto(int)), Qt::UniqueConnection );
 
656
 
 
657
    connect( m_trigGroup, SIGNAL( buttonClicked(int)),
 
658
             this,        SLOT  ( setTrigger(int)), Qt::UniqueConnection );
 
659
 
 
660
    setTrigger( 0 );
 
661
    setAuto( 0 );
 
662
    setHTick( 1e9);
 
663
}
 
664
 
 
665
QDial* DataPlotWidget::createDial()
 
666
{
 
667
    QDial* dial = new QDial(this);
 
668
    dial->setNotchesVisible( true );
 
669
    dial->setWrapping(true);
 
670
    dial->setMinimum( 1 );
 
671
    dial->setMaximum( 20 );
 
672
    dial->setSingleStep( 1 );
 
673
    return dial;
 
674
}
 
675
 
 
676
QDoubleSpinBox* DataPlotWidget::createSpinBox( QString suffix )
 
677
{
 
678
    QDoubleSpinBox* sb = new QDoubleSpinBox( this );
 
679
    sb->setObjectName( "SpinBox"+suffix);
 
680
    sb->setMaximum( 1000000 );
 
681
    sb->setMinimum( 0.001 );
 
682
    sb->setDecimals( 3 );
 
683
    sb->setSuffix( suffix );
 
684
    sb->setValue( 0 );
 
685
    return sb;
 
686
}
 
687
 
 
688
QHBoxLayout* DataPlotWidget::createQHBoxLayout()
 
689
{
 
690
    QHBoxLayout* hbl = new QHBoxLayout();
 
691
    hbl->setContentsMargins( 0, 0, 0, 0 );
 
692
    hbl->setAlignment( Qt::AlignLeft );
 
693
    return hbl;
 
694
}
 
695
 
 
696
bool DataPlotWidget::eventFilter( QObject* object, QEvent* event )
 
697
{
 
698
    if( event->type() == QEvent::FocusIn )
 
699
    {
 
700
        if( (object == m_hTickBox)
 
701
         || (object == m_hPosBox)
 
702
         || (object == m_vTickBox)
 
703
         || (object == m_vPosBox) )
 
704
        {
 
705
            Circuit::self()->deselectAll();
 
706
        }
 
707
    }
 
708
    return false;
 
709
}
 
710
 
 
711
void DataPlotWidget::channel1Changed(){ setProbe( 0 ); }
 
712
void DataPlotWidget::channel2Changed(){ setProbe( 1 ); }
 
713
 
 
714
void DataPlotWidget::vTickDial1Changed( int Vscale )
 
715
{
 
716
    int ch = m_buttonGroup->checkedId();
 
717
    if( ch == 2 )
 
718
    {
 
719
        vTickDialChanged( 0, Vscale );
 
720
        setVTick( 1, m_vTick[0] );
 
721
    }
 
722
    else vTickDialChanged( ch, Vscale );
 
723
}
 
724
void DataPlotWidget::hPosDial1Changed( int hPos )
 
725
{
 
726
    int ch = m_buttonGroup->checkedId();
 
727
    if( ch == 2 )
 
728
    {
 
729
        hPosDialChanged( 0, hPos );
 
730
        setHPos( 1, m_hPos[0] );
 
731
    }
 
732
    else hPosDialChanged( ch, hPos );
 
733
}
 
734
void DataPlotWidget::vPosDial1Changed( int vPos )
 
735
{
 
736
    int ch = m_buttonGroup->checkedId();
 
737
    if( ch == 2 )
 
738
    {
 
739
        vPosDialChanged( 0, vPos );
 
740
        setVPos( 1, m_vPos[0] );
 
741
    }
 
742
    else vPosDialChanged( ch, vPos );
 
743
}
 
744
 
 
745
void DataPlotWidget::vTickBox1Changed()
 
746
{
 
747
    int ch = m_buttonGroup->checkedId();
 
748
    if( ch == 2 )
 
749
    {
 
750
        vTickBoxChanged( 0 );
 
751
        setVTick( 1, m_vTick[0] );
 
752
    }
 
753
    else vTickBoxChanged( ch );
 
754
}
 
755
 
 
756
void DataPlotWidget::hPosBox1Changed()
 
757
{
 
758
    int ch = m_buttonGroup->checkedId();
 
759
    if( ch == 2 )
 
760
    {
 
761
        hPosBoxChanged( 0 );
 
762
        setHPos( 1, m_hPos[0] );
 
763
    }
 
764
    else hPosBoxChanged( ch );
 
765
}
 
766
 
 
767
void DataPlotWidget::vPosBox1Changed()
 
768
{
 
769
    int ch = m_buttonGroup->checkedId();
 
770
    if( ch == 2 )
 
771
    {
 
772
        vPosBoxChanged( 0 );
 
773
        setVPos( 1, m_vPos[0] );
 
774
    }
 
775
    else vPosBoxChanged( ch );
 
776
}
 
777
 
 
778
void DataPlotWidget::setProbe( int ch )
 
779
{
 
780
    Probe* probe = 0l;
 
781
    Probe* oldProbe = m_probe[ch];
 
782
    QString nam = m_channel[ch]->text();
 
783
 
 
784
    Component* comp = Circuit::self()->getComponent( nam );
 
785
    if( comp ) probe = static_cast<Probe*>( comp );
 
786
 
 
787
    m_probe[ch] = probe;
 
788
    m_plotB->connectProbe( ch, probe!= 0l );
 
789
    m_plotB->m_probe[ch] = nam;
 
790
 
 
791
    if( oldProbe ) disconnect( oldProbe, SIGNAL( removed( Probe* ) ),
 
792
                               this,  SLOT  ( probeRemoved( Probe* )) );
 
793
 
 
794
    if( probe )  connect( probe, SIGNAL( removed( Probe* ) ),
 
795
                          this,  SLOT  ( probeRemoved( Probe* )), Qt::UniqueConnection );
 
796
}
 
797
 
 
798
void DataPlotWidget::probeRemoved( Probe* p )
 
799
{
 
800
    for( int i=0; i<2; i++ )
 
801
    {
 
802
        if( m_probe[i] == p )
 
803
        {
 
804
            m_channel[i]->setText( "" );
 
805
            setProbe( i );
 
806
        }
 
807
    }
 
808
}
 
809
 
 
810
#include "moc_dataplotwidget.cpp"