You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeartwork/kscreensaver/kdesavers/polygon.cpp

367 lines
8.2 KiB

//-----------------------------------------------------------------------------
//
// kpolygon - Basic screen saver for KDE
//
// Copyright (c) Martin R. Jones 1996
//
// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org>
// 2001/03/04 Converted to libkscreensaver by Martin R. Jones
#include <config.h>
#include <stdlib.h>
#include <time.h>
#include <tqcolor.h>
#include <tqlabel.h>
#include <tqslider.h>
#include <tqlayout.h>
#include <klocale.h>
#include <kconfig.h>
#include <kglobal.h>
#include <kmessagebox.h>
#include "polygon.h"
#include <tqpainter.h>
#include "polygon.moc"
#define MAXLENGTH 65
#define MAXVERTICES 19
// libkscreensaver interface
extern "C"
{
KDE_EXPORT const char *kss_applicationName = "kpolygon.kss";
KDE_EXPORT const char *kss_description = I18N_NOOP( "KPolygon" );
KDE_EXPORT const char *kss_version = "2.2.0";
KDE_EXPORT KScreenSaver *kss_create( WId id )
{
return new kPolygonSaver( id );
}
KDE_EXPORT TQDialog *kss_setup()
{
return new kPolygonSetup();
}
}
//-----------------------------------------------------------------------------
// dialog to setup screen saver parameters
//
kPolygonSetup::kPolygonSetup( TQWidget *parent, const char *name )
: KDialogBase( parent, name, true, i18n( "Setup Polygon Screen Saver" ),
Ok|Cancel|Help, Ok, true ), saver( 0 ), length( 10 ), vertices( 3 ),
speed( 50 )
{
readSettings();
TQWidget *main = makeMainWidget();
setButtonText( Help, i18n( "A&bout" ) );
TQHBoxLayout *tl = new TQHBoxLayout(main, 0, spacingHint());
TQVBoxLayout *tl1 = new TQVBoxLayout;
tl->addLayout(tl1);
TQLabel *label = new TQLabel( i18n("Length:"), main );
tl1->addWidget(label);
TQSlider *sb = new TQSlider(1, MAXLENGTH, 10, length, TQSlider::Horizontal,
main );
sb->setMinimumSize( 90, 20 );
sb->setTickmarks(TQSlider::Below);
sb->setTickInterval(10);
connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotLength( int ) ) );
tl1->addWidget(sb);
label = new TQLabel( i18n("Vertices:"), main );
tl1->addWidget(label);
sb = new TQSlider(3, MAXVERTICES, 2, vertices, TQSlider::Horizontal, main);
sb->setMinimumSize( 90, 20 );
sb->setTickmarks(TQSlider::Below);
sb->setTickInterval(2);
connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotVertices( int ) ) );
tl1->addWidget(sb);
label = new TQLabel( i18n("Speed:"), main );
tl1->addWidget(label);
sb = new TQSlider(0, 100, 10, speed, TQSlider::Horizontal, main);
sb->setMinimumSize( 90, 20 );
sb->setTickmarks(TQSlider::Below);
sb->setTickInterval(10);
connect( sb, TQT_SIGNAL( valueChanged( int ) ), TQT_SLOT( slotSpeed( int ) ) );
tl1->addWidget(sb);
tl1->addStretch();
preview = new TQWidget( main );
preview->setFixedSize( 220, 170 );
preview->setBackgroundColor( black );
preview->show(); // otherwise saver does not get correct size
saver = new kPolygonSaver( preview->winId() );
tl->addWidget(preview);
setMinimumSize( sizeHint() );
}
kPolygonSetup::~kPolygonSetup()
{
delete saver;
}
// read settings from config file
void kPolygonSetup::readSettings()
{
KConfig *config = KGlobal::config();
config->setGroup( "Settings" );
length = config->readNumEntry( "Length", length );
if ( length > MAXLENGTH )
length = MAXLENGTH;
else if ( length < 1 )
length = 1;
vertices = config->readNumEntry( "Vertices", vertices );
if ( vertices > MAXVERTICES )
vertices = MAXVERTICES;
else if ( vertices < 3 )
vertices = 3;
speed = config->readNumEntry( "Speed", speed );
if ( speed > 100 )
speed = 100;
else if ( speed < 50 )
speed = 50;
}
void kPolygonSetup::slotLength( int len )
{
length = len;
if ( saver )
saver->setPolygon( length, vertices );
}
void kPolygonSetup::slotVertices( int num )
{
vertices = num;
if ( saver )
saver->setPolygon( length, vertices );
}
void kPolygonSetup::slotSpeed( int num )
{
speed = num;
if ( saver )
saver->setSpeed( speed );
}
// Ok pressed - save settings and exit
void kPolygonSetup::slotOk()
{
KConfig *config = KGlobal::config();
config->setGroup( "Settings" );
TQString slength;
slength.setNum( length );
config->writeEntry( "Length", slength );
TQString svertices;
svertices.setNum( vertices );
config->writeEntry( "Vertices", svertices );
TQString sspeed;
sspeed.setNum( speed );
config->writeEntry( "Speed", sspeed );
config->sync();
accept();
}
void kPolygonSetup::slotHelp()
{
KMessageBox::information(this,
i18n("Polygon Version 2.2.0\n\n"\
"Written by Martin R. Jones 1996\n"\
"mjones@kde.org"));
}
//-----------------------------------------------------------------------------
kPolygonSaver::kPolygonSaver( WId id ) : KScreenSaver( id )
{
polygons.setAutoDelete( TRUE );
readSettings();
directions.resize( numVertices );
colorContext = TQColor::enterAllocContext();
blank();
initialiseColor();
initialisePolygons();
timer.start( speed );
connect( &timer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotTimeout() ) );
}
kPolygonSaver::~kPolygonSaver()
{
timer.stop();
TQColor::leaveAllocContext();
TQColor::destroyAllocContext( colorContext );
}
// set polygon properties
void kPolygonSaver::setPolygon( int len, int ver )
{
timer.stop();
numLines = len;
numVertices = ver;
directions.resize( numVertices );
polygons.clear();
initialisePolygons();
blank();
timer.start( speed );
}
// set the speed
void kPolygonSaver::setSpeed( int spd )
{
timer.stop();
speed = 100-spd;
timer.start( speed );
}
// read configuration settings from config file
void kPolygonSaver::readSettings()
{
KConfig *config = KGlobal::config();
config->setGroup( "Settings" );
numLines = config->readNumEntry( "Length", 10 );
if ( numLines > 50 )
numLines = 50;
else if ( numLines < 1 )
numLines = 1;
numVertices = config->readNumEntry( "Vertices", 3 );
if ( numVertices > 20 )
numVertices = 20;
else if ( numVertices < 3 )
numVertices = 3;
speed = 100 - config->readNumEntry( "Speed", 50 );
}
// draw next polygon and erase tail
void kPolygonSaver::slotTimeout()
{
TQPainter p( this );
if ( polygons.count() > numLines )
{
p.setPen( black );
p.drawPolyline( *polygons.first() );
}
nextColor();
p.setPen( colors[currentColor] );
p.drawPolyline( *polygons.last() );
if ( polygons.count() > numLines )
polygons.removeFirst();
polygons.append( new TQPointArray( polygons.last()->copy() ) );
moveVertices();
}
void kPolygonSaver::blank()
{
setBackgroundColor( black );
erase();
}
// initialise the polygon
void kPolygonSaver::initialisePolygons()
{
int i;
polygons.append( new TQPointArray( numVertices + 1 ) );
TQPointArray &poly = *polygons.last();
for ( i = 0; i < numVertices; i++ )
{
poly.setPoint( i, rnd.getLong(width()), rnd.getLong(height()) );
directions[i].setX( 16 - rnd.getLong(8) * 4 );
if ( directions[i].x() == 0 )
directions[i].setX( 1 );
directions[i].setY( 16 - rnd.getLong(8) * 4 );
if ( directions[i].y() == 0 )
directions[i].setY( 1 );
}
poly.setPoint( i, poly.point(0) );
}
// move polygon in current direction and change direction if a border is hit
void kPolygonSaver::moveVertices()
{
int i;
TQPointArray &poly = *polygons.last();
for ( i = 0; i < numVertices; i++ )
{
poly.setPoint( i, poly.point(i) + directions[i] );
if ( poly[i].x() >= (int)width() )
{
directions[i].setX( -(rnd.getLong(4) + 1) * 4 );
poly[i].setX( (int)width() );
}
else if ( poly[i].x() < 0 )
{
directions[i].setX( (rnd.getLong(4) + 1) * 4 );
poly[i].setX( 0 );
}
if ( poly[i].y() >= (int)height() )
{
directions[i].setY( -(rnd.getLong(4) + 1) * 4 );
poly[i].setY( height() );
}
else if ( poly[i].y() < 0 )
{
directions[i].setY( (rnd.getLong(4) + 1) * 4 );
poly[i].setY( 0 );
}
}
poly.setPoint( i, poly.point(0) );
}
// create a color table of 64 colors
void kPolygonSaver::initialiseColor()
{
for ( int i = 0; i < 64; i++ )
{
colors[i].setHsv( i * 360 / 64, 255, 255 );
}
currentColor = 0;
}
// set foreground color to next in the table
void kPolygonSaver::nextColor()
{
currentColor++;
if ( currentColor > 63 )
currentColor = 0;
}