summaryrefslogtreecommitdiffstats
path: root/examples/demo/display.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/demo/display.cpp')
-rw-r--r--examples/demo/display.cpp230
1 files changed, 230 insertions, 0 deletions
diff --git a/examples/demo/display.cpp b/examples/demo/display.cpp
new file mode 100644
index 0000000..eceef05
--- /dev/null
+++ b/examples/demo/display.cpp
@@ -0,0 +1,230 @@
+/****************************************************************************
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of an example program for Qt. This example
+** program may be used, distributed and modified without limitation.
+**
+*****************************************************************************/
+
+#include "display.h"
+
+#include <qpainter.h>
+#include <qlayout.h>
+#include <qtimer.h>
+#include <qpushbutton.h>
+#include <qframe.h>
+#include <qdial.h>
+#include <qlcdnumber.h>
+#include <qprogressbar.h>
+#include <qspinbox.h>
+
+#include <math.h>
+
+Screen::Screen( QWidget *parent, const char *name )
+ : QFrame( parent, name )
+{
+ setLineWidth( FrameWidth );
+ setFrameStyle( Panel | Sunken );
+ setBackgroundMode( PaletteBase );
+ setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
+ setPaletteBackgroundColor( black );
+ setPaletteForegroundColor( blue );
+
+ yval = new int[width()];
+ memset( yval, 0, sizeof(int)*width() );
+ pos0 = 0;
+ t0 = 0;
+ step = 0;
+}
+
+Screen::~Screen()
+{
+ delete yval;
+}
+
+void Screen::resizeEvent( QResizeEvent *e )
+{
+ delete yval;
+ int w = e->size().width();
+ yval = new int[w];
+ memset( yval, 0, sizeof(int)*w);
+}
+
+void Screen::animate()
+{
+ if ( step == 0 )
+ return;
+
+ int t = t0;
+ int p = pos0;
+ if ( step < 0 ) {
+ t += width() + step;
+ } else {
+ t -= step;
+ p -= step;
+ if ( p < 0 )
+ p += width();
+ }
+
+ for ( int i = 0; i < QABS( step ); i++ ) {
+ int y = (int)((height()-FrameWidth)/2 * sin( 3.1415*(double)t/180.0 ));
+ yval[ p ] = y;
+ ++t;
+ t %= 360;
+ ++p;
+ p %= width();
+ }
+ t0 -= step;
+ if ( t0 < 0 )
+ t0 += 360;
+ pos0 = (pos0 - step) % width();
+ if ( pos0 < 0 )
+ pos0 += width();
+
+ scroll( step, 0, QRect( FrameWidth, FrameWidth, width()-2*FrameWidth, height()-2*FrameWidth ));
+}
+
+void Screen::setStep( int s )
+{
+ step = s;
+}
+
+void Screen::drawContents( QPainter *p )
+{
+ QRect r = p->hasClipping() ?
+ p->clipRegion().boundingRect() : contentsRect();
+
+ int vp = ( r.left() - FrameWidth + pos0 ) % width();
+ int y0 = FrameWidth + height()/2;
+
+ for ( int x = r.left(); x <= r.right(); x++ ) {
+ p->drawLine( x, y0 + yval[ vp ], x, r.bottom());
+ ++vp;
+ vp %= width();
+ }
+}
+
+/***********************************************************************/
+
+Curve::Curve( QWidget *parent, const char *name )
+ : QFrame( parent, name )
+{
+ setLineWidth( FrameWidth );
+ setFrameStyle( Panel | Sunken );
+ setBackgroundMode( PaletteBase );
+ setPaletteBackgroundColor(black);
+ setPaletteForegroundColor(red);
+ setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
+
+ shift = 0;
+ n = 1;
+}
+
+void Curve::drawContents( QPainter *p )
+{
+ p->moveTo( width()/2, height()/2 + (int)(90.0*sin( double(shift)*3.1415/180.0)));
+
+ for ( double a = 0.0; a < 360.0; a += 1.0 ) {
+ double rad = 3.1415 / 180.0 * a;
+ double x = width()/2 + 90.0 * sin(rad);
+ double y = height()/2 + 90.0 * sin(n * rad + double(shift)*3.1415/180.0);
+ p->lineTo( int(x), int(y) );
+ }
+}
+
+void Curve::animate()
+{
+ shift = (shift + 1) % 360;
+ update( FrameWidth, FrameWidth, width() - 2*FrameWidth, height() - 2*FrameWidth );
+}
+
+void Curve::setFactor( int f )
+{
+ n = f;
+}
+
+/***********************************************************************/
+
+DisplayWidget::DisplayWidget( QWidget *parent, const char *name )
+ : QWidget( parent, name )
+{
+ timer = 0;
+
+ QVBoxLayout *vbox = new QVBoxLayout( this, 10 );
+
+ QHBoxLayout *hbox = new QHBoxLayout( vbox );
+ screen = new Screen( this );
+ dial = new QDial( this );
+ dial->setNotchesVisible( TRUE );
+ dial->setRange( -10, 10 );
+ dial->setValue( 1 );
+ screen->setStep( dial->value() );
+ connect( dial, SIGNAL( valueChanged( int )),
+ screen, SLOT( setStep( int )));
+ lcd = new QLCDNumber( 2, this );
+ lcd->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+ lcdval = 0;
+
+ hbox->addWidget( screen );
+
+ QVBoxLayout *vb2 = new QVBoxLayout( hbox );
+
+ curve = new Curve( this );
+ spin = new QSpinBox( 1, 10, 1, this );
+ connect( spin, SIGNAL( valueChanged( int )), curve, SLOT( setFactor( int )));
+ spin->setValue( 2 );
+ vb2->addWidget( curve );
+ vb2->addWidget( spin );
+
+ QHBoxLayout *hbox2 = new QHBoxLayout( vb2 );
+
+ hbox2->addWidget( dial );
+ hbox2->addWidget( lcd );
+
+ bar = new QProgressBar( 10, this );
+ tbar = 0;
+
+ vbox->addWidget( bar );
+}
+
+void DisplayWidget::run()
+{
+ if ( !timer ) {
+ timer = new QTimer( this );
+ connect( timer, SIGNAL( timeout() ), SLOT( tick() ) );
+ }
+
+ timer->start( 5 );
+}
+
+void DisplayWidget::stop()
+{
+ timer->stop();
+}
+
+void DisplayWidget::tick()
+{
+ // sine
+ screen->animate();
+ // Lissajous
+ curve->animate();
+ // lcd display
+ lcd->display( ++lcdval % 100 );
+ // progress bar
+ bar->setProgress( 5 + (int)(5*sin( 3.1415 * (double)tbar / 180.0 )));
+ ++tbar;
+ tbar %= 360;
+}
+
+void DisplayWidget::showEvent( QShowEvent * )
+{
+ run();
+ screen->repaint();
+}
+
+void DisplayWidget::hideEvent( QHideEvent * )
+{
+ stop();
+}
+