summaryrefslogtreecommitdiffstats
path: root/amor/amoranim.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'amor/amoranim.cpp')
-rw-r--r--amor/amoranim.cpp254
1 files changed, 254 insertions, 0 deletions
diff --git a/amor/amoranim.cpp b/amor/amoranim.cpp
new file mode 100644
index 0000000..61447f1
--- /dev/null
+++ b/amor/amoranim.cpp
@@ -0,0 +1,254 @@
+/* amoranim.cpp
+**
+** Copyright (c) 1999 Martin R. Jones <[email protected]>
+**
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+/*
+** Bug reports and questions can be sent to [email protected]
+*/
+#include <stdlib.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include "amoranim.h"
+#include "amorpm.h"
+
+//---------------------------------------------------------------------------
+//
+// Constructor
+//
+AmorAnim::AmorAnim(KConfigBase &config)
+ : mMaximumSize(0, 0)
+{
+ mCurrent = 0;
+ mTotalMovement = 0;
+ readConfig(config);
+}
+
+//---------------------------------------------------------------------------
+//
+// Destructor
+//
+AmorAnim::~AmorAnim()
+{
+}
+
+//---------------------------------------------------------------------------
+//
+// Get the Pixmap for the current frame.
+//
+const QPixmap *AmorAnim::frame()
+{
+ const QPixmap *pixmap = 0;
+
+ if (validFrame())
+ pixmap = AmorPixmapManager::manager()->pixmap(*mSequence.at(mCurrent));
+
+ return pixmap;
+}
+
+//---------------------------------------------------------------------------
+//
+// Read a single animation's parameters. The config class should already
+// have its group set to the animation that is to be read.
+//
+void AmorAnim::readConfig(KConfigBase &config)
+{
+ // Read the list of frames to display and load them into the pixmap
+ // manager.
+ mSequence = config.readListEntry("Sequence");
+ int frames = mSequence.count();
+ for ( QStringList::Iterator it = mSequence.begin();
+ it != mSequence.end();
+ ++it )
+ {
+ const QPixmap *pixmap =
+ AmorPixmapManager::manager()->load(*it);
+ if (pixmap)
+ mMaximumSize = mMaximumSize.expandedTo(pixmap->size());
+ }
+
+ // Read the delays between frames.
+ QStrList list;
+ int entries = config.readListEntry("Delay",list);
+ mDelay.resize(frames);
+ for (int i = 0; i < entries && i < frames; i++)
+ mDelay[i] = atoi(list.at(i));
+
+ // Read the distance to move between frames and calculate the total
+ // distance that this aniamtion moves from its starting position.
+ entries = config.readListEntry("Movement",list);
+ mMovement.resize(frames);
+ for (int i = 0; i < entries && i < frames; i++)
+ {
+ mMovement[i] = atoi(list.at(i));
+ mTotalMovement += mMovement[i];
+ }
+
+ // Read the hotspot for each frame.
+ entries = config.readListEntry("HotspotX",list);
+ mHotspot.resize(frames);
+ for (int i = 0; i < entries && i < frames; i++)
+ mHotspot[i].setX(atoi(list.at(i)));
+
+ entries = config.readListEntry("HotspotY",list);
+ for (int i = 0; i < entries && i < frames; i++)
+ mHotspot[i].setY(atoi(list.at(i)));
+
+ // Add the overlap of the last frame to the total movement.
+ const QPoint &lastHotspot = mHotspot[mHotspot.size()-1];
+ if (mTotalMovement > 0)
+ {
+ const QPixmap *lastFrame =
+ AmorPixmapManager::manager()->pixmap(mSequence.last());
+ if (lastFrame)
+ {
+ mTotalMovement += (lastFrame->width() - lastHotspot.x());
+ }
+ }
+ else if (mTotalMovement < 0)
+ {
+ mTotalMovement -= lastHotspot.x();
+ }
+}
+
+//===========================================================================
+
+AmorThemeManager::AmorThemeManager()
+ : mMaximumSize(0, 0)
+{
+ mConfig = 0;
+ mAnimations.setAutoDelete(true);
+}
+
+//---------------------------------------------------------------------------
+//
+AmorThemeManager::~AmorThemeManager()
+{
+ delete mConfig;
+}
+
+//---------------------------------------------------------------------------
+//
+bool AmorThemeManager::setTheme(const QString & file)
+{
+ mPath = locate("appdata", file);
+
+ delete mConfig;
+
+ mConfig = new KSimpleConfig(mPath, true);
+ mConfig->setGroup("Config");
+
+ // Get the directory where the pixmaps are stored and tell the
+ // pixmap manager.
+ QString pixmapPath = mConfig->readPathEntry("PixmapPath");
+ if (pixmapPath.isEmpty())
+ return false;
+
+ if (pixmapPath[0] == '/')
+ {
+ // absolute path to pixmaps
+ mPath = pixmapPath;
+ }
+ else
+ {
+ // relative to config file.
+ mPath.truncate(mPath.findRev('/')+1);
+ mPath += pixmapPath;
+ }
+
+ mStatic = mConfig->readBoolEntry("Static", false);
+
+ mMaximumSize.setWidth(0);
+ mMaximumSize.setHeight(0);
+
+ mAnimations.clear();
+
+ return true;
+}
+
+//---------------------------------------------------------------------------
+//
+// Select an animimation randomly from a group
+//
+AmorAnim *AmorThemeManager::random(const QString & group)
+{
+ QString grp( group );
+
+ if (mStatic)
+ grp = "Base";
+
+ AmorAnimationGroup *animGroup = mAnimations.find(grp);
+
+ if (animGroup) {
+ int idx = kapp->random()%animGroup->count();
+ return animGroup->at( idx );
+ }
+
+ return 0;
+}
+
+//---------------------------------------------------------------------------
+//
+// Read an animation group.
+//
+bool AmorThemeManager::readGroup(const QString & seq)
+{
+ AmorPixmapManager::manager()->setPixmapDir(mPath);
+
+ AmorAnimationGroup *animList = new AmorAnimationGroup;
+ animList->setAutoDelete(true);
+
+ // Read the list of available animations.
+ mConfig->setGroup("Config");
+ QStrList list;
+ int entries = mConfig->readListEntry(seq, list);
+
+ // Read each individual animation
+ for (int i = 0; i < entries; i++)
+ {
+ mConfig->setGroup(list.at(i));
+ AmorAnim *anim = new AmorAnim(*mConfig);
+ animList->append(anim);
+ mMaximumSize = mMaximumSize.expandedTo(anim->maximumSize());
+ }
+
+ // If no animations were available for this group, just add the base anim
+ if (entries == 0)
+ {
+ mConfig->setGroup("Base");
+ AmorAnim *anim = new AmorAnim(*mConfig);
+ if (anim)
+ {
+ animList->append(anim);
+ mMaximumSize = mMaximumSize.expandedTo(anim->maximumSize());
+ entries++;
+ }
+ }
+
+ // Couldn't read any entries at all
+ if (entries == 0)
+ return false;
+
+ mAnimations.insert(seq, animList);
+
+ return true;
+}
+