Deprecated--
[kdeartwork.git] / kscreensaver / kdesavers / polygon.cpp
blobf3ddf897129437e5439d74c813cfc39d40f70c03
1 //-----------------------------------------------------------------------------
2 //
3 // kpolygon - Basic screen saver for KDE
4 //
5 // Copyright (c) Martin R. Jones 1996
6 //
7 // layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org>
8 // 2001/03/04 Converted to libkscreensaver by Martin R. Jones
10 #include <config.h>
11 #include <stdlib.h>
12 #include <time.h>
13 #include <qcolor.h>
14 #include <qlabel.h>
15 #include <qslider.h>
16 #include <qlayout.h>
17 //Added by qt3to4:
18 #include <Q3PointArray>
19 #include <QVBoxLayout>
20 #include <QHBoxLayout>
21 #include <klocale.h>
22 #include <kconfig.h>
23 #include <kglobal.h>
24 #include <kmessagebox.h>
26 #include "polygon.h"
27 #include <qpainter.h>
29 #include "polygon.moc"
32 #define MAXLENGTH 65
33 #define MAXVERTICES 19
35 // libkscreensaver interface
36 class KPolygonSaverInterface : public KScreenSaverInterface
40 public:
41 virtual KAboutData* aboutData() {
42 return new KAboutData( "kpolygon.kss", I18N_NOOP( "KPolygon" ), "2.2.0", I18N_NOOP( "KPolygon" ) );
46 virtual KScreenSaver* create( WId id )
48 return new kPolygonSaver( id );
51 virtual QDialog* setup()
53 return new kPolygonSetup();
57 int main( int argc, char *argv[] )
59 KPolygonSaverInterface kss;
60 return kScreenSaverMain( argc, argv, kss );
63 //-----------------------------------------------------------------------------
64 // dialog to setup screen saver parameters
66 kPolygonSetup::kPolygonSetup( QWidget *parent, const char *name )
67 : KDialog( parent)
68 , saver( 0 ), length( 10 ), vertices( 3 ),
69 speed( 50 )
71 setCaption(i18n( "Setup Polygon Screen Saver" ));
72 setButtons(Ok|Cancel|Help);
73 setDefaultButton(Ok);
74 setModal(true);
75 readSettings();
77 QWidget *main = new QWidget(this);
78 setMainWidget(main);
79 setButtonText( Help, i18n( "A&bout" ) );
81 QHBoxLayout *tl = new QHBoxLayout(main, 0, spacingHint());
82 QVBoxLayout *tl1 = new QVBoxLayout;
83 tl->addLayout(tl1);
85 QLabel *label = new QLabel( i18n("Length:"), main );
86 tl1->addWidget(label);
88 QSlider *sb = new QSlider(1, MAXLENGTH, 10, length, Qt::Horizontal,
89 main );
90 sb->setMinimumSize( 90, 20 );
91 sb->setTickPosition(QSlider::TicksBelow);
92 sb->setTickInterval(10);
93 connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotLength( int ) ) );
94 tl1->addWidget(sb);
96 label = new QLabel( i18n("Vertices:"), main );
97 tl1->addWidget(label);
99 sb = new QSlider(3, MAXVERTICES, 2, vertices, Qt::Horizontal, main);
100 sb->setMinimumSize( 90, 20 );
101 sb->setTickPosition(QSlider::TicksBelow);
102 sb->setTickInterval(2);
103 connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotVertices( int ) ) );
104 tl1->addWidget(sb);
106 label = new QLabel( i18n("Speed:"), main );
107 tl1->addWidget(label);
109 sb = new QSlider(0, 100, 10, speed, Qt::Horizontal, main);
110 sb->setMinimumSize( 90, 20 );
111 sb->setTickPosition(QSlider::TicksBelow);
112 sb->setTickInterval(10);
113 connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) );
114 tl1->addWidget(sb);
115 tl1->addStretch();
117 preview = new QWidget( main );
118 preview->setFixedSize( 220, 170 );
119 preview->setBackgroundColor( Qt::black );
120 preview->show(); // otherwise saver does not get correct size
121 saver = new kPolygonSaver( preview->winId() );
122 tl->addWidget(preview);
124 setMinimumSize( sizeHint() );
127 kPolygonSetup::~kPolygonSetup()
129 delete saver;
132 // read settings from config file
133 void kPolygonSetup::readSettings()
135 KConfig *config = KGlobal::config();
136 config->setGroup( "Settings" );
138 length = config->readEntry( "Length", length );
139 if ( length > MAXLENGTH )
140 length = MAXLENGTH;
141 else if ( length < 1 )
142 length = 1;
144 vertices = config->readEntry( "Vertices", vertices );
145 if ( vertices > MAXVERTICES )
146 vertices = MAXVERTICES;
147 else if ( vertices < 3 )
148 vertices = 3;
150 speed = config->readEntry( "Speed", speed );
151 if ( speed > 100 )
152 speed = 100;
153 else if ( speed < 50 )
154 speed = 50;
157 void kPolygonSetup::slotLength( int len )
159 length = len;
160 if ( saver )
161 saver->setPolygon( length, vertices );
164 void kPolygonSetup::slotVertices( int num )
166 vertices = num;
167 if ( saver )
168 saver->setPolygon( length, vertices );
171 void kPolygonSetup::slotSpeed( int num )
173 speed = num;
174 if ( saver )
175 saver->setSpeed( speed );
178 // Ok pressed - save settings and exit
179 void kPolygonSetup::slotOk()
181 KConfig *config = KGlobal::config();
182 config->setGroup( "Settings" );
184 QString slength;
185 slength.setNum( length );
186 config->writeEntry( "Length", slength );
188 QString svertices;
189 svertices.setNum( vertices );
190 config->writeEntry( "Vertices", svertices );
192 QString sspeed;
193 sspeed.setNum( speed );
194 config->writeEntry( "Speed", sspeed );
196 config->sync();
198 accept();
201 void kPolygonSetup::slotHelp()
203 KMessageBox::information(this,
204 i18n("Polygon Version 2.2.0\n\n"\
205 "Written by Martin R. Jones 1996\n"\
206 "mjones@kde.org"));
209 //-----------------------------------------------------------------------------
212 kPolygonSaver::kPolygonSaver( WId id ) : KScreenSaver( id )
214 polygons.setAutoDelete( TRUE );
216 readSettings();
218 directions.resize( numVertices );
220 blank();
222 initialiseColor();
223 initialisePolygons();
225 timer.start( speed );
226 connect( &timer, SIGNAL( timeout() ), SLOT( slotTimeout() ) );
229 kPolygonSaver::~kPolygonSaver()
231 timer.stop();
234 // set polygon properties
235 void kPolygonSaver::setPolygon( int len, int ver )
237 timer.stop();
238 numLines = len;
239 numVertices = ver;
241 directions.resize( numVertices );
242 polygons.clear();
243 initialisePolygons();
244 blank();
246 timer.start( speed );
249 // set the speed
250 void kPolygonSaver::setSpeed( int spd )
252 timer.stop();
253 speed = 100-spd;
254 timer.start( speed );
257 // read configuration settings from config file
258 void kPolygonSaver::readSettings()
260 KConfig *config = KGlobal::config();
261 config->setGroup( "Settings" );
263 numLines = config->readEntry( "Length", 10 );
264 if ( numLines > 50 )
265 numLines = 50;
266 else if ( numLines < 1 )
267 numLines = 1;
269 numVertices = config->readEntry( "Vertices", 3 );
270 if ( numVertices > 20 )
271 numVertices = 20;
272 else if ( numVertices < 3 )
273 numVertices = 3;
275 speed = 100 - config->readEntry( "Speed", 50 );
278 // draw next polygon and erase tail
279 void kPolygonSaver::slotTimeout()
281 QPainter p( this );
282 if ( polygons.count() > numLines )
284 p.setPen( Qt::black );
285 p.drawPolyline( *polygons.first() );
288 nextColor();
289 p.setPen( colors[currentColor] );
290 p.drawPolyline( *polygons.last() );
292 if ( polygons.count() > numLines )
293 polygons.removeFirst();
295 polygons.append( new Q3PointArray( polygons.last()->copy() ) );
296 moveVertices();
299 void kPolygonSaver::blank()
301 setBackgroundColor( Qt::black );
302 erase();
305 // initialise the polygon
306 void kPolygonSaver::initialisePolygons()
308 int i;
310 polygons.append( new Q3PointArray( numVertices + 1 ) );
312 Q3PointArray &poly = *polygons.last();
314 for ( i = 0; i < numVertices; i++ )
316 poly.setPoint( i, rnd.getLong(width()), rnd.getLong(height()) );
317 directions[i].setX( 16 - rnd.getLong(8) * 4 );
318 if ( directions[i].x() == 0 )
319 directions[i].setX( 1 );
320 directions[i].setY( 16 - rnd.getLong(8) * 4 );
321 if ( directions[i].y() == 0 )
322 directions[i].setY( 1 );
325 poly.setPoint( i, poly.point(0) );
328 // move polygon in current direction and change direction if a border is hit
329 void kPolygonSaver::moveVertices()
331 int i;
332 Q3PointArray &poly = *polygons.last();
334 for ( i = 0; i < numVertices; i++ )
336 poly.setPoint( i, poly.point(i) + directions[i] );
337 if ( poly[i].x() >= (int)width() )
339 directions[i].setX( -(rnd.getLong(4) + 1) * 4 );
340 poly[i].setX( (int)width() );
342 else if ( poly[i].x() < 0 )
344 directions[i].setX( (rnd.getLong(4) + 1) * 4 );
345 poly[i].setX( 0 );
348 if ( poly[i].y() >= (int)height() )
350 directions[i].setY( -(rnd.getLong(4) + 1) * 4 );
351 poly[i].setY( height() );
353 else if ( poly[i].y() < 0 )
355 directions[i].setY( (rnd.getLong(4) + 1) * 4 );
356 poly[i].setY( 0 );
360 poly.setPoint( i, poly.point(0) );
363 // create a color table of 64 colors
364 void kPolygonSaver::initialiseColor()
366 for ( int i = 0; i < 64; i++ )
368 colors[i].setHsv( i * 360 / 64, 255, 255 );
371 currentColor = 0;
374 // set foreground color to next in the table
375 void kPolygonSaver::nextColor()
377 currentColor++;
379 if ( currentColor > 63 )
380 currentColor = 0;