Skip to content

Commit d153557

Browse files
committed
Implement pen_setPenSizeTo block
1 parent 7efdd13 commit d153557

File tree

3 files changed

+140
-0
lines changed

3 files changed

+140
-0
lines changed

src/blocks/penblocks.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ void PenBlocks::registerBlocks(IEngine *engine)
8787
engine->addCompileFunction(this, "pen_changePenColorParamBy", &compileChangePenColorParamBy);
8888
engine->addCompileFunction(this, "pen_setPenColorParamTo", &compileSetPenColorParamTo);
8989
engine->addCompileFunction(this, "pen_changePenSizeBy", &compileChangePenSizeBy);
90+
engine->addCompileFunction(this, "pen_setPenSizeTo", &compileSetPenSizeTo);
9091
}
9192

9293
CompilerValue *PenBlocks::compileClear(Compiler *compiler)
@@ -190,6 +191,13 @@ CompilerValue *PenBlocks::compileChangePenSizeBy(Compiler *compiler)
190191
return nullptr;
191192
}
192193

194+
CompilerValue *PenBlocks::compileSetPenSizeTo(Compiler *compiler)
195+
{
196+
CompilerValue *size = compiler->addInput("SIZE");
197+
compiler->addTargetFunctionCall("pen_setPenSizeTo", Compiler::StaticType::Void, { Compiler::StaticType::Number }, { size });
198+
return nullptr;
199+
}
200+
193201
static TargetModel *getTargetModel(Target *target)
194202
{
195203
if (target->isStage()) {
@@ -323,3 +331,9 @@ BLOCK_EXPORT void pen_changePenSizeBy(Target *target, double value)
323331
PenAttributes &penAttributes = getTargetModel(target)->penAttributes();
324332
penAttributes.diameter = std::clamp(penAttributes.diameter + value, PEN_SIZE_MIN, PEN_SIZE_MAX);
325333
}
334+
335+
BLOCK_EXPORT void pen_setPenSizeTo(Target *target, double value)
336+
{
337+
PenAttributes &penAttributes = getTargetModel(target)->penAttributes();
338+
penAttributes.diameter = std::clamp(value, PEN_SIZE_MIN, PEN_SIZE_MAX);
339+
}

src/blocks/penblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class PenBlocks : public libscratchcpp::IExtension
2222
static libscratchcpp::CompilerValue *compileChangePenColorParamBy(libscratchcpp::Compiler *compiler);
2323
static libscratchcpp::CompilerValue *compileSetPenColorParamTo(libscratchcpp::Compiler *compiler);
2424
static libscratchcpp::CompilerValue *compileChangePenSizeBy(libscratchcpp::Compiler *compiler);
25+
static libscratchcpp::CompilerValue *compileSetPenSizeTo(libscratchcpp::Compiler *compiler);
2526
};
2627

2728
} // namespace scratchcpprender

test/blocks/pen_blocks_test.cpp

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2077,3 +2077,128 @@ TEST_F(PenBlocksTest, ChangePenSizeBy_Stage)
20772077
thread->run();
20782078
ASSERT_EQ(model.penAttributes().diameter, 513.8);
20792079
}
2080+
2081+
TEST_F(PenBlocksTest, SetPenSizeTo)
2082+
{
2083+
auto sprite = std::make_shared<Sprite>();
2084+
sprite->setEngine(&m_engineMock);
2085+
2086+
RenderedTarget renderedTarget;
2087+
SpriteModel model;
2088+
model.init(sprite.get());
2089+
model.setRenderedTarget(&renderedTarget);
2090+
sprite->setInterface(&model);
2091+
2092+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2093+
builder.addBlock("pen_setPenSizeTo");
2094+
builder.addValueInput("SIZE", 511.5);
2095+
2096+
model.penAttributes().diameter = 2.3;
2097+
2098+
auto thread = buildScript(builder, sprite.get());
2099+
2100+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2101+
2102+
thread->run();
2103+
ASSERT_EQ(model.penAttributes().diameter, 511.5);
2104+
}
2105+
2106+
TEST_F(PenBlocksTest, SetPenSizeTo_Negative)
2107+
{
2108+
auto sprite = std::make_shared<Sprite>();
2109+
sprite->setEngine(&m_engineMock);
2110+
2111+
RenderedTarget renderedTarget;
2112+
SpriteModel model;
2113+
model.init(sprite.get());
2114+
model.setRenderedTarget(&renderedTarget);
2115+
sprite->setInterface(&model);
2116+
2117+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2118+
builder.addBlock("pen_setPenSizeTo");
2119+
builder.addValueInput("SIZE", -0.5);
2120+
2121+
model.penAttributes().diameter = 2.3;
2122+
2123+
auto thread = buildScript(builder, sprite.get());
2124+
2125+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2126+
2127+
thread->run();
2128+
ASSERT_EQ(model.penAttributes().diameter, 1);
2129+
}
2130+
2131+
TEST_F(PenBlocksTest, SetPenSizeTo_AboveMaximum)
2132+
{
2133+
auto sprite = std::make_shared<Sprite>();
2134+
sprite->setEngine(&m_engineMock);
2135+
2136+
RenderedTarget renderedTarget;
2137+
SpriteModel model;
2138+
model.init(sprite.get());
2139+
model.setRenderedTarget(&renderedTarget);
2140+
sprite->setInterface(&model);
2141+
2142+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2143+
builder.addBlock("pen_setPenSizeTo");
2144+
builder.addValueInput("SIZE", 1200.6);
2145+
2146+
model.penAttributes().diameter = 513.8;
2147+
2148+
auto thread = buildScript(builder, sprite.get());
2149+
2150+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2151+
2152+
thread->run();
2153+
ASSERT_EQ(model.penAttributes().diameter, 1200);
2154+
}
2155+
2156+
TEST_F(PenBlocksTest, SetPenSizeTo_BelowMinimum)
2157+
{
2158+
auto sprite = std::make_shared<Sprite>();
2159+
sprite->setEngine(&m_engineMock);
2160+
2161+
RenderedTarget renderedTarget;
2162+
SpriteModel model;
2163+
model.init(sprite.get());
2164+
model.setRenderedTarget(&renderedTarget);
2165+
sprite->setInterface(&model);
2166+
2167+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2168+
builder.addBlock("pen_setPenSizeTo");
2169+
builder.addValueInput("SIZE", 0.5);
2170+
2171+
model.penAttributes().diameter = 12.5;
2172+
2173+
auto thread = buildScript(builder, sprite.get());
2174+
2175+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2176+
2177+
thread->run();
2178+
ASSERT_EQ(model.penAttributes().diameter, 1);
2179+
}
2180+
2181+
TEST_F(PenBlocksTest, SetPenSizeTo_Stage)
2182+
{
2183+
auto stage = std::make_shared<Stage>();
2184+
stage->setEngine(&m_engineMock);
2185+
2186+
RenderedTarget renderedTarget;
2187+
StageModel model;
2188+
model.init(stage.get());
2189+
model.setRenderedTarget(&renderedTarget);
2190+
stage->setInterface(&model);
2191+
2192+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
2193+
builder.addBlock("pen_setPenSizeTo");
2194+
builder.addValueInput("SIZE", 511.5);
2195+
2196+
model.penAttributes().diameter = 2.3;
2197+
2198+
auto thread = buildScript(builder, stage.get());
2199+
2200+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2201+
2202+
thread->run();
2203+
ASSERT_EQ(model.penAttributes().diameter, 511.5);
2204+
}

0 commit comments

Comments
 (0)