Subversion Repositories Scribus

Rev

Rev 10390 | Rev 10532 | 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"
34
#include "scpaths.h"
35
#include "scribus.h"
36
#include "scribusstructs.h"
37
#include "scribusdoc.h"
4546 subik 38
#include "commonstrings.h"
3614 cbradney 39
#include "undomanager.h"
40
#include "undostate.h"
41
#include "scconfig.h"
42
 
43
#include "util.h"
44
 
45
using namespace std;
46
 
47
PageItem_ImageFrame::PageItem_ImageFrame(ScribusDoc *pa, double x, double y, double w, double h, double w2, QString fill, QString outline)
48
        : PageItem(pa, PageItem::ImageFrame, x, y, w, h, w2, fill, outline)
49
{
50
}
51
 
5350 avox 52
void PageItem_ImageFrame::DrawObj_Item(ScPainter *p, QRect /*e*/, double sc)
3614 cbradney 53
{
4084 cbradney 54
        if(!m_Doc->RePos)
3614 cbradney 55
        {
5619 fschmid 56
                if (!m_Doc->layerOutline(LayerNr))
3614 cbradney 57
                {
5572 fschmid 58
                        if ((fillColor() != CommonStrings::None) || (GrType != 0))
59
                        {
60
                                p->setupPolygon(&PoLine);
61
                                p->fillPath();
62
                        }
5584 fschmid 63
                        p->save();
64
                        if (imageClip.size() != 0)
65
                        {
66
                                p->setupPolygon(&imageClip);
67
                                p->setClipPath();
68
                        }
69
                        p->setupPolygon(&PoLine);
5471 fschmid 70
                        p->setClipPath();
5584 fschmid 71
                        if (Pfile.isEmpty())
72
                        {
4084 cbradney 73
                                if ((Frame) && (m_Doc->guidesSettings.framesShown))
3614 cbradney 74
                                {
8501 cbradney 75
                                        p->setPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
3614 cbradney 76
                                        p->drawLine(FPoint(0, 0), FPoint(Width, Height));
77
                                        p->drawLine(FPoint(0, Height), FPoint(Width, 0));
78
                                }
79
                        }
80
                        else
81
                        {
6141 cbradney 82
                                //If we are missing our image, draw a red cross in the frame
5584 fschmid 83
                                if ((!PicArt) || (!PicAvail))
3614 cbradney 84
                                {
5584 fschmid 85
                                        if ((Frame) && (m_Doc->guidesSettings.framesShown))
86
                                        {
8501 cbradney 87
                                                p->setPen(Qt::red, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);
5584 fschmid 88
                                                p->drawLine(FPoint(0, 0), FPoint(Width, Height));
89
                                                p->drawLine(FPoint(0, Height), FPoint(Width, 0));
90
                                        }
3614 cbradney 91
                                }
5584 fschmid 92
                                else
3614 cbradney 93
                                {
5584 fschmid 94
                                        if (imageFlippedH())
95
                                        {
8000 fschmid 96
                                                p->translate(Width, 0);
97
                                                p->scale(-1, 1);
98
                                        }
99
                                        if (imageFlippedV())
100
                                        {
101
                                                p->translate(0, Height);
102
                                                p->scale(1, -1);
103
                                        }
9470 fschmid 104
                                        p->translate(LocalX*LocalScX, LocalY*LocalScY);
5584 fschmid 105
                                        p->scale(LocalScX, LocalScY);
106
                                        if (pixm.imgInfo.lowResType != 0)
107
                                                p->scale(pixm.imgInfo.lowResScale, pixm.imgInfo.lowResScale);
6063 fschmid 108
                                        p->drawImage(pixm.qImagePtr());
3614 cbradney 109
                                }
110
                        }
5584 fschmid 111
                        p->restore();
3614 cbradney 112
                }
113
        }
114
}
3627 cbradney 115
 
116
void PageItem_ImageFrame::clearContents()
117
{
3955 fschmid 118
        effectsInUse.clear();
119
        PicAvail = false;
3627 cbradney 120
        Pfile = "";
121
        pixm = ScImage();
4546 subik 122
 
3627 cbradney 123
        LocalScX = 1;
124
        LocalScY = 1;
125
        OrigW = 0;
126
        OrigH = 0;
127
        LocalX = 0;
128
        LocalY = 0;
129
        setImageFlippedH(false);
130
        setImageFlippedV(false);
131
        EmProfile = "";
132
        ScaleType = true;
133
        AspectRatio = true;
134
        setFillTransparency(0.0);
135
        setLineTransparency(0.0);
136
        imageClip.resize(0);
4546 subik 137
        //                              emit UpdtObj(Doc->currentPage->pageNr(), ItemNr);
3627 cbradney 138
}
139
 
5226 cbradney 140
void PageItem_ImageFrame::handleModeEditKey(QKeyEvent *k, bool& keyRepeat)
141
{
142
        double moveBy=1.0;
10390 cbradney 143
        Qt::KeyboardModifiers buttonModifiers = k->modifiers();
10398 cbradney 144
        bool controlDown=(buttonModifiers & Qt::ControlModifier);
145
        bool altDown=(buttonModifiers & Qt::AltModifier);
146
        bool shiftDown=(buttonModifiers & Qt::ShiftModifier);
5727 cbradney 147
        bool resizingImage=false;
10390 cbradney 148
        if (shiftDown && !controlDown)
5226 cbradney 149
                moveBy=10.0;
10390 cbradney 150
        else if (shiftDown && controlDown && !altDown)
5226 cbradney 151
                moveBy=0.1;
10390 cbradney 152
        else if (shiftDown && controlDown && altDown)
5226 cbradney 153
                moveBy=0.01;
10390 cbradney 154
        else if (!shiftDown && altDown)
5727 cbradney 155
                resizingImage=true;
5226 cbradney 156
        double dX=0.0,dY=0.0;
157
        int kk = k->key();
5727 cbradney 158
        if (!resizingImage)
5226 cbradney 159
        {
5727 cbradney 160
                moveBy/=m_Doc->unitRatio();//Lets allow movement by the current doc ratio, not only points
161
                switch (kk)
162
                {
8523 cbradney 163
                        case Qt::Key_Left:
5727 cbradney 164
                                dX=-moveBy;
165
                                break;
8523 cbradney 166
                        case Qt::Key_Right:
5727 cbradney 167
                                dX=moveBy;
168
                                break;
8523 cbradney 169
                        case Qt::Key_Up:
5727 cbradney 170
                                dY=-moveBy;
171
                                break;
8523 cbradney 172
                        case Qt::Key_Down:
5727 cbradney 173
                                dY=moveBy;
174
                                break;
175
                }
176
                if (dX!=0.0 || dY!=0.0)
177
                {
178
                        moveImageInFrame(dX, dY);
179
                        ScribusView* view = m_Doc->view();
180
                        view->updateContents(getRedrawBounding(view->scale()));
181
                }
5226 cbradney 182
        }
5727 cbradney 183
        else
5226 cbradney 184
        {
5727 cbradney 185
                switch (kk)
186
                {
8523 cbradney 187
                        case Qt::Key_Left:
5727 cbradney 188
                                dX=-moveBy+100;
189
                                break;
8523 cbradney 190
                        case Qt::Key_Right:
5727 cbradney 191
                                dX=moveBy+100;
192
                                break;
8523 cbradney 193
                        case Qt::Key_Up:
5727 cbradney 194
                                dY=-moveBy+100;
195
                                break;
8523 cbradney 196
                        case Qt::Key_Down:
5727 cbradney 197
                                dY=moveBy+100;
198
                                break;
199
                        default:
200
                                return;
201
                }              
202
                if (dX!=0.0)
203
                {
204
                        double newXScale=dX / 100.0 * LocalScX;
205
                        setImageXScale(newXScale);
5976 cbradney 206
                        if (!controlDown)
5921 cbradney 207
                        {
208
                                double newYScale=dX / 100.0 * LocalScY;
209
                                setImageYScale(newYScale);
210
                        }
5727 cbradney 211
                }
5921 cbradney 212
                else
5727 cbradney 213
                if (dY!=0.0)
214
                {
215
                        double newYScale=dY / 100.0 * LocalScY;
216
                        setImageYScale(newYScale);
5976 cbradney 217
                        if (!controlDown)
5921 cbradney 218
                        {
219
                                double newXScale=dY / 100.0 * LocalScY;
220
                                setImageXScale(newXScale);
221
                        }
5727 cbradney 222
                }
223
                if (dX!=0.0 || dY!=0.0)
224
                        if (imageClip.size() != 0)
225
                        {
226
                                imageClip = pixm.imgInfo.PDSpathData[pixm.imgInfo.usedPath].copy();
8501 cbradney 227
                                QMatrix cl;
5727 cbradney 228
                                cl.translate(imageXOffset()*imageXScale(), imageYOffset()*imageYScale());
229
                                cl.scale(imageXScale(), imageYScale());
230
                                imageClip.map(cl);
231
                        }
5226 cbradney 232
                ScribusView* view = m_Doc->view();
5727 cbradney 233
                view->updateContents(getRedrawBounding(view->scale()));
5226 cbradney 234
        }
5243 cbradney 235
}