Skip to content

Commit eea6528

Browse files
committed
Add monitor change function
1 parent 7b4141d commit eea6528

File tree

7 files changed

+39
-0
lines changed

7 files changed

+39
-0
lines changed

include/scratchcpp/global.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ enum class ScratchVersion
3232
class VirtualMachine;
3333
class Compiler;
3434
class Block;
35+
class Value;
3536

3637
/*!
3738
* \typedef BlockFunc
@@ -54,6 +55,13 @@ using BlockComp = void (*)(Compiler *);
5455
*/
5556
using MonitorNameFunc = const std::string &(*)(Block *);
5657

58+
/*!
59+
* \typedef MonitorChangeFunc
60+
*
61+
* MonitorChangeFunc is a function pointer for functions which are used to change monitor values.
62+
*/
63+
using MonitorChangeFunc = void (*)(Block *, const Value &newValue);
64+
5765
} // namespace libscratchcpp
5866

5967
#endif // LIBSCRATCHCPP_GLOBAL_H

include/scratchcpp/iengine.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,12 @@ class LIBSCRATCHCPP_EXPORT IEngine
223223
*/
224224
virtual void addMonitorNameFunction(IBlockSection *section, const std::string &opcode, MonitorNameFunc f) = 0;
225225

226+
/*!
227+
* Call this from IBlockSection#registerBlocks() to add a monitor value change function to a block section.
228+
* \see <a href="blockSections.html">Block sections</a>
229+
*/
230+
virtual void addMonitorChangeFunction(IBlockSection *section, const std::string &opcode, MonitorChangeFunc f) = 0;
231+
226232
/*!
227233
* Call this from IBlockSection#registerBlocks() to add a hat block to a block section.
228234
* \see <a href="blockSections.html">Block sections</a>

src/engine/internal/blocksectioncontainer.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ void BlockSectionContainer::addMonitorNameFunction(const std::string &opcode, Mo
1616
m_monitorNameFunctions[opcode] = f;
1717
}
1818

19+
void BlockSectionContainer::addMonitorChangeFunction(const std::string &opcode, MonitorChangeFunc f)
20+
{
21+
m_monitorChangeFunctions[opcode] = f;
22+
}
23+
1924
void BlockSectionContainer::addHatBlock(const std::string &opcode)
2025
{
2126
m_compileFunctions[opcode] = &dummyFunction;
@@ -50,6 +55,13 @@ MonitorNameFunc BlockSectionContainer::resolveMonitorNameFunc(const std::string
5055
return nullptr;
5156
}
5257

58+
MonitorChangeFunc BlockSectionContainer::resolveMonitorChangeFunc(const std::string &opcode) const
59+
{
60+
if (m_monitorChangeFunctions.count(opcode) == 1)
61+
return m_monitorChangeFunctions.at(opcode);
62+
return nullptr;
63+
}
64+
5365
int BlockSectionContainer::resolveInput(const std::string &name) const
5466
{
5567
if (m_inputs.count(name) == 1)

src/engine/internal/blocksectioncontainer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,23 @@ class BlockSectionContainer
1717

1818
void addCompileFunction(const std::string &opcode, BlockComp f);
1919
void addMonitorNameFunction(const std::string &opcode, MonitorNameFunc f);
20+
void addMonitorChangeFunction(const std::string &opcode, MonitorChangeFunc f);
2021
void addHatBlock(const std::string &opcode);
2122
void addInput(const std::string &name, int id);
2223
void addField(const std::string &name, int id);
2324
void addFieldValue(const std::string &value, int id);
2425

2526
BlockComp resolveBlockCompileFunc(const std::string &opcode) const;
2627
MonitorNameFunc resolveMonitorNameFunc(const std::string &opcode) const;
28+
MonitorChangeFunc resolveMonitorChangeFunc(const std::string &opcode) const;
2729
int resolveInput(const std::string &name) const;
2830
int resolveField(const std::string &name) const;
2931
int resolveFieldValue(const std::string &value) const;
3032

3133
private:
3234
std::unordered_map<std::string, BlockComp> m_compileFunctions;
3335
std::unordered_map<std::string, MonitorNameFunc> m_monitorNameFunctions;
36+
std::unordered_map<std::string, MonitorChangeFunc> m_monitorChangeFunctions;
3437
std::unordered_map<std::string, int> m_inputs;
3538
std::unordered_map<std::string, int> m_fields;
3639
std::unordered_map<std::string, int> m_fieldValues;

src/engine/internal/engine.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -820,6 +820,14 @@ void Engine::addMonitorNameFunction(IBlockSection *section, const std::string &o
820820
container->addMonitorNameFunction(opcode, f);
821821
}
822822

823+
void Engine::addMonitorChangeFunction(IBlockSection *section, const std::string &opcode, MonitorChangeFunc f)
824+
{
825+
auto container = blockSectionContainer(section);
826+
827+
if (container)
828+
container->addMonitorChangeFunction(opcode, f);
829+
}
830+
823831
void Engine::addHatBlock(IBlockSection *section, const std::string &opcode)
824832
{
825833
auto container = blockSectionContainer(section);

src/engine/internal/engine.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class Engine : public IEngine
103103

104104
void addCompileFunction(IBlockSection *section, const std::string &opcode, BlockComp f) override;
105105
void addMonitorNameFunction(IBlockSection *section, const std::string &opcode, MonitorNameFunc f) override;
106+
void addMonitorChangeFunction(IBlockSection *section, const std::string &opcode, MonitorChangeFunc f) override;
106107
void addHatBlock(IBlockSection *section, const std::string &opcode) override;
107108
void addInput(IBlockSection *section, const std::string &name, int id) override;
108109
void addField(IBlockSection *section, const std::string &name, int id) override;

test/mocks/enginemock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ class EngineMock : public IEngine
8484

8585
MOCK_METHOD(void, addCompileFunction, (IBlockSection *, const std::string &, BlockComp), (override));
8686
MOCK_METHOD(void, addMonitorNameFunction, (IBlockSection *, const std::string &, MonitorNameFunc), (override));
87+
MOCK_METHOD(void, addMonitorChangeFunction, (IBlockSection *, const std::string &, MonitorChangeFunc), (override));
8788
MOCK_METHOD(void, addHatBlock, (IBlockSection *, const std::string &), (override));
8889
MOCK_METHOD(void, addInput, (IBlockSection *, const std::string &, int), (override));
8990
MOCK_METHOD(void, addField, (IBlockSection *, const std::string &, int), (override));

0 commit comments

Comments
 (0)