Subversion Repositories Scribus

Rev

Rev 10601 | Rev 10862 | 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
*/
3614 cbradney 7
/***************************************************************************
8
                          pageitem.cpp  -  description
9
                             -------------------
10
    begin                : Sat Apr 7 2001
11
    copyright            : (C) 2001 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
23
 
24
#include "pageitem_imageframe.h"
8501 cbradney 25
#include <QKeyEvent>
10220 cbradney 26
 
3614 cbradney 27
#include <cmath>
28
#include <cassert>
29
 
30
#include "mpalette.h"
31
#include "page.h"
32
#include "pageitem.h"
33
#include "prefsmanager.h"
10601 mrdocs 34
#include "scraction.h"
3614 cbradney 35
#include "scpaths.h"
10601 mrdocs 36
#include "scpainter.h"
3614 cbradney 37
#include "scribus.h"
38
#include "scribusstructs.h"
39
#include "scribusdoc.h"
4546 subik 40
#include "commonstrings.h"
3614 cbradney 41
#include "undomanager.h"
42
#include "undostate.h"
43
#include "scconfig.h"
10601 mrdocs 44
#include "util_formats.h"
45
#include "util_color.h"
3614 cbradney 46
 
47
#include "util.h"
48
 
49
 
50
PageItem_ImageFrame::PageItem_ImageFrame(ScribusDoc *pa, double x, double y, double w, double h, double w2, QString fill, QString outline)
51
        : PageItem(pa, PageItem::ImageFrame, x, y, w, h, w2, fill, outline)
52
{
53
}
54
 
5350 avox 55
void PageItem_ImageFrame::DrawObj_Item(ScPainter *p, QRect /*e*/, double sc)
3614 cbradney 56
{
4084 cbradney 57
        if(!m_Doc->RePos)
3614 cbradney 58
        {
5619 fschmid 59
                if (!m_Doc->layerOutline(LayerNr))
3614 cbradney 60
                {
5572 fschmid 61
                        if ((fillColor() != CommonStrings::None) || (GrType != 0))
62
                        {
63
                                p->setupPolygon(&PoLine);
64
                                p->fillPath();
65
                        }
5584 fschmid 66
                        p->save();
67
                        if (imageClip.size() != 0)
68
                        {
69
                                p->setupPolygon(&imageClip);
70
                                p->setClipPath();
71
                        }
72
                        p->setupPolygon(&PoLine);
5471 fschmid 73
                        p->setClipPath();
5584 fschmid 74
                        if (Pfile.isEmpty())
75
                        {
4084 cbradney 76
                                if ((Frame) && (m_Doc->guidesSettings.framesShown))
3614 cbradney 77
                                {
8501 cbradney 78
                                        p->setPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
3614 cbradney 79
                                        p->drawLine(FPoint(0, 0), FPoint(Width, Height));
80
                                        p->drawLine(FPoint(0, Height), FPoint(Width, 0));
81
                                }
82
                        }
83
                        else
84
                        {
6141 cbradney 85
                                //If we are missing our image, draw a red cross in the frame
5584 fschmid 86
                                if ((!PicArt) || (!PicAvail))
3614 cbradney 87
                                {
5584 fschmid 88
                                        if ((Frame) && (m_Doc->guidesSettings.framesShown))
89
                                        {
8501 cbradney 90
                                                p->setPen(Qt::red, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
5584 fschmid 91
                                                p->drawLine(FPoint(0, 0), FPoint(Width, Height));
92
                                                p->drawLine(FPoint(0, Height), FPoint(Width, 0));
93
                                        }
3614 cbradney 94
                                }
5584 fschmid 95
                                else
3614 cbradney 96
                                {
5584 fschmid 97
                                        if (imageFlippedH())
98
                                        {
8000 fschmid 99
                                                p->translate(Width, 0);
100
                                                p->scale(-1, 1);
101
                                        }
102
                                        if (imageFlippedV())
103
                                        {
104
                                                p->translate(0, Height);
105
                                                p->scale(1, -1);
106
                                        }
9470 fschmid 107
                                        p->translate(LocalX*LocalScX, LocalY*LocalScY);
5584 fschmid 108
                                        p->scale(LocalScX, LocalScY);
109
                                        if (pixm.imgInfo.lowResType != 0)
110
                                                p->scale(pixm.imgInfo.lowResScale, pixm.imgInfo.lowResScale);
6063 fschmid 111
                                        p->drawImage(pixm.qImagePtr());
3614 cbradney 112
                                }
113
                        }
5584 fschmid 114
                        p->restore();
3614 cbradney 115
                }
116
        }
117
}
3627 cbradney 118
 
119
void PageItem_ImageFrame::clearContents()
120
{
3955 fschmid 121
        effectsInUse.clear();
122
        PicAvail = false;
3627 cbradney 123
        Pfile = "";
124
        pixm = ScImage();
4546 subik 125
 
3627 cbradney 126
        LocalScX = 1;
127
        LocalScY = 1;
128
        OrigW = 0;
129
        OrigH = 0;
130
        LocalX = 0;
131
        LocalY = 0;
132
        setImageFlippedH(false);
133
        setImageFlippedV(false);
134
        EmProfile = "";
135
        ScaleType = true;
136
        AspectRatio = true;
137
        setFillTransparency(0.0);
138
        setLineTransparency(0.0);
139
        imageClip.resize(0);
4546 subik 140
        //                              emit UpdtObj(Doc->currentPage->pageNr(), ItemNr);
3627 cbradney 141
}
142
 
5226 cbradney 143
void PageItem_ImageFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
144
{
145
        double moveBy=1.0;
10390 cbradney 146
        Qt::KeyboardModifiers buttonModifiers = k->modifiers();
10398 cbradney 147
        bool controlDown=(buttonModifiers & Qt::ControlModifier);
148
        bool altDown=(buttonModifiers & Qt::AltModifier);
149
        bool shiftDown=(buttonModifiers & Qt::ShiftModifier);
5727 cbradney 150
        bool resizingImage=false;
10390 cbradney 151
        if (shiftDown && !controlDown)
5226 cbradney 152
                moveBy=10.0;
10390 cbradney 153
        else if (shiftDown && controlDown && !altDown)
5226 cbradney 154
                moveBy=0.1;
10390 cbradney 155
        else if (shiftDown && controlDown && altDown)
5226 cbradney 156
                moveBy=0.01;
10390 cbradney 157
        else if (!shiftDown && altDown)
5727 cbradney 158
                resizingImage=true;
5226 cbradney 159
        double dX=0.0,dY=0.0;
160
        int kk = k->key();
5727 cbradney 161
        if (!resizingImage)
5226 cbradney 162
        {
5727 cbradney 163
                moveBy/=m_Doc->unitRatio();//Lets allow movement by the current doc ratio, not only points
164
                switch (kk)
165
                {
8523 cbradney 166
                        case Qt::Key_Left:
5727 cbradney 167
                                dX=-moveBy;
168
                                break;
8523 cbradney 169
                        case Qt::Key_Right:
5727 cbradney 170
                                dX=moveBy;
171
                                break;
8523 cbradney 172
                        case Qt::Key_Up:
5727 cbradney 173
                                dY=-moveBy;
174
                                break;
8523 cbradney 175
                        case Qt::Key_Down:
5727 cbradney 176
                                dY=moveBy;
177
                                break;
178
                }
179
                if (dX!=0.0 || dY!=0.0)
180
                {
181
                        moveImageInFrame(dX, dY);
10532 avox 182
                        update();
5727 cbradney 183
                }
5226 cbradney 184
        }
5727 cbradney 185
        else
5226 cbradney 186
        {
5727 cbradney 187
                switch (kk)
188
                {
8523 cbradney 189
                        case Qt::Key_Left:
5727 cbradney 190
                                dX=-moveBy+100;
191
                                break;
8523 cbradney 192
                        case Qt::Key_Right:
5727 cbradney 193
                                dX=moveBy+100;
194
                                break;
8523 cbradney 195
                        case Qt::Key_Up:
5727 cbradney 196
                                dY=-moveBy+100;
197
                                break;
8523 cbradney 198
                        case Qt::Key_Down:
5727 cbradney 199
                                dY=moveBy+100;
200
                                break;
201
                        default:
202
                                return;
203
                }              
204
                if (dX!=0.0)
205
                {
206
                        double newXScale=dX / 100.0 * LocalScX;
207
                        setImageXScale(newXScale);
5976 cbradney 208
                        if (!controlDown)
5921 cbradney 209
                        {
210
                                double newYScale=dX / 100.0 * LocalScY;
211
                                setImageYScale(newYScale);
212
                        }
5727 cbradney 213
                }
5921 cbradney 214
                else
5727 cbradney 215
                if (dY!=0.0)
216
                {
217
                        double newYScale=dY / 100.0 * LocalScY;
218
                        setImageYScale(newYScale);
5976 cbradney 219
                        if (!controlDown)
5921 cbradney 220
                        {
221
                                double newXScale=dY / 100.0 * LocalScY;
222
                                setImageXScale(newXScale);
223
                        }
5727 cbradney 224
                }
225
                if (dX!=0.0 || dY!=0.0)
226
                        if (imageClip.size() != 0)
227
                        {
228
                                imageClip = pixm.imgInfo.PDSpathData[pixm.imgInfo.usedPath].copy();
8501 cbradney 229
                                QMatrix cl;
5727 cbradney 230
                                cl.translate(imageXOffset()*imageXScale(), imageYOffset()*imageYScale());
231
                                cl.scale(imageXScale(), imageYScale());
232
                                imageClip.map(cl);
233
                        }
10532 avox 234
                update();      
5226 cbradney 235
        }
5243 cbradney 236
}
10601 mrdocs 237
 
238
bool PageItem_ImageFrame::createInfoGroup(QFrame *infoGroup, QGridLayout *infoGroupLayout)
239
{
240
        QLabel *infoCT, *fileT, *fileCT, *oPpiT, *oPpiCT, *aPpiT, *aPpiCT, *colT, *colCT;
241
        infoCT = new QLabel(infoGroup);
242
        fileCT = new QLabel(infoGroup);
243
 
244
        infoCT->setText(tr("Picture"));
245
        infoGroupLayout->addWidget( infoCT, 0, 0, 1, 2, Qt::AlignHCenter );
246
 
247
        if (PicAvail)
248
        {
249
                fileT = new QLabel(infoGroup);
250
                oPpiT = new QLabel(infoGroup);
251
                oPpiCT = new QLabel(infoGroup);
252
                aPpiT = new QLabel(infoGroup);
253
                aPpiCT = new QLabel(infoGroup);
254
                colT = new QLabel(infoGroup);
255
                colCT = new QLabel(infoGroup);
256
                QFileInfo fi = QFileInfo(Pfile);
257
                fileCT->setText( ScribusView::tr("File: "));
258
                infoGroupLayout->addWidget( fileCT, 1, 0, Qt::AlignRight );
259
                fileT->setText(fi.fileName());
260
                infoGroupLayout->addWidget( fileT, 1, 1 );
261
 
262
                oPpiCT->setText( ScribusView::tr("Original PPI: "));
263
                infoGroupLayout->addWidget( oPpiCT, 2, 0, Qt::AlignRight );
264
                oPpiT->setText(QString::number(qRound(pixm.imgInfo.xres))+" x "+QString::number(qRound(pixm.imgInfo.yres)));
265
                infoGroupLayout->addWidget( oPpiT, 2, 1 );
266
 
267
                aPpiCT->setText( ScribusView::tr("Actual PPI: "));
268
                infoGroupLayout->addWidget( aPpiCT, 3, 0, Qt::AlignRight );
269
                aPpiT->setText(QString::number(qRound(72.0 / imageXScale()))+" x "+ QString::number(qRound(72.0 / imageYScale())));
270
                infoGroupLayout->addWidget( aPpiT, 3, 1 );
271
 
272
                colCT->setText( ScribusView::tr("Colorspace: "));
273
                infoGroupLayout->addWidget( colCT, 4, 0, Qt::AlignRight );
274
                QString cSpace;
275
                QString ext = fi.suffix().toLower();
276
                if ((extensionIndicatesPDF(ext) || extensionIndicatesEPSorPS(ext)) && (pixm.imgInfo.type != 7))
277
                        cSpace = ScribusView::tr("Unknown");
278
                else
279
                        cSpace=colorSpaceText(pixm.imgInfo.colorspace);
280
                colT->setText(cSpace);
281
                infoGroupLayout->addWidget( colT, 4, 1 );
282
        } else {
283
                fileCT->setText( ScribusView::tr("No Image Loaded"));
284
                infoGroupLayout->addWidget( fileCT, 1, 0, 1, 2, Qt::AlignHCenter );
285
        }
286
        return true;
287
}
288
 
289
 
290
bool PageItem_ImageFrame::createContextMenu(QMenu *menu, int step)
291
{
292
        QMap<QString, QPointer<ScrAction> > actions = doc()->scMW()->scrActions;
293
        static QMenu* menuResolution = 0;
294
        QAction *act;
295
 
296
        if (menu == 0) {
297
                if (menuResolution) delete menuResolution;
298
                menuResolution = 0;
299
                return true;
300
        }
301
 
302
        switch (step) {
303
                case 5:
304
                        if (pixm.imgInfo.exifDataValid)
305
                                menu->addAction(actions["itemImageInfo"]);
306
                break;
307
                case 10:
308
                        menu->addSeparator();
309
                        menu->addAction(actions["fileImportImage"]);
310
                        if (PicAvail)
311
                        {
312
                                if (!isTableItem)
313
                                        menu->addAction(actions["itemAdjustFrameToImage"]);
314
                                if (pixm.imgInfo.valid)
315
                                        menu->addAction(actions["itemExtendedImageProperties"]);
316
                                menu->addAction(actions["itemUpdateImage"]);
317
                        }
318
                        createContextMenu(menu, 11);
319
                        if (PicAvail && isRaster)
320
                        {
321
                                menu->addAction(actions["styleImageEffects"]);
322
                                menu->addAction(actions["editEditWithImageEditor"]);
323
                        }
324
                break;
325
                case 11:
10660 cbradney 326
                        if (menuResolution != 0) {
327
                                qDebug() << "New context menu created before old was destroyed."
328
                                                "Loosing some bytes of memory!";
329
                        }
10601 mrdocs 330
                        menuResolution = new QMenu();
331
                        act = menu->addMenu(menuResolution);
332
                        act->setText(tr("Preview Settings"));
333
                        menuResolution->addAction(actions["itemImageIsVisible"]);
334
                        menuResolution->addSeparator();
335
                        menuResolution->addAction(actions["itemPreviewLow"]);
336
                        menuResolution->addAction(actions["itemPreviewNormal"]);
337
                        menuResolution->addAction(actions["itemPreviewFull"]);
338
                break;
339
                case 30:
340
                        actions["itemConvertToTextFrame"]->setEnabled(true);
341
                        menu->addAction(actions["itemConvertToTextFrame"]);
342
                        if (!isTableItem)
343
                                menu->addAction(actions["itemConvertToPolygon"]);
344
                break;
345
                case 40:
346
                        if (PicAvail)
347
                                menu->addAction(actions["editCopyContents"]);
348
                        if (doc()->scMW()->contentsBuffer.sourceType==PageItem::ImageFrame)
349
                        {
350
                                menu->addAction(actions["editPasteContents"]);
351
                                menu->addAction(actions["editPasteContentsAbs"]);
352
                        }
353
                        if (PicAvail)
354
                                menu->addAction(actions["editClearContents"]);
355
                        return (PicAvail) || (doc()->scMW()->contentsBuffer.sourceType==PageItem::ImageFrame);
356
                default:
357
                        return false;
358
        }
359
        return true;
360
}