Git commit e43ebb6cf42be3b8b1c480264e8aa77445e6f9a9 by Dmitry Kazakov. Committed on 04/01/2017 at 10:10. Pushed by dkazakov into branch 'krita/3.1'. [FEATURE] Ctrl-key continued mode for Outline Selection Tool This is a special mode of the outline selection tool. If you press Ctrl while dragging the cursor, you can raise the stylus from the tablet surface and have a bit of rest. Then just continue the selection from the arbitrary point and the new selection segment will be connected to the older one with a straight line. This shortcut basically temporary switches outline tool into polygonal tool. That is extremely useful for painters who do flat-filled art. CC:kimageshop@kde.org M +70 -11 plugins/tools/selectiontools/kis_tool_select_outline.cc M +9 -1 plugins/tools/selectiontools/kis_tool_select_outline.h https://commits.kde.org/krita/e43ebb6cf42be3b8b1c480264e8aa77445e6f9a9 diff --git a/plugins/tools/selectiontools/kis_tool_select_outline.cc b/plug= ins/tools/selectiontools/kis_tool_select_outline.cc index 4ff3063ac89..e938325bace 100644 --- a/plugins/tools/selectiontools/kis_tool_select_outline.cc +++ b/plugins/tools/selectiontools/kis_tool_select_outline.cc @@ -59,7 +59,7 @@ KisToolSelectOutline::KisToolSelectOutline(KoCanvasBase *= canvas) : KisToolSelect(canvas, KisCursor::load("tool_outline_selection_cursor.png", 5= , 5), i18n("Outline Selection")), - m_paintPath(new QPainterPath()) + m_continuedMode(false) { connect(&m_widgetHelper, &KisSelectionToolConfigWidgetHelper::selectio= nActionChanged, this, &KisToolSelectOutline::setSelectionAction); @@ -67,7 +67,37 @@ KisToolSelectOutline::KisToolSelectOutline(KoCanvasBase = * canvas) = KisToolSelectOutline::~KisToolSelectOutline() { - delete m_paintPath; +} + +void KisToolSelectOutline::keyPressEvent(QKeyEvent *event) +{ + if (event->key() =3D=3D Qt::Key_Control) { + m_continuedMode =3D true; + } + + KisToolSelect::keyPressEvent(event); +} + +void KisToolSelectOutline::keyReleaseEvent(QKeyEvent *event) +{ + if (event->key() =3D=3D Qt::Key_Control || + !(event->modifiers() & Qt::ControlModifier)) { + + m_continuedMode =3D false; + if (mode() !=3D PAINT_MODE && !m_points.isEmpty()) { + finishSelectionAction(); + } + } + + KisToolSelect::keyReleaseEvent(event); +} + +void KisToolSelectOutline::mouseMoveEvent(KoPointerEvent *event) +{ + m_lastCursorPos =3D convertToPixelCoord(event); + if (m_continuedMode && mode() !=3D PAINT_MODE) { + updateContinuedMode(); + } } = void KisToolSelectOutline::beginPrimaryAction(KoPointerEvent *event) @@ -81,10 +111,13 @@ void KisToolSelectOutline::beginPrimaryAction(KoPointe= rEvent *event) = setMode(KisTool::PAINT_MODE); = - m_points.clear(); - m_points.append(convertToPixelCoord(event)); - m_paintPath->moveTo(pixelToView(convertToPixelCoord(event))); + if (m_continuedMode && !m_points.isEmpty()) { + m_paintPath.lineTo(pixelToView(convertToPixelCoord(event))); + } else { + m_paintPath.moveTo(pixelToView(convertToPixelCoord(event))); + } = + m_points.append(convertToPixelCoord(event)); } = void KisToolSelectOutline::continuePrimaryAction(KoPointerEvent *event) @@ -93,7 +126,7 @@ void KisToolSelectOutline::continuePrimaryAction(KoPoint= erEvent *event) KisToolSelectBase::continuePrimaryAction(event); = QPointF point =3D convertToPixelCoord(event); - m_paintPath->lineTo(pixelToView(point)); + m_paintPath.lineTo(pixelToView(point)); m_points.append(point); updateFeedback(); = @@ -107,6 +140,13 @@ void KisToolSelectOutline::endPrimaryAction(KoPointerE= vent *event) KisToolSelectBase::endPrimaryAction(event); setMode(KisTool::HOVER_MODE); = + if (!m_continuedMode) { + finishSelectionAction(); + } +} + +void KisToolSelectOutline::finishSelectionAction() +{ KisCanvas2 * kisCanvas =3D dynamic_cast(canvas()); KIS_ASSERT_RECOVER_RETURN(kisCanvas); kisCanvas->updateCanvas(); @@ -154,16 +194,21 @@ void KisToolSelectOutline::endPrimaryAction(KoPointer= Event *event) } = m_points.clear(); - delete m_paintPath; - m_paintPath =3D new QPainterPath(); + m_paintPath =3D QPainterPath(); } = void KisToolSelectOutline::paint(QPainter& gc, const KoViewConverter &conv= erter) { Q_UNUSED(converter); = - if (mode() =3D=3D KisTool::PAINT_MODE && !m_points.isEmpty()) { - paintToolOutline(&gc, *m_paintPath); + if ((mode() =3D=3D KisTool::PAINT_MODE || m_continuedMode) && + !m_points.isEmpty()) { + + QPainterPath outline =3D m_paintPath; + if (m_continuedMode && mode() !=3D KisTool::PAINT_MODE) { + outline.lineTo(pixelToView(m_lastCursorPos)); + } + paintToolOutline(&gc, outline); } } = @@ -175,7 +220,19 @@ void KisToolSelectOutline::updateFeedback() qint32 lastPointIndex =3D m_points.count() - 1; = QRectF updateRect =3D QRectF(m_points[lastPointIndex - 1], m_point= s[lastPointIndex]).normalized(); - updateRect.adjust(-FEEDBACK_LINE_WIDTH, -FEEDBACK_LINE_WIDTH, FEED= BACK_LINE_WIDTH, FEEDBACK_LINE_WIDTH); + updateRect =3D kisGrowRect(updateRect, FEEDBACK_LINE_WIDTH); + + updateCanvasPixelRect(updateRect); + } +} + +void KisToolSelectOutline::updateContinuedMode() +{ + if (!m_points.isEmpty()) { + qint32 lastPointIndex =3D m_points.count() - 1; + + QRectF updateRect =3D QRectF(m_points[lastPointIndex - 1], m_lastC= ursorPos).normalized(); + updateRect =3D kisGrowRect(updateRect, FEEDBACK_LINE_WIDTH); = updateCanvasPixelRect(updateRect); } @@ -187,6 +244,8 @@ void KisToolSelectOutline::deactivate() KIS_ASSERT_RECOVER_RETURN(kisCanvas); kisCanvas->updateCanvas(); = + m_continuedMode =3D false; + KisTool::deactivate(); } = diff --git a/plugins/tools/selectiontools/kis_tool_select_outline.h b/plugi= ns/tools/selectiontools/kis_tool_select_outline.h index bbda8baabdc..c0f492acd64 100644 --- a/plugins/tools/selectiontools/kis_tool_select_outline.h +++ b/plugins/tools/selectiontools/kis_tool_select_outline.h @@ -43,6 +43,10 @@ public: void endPrimaryAction(KoPointerEvent *event); virtual void paint(QPainter& gc, const KoViewConverter &converter); = + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *event); + + void mouseMoveEvent(KoPointerEvent *event); = public Q_SLOTS: virtual void deactivate(); @@ -52,11 +56,15 @@ protected: using KisToolSelectBase::m_widgetHelper; = private: + void finishSelectionAction(); void updateFeedback(); + void updateContinuedMode(); void updateCanvas(); = - QPainterPath * m_paintPath; + QPainterPath m_paintPath; vQPointF m_points; + bool m_continuedMode; + QPointF m_lastCursorPos; }; = class KisToolSelectOutlineFactory : public KoToolFactoryBase