summaryrefslogtreecommitdiffstats
path: root/examples/desktop/desktop.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/desktop/desktop.cpp')
-rw-r--r--examples/desktop/desktop.cpp347
1 files changed, 347 insertions, 0 deletions
diff --git a/examples/desktop/desktop.cpp b/examples/desktop/desktop.cpp
new file mode 100644
index 0000000..2b6fb30
--- /dev/null
+++ b/examples/desktop/desktop.cpp
@@ -0,0 +1,347 @@
+/****************************************************************************
+**
+** 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 <qimage.h>
+#include <qbitmap.h>
+#include <qpainter.h>
+#include <qapplication.h>
+#include <qdropsite.h>
+#include <qdragobject.h>
+#include <stdio.h>
+
+
+static double seed = 0.353535353535;
+static const int KINDA_RAND_MAX = 32767;
+
+static int kindaRand()
+{
+ seed = seed*147;
+ seed = seed - (double) ((int) seed);
+ return (int) ( seed*(KINDA_RAND_MAX + 1) );
+}
+
+static int velocity( int i ) // change velocity
+{
+ const int velmax = 15;
+ const int velmin = 4;
+ if ( i == 1 || i == 2 )
+ i = (kindaRand()&0x7fff % velmax)/3 + velmin;
+ else
+ i = (kindaRand()&0x7fff % velmax) + velmin;
+ return i;
+}
+
+//
+// Draw polygon on desktop.
+//
+
+void poly()
+{
+ QWidget *d = QApplication::desktop();
+ d->setBackgroundColor( Qt::white ); // white desktop
+
+ const int maxpoints = 5;
+ const int maxcurves = 8;
+ static int xvel[maxpoints];
+ static int yvel[maxpoints];
+ int head = 0;
+ int tail = -maxcurves + 2;
+ QPointArray *a = new QPointArray[ maxcurves ];
+ register QPointArray *p;
+ QRect r = d->rect(); // desktop rectangle
+
+ int i;
+ for ( i=0; i<maxcurves; i++ )
+ a[i].resize( maxpoints );
+ p = &a[0];
+ for ( i=0; i<maxpoints; i++ ) { // setup first polygon points
+ p->setPoint( i, (kindaRand()&0x7fff) % r.width(),
+ (kindaRand()&0x7fff) % r.height() );
+ xvel[i] = velocity(i);
+ yvel[i] = velocity(i);
+ }
+
+ QPainter paint;
+ paint.begin( d ); // start painting desktop
+
+ for ( int ntimes=0; ntimes<2000; ntimes++ ) {
+ paint.setBrush( QColor(kindaRand()%360, 180, 255, QColor::Hsv) );
+ paint.drawPolygon( a[head] );
+ if ( ++tail >= maxcurves )
+ tail = 0;
+
+ int minx=r.left(), maxx=r.right();
+ int miny=r.top(), maxy=r.bottom();
+ int x, y;
+ p = &a[head];
+ if ( ++head >= maxcurves )
+ head = 0;
+ for ( i=0; i<maxpoints; i++ ) { // calc new curve
+ p->point( i, &x, &y );
+ x += xvel[i];
+ y += yvel[i];
+ if ( x >= maxx ) {
+ x = maxx - (x - maxx + 1);
+ xvel[i] = -velocity(i);
+ }
+ if ( x <= minx ) {
+ x = minx + (minx - x + 1);
+ xvel[i] = velocity(i);
+ }
+ if ( y >= maxy ) {
+ y = maxy - (y - maxy + 1);
+ yvel[i] = -velocity(i);
+ }
+ if ( y <= miny ) {
+ y = miny + (miny - y + 1);
+ yvel[i] = velocity(i);
+ }
+ a[head].setPoint( i, x, y );
+ }
+ }
+ paint.end(); // painting done
+ delete[] a;
+}
+
+
+//
+// Rotate pattern on desktop.
+//
+
+void rotate()
+{
+ int i;
+ const int w = 64;
+ const int h = 64;
+ QImage image( w, h, 8, 128 ); // create image
+ for ( i=0; i<128; i++ ) // build color table
+ image.setColor( i, qRgb(i,0,0) );
+ for ( int y=0; y<h; y++ ) { // set image pixels
+ uchar *p = image.scanLine(y);
+ for ( int x=0; x<w; x++ )
+ *p++ = (x+y)%128;
+ }
+
+ QPixmap pm;
+ pm = image; // convert image to pixmap
+ pm.setOptimization( QPixmap::BestOptim ); // rotation will be faster
+
+ QWidget *d = QApplication::desktop(); // w = desktop widget
+
+ for ( i=0; i<=360; i += 2 ) {
+ QWMatrix m;
+ m.rotate( i ); // rotate coordinate system
+ QPixmap rpm = pm.xForm( m ); // rpm = rotated pixmap
+ d->setBackgroundPixmap( rpm ); // set desktop pixmap
+ d->update(); // repaint desktop
+ }
+}
+
+//
+// Generates a marble-like pattern in pm.
+//
+
+void generateStone( QPixmap *pm,
+ const QColor &c1, const QColor &c2, const QColor &c3 )
+{
+ QPainter p;
+ QPen p1 ( c1, 0 );
+ QPen p2 ( c2, 0 );
+ QPen p3 ( c3, 0 );
+
+ p.begin( pm );
+ for( int i = 0 ; i < pm->width() ; i++ )
+ for( int j = 0 ; j < pm->height() ; j++ ) {
+ int r = kindaRand();
+ if ( r < KINDA_RAND_MAX / 3 )
+ p.setPen( p1 );
+ else if ( r < KINDA_RAND_MAX / 3 * 2 )
+ p.setPen( p2 );
+ else
+ p.setPen( p3 );
+ p.drawPoint( i,j );
+ }
+ p.end();
+}
+
+void drawShadeText( QPainter *p, int x, int y, const char *text,
+ const QColor &topColor, const QColor &bottomColor,
+ int sw = 2 )
+{
+ if ( !p->isActive() )
+ return;
+
+ p->setPen( bottomColor );
+ p->drawText( x+sw, y+sw, text );
+ p->setPen( topColor );
+ p->drawText( x, y, text );
+}
+
+// NOTE: desktop drag/drop is experimental
+
+class DesktopWidget : public QWidget, private QDropSite
+{
+public:
+ DesktopWidget( const char *s, QWidget *parent=0, const char *name=0 );
+ ~DesktopWidget();
+ void paintEvent( QPaintEvent * );
+
+ void dragEnterEvent( QDragEnterEvent *e )
+ {
+ if ( QImageDrag::canDecode(e) )
+ e->accept();
+ }
+
+ void dragLeaveEvent( QDragLeaveEvent * )
+ {
+ }
+
+ void dragMoveEvent( QDragMoveEvent *e )
+ {
+ e->accept();
+ }
+
+ void dropEvent( QDropEvent * e )
+ {
+ QPixmap pmp;
+ if ( QImageDrag::decode( e, pmp ) ) {
+ setBackgroundPixmap( pmp );
+ update();
+ }
+ }
+
+private:
+ QPixmap *pm;
+ QString text;
+};
+
+DesktopWidget::DesktopWidget( const char *s, QWidget *parent, const char *name )
+ : QWidget( parent, name, WType_Desktop | WPaintDesktop),
+ QDropSite(this)
+{
+ text = s;
+ pm = 0;
+}
+
+DesktopWidget::~DesktopWidget()
+{
+ delete pm;
+}
+
+void DesktopWidget::paintEvent( QPaintEvent * )
+{
+ QColor c1 = backgroundColor();
+ QColor c2 = c1.light(104);
+ QColor c3 = c1.dark(106);
+ if ( !pm ) {
+ pm = new QPixmap( 64, 64 );
+ generateStone( pm, c1, c2, c3 );
+ setBackgroundPixmap( *pm );
+ update();
+ }
+ QRect br = fontMetrics().boundingRect( text );
+ QPixmap offscreen( br.width(), br.height() );
+ int x = width()/2 - br.width()/2;
+ int y = height()/2 - br.height()/2;
+ offscreen.fill( this, x, y );
+ QPainter p;
+ p.begin( &offscreen );
+ drawShadeText( &p, -br.x(), -br.y(), text, c2, c3, 3 );
+ p.end();
+ bitBlt( this, x, y, &offscreen );
+}
+
+void desktopWidget( const char *s = "Trolltech" )
+{
+ DesktopWidget *t = new DesktopWidget(s);
+ t->update();
+ qApp->exec();
+ delete t;
+}
+
+void desktopText( const char *s = "Trolltech" )
+{
+ const int border = 20;
+
+ QColor c1 = qApp->palette().inactive().background();
+ QColor c2 = c1.light(104);
+ QColor c3 = c1.dark(106);
+
+ QPixmap pm(10,10);
+
+ QPainter p;
+ p.begin( &pm );
+ QRect r = p.fontMetrics().boundingRect( s );
+ p.end();
+
+ int appWidth = qApp->desktop()->width();
+ int appHeight = qApp->desktop()->height();
+ if ( r.width() > appWidth - border*2 )
+ r.setWidth( appWidth - border*2 );
+ if ( r.height() > appHeight - border*2 )
+ r.setHeight( appHeight - border*2 );
+
+ pm.resize( r.size() + QSize( border*2, border*2 ) );
+ generateStone( &pm, c1, c2, c3 );
+ p.begin( &pm );
+ drawShadeText( &p, -r.x() + border, -r.y() + border, s, c2, c3 );
+ p.end();
+
+ qApp->desktop()->setBackgroundPixmap( pm );
+}
+
+//
+// The program starts here.
+//
+
+int main( int argc, char **argv )
+{
+ QApplication app( argc, argv );
+
+ if ( argc > 1 ) {
+ QFont f( "charter", 96, QFont::Black );
+ f.setStyleHint( QFont::Times );
+ app.setFont( f );
+ }
+
+ bool validOptions = FALSE;
+
+ if ( argc == 2 ) {
+ validOptions = TRUE;
+ if ( strcmp(argv[1],"-poly") == 0 )
+ poly();
+ else if ( strcmp(argv[1],"-rotate") == 0 )
+ rotate();
+ else if ( strcmp(argv[1],"-troll") == 0 )
+ desktopText();
+ else if ( strcmp(argv[1],"-trollwidget") == 0 )
+ desktopWidget();
+ else
+ validOptions = FALSE;
+ }
+ if ( argc == 3 ) {
+ validOptions = TRUE;
+ if ( strcmp(argv[1],"-shadetext") == 0 )
+ desktopText( argv[2] );
+ else if ( strcmp(argv[1],"-shadewidget") == 0 )
+ desktopWidget( argv[2] );
+ else
+ validOptions = FALSE;
+ }
+ if ( !validOptions ) {
+ fprintf( stderr, "Usage:\n\tdesktop -poly"
+ "\n\tdesktop -rotate"
+ "\n\tdesktop -troll"
+ "\n\tdesktop -trollwidget"
+ "\n\tdesktop -shadetext <text>"
+ "\n\tdesktop -shadewidget <text>\n" );
+ rotate();
+ }
+ return 0;
+}