25
26
#include "kis_tool_ellipse.h"
30
#include <kis_debug.h>
33
#include <KoPointerEvent.h>
34
27
#include <KoCanvasBase.h>
35
#include <KoCanvasController.h>
28
#include <KoShapeController.h>
37
30
#include <kis_selection.h>
38
#include <kis_painter.h>
39
#include <kis_paintop_registry.h>
40
#include <kis_cursor.h>
41
#include <kis_layer.h>
43
#include <config-opengl.h>
31
#include <kis_shape_tool_helper.h>
32
#include <kis_paint_device.h>
33
#include <kis_paintop_preset.h>
35
#include <recorder/kis_action_recorder.h>
36
#include <recorder/kis_recorded_shape_paint_action.h>
37
#include <recorder/kis_node_query_path.h>
51
39
KisToolEllipse::KisToolEllipse(KoCanvasBase * canvas)
52
: KisToolShape(canvas, KisCursor::load("tool_ellipse_cursor.png", 6, 6)),
40
: KisToolEllipseBase(canvas, KisCursor::load("tool_ellipse_cursor.png", 6, 6))
55
42
setObjectName("tool_ellipse");
59
m_dragStart = QPointF(0, 0);
60
m_dragEnd = QPointF(0, 0);
63
45
KisToolEllipse::~KisToolEllipse()
67
void KisToolEllipse::paint(QPainter& gc, const KoViewConverter &converter)
69
Q_ASSERT(currentImage());
71
paintEllipse(gc, QRect());
75
void KisToolEllipse::mousePressEvent(KoPointerEvent *event)
77
if (!m_canvas || !currentImage()) return;
79
if (event->button() == Qt::LeftButton) {
80
QPointF pos = convertToPixelCoord(event);
82
m_dragStart = m_dragCenter = m_dragEnd = pos;
83
//draw(m_dragStart, m_dragEnd);
87
void KisToolEllipse::mouseMoveEvent(KoPointerEvent *event)
92
bound.setTopLeft(m_dragStart);
93
bound.setBottomRight(m_dragEnd);
94
m_canvas->updateCanvas(convertToPt(bound.normalized()));
96
QPointF pos = convertToPixelCoord(event);
97
// erase old lines on canvas
98
//draw(m_dragStart, m_dragEnd);
99
// move (alt) or resize ellipse
100
if (event->modifiers() & Qt::AltModifier) {
101
QPointF trans = pos - m_dragEnd;
102
m_dragStart += trans;
105
QPointF diag = pos - (event->modifiers() & Qt::ControlModifier
106
? m_dragCenter : m_dragStart);
108
if (event->modifiers() & Qt::ShiftModifier) {
109
double size = qMax(fabs(diag.x()), fabs(diag.y()));
110
double w = diag.x() < 0 ? -size : size;
111
double h = diag.y() < 0 ? -size : size;
112
diag = QPointF(w, h);
115
// resize around center point?
116
if (event->modifiers() & Qt::ControlModifier) {
117
m_dragStart = m_dragCenter - diag;
118
m_dragEnd = m_dragCenter + diag;
120
m_dragEnd = m_dragStart + diag;
123
// draw new lines on canvas
124
//draw(m_dragStart, m_dragEnd);
125
bound.setTopLeft(m_dragStart);
126
bound.setBottomRight(m_dragEnd);
128
m_canvas->updateCanvas(convertToPt(bound.normalized()));
130
m_dragCenter = QPointF((m_dragStart.x() + m_dragEnd.x()) / 2,
131
(m_dragStart.y() + m_dragEnd.y()) / 2);
135
void KisToolEllipse::mouseReleaseEvent(KoPointerEvent *event)
137
QPointF pos = convertToPixelCoord(event);
139
if (!m_canvas || !currentImage())
49
void KisToolEllipse::finishEllipse(const QRectF& rect)
142
if (m_dragging && event->button() == Qt::LeftButton) {
143
// erase old lines on canvas
144
//draw(m_dragStart, m_dragEnd);
147
if (m_dragStart == m_dragEnd)
55
KisRecordedShapePaintAction linePaintAction(KisNodeQueryPath::absolutePath(currentNode()), currentPaintOpPreset(), KisRecordedShapePaintAction::Ellipse, rect);
56
setupPaintAction(&linePaintAction);
57
image()->actionRecorder()->addAction(linePaintAction);
60
if (!currentNode()->inherits("KisShapeLayer")) {
156
61
if (!currentNode()->paintDevice())
159
64
KisPaintDeviceSP device = currentNode()->paintDevice();
161
m_painter = new KisPainter(device, currentSelection());
162
Q_CHECK_PTR(m_painter);
164
m_painter->beginTransaction(i18n("Ellipse"));
165
setupPainter(m_painter);
166
m_painter->setOpacity(m_opacity);
167
m_painter->setCompositeOp(m_compositeOp);
169
m_painter->paintEllipse(QRectF(m_dragStart, m_dragEnd));
170
QRegion bound = m_painter->dirtyRegion();
66
KisPainter painter(device, currentSelection());
68
painter.beginTransaction(i18n("Ellipse"));
69
setupPainter(&painter);
70
painter.setOpacity(m_opacity);
71
painter.setCompositeOp(m_compositeOp);
73
painter.paintEllipse(rect);
74
QRegion bound = painter.dirtyRegion();
171
75
device->setDirty(bound);
174
m_canvas->addCommand(m_painter->endTransaction());
78
canvas()->addCommand(painter.endTransaction());
179
KisToolPaint::mouseReleaseEvent(event);
80
QRectF r = convertToPt(rect);
81
KoShape* shape = KisShapeToolHelper::createEllipseShape(r);
83
QUndoCommand * cmd = canvas()->shapeController()->addShape(shape);
84
canvas()->addCommand(cmd);
184
void KisToolEllipse::paintEllipse(QPainter& gc, const QRect&)
186
QPointF viewDragStart = pixelToView(m_dragStart);
187
QPointF viewDragEnd = pixelToView(m_dragEnd);
189
#if defined(HAVE_OPENGL)
190
if (m_canvas->canvasController()->isCanvasOpenGL()) {
191
glEnable(GL_LINE_SMOOTH);
192
glEnable(GL_COLOR_LOGIC_OP);
194
glColor3f(0.501961, 1.0, 0.501961);
197
qreal x = (viewDragEnd.x() - viewDragStart.x()) * 0.5;
199
qreal y = (viewDragEnd.y() - viewDragStart.y()) * 0.5;
202
x += viewDragStart.x();
203
y += viewDragStart.y();
205
// useful for debugging
213
glVertex2d(viewDragStart.x(), viewDragStart.y());
214
glVertex2d(viewDragEnd.x(), viewDragEnd.y());
217
glVertex2d(x + a, y);
220
glVertex2d(x, y + b);
227
qreal sinbeta = sin(beta);
228
qreal cosbeta = cos(beta);
230
glBegin(GL_LINE_LOOP);
231
for (int i = 0; i < 360; i += 360.0 / steps) {
232
qreal alpha = i * (M_PI / 180) ;
233
qreal sinalpha = sin(alpha);
234
qreal cosalpha = cos(alpha);
236
qreal X = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta);
237
qreal Y = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta);
244
glDisable(GL_COLOR_LOGIC_OP);
245
glDisable(GL_LINE_SMOOTH);
251
#ifdef INDEPENDENT_CANVAS
253
path.addEllipse(QRectF(viewDragStart, viewDragEnd));
254
paintToolOutline(&gc, path);
257
QPen pen(Qt::SolidLine);
259
gc.drawEllipse(QRectF(viewDragStart, viewDragEnd));
265
88
#include "kis_tool_ellipse.moc"