Subversion Repositories Scribus

Rev

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