diff --git a/app/.qm/pencil_ar.qm b/app/.qm/pencil_ar.qm new file mode 100644 index 0000000000..1b611f5bd4 Binary files /dev/null and b/app/.qm/pencil_ar.qm differ diff --git a/app/.qm/pencil_ca.qm b/app/.qm/pencil_ca.qm new file mode 100644 index 0000000000..efe708cefa Binary files /dev/null and b/app/.qm/pencil_ca.qm differ diff --git a/app/.qm/pencil_cs.qm b/app/.qm/pencil_cs.qm new file mode 100644 index 0000000000..e29c3865ee Binary files /dev/null and b/app/.qm/pencil_cs.qm differ diff --git a/app/.qm/pencil_da.qm b/app/.qm/pencil_da.qm new file mode 100644 index 0000000000..20d5307010 Binary files /dev/null and b/app/.qm/pencil_da.qm differ diff --git a/app/.qm/pencil_de.qm b/app/.qm/pencil_de.qm new file mode 100644 index 0000000000..f09f40b094 Binary files /dev/null and b/app/.qm/pencil_de.qm differ diff --git a/app/.qm/pencil_el.qm b/app/.qm/pencil_el.qm new file mode 100644 index 0000000000..c50b170300 Binary files /dev/null and b/app/.qm/pencil_el.qm differ diff --git a/app/.qm/pencil_en.qm b/app/.qm/pencil_en.qm new file mode 100644 index 0000000000..454ecb686f Binary files /dev/null and b/app/.qm/pencil_en.qm differ diff --git a/app/.qm/pencil_es.qm b/app/.qm/pencil_es.qm new file mode 100644 index 0000000000..9be3da8471 Binary files /dev/null and b/app/.qm/pencil_es.qm differ diff --git a/app/.qm/pencil_et.qm b/app/.qm/pencil_et.qm new file mode 100644 index 0000000000..72af467f89 Binary files /dev/null and b/app/.qm/pencil_et.qm differ diff --git a/app/.qm/pencil_fr.qm b/app/.qm/pencil_fr.qm new file mode 100644 index 0000000000..6eee6973ee Binary files /dev/null and b/app/.qm/pencil_fr.qm differ diff --git a/app/.qm/pencil_he.qm b/app/.qm/pencil_he.qm new file mode 100644 index 0000000000..e8962623e0 Binary files /dev/null and b/app/.qm/pencil_he.qm differ diff --git a/app/.qm/pencil_hu_HU.qm b/app/.qm/pencil_hu_HU.qm new file mode 100644 index 0000000000..c6156630a9 Binary files /dev/null and b/app/.qm/pencil_hu_HU.qm differ diff --git a/app/.qm/pencil_id.qm b/app/.qm/pencil_id.qm new file mode 100644 index 0000000000..af92b774f8 Binary files /dev/null and b/app/.qm/pencil_id.qm differ diff --git a/app/.qm/pencil_it.qm b/app/.qm/pencil_it.qm new file mode 100644 index 0000000000..4148448b29 Binary files /dev/null and b/app/.qm/pencil_it.qm differ diff --git a/app/.qm/pencil_ja.qm b/app/.qm/pencil_ja.qm new file mode 100644 index 0000000000..b1751af3af Binary files /dev/null and b/app/.qm/pencil_ja.qm differ diff --git a/app/.qm/pencil_kab.qm b/app/.qm/pencil_kab.qm new file mode 100644 index 0000000000..f557dd4da9 Binary files /dev/null and b/app/.qm/pencil_kab.qm differ diff --git a/app/.qm/pencil_pl.qm b/app/.qm/pencil_pl.qm new file mode 100644 index 0000000000..a1895c6fad Binary files /dev/null and b/app/.qm/pencil_pl.qm differ diff --git a/app/.qm/pencil_pt.qm b/app/.qm/pencil_pt.qm new file mode 100644 index 0000000000..1baf83fd24 Binary files /dev/null and b/app/.qm/pencil_pt.qm differ diff --git a/app/.qm/pencil_pt_BR.qm b/app/.qm/pencil_pt_BR.qm new file mode 100644 index 0000000000..6274f955cb Binary files /dev/null and b/app/.qm/pencil_pt_BR.qm differ diff --git a/app/.qm/pencil_ru.qm b/app/.qm/pencil_ru.qm new file mode 100644 index 0000000000..77aa940bb7 Binary files /dev/null and b/app/.qm/pencil_ru.qm differ diff --git a/app/.qm/pencil_sl.qm b/app/.qm/pencil_sl.qm new file mode 100644 index 0000000000..c16b0072b9 Binary files /dev/null and b/app/.qm/pencil_sl.qm differ diff --git a/app/.qm/pencil_sv.qm b/app/.qm/pencil_sv.qm new file mode 100644 index 0000000000..cb2fe255e7 Binary files /dev/null and b/app/.qm/pencil_sv.qm differ diff --git a/app/.qm/pencil_tr.qm b/app/.qm/pencil_tr.qm new file mode 100644 index 0000000000..96f994c1a6 Binary files /dev/null and b/app/.qm/pencil_tr.qm differ diff --git a/app/.qm/pencil_vi.qm b/app/.qm/pencil_vi.qm new file mode 100644 index 0000000000..e5e734588d Binary files /dev/null and b/app/.qm/pencil_vi.qm differ diff --git a/app/.qm/pencil_zh_CN.qm b/app/.qm/pencil_zh_CN.qm new file mode 100644 index 0000000000..668cbc075b Binary files /dev/null and b/app/.qm/pencil_zh_CN.qm differ diff --git a/app/.qm/pencil_zh_TW.qm b/app/.qm/pencil_zh_TW.qm new file mode 100644 index 0000000000..4fe69c833a Binary files /dev/null and b/app/.qm/pencil_zh_TW.qm differ diff --git a/app/pencil2d_arm64.pch/c++_arm64.pch b/app/pencil2d_arm64.pch/c++_arm64.pch new file mode 100644 index 0000000000..132da52d4b Binary files /dev/null and b/app/pencil2d_arm64.pch/c++_arm64.pch differ diff --git a/app/qmake_qmake_qm_files.qrc b/app/qmake_qmake_qm_files.qrc new file mode 100644 index 0000000000..c7334c3db7 --- /dev/null +++ b/app/qmake_qmake_qm_files.qrc @@ -0,0 +1,30 @@ + + +/Users/milesortolan/pencil/app/.qm/pencil_ar.qm +/Users/milesortolan/pencil/app/.qm/pencil_ca.qm +/Users/milesortolan/pencil/app/.qm/pencil_cs.qm +/Users/milesortolan/pencil/app/.qm/pencil_da.qm +/Users/milesortolan/pencil/app/.qm/pencil_de.qm +/Users/milesortolan/pencil/app/.qm/pencil_el.qm +/Users/milesortolan/pencil/app/.qm/pencil_en.qm +/Users/milesortolan/pencil/app/.qm/pencil_es.qm +/Users/milesortolan/pencil/app/.qm/pencil_et.qm +/Users/milesortolan/pencil/app/.qm/pencil_fr.qm +/Users/milesortolan/pencil/app/.qm/pencil_he.qm +/Users/milesortolan/pencil/app/.qm/pencil_hu_HU.qm +/Users/milesortolan/pencil/app/.qm/pencil_id.qm +/Users/milesortolan/pencil/app/.qm/pencil_it.qm +/Users/milesortolan/pencil/app/.qm/pencil_ja.qm +/Users/milesortolan/pencil/app/.qm/pencil_kab.qm +/Users/milesortolan/pencil/app/.qm/pencil_pl.qm +/Users/milesortolan/pencil/app/.qm/pencil_pt.qm +/Users/milesortolan/pencil/app/.qm/pencil_pt_BR.qm +/Users/milesortolan/pencil/app/.qm/pencil_ru.qm +/Users/milesortolan/pencil/app/.qm/pencil_sl.qm +/Users/milesortolan/pencil/app/.qm/pencil_sv.qm +/Users/milesortolan/pencil/app/.qm/pencil_tr.qm +/Users/milesortolan/pencil/app/.qm/pencil_vi.qm +/Users/milesortolan/pencil/app/.qm/pencil_zh_CN.qm +/Users/milesortolan/pencil/app/.qm/pencil_zh_TW.qm + + diff --git a/core_lib/core_lib_arm64.pch/c++_arm64.pch b/core_lib/core_lib_arm64.pch/c++_arm64.pch new file mode 100644 index 0000000000..1e598652f2 Binary files /dev/null and b/core_lib/core_lib_arm64.pch/c++_arm64.pch differ diff --git a/core_lib/core_lib_arm64.pch/objective-c++_arm64.pch b/core_lib/core_lib_arm64.pch/objective-c++_arm64.pch new file mode 100644 index 0000000000..b58bb5d3e6 Binary files /dev/null and b/core_lib/core_lib_arm64.pch/objective-c++_arm64.pch differ diff --git a/core_lib/src/interface/scribblearea.cpp b/core_lib/src/interface/scribblearea.cpp index 9f5a8c3e16..b7525a7776 100644 --- a/core_lib/src/interface/scribblearea.cpp +++ b/core_lib/src/interface/scribblearea.cpp @@ -1178,6 +1178,105 @@ void ScribbleArea::drawPen(QPointF thePoint, qreal brushWidth, QColor fillColor, mTiledBuffer.drawBrush(thePoint, brushWidth, Qt::NoPen, QBrush(fillColor, Qt::SolidPattern), QPainter::CompositionMode_Source, useAA); } +void ScribbleArea::snappingDrawPen(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, QColor fillColor, bool useAA) +{ + QPainterPath path; + path.moveTo(origin); + path.lineTo(currentPoint); + + // Functionality explained in drawPolyLine + BlitRect blitRect; + blitRect.extend(mEditor->view()->mapCanvasToScreen(mTiledBuffer.bounds()).toRect()); + QRect updateRect = mEditor->view()->mapCanvasToScreen(path.boundingRect()).toRect(); + blitRect.extend(updateRect); + mTiledBuffer.clear(); + + qreal distance = 4 * QLineF(currentPoint, origin).length(); + int steps = qRound(distance / brushStep); + + for (int i = 0; i < steps; i++) + { + QPointF point = origin + (i + 1) * brushStep * (currentPoint - origin) / distance; + drawPen(point, + brushWidth, + fillColor, + useAA); + } + update(blitRect.adjusted(-1, -1, 1, 1)); +} + +void ScribbleArea::snappingDrawEraser(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, qreal offset, QColor fillColor, QPainter::CompositionMode compMode, qreal opacity, bool usingFeather, bool useAA) +{ + QPainterPath path; + path.moveTo(origin); + path.lineTo(currentPoint); + + // Functionality explained in drawPolyLine + BlitRect blitRect; + blitRect.extend(mEditor->view()->mapCanvasToScreen(mTiledBuffer.bounds()).toRect()); + QRect updateRect = mEditor->view()->mapCanvasToScreen(path.boundingRect()).toRect(); + blitRect.extend(updateRect); + mTiledBuffer.clear(); + + qreal distance = 4 * QLineF(currentPoint, origin).length(); + int steps = qRound(distance / brushStep); + + for (int i = 0; i < steps; i++) + { + QPointF point = origin + (i + 1) * brushStep * (currentPoint - origin) / distance; + drawBrush(point, brushWidth, offset, fillColor, compMode, opacity, usingFeather, useAA); + } + update(blitRect.adjusted(-1, -1, 1, 1)); +} + +void ScribbleArea::snappingDrawPencil(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, qreal fixedBrushFeather, QColor fillColor, qreal opacity) +{ + QPainterPath path; + path.moveTo(origin); + path.lineTo(currentPoint); + + // Functionality explained in drawPolyLine + BlitRect blitRect; + blitRect.extend(mEditor->view()->mapCanvasToScreen(mTiledBuffer.bounds()).toRect()); + QRect updateRect = mEditor->view()->mapCanvasToScreen(path.boundingRect()).toRect(); + blitRect.extend(updateRect); + mTiledBuffer.clear(); + + qreal distance = 4 * QLineF(currentPoint, origin).length(); + int steps = qRound(distance / brushStep); + + for (int i = 0; i < steps; i++) + { + QPointF point = origin + (i + 1) * brushStep * (currentPoint - origin) / distance; + drawPencil(point, brushWidth, fixedBrushFeather, fillColor, opacity); + } + update(blitRect.adjusted(-1, -1, 1, 1)); +} + +void ScribbleArea::snappingDrawBrush(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, qreal offset, QColor fillColor, QPainter::CompositionMode compMode, qreal opacity, bool usingFeather) +{ + QPainterPath path; + path.moveTo(origin); + path.lineTo(currentPoint); + + // Functionality explained in drawPolyLine + BlitRect blitRect; + blitRect.extend(mEditor->view()->mapCanvasToScreen(mTiledBuffer.bounds()).toRect()); + QRect updateRect = mEditor->view()->mapCanvasToScreen(path.boundingRect()).toRect(); + blitRect.extend(updateRect); + mTiledBuffer.clear(); + + qreal distance = 4 * QLineF(currentPoint, origin).length(); + int steps = qRound(distance / brushStep); + + for (int i = 0; i < steps; i++) + { + QPointF point = origin + (i + 1) * brushStep * (currentPoint - origin) / distance; + drawBrush(point, brushWidth, offset, fillColor, compMode, opacity, true); + } + update(blitRect.adjusted(-1, -1, 1, 1)); + +} void ScribbleArea::drawPencil(QPointF thePoint, qreal brushWidth, qreal fixedBrushFeather, QColor fillColor, qreal opacity) { drawBrush(thePoint, brushWidth, fixedBrushFeather, fillColor, QPainter::CompositionMode_SourceOver, opacity, true); diff --git a/core_lib/src/interface/scribblearea.h b/core_lib/src/interface/scribblearea.h index 5d396d9102..58c4286ac5 100644 --- a/core_lib/src/interface/scribblearea.h +++ b/core_lib/src/interface/scribblearea.h @@ -166,6 +166,10 @@ public slots: void drawPolyline(QPainterPath path, QPen pen, bool useAA); void drawPath(QPainterPath path, QPen pen, QBrush brush, QPainter::CompositionMode cm); void drawPen(QPointF thePoint, qreal brushWidth, QColor fillColor, bool useAA = true); + void snappingDrawPen(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, QColor fillColor, bool useAA = true); + void snappingDrawEraser(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, qreal offset, QColor fillColor, QPainter::CompositionMode compMode, qreal opacity, bool usingFeather = true, bool useAA = false); + void snappingDrawPencil(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, qreal fixedBrushFeather, QColor fillColor, qreal opacity); + void snappingDrawBrush(QPointF origin, QPointF currentPoint, qreal brushStep, qreal brushWidth, qreal offset, QColor fillColor, QPainter::CompositionMode compMode, qreal opacity, bool usingFeather = true); void drawPencil(QPointF thePoint, qreal brushWidth, qreal fixedBrushFeather, QColor fillColor, qreal opacity); void drawBrush(QPointF thePoint, qreal brushWidth, qreal offset, QColor fillColor, QPainter::CompositionMode compMode, qreal opacity, bool usingFeather = true, bool useAA = false); void blurBrush(BitmapImage *bmiSource_, QPointF srcPoint_, QPointF thePoint_, qreal brushWidth_, qreal offset_, qreal opacity_); diff --git a/core_lib/src/tool/brushtool.cpp b/core_lib/src/tool/brushtool.cpp index 655f257f28..0099289155 100644 --- a/core_lib/src/tool/brushtool.cpp +++ b/core_lib/src/tool/brushtool.cpp @@ -155,7 +155,15 @@ void BrushTool::pointerPressEvent(PointerEvent *event) void BrushTool::pointerMoveEvent(PointerEvent* event) { - mInterpolator.pointerMoveEvent(event); + if(mXYSnappingMode && event->buttons() & Qt::LeftButton) + { + mInterpolator.snappingPointerMoveEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + + else{ + mInterpolator.pointerMoveEvent(event); + } + if (handleQuickSizing(event)) { return; } @@ -175,7 +183,14 @@ void BrushTool::pointerMoveEvent(PointerEvent* event) void BrushTool::pointerReleaseEvent(PointerEvent *event) { - mInterpolator.pointerReleaseEvent(event); + if(mXYSnappingMode) + { + mInterpolator.snappingPointerReleaseEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + else + { + mInterpolator.pointerReleaseEvent(event); + } if (handleQuickSizing(event)) { return; } @@ -244,6 +259,24 @@ void BrushTool::drawStroke() QPointF a = mLastBrushPoint; QPointF b = getCurrentPoint(); + if(mXYSnappingMode) + { + // If snapping to another axis or reducing line length + if((a.x() != b.x() && a.y() != b.y()) || QLineF(mMouseDownPoint, a).length() > QLineF(mMouseDownPoint, b).length()) + { + mLastBrushPoint = mMouseDownPoint; + + mScribbleArea->snappingDrawBrush(mLastBrushPoint, getCurrentPoint(), brushStep, + brushWidth, + properties.feather, + mEditor->color()->frontColor(), + QPainter::CompositionMode_SourceOver, + opacity, + true); + mLastBrushPoint = getCurrentPoint(); + return; + } + } qreal distance = 4 * QLineF(b, a).length(); int steps = qRound(distance / brushStep); diff --git a/core_lib/src/tool/erasertool.cpp b/core_lib/src/tool/erasertool.cpp index 9b54d074d8..c149c610e4 100644 --- a/core_lib/src/tool/erasertool.cpp +++ b/core_lib/src/tool/erasertool.cpp @@ -164,7 +164,15 @@ void EraserTool::pointerPressEvent(PointerEvent *event) void EraserTool::pointerMoveEvent(PointerEvent* event) { - mInterpolator.pointerMoveEvent(event); + if(mXYSnappingMode) + { + mInterpolator.snappingPointerMoveEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + else + { + mInterpolator.pointerMoveEvent(event); + } + if (handleQuickSizing(event)) { return; } @@ -184,7 +192,14 @@ void EraserTool::pointerMoveEvent(PointerEvent* event) void EraserTool::pointerReleaseEvent(PointerEvent *event) { - mInterpolator.pointerReleaseEvent(event); + if(mXYSnappingMode) + { + mInterpolator.snappingPointerReleaseEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + else + { + mInterpolator.pointerReleaseEvent(event); + } if (handleQuickSizing(event)) { return; } @@ -253,6 +268,27 @@ void EraserTool::drawStroke() QPointF a = mLastBrushPoint; QPointF b = getCurrentPoint(); + + if(mXYSnappingMode) + { + // If snapping to another axis or reducing line length + if((a.x() != b.x() && a.y() != b.y()) || QLineF(mMouseDownPoint, a).length() > QLineF(mMouseDownPoint, b).length()) + { + mLastBrushPoint = mMouseDownPoint; + + mScribbleArea->snappingDrawEraser(mLastBrushPoint, getCurrentPoint(), brushStep, + brushWidth, + properties.feather, + Qt::white, + QPainter::CompositionMode_SourceOver, + opacity, + properties.useFeather, + properties.useAA == ON); + mLastBrushPoint = getCurrentPoint(); + return; + } + } + qreal distance = 4 * QLineF(b, a).length(); int steps = qRound(distance / brushStep); diff --git a/core_lib/src/tool/penciltool.cpp b/core_lib/src/tool/penciltool.cpp index a0f63e9025..5e4003eba3 100644 --- a/core_lib/src/tool/penciltool.cpp +++ b/core_lib/src/tool/penciltool.cpp @@ -166,7 +166,13 @@ void PencilTool::pointerPressEvent(PointerEvent *event) void PencilTool::pointerMoveEvent(PointerEvent* event) { - mInterpolator.pointerMoveEvent(event); + if(mXYSnappingMode && event->buttons() & Qt::LeftButton) + { + mInterpolator.snappingPointerMoveEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + else{ + mInterpolator.pointerMoveEvent(event); + } if (handleQuickSizing(event)) { return; } @@ -185,7 +191,14 @@ void PencilTool::pointerMoveEvent(PointerEvent* event) void PencilTool::pointerReleaseEvent(PointerEvent *event) { - mInterpolator.pointerReleaseEvent(event); + if(mXYSnappingMode) + { + mInterpolator.snappingPointerReleaseEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + else + { + mInterpolator.pointerReleaseEvent(event); + } if (handleQuickSizing(event)) { return; } @@ -254,6 +267,24 @@ void PencilTool::drawStroke() QPointF a = mLastBrushPoint; QPointF b = getCurrentPoint(); + + if(mXYSnappingMode) + { + // If snapping to another axis or reducing line length + if((a.x() != b.x() && a.y() != b.y()) || QLineF(mMouseDownPoint, a).length() > QLineF(mMouseDownPoint, b).length()) + { + mLastBrushPoint = mMouseDownPoint; + + mScribbleArea->snappingDrawPencil(mLastBrushPoint, getCurrentPoint(), brushStep, + brushWidth, + fixedBrushFeather, + mEditor->color()->frontColor(), + opacity); + mLastBrushPoint = getCurrentPoint(); + return; + } + } + qreal distance = 4 * QLineF(b, a).length(); int steps = qRound(distance / brushStep); diff --git a/core_lib/src/tool/pentool.cpp b/core_lib/src/tool/pentool.cpp index 65c262f44f..3739e72a79 100644 --- a/core_lib/src/tool/pentool.cpp +++ b/core_lib/src/tool/pentool.cpp @@ -134,7 +134,15 @@ void PenTool::pointerPressEvent(PointerEvent *event) void PenTool::pointerMoveEvent(PointerEvent* event) { - mInterpolator.pointerMoveEvent(event); + if(mXYSnappingMode && event->buttons() & Qt::LeftButton) + { + mInterpolator.snappingPointerMoveEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + + else{ + mInterpolator.pointerMoveEvent(event); + } + if (handleQuickSizing(event)) { return; } @@ -154,7 +162,14 @@ void PenTool::pointerMoveEvent(PointerEvent* event) void PenTool::pointerReleaseEvent(PointerEvent *event) { - mInterpolator.pointerReleaseEvent(event); + if(mXYSnappingMode) + { + mInterpolator.snappingPointerReleaseEvent(event, mEditor->view()->mapCanvasToScreen(mMouseDownPoint)); + } + else + { + mInterpolator.pointerReleaseEvent(event); + } if (handleQuickSizing(event)) { return; } @@ -220,6 +235,22 @@ void PenTool::drawStroke() QPointF a = mLastBrushPoint; QPointF b = getCurrentPoint(); + + if(mXYSnappingMode) + { + // If snapping to another axis or reducing line length + if((a.x() != b.x() && a.y() != b.y()) || QLineF(mMouseDownPoint, a).length() > QLineF(mMouseDownPoint, b).length()) + { + mLastBrushPoint = mMouseDownPoint; + + mScribbleArea->snappingDrawPen(mLastBrushPoint, getCurrentPoint(), brushStep, + brushWidth, + mEditor->color()->frontColor(), + properties.useAA); + mLastBrushPoint = getCurrentPoint(); + return; + } + } qreal distance = 4 * QLineF(b, a).length(); int steps = qRound(distance / brushStep); diff --git a/core_lib/src/tool/strokeinterpolator.cpp b/core_lib/src/tool/strokeinterpolator.cpp index 5eef01a382..243bcc4ab1 100644 --- a/core_lib/src/tool/strokeinterpolator.cpp +++ b/core_lib/src/tool/strokeinterpolator.cpp @@ -86,6 +86,25 @@ void StrokeInterpolator::pointerMoveEvent(PointerEvent* event) } } +void StrokeInterpolator::snappingPointerMoveEvent(PointerEvent* event, QPointF originPoint) +{ + QPointF currentPoint = event->viewportPos(); + + mLastPixel = mCurrentPixel; + if(abs(currentPoint.x() - originPoint.x()) > abs(currentPoint.y() - originPoint.y())) + { + mCurrentPixel = QPointF(currentPoint.x(), originPoint.y()); + } + else + { + mCurrentPixel = QPointF(originPoint.x(), currentPoint.y()); + } + if(event->isTabletEvent()) + { + setPressure(event->pressure()); + } +} + void StrokeInterpolator::pointerReleaseEvent(PointerEvent* event) { // flush out stroke @@ -98,6 +117,18 @@ void StrokeInterpolator::pointerReleaseEvent(PointerEvent* event) mTabletInUse = mTabletInUse && !event->isTabletEvent(); } +void StrokeInterpolator::snappingPointerReleaseEvent(PointerEvent* event, QPointF originPoint) +{ + // flush out stroke + if (mStrokeStarted) + { + snappingPointerMoveEvent(event, originPoint); + } + + mStrokeStarted = false; + mTabletInUse = mTabletInUse && !event->isTabletEvent(); +} + void StrokeInterpolator::setStabilizerLevel(int level) { mStabilizerLevel = level; diff --git a/core_lib/src/tool/strokeinterpolator.h b/core_lib/src/tool/strokeinterpolator.h index eb8c867528..d0b09b76cb 100644 --- a/core_lib/src/tool/strokeinterpolator.h +++ b/core_lib/src/tool/strokeinterpolator.h @@ -33,7 +33,9 @@ class StrokeInterpolator : public QObject void pointerPressEvent(PointerEvent* event); void pointerMoveEvent(PointerEvent* event); + void snappingPointerMoveEvent(PointerEvent* event, QPointF originPoint); void pointerReleaseEvent(PointerEvent* event); + void snappingPointerReleaseEvent(PointerEvent* event, QPointF originPoint); void setPressure(float pressure); void setStabilizerLevel(int level); diff --git a/core_lib/src/tool/stroketool.cpp b/core_lib/src/tool/stroketool.cpp index e301275aba..b11c462696 100644 --- a/core_lib/src/tool/stroketool.cpp +++ b/core_lib/src/tool/stroketool.cpp @@ -159,10 +159,28 @@ bool StrokeTool::keyPressEvent(QKeyEvent *event) return true; } break; + case Qt::Key_Minus: + if(!isActive()){ + mXYSnappingMode = true; + } + break; } return BaseTool::keyPressEvent(event); } +bool StrokeTool::keyReleaseEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Minus: + if(!isActive()){ + mXYSnappingMode = false; + return true; + } + break; + } + return BaseTool::keyReleaseEvent(event); +} + bool StrokeTool::emptyFrameActionEnabled() { return true; @@ -177,6 +195,7 @@ void StrokeTool::endStroke() enableCoalescing(); + mXYSnappingMode = false; mEditor->setModified(mEditor->currentLayerIndex(), mEditor->currentFrame()); mScribbleArea->endStroke(); } diff --git a/core_lib/src/tool/stroketool.h b/core_lib/src/tool/stroketool.h index 0fd441c3ac..5f3ef82efc 100644 --- a/core_lib/src/tool/stroketool.h +++ b/core_lib/src/tool/stroketool.h @@ -54,6 +54,7 @@ class StrokeTool : public BaseTool bool isActive() const override { return mInterpolator.isActive(); }; bool keyPressEvent(QKeyEvent* event) override; + bool keyReleaseEvent(QKeyEvent* event) override; void pointerPressEvent(PointerEvent* event) override; void pointerMoveEvent(PointerEvent* event) override; void pointerReleaseEvent(PointerEvent* event) override; @@ -101,6 +102,7 @@ public slots: /// Returns true by default. virtual bool emptyFrameActionEnabled(); + bool mXYSnappingMode = false; bool mCanvasCursorEnabled = false; QPointF mLastPixel { 0, 0 };