Skip to content

Commit 98d4974

Browse files
committed
Add TargetModel class
1 parent c5ec812 commit 98d4974

11 files changed

+514
-320
lines changed

src/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ qt_add_qml_module(scratchcpp-render
2424
projectloader.h
2525
projectscene.cpp
2626
projectscene.h
27+
targetmodel.cpp
28+
targetmodel.h
2729
stagemodel.cpp
2830
stagemodel.h
2931
spritemodel.cpp

src/spritemodel.cpp

+47-136
Original file line numberDiff line numberDiff line change
@@ -6,52 +6,21 @@
66
#include <scratchcpp/textbubble.h>
77

88
#include "spritemodel.h"
9-
#include "renderedtarget.h"
10-
#include "ipenlayer.h"
11-
#include "graphicseffect.h"
9+
#include "penlayer.h"
1210

13-
namespace scratchcpprender
14-
{
11+
using namespace scratchcpprender;
1512

1613
SpriteModel::SpriteModel(QObject *parent) :
17-
QObject(parent)
14+
TargetModel(parent)
1815
{
1916
}
2017

2118
void SpriteModel::init(libscratchcpp::Sprite *sprite)
2219
{
2320
m_sprite = sprite;
2421

25-
if (m_sprite) {
26-
libscratchcpp::TextBubble *bubble = m_sprite->bubble();
27-
28-
bubble->typeChanged().connect([this](libscratchcpp::TextBubble::Type type) {
29-
if (type == libscratchcpp::TextBubble::Type::Say) {
30-
if (m_bubbleType == TextBubbleShape::Type::Say)
31-
return;
32-
33-
m_bubbleType = TextBubbleShape::Type::Say;
34-
} else {
35-
if (m_bubbleType == TextBubbleShape::Type::Think)
36-
return;
37-
38-
m_bubbleType = TextBubbleShape::Type::Think;
39-
}
40-
41-
emit bubbleTypeChanged();
42-
});
43-
44-
bubble->textChanged().connect([this](const std::string &text) {
45-
QString newText = QString::fromStdString(text);
46-
47-
if (m_bubbleText != newText) {
48-
m_bubbleText = newText;
49-
emit bubbleTextChanged();
50-
}
51-
});
52-
53-
bubble->layerOrderChanged().connect([this](int) { emit bubbleLayerChanged(); });
54-
}
22+
if (m_sprite)
23+
setupTextBubble(m_sprite->bubble());
5524
}
5625

5726
void SpriteModel::deinitClone()
@@ -66,184 +35,119 @@ void SpriteModel::onCloned(libscratchcpp::Sprite *clone)
6635

6736
SpriteModel *cloneModel = new SpriteModel(m_cloneRoot);
6837
cloneModel->m_cloneRoot = m_cloneRoot;
69-
cloneModel->m_penLayer = m_penLayer;
70-
cloneModel->m_penState = m_penState;
38+
cloneModel->setPenLayer(penLayer());
39+
cloneModel->penState() = penState();
7140
clone->setInterface(cloneModel);
7241
emit cloned(cloneModel);
7342
}
7443

7544
void SpriteModel::onCostumeChanged(libscratchcpp::Costume *costume)
7645
{
77-
if (m_renderedTarget)
78-
m_renderedTarget->updateCostume(costume);
46+
updateCostume(costume);
7947
}
8048

8149
void SpriteModel::onVisibleChanged(bool visible)
8250
{
83-
if (m_renderedTarget)
84-
m_renderedTarget->updateVisibility(visible);
51+
updateVisibility(visible);
8552
}
8653

8754
void SpriteModel::onXChanged(double x)
8855
{
89-
if (m_renderedTarget)
90-
m_renderedTarget->updateX(x);
56+
updateX(x);
9157
}
9258

9359
void SpriteModel::onYChanged(double y)
9460
{
95-
if (m_renderedTarget)
96-
m_renderedTarget->updateY(y);
61+
updateY(y);
9762
}
9863

9964
void SpriteModel::onMoved(double oldX, double oldY, double newX, double newY)
10065
{
101-
if (m_penState.penDown && m_penLayer) {
102-
m_penLayer->drawLine(m_penState.penAttributes, oldX, oldY, newX, newY);
103-
libscratchcpp::IEngine *engine = m_sprite->engine();
104-
105-
if (engine)
106-
engine->requestRedraw();
107-
}
66+
TargetModel::onMoved(oldX, oldY, newX, newY);
10867
}
10968

11069
void SpriteModel::onSizeChanged(double size)
11170
{
112-
if (m_renderedTarget)
113-
m_renderedTarget->updateSize(size);
71+
updateSize(size);
11472
}
11573

11674
void SpriteModel::onDirectionChanged(double direction)
11775
{
118-
if (m_renderedTarget)
119-
m_renderedTarget->updateDirection(direction);
76+
updateDirection(direction);
12077
}
12178

12279
void SpriteModel::onRotationStyleChanged(libscratchcpp::Sprite::RotationStyle rotationStyle)
12380
{
124-
if (m_renderedTarget)
125-
m_renderedTarget->updateRotationStyle(rotationStyle);
81+
updateRotationStyle(rotationStyle);
12682
}
12783

12884
void SpriteModel::onLayerOrderChanged(int layerOrder)
12985
{
130-
if (m_renderedTarget)
131-
m_renderedTarget->updateLayerOrder(layerOrder);
86+
updateLayerOrder(layerOrder);
13287
}
13388

13489
void SpriteModel::onGraphicsEffectChanged(libscratchcpp::IGraphicsEffect *effect, double value)
13590
{
136-
GraphicsEffect *graphicsEffect = dynamic_cast<GraphicsEffect *>(effect);
137-
138-
if (graphicsEffect && m_renderedTarget)
139-
m_renderedTarget->setGraphicEffect(graphicsEffect->effect(), value);
91+
setGraphicEffect(effect, value);
14092
}
14193

14294
void SpriteModel::onGraphicsEffectsCleared()
14395
{
144-
if (m_renderedTarget)
145-
m_renderedTarget->clearGraphicEffects();
96+
clearGraphicEffects();
14697
}
14798

14899
int SpriteModel::costumeWidth() const
149100
{
150-
return m_renderedTarget->costumeWidth();
101+
return TargetModel::costumeWidth();
151102
}
152103

153104
int SpriteModel::costumeHeight() const
154105
{
155-
return m_renderedTarget->costumeHeight();
106+
return TargetModel::costumeHeight();
156107
}
157108

158109
libscratchcpp::Rect SpriteModel::boundingRect() const
159110
{
160-
return m_renderedTarget->getBounds();
111+
libscratchcpp::Rect ret;
112+
getBoundingRect(ret);
113+
return ret;
161114
}
162115

163116
libscratchcpp::Rect SpriteModel::fastBoundingRect() const
164117
{
165-
return m_renderedTarget->getFastBounds();
118+
libscratchcpp::Rect ret;
119+
getFastBoundingRect(ret);
120+
return ret;
166121
}
167122

168123
bool SpriteModel::touchingClones(const std::vector<libscratchcpp::Sprite *> &clones) const
169124
{
170-
return m_renderedTarget->touchingClones(clones);
125+
return TargetModel::touchingClones(clones);
171126
}
172127

173128
bool SpriteModel::touchingPoint(double x, double y) const
174129
{
175-
return m_renderedTarget->containsScratchPoint(x, y);
130+
return TargetModel::touchingPoint(x, y);
176131
}
177132

178133
bool SpriteModel::touchingColor(libscratchcpp::Rgb color) const
179134
{
180-
return m_renderedTarget->touchingColor(color);
135+
return TargetModel::touchingColor(color);
181136
}
182137

183138
bool SpriteModel::touchingColor(libscratchcpp::Rgb color, libscratchcpp::Rgb mask) const
184139
{
185-
return m_renderedTarget->touchingColor(color, mask);
140+
return TargetModel::touchingColor(color, mask);
186141
}
187142

188143
libscratchcpp::Sprite *SpriteModel::sprite() const
189144
{
190145
return m_sprite;
191146
}
192147

193-
IRenderedTarget *SpriteModel::renderedTarget() const
194-
{
195-
return m_renderedTarget;
196-
}
197-
198-
void SpriteModel::setRenderedTarget(IRenderedTarget *newRenderedTarget)
199-
{
200-
if (m_renderedTarget == newRenderedTarget)
201-
return;
202-
203-
m_renderedTarget = newRenderedTarget;
204-
emit renderedTargetChanged();
205-
}
206-
207-
IPenLayer *SpriteModel::penLayer() const
208-
{
209-
return m_penLayer;
210-
}
211-
212-
void SpriteModel::setPenLayer(IPenLayer *newPenLayer)
213-
{
214-
if (m_penLayer == newPenLayer)
215-
return;
216-
217-
m_penLayer = newPenLayer;
218-
emit penLayerChanged();
219-
}
220-
221-
PenState &SpriteModel::penState()
222-
{
223-
return m_penState;
224-
}
225-
226-
PenAttributes &SpriteModel::penAttributes()
227-
{
228-
return m_penState.penAttributes;
229-
}
230-
231-
bool SpriteModel::penDown() const
232-
{
233-
return m_penState.penDown;
234-
}
235-
236-
void SpriteModel::setPenDown(bool newPenDown)
148+
int SpriteModel::bubbleLayer() const
237149
{
238-
m_penState.penDown = newPenDown;
239-
240-
if (m_penState.penDown && m_penLayer && m_sprite) {
241-
m_penLayer->drawPoint(m_penState.penAttributes, m_sprite->x(), m_sprite->y());
242-
libscratchcpp::IEngine *engine = m_sprite->engine();
243-
244-
if (engine)
245-
engine->requestRedraw();
246-
}
150+
return m_sprite ? m_sprite->bubble()->layerOrder() : 0;
247151
}
248152

249153
SpriteModel *SpriteModel::cloneRoot() const
@@ -254,19 +158,26 @@ SpriteModel *SpriteModel::cloneRoot() const
254158
return m_cloneRoot;
255159
}
256160

257-
const TextBubbleShape::Type &SpriteModel::bubbleType() const
161+
void SpriteModel::loadCostume()
258162
{
259-
return m_bubbleType;
163+
if (m_sprite)
164+
updateCostume(m_sprite->currentCostume().get());
260165
}
261166

262-
const QString &SpriteModel::bubbleText() const
167+
void SpriteModel::drawPenPoint(IPenLayer *penLayer, const PenAttributes &penAttributes)
263168
{
264-
return m_bubbleText;
169+
penLayer->drawPoint(penAttributes, m_sprite->x(), m_sprite->y());
170+
libscratchcpp::IEngine *engine = m_sprite->engine();
171+
172+
if (engine)
173+
engine->requestRedraw();
265174
}
266175

267-
int SpriteModel::bubbleLayer() const
176+
void SpriteModel::drawPenLine(IPenLayer *penLayer, const PenAttributes &penAttributes, double x0, double y0, double x1, double y1)
268177
{
269-
return m_sprite ? m_sprite->bubble()->layerOrder() : 0;
270-
}
178+
penLayer->drawLine(penAttributes, x0, y0, x1, y1);
179+
libscratchcpp::IEngine *engine = m_sprite->engine();
271180

272-
} // namespace scratchcpprender
181+
if (engine)
182+
engine->requestRedraw();
183+
}

src/spritemodel.h

+8-42
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,19 @@
22

33
#pragma once
44

5-
#include <QObject>
6-
#include <QQmlEngine>
75
#include <scratchcpp/ispritehandler.h>
86

9-
#include "penstate.h"
10-
#include "textbubbleshape.h"
11-
12-
Q_MOC_INCLUDE("renderedtarget.h");
13-
Q_MOC_INCLUDE("ipenlayer.h");
7+
#include "targetmodel.h"
148

159
namespace scratchcpprender
1610
{
1711

18-
class IRenderedTarget;
19-
class IPenLayer;
20-
2112
class SpriteModel
22-
: public QObject
13+
: public TargetModel
2314
, public libscratchcpp::ISpriteHandler
2415
{
2516
Q_OBJECT
2617
QML_ELEMENT
27-
Q_PROPERTY(IRenderedTarget *renderedTarget READ renderedTarget WRITE setRenderedTarget NOTIFY renderedTargetChanged)
28-
Q_PROPERTY(IPenLayer *penLayer READ penLayer WRITE setPenLayer NOTIFY penLayerChanged)
29-
Q_PROPERTY(TextBubbleShape::Type bubbleType READ bubbleType NOTIFY bubbleTypeChanged)
30-
Q_PROPERTY(QString bubbleText READ bubbleText NOTIFY bubbleTextChanged)
31-
Q_PROPERTY(int bubbleLayer READ bubbleLayer NOTIFY bubbleLayerChanged)
3218

3319
public:
3420
SpriteModel(QObject *parent = nullptr);
@@ -65,43 +51,23 @@ class SpriteModel
6551

6652
libscratchcpp::Sprite *sprite() const;
6753

68-
IRenderedTarget *renderedTarget() const;
69-
void setRenderedTarget(IRenderedTarget *newRenderedTarget);
70-
71-
IPenLayer *penLayer() const;
72-
void setPenLayer(IPenLayer *newPenLayer);
73-
74-
PenState &penState();
75-
PenAttributes &penAttributes();
76-
77-
bool penDown() const;
78-
void setPenDown(bool newPenDown);
54+
int bubbleLayer() const override;
7955

8056
SpriteModel *cloneRoot() const;
8157

82-
const TextBubbleShape::Type &bubbleType() const;
83-
84-
const QString &bubbleText() const;
85-
86-
int bubbleLayer() const;
58+
Q_INVOKABLE void loadCostume() override;
8759

8860
signals:
89-
void renderedTargetChanged();
90-
void penLayerChanged();
91-
void bubbleTypeChanged();
92-
void bubbleTextChanged();
9361
void cloned(SpriteModel *cloneModel);
9462
void cloneDeleted(SpriteModel *clone);
95-
void bubbleLayerChanged();
63+
64+
protected:
65+
void drawPenPoint(IPenLayer *penLayer, const PenAttributes &penAttributes) override;
66+
void drawPenLine(IPenLayer *penLayer, const PenAttributes &penAttributes, double x0, double y0, double x1, double y1) override;
9667

9768
private:
9869
libscratchcpp::Sprite *m_sprite = nullptr;
99-
IRenderedTarget *m_renderedTarget = nullptr;
100-
IPenLayer *m_penLayer = nullptr;
101-
PenState m_penState;
10270
SpriteModel *m_cloneRoot = nullptr;
103-
TextBubbleShape::Type m_bubbleType = TextBubbleShape::Type::Say;
104-
QString m_bubbleText;
10571
};
10672

10773
} // namespace scratchcpprender

0 commit comments

Comments
 (0)