Warning, file /office/calligra/libs/widgets/KoResourceServerProvider.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*  This file is part of the KDE project
0002 
0003     Copyright (c) 1999 Matthias Elter <elter@kde.org>
0004     Copyright (c) 2003 Patrick Julien <freak@codepimps.org>
0005     Copyright (c) 2005 Sven Langkamp <sven.langkamp@gmail.com>
0006     Copyright (C) 2011 Srikanth Tiyyagura <srikanth.tulasiram@gmail.com>
0007 
0008     This library is free software; you can redistribute it and/or
0009     modify it under the terms of the GNU Lesser General Public
0010     License as published by the Free Software Foundation; either
0011     version 2.1 of the License, or (at your option) any later version.
0012 
0013     This library is distributed in the hope that it will be useful,
0014     but WITHOUT ANY WARRANTY; without even the implied warranty of
0015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0016     Lesser General Public License for more details.
0017 
0018     You should have received a copy of the GNU Lesser General Public
0019     License along with this library; if not, write to the Free Software
0020     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
0021  */
0022 
0023 #include "KoResourceServerProvider.h"
0024 
0025 #include <QApplication>
0026 #include <QFileInfo>
0027 #include <QStringList>
0028 #include <QDir>
0029 #include <QStandardPaths>
0030 #include <QGlobalStatic>
0031 
0032 #include "KoSegmentGradient.h"
0033 #include "KoStopGradient.h"
0034 #include "KoColorSpaceRegistry.h"
0035 #include "KoResourcePaths.h"
0036 #include <iostream>
0037 using namespace std;
0038 
0039 class GradientResourceServer : public KoResourceServer<KoAbstractGradient> {
0040 
0041 public:
0042 
0043     GradientResourceServer(const QString& type, const QString& extensions) :
0044             KoResourceServer<KoAbstractGradient>(type, extensions) , m_foregroundToTransparent(0) , m_foregroundToBackground(0)
0045     {
0046         insertSpecialGradients();
0047     }
0048 
0049     void insertSpecialGradients()
0050     {
0051         const KoColorSpace* cs = KoColorSpaceRegistry::instance()->rgb8();
0052         QList<KoGradientStop> stops;
0053 
0054         KoStopGradient* gradient = new KoStopGradient("");
0055         gradient->setType(QGradient::LinearGradient);
0056         gradient->setName("Foreground to Transparent");
0057         stops << KoGradientStop(0.0, KoColor(Qt::black, cs)) << KoGradientStop(1.0, KoColor(QColor(0, 0, 0, 0), cs));
0058 
0059         gradient->setStops(stops);
0060         gradient->setValid(true);
0061         addResource(gradient, false, true);
0062         m_foregroundToTransparent = gradient;
0063 
0064         gradient = new KoStopGradient("");
0065         gradient->setType(QGradient::LinearGradient);
0066         gradient->setName("Foreground to Background");
0067 
0068         stops.clear();
0069         stops << KoGradientStop(0.0, KoColor(Qt::black, cs)) << KoGradientStop(1.0, KoColor(Qt::white, cs));
0070 
0071         gradient->setStops(stops);
0072         gradient->setValid(true);
0073         addResource(gradient, false, true);
0074         m_foregroundToBackground = gradient;
0075     }
0076 
0077 private:
0078 
0079     friend class KoResourceBundle;
0080 
0081     KoAbstractGradient* createResource( const QString & filename ) override {
0082 
0083         QString fileExtension;
0084         int index = filename.lastIndexOf('.');
0085 
0086         if (index != -1)
0087             fileExtension = filename.mid(index).toLower();
0088 
0089         KoAbstractGradient* grad = 0;
0090 
0091         if(fileExtension == ".svg" || fileExtension == ".kgr")
0092             grad = new KoStopGradient(filename);
0093         else if(fileExtension == ".ggr" )
0094             grad = new KoSegmentGradient(filename);
0095 
0096         return grad;
0097     }
0098 
0099     QList< KoAbstractGradient* > sortedResources() override {
0100         QList< KoAbstractGradient* > resources = KoResourceServer<KoAbstractGradient>::sortedResources();
0101         QList< KoAbstractGradient* > sorted;
0102         if (m_foregroundToTransparent && resources.contains(m_foregroundToTransparent)) {
0103             sorted.append(resources.takeAt(resources.indexOf(m_foregroundToTransparent)));
0104         }
0105         if (m_foregroundToBackground && resources.contains(m_foregroundToBackground)) {
0106             sorted.append(resources.takeAt(resources.indexOf(m_foregroundToBackground)));
0107         }
0108         return sorted + resources;
0109     }
0110 
0111     KoAbstractGradient* m_foregroundToTransparent;
0112     KoAbstractGradient* m_foregroundToBackground;
0113 };
0114 
0115 KoResourceLoaderThread::KoResourceLoaderThread(KoResourceServerBase * server)
0116     : QThread()
0117     , m_server(server)
0118 {
0119     m_fileNames = m_server->fileNames();
0120     QStringList fileNames = m_server->blackListedFiles();
0121 
0122     if (!fileNames.isEmpty()) {
0123         foreach (const QString &s, fileNames) {
0124             if (m_fileNames.contains(s)) {
0125                m_fileNames.removeAll(s);
0126             }
0127         }
0128     }
0129     connect(qApp, SIGNAL(aboutToQuit()), SLOT(barrier()));
0130 }
0131 
0132 void KoResourceLoaderThread::run()
0133 {
0134     m_server->loadResources(m_fileNames);
0135 }
0136 
0137 void KoResourceLoaderThread::barrier()
0138 {
0139     if(isRunning()) {
0140         wait();
0141     }
0142 }
0143 
0144 
0145 struct Q_DECL_HIDDEN KoResourceServerProvider::Private
0146 {
0147     KoResourceServer<KoPattern>* patternServer;
0148     KoResourceServer<KoAbstractGradient>* gradientServer;
0149     KoResourceServer<KoColorSet>* paletteServer;
0150 
0151     KoResourceLoaderThread *paletteThread;
0152     KoResourceLoaderThread *gradientThread;
0153     KoResourceLoaderThread *patternThread;
0154 };
0155 
0156 KoResourceServerProvider::KoResourceServerProvider() : d(new Private)
0157 {
0158     KoResourcePaths::addResourceDir("ko_patterns", "/usr/share/create/patterns/gimp");
0159     KoResourcePaths::addResourceDir("ko_patterns", QDir::homePath() + QString("/.create/patterns/gimp"));
0160 
0161     KoResourcePaths::addResourceType("ko_gradients", "data", "karbon/gradients/");
0162     KoResourcePaths::addResourceDir("ko_gradients", "/usr/share/create/gradients/gimp");
0163     KoResourcePaths::addResourceDir("ko_gradients", QDir::homePath() + QString("/.create/gradients/gimp"));
0164 
0165     KoResourcePaths::addResourceType("ko_palettes", "data", "calligra/palettes/");
0166     KoResourcePaths::addResourceType("ko_palettes", "data", "karbon/palettes/");
0167 
0168     KoResourcePaths::addResourceDir("ko_palettes", "/usr/share/create/swatches");
0169     KoResourcePaths::addResourceDir("ko_palettes", QDir::homePath() + QString("/.create/swatches"));
0170 
0171     d->patternServer = new KoResourceServerSimpleConstruction<KoPattern>("ko_patterns", "*.pat:*.jpg:*.gif:*.png:*.tif:*.xpm:*.bmp" );
0172     if (!QFileInfo::exists(d->patternServer->saveLocation())) {
0173         QDir().mkpath(d->patternServer->saveLocation());
0174     }
0175 
0176     d->patternThread = new KoResourceLoaderThread(d->patternServer);
0177     d->patternThread->start();
0178     if (qApp->applicationName().contains(QLatin1String("test"), Qt::CaseInsensitive)) {
0179         d->patternThread->wait();
0180     }
0181 
0182     d->gradientServer = new GradientResourceServer("ko_gradients", "*.kgr:*.svg:*.ggr");
0183     if (!QFileInfo::exists(d->gradientServer->saveLocation())) {
0184         QDir().mkpath(d->gradientServer->saveLocation());
0185     }
0186 
0187     d->gradientThread = new KoResourceLoaderThread(d->gradientServer);
0188     d->gradientThread->start();
0189     if (qApp->applicationName().contains(QLatin1String("test"), Qt::CaseInsensitive)) {
0190         d->gradientThread->wait();
0191     }
0192 
0193     d->paletteServer = new KoResourceServerSimpleConstruction<KoColorSet>("ko_palettes", "*.gpl:*.pal:*.act:*.aco:*.css:*.colors");
0194     if (!QFileInfo::exists(d->paletteServer->saveLocation())) {
0195         QDir().mkpath(d->paletteServer->saveLocation());
0196     }
0197 
0198     d->paletteThread = new KoResourceLoaderThread(d->paletteServer);
0199     d->paletteThread->start();
0200     if (qApp->applicationName().contains(QLatin1String("test"), Qt::CaseInsensitive)) {
0201         d->paletteThread->wait();
0202     }
0203 }
0204 
0205 KoResourceServerProvider::~KoResourceServerProvider()
0206 {
0207     delete d->patternThread;
0208     delete d->gradientThread;
0209     delete d->paletteThread;
0210 
0211     delete d->patternServer;
0212     delete d->gradientServer;
0213     delete d->paletteServer;
0214 
0215     delete d;
0216 }
0217 
0218 Q_GLOBAL_STATIC(KoResourceServerProvider, s_instance);
0219 
0220 KoResourceServerProvider* KoResourceServerProvider::instance()
0221 {
0222     return s_instance;
0223 }
0224 
0225 KoResourceServer<KoPattern>* KoResourceServerProvider::patternServer(bool block)
0226 {
0227     if (block) d->patternThread->barrier();
0228     return d->patternServer;
0229 }
0230 
0231 KoResourceServer<KoAbstractGradient>* KoResourceServerProvider::gradientServer(bool block)
0232 {
0233     if (block) d->gradientThread->barrier();
0234     return d->gradientServer;
0235 }
0236 
0237 KoResourceServer<KoColorSet>* KoResourceServerProvider::paletteServer(bool block)
0238 {
0239     if (block) d->paletteThread->barrier();
0240     return d->paletteServer;
0241 }
0242