Subversion Repositories Scribus

Rev

Rev 8409 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6368 fschmid 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
/***************************************************************************
8
*   Copyright (C) 2006 by Franz Schmid                                   *
9
*   franz.schmid@altmuehlnet.de                                                   *
10
*                                                                         *
11
*   This program is free software; you can redistribute it and/or modify  *
12
*   it under the terms of the GNU General Public License as published by  *
13
*   the Free Software Foundation; either version 2 of the License, or     *
14
*   (at your option) any later version.                                   *
15
*                                                                         *
16
*   This program is distributed in the hope that it will be useful,       *
17
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
19
*   GNU General Public License for more details.                          *
20
*                                                                         *
21
*   You should have received a copy of the GNU General Public License     *
22
*   along with this program; if not, write to the                         *
23
*   Free Software Foundation, Inc.,                                       *
24
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
25
***************************************************************************/
26
 
27
#include "patterndialog.h"
28
#include "patterndialog.moc"
29
#include "customfdialog.h"
30
#include "prefsmanager.h"
31
#include "prefsfile.h"
32
#include "util.h"
6372 fschmid 33
#include "stencilreader.h"
34
#include "scconfig.h"
6368 fschmid 35
#include <qpixmap.h>
36
#include <qimage.h>
6422 fschmid 37
#include <qdir.h>
38
#include <qfiledialog.h>
6430 fschmid 39
#include <qapplication.h>
40
#include <qeventloop.h>
41
#include <qcursor.h>
6368 fschmid 42
 
6372 fschmid 43
PatternDialog::PatternDialog(QWidget* parent, QMap<QString, ScPattern> *docPatterns, ScribusDoc *doc, ScribusMainWindow *scMW) : patternDialogBase(parent)
6368 fschmid 44
{
6369 fschmid 45
        m_doc = doc;
6372 fschmid 46
        mainWin = scMW;
6368 fschmid 47
        patternView->clear();
7625 fschmid 48
        patternView->setMinimumWidth(175);
6368 fschmid 49
        for (QMap<QString, ScPattern>::Iterator it = docPatterns->begin(); it != docPatterns->end(); ++it)
50
        {
51
                dialogPatterns.insert(it.key(), it.data());
52
        }
6407 fschmid 53
        origPatterns = docPatterns->keys();
6368 fschmid 54
        updatePatternList();
55
        buttonRemove->setEnabled(false);
56
        connect(buttonOK, SIGNAL(clicked()), this, SLOT(accept()));
57
        connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
58
        connect(buttonLoad, SIGNAL(clicked()), this, SLOT(loadPattern()));
6422 fschmid 59
        connect(buttonLoadDir, SIGNAL(clicked()), this, SLOT(loadPatternDir()));
6368 fschmid 60
        connect(buttonRemove, SIGNAL(clicked()), this, SLOT(removePattern()));
7178 fschmid 61
        connect(buttonRemoveAll, SIGNAL(clicked()), this, SLOT(removeAllPatterns()));
6368 fschmid 62
        connect(patternView, SIGNAL(clicked(QIconViewItem*)), this, SLOT(patternSelected(QIconViewItem*)));
63
}
64
 
65
void PatternDialog::updatePatternList()
66
{
67
        patternView->clear();
7625 fschmid 68
        patternView->setMaxItemWidth(48);
69
        patternView->setWordWrapIconText(true);
6368 fschmid 70
        for (QMap<QString, ScPattern>::Iterator it = dialogPatterns.begin(); it != dialogPatterns.end(); ++it)
71
        {
72
                QPixmap pm;
7625 fschmid 73
                if (it.data().getPattern()->width() >= it.data().getPattern()->height())
6368 fschmid 74
                        pm.convertFromImage(it.data().getPattern()->scaleWidth(48));
75
                else
76
                        pm.convertFromImage(it.data().getPattern()->scaleHeight(48));
8409 fschmid 77
                QIconViewItem *item = new QIconViewItem(patternView, it.key(), pm);
78
                item->setDragEnabled(false);
6368 fschmid 79
        }
80
}
81
 
6422 fschmid 82
void PatternDialog::loadPatternDir()
83
{
84
        PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
85
        QString wdir = dirs->get("patterns", ".");
86
        QString fileName = QFileDialog::getExistingDirectory(wdir, this, "d", tr("Choose a Directory"), true);
87
        if (!fileName.isEmpty())
88
        {
89
                QStringList formats;
90
                formats += "eps";
7420 fschmid 91
                formats += "epsi";
6422 fschmid 92
                formats += "pdf";
93
                QString form1 = "";
94
                for ( uint i = 0; i < QImageIO::inputFormats().count(); ++i )
95
                {
96
                        form1 = QString(QImageIO::inputFormats().at(i)).lower();
97
                        if (form1 == "jpeg")
98
                                form1 = "jpg";
99
                        if ((form1 == "png") || (form1 == "xpm") || (form1 == "gif"))
100
                        formats += form1;
101
                        else if (form1 == "jpg")
102
                        {
103
                                formats += "jpg";
104
                                formats += "jpeg";
105
                        }
106
                }
107
                formats += "tif";
108
                formats += "tiff";
109
                formats += "psd";
110
                formats += "pat";
111
                QDir d(fileName, "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
112
                if ((d.exists()) && (d.count() != 0))
113
                {
6430 fschmid 114
                        mainWin->setStatusBarInfoText( tr("Loading Patterns"));
115
                        mainWin->mainWindowProgressBar->reset();
8249 fschmid 116
                        mainWin->mainWindowProgressBar->setTotalSteps(d.count() * 2);
6430 fschmid 117
                        qApp->setOverrideCursor(QCursor(waitCursor), true);
118
                        qApp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
6422 fschmid 119
                        for (uint dc = 0; dc < d.count(); ++dc)
120
                        {
6430 fschmid 121
                                mainWin->mainWindowProgressBar->setProgress(dc);
122
                                qApp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
6422 fschmid 123
                                QFileInfo fi(QDir::cleanDirPath(QDir::convertSeparators(fileName + "/" + d[dc])));
124
                                QString ext = fi.extension(true).lower();
8249 fschmid 125
                                if ((ext == "sml") || (ext == "shape") || (ext == "sce"))
6422 fschmid 126
                                        loadVectors(QDir::cleanDirPath(QDir::convertSeparators(fileName + "/" + d[dc])));
8249 fschmid 127
                        }
128
                        for (uint dc = 0; dc < d.count(); ++dc)
129
                        {
130
                                mainWin->mainWindowProgressBar->setProgress(d.count() + dc);
131
                                qApp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
132
                                QFileInfo fi(QDir::cleanDirPath(QDir::convertSeparators(fileName + "/" + d[dc])));
133
                                QString ext = fi.extension(true).lower();
134
                                if ((ext == "sml") || (ext == "shape") || (ext == "sce"))
135
                                        continue;
6422 fschmid 136
                                else if (formats.contains(ext))
137
                                {
138
                                        QString patNam = fi.baseName().stripWhiteSpace().simplifyWhiteSpace().replace(" ", "_");
139
                                        if (!dialogPatterns.contains(patNam))
8249 fschmid 140
                                        {
141
                                                ScPattern pat = ScPattern();
142
                                                pat.setDoc(m_doc);
143
                                                pat.setPattern(QDir::cleanDirPath(QDir::convertSeparators(fileName + "/" + d[dc])));
6422 fschmid 144
                                                dialogPatterns.insert(patNam, pat);
8249 fschmid 145
                                        }
6422 fschmid 146
                                }
147
                                else
148
                                        continue;
149
                        }
6430 fschmid 150
                        d.cdUp();
151
                        dirs->set("patterns", d.absPath());
152
                        qApp->setOverrideCursor(QCursor(arrowCursor), true);
153
                        mainWin->setStatusBarInfoText("");
154
                        mainWin->mainWindowProgressBar->reset();
6422 fschmid 155
                }
156
                updatePatternList();
157
        }
158
}
159
 
6368 fschmid 160
void PatternDialog::loadPattern()
161
{
162
        QString fileName;
8249 fschmid 163
        QString formats = "Scribus Objects (*.sce *.SCE);;Dia Shapes (*.shape *.SHAPE);;Kivio Stencils (*.sml *.SML);;EPS (*.eps *.EPS);;EPSI (*.epsi *.EPSI);;PDF (*.pdf *.PDF);;";
6372 fschmid 164
        QString form1 = "";
165
        QString form2 = "";
166
        for ( uint i = 0; i < QImageIO::inputFormats().count(); ++i )
167
        {
168
                form1 = QString(QImageIO::inputFormats().at(i)).lower();
169
                form2 = QString(QImageIO::inputFormats().at(i)).upper();
170
                if (form1 == "jpeg")
171
                {
172
                        form1 = "jpg";
173
                        form2 = "JPG";
174
                }
175
                if ((form1 == "png") || (form1 == "xpm") || (form1 == "gif"))
176
                {
177
                        formats += form2 + " (*."+form1+" *."+form2+");;";
178
                }
179
                else if (form1 == "jpg")
180
                {
181
                        // JPEG is a special case because both .jpg and .jpeg
182
                        // are acceptable extensions.
183
                        formats += "JPEG (*.jpg *.jpeg *.JPG *.JPEG);;";
184
                }
185
        }
186
        formats += "TIFF (*.tif *.tiff *.TIF *.TIFF);;";
187
        formats += "PSD (*.psd *.PSD);;";
6412 fschmid 188
        formats += "Gimp Patterns (*.pat *.PAT);;";
6378 fschmid 189
        formats += tr("All Files (*)");
6368 fschmid 190
        PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
191
        QString wdir = dirs->get("patterns", ".");
6372 fschmid 192
        CustomFDialog dia(this, wdir, tr("Open"), formats, fdExistingFiles);
6368 fschmid 193
        if (dia.exec() == QDialog::Accepted)
194
                fileName = dia.selectedFile();
195
        else
196
                return;
197
        if (!fileName.isEmpty())
198
        {
199
                PrefsManager::instance()->prefsFile->getContext("dirs")->set("patterns", fileName.left(fileName.findRev("/")));
200
                QFileInfo fi(fileName);
8249 fschmid 201
                if ((fi.extension(true).lower() == "sml") || (fi.extension(true).lower() == "shape") || (fi.extension(true).lower() == "sce"))
6422 fschmid 202
                {
6372 fschmid 203
                        loadVectors(fileName);
6422 fschmid 204
                        updatePatternList();
205
                }
6372 fschmid 206
                else
6368 fschmid 207
                {
6372 fschmid 208
                        QString patNam = fi.baseName().stripWhiteSpace().simplifyWhiteSpace().replace(" ", "_");
209
                        ScPattern pat = ScPattern();
210
                        pat.setDoc(m_doc);
211
                        pat.setPattern(fileName);
212
                        if (!dialogPatterns.contains(patNam))
213
                        {
214
                                dialogPatterns.insert(patNam, pat);
215
                                updatePatternList();
216
                        }
6368 fschmid 217
                }
218
        }
219
}
220
 
6372 fschmid 221
void PatternDialog::loadVectors(QString data)
222
{
223
        QFileInfo fi(data);
224
        QString patNam = fi.baseName().stripWhiteSpace().simplifyWhiteSpace().replace(" ", "_");
225
        if (fi.extension(true).lower() == "sml")
226
        {
227
                QString f = "";
228
                loadText(data, &f);
229
                StencilReader *pre = new StencilReader();
230
                data = pre->createObjects(f);
231
                delete pre;
232
        }
8248 fschmid 233
        else if (fi.extension(true).lower() == "shape")
6372 fschmid 234
        {
235
                QString f = "";
236
                loadText(data, &f);
237
                StencilReader *pre = new StencilReader();
238
                data = pre->createShape(f);
239
                delete pre;
8248 fschmid 240
        }
6372 fschmid 241
        else if (fi.extension(true).lower() == "sce")
242
        {
243
                QString f = "";
244
                loadText(data, &f);
245
                data = f;
246
        }
247
        uint ac = m_doc->Items->count();
248
        bool savedAlignGrid = m_doc->useRaster;
249
        bool savedAlignGuides = m_doc->SnapGuides;
250
        m_doc->useRaster = false;
251
        m_doc->SnapGuides = false;
252
        mainWin->slotElemRead(data, m_doc->currentPage()->xOffset(), m_doc->currentPage()->yOffset(), false, true, m_doc, m_doc->view());
253
        m_doc->useRaster = savedAlignGrid;
254
        m_doc->SnapGuides = savedAlignGuides;
255
        uint ae = m_doc->Items->count();
6423 fschmid 256
        for (uint as = ac; as < ae; ++as)
257
        {
258
                PageItem* ite = m_doc->Items->at(ac);
259
                if (ite->itemType() == PageItem::PathText)
260
                {
261
                        ite->Frame = true;
262
                        ite->updatePolyClip();
263
                }
264
                else if (ite->itemType() == PageItem::TextFrame)
265
                {
7994 avox 266
                        if ( ite->prevInChain() == 0 )
6423 fschmid 267
                                ite->asTextFrame()->layout();
268
                }
269
        }
6372 fschmid 270
        ScPattern pat = ScPattern();
271
        pat.setDoc(m_doc);
272
        PageItem* currItem = m_doc->Items->at(ac);
273
        pat.pattern = currItem->DrawObj_toImage();
6380 fschmid 274
        pat.width = currItem->gWidth;
275
        pat.height = currItem->gHeight;
6372 fschmid 276
        for (uint as = ac; as < ae; ++as)
277
        {
278
                pat.items.append(m_doc->Items->take(ac));
279
        }
280
        if (!dialogPatterns.contains(patNam))
281
        {
282
                dialogPatterns.insert(patNam, pat);
283
        }
6407 fschmid 284
        for (QMap<QString, ScPattern>::Iterator it = m_doc->docPatterns.begin(); it != m_doc->docPatterns.end(); ++it)
285
        {
286
                if (!origPatterns.contains(it.key()))
287
                        dialogPatterns.insert(it.key(), it.data());
288
        }
6372 fschmid 289
}
290
 
6368 fschmid 291
void PatternDialog::patternSelected(QIconViewItem* it)
292
{
293
        if (it)
294
                buttonRemove->setEnabled(true);
295
        else
296
        {
297
                buttonRemove->setEnabled(false);
298
                patternView->clearSelection();
299
        }
300
}
301
 
7178 fschmid 302
void PatternDialog::removeAllPatterns()
303
{
304
        dialogPatterns.clear();
305
        updatePatternList();
306
}
307
 
6368 fschmid 308
void PatternDialog::removePattern()
309
{
310
        QIconViewItem *it = patternView->currentItem();
311
        if (it)
312
        {
6407 fschmid 313
                QStringList patterns2Del;
314
                QStringList mainPatterns = dialogPatterns.keys();
315
                for (uint a = 0; a < mainPatterns.count(); a++)
316
                {
317
                        if (mainPatterns[a] != it->text())
318
                        {
319
                                QStringList subPatterns;
320
                                subPatterns = getUsedPatternsHelper(mainPatterns[a], subPatterns);
321
                                if (subPatterns.contains(it->text()))
322
                                        patterns2Del.append(mainPatterns[a]);
323
                        }
324
                }
9207 fschmid 325
//              QStringList subPatterns;
326
//              subPatterns = getUsedPatternsHelper(it->text(), subPatterns);
327
//              if (!subPatterns.isEmpty())
328
//                      patterns2Del += subPatterns;
6407 fschmid 329
                patterns2Del.append(it->text());
330
                for (uint a = 0; a < patterns2Del.count(); a++)
331
                {
332
                        dialogPatterns.remove(patterns2Del[a]);
333
                }
6368 fschmid 334
                updatePatternList();
335
        }
336
}
6407 fschmid 337
 
338
QStringList PatternDialog::getUsedPatternsHelper(QString pattern, QStringList &results)
339
{
340
        ScPattern *pat = &dialogPatterns[pattern];
341
        QStringList pats;
342
        pats.clear();
343
        for (uint c = 0; c < pat->items.count(); ++c)
344
        {
345
                if ((!results.contains(pat->items.at(c)->pattern())) && (pat->items.at(c)->GrType == 8))
346
                        pats.append(pat->items.at(c)->pattern());
347
        }
348
        if (!pats.isEmpty())
349
        {
350
                for (uint c = 0; c < pats.count(); ++c)
351
                {
352
                        getUsedPatternsHelper(pats[c], results);
353
                }
354
        }
355
        return pats;
356
}