diff options
Diffstat (limited to 'src/backgroundmanager.h')
-rw-r--r-- | src/backgroundmanager.h | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/src/backgroundmanager.h b/src/backgroundmanager.h new file mode 100644 index 0000000..0db7898 --- /dev/null +++ b/src/backgroundmanager.h @@ -0,0 +1,132 @@ +/*************************************************************************** + * Copyright (C) 2003 by S�astien Laot * + * slaout@linux62.org * + * * + * 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; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef BACKGROUNDMANAGER_H +#define BACKGROUNDMANAGER_H + +#include <qobject.h> +#include <qvaluelist.h> +#include <qstring.h> +#include <qpixmap.h> +#include <qcolor.h> +#include <qtimer.h> + +/** A node in the list of background images of BackgroundManager. + * It can only be used by BackgroundManager because it is an internal structure of this manager. + * @author S�astien Laot + */ +class BackgroundEntry +{ + friend class BackgroundManager; + + protected: + BackgroundEntry(const QString &location); + ~BackgroundEntry(); + + QString name; + QString location; + bool tiled; /// << Only valid after some object subscribed to this image! Because it's only read at this time. + QPixmap *pixmap; /// << Only valid (non-null) after some object subscribed to this image! Because it's only read at this time. + QPixmap *preview; /// << Only valid (non-null) after some object requested the preview. + int customersCount; +}; + +/** A node in the list of opaque background images (with a background color applyed to an image) of BackgroundManager. + * It can only be used by BackgroundManager because it is an internal structure of this manager. + * @author S�astien Laot + */ +class OpaqueBackgroundEntry +{ + friend class BackgroundManager; + + protected: + OpaqueBackgroundEntry(const QString &name, const QColor &color); + ~OpaqueBackgroundEntry(); + + QString name; + QColor color; + QPixmap *pixmap; + int customersCount; +}; + +/** Manage the list of background images. + * BASIC FUNCTIONNING OF A BACKGROUND CHOOSER: + * It get all image names with imageNames() to put them in eg. a QComboBox and then, + * when it's time to get the preview of an image it call preview() with the image name to get it. + * Preview are only computed on demand and then cached to fast the next demands (only the pointer will have to be returned). + * Previews are scalled to fit in a rectangle of 100 by 75 pixels, and with a white background color. + * They are also saved to files, so that the scalling/opaquification has not to be done later (they will be directly loaded from file). + * Previews are saved in Global::backgroundsFolder()+"previews/", so that emptying the folder is sufficient to remove them. + * BASIC FUNCTIONNING OF AN IMAGE REQUESTER: + * When eg. a basket is assigned an image name, it register it with subscribe(). + * The full pixmap is then loaded from file and cached (if it was not already loaded) and the "tiled" property is read from the image configuration file. + * If this object want to have the pixmap applyed on a background color (for no transparency => really faster drawing), + * it should register for the couple (imageName,color) with suscribe(): the pixmap will be created in the cache. + * Then, the object can get the subscribed images with pixmap() or opaquePixmap() and know if it's tiled with tiled(). + * When the user removed the object background image (or when the object/basket/... is removed), the object should call unsubscribe() for + * EVERY subscribed image and image couples. Usage count is decreased for those images and a garbage collector will remove the cached images + * if nothing is subscribed to them (to free memory). + * @author S�astien Laot + */ +class BackgroundManager : private QObject +{ + Q_OBJECT + private: + /// LIST OF IMAGES: + typedef QValueList<BackgroundEntry*> BackgroundsList; + typedef QValueList<OpaqueBackgroundEntry*> OpaqueBackgroundsList; + + public: + /// CONTRUCTOR AND DESTRUCTOR: + BackgroundManager(); + ~BackgroundManager(); + /// SUBSCRIPTION TO IMAGES: + bool subscribe(const QString &image); /// << @Return true if the loading is a success. In the counter-case, calling methods below is unsafe with this @p image name. + bool subscribe(const QString &image, const QColor &color); /// << Idem. + void unsubscribe(const QString &image); + void unsubscribe(const QString &image, const QColor &color); + /// GETTING THE IMAGES AND PROPERTIES: + QPixmap* pixmap(const QString &image); + QPixmap* opaquePixmap(const QString &image, const QColor &color); + bool tiled(const QString &image); + /// LIST OF IMAGES AND PREVIEWS: + bool exists(const QString &image); + QStringList imageNames(); + QPixmap* preview(const QString &image); + /// USED FOR EXPORTATION: + QString pathForImageName(const QString &image); /// << It is STRONGLY advised to not use those two methods unless it's to copy (export) the images or something like that... + QString previewPathForImageName(const QString &image); + /// USED FOR IMPORTATION: + void addImage(const QString &fullPath); + + private: + BackgroundEntry* backgroundEntryFor(const QString &image); + OpaqueBackgroundEntry* opaqueBackgroundEntryFor(const QString &image, const QColor &color); + + private: + BackgroundsList m_backgroundsList; + OpaqueBackgroundsList m_opaqueBackgroundsList; + QTimer m_garbageTimer; + private slots: + void requestDelayedGarbage(); + void doGarbage(); +}; + +#endif // BACKGROUNDMANAGER_H |