chalk

kis_resourceserver.cpp
1/*
2 * kis_resourceserver.cpp - part of KImageShop
3 *
4 * Copyright (c) 1999 Matthias Elter <elter@kde.org>
5 * Copyright (c) 2003 Patrick Julien <freak@codepimps.org>
6 * Copyright (c) 2005 Sven Langkamp <longamp@reallygood.de>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 */
22#include <tqfileinfo.h>
23#include <tqstringlist.h>
24#include <tqthread.h>
25#include <tqdir.h>
26
27#include <kdebug.h>
28#include <tdeglobal.h>
29#include <kstandarddirs.h>
30#include <tdeinstance.h>
31
32#include "kis_resource.h"
33#include "kis_factory.h"
34#include "kis_generic_registry.h"
35#include "kis_resourceserver.h"
36#include "kis_brush.h"
37#include "kis_imagepipe_brush.h"
38#include "kis_gradient.h"
39#include "kis_pattern.h"
40#include "kis_palette.h"
41#include <kogradientmanager.h>
42
43KisResourceServerBase::KisResourceServerBase(TQString type)
44 : m_type(type), m_loaded(false)
45{
46}
47
48KisResourceServerBase::~KisResourceServerBase()
49{
50}
51
52void KisResourceServerBase::loadResources(TQStringList filenames)
53{
54 TQStringList uniqueFiles;
55
56 while( !filenames.empty() )
57 {
58
59 TQString front = *filenames.begin();
60 filenames.pop_front();
61
62 TQString fname = TQFileInfo(front).fileName();
63 //ebug() << "Loading " << fname << "\n";
64 // XXX: Don't load resources with the same filename. Actually, we should look inside
65 // the resource to find out whether they are really the same, but for now this
66 // will prevent the same brush etc. showing up twice.
67 if (uniqueFiles.empty() || uniqueFiles.find(fname) == uniqueFiles.end()) {
68 uniqueFiles.append(fname);
69 KisResource *resource;
70 resource = createResource(front);
71 if(resource->load() && resource->valid())
72 {
73 m_resources.append(resource);
74 TQ_CHECK_PTR(resource);
75 emit resourceAdded(resource);
76 }
77 else {
78 delete resource;
79 }
80 }
81 }
82 m_loaded = true;
83}
84
85TQValueList<KisResource*> KisResourceServerBase::resources()
86{
87 if(!m_loaded) {
88 return TQValueList<KisResource*>();
89 }
90
91 return m_resources;
92}
93
94void KisResourceServerBase::addResource(KisResource* resource)
95{
96 if (!resource->valid()) {
97 kdWarning(41001) << "Tried to add an invalid resource!" << endl;
98 return;
99 }
100
101 m_resources.append(resource);
102 emit resourceAdded(resource);
103}
104
105
106class ResourceLoaderThread : public TQThread {
107
108public:
109
110 ResourceLoaderThread(KisResourceServerBase * server, TQStringList files)
111 : TQThread()
112 , m_server(server)
113 , m_fileNames( files )
114 {
115 }
116
117
118 void run()
119 {
120 m_server->loadResources(m_fileNames);
121 }
122
123private:
124
125 KisResourceServerBase * m_server;
126 TQStringList m_fileNames;
127
128};
129
130TQStringList getFileNames( TQString extensions, TQString type )
131{
132 TQStringList extensionList = TQStringList::split(":", extensions);
133 TQStringList fileNames;
134
135 TQStringList::Iterator it;
136 for ( it = extensionList.begin(); it != extensionList.end(); ++it ) {
137 TQString s = (*it);
138 fileNames += KisFactory::instance()->dirs()->findAllResources(type.ascii(), (*it));
139 }
140 return fileNames;
141}
142
143
144KisResourceServerRegistry *KisResourceServerRegistry::m_singleton = 0;
145
146KisResourceServerRegistry::KisResourceServerRegistry()
147{
148
149 KisResourceServer<KisBrush>* brushServer = new KisResourceServer<KisBrush>("kis_brushes");
150 ResourceLoaderThread t1 (brushServer, getFileNames( "*.gbr","kis_brushes" ));
151 t1.start();
152
153 KisResourceServer<KisImagePipeBrush>* imagePipeBrushServer = new KisResourceServer<KisImagePipeBrush>("kis_brushes");
154 ResourceLoaderThread t2 (imagePipeBrushServer, getFileNames( "*.gih", "kis_brushes"));
155 t2.start();
156
157 KisResourceServer<KisPattern>* patternServer = new KisResourceServer<KisPattern>("kis_patterns");
158 ResourceLoaderThread t3 (patternServer, getFileNames("*.pat", "kis_patterns"));
159 t3.start();
160
161 KisResourceServer<KisGradient>* gradientServer = new KisResourceServer<KisGradient>("kis_gradients");
162 ResourceLoaderThread t4 (gradientServer, getFileNames(KoGradientManager::filters().join( ":" ), "kis_gradients"));
163 t4.start();
164
165
166 KisResourceServer<KisPalette>* paletteServer = new KisResourceServer<KisPalette>("kis_palettes");
167 ResourceLoaderThread t5 (paletteServer, getFileNames("*.gpl:*.pal:*.act", "kis_palettes") );
168 t5.start();
169
170 t1.wait();
171 t2.wait();
172 t3.wait();
173 t4.wait();
174 t5.wait();
175
176 add( KisID( "BrushServer", ""), brushServer );
177 add( KisID( "ImagePipeBrushServer", ""), imagePipeBrushServer );
178 add( KisID( "PatternServer", ""), patternServer );
179 add( KisID( "GradientServer", ""), gradientServer );
180 add( KisID( "PaletteServer", ""), paletteServer );
181
182}
183
184KisResourceServerRegistry::~KisResourceServerRegistry()
185{
186}
187
188KisResourceServerRegistry* KisResourceServerRegistry::instance()
189{
190 if(KisResourceServerRegistry::m_singleton == 0)
191 {
192 KisResourceServerRegistry::m_singleton = new KisResourceServerRegistry();
193 }
194 return KisResourceServerRegistry::m_singleton;
195}
196
197
198#include "kis_resourceserver.moc"
199
The KisResource class provides a representation of Chalk image resources.
virtual bool load()=0
Load this resource.