1
2
3 #include "toonz/tobjecthandle.h"
4
5 #include "toonz/tstageobjectid.h"
6 #include "toonz/tstageobject.h"
7 #include "toonz/tstageobjectspline.h"
8 #include "toonz/txsheet.h"
9 #include "tvectorimage.h"
10 #include "tstroke.h"
11
12 namespace {
13
clearImage(TVectorImage * img)14 void clearImage(TVectorImage *img) {
15 while (img->getStrokeCount()) img->deleteStroke(0);
16 }
17
18 // obj -> image
getSpline(TVectorImage * dstImg,TStageObjectId objId,TStageObjectSpline * currentSpline)19 void getSpline(TVectorImage *dstImg, TStageObjectId objId,
20 TStageObjectSpline *currentSpline) {
21 QMutexLocker lock(dstImg->getMutex());
22 clearImage(dstImg);
23 if (currentSpline)
24 dstImg->addStroke(new TStroke(*currentSpline->getStroke()));
25 }
26
27 // image -> obj
setSpline(TVectorImage * srcImg,TStageObjectId objId,TStageObjectSpline * currentSpline)28 void setSpline(TVectorImage *srcImg, TStageObjectId objId,
29 TStageObjectSpline *currentSpline) {
30 if (!currentSpline) return;
31 if (srcImg->getStrokeCount() == 0) {
32 double d = 30;
33 std::vector<TThickPoint> points;
34 points.push_back(TPointD(-d, 0));
35 points.push_back(TPointD(0, 0));
36 points.push_back(TPointD(d, 0));
37 srcImg->addStroke(new TStroke(points), false);
38 }
39 TStroke *stroke = srcImg->getStroke(0);
40 currentSpline->setStroke(new TStroke(*stroke));
41 }
42
43 } // namespace
44
45 //=============================================================================
46 // TXshLevelHandle
47 //-----------------------------------------------------------------------------
48
TObjectHandle()49 TObjectHandle::TObjectHandle()
50 : m_objectId(TStageObjectId::NoneId)
51 , m_isSpline(false)
52 , m_splineImage(0)
53 , m_currentSpline(0) {
54 m_splineImage = new TVectorImage();
55 m_splineImage->addRef();
56 }
57
58 //-----------------------------------------------------------------------------
59
~TObjectHandle()60 TObjectHandle::~TObjectHandle() { m_splineImage->release(); }
61
62 //-----------------------------------------------------------------------------
63
getObjectId()64 TStageObjectId TObjectHandle::getObjectId() { return m_objectId; }
65
66 //-----------------------------------------------------------------------------
67
setObjectId(TStageObjectId objectId)68 void TObjectHandle::setObjectId(TStageObjectId objectId) {
69 if (m_objectId != objectId) {
70 m_objectId = objectId;
71 m_isSpline = false;
72 clearImage(m_splineImage);
73 emit objectSwitched();
74 }
75 }
76
77 //-----------------------------------------------------------------------------
78
setIsSpline(bool isSpline)79 void TObjectHandle::setIsSpline(bool isSpline) {
80 if (m_isSpline != isSpline) {
81 m_isSpline = isSpline;
82 emit objectSwitched();
83 }
84 }
85
86 //-----------------------------------------------------------------------------
87
commitSplineChanges()88 void TObjectHandle::commitSplineChanges() {
89 setSpline(m_splineImage, m_objectId, m_currentSpline);
90 emit splineChanged();
91 }
92
93 //-----------------------------------------------------------------------------
94
setSplineObject(TStageObjectSpline * splineObject)95 void TObjectHandle::setSplineObject(TStageObjectSpline *splineObject) {
96 m_currentSpline = splineObject;
97 if (m_isSpline && m_currentSpline)
98 getSpline(m_splineImage, m_objectId, m_currentSpline);
99 }
100