Skip to content

Commit 9ff01dc

Browse files
committed
Add a callback for monitor added events
1 parent 5730014 commit 9ff01dc

File tree

5 files changed

+65
-2
lines changed

5 files changed

+65
-2
lines changed

include/scratchcpp/iengine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,9 @@ class LIBSCRATCHCPP_EXPORT IEngine
307307
/*! Sets the list of monitors. */
308308
virtual void setMonitors(const std::vector<std::shared_ptr<Monitor>> &newMonitors) = 0;
309309

310+
/*! Sets the function which is called when a monitor is added. */
311+
virtual void setAddMonitorHandler(const std::function<void(Monitor *)> &handler) = 0;
312+
310313
/*! Returns the list of extension names. */
311314
virtual const std::vector<std::string> &extensions() const = 0;
312315

src/engine/internal/engine.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,12 +1013,25 @@ const std::vector<std::shared_ptr<Monitor>> &Engine::monitors() const
10131013

10141014
void Engine::setMonitors(const std::vector<std::shared_ptr<Monitor>> &newMonitors)
10151015
{
1016-
m_monitors = newMonitors;
1016+
if (m_addMonitorHandler) {
1017+
m_monitors.clear();
1018+
1019+
for (auto monitor : newMonitors) {
1020+
m_monitors.push_back(monitor);
1021+
m_addMonitorHandler(monitor.get());
1022+
}
1023+
} else
1024+
m_monitors = newMonitors;
10171025

10181026
// Create missing monitors
10191027
createMissingMonitors();
10201028
}
10211029

1030+
void Engine::setAddMonitorHandler(const std::function<void(Monitor *)> &handler)
1031+
{
1032+
m_addMonitorHandler = handler;
1033+
}
1034+
10221035
const std::vector<std::string> &Engine::extensions() const
10231036
{
10241037
return m_extensions;
@@ -1356,12 +1369,14 @@ void Engine::addVarOrListMonitor(std::shared_ptr<Monitor> monitor, Target *targe
13561369
monitor->setVisible(false);
13571370

13581371
// Auto-position the monitor
1359-
// TODO: Get width and height from renderer
13601372
Rect rect = Monitor::getInitialPosition(m_monitors, monitor->width(), monitor->height());
13611373
monitor->setX(rect.left());
13621374
monitor->setY(rect.top());
13631375

13641376
m_monitors.push_back(monitor);
1377+
1378+
if (m_addMonitorHandler)
1379+
m_addMonitorHandler(monitor.get());
13651380
}
13661381

13671382
void Engine::updateFrameDuration()

src/engine/internal/engine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class Engine : public IEngine
133133

134134
const std::vector<std::shared_ptr<Monitor>> &monitors() const override;
135135
void setMonitors(const std::vector<std::shared_ptr<Monitor>> &newMonitors) override;
136+
void setAddMonitorHandler(const std::function<void(Monitor *)> &handler) override;
136137

137138
const std::vector<std::string> &extensions() const override;
138139
void setExtensions(const std::vector<std::string> &newExtensions) override;
@@ -241,6 +242,8 @@ class Engine : public IEngine
241242
std::function<void()> m_redrawHandler = nullptr;
242243
bool m_stopEventLoop = false;
243244
std::mutex m_stopEventLoopMutex;
245+
246+
std::function<void(Monitor *)> m_addMonitorHandler = nullptr;
244247
};
245248

246249
} // namespace libscratchcpp

test/engine/engine_test.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
using namespace libscratchcpp;
2828

2929
using ::testing::Return;
30+
using ::testing::SaveArg;
31+
using ::testing::_;
3032

3133
// NOTE: resolveIds() and compile() are tested in load_project_test
3234

@@ -36,6 +38,12 @@ class RedrawMock
3638
MOCK_METHOD(void, redraw, ());
3739
};
3840

41+
class AddMonitorMock
42+
{
43+
public:
44+
MOCK_METHOD(void, monitorAdded, (Monitor *));
45+
};
46+
3947
TEST(EngineTest, Clock)
4048
{
4149
Engine engine;
@@ -1144,6 +1152,16 @@ TEST(EngineTest, Monitors)
11441152

11451153
engine.setMonitors({ m1, m2, m3 });
11461154
ASSERT_EQ(engine.monitors(), std::vector<std::shared_ptr<Monitor>>({ m1, m2, m3 }));
1155+
1156+
AddMonitorMock addMonitorMock;
1157+
auto handler = std::bind(&AddMonitorMock::monitorAdded, &addMonitorMock, std::placeholders::_1);
1158+
engine.setAddMonitorHandler(std::function<void(Monitor *)>(handler));
1159+
engine.setMonitors({});
1160+
1161+
EXPECT_CALL(addMonitorMock, monitorAdded(m1.get()));
1162+
EXPECT_CALL(addMonitorMock, monitorAdded(m2.get()));
1163+
EXPECT_CALL(addMonitorMock, monitorAdded(m3.get()));
1164+
engine.setMonitors({ m1, m2, m3 });
11471165
}
11481166

11491167
TEST(EngineTest, CreateMissingMonitors)
@@ -1242,6 +1260,29 @@ TEST(EngineTest, CreateMissingMonitors)
12421260
checkVariableMonitor(monitors[5], var4);
12431261
checkVariableMonitor(monitors[6], var5);
12441262
}
1263+
1264+
{
1265+
Engine engine;
1266+
AddMonitorMock addMonitorMock;
1267+
auto handler = std::bind(&AddMonitorMock::monitorAdded, &addMonitorMock, std::placeholders::_1);
1268+
engine.setAddMonitorHandler(std::function<void(Monitor *)>(handler));
1269+
1270+
EXPECT_CALL(addMonitorMock, monitorAdded(m1.get()));
1271+
EXPECT_CALL(addMonitorMock, monitorAdded(m2.get()));
1272+
EXPECT_CALL(addMonitorMock, monitorAdded(m3.get()));
1273+
engine.setMonitors({ m1, m2, m3 });
1274+
1275+
Monitor *m4, *m5, *m6, *m7;
1276+
EXPECT_CALL(addMonitorMock, monitorAdded(_)).WillOnce(SaveArg<0>(&m4)).WillOnce(SaveArg<0>(&m5)).WillOnce(SaveArg<0>(&m6)).WillOnce(SaveArg<0>(&m7));
1277+
engine.setTargets({ target1, target2 });
1278+
1279+
const auto &monitors = engine.monitors();
1280+
ASSERT_EQ(monitors.size(), 7);
1281+
ASSERT_EQ(monitors[3].get(), m4);
1282+
ASSERT_EQ(monitors[4].get(), m5);
1283+
ASSERT_EQ(monitors[5].get(), m6);
1284+
ASSERT_EQ(monitors[6].get(), m7);
1285+
}
12451286
}
12461287

12471288
TEST(EngineTest, Clones)

test/mocks/enginemock.h

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

115115
MOCK_METHOD(const std::vector<std::shared_ptr<Monitor>> &, monitors, (), (const, override));
116116
MOCK_METHOD(void, setMonitors, (const std::vector<std::shared_ptr<Monitor>> &), (override));
117+
MOCK_METHOD(void, setAddMonitorHandler, (const std::function<void(Monitor *)> &), (override));
117118

118119
MOCK_METHOD(std::vector<std::string> &, extensions, (), (const, override));
119120
MOCK_METHOD(void, setExtensions, (const std::vector<std::string> &), (override));

0 commit comments

Comments
 (0)