Skip to content

Commit a86a04f

Browse files
committed
Add pen properties to SpriteModel
1 parent cb7a5f9 commit a86a04f

File tree

3 files changed

+97
-0
lines changed

3 files changed

+97
-0
lines changed

src/spritemodel.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "spritemodel.h"
77
#include "renderedtarget.h"
8+
#include "ipenlayer.h"
89

910
namespace scratchcpprender
1011
{
@@ -115,6 +116,41 @@ void SpriteModel::setRenderedTarget(IRenderedTarget *newRenderedTarget)
115116
emit renderedTargetChanged();
116117
}
117118

119+
IPenLayer *SpriteModel::penLayer() const
120+
{
121+
return m_penLayer;
122+
}
123+
124+
void SpriteModel::setPenLayer(IPenLayer *newPenLayer)
125+
{
126+
if (m_penLayer == newPenLayer)
127+
return;
128+
129+
m_penLayer = newPenLayer;
130+
emit penLayerChanged();
131+
}
132+
133+
PenAttributes &SpriteModel::penAttributes()
134+
{
135+
return m_penAttributes;
136+
}
137+
138+
bool SpriteModel::penDown() const
139+
{
140+
return m_penDown;
141+
}
142+
143+
void SpriteModel::setPenDown(bool newPenDown)
144+
{
145+
if (m_penDown == newPenDown)
146+
return;
147+
148+
m_penDown = newPenDown;
149+
150+
if (m_penDown && m_penLayer && m_sprite)
151+
m_penLayer->drawPoint(m_penAttributes, m_sprite->x(), m_sprite->y());
152+
}
153+
118154
SpriteModel *SpriteModel::cloneRoot() const
119155
{
120156
if (m_cloneRoot == this)

src/spritemodel.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
#include <QQmlEngine>
77
#include <scratchcpp/ispritehandler.h>
88

9+
#include "penattributes.h"
10+
911
Q_MOC_INCLUDE("renderedtarget.h");
12+
Q_MOC_INCLUDE("ipenlayer.h");
1013

1114
namespace scratchcpprender
1215
{
1316

1417
class IRenderedTarget;
18+
class IPenLayer;
1519

1620
class SpriteModel
1721
: public QObject
@@ -20,6 +24,7 @@ class SpriteModel
2024
Q_OBJECT
2125
QML_ELEMENT
2226
Q_PROPERTY(IRenderedTarget *renderedTarget READ renderedTarget WRITE setRenderedTarget NOTIFY renderedTargetChanged)
27+
Q_PROPERTY(IPenLayer *penLayer READ penLayer WRITE setPenLayer NOTIFY penLayerChanged)
2328

2429
public:
2530
SpriteModel(QObject *parent = nullptr);
@@ -49,16 +54,29 @@ class SpriteModel
4954
IRenderedTarget *renderedTarget() const;
5055
void setRenderedTarget(IRenderedTarget *newRenderedTarget);
5156

57+
IPenLayer *penLayer() const;
58+
void setPenLayer(IPenLayer *newPenLayer);
59+
60+
PenAttributes &penAttributes();
61+
void setPenAttributes(const PenAttributes &newPenAttributes);
62+
63+
bool penDown() const;
64+
void setPenDown(bool newPenDown);
65+
5266
SpriteModel *cloneRoot() const;
5367

5468
signals:
5569
void renderedTargetChanged();
70+
void penLayerChanged();
5671
void cloned(SpriteModel *cloneModel);
5772
void cloneDeleted(SpriteModel *clone);
5873

5974
private:
6075
libscratchcpp::Sprite *m_sprite = nullptr;
6176
IRenderedTarget *m_renderedTarget = nullptr;
77+
IPenLayer *m_penLayer = nullptr;
78+
PenAttributes m_penAttributes;
79+
bool m_penDown = false;
6280
SpriteModel *m_cloneRoot = nullptr;
6381
};
6482

test/target_models/spritemodel_test.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22
#include <scratchcpp/costume.h>
33
#include <spritemodel.h>
44
#include <renderedtargetmock.h>
5+
#include <penlayermock.h>
56

67
#include "../common.h"
78

89
using namespace scratchcpprender;
910
using namespace libscratchcpp;
1011

1112
using ::testing::Return;
13+
using ::testing::WithArgs;
14+
using ::testing::Invoke;
15+
using ::testing::_;
1216

1317
TEST(SpriteModelTest, Constructors)
1418
{
@@ -204,3 +208,42 @@ TEST(SpriteModelTest, RenderedTarget)
204208
ASSERT_EQ(spy.count(), 1);
205209
ASSERT_EQ(model.renderedTarget(), &renderedTarget);
206210
}
211+
212+
TEST(SpriteModelTest, PenLayer)
213+
{
214+
SpriteModel model;
215+
ASSERT_EQ(model.penLayer(), nullptr);
216+
217+
PenLayerMock penLayer;
218+
QSignalSpy spy(&model, &SpriteModel::penLayerChanged);
219+
model.setPenLayer(&penLayer);
220+
ASSERT_EQ(spy.count(), 1);
221+
ASSERT_EQ(model.penLayer(), &penLayer);
222+
}
223+
224+
TEST(SpriteModelTest, PenDown)
225+
{
226+
SpriteModel model;
227+
Sprite sprite;
228+
sprite.setX(24.6);
229+
sprite.setY(-48.8);
230+
model.init(&sprite);
231+
ASSERT_FALSE(model.penDown());
232+
233+
PenLayerMock penLayer;
234+
model.setPenLayer(&penLayer);
235+
236+
PenAttributes &attr = model.penAttributes();
237+
238+
EXPECT_CALL(penLayer, drawPoint(_, 24.6, -48.8)).WillOnce(WithArgs<0>(Invoke([&attr](const PenAttributes &attrArg) { ASSERT_EQ(&attr, &attrArg); })));
239+
model.setPenDown(true);
240+
ASSERT_TRUE(model.penDown());
241+
242+
EXPECT_CALL(penLayer, drawPoint).Times(0);
243+
model.setPenDown(true);
244+
ASSERT_TRUE(model.penDown());
245+
246+
EXPECT_CALL(penLayer, drawPoint).Times(0);
247+
model.setPenDown(false);
248+
ASSERT_FALSE(model.penDown());
249+
}

0 commit comments

Comments
 (0)