Subversion Repositories Scribus

Rev

Rev 24847 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
23613 jghali 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
#include "canvasgesture_linemove.h"
17
 
18
//#include <QDebug>
19
#include <QMouseEvent>
20
#include <QPainter>
21
#include <QPen>
22
 
23
#include "canvas.h"
24
#include "pageitem_line.h"
25
#include "scribusview.h"
26
#include "selection.h"
27
#include "undomanager.h"
28
#include "util_math.h"
29
 
30
void LineMove::clear()
31
{
32
        m_haveLineItem = false;
23415 jghali 33
        if (m_transaction.isStarted())
34
        {
35
                m_transaction.cancel();
36
                m_transaction.reset();
23613 jghali 37
        }
38
}
39
 
40
 
41
void LineMove::prepare(QPointF start, QPointF end)
42
{
43
        m_haveLineItem = false;
44
        setStartPoint(start);
45
        setStartPoint(end);
46
}
47
 
48
 
49
void LineMove::prepare(PageItem_Line* line, bool useOriginAsEndpoint)
50
{
51
        m_haveLineItem = (line != nullptr);
52
        if (!m_haveLineItem)
53
                return;
54
        m_useOriginAsEndpoint = useOriginAsEndpoint;
55
        m_line = line;
56
        setStartPoint(QPointF(m_line->xPos(), m_line->yPos()));
57
        setEndPoint(QPointF(m_line->xPos() + m_line->width(), m_line->yPos()));
58
        setRotation(m_line->rotation());
59
        if (m_useOriginAsEndpoint)
60
        {
61
                QPointF tmp = startPoint();
62
                setStartPoint(endPoint());
63
                setEndPoint(tmp);
64
        }
65
}
66
 
67
 
68
double LineMove::rotation() const
69
{
70
        double rot = xy2Deg(m_bounds.width(), m_bounds.height());
71
        if (rot < 0.0)
72
                return 360 + rot;
73
        return rot;
74
}
75
 
76
 
77
void LineMove::setRotation(double rot)
78
{
79
        m_bounds.setSize(length() * QSizeF(cosd(rot), sind(rot)));
80
}
81
 
82
 
83
double LineMove::length() const
84
{
85
        return qMax(0.01, distance(m_bounds.width(), m_bounds.height()));
86
}
87
 
88
 
89
void LineMove::setStartPoint(QPointF p)
90
{
91
        m_bounds.setTopLeft(p);
92
}
93
 
94
 
95
void LineMove::setEndPoint(QPointF p)
96
{
97
        m_bounds.setBottomRight(p);
98
}
99
 
100
 
101
void LineMove::activate(bool forGesture)
102
{
103
        CanvasGesture::activate(forGesture);
104
}
105
 
106
 
107
 
108
void LineMove::deactivate(bool forGesture)
109
{
110
//      qDebug() << "LineMove::deactivate" << flag;
23415 jghali 111
        if (!forGesture)
23613 jghali 112
                clear();
113
        CanvasGesture::deactivate(forGesture);
114
}
115
 
116
 
117
 
118
void LineMove::drawControls(QPainter* p)
119
{
120
        p->save();
121
        p->scale(m_canvas->scale(), m_canvas->scale());
122
        p->translate(-m_doc->minCanvasCoordinate.x(), -m_doc->minCanvasCoordinate.y());
123
        p->setBrush(Qt::NoBrush);
124
        p->setPen(QPen(Qt::black, 1.0 / m_canvas->scale(), Qt::DotLine, Qt::FlatCap, Qt::MiterJoin));
125
        p->drawLine(m_bounds.topLeft(), m_bounds.bottomRight());
126
        p->restore();
127
}
128
 
129
void LineMove::mousePressEvent(QMouseEvent *m)
130
{
131
        PageItem_Line* line = m_doc->m_Selection->count() == 1 ? m_doc->m_Selection->itemAt(0)->asLine() : nullptr;
132
        if (line)
133
        {
24846 craig 134
                bool hitsOrigin = m_canvas->hitsCanvasPoint(m->globalPosition(), line->xyPos());
23613 jghali 135
                prepare(line, hitsOrigin);
136
                // now we also know the line's endpoint:
25013 jghali 137
                bool hitsEnd = m_canvas->hitsCanvasPoint(m->globalPosition(), endPoint());
23613 jghali 138
                m_haveLineItem = hitsOrigin || hitsEnd;
139
        }
140
        else
141
        {
24846 craig 142
                FPoint point = m_canvas->globalToCanvas(m->globalPosition());
23613 jghali 143
                setStartPoint(QPointF(point.x(), point.y()));
144
                setEndPoint(QPointF(point.x(), point.y()));
145
                m_haveLineItem = false;
146
        }
147
        if (m_haveLineItem)
148
        {
23415 jghali 149
                if (!m_transaction)
150
                {
151
                        QString targetName = line->getUName();
152
                        QPixmap* targetIcon = line->getUPixmap();
153
                        m_transaction = Um::instance()->beginTransaction(targetName, targetIcon, Um::Resize, "", Um::IResize);
23613 jghali 154
                }      
155
                adjustBounds(m, false);
156
                m_initialBounds = m_bounds;
157
                m->accept();
158
        }
159
}
160
 
161
void LineMove::mouseMoveEvent(QMouseEvent *m)
162
{
163
        adjustBounds(m);
164
        if (m_haveLineItem)
165
        {
166
                doResize();
167
                double angle = rotation();
168
                if (angle > 0)
169
                        angle = 360 - angle;
24847 jghali 170
                m_canvas->displaySizeHUD(m->globalPosition().toPoint(), length(), fabs(angle), true);
23613 jghali 171
        }
172
        m->accept();
173
        m_canvas->repaint();
174
}
175
 
176
void LineMove::mouseReleaseEvent(QMouseEvent *m)
177
{
178
        adjustBounds(m);
179
        if (m_haveLineItem)
180
        {
181
                if (m_bounds != m_initialBounds)
182
                        doResize();
183
                m_doc->setRedrawBounding(m_line);
184
                m_view->resetMousePressed();
185
                m_line->checkChanges();
186
                m_line->update();
187
        }
23415 jghali 188
        if (m_transaction.isStarted())
189
        {
190
                m_transaction.commit();
191
                m_transaction.reset();
23613 jghali 192
        }
193
        m->accept();
194
        m_canvas->update();
195
//      qDebug() << "LineMove::mouseRelease" << m_line->xPos() << "," << m_line->yPos() << "@" << m_line->rotation() << m_line->width() << "x" << m_line->height();
196
        m_view->stopGesture();
197
}
198
 
199
 
200
void LineMove::doResize()
201
{
202
        if (m_useOriginAsEndpoint)
203
        {
204
                m_line->setXYPos(m_bounds.right(), m_bounds.bottom());
205
                double rot = rotation();
206
                m_line->setRotation(rot < 180? rot + 180 : rot - 180);
207
        }
208
        else
209
        {
210
                m_line->setXYPos(m_bounds.x(), m_bounds.y());
211
                m_line->setRotation(rotation());
212
        }
213
        m_line->setWidth(length());
214
        m_line->setHeight(1.0);
215
        m_line->updateClip();
216
//      qDebug() << "LineMove::doresize" << m_line->xPos() << "," << m_line->yPos() << "@" << m_line->rotation() << m_line->width() << "x" << m_line->height();
217
}
218
 
219
void LineMove::adjustBounds(QMouseEvent *m, bool updateCanvas)
220
{
24846 craig 221
        FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPosition());
23613 jghali 222
        bool constrainRatio = ((m->modifiers() & Qt::ControlModifier) != Qt::NoModifier);
223
 
224
        double newX = mousePointDoc.x();
225
        double newY = mousePointDoc.y();
226
 
227
        if (m_doc->SnapGrid)
228
        {
229
                newX = qRound(newX / m_doc->guidesPrefs().minorGridSpacing) * m_doc->guidesPrefs().minorGridSpacing;
230
                newY = qRound(newY / m_doc->guidesPrefs().minorGridSpacing) * m_doc->guidesPrefs().minorGridSpacing;
231
        }
232
        //<<#8099
233
        FPoint np2 = m_doc->ApplyGridF(FPoint(newX, newY));
234
        double nx = np2.x();
235
        double ny = np2.y();
236
        m_doc->ApplyGuides(&nx, &ny);
237
        m_doc->ApplyGuides(&nx, &ny,true);
238
        newX = nx;
239
        newY = ny;
240
        //>>#8099
241
 
242
        m_bounds.setBottomRight(QPointF(newX, newY));
243
        //Constrain rotation angle, when the mouse is being dragged around for a new line
244
        if (constrainRatio)
245
        {
246
                double newRot = rotation();
247
                newRot = constrainAngle(newRot, m_doc->opToolPrefs().constrain);
248
                setRotation(newRot);
249
        }
250
        if (updateCanvas)
251
        {
252
                m_view->updateCanvas(m_bounds.normalized().adjusted(-10, -10, 20, 20));
253
        }
254
}