Subversion Repositories Scribus

Rev

Rev 6380 | Rev 6412 | Go to most recent revision | 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>
37
 
6372 fschmid 38
PatternDialog::PatternDialog(QWidget* parent, QMap<QString, ScPattern> *docPatterns, ScribusDoc *doc, ScribusMainWindow *scMW) : patternDialogBase(parent)
6368 fschmid 39
{
6369 fschmid 40
        m_doc = doc;
6372 fschmid 41
        mainWin = scMW;
6368 fschmid 42
        patternView->clear();
43
        for (QMap<QString, ScPattern>::Iterator it = docPatterns->begin(); it != docPatterns->end(); ++it)
44
        {
45
                dialogPatterns.insert(it.key(), it.data());
46
        }
6407 fschmid 47
        origPatterns = docPatterns->keys();
6368 fschmid 48
        updatePatternList();
49
        buttonRemove->setEnabled(false);
50
        connect(buttonOK, SIGNAL(clicked()), this, SLOT(accept()));
51
        connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject()));
52
        connect(buttonLoad, SIGNAL(clicked()), this, SLOT(loadPattern()));
53
        connect(buttonRemove, SIGNAL(clicked()), this, SLOT(removePattern()));
54
        connect(patternView, SIGNAL(clicked(QIconViewItem*)), this, SLOT(patternSelected(QIconViewItem*)));
55
}
56
 
57
void PatternDialog::updatePatternList()
58
{
59
        patternView->clear();
60
        for (QMap<QString, ScPattern>::Iterator it = dialogPatterns.begin(); it != dialogPatterns.end(); ++it)
61
        {
62
                QPixmap pm;
63
                if (it.data().getPattern()->width() > it.data().getPattern()->height())
64
                        pm.convertFromImage(it.data().getPattern()->scaleWidth(48));
65
                else
66
                        pm.convertFromImage(it.data().getPattern()->scaleHeight(48));
67
                (void) new QIconViewItem(patternView, it.key(), pm);
68
        }
69
}
70
 
71
void PatternDialog::loadPattern()
72
{
73
        QString fileName;
6378 fschmid 74
        QString formats = "Scribus Objects (*.sce *.SCE);;Dia Shapes (*.shape *.SHAPE);;Kivio Stencils (*.sml *.SML);;EPS (*.eps *.EPS);;PDF (*.pdf *.PDF);;";
6372 fschmid 75
        QString form1 = "";
76
        QString form2 = "";
77
        for ( uint i = 0; i < QImageIO::inputFormats().count(); ++i )
78
        {
79
                form1 = QString(QImageIO::inputFormats().at(i)).lower();
80
                form2 = QString(QImageIO::inputFormats().at(i)).upper();
81
                if (form1 == "jpeg")
82
                {
83
                        form1 = "jpg";
84
                        form2 = "JPG";
85
                }
86
                if ((form1 == "png") || (form1 == "xpm") || (form1 == "gif"))
87
                {
88
                        formats += form2 + " (*."+form1+" *."+form2+");;";
89
                }
90
                else if (form1 == "jpg")
91
                {
92
                        // JPEG is a special case because both .jpg and .jpeg
93
                        // are acceptable extensions.
94
                        formats += "JPEG (*.jpg *.jpeg *.JPG *.JPEG);;";
95
                }
96
        }
97
#ifdef HAVE_TIFF
98
        formats += "TIFF (*.tif *.tiff *.TIF *.TIFF);;";
99
#endif
100
        formats += "PSD (*.psd *.PSD);;";
6378 fschmid 101
        formats += tr("All Files (*)");
6368 fschmid 102
        PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
103
        QString wdir = dirs->get("patterns", ".");
6372 fschmid 104
        CustomFDialog dia(this, wdir, tr("Open"), formats, fdExistingFiles);
6368 fschmid 105
        if (dia.exec() == QDialog::Accepted)
106
                fileName = dia.selectedFile();
107
        else
108
                return;
109
        if (!fileName.isEmpty())
110
        {
111
                PrefsManager::instance()->prefsFile->getContext("dirs")->set("patterns", fileName.left(fileName.findRev("/")));
112
                QFileInfo fi(fileName);
6372 fschmid 113
                if ((fi.extension(true).lower() == "sml") || (fi.extension(true).lower() == "shape") || (fi.extension(true).lower() == "sce"))
114
                        loadVectors(fileName);
115
                else
6368 fschmid 116
                {
6372 fschmid 117
                        QString patNam = fi.baseName().stripWhiteSpace().simplifyWhiteSpace().replace(" ", "_");
118
                        ScPattern pat = ScPattern();
119
                        pat.setDoc(m_doc);
120
                        pat.setPattern(fileName);
121
                        if (!dialogPatterns.contains(patNam))
122
                        {
123
                                dialogPatterns.insert(patNam, pat);
124
                                updatePatternList();
125
                        }
6368 fschmid 126
                }
127
        }
128
}
129
 
6372 fschmid 130
void PatternDialog::loadVectors(QString data)
131
{
132
        QFileInfo fi(data);
133
        QString patNam = fi.baseName().stripWhiteSpace().simplifyWhiteSpace().replace(" ", "_");
134
        if (fi.extension(true).lower() == "sml")
135
        {
136
                QString f = "";
137
                loadText(data, &f);
138
                StencilReader *pre = new StencilReader();
139
                data = pre->createObjects(f);
140
                delete pre;
141
        }
142
        else if (fi.extension(true).lower() == "shape")
143
        {
144
                QString f = "";
145
                loadText(data, &f);
146
                StencilReader *pre = new StencilReader();
147
                data = pre->createShape(f);
148
                delete pre;
149
        }
150
        else if (fi.extension(true).lower() == "sce")
151
        {
152
                QString f = "";
153
                loadText(data, &f);
154
                data = f;
155
        }
156
        uint ac = m_doc->Items->count();
157
        bool savedAlignGrid = m_doc->useRaster;
158
        bool savedAlignGuides = m_doc->SnapGuides;
159
        m_doc->useRaster = false;
160
        m_doc->SnapGuides = false;
161
        mainWin->slotElemRead(data, m_doc->currentPage()->xOffset(), m_doc->currentPage()->yOffset(), false, true, m_doc, m_doc->view());
162
        m_doc->useRaster = savedAlignGrid;
163
        m_doc->SnapGuides = savedAlignGuides;
164
        uint ae = m_doc->Items->count();
165
        ScPattern pat = ScPattern();
166
        pat.setDoc(m_doc);
167
        PageItem* currItem = m_doc->Items->at(ac);
168
        pat.pattern = currItem->DrawObj_toImage();
6380 fschmid 169
        pat.width = currItem->gWidth;
170
        pat.height = currItem->gHeight;
6372 fschmid 171
        for (uint as = ac; as < ae; ++as)
172
        {
173
                pat.items.append(m_doc->Items->take(ac));
174
        }
175
        if (!dialogPatterns.contains(patNam))
176
        {
177
                dialogPatterns.insert(patNam, pat);
178
        }
6407 fschmid 179
        for (QMap<QString, ScPattern>::Iterator it = m_doc->docPatterns.begin(); it != m_doc->docPatterns.end(); ++it)
180
        {
181
                if (!origPatterns.contains(it.key()))
182
                        dialogPatterns.insert(it.key(), it.data());
183
        }
184
        updatePatternList();
6372 fschmid 185
}
186
 
6368 fschmid 187
void PatternDialog::patternSelected(QIconViewItem* it)
188
{
189
        if (it)
190
                buttonRemove->setEnabled(true);
191
        else
192
        {
193
                buttonRemove->setEnabled(false);
194
                patternView->clearSelection();
195
        }
196
}
197
 
198
void PatternDialog::removePattern()
199
{
200
        QIconViewItem *it = patternView->currentItem();
201
        if (it)
202
        {
6407 fschmid 203
                QStringList patterns2Del;
204
                QStringList mainPatterns = dialogPatterns.keys();
205
                for (uint a = 0; a < mainPatterns.count(); a++)
206
                {
207
                        if (mainPatterns[a] != it->text())
208
                        {
209
                                QStringList subPatterns;
210
                                subPatterns = getUsedPatternsHelper(mainPatterns[a], subPatterns);
211
                                if (subPatterns.contains(it->text()))
212
                                        patterns2Del.append(mainPatterns[a]);
213
                        }
214
                }
215
                QStringList subPatterns;
216
                subPatterns = getUsedPatternsHelper(it->text(), subPatterns);
217
                if (!subPatterns.isEmpty())
218
                        patterns2Del += subPatterns;
219
                patterns2Del.append(it->text());
220
                for (uint a = 0; a < patterns2Del.count(); a++)
221
                {
222
                        dialogPatterns.remove(patterns2Del[a]);
223
                }
6368 fschmid 224
                updatePatternList();
225
        }
226
}
6407 fschmid 227
 
228
QStringList PatternDialog::getUsedPatternsHelper(QString pattern, QStringList &results)
229
{
230
        ScPattern *pat = &dialogPatterns[pattern];
231
        QStringList pats;
232
        pats.clear();
233
        for (uint c = 0; c < pat->items.count(); ++c)
234
        {
235
                if ((!results.contains(pat->items.at(c)->pattern())) && (pat->items.at(c)->GrType == 8))
236
                        pats.append(pat->items.at(c)->pattern());
237
        }
238
        if (!pats.isEmpty())
239
        {
240
                for (uint c = 0; c < pats.count(); ++c)
241
                {
242
                        getUsedPatternsHelper(pats[c], results);
243
                }
244
        }
245
        return pats;
246
}