Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#1248 Horizontal and Vertical Line Snapping for Drawing Tools #1830

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added app/.qm/pencil_ar.qm
Binary file not shown.
Binary file added app/.qm/pencil_ca.qm
Binary file not shown.
Binary file added app/.qm/pencil_cs.qm
Binary file not shown.
Binary file added app/.qm/pencil_da.qm
Binary file not shown.
Binary file added app/.qm/pencil_de.qm
Binary file not shown.
Binary file added app/.qm/pencil_el.qm
Binary file not shown.
Binary file added app/.qm/pencil_en.qm
Binary file not shown.
Binary file added app/.qm/pencil_es.qm
Binary file not shown.
Binary file added app/.qm/pencil_et.qm
Binary file not shown.
Binary file added app/.qm/pencil_fr.qm
Binary file not shown.
Binary file added app/.qm/pencil_he.qm
Binary file not shown.
Binary file added app/.qm/pencil_hu_HU.qm
Binary file not shown.
Binary file added app/.qm/pencil_id.qm
Binary file not shown.
Binary file added app/.qm/pencil_it.qm
Binary file not shown.
Binary file added app/.qm/pencil_ja.qm
Binary file not shown.
Binary file added app/.qm/pencil_kab.qm
Binary file not shown.
Binary file added app/.qm/pencil_pl.qm
Binary file not shown.
Binary file added app/.qm/pencil_pt.qm
Binary file not shown.
Binary file added app/.qm/pencil_pt_BR.qm
Binary file not shown.
Binary file added app/.qm/pencil_ru.qm
Binary file not shown.
Binary file added app/.qm/pencil_sl.qm
Binary file not shown.
Binary file added app/.qm/pencil_sv.qm
Binary file not shown.
Binary file added app/.qm/pencil_tr.qm
Binary file not shown.
Binary file added app/.qm/pencil_vi.qm
Binary file not shown.
Binary file added app/.qm/pencil_zh_CN.qm
Binary file not shown.
Binary file added app/.qm/pencil_zh_TW.qm
Binary file not shown.
Binary file added app/pencil2d_arm64.pch/c++_arm64.pch
Binary file not shown.
30 changes: 30 additions & 0 deletions app/qmake_qmake_qm_files.qrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="i18n">
<file alias="pencil_ar.qm">/Users/milesortolan/pencil/app/.qm/pencil_ar.qm</file>
<file alias="pencil_ca.qm">/Users/milesortolan/pencil/app/.qm/pencil_ca.qm</file>
<file alias="pencil_cs.qm">/Users/milesortolan/pencil/app/.qm/pencil_cs.qm</file>
<file alias="pencil_da.qm">/Users/milesortolan/pencil/app/.qm/pencil_da.qm</file>
<file alias="pencil_de.qm">/Users/milesortolan/pencil/app/.qm/pencil_de.qm</file>
<file alias="pencil_el.qm">/Users/milesortolan/pencil/app/.qm/pencil_el.qm</file>
<file alias="pencil_en.qm">/Users/milesortolan/pencil/app/.qm/pencil_en.qm</file>
<file alias="pencil_es.qm">/Users/milesortolan/pencil/app/.qm/pencil_es.qm</file>
<file alias="pencil_et.qm">/Users/milesortolan/pencil/app/.qm/pencil_et.qm</file>
<file alias="pencil_fr.qm">/Users/milesortolan/pencil/app/.qm/pencil_fr.qm</file>
<file alias="pencil_he.qm">/Users/milesortolan/pencil/app/.qm/pencil_he.qm</file>
<file alias="pencil_hu_HU.qm">/Users/milesortolan/pencil/app/.qm/pencil_hu_HU.qm</file>
<file alias="pencil_id.qm">/Users/milesortolan/pencil/app/.qm/pencil_id.qm</file>
<file alias="pencil_it.qm">/Users/milesortolan/pencil/app/.qm/pencil_it.qm</file>
<file alias="pencil_ja.qm">/Users/milesortolan/pencil/app/.qm/pencil_ja.qm</file>
<file alias="pencil_kab.qm">/Users/milesortolan/pencil/app/.qm/pencil_kab.qm</file>
<file alias="pencil_pl.qm">/Users/milesortolan/pencil/app/.qm/pencil_pl.qm</file>
<file alias="pencil_pt.qm">/Users/milesortolan/pencil/app/.qm/pencil_pt.qm</file>
<file alias="pencil_pt_BR.qm">/Users/milesortolan/pencil/app/.qm/pencil_pt_BR.qm</file>
<file alias="pencil_ru.qm">/Users/milesortolan/pencil/app/.qm/pencil_ru.qm</file>
<file alias="pencil_sl.qm">/Users/milesortolan/pencil/app/.qm/pencil_sl.qm</file>
<file alias="pencil_sv.qm">/Users/milesortolan/pencil/app/.qm/pencil_sv.qm</file>
<file alias="pencil_tr.qm">/Users/milesortolan/pencil/app/.qm/pencil_tr.qm</file>
<file alias="pencil_vi.qm">/Users/milesortolan/pencil/app/.qm/pencil_vi.qm</file>
<file alias="pencil_zh_CN.qm">/Users/milesortolan/pencil/app/.qm/pencil_zh_CN.qm</file>
<file alias="pencil_zh_TW.qm">/Users/milesortolan/pencil/app/.qm/pencil_zh_TW.qm</file>
</qresource>
</RCC>
Binary file added core_lib/core_lib_arm64.pch/c++_arm64.pch
Binary file not shown.
Binary file not shown.
99 changes: 99 additions & 0 deletions core_lib/src/interface/scribblearea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions core_lib/src/interface/scribblearea.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_);
Expand Down
37 changes: 35 additions & 2 deletions core_lib/src/tool/brushtool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);

Expand Down
40 changes: 38 additions & 2 deletions core_lib/src/tool/erasertool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);

Expand Down
35 changes: 33 additions & 2 deletions core_lib/src/tool/penciltool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);

Expand Down
35 changes: 33 additions & 2 deletions core_lib/src/tool/pentool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down
Loading
Loading