Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
15847 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
*                                                                         *
9
*   This program is free software; you can redistribute it and/or modify  *
10
*   it under the terms of the GNU General Public License as published by  *
11
*   the Free Software Foundation; either version 2 of the License, or     *
12
*   (at your option) any later version.                                   *
13
*                                                                         *
14
***************************************************************************/
15
 
16
 
17
#include "canvasmode_drawcalligraphic.h"
18
 
19
#include <QEvent>
20
#include <QMouseEvent>
21
#include <QPainterPath>
22
#include <QPoint>
23
#include <QRect>
24
 
19067 craig 25
 
26
#include "KarbonCurveFit.h"
27
#include "appmodes.h"
15847 fschmid 28
#include "canvas.h"
29
#include "canvasgesture_resize.h"
30
#include "fpoint.h"
31
#include "prefsmanager.h"
32
#include "scraction.h"
33
#include "scribus.h"
19067 craig 34
#include "scribusXml.h"
15847 fschmid 35
#include "scribusdoc.h"
36
#include "scribusview.h"
19067 craig 37
#include "selection.h"
38
#include "ui/pageselector.h"
15855 fschmid 39
#include "ui/scrspinbox.h"
15847 fschmid 40
#include "undomanager.h"
41
#include "util.h"
42
#include "util_math.h"
43
 
44
 
45
 
19067 craig 46
 
19093 craig 47
 
15847 fschmid 48
CalligraphicMode::CalligraphicMode(ScribusView* view) : CanvasMode(view)
49
{
50
        Mxp = Myp = -1;
51
        Dxp = Dyp = -1;
15851 jghali 52
        m_MouseButtonPressed = false;
15847 fschmid 53
}
54
 
55
 
56
void CalligraphicMode::drawControls(QPainter* p)
57
{
58
        //
59
}
60
 
61
inline bool CalligraphicMode::GetItem(PageItem** pi)
62
{
63
        *pi = m_doc->m_Selection->itemAt(0);
64
        return (*pi) != NULL;
65
}
66
 
67
void CalligraphicMode::enterEvent(QEvent *)
68
{
69
        if (!m_MouseButtonPressed)
70
        {
71
                setModeCursor();
72
        }
73
}
74
 
75
 
76
void CalligraphicMode::leaveEvent(QEvent *e)
77
{
78
}
79
 
80
 
81
void CalligraphicMode::activate(bool flag)
82
{
83
        Mxp = Myp = -1;
84
        Dxp = Dyp = -1;
15851 jghali 85
        m_MouseButtonPressed = false;
15847 fschmid 86
        setModeCursor();
87
}
88
 
89
void CalligraphicMode::deactivate(bool flag)
90
{
18438 craig 91
        m_view->setRedrawMarkerShown(false);
15847 fschmid 92
}
93
 
94
void CalligraphicMode::mouseDoubleClickEvent(QMouseEvent *m)
95
{
96
        m->accept();
97
        m_MouseButtonPressed = false;
98
        m_canvas->resetRenderMode();
99
        mousePressEvent(m);
100
}
101
 
102
 
103
void CalligraphicMode::mouseMoveEvent(QMouseEvent *m)
104
{
105
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
106
 
107
        double newX, newY;
108
        PageItem *currItem;
109
        QPoint np, np2, mop;
110
        FPoint npf, npf2;
111
        QRect tx;
112
        m->accept();
113
        m_canvas->displayCorrectedXYHUD(m->globalPos(), mousePointDoc.x(), mousePointDoc.y());
114
 
115
        if (commonMouseMove(m))
116
                return;
117
 
118
        if (m_MouseButtonPressed && (m_doc->appMode == modeDrawCalligraphicLine))
119
        {
120
                double newXF = mousePointDoc.x(); //m_view->translateToDoc(m->x(), m->y()).x();
121
                double newYF = mousePointDoc.y(); //m_view->translateToDoc(m->x(), m->y()).y();
122
                if (RecordP.size() > 0)
123
                {
124
                        if (FPoint(newXF, newYF) != RecordP.point(RecordP.size()-1))
125
                                RecordP.addPoint(FPoint(newXF, newYF));
126
                }
127
                else
128
                        RecordP.addPoint(FPoint(newXF, newYF));
129
                QPolygon& redrawPolygon(m_canvas->newRedrawPolygon());
19378 craig 130
                double mx = sin(m_doc->itemToolPrefs().calligraphicPenAngle / 180.0 * M_PI) * (m_doc->itemToolPrefs().calligraphicPenWidth / 2.0);
131
                double my = cos(m_doc->itemToolPrefs().calligraphicPenAngle / 180.0 * M_PI) * (m_doc->itemToolPrefs().calligraphicPenWidth / 2.0);
18114 jghali 132
                for (int px = 0; px < RecordP.size()-1; ++px)
15847 fschmid 133
                {
15855 fschmid 134
                        FPoint clp = RecordP.point(px);
135
                        redrawPolygon.append(QPoint(qRound(clp.x() - mx), qRound(clp.y() - my)));
136
                        redrawPolygon.prepend(QPoint(qRound(clp.x() + mx), qRound(clp.y() + my)));
15847 fschmid 137
                }
15855 fschmid 138
                redrawPolygon.append(QPoint(qRound(RecordP.point(RecordP.size()-1).x() + mx), qRound(RecordP.point(RecordP.size()-1).y() + my)));
15847 fschmid 139
//FIXME         
140
                m_canvas->m_viewMode.operItemResizing = true;
141
                QRect bRect = m_canvas->redrawPolygon().boundingRect();
142
                m_view->updateCanvas(bRect);
143
                return;
144
        }
145
 
15851 jghali 146
        if (GetItem(&currItem))
15847 fschmid 147
        {
148
                newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
149
                newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
150
 
151
                if (m_doc->DragP)
152
                        return;
153
 
154
                if ((!m_MouseButtonPressed) && (m_doc->appMode != modeDrawBezierLine))
155
                {
156
                        if (m_doc->m_Selection->isMultipleSelection())
157
                        {
158
                                setModeCursor();
159
                                return;
160
                        }
161
                        for (int a = 0; a < m_doc->m_Selection->count(); ++a)
162
                        {
163
                                currItem = m_doc->m_Selection->itemAt(a);
164
                                if (currItem->locked())
165
                                        break;
166
                                setModeCursor();
167
                        }
168
                }
169
        }
170
        else
171
        {
15851 jghali 172
                if ((m_MouseButtonPressed) && (m->buttons() & Qt::LeftButton))
15847 fschmid 173
                {
174
                        newX = qRound(mousePointDoc.x()); //m_view->translateToDoc(m->x(), m->y()).x());
175
                        newY = qRound(mousePointDoc.y()); //m_view->translateToDoc(m->x(), m->y()).y());
176
                        SeRx = newX;
177
                        SeRy = newY;
17317 fschmid 178
                        QPoint startP = m_canvas->canvasToGlobal(m_doc->appMode == modeDrawTable2 ? QPointF(Dxp, Dyp) : QPointF(Mxp, Myp));
18353 fschmid 179
                        m_view->redrawMarker->setGeometry(QRect(m_view->mapFromGlobal(startP), m_view->mapFromGlobal(m->globalPos())).normalized());
18438 craig 180
                        m_view->setRedrawMarkerShown(true);
15847 fschmid 181
                        m_view->HaveSelRect = true;
182
                        return;
183
                }
184
        }
185
}
186
 
187
void CalligraphicMode::mousePressEvent(QMouseEvent *m)
188
{
189
        const FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
190
        double Rxp = 0;
191
        double Ryp = 0;
192
        FPoint npf, npf2;
193
        QRect tx;
194
        QTransform pm;
195
        m_MouseButtonPressed = true;
196
        m_view->HaveSelRect = false;
197
        m_doc->DragP = false;
198
        m_doc->leaveDrag = false;
199
        m->accept();
200
        m_view->registerMousePress(m->globalPos());
201
        Mxp = mousePointDoc.x(); //qRound(m->x()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.x());
202
        Myp = mousePointDoc.y(); //qRound(m->y()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.y());
203
        QRect mpo(m->x()-m_doc->guidesPrefs().grabRadius, m->y()-m_doc->guidesPrefs().grabRadius, m_doc->guidesPrefs().grabRadius*2, m_doc->guidesPrefs().grabRadius*2);
204
        Rxp = m_doc->ApplyGridF(FPoint(Mxp, Myp)).x();
205
        Mxp = qRound(Rxp);
206
        Ryp = m_doc->ApplyGridF(FPoint(Mxp, Myp)).y();
207
        Myp = qRound(Ryp);
208
        SeRx = Mxp;
209
        SeRy = Myp;
210
        if (m->button() == Qt::MidButton)
211
        {
212
                m_view->MidButt = true;
213
                if (m->modifiers() & Qt::ControlModifier)
214
                        m_view->DrawNew();
215
                return;
216
        }
217
        if (m->button() != Qt::LeftButton)
218
        {
219
                m_view->stopGesture();
220
                return;
221
        }
222
        RecordP.resize(0);
223
        m_view->Deselect(false);
224
        Mxp = mousePointDoc.x(); //qRound(m->x()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.x());
225
        Myp = mousePointDoc.y(); //qRound(m->y()/m_canvas->scale() + 0*m_doc->minCanvasCoordinate.y());
226
        SeRx = Mxp;
227
        SeRy = Myp;
228
        m_canvas->setRenderModeFillBuffer();
17709 craig 229
        undoManager->setUndoEnabled(false);
15847 fschmid 230
}
231
 
232
 
233
 
234
void CalligraphicMode::mouseReleaseEvent(QMouseEvent *m)
235
{
17709 craig 236
        undoManager->setUndoEnabled(true);
15847 fschmid 237
        PageItem *currItem;
238
        m_MouseButtonPressed = false;
239
        m_canvas->resetRenderMode();
240
        m->accept();
241
 
242
        if (m_doc->appMode == modeDrawCalligraphicLine)
243
        {
244
                if (RecordP.size() > 1)
245
                {
17747 craig 246
                        UndoTransaction *createTransaction = NULL;
247
                        if(UndoManager::undoEnabled())
248
                                createTransaction = new UndoTransaction(UndoManager::instance()->beginTransaction());
19378 craig 249
                        uint z = m_doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, Mxp, Myp, 1, 1, m_doc->itemToolPrefs().calligraphicPenLineWidth, m_doc->itemToolPrefs().calligraphicPenFillColor, m_doc->itemToolPrefs().calligraphicPenLineColor, true);
15847 fschmid 250
                        currItem = m_doc->Items->at(z);
251
                        currItem->PoLine.resize(0);
252
                        QList<QPointF> clipU;
253
                        QList<QPointF> clipL;
19378 craig 254
                        double mx = sin(m_doc->itemToolPrefs().calligraphicPenAngle / 180.0 * M_PI) * (m_doc->itemToolPrefs().calligraphicPenWidth / 2.0);
255
                        double my = cos(m_doc->itemToolPrefs().calligraphicPenAngle / 180.0 * M_PI) * (m_doc->itemToolPrefs().calligraphicPenWidth / 2.0);
18114 jghali 256
                        for (int px = 0; px < RecordP.size()-1; ++px)
15847 fschmid 257
                        {
258
                                FPoint clp = RecordP.point(px);
259
                                clipU.append(QPointF(clp.x() - mx, clp.y() - my));
260
                                clipL.prepend(QPointF(clp.x() + mx, clp.y() + my));
261
                        }
262
                        QPainterPath ppU = bezierFit(clipU, 5.0);
263
                        QPainterPath ppL = bezierFit(clipL, 5.0);
264
                        QPainterPath pp;
265
                        pp.addPath(ppU);
266
                        pp.connectPath(ppL);
267
                        pp.closeSubpath();
268
                        currItem->PoLine.fromQPainterPath(pp);
269
                        FPoint tp2(getMinClipF(&currItem->PoLine));
270
                        currItem->setXYPos(tp2.x(), tp2.y(), true);
271
                        currItem->PoLine.translate(-tp2.x(), -tp2.y());
272
                        FPoint tp(getMaxClipF(&currItem->PoLine));
16943 fschmid 273
                        m_doc->SizeItem(tp.x(), tp.y(), currItem, false, false, false);
15847 fschmid 274
                        m_doc->AdjustItemSize(currItem);
275
                        m_doc->m_Selection->clear();
276
                        m_doc->m_Selection->addItem(currItem);
277
                        currItem->ClipEdited = true;
278
                        currItem->FrameType = 3;
279
                        currItem->OwnPage = m_doc->OnPage(currItem);
19378 craig 280
                        currItem->PLineArt = Qt::PenStyle(m_doc->itemToolPrefs().calligraphicPenStyle);
281
                        currItem->setFillShade(m_doc->itemToolPrefs().calligraphicPenFillColorShade);
282
                        currItem->setLineShade(m_doc->itemToolPrefs().calligraphicPenLineColorShade);
15847 fschmid 283
                        currItem->setFillEvenOdd(true);
284
                        m_view->resetMousePressed();
285
                        currItem->checkChanges();
286
                        QString targetName = Um::ScratchSpace;
287
                        if (currItem->OwnPage > -1)
288
                                targetName = m_doc->Pages->at(currItem->OwnPage)->getUName();
17747 craig 289
                        if(createTransaction)
290
                        {
291
                                createTransaction->commit(targetName, currItem->getUPixmap(), Um::Create + " " + currItem->getUName(),  "", Um::ICreate);
292
                                delete createTransaction;
293
                                createTransaction = NULL;
294
                        }
15847 fschmid 295
                        //FIXME 
296
                        m_canvas->m_viewMode.operItemResizing = false;
297
                        m_doc->changed();
298
                }
299
                if (!PrefsManager::instance()->appPrefs.uiPrefs.stickyTools)
300
                {
301
                        m_view->requestMode(modeNormal);
302
                }
303
                else
304
                        m_view->requestMode(m_doc->appMode);
305
                return;
306
        }
307
 
308
        m_canvas->setRenderModeUseBuffer(false);
309
 
310
        m_doc->DragP = false;
311
        m_doc->leaveDrag = false;
312
        m_view->MidButt = false;
313
        if (m_view->groupTransactionStarted())
314
        {
315
                for (int i = 0; i < m_doc->m_Selection->count(); ++i)
316
                        m_doc->m_Selection->itemAt(i)->checkChanges(true);
317
                m_view->endGroupTransaction();
318
        }
319
 
320
        for (int i = 0; i < m_doc->m_Selection->count(); ++i)
321
                m_doc->m_Selection->itemAt(i)->checkChanges(true);
322
 
323
        //Commit drag created items to undo manager.
324
        if (m_doc->m_Selection->itemAt(0)!=NULL)
325
        {
16943 fschmid 326
                m_doc->itemAddCommit(m_doc->m_Selection->itemAt(0));
15847 fschmid 327
        }
328
        //Make sure the Zoom spinbox and page selector dont have focus if we click on the canvas
18972 craig 329
        m_view->m_ScMW->zoomSpinBox->clearFocus();
330
        m_view->m_ScMW->pageSelector->clearFocus();
15847 fschmid 331
        if (m_doc->m_Selection->itemAt(0) != 0) // is there the old clip stored for the undo action
332
        {
333
                currItem = m_doc->m_Selection->itemAt(0);
334
                m_doc->nodeEdit.finishTransaction(currItem);
335
        }
336
}
337
 
338
void CalligraphicMode::selectPage(QMouseEvent *m)
339
{
340
        m_MouseButtonPressed = true;
341
        FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
342
        Mxp = mousePointDoc.x(); //static_cast<int>(m->x()/m_canvas->scale());
343
        Myp = mousePointDoc.y(); //static_cast<int>(m->y()/m_canvas->scale());
344
        QRect mpo(m->x()-m_doc->guidesPrefs().grabRadius, m->y()-m_doc->guidesPrefs().grabRadius, m_doc->guidesPrefs().grabRadius*2, m_doc->guidesPrefs().grabRadius*2);
345
        m_doc->nodeEdit.deselect();
346
        m_view->Deselect(false);
347
        if (!m_doc->masterPageMode())
348
        {
349
                int i = m_doc->OnPage(Mxp, Myp);
350
                if (i!=-1)
351
                {
352
                        uint docCurrPageNo=m_doc->currentPageNumber();
353
                        uint j=static_cast<uint>(i);
354
                        if (docCurrPageNo != j)
355
                        {
356
                                m_doc->setCurrentPage(m_doc->Pages->at(j));
18976 craig 357
                                m_view->m_ScMW->slotSetCurrentPage(j);
15847 fschmid 358
                                m_view->DrawNew();
359
                        }
360
                }
361
        }
362
}