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