Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • core_lib
  • src
  • tool
cameratool.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17
18
19#include "cameratool.h"
20
21#include "object.h"
22#include "editor.h"
23#include "pointerevent.h"
24#include "layermanager.h"
25#include "selectionmanager.h"
26#include "playbackmanager.h"
27#include "viewmanager.h"
28#include "layercamera.h"
29#include "mathutils.h"
30#include "transform.h"
31#include "camera.h"
32
33#include "scribblearea.h"
34
35#include <QPixmap>
36#include <QPainter>
37#include <QSettings>
38
39CameraTool::CameraTool(QObject* object) : BaseTool(object)
40{
41
42}
43
44CameraTool::~CameraTool()
45{
46 saveSettings();
47}
48
49void CameraTool::loadSettings()
50{
51 mPropertyEnabled[CAMERAPATH] = true;
52 connect(mEditor->layers(), &LayerManager::currentLayerChanged, this, &CameraTool::updateProperties);
53 connect(mEditor, &Editor::objectLoaded, this, &CameraTool::updateProperties);
54
55 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
56
57 connect(mEditor->preference(), &PreferenceManager::optionChanged, this, &CameraTool::updateSettings);
58
59 mHandleColor = Qt::white;
60 mHandleDisabledColor = Qt::black;
61 mHandleTextColor = QColor(0, 0, 0);
62
63 mHandlePen = QPen();
64 mHandlePen.setColor(QColor(0, 0, 0, 255));
65 mHandlePen.setWidth(2);
66}
67
68void CameraTool::saveSettings()
69{
70}
71
72void CameraTool::updateUIAssists(const Layer* layer)
73{
74 const LayerCamera* camLayer = static_cast<const LayerCamera*>(layer);
75
76 Q_ASSERT(layer->type() == Layer::CAMERA);
77
78 int currentFrame = mEditor->currentFrame();
79 if (!layer->keyExists(currentFrame)) { return; }
80
81 const QTransform& localCamT = camLayer->getViewAtFrame(currentFrame);
82 const QRect& cameraRect = camLayer->getViewRect();
83
84 mCameraRect = Transform::mapFromLocalRect(localCamT, cameraRect);
85 mCameraPolygon = Transform::mapFromLocalPolygon(localCamT, cameraRect);
86
87 Camera* cam = camLayer->getLastCameraAtFrame(mEditor->currentFrame(), 0);
88 if (cam) {
89 mRotationHandlePoint = localRotationHandlePoint(cameraRect.topLeft(), localCamT, cam->scaling(), mEditor->view()->getScaleInversed());
90 }
91}
92
93void CameraTool::updateProperties()
94{
95 Layer* layer = mEditor->layers()->getLayer(mEditor->currentLayerIndex());
96 if (!layer || layer->type() != Layer::CAMERA) { return; }
97
98 LayerCamera* layerCam = static_cast<LayerCamera*>(layer);
99 properties.cameraPathDotColorType = layerCam->getDotColorType();
100 properties.cameraShowPath = layerCam->getShowCameraPath();
101}
102
103void CameraTool::updateSettings(const SETTING setting)
104{
105 switch (setting)
106 {
107 case SETTING::ROTATION_INCREMENT:
108 {
109 mRotationIncrement = mEditor->preference()->getInt(SETTING::ROTATION_INCREMENT);
110 break;
111 }
112 default:
113 break;
114
115 }
116}
117
118QCursor CameraTool::cursor()
119{
120 QPixmap cursorPixmap = QPixmap(24, 24);
121 cursorPixmap.fill(Qt::transparent);
122 QPainter cursorPainter(&cursorPixmap);
123
124 QImage moveTypeImage;
125 QPoint offset = QPoint(6, 6);
126 switch(mCamMoveMode)
127 {
128 case CameraMoveType::TOPLEFT:
129 case CameraMoveType::BOTTOMRIGHT:
130 {
131 moveTypeImage = QImage("://icons/general/cursor-diagonal-left.svg");
132 break;
133 }
134 case CameraMoveType::TOPRIGHT:
135 case CameraMoveType::BOTTOMLEFT:
136 {
137 moveTypeImage = QImage("://icons/general/cursor-diagonal-right.svg");
138 break;
139 }
140 case CameraMoveType::ROTATION:
141 {
142 moveTypeImage = QImage("://icons/general/cursor-rotate.svg");
143 break;
144 }
145 case CameraMoveType::PATH:
146 case CameraMoveType::CENTER:
147 {
148 moveTypeImage = QImage("://icons/general/cursor-move.svg");
149 break;
150 }
151 default:
152 return Qt::ArrowCursor;
153 }
154
155 QTransform rotT;
156 QPointF center = QPointF(moveTypeImage.size().width()*0.5, moveTypeImage.size().height()*0.5);
157
158 // rotate around center
159 rotT.translate(center.x() + offset.x(), center.y() + offset.y());
160 rotT.rotate(mCurrentAngle);
161 rotT.translate(-center.x() - offset.x(), -center.y() - offset.y());
162 cursorPainter.setTransform(rotT);
163 cursorPainter.drawImage(offset, moveTypeImage);
164 cursorPainter.end();
165
166 return QCursor(cursorPixmap);
167}
168
169void CameraTool::updateMoveMode(const QPointF& pos)
170{
171
172 if (mScribbleArea->isPointerInUse()) {
173 // Pointer in use, keep previous used mode
174 return;
175 }
176
177 Layer* layer = mEditor->layers()->currentLayer();
178 mCamMoveMode = CameraMoveType::NONE;
179 qreal selectionTolerance = mEditor->select()->selectionTolerance();
180
181 Q_ASSERT(layer->type() == Layer::CAMERA);
182 LayerCamera* cam = static_cast<LayerCamera*>(layer);
183 if (layer->keyExists(mEditor->currentFrame()))
184 {
185 mCamMoveMode = getCameraMoveMode(pos,
186 selectionTolerance);
187 } else if (properties.cameraShowPath) {
188 int keyPos = cam->firstKeyFramePosition();
189 while (keyPos <= cam->getMaxKeyFramePosition())
190 {
191 mCamMoveMode = getPathMoveMode(cam,
192 keyPos,
193 pos,
194 selectionTolerance);
195 if (mCamMoveMode != CameraMoveType::NONE)
196 {
197 mDragPathFrame = keyPos;
198 break;
199 }
200
201 if (keyPos == cam->getNextKeyFramePosition(keyPos)) {
202 break;
203 }
204
205 keyPos = cam->getNextKeyFramePosition(keyPos);
206 }
207 }
208}
209
210void CameraTool::setShowCameraPath(const bool showCameraPath)
211{
212 LayerCamera* layer = static_cast<LayerCamera*>(editor()->layers()->currentLayer());
213
214 Q_ASSERT(layer->type() == Layer::CAMERA);
215 layer->setShowCameraPath(showCameraPath);
216
217 properties.cameraShowPath = showCameraPath;
218}
219
220void CameraTool::setPathDotColorType(const DotColorType pathDotColor)
221{
222 LayerCamera* layer = static_cast<LayerCamera*>(editor()->layers()->currentLayer());
223 Q_ASSERT(layer->type() == Layer::CAMERA);
224
225 layer->updateDotColor(pathDotColor);
226}
227
228void CameraTool::resetCameraPath()
229{
230 LayerCamera* layer = static_cast<LayerCamera*>(editor()->layers()->currentLayer());
231 Q_ASSERT(layer->type() == Layer::CAMERA);
232
233 layer->setPathMovedAtFrame(mEditor->currentFrame(), false);
234 mEditor->updateFrame();
235}
236
237void CameraTool::resetTransform(CameraFieldOption option)
238{
239 LayerCamera* layer = static_cast<LayerCamera*>(editor()->layers()->currentLayer());
240 Q_ASSERT(layer->type() == Layer::CAMERA);
241
242 if (option == CameraFieldOption::RESET_ROTATION || option == CameraFieldOption::RESET_FIELD) {
243 mCurrentAngle = 0;
244 }
245
246 layer->resetCameraAtFrame(option, mEditor->currentFrame());
247 emit mEditor->frameModified(mEditor->currentFrame());
248}
249
250void CameraTool::transformCamera(const QPointF& pos, Qt::KeyboardModifiers keyMod)
251{
252 Q_ASSERT(editor()->layers()->currentLayer()->type() == Layer::CAMERA);
253 LayerCamera* layer = static_cast<LayerCamera*>(editor()->layers()->currentLayer());
254
255 qreal angleDeg = 0;
256 if (mCamMoveMode == CameraMoveType::ROTATION) {
257 angleDeg = getAngleBetween(pos, mCameraRect.center()) - mStartAngle;
258 if (keyMod == Qt::ShiftModifier) {
259 angleDeg = constrainedRotation(angleDeg, mRotationIncrement);
260 }
261 mCurrentAngle = angleDeg;
262 }
263
264 transformView(layer, mCamMoveMode, pos, mTransformOffset, -angleDeg, mEditor->currentFrame());
265
266 mEditor->updateFrame();
267 mTransformOffset = pos;
268}
269
270void CameraTool::transformCameraPath(const QPointF& pos)
271{
272 Q_ASSERT(editor()->layers()->currentLayer()->type() == Layer::CAMERA);
273 LayerCamera* layer = static_cast<LayerCamera*>(editor()->layers()->currentLayer());
274
275 layer->updatePathControlPointAtFrame(pos, mDragPathFrame);
276 mEditor->updateFrame();
277}
278
279int CameraTool::constrainedRotation(const qreal rotatedAngle, const int rotationIncrement) const
280{
281 return qRound(rotatedAngle / rotationIncrement) * rotationIncrement;
282}
283
284void CameraTool::pointerPressEvent(PointerEvent* event)
285{
286 updateMoveMode(event->canvasPos());
287 updateUIAssists(mEditor->layers()->currentLayer());
288
289 mStartAngle = getAngleBetween(event->canvasPos(), mCameraRect.center()) - mCurrentAngle;
290 mTransformOffset = event->canvasPos();
291}
292
293void CameraTool::pointerMoveEvent(PointerEvent* event)
294{
295 Layer* currentLayer = mEditor->layers()->currentLayer();
296 updateMoveMode(event->canvasPos());
297 updateUIAssists(currentLayer);
298
299 if (mScribbleArea->isPointerInUse()) // the user is also pressing the mouse (dragging)
300 {
301 if (currentLayer->keyExists(mEditor->currentFrame())) {
302 transformCamera(event->canvasPos(), event->modifiers());
303 }
304 else if (mCamMoveMode == CameraMoveType::PATH)
305 {
306 transformCameraPath(event->canvasPos());
307 }
308 }
309 mScribbleArea->updateToolCursor();
310 mEditor->view()->forceUpdateViewTransform();
311 mEditor->updateFrame();
312}
313
314void CameraTool::pointerReleaseEvent(PointerEvent* event)
315{
316 Layer* layer = editor()->layers()->currentLayer();
317 updateMoveMode(event->canvasPos());
318 updateUIAssists(layer);
319
320 int frame = mEditor->currentFrame();
321 if (layer->keyExists(frame)) {
322 transformCamera(event->canvasPos(), event->modifiers());
323 mEditor->view()->forceUpdateViewTransform();
324 } else if (mCamMoveMode == CameraMoveType::PATH) {
325 transformCameraPath(event->canvasPos());
326 mEditor->view()->forceUpdateViewTransform();
327 }
328 emit mEditor->frameModified(frame);
329}
330
331qreal CameraTool::getAngleBetween(const QPointF& pos1, const QPointF& pos2) const
332{
333 return qRadiansToDegrees(MathUtils::getDifferenceAngle(pos1, pos2));
334}
335
336CameraMoveType CameraTool::getCameraMoveMode(const QPointF& point, qreal tolerance) const
337{
338 QPolygonF camPoly = mCameraPolygon;
339
340 if (camPoly.count() <= 0) { return CameraMoveType::NONE; }
341
342 if (QLineF(point, camPoly.at(0)).length() < tolerance)
343 {
344 return CameraMoveType::TOPLEFT;
345 }
346 else if (QLineF(point, camPoly.at(1)).length() < tolerance)
347 {
348 return CameraMoveType::TOPRIGHT;
349 }
350 else if (QLineF(point, camPoly.at(2)).length() < tolerance)
351 {
352 return CameraMoveType::BOTTOMRIGHT;
353 }
354 else if (QLineF(point, camPoly.at(3)).length() < tolerance)
355 {
356 return CameraMoveType::BOTTOMLEFT;
357 }
358 else if (QLineF(point, mRotationHandlePoint).length() < tolerance)
359 {
360 return CameraMoveType::ROTATION;
361 }
362 else if (camPoly.containsPoint(point.toPoint(), Qt::FillRule::OddEvenFill))
363 {
364 return CameraMoveType::CENTER;
365 }
366 return CameraMoveType::NONE;
367}
368
369CameraMoveType CameraTool::getPathMoveMode(const LayerCamera* layerCamera, int frameNumber, const QPointF& point, qreal tolerance) const
370{
371 int prev = layerCamera->getPreviousKeyFramePosition(frameNumber);
372 int next = layerCamera->getNextKeyFramePosition(frameNumber);
373 if (layerCamera->hasSameTranslation(prev, next))
374 return CameraMoveType::NONE;
375
376 Camera* camera = layerCamera->getLastCameraAtFrame(frameNumber, 0);
377
378 if (camera == nullptr) { return CameraMoveType::NONE; }
379
380 QPointF pathPoint = camera->getPathControlPoint();
381
382 if (!camera->pathControlPointMoved()) {
383 pathPoint = layerCamera->getCenteredPathPoint(frameNumber);
384 }
385
386 if (QLineF(pathPoint, point).length() < tolerance) {
387 return CameraMoveType::PATH;
388 }
389 return CameraMoveType::NONE;
390}
391
392
393QPointF CameraTool::localRotationHandlePoint(const QPoint& origin, const QTransform& localT, const qreal objectScale, float worldScale) const
394{
395 // Calculate the perceived distance from the frame to the handle
396 // so that it looks like the handle is always x pixels above the origin
397 qreal topDis = origin.y() + ((objectScale * origin.y()) * mRotationHandleOffsetPercentage) * worldScale;
398 return QPointF(localT.inverted().map(QPointF(0, topDis)));
399}
400
401QPointF CameraTool::worldRotationHandlePoint(const QPoint& origin, const QTransform& localT, const qreal objectScale, const QTransform& worldT, float worldScale) const
402{
403 return worldT.map(localRotationHandlePoint(origin, localT, objectScale, worldScale));
404}
405
406void CameraTool::transformView(LayerCamera* layerCamera, CameraMoveType mode, const QPointF& point, const QPointF& offset, qreal angle, int frameNumber) const
407{
408 QPolygonF curPoly = mCameraPolygon;
409 QPointF curCenter = QLineF(curPoly.at(0), curPoly.at(2)).pointAt(0.5).toPoint();
410 QLineF lineOld(curCenter, point);
411 QLineF lineNew(curCenter, point);
412 Camera* curCam = layerCamera->getCameraAtFrame(frameNumber);
413
414 switch (mode)
415 {
416 case CameraMoveType::CENTER: {
417 curCam->translate(curCam->translation() - (point - offset));
418 break;
419 }
420 case CameraMoveType::TOPLEFT:
421 lineOld.setP2(curPoly.at(0));
422 curCam->scale(curCam->scaling() * (lineOld.length() / lineNew.length()));
423 break;
424 case CameraMoveType::TOPRIGHT:
425 lineOld.setP2(curPoly.at(1));
426 curCam->scale(curCam->scaling() * (lineOld.length() / lineNew.length()));
427 break;
428 case CameraMoveType::BOTTOMRIGHT:
429 lineOld.setP2(curPoly.at(2));
430 curCam->scale(curCam->scaling() * (lineOld.length() / lineNew.length()));
431 break;
432 case CameraMoveType::BOTTOMLEFT:
433 lineOld.setP2(curPoly.at(3));
434 curCam->scale(curCam->scaling() * (lineOld.length() / lineNew.length()));
435 break;
436 case CameraMoveType::ROTATION:
437 curCam->rotate(angle);
438 break;
439 default:
440 break;
441 }
442 curCam->updateViewTransform();
443 curCam->modification();
444}
445
446void CameraTool::paint(QPainter& painter, const QRect&)
447{
448 int frameIndex = mEditor->currentFrame();
449 LayerCamera* cameraLayerBelow = static_cast<LayerCamera*>(mEditor->object()->getLayerBelow(mEditor->currentLayerIndex(), Layer::CAMERA));
450
451 const QTransform& camTransform = cameraLayerBelow->getViewAtFrame(frameIndex);
452 const QRect& cameraRect = cameraLayerBelow->getViewRect();
453 const QTransform& worldT = mEditor->view()->getView();
454
455 bool isPlaying = mEditor->playback()->isPlaying();
456
457
458 // Show handles while we're on a camera layer and not doing playback
459 if (!isPlaying) {
460 int frame = cameraLayerBelow->getPreviousKeyFramePosition(frameIndex);
461 Camera* cam = cameraLayerBelow->getLastCameraAtFrame(qMax(frame, frameIndex), 0);
462 Q_ASSERT(cam);
463 qreal scale = cam->scaling();
464 qreal rotation = cam->rotation();
465 QPointF translation = cam->translation();
466 paintHandles(painter, worldT, camTransform, cameraRect, translation, scale, rotation, !cameraLayerBelow->keyExists(frameIndex));
467 }
468
469 cameraLayerBelow->foreachKeyFrame([&] (const KeyFrame* keyframe) {
470 paintInterpolations(painter, worldT, frameIndex, cameraLayerBelow, static_cast<const Camera*>(keyframe), isPlaying);
471 });
472}
473
474
475void CameraTool::paintHandles(QPainter& painter, const QTransform& worldTransform, const QTransform& camTransform, const QRect& cameraRect, const QPointF translation, const qreal scale, const qreal rotation, bool hollowHandles) const
476{
477 painter.save();
478
479 // if the current view is narrower than the camera field
480 // Indicates that the quality of the output will be degraded
481 if (scale > 1)
482 {
483 painter.setPen(Qt::red);
484 }
485 else
486 {
487 painter.setPen(QColor(0, 0, 0, 255));
488 }
489
490 const QPolygonF& camPolygon = Transform::mapToWorldPolygon(camTransform, worldTransform, cameraRect);
491 painter.drawPolygon(camPolygon);
492
493 QTransform scaleT;
494 scaleT.scale(1, 1);
495 scaleT.rotate(rotation);
496 scaleT.translate(translation.x(), translation.y());
497
498 const QPolygonF& nonScaledCamPoly = Transform::mapToWorldPolygon(scaleT, worldTransform, cameraRect);
499 painter.drawPolygon(nonScaledCamPoly);
500 painter.drawText(nonScaledCamPoly[0]-QPoint(0, 2), "100%");
501
502 if (hollowHandles) {
503 painter.setPen(mHandleDisabledColor);
504 painter.setBrush(Qt::gray);
505 } else {
506 painter.setPen(mHandlePen);
507 painter.setBrush(mHandleColor);
508 }
509 int handleW = mHandleWidth;
510 int radius = handleW / 2;
511
512 const QRectF& topRightCorner = QRectF(camPolygon.at(1).x() - radius,
513 camPolygon.at(1).y() - radius,
514 handleW, handleW);
515 painter.drawRect(topRightCorner);
516
517 const QRectF& bottomRightCorner = QRectF(camPolygon.at(2).x() - radius,
518 camPolygon.at(2).y() - radius,
519 handleW, handleW);
520 painter.drawRect(bottomRightCorner);
521 const QRectF& topLeftCorner = QRectF(camPolygon.at(0).x() - radius,
522 camPolygon.at(0).y() - radius,
523 handleW, handleW);
524 painter.drawRect(topLeftCorner);
525
526 const QRectF& bottomLeftCorner = QRectF(camPolygon.at(3).x() - radius,
527 camPolygon.at(3).y() - radius,
528 handleW, handleW);
529 painter.drawRect(bottomLeftCorner);
530
531 // Paint rotation handle
532 const QPointF& topCenter = QLineF(camPolygon.at(0), camPolygon.at(1)).pointAt(.5);
533 const QPointF& rotationHandle = worldRotationHandlePoint(cameraRect.topLeft(), camTransform, scale, worldTransform, mEditor->viewScaleInversed());
534
535 painter.drawLine(topCenter, rotationHandle);
536
537 painter.drawEllipse(QRectF((rotationHandle.x() - handleW*0.5),
538 (rotationHandle.y() - handleW*0.5),
539 handleW, handleW));
540
541 painter.restore();
542}
543
544void CameraTool::paintInterpolations(QPainter& painter, const QTransform& worldTransform, int currentFrame, const LayerCamera* cameraLayer, const Camera* keyframe, bool isPlaying) const
545{
546 QColor cameraDotColor = cameraLayer->getDotColor();
547 int frame = keyframe->pos();
548 int nextFrame = cameraLayer->getNextKeyFramePosition(frame);
549
550 if (cameraLayer->getShowCameraPath() && !cameraLayer->hasSameTranslation(frame, nextFrame)) {
551 painter.save();
552
553 painter.setBrush(cameraDotColor);
554
555 // Highlight current dot
556 QPen pen(Qt::black);
557 pen.setWidth(2);
558 painter.setPen(pen);
559 const QRect& cameraRect = cameraLayer->getViewRect();
560 const QTransform& cameraTransform = cameraLayer->getViewAtFrame(currentFrame);
561 const QPointF& centerDot = Transform::mapToWorldRect(cameraTransform, worldTransform, cameraRect).center();
562 painter.drawEllipse(centerDot, mDotWidth/2., mDotWidth/2.);
563
564 QPointF cameraPathPoint;
565 if (!keyframe->pathControlPointMoved()) {
566 cameraPathPoint = worldTransform.map(cameraLayer->getCenteredPathPoint(frame + 1));
567 } else {
568 cameraPathPoint = worldTransform.map(cameraLayer->getPathControlPointAtFrame(frame + 1));
569 }
570
571 painter.save();
572 QColor color = cameraDotColor;
573 if (currentFrame > frame && currentFrame < nextFrame)
574 color.setAlphaF(.5f);
575 else
576 color.setAlphaF(.2f);
577 painter.setPen(Qt::black);
578 painter.setBrush(color);
579
580 for (int frameInBetween = frame; frameInBetween <= nextFrame ; frameInBetween++)
581 {
582 const QTransform& transform = cameraLayer->getViewAtFrame(frameInBetween);
583 const QPointF& center = Transform::mapToWorldRect(transform, worldTransform, cameraRect).center();
584 painter.drawEllipse(center, mDotWidth/2., mDotWidth/2.);
585 }
586 painter.restore();
587
588 int distance = nextFrame - frame;
589 // It makes no sense to paint the path when there's no interpolation.
590 if (distance >= 2 && !isPlaying) {
591 paintControlPoint(painter, worldTransform, cameraLayer, frame, cameraPathPoint, cameraLayer->keyExists(currentFrame));
592 }
593
594 painter.restore();
595 }
596}
597
598void CameraTool::paintControlPoint(QPainter& painter, const QTransform& worldTransform, const LayerCamera* cameraLayer, const int frameIndex, const QPointF& pathPoint, bool hollowHandle) const
599{
600 painter.save();
601
602 // if active path, draw bezier help lines for active path
603 const QList<QPointF>& points = cameraLayer->getBezierPointsAtFrame(frameIndex + 1);
604
605 if (!points.empty())
606 {
607 Q_ASSERT(points.size() == 3);
608 QPointF p0 = worldTransform.map(points.at(0));
609 QPointF p1 = worldTransform.map(points.at(1));
610 QPointF p2 = worldTransform.map(points.at(2));
611
612 painter.save();
613 QPen pen (Qt::black, 0.5, Qt::PenStyle::DashLine);
614 painter.setPen(pen);
615 painter.drawLine(p0, p1);
616 painter.drawLine(p1, p2);
617 painter.restore();
618 }
619
620 // draw movemode in text
621 painter.setPen(Qt::black);
622 const QString& pathType = cameraLayer->getInterpolationTextAtFrame(frameIndex);
623
624 // Space text according to path point so it doesn't overlap
625 painter.drawText(pathPoint - QPoint(0, mHandleWidth), pathType);
626 painter.restore();
627
628 // if active path, draw move handle
629 painter.save();
630 painter.setPen(mHandleTextColor);
631
632 if (hollowHandle) {
633 painter.setPen(mHandleDisabledColor);
634 painter.setBrush(Qt::gray);
635 } else {
636 painter.setPen(mHandlePen);
637 painter.setBrush(mHandleColor);
638 }
639 painter.drawRect(static_cast<int>(pathPoint.x() - mHandleWidth/2),
640 static_cast<int>(pathPoint.y() - mHandleWidth/2),
641 mHandleWidth, mHandleWidth);
642 painter.restore();
643}
BaseTool
Definition: basetool.h:70
Camera
Definition: camera.h:25
Editor::frameModified
void frameModified(int frameNumber)
This should be emitted after modifying the frame content.
Editor::updateFrame
void updateFrame()
Will call update() and update the canvas Only call this directly If you need the cache to be intact a...
Definition: editor.cpp:850
KeyFrame
Definition: keyframe.h:30
LayerCamera
Definition: layercamera.h:30
Layer
Definition: layer.h:33
PointerEvent
Definition: pointerevent.h:8
ViewManager::getScaleInversed
qreal getScaleInversed() const
Definition: viewmanager.cpp:111
QColor
QColor::setAlphaF
void setAlphaF(qreal alpha)
QCursor
QImage
QImage::size
QSize size() const const
QLineF
QLineF::length
qreal length() const const
QLineF::pointAt
QPointF pointAt(qreal t) const const
QList
QList::at
const T & at(int i) const const
QList::empty
bool empty() const const
QList::size
int size() const const
QObject
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::event
virtual bool event(QEvent *e)
QPainter
QPainter::drawEllipse
void drawEllipse(const QRectF &rectangle)
QPainter::drawLine
void drawLine(const QLineF &line)
QPainter::drawPolygon
void drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule)
QPainter::drawRect
void drawRect(const QRectF &rectangle)
QPainter::drawText
void drawText(const QPointF &position, const QString &text)
QPainter::restore
void restore()
QPainter::save
void save()
QPainter::setBrush
void setBrush(const QBrush &brush)
QPainter::setPen
void setPen(const QColor &color)
QPen
QPen::setColor
void setColor(const QColor &color)
QPen::setWidth
void setWidth(int width)
QPixmap
QPixmap::fill
void fill(const QColor &color)
QPoint
QPoint::x
int x() const const
QPoint::y
int y() const const
QPointF
QPointF::toPoint
QPoint toPoint() const const
QPointF::x
qreal x() const const
QPointF::y
qreal y() const const
QPolygonF
QPolygonF::containsPoint
bool containsPoint(const QPointF &point, Qt::FillRule fillRule) const const
QRect
QRect::topLeft
QPoint topLeft() const const
QRectF
QRectF::center
QPointF center() const const
QSize::height
int height() const const
QSize::width
int width() const const
QString
Qt::ArrowCursor
ArrowCursor
Qt::white
white
Qt::KeyboardModifiers
typedef KeyboardModifiers
Qt::center
QTextStream & center(QTextStream &stream)
QTransform
QTransform::inverted
QTransform inverted(bool *invertible) const const
QTransform::map
QPoint map(const QPoint &point) const const
QTransform::rotate
QTransform & rotate(qreal angle, Qt::Axis axis)
QTransform::scale
QTransform & scale(qreal sx, qreal sy)
QTransform::translate
QTransform & translate(qreal dx, qreal dy)
QVector::at
const T & at(int i) const const
QVector::count
int count(const T &value) const const
Generated on Thu May 8 2025 04:47:53 for Pencil2D by doxygen 1.9.6 based on revision 4513250b1d5b1a3676ec0e67b06b7a885ceaae39