summaryrefslogtreecommitdiffstats
path: root/ktux/sprite.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ktux/sprite.cpp')
-rw-r--r--ktux/sprite.cpp254
1 files changed, 254 insertions, 0 deletions
diff --git a/ktux/sprite.cpp b/ktux/sprite.cpp
new file mode 100644
index 0000000..205c754
--- /dev/null
+++ b/ktux/sprite.cpp
@@ -0,0 +1,254 @@
+//-----------------------------------------------------------------------------
+//
+// KTux - QCanvas based screensaver
+//
+// Copyright (c) Martin R. Jones 1999
+//
+
+#include <stdlib.h>
+#include <time.h>
+#include <qlabel.h>
+#include <qmessagebox.h>
+#include <qlayout.h>
+#include <qslider.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kstdguiitem.h>
+#include <kbuttonbox.h>
+
+#include "spritepm.h"
+#include "spritemisc.h"
+#include "sprite.h"
+#include "sprite.moc"
+
+
+// libkscreensaver interface
+extern "C"
+{
+ KDE_EXPORT const char *kss_applicationName = "ktux";
+ KDE_EXPORT const char *kss_description = I18N_NOOP( "Tux Screen Saver" );
+ KDE_EXPORT const char *kss_version = "1.0.0";
+
+ KDE_EXPORT KScreenSaver *kss_create( WId id )
+ {
+ return new KSpriteSaver( id );
+ }
+
+ KDE_EXPORT QDialog *kss_setup()
+ {
+ return new KSpriteSetup();
+ }
+}
+
+//-----------------------------------------------------------------------------
+
+KSpriteSetup::KSpriteSetup( QWidget *parent, const char *name )
+ : QDialog( parent, name, TRUE )
+{
+ KGlobal::locale()->insertCatalogue("ktux");
+ saver = 0;
+
+ readSettings();
+
+ setCaption(i18n("Setup KTux") );
+
+ QVBoxLayout *tl = new QVBoxLayout(this, 10, 10);
+ QHBoxLayout *tl1 = new QHBoxLayout;
+ tl->addLayout(tl1);
+ QVBoxLayout *tl11 = new QVBoxLayout(5);
+ tl1->addLayout(tl11);
+
+ QLabel *label = new QLabel( i18n("Speed:"), this );
+ label->setMinimumSize(label->sizeHint());
+ tl11->addStretch(1);
+ tl11->addWidget(label);
+
+ QSlider *sb = new QSlider(0, 100, 10, speed, QSlider::Horizontal, this );
+ tl11->addWidget(sb);
+ connect( sb, SIGNAL( valueChanged( int ) ), SLOT( slotSpeed( int ) ) );
+
+ preview = new QWidget( this );
+ preview->setFixedSize( 220, 170 );
+ preview->setBackgroundColor( black );
+ preview->show(); // otherwise saver does not get correct size
+ saver = new KSpriteSaver( preview->winId() );
+ tl1->addWidget(preview);
+
+ KButtonBox *bbox = new KButtonBox(this);
+ QButton *button = bbox->addButton( i18n("About"));
+ connect( button, SIGNAL( clicked() ), SLOT(slotAbout() ) );
+ bbox->addStretch(1);
+
+ button = bbox->addButton( KStdGuiItem::ok());
+ connect( button, SIGNAL( clicked() ), SLOT( slotOkPressed() ) );
+
+ button = bbox->addButton(KStdGuiItem::cancel());
+ connect( button, SIGNAL( clicked() ), SLOT( reject() ) );
+ bbox->layout();
+ tl->addWidget(bbox);
+
+ tl->freeze();
+}
+
+KSpriteSetup::~KSpriteSetup()
+{
+ delete saver;
+}
+
+// read settings from config file
+void KSpriteSetup::readSettings()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup( "Settings" );
+
+ speed = config->readNumEntry( "Speed", 50 );
+ if (speed > 100)
+ speed = 100;
+ else if (speed < 0)
+ speed = 0;
+}
+
+void KSpriteSetup::slotSpeed(int s)
+{
+ speed = s;
+ if (saver)
+ saver->setSpeed(speed);
+}
+
+// Ok pressed - save settings and exit
+void KSpriteSetup::slotOkPressed()
+{
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+ config->writeEntry("Speed", speed);
+ config->sync();
+ accept();
+}
+
+void KSpriteSetup::slotAbout()
+{
+ QMessageBox::message(i18n("About KTux"),
+ i18n("KTux Version 1.0\n\nWritten by Martin R. Jones 1999\[email protected]"),
+ i18n("OK"));
+}
+
+
+//-----------------------------------------------------------------------------
+
+KSpriteSaver::KSpriteSaver( WId id ) : KScreenSaver( id )
+{
+ KGlobal::dirs()->addResourceType("sprite", KStandardDirs::kde_default("data") + "ktux/sprites/");
+
+ initialise();
+ readSettings();
+ blank();
+
+ connect(&mTimer, SIGNAL(timeout()), SLOT(slotTimeout()));
+ mTimer.start(120-mSpeed, true);
+}
+
+//-----------------------------------------------------------------------------
+KSpriteSaver::~KSpriteSaver()
+{
+ mTimer.stop();
+ delete mView;
+ delete mCanvas;
+}
+
+//-----------------------------------------------------------------------------
+//
+void KSpriteSaver::setSpeed(int speed)
+{
+ mSpeed = speed;
+ mTimer.changeInterval(120-mSpeed);
+}
+
+//-----------------------------------------------------------------------------
+// read settings from config file
+//
+void KSpriteSaver::readSettings()
+{
+ QString str;
+
+ KConfig *config = KGlobal::config();
+ config->setGroup("Settings");
+
+ mSpeed = config->readNumEntry("Speed", 50);
+
+ QString path = KGlobal::dirs()->findResourceDir( "sprite", "bg.png" );
+
+ SpritePixmapManager::manager()->setPixmapDir(path);
+
+ path += "spriterc";
+
+ KSimpleConfig *mConfig = new KSimpleConfig(path, true);
+ mConfig->setGroup("Config");
+ QStrList list;
+ int groups = mConfig->readListEntry("Groups", list);
+ mTimerIds.resize(groups);
+ for (int i = 0; i < groups; i++)
+ {
+ kdDebug() << "Group: " << list.at(i) << endl;;
+ mConfig->setGroup(list.at(i));
+ SpriteGroup *obj = new SpriteGroup(mCanvas, *mConfig);
+ mTimerIds[i] = startTimer(obj->refreshTime());
+ mGroups.append(obj);
+ }
+ delete mConfig;
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::initialise()
+{
+ mCanvas = new QCanvas();
+ QPixmap pm( locate("sprite", "bg.png") );
+ mCanvas->setBackgroundPixmap( pm );
+ mCanvas->resize( width(), height() );
+ mView = new QCanvasView(mCanvas);
+ mView->viewport()->setBackgroundColor( black );
+ mView->resize( size());
+ mView->setFrameStyle( QFrame::NoFrame );
+ mView->setVScrollBarMode( QScrollView::AlwaysOff );
+ mView->setHScrollBarMode( QScrollView::AlwaysOff );
+ embed( mView );
+ mView->show();
+ SpriteRange::setFieldSize(mView->size());
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::slotTimeout()
+{
+ mTimer.start(120-mSpeed, true);
+ SpriteGroup *grp;
+
+ for (grp = mGroups.first(); grp; grp = mGroups.next())
+ {
+ grp->next();
+ }
+
+ mCanvas->advance();
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::timerEvent(QTimerEvent *ev)
+{
+ for (unsigned i = 0; i < mTimerIds.size(); i++)
+ {
+ if (mTimerIds[i] == ev->timerId())
+ {
+ mGroups.at(i)->refresh();
+ killTimer(ev->timerId());
+ mTimerIds[i] = startTimer(mGroups.at(i)->refreshTime());
+ break;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void KSpriteSaver::blank()
+{
+ setBackgroundColor( black );
+ erase();
+}
+