Skip to content

Commit cf0fd3a

Browse files
committed
Properly lookup variable when creating missing monitor
1 parent 2094a7a commit cf0fd3a

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

src/blocks/variableblocks.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,21 @@ extern "C" void data_showvariable(Target *target, Variable *variable)
149149
* Since this case doesn't occur frequently,
150150
* we can look up the variable by ID.
151151
*/
152-
auto index = target->findVariableById(variable->id());
153-
monitor = target->engine()->createVariableMonitor(target->variableAt(index), "data_variable", "VARIABLE");
152+
const auto &targets = target->engine()->targets();
153+
154+
for (const auto &target : targets) {
155+
auto index = target->findVariableById(variable->id());
156+
157+
if (index != -1) {
158+
monitor = target->engine()->createVariableMonitor(target->variableAt(index), "data_variable", "VARIABLE");
159+
break;
160+
}
161+
}
162+
163+
if (!monitor) {
164+
assert(false);
165+
return;
166+
}
154167
}
155168

156169
monitor->setVisible(true);

test/blocks/variable_blocks_test.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,45 @@ TEST_F(VariableBlocksTest, ShowVariable_Global_Nonexistent)
226226
ASSERT_TRUE(monitor2->visible());
227227
}
228228

229+
TEST_F(VariableBlocksTest, ShowVariable_Global_Nonexistent_FromSprite)
230+
{
231+
auto stage = std::make_shared<Stage>();
232+
auto sprite = std::make_shared<Sprite>();
233+
234+
auto var1 = std::make_shared<Variable>("a", "var1", 835.21);
235+
stage->addVariable(var1);
236+
auto var2 = std::make_shared<Variable>("b", "var2", "Hello world");
237+
stage->addVariable(var2);
238+
239+
m_engine->setTargets({ stage, sprite });
240+
241+
ScriptBuilder builder1(m_extension.get(), m_engine, sprite);
242+
builder1.addBlock("data_showvariable");
243+
builder1.addEntityField("VARIABLE", var1);
244+
245+
ScriptBuilder builder2(m_extension.get(), m_engine, sprite);
246+
builder2.addBlock("data_showvariable");
247+
builder2.addEntityField("VARIABLE", var2);
248+
249+
ScriptBuilder::buildMultiple({ &builder1, &builder2 });
250+
m_engine->run();
251+
252+
// Missing monitors should be created
253+
builder1.run();
254+
255+
Monitor *monitor1 = var1->monitor();
256+
ASSERT_TRUE(monitor1);
257+
ASSERT_TRUE(monitor1->visible());
258+
259+
builder2.run();
260+
261+
Monitor *monitor2 = var2->monitor();
262+
263+
ASSERT_TRUE(monitor2);
264+
ASSERT_TRUE(monitor1->visible());
265+
ASSERT_TRUE(monitor2->visible());
266+
}
267+
229268
TEST_F(VariableBlocksTest, ShowVariable_Local_Existent)
230269
{
231270
auto stage = std::make_shared<Stage>();

0 commit comments

Comments
 (0)