Skip to content
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
31 changes: 29 additions & 2 deletions src/app/GUI/keysview.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
#include "timelinehighlightwidget.h"
#include "GUI/dialogsinterface.h"
#include "themesupport.h"
#include <QtMath>
#include <cmath>

KeysView::KeysView(BoxScrollWidget *boxesListVisible,
QWidget *parent) :
Expand Down Expand Up @@ -792,7 +794,9 @@ void KeysView::handleMouseMove(const QPoint &pos,
dFrame = dX/mPixelsPerFrame;
mValueInput.setDisplayedValue(dFrame);
}
const auto mods = QApplication::keyboardModifiers();
const bool ctrlPt = mGPressedPoint && mGPressedPoint->isCtrlPt();
const bool shiftPressed = mods & Qt::ShiftModifier;
if(!ctrlPt) dFrame = round(dFrame);
const qreal dDFrame = dFrame - mMoveDFrame;
const int iDDFrame = qRound(dDFrame);
Expand All @@ -809,8 +813,31 @@ void KeysView::handleMouseMove(const QPoint &pos,
const QPointF saved = mGPressedPoint->getSavedFrameAndValue();
const qreal rawFrame = saved.x() + dFrameV;
const qreal rawValue = saved.y() + dValue;
const qreal newFrame = qBound(mMinMoveFrame, rawFrame, mMaxMoveFrame);
const qreal newValue = qBound(mMinMoveVal, rawValue, mMaxMoveVal);
qreal newFrame = qBound(mMinMoveFrame, rawFrame, mMaxMoveFrame);
qreal newValue = qBound(mMinMoveVal, rawValue, mMaxMoveVal);
if(shiftPressed) {
if(const auto parentKey = mGPressedPoint->getParentKey()) {
const qreal keyFrame = parentKey->getRelFrame();
const qreal keyValue = parentKey->getValueForGraph();
const qreal dx = newFrame - keyFrame;
const qreal dy = newValue - keyValue;
const qreal dxPx = dx * mPixelsPerFrame;
const qreal dyPx = -dy * mPixelsPerValUnit;
const qreal lengthPx = qSqrt(dxPx*dxPx + dyPx*dyPx);
if(lengthPx > 0.0) {
constexpr qreal snapStep = 15.0;
const qreal angleDeg = qRadiansToDegrees(qAtan2(dyPx, dxPx));
const qreal snappedDeg = std::round(angleDeg / snapStep) * snapStep;
const qreal snappedRad = qDegreesToRadians(snappedDeg);
const qreal snappedDxPx = lengthPx * qCos(snappedRad);
const qreal snappedDyPx = lengthPx * qSin(snappedRad);
newFrame = keyFrame + snappedDxPx / mPixelsPerFrame;
newValue = keyValue - snappedDyPx / mPixelsPerValUnit;
}
}
}
newFrame = qBound(mMinMoveFrame, newFrame, mMaxMoveFrame);
newValue = qBound(mMinMoveVal, newValue, mMaxMoveVal);
mGPressedPoint->setFrameAndValue(newFrame, newValue,
mPixelsPerFrame,
mPixelsPerValUnit);
Expand Down
1 change: 1 addition & 0 deletions src/core/MovablePoints/smartctrlpoint.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class CORE_EXPORT SmartCtrlPoint : public NonAnimatedMovablePoint {
SmartCtrlPoint(SmartNodePoint * const parentPoint,
const Type &type);
public:
SmartNodePoint* getParentPoint() const { return mParentPoint_k; }
void drawSk(SkCanvas* const canvas,
const CanvasMode mode,
const float invScale,
Expand Down
2 changes: 2 additions & 0 deletions src/core/canvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1286,6 +1286,7 @@ bool Canvas::startScalingAction(const eKeyEvent &e)
}
mValueInput.clearAndDisableInput();
mValueInput.setupScale();
mLastPointMoveBy = QPointF();

mRotPivot->setMousePos(e.fPos);
mTransMode = TransformMode::scale;
Expand All @@ -1301,6 +1302,7 @@ bool Canvas::startMovingAction(const eKeyEvent &e)
mCurrentMode != CanvasMode::pointTransform) { return false; }
mValueInput.clearAndDisableInput();
mValueInput.setupMove();
mLastPointMoveBy = QPointF();

mTransMode = TransformMode::move;
mDoubleClick = false;
Expand Down
1 change: 1 addition & 0 deletions src/core/canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -935,6 +935,7 @@ class CORE_EXPORT Canvas : public CanvasBase
bool mStartTransform = false;
bool mSelecting = false;
// bool mMoving = false;
QPointF mLastPointMoveBy;

QRectF mSelectionRect;
CanvasMode mCurrentMode = CanvasMode::boxTransform;
Expand Down
86 changes: 66 additions & 20 deletions src/core/canvasmouseinteractions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,15 @@
#include <QMenu>
#include <QInputDialog>
#include <QApplication>
#include <cmath>

using namespace Friction::Core;

namespace {
constexpr qreal kDegToRad = static_cast<qreal>(0.017453292519943295769);
constexpr qreal kRadToDeg = static_cast<qreal>(57.2957795130823208768);
}

void Canvas::handleMovePathMousePressEvent(const eMouseEvent& e)
{
mPressedBox = mCurrentContainer->getBoxAt(e.fPos);
Expand Down Expand Up @@ -211,6 +217,7 @@ void Canvas::handleLeftButtonMousePress(const eMouseEvent& e)
//mMovesToSkip = 2;
mStartTransform = true;
mHasCreationPressPos = false;
mLastPointMoveBy = QPointF();

const qreal invScale = 1/e.fScale;
const qreal invScaleUi = (qApp ? qApp->devicePixelRatio() : 1.0) * invScale;
Expand Down Expand Up @@ -709,44 +716,72 @@ void Canvas::handleMovePointMouseMove(const eMouseEvent &e)
}
}

QPointF moveBy = getMoveByValueForEvent(e);
QPointF finalMoveBy = moveBy;
if ((mods & Qt::ShiftModifier) && mPressedPoint->isCtrlPoint()) {
const auto ctrlPoint = enve_cast<SmartCtrlPoint*>(mPressedPoint.data());
if (ctrlPoint) {
const auto parentPoint = ctrlPoint->getParentPoint();
if (parentPoint) {
const QPointF parentAbs = parentPoint->getAbsolutePos();
const QPointF startAbs = ctrlPoint->getAbsolutePos() - mLastPointMoveBy;
QPointF targetAbs = startAbs + moveBy;
const QPointF dir = targetAbs - parentAbs;
const qreal len = pointToLen(dir);
if (len > 0.0) {
constexpr qreal snapStep = 15.0;
const qreal angleDeg = std::atan2(dir.y(), dir.x()) * kRadToDeg;
const qreal snappedDeg = std::round(angleDeg / snapStep) * snapStep;
const qreal snappedRad = snappedDeg * kDegToRad;
const QPointF snappedVec(len * std::cos(snappedRad),
len * std::sin(snappedRad));
targetAbs = parentAbs + snappedVec;
finalMoveBy = targetAbs - startAbs;
}
}
}
}

if (!mPressedPoint->selectionEnabled()) {
if (mStartTransform) {
mPressedPoint->startTransform();
mGridMoveStartPivot = mPressedPoint->getAbsolutePos();
}

auto moveBy = getMoveByValueForEvent(e);
if (snappingActive) {
const auto snapped = moveBySnapTargets(e.fModifiers,
moveBy,
finalMoveBy,
gridSettings,
includeSelectedBounds,
false,
false);
if (snapped.first) { moveBy = snapped.second; }
if (snapped.first) { finalMoveBy = snapped.second; }
}

mPressedPoint->moveByAbs(moveBy);
mPressedPoint->moveByAbs(finalMoveBy);
mLastPointMoveBy = finalMoveBy;
return;
}
}

if (mStartTransform && !mSelectedPoints_d.isEmpty()) {
mGridMoveStartPivot = getSelectedPointsAbsPivotPos();
}
if (mStartTransform && !mSelectedPoints_d.isEmpty()) {
mGridMoveStartPivot = getSelectedPointsAbsPivotPos();
}
if (snappingActive && !mSelectedPoints_d.isEmpty()) {
const auto snapped = moveBySnapTargets(e.fModifiers,
finalMoveBy,
gridSettings,
includeSelectedBounds,
false,
false);
if (snapped.first) { finalMoveBy = snapped.second; }
}

auto moveBy = getMoveByValueForEvent(e);
if (snappingActive && !mSelectedPoints_d.isEmpty()) {
const auto snapped = moveBySnapTargets(e.fModifiers,
moveBy,
gridSettings,
includeSelectedBounds,
false,
false);
if (snapped.first) { moveBy = snapped.second; }
moveSelectedPointsByAbs(finalMoveBy, mStartTransform);
mLastPointMoveBy = finalMoveBy;
} else {
const QPointF moveBy = getMoveByValueForEvent(e);
moveSelectedPointsByAbs(moveBy, mStartTransform);
mLastPointMoveBy = moveBy;
}

moveSelectedPointsByAbs(moveBy, mStartTransform);
}
}

Expand Down Expand Up @@ -851,6 +886,16 @@ void Canvas::rotateSelected(const eMouseEvent& e)
rot = d_rot + mRotHalfCycles*180;
}

if (!mValueInput.inputEnabled()) {
if (e.ctrlMod()) {
constexpr qreal snapStep = 1.0;
rot = std::round(rot / snapStep) * snapStep;
} else if (e.shiftMod()) {
constexpr qreal snapStep = 15.0;
rot = std::round(rot / snapStep) * snapStep;
}
}

if (mCurrentMode == CanvasMode::boxTransform) {
rotateSelectedBy(rot, absPos, mStartTransform);
} else {
Expand Down Expand Up @@ -883,6 +928,7 @@ bool Canvas::prepareRotation(const QPointF &startPos,
mTransMode = TransformMode::rotate;
mRotHalfCycles = 0;
mLastDRot = 0;
mLastPointMoveBy = QPointF();

mDoubleClick = false;
mStartTransform = true;
Expand Down