krita
kis_resourceserver.cc00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
00064
00065
00066
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
|