Skip to content

Commit f75a571

Browse files
authored
Merge pull request #332 from scratchcpp/redraw_handler
Add redraw handler setter
2 parents 32043eb + a282d69 commit f75a571

File tree

5 files changed

+26
-1
lines changed

5 files changed

+26
-1
lines changed

include/scratchcpp/iengine.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <memory>
66
#include <vector>
77
#include <unordered_map>
8+
#include <functional>
89

910
#include "global.h"
1011

@@ -90,6 +91,9 @@ class LIBSCRATCHCPP_EXPORT IEngine
9091
*/
9192
virtual void runEventLoop() = 0;
9293

94+
/*! Sets the function which is called on every frame. */
95+
virtual void setRedrawHandler(const std::function<void()> &handler) = 0;
96+
9397
/*! Returns true if the project is currently running. */
9498
virtual bool isRunning() const = 0;
9599

src/engine/internal/engine.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ void Engine::runEventLoop()
322322
eventLoop();
323323
}
324324

325+
void Engine::setRedrawHandler(const std::function<void()> &handler)
326+
{
327+
m_redrawHandler = handler;
328+
}
329+
325330
void Engine::eventLoop(bool untilProjectStops)
326331
{
327332
updateFrameDuration();
@@ -374,7 +379,8 @@ void Engine::eventLoop(bool untilProjectStops)
374379
break;
375380

376381
// Redraw
377-
// TODO: Redraw here
382+
if (m_redrawHandler)
383+
m_redrawHandler();
378384

379385
// If the timeout hasn't been reached yet (redraw was requested), sleep
380386
if (!timeout)

src/engine/internal/engine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class Engine : public IEngine
4040
void run() override;
4141
void runEventLoop() override;
4242

43+
void setRedrawHandler(const std::function<void()> &handler) override;
44+
4345
bool isRunning() const override;
4446

4547
double fps() const override;
@@ -180,6 +182,7 @@ class Engine : public IEngine
180182

181183
bool m_running = false;
182184
bool m_redrawRequested = false;
185+
std::function<void()> m_redrawHandler = nullptr;
183186
};
184187

185188
} // namespace libscratchcpp

test/engine/engine_test.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ using ::testing::Return;
1919

2020
// NOTE: resolveIds() and compile() are tested in load_project_test
2121

22+
class RedrawMock
23+
{
24+
public:
25+
MOCK_METHOD(void, redraw, ());
26+
};
27+
2228
TEST(EngineTest, Clock)
2329
{
2430
Engine engine;
@@ -98,6 +104,9 @@ TEST(EngineTest, FpsProject)
98104
p.run();
99105

100106
engine->setFps(10);
107+
RedrawMock redrawMock;
108+
auto handler = std::bind(&RedrawMock::redraw, &redrawMock);
109+
engine->setRedrawHandler(std::function<void()>(handler));
101110
std::chrono::steady_clock::time_point time5(std::chrono::milliseconds(100));
102111
std::chrono::steady_clock::time_point time6(std::chrono::milliseconds(115));
103112
std::chrono::steady_clock::time_point time7(std::chrono::milliseconds(200));
@@ -113,6 +122,7 @@ TEST(EngineTest, FpsProject)
113122
.WillOnce(Return(time8));
114123
EXPECT_CALL(clock, sleep(std::chrono::milliseconds(100)));
115124
EXPECT_CALL(clock, sleep(std::chrono::milliseconds(15)));
125+
EXPECT_CALL(redrawMock, redraw()).Times(4);
116126
p.run();
117127

118128
engine->setTurboModeEnabled(true);

test/mocks/enginemock.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class EngineMock : public IEngine
2626
MOCK_METHOD(void, run, (), (override));
2727
MOCK_METHOD(void, runEventLoop, (), (override));
2828

29+
MOCK_METHOD(void, setRedrawHandler, (const std::function<void()> &), (override));
30+
2931
MOCK_METHOD(bool, isRunning, (), (const, override));
3032

3133
MOCK_METHOD(double, fps, (), (const, override));

0 commit comments

Comments
 (0)