diff --git a/plugins/tools/selectiontools/KisToolSelectMagnetic.cc b/plugins/tools/selectiontools/KisToolSelectMagnetic.cc index f04edf30e4..9dd0753ef8 100644 --- a/plugins/tools/selectiontools/KisToolSelectMagnetic.cc +++ b/plugins/tools/selectiontools/KisToolSelectMagnetic.cc @@ -1,321 +1,322 @@ /* * Copyright (c) 2019 Kuntal Majumder * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "KisToolSelectMagnetic.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kis_painter.h" #include #include "canvas/kis_canvas2.h" #include "kis_pixel_selection.h" #include "kis_selection_tool_helper.h" #include "kis_algebra_2d.h" #define FEEDBACK_LINE_WIDTH 2 KisToolSelectMagnetic::KisToolSelectMagnetic(KoCanvasBase *canvas) : KisToolSelect(canvas, - KisCursor::load("tool_magnetic_selection_cursor.svg", 16, 16), + KisCursor::load("tool_magnetic_selection_cursor.png", 5, 5), i18n("Magnetic Selection")), m_continuedMode(false), m_complete(true), m_radius(20), m_threshold(100), m_checkPoint(-1) { } void KisToolSelectMagnetic::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Control) { m_continuedMode = true; } KisToolSelect::keyPressEvent(event); } void KisToolSelectMagnetic::keyReleaseEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Control || !(event->modifiers() & Qt::ControlModifier)) { m_continuedMode = false; if (mode() != PAINT_MODE && !m_points.isEmpty()) { finishSelectionAction(); } } KisToolSelect::keyReleaseEvent(event); } //the cursor is still tracked even when no mousebutton is pressed void KisToolSelectMagnetic::mouseMoveEvent(KoPointerEvent *event) { KisToolSelect::mouseMoveEvent(event); if(m_complete) return; m_lastCursorPos = convertToPixelCoord(event); QPoint current((int)m_lastCursorPos.x(), (int)m_lastCursorPos.y()); vQPointF pointSet = m_worker.computeEdge(m_radius, m_lastAnchor, current); m_points.resize(m_checkPoint+1); m_points.append(pointSet); + int lastCheckPoint = m_checkPoint; + for(int i=m_points.count()-1; i>m_checkPoint; i--){ QPoint pointInQuestion(m_points[i].x(), m_points[i].y()); if(m_worker.intensity(pointInQuestion) >= m_threshold){ m_checkPoint = i; m_lastAnchor = pointInQuestion; break; } } - - for(int i=0; i < m_checkPoint; i++){ - - if((m_checkPoint - i)%m_radius == 0){ + for(int i=lastCheckPoint; i < m_checkPoint; i++){ + int temp = m_checkPoint - i; + if(temp%m_radius == 0 && temp != 0){ m_lastAnchor = m_points[i].toPoint(); m_anchorPoints.push_back(i); } } m_paintPath = QPainterPath(); m_paintPath.moveTo(pixelToView(m_points[0])); for(int i=1; i 0 && m_snapBound.contains(m_lastAnchor)){ m_complete = true; finishSelectionAction(); return; } m_anchorPoints.push_back(m_checkPoint); m_complete = false; } //drag while primary mouse button is pressed void KisToolSelectMagnetic::continuePrimaryAction(KoPointerEvent *event) { KisToolSelectBase::continuePrimaryAction(event); } //release primary mouse button void KisToolSelectMagnetic::endPrimaryAction(KoPointerEvent *event) { KisToolSelectBase::endPrimaryAction(event); } void KisToolSelectMagnetic::finishSelectionAction() { KisCanvas2 * kisCanvas = dynamic_cast(canvas()); KIS_ASSERT_RECOVER_RETURN(kisCanvas); kisCanvas->updateCanvas(); setMode(KisTool::HOVER_MODE); QRectF boundingViewRect = pixelToView(KisAlgebra2D::accumulateBounds(m_points)); KisSelectionToolHelper helper(kisCanvas, kundo2_i18n("Select by Outline")); if (m_points.count() > 2 && !helper.tryDeselectCurrentSelection(boundingViewRect, selectionAction())) { QApplication::setOverrideCursor(KisCursor::waitCursor()); const SelectionMode mode = helper.tryOverrideSelectionMode(kisCanvas->viewManager()->selection(), selectionMode(), selectionAction()); if (mode == PIXEL_SELECTION) { KisPixelSelectionSP tmpSel = KisPixelSelectionSP(new KisPixelSelection()); KisPainter painter(tmpSel); painter.setPaintColor(KoColor(Qt::black, tmpSel->colorSpace())); painter.setAntiAliasPolygonFill(antiAliasSelection()); painter.setFillStyle(KisPainter::FillStyleForegroundColor); painter.setStrokeStyle(KisPainter::StrokeStyleNone); painter.paintPolygon(m_points); QPainterPath cache; cache.addPolygon(m_points); cache.closeSubpath(); tmpSel->setOutlineCache(cache); helper.selectPixelSelection(tmpSel, selectionAction()); } else { KoPathShape* path = new KoPathShape(); path->setShapeId(KoPathShapeId); QTransform resolutionMatrix; resolutionMatrix.scale(1 / currentImage()->xRes(), 1 / currentImage()->yRes()); path->moveTo(resolutionMatrix.map(m_points[0])); for (int i = 1; i < m_points.count(); i++) path->lineTo(resolutionMatrix.map(m_points[i])); path->close(); path->normalize(); helper.addSelectionShape(path, selectionAction()); } QApplication::restoreOverrideCursor(); } m_points.clear(); m_anchorPoints.clear(); m_paintPath = QPainterPath(); } void KisToolSelectMagnetic::paint(QPainter& gc, const KoViewConverter &converter) { Q_UNUSED(converter); if ((mode() == KisTool::PAINT_MODE || m_continuedMode) && !m_points.isEmpty()) { QPainterPath outline = m_paintPath; if (m_continuedMode && mode() != KisTool::PAINT_MODE) { outline.lineTo(pixelToView(m_lastCursorPos)); } paintToolOutline(&gc, outline); Q_FOREACH(const int pt, m_anchorPoints){ QRect tempRect(QPoint(0,0),QSize(1, 1)); tempRect.moveTo(m_points[pt].toPoint()); gc.drawRect(pixelToView(tempRect)); } } } void KisToolSelectMagnetic::updateFeedback() { if (m_points.count() > 1) { qint32 lastPointIndex = m_points.count() - 1; QRectF updateRect = QRectF(m_points[lastPointIndex - 1], m_points[lastPointIndex]).normalized(); updateRect = kisGrowRect(updateRect, FEEDBACK_LINE_WIDTH); updateCanvasPixelRect(updateRect); } } void KisToolSelectMagnetic::updateContinuedMode() { if (!m_points.isEmpty()) { qint32 lastPointIndex = m_points.count() - 1; QRectF updateRect = QRectF(m_points[lastPointIndex - 1], m_lastCursorPos).normalized(); updateRect = kisGrowRect(updateRect, FEEDBACK_LINE_WIDTH); updateCanvasPixelRect(updateRect); } } void KisToolSelectMagnetic::activate(KoToolBase::ToolActivation activation, const QSet &shapes) { m_worker = KisMagneticWorker(image()->projection()); KisToolSelect::activate(activation, shapes); } void KisToolSelectMagnetic::deactivate() { KisCanvas2 * kisCanvas = dynamic_cast(canvas()); KIS_ASSERT_RECOVER_RETURN(kisCanvas); kisCanvas->updateCanvas(); m_continuedMode = false; m_complete = true; KisTool::deactivate(); } void KisToolSelectMagnetic::requestUndoDuringStroke() { if(m_complete) return; m_anchorPoints.pop_back(); m_lastAnchor = m_points[m_anchorPoints.last()].toPoint(); m_checkPoint = m_anchorPoints.last(); updateCanvasPixelRect(image()->bounds()); } void KisToolSelectMagnetic::requestStrokeEnd() { if(m_complete) return; m_complete = true; finishSelectionAction(); } void KisToolSelectMagnetic::requestStrokeCancellation() { setMode(KisTool::HOVER_MODE); m_complete = true; m_points.clear(); m_anchorPoints.clear(); m_paintPath = QPainterPath(); updateCanvasPixelRect(image()->bounds()); } void KisToolSelectMagnetic::resetCursorStyle() { if (selectionAction() == SELECTION_ADD) { useCursor(KisCursor::load("tool_outline_selection_cursor_add.png", 6, 6)); } else if (selectionAction() == SELECTION_SUBTRACT) { useCursor(KisCursor::load("tool_outline_selection_cursor_sub.png", 6, 6)); } else { KisToolSelect::resetCursorStyle(); } } diff --git a/plugins/tools/selectiontools/selectiontools.qrc b/plugins/tools/selectiontools/selectiontools.qrc index 1950cec996..cfa21390b0 100644 --- a/plugins/tools/selectiontools/selectiontools.qrc +++ b/plugins/tools/selectiontools/selectiontools.qrc @@ -1,25 +1,24 @@ - - - + + tool_contiguous_selection_cursor_add.png tool_contiguous_selection_cursor.png tool_contiguous_selection_cursor_sub.png tool_elliptical_selection_cursor_add.png tool_elliptical_selection_cursor.png tool_elliptical_selection_cursor_sub.png tool_eraser_selection_cursor.png - tool_magnetic_selection_cursor.svg tool_outline_selection_cursor_add.png tool_outline_selection_cursor.png tool_outline_selection_cursor_sub.png tool_polygonal_selection_cursor_add.png tool_polygonal_selection_cursor.png tool_polygonal_selection_cursor_sub.png tool_rectangular_selection_cursor_add.png tool_rectangular_selection_cursor.png tool_rectangular_selection_cursor_sub.png tool_similar_selection_cursor_add.png tool_similar_selection_cursor.png tool_similar_selection_cursor_sub.png + tool_magnetic_selection_cursor.png diff --git a/plugins/tools/selectiontools/tool_magnetic_selection_cursor.png b/plugins/tools/selectiontools/tool_magnetic_selection_cursor.png new file mode 100644 index 0000000000..4e4c7c4e41 Binary files /dev/null and b/plugins/tools/selectiontools/tool_magnetic_selection_cursor.png differ diff --git a/plugins/tools/selectiontools/tool_magnetic_selection_cursor.svg b/plugins/tools/selectiontools/tool_magnetic_selection_cursor.svg deleted file mode 100644 index 1fdccafb38..0000000000 --- a/plugins/tools/selectiontools/tool_magnetic_selection_cursor.svg +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - -