krita

kis_resourceserver.cc

00001 /*
00002  *  kis_resourceserver.cc - part of KImageShop
00003  *
00004  *  Copyright (c) 1999 Matthias Elter <elter@kde.org>
00005  *  Copyright (c) 2003 Patrick Julien <freak@codepimps.org>
00006  *  Copyright (c) 2005 Sven Langkamp <longamp@reallygood.de>
00007  *
00008  *  This program is free software; you can redistribute it and/or modify
00009  *  it under the terms of the GNU General Public License as published by
00010  *  the Free Software Foundation; either version 2 of the License, or
00011  *  (at your option) any later version.
00012  *
00013  *  This program is distributed in the hope that it will be useful,
00014  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  *  GNU General Public License for more details.
00017  *
00018  *  You should have received a copy of the GNU General Public License
00019  *  along with this program; if not, write to the Free Software
00020  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00021  */
00022 #include <qfileinfo.h>
00023 #include <qstringlist.h>
00024 #include <qthread.h>
00025 #include <qdir.h>
00026 
00027 #include <kdebug.h>
00028 #include <kglobal.h>
00029 #include <kstandarddirs.h>
00030 #include <kinstance.h>
00031 
00032 #include "kis_resource.h"
00033 #include "kis_factory.h"
00034 #include "kis_generic_registry.h"
00035 #include "kis_resourceserver.h"
00036 #include "kis_brush.h"
00037 #include "kis_imagepipe_brush.h"
00038 #include "kis_gradient.h"
00039 #include "kis_pattern.h"
00040 #include "kis_palette.h"
00041 #include <kogradientmanager.h>
00042 
00043 KisResourceServerBase::KisResourceServerBase(QString type)
00044     : m_type(type), m_loaded(false)
00045 {
00046 }
00047 
00048 KisResourceServerBase::~KisResourceServerBase()
00049 {
00050 }
00051 
00052 void KisResourceServerBase::loadResources(QStringList filenames)
00053 {
00054     QStringList uniqueFiles;
00055 
00056     while( !filenames.empty() )
00057     {
00058 
00059         QString front = *filenames.begin();
00060         filenames.pop_front();
00061 
00062         QString fname = QFileInfo(front).fileName();
00063         //ebug() << "Loading " << fname << "\n";
00064         // XXX: Don't load resources with the same filename. Actually, we should look inside
00065         //      the resource to find out whether they are really the same, but for now this
00066         //      will prevent the same brush etc. showing up twice.
00067         if (uniqueFiles.empty() || uniqueFiles.find(fname) == uniqueFiles.end()) {
00068             uniqueFiles.append(fname);
00069             KisResource *resource;
00070             resource = createResource(front);
00071             if(resource->load() && resource->valid())
00072             {
00073                 m_resources.append(resource);
00074                 Q_CHECK_PTR(resource);
00075                 emit resourceAdded(resource);
00076             }
00077             else {
00078                 delete resource;
00079             }
00080         }
00081     }
00082     m_loaded = true;
00083 }
00084 
00085 QValueList<KisResource*> KisResourceServerBase::resources()
00086 {
00087     if(!m_loaded) {
00088         return QValueList<KisResource*>();
00089     }
00090 
00091     return m_resources;
00092 }
00093 
00094 void KisResourceServerBase::addResource(KisResource* resource)
00095 {
00096     if (!resource->valid()) {
00097         kdWarning(41001) << "Tried to add an invalid resource!" << endl;
00098         return;
00099     }
00100 
00101     m_resources.append(resource);
00102     emit resourceAdded(resource);
00103 }
00104 
00105 
00106 class ResourceLoaderThread : public QThread {
00107 
00108 public:
00109 
00110     ResourceLoaderThread(KisResourceServerBase * server, QStringList files)
00111         : QThread()
00112         , m_server(server)
00113         , m_fileNames( files )
00114     {
00115     }
00116 
00117 
00118     void run()
00119     {
00120         m_server->loadResources(m_fileNames);
00121     }
00122 
00123 private:
00124 
00125     KisResourceServerBase * m_server;
00126     QStringList m_fileNames;
00127 
00128 };
00129 
00130 QStringList getFileNames( QString extensions, QString type )
00131 {
00132     QStringList extensionList = QStringList::split(":", extensions);
00133     QStringList fileNames;
00134 
00135     QStringList::Iterator it;
00136     for ( it = extensionList.begin(); it != extensionList.end(); ++it ) {
00137         QString s = (*it);
00138         fileNames += KisFactory::instance()->dirs()->findAllResources(type.ascii(), (*it));
00139     }
00140     return fileNames;
00141 }
00142 
00143 
00144 KisResourceServerRegistry *KisResourceServerRegistry::m_singleton = 0;
00145 
00146 KisResourceServerRegistry::KisResourceServerRegistry()
00147 {
00148 
00149     KisResourceServer<KisBrush>* brushServer = new KisResourceServer<KisBrush>("kis_brushes");
00150     ResourceLoaderThread t1 (brushServer, getFileNames( "*.gbr","kis_brushes" ));
00151     t1.start();
00152 
00153     KisResourceServer<KisImagePipeBrush>* imagePipeBrushServer = new KisResourceServer<KisImagePipeBrush>("kis_brushes");
00154     ResourceLoaderThread t2 (imagePipeBrushServer, getFileNames( "*.gih", "kis_brushes"));
00155     t2.start();
00156 
00157     KisResourceServer<KisPattern>* patternServer = new KisResourceServer<KisPattern>("kis_patterns");
00158     ResourceLoaderThread t3 (patternServer, getFileNames("*.pat", "kis_patterns"));
00159     t3.start();
00160 
00161     KisResourceServer<KisGradient>* gradientServer = new KisResourceServer<KisGradient>("kis_gradients");
00162     ResourceLoaderThread t4 (gradientServer, getFileNames(KoGradientManager::filters().join( ":" ), "kis_gradients"));
00163     t4.start();
00164 
00165 
00166     KisResourceServer<KisPalette>* paletteServer = new KisResourceServer<KisPalette>("kis_palettes");
00167     ResourceLoaderThread t5 (paletteServer, getFileNames("*.gpl:*.pal:*.act", "kis_palettes") );
00168     t5.start();
00169 
00170     t1.wait();
00171     t2.wait();
00172     t3.wait();
00173     t4.wait();
00174     t5.wait();
00175 
00176     add( KisID( "BrushServer", ""), brushServer );
00177     add( KisID( "ImagePipeBrushServer", ""), imagePipeBrushServer );
00178     add( KisID( "PatternServer", ""), patternServer );
00179     add( KisID( "GradientServer", ""), gradientServer );
00180     add( KisID( "PaletteServer", ""), paletteServer );
00181 
00182 }
00183 
00184 KisResourceServerRegistry::~KisResourceServerRegistry()
00185 {
00186 }
00187 
00188 KisResourceServerRegistry* KisResourceServerRegistry::instance()
00189 {
00190      if(KisResourceServerRegistry::m_singleton == 0)
00191      {
00192          KisResourceServerRegistry::m_singleton = new KisResourceServerRegistry();
00193      }
00194     return KisResourceServerRegistry::m_singleton;
00195 }
00196 
00197 
00198 #include "kis_resourceserver.moc"
00199 
KDE Home | KDE Accessibility Home | Description of Access Keys