Subversion Repositories Scribus

Rev

Rev 14467 | Rev 14932 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 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
*/
30 Franz 7
#include "scpreview.h"
14750 fschmid 8
#include <QByteArray>
10223 cbradney 9
#include <QDomDocument>
10
#include <QImage>
9803 fschmid 11
#include <QList>
14750 fschmid 12
#include "pageitem.h"
13
#include "prefsmanager.h"
5243 cbradney 14
#include "scribuscore.h"
14750 fschmid 15
#include "scribusdoc.h"
16
#include "scribusXml.h"
17
#include "selection.h"
504 cbradney 18
 
2834 cbradney 19
ScPreview::ScPreview()
30 Franz 20
{
21
}
31 Franz 22
 
14750 fschmid 23
QImage ScPreview::createPreview(QString data)
30 Franz 24
{
14750 fschmid 25
        PrefsManager *prefsManager = PrefsManager::instance();
26
        double gx, gy, gw, gh;
27
        ScriXmlDoc ss;
28
        if(ss.ReadElemHeader(data, false, &gx, &gy, &gw, &gh))
268 Franz 29
        {
14750 fschmid 30
                QDomDocument docu("scridoc");
31
                docu.setContent(data);
32
                QDomElement elem = docu.documentElement();
33
                if (elem.hasAttribute("previewData"))
741 fschmid 34
                {
14750 fschmid 35
                        QString dat = elem.attribute("previewData", "");
36
                        QByteArray inlineImageData;
37
                        inlineImageData.append(dat);
38
                        inlineImageData = QByteArray::fromBase64(inlineImageData);
39
                        QImage tmp;
40
                        tmp.loadFromData(inlineImageData);
41
                        return tmp;
741 fschmid 42
                }
14750 fschmid 43
                else
268 Franz 44
                {
14750 fschmid 45
                        ScribusDoc *m_Doc = new ScribusDoc();
46
                        m_Doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
47
                        m_Doc->setPage(gw, gh, 0, 0, 0, 0, 0, 0, false, false);
48
                        m_Doc->addPage(0);
49
                        m_Doc->setGUI(false, ScCore->primaryMainWindow(), 0);
50
                        m_Doc->setLoading(true);
51
                        m_Doc->DoDrawing = false;
52
                        if(ss.ReadElem(data, prefsManager->appPrefs.fontPrefs.AvailFonts, m_Doc, 0, 0, false, true, prefsManager->appPrefs.fontPrefs.GFontSub))
268 Franz 53
                        {
14750 fschmid 54
                                QList<PageItem*> Elements = *m_Doc->Items;
55
                                if (Elements.count() > 0)
30 Franz 56
                                {
14750 fschmid 57
                                        Selection *tmpSel = new Selection(0, false);
58
                                        bool isGroup = true;
59
                                        int firstElem = -1;
60
                                        if (Elements.at(0)->Groups.count() != 0)
61
                                                firstElem = Elements.at(0)->Groups.top();
62
                                        for (int bx = 0; bx < Elements.count(); ++bx)
268 Franz 63
                                        {
14750 fschmid 64
                                                PageItem* bxi = Elements.at(bx);
65
                                                if (bxi->Groups.count() != 0)
268 Franz 66
                                                {
14750 fschmid 67
                                                        if (bxi->Groups.top() != firstElem)
68
                                                                isGroup = false;
268 Franz 69
                                                }
14750 fschmid 70
                                                else
71
                                                        isGroup = false;
268 Franz 72
                                        }
14750 fschmid 73
                                        if (!isGroup)
12795 fschmid 74
                                        {
14750 fschmid 75
                                                double minx = 99999.9;
76
                                                double miny = 99999.9;
77
                                                double maxx = -99999.9;
78
                                                double maxy = -99999.9;
79
                                                uint lowestItem = 999999;
80
                                                uint highestItem = 0;
81
                                                for (int a = 0; a < Elements.count(); ++a)
12795 fschmid 82
                                                {
14750 fschmid 83
                                                        Elements.at(a)->Groups.push(m_Doc->GroupCounter);
84
                                                        PageItem* currItem = Elements.at(a);
85
                                                        lowestItem = qMin(lowestItem, currItem->ItemNr);
86
                                                        highestItem = qMax(highestItem, currItem->ItemNr);
87
                                                        double x1, x2, y1, y2;
88
                                                        currItem->getVisualBoundingRect(&x1, &y1, &x2, &y2);
89
                                                        minx = qMin(minx, x1);
90
                                                        miny = qMin(miny, y1);
91
                                                        maxx = qMax(maxx, x2);
92
                                                        maxy = qMax(maxy, y2);
12795 fschmid 93
                                                }
14750 fschmid 94
                                                double gx = minx;
95
                                                double gy = miny;
96
                                                double gw = maxx - minx;
97
                                                double gh = maxy - miny;
98
                                                PageItem *high = m_Doc->Items->at(highestItem);
99
                                                int z = m_Doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, gx, gy, gw, gh, 0, m_Doc->itemToolPrefs.shapeFillColor, m_Doc->itemToolPrefs.shapeLineColor, true);
100
                                                PageItem *neu = m_Doc->Items->takeAt(z);
101
                                                m_Doc->Items->insert(lowestItem, neu);
102
                                                neu->Groups.push(m_Doc->GroupCounter);
103
                                                neu->setItemName( QObject::tr("Group%1").arg(neu->Groups.top()));
104
                                                neu->AutoName = false;
105
                                                neu->isGroupControl = true;
106
                                                neu->groupsLastItem = high;
107
                                                neu->setTextFlowMode(PageItem::TextFlowDisabled);
108
                                                for (int a = 0; a < m_Doc->Items->count(); ++a)
268 Franz 109
                                                {
14750 fschmid 110
                                                        m_Doc->Items->at(a)->ItemNr = a;
30 Franz 111
                                                }
14750 fschmid 112
                                                Elements.prepend(neu);
113
                                                m_Doc->GroupCounter++;
268 Franz 114
                                        }
14750 fschmid 115
                                        m_Doc->DoDrawing = true;
116
                                        m_Doc->m_Selection->delaySignalsOn();
117
                                        for (int dre=0; dre<Elements.count(); ++dre)
268 Franz 118
                                        {
14750 fschmid 119
                                                tmpSel->addItem(Elements.at(dre), true);
268 Franz 120
                                        }
14750 fschmid 121
                                        tmpSel->setGroupRect();
122
                                        double xs = tmpSel->width();
123
                                        double ys = tmpSel->height();
124
                                //      double sc = 60.0 / qMax(xs, ys);
125
                                //      m_Doc->scaleGroup(sc, sc, true, tmpSel);
126
                                        QImage tmpImage = Elements.at(0)->DrawObj_toImage();
127
                                        tmpImage.setText("XSize", QString("%1").arg(xs));
128
                                        tmpImage.setText("YSize", QString("%1").arg(ys));
129
                                        m_Doc->m_Selection->delaySignalsOff();
130
                                        delete tmpSel;
131
                                        delete m_Doc;
132
                                        return tmpImage;
268 Franz 133
                                }
134
                                else
135
                                {
14750 fschmid 136
                                        delete m_Doc;
137
                                        return QImage();
268 Franz 138
                                }
139
                        }
14750 fschmid 140
                        else
268 Franz 141
                        {
14750 fschmid 142
                                delete m_Doc;
143
                                return QImage();
268 Franz 144
                        }
145
                }
146
        }
68 Franz 147
        else
14750 fschmid 148
                return QImage();
68 Franz 149
}