From 5f88cde57471a40ebbbd759725f49d44be3123d8 Mon Sep 17 00:00:00 2001 From: codereader Date: Tue, 2 Jan 2018 18:51:38 +0100 Subject: [PATCH] Resolve #4154: DR doesn't show readable background image changes. While DR is unlikely to support every possible case (especially stuff driven by a game script), this particular GUI as reported in the issue report can be supported by running the GUI script in ContentsFadeIn and setting the gui::curPage state variable as done by TDM's readable GUI code. --- plugins/dm.gui/ReadableEditorDialog.cpp | 4 +--- plugins/dm.gui/gui/GuiScript.cpp | 13 +++++++++---- plugins/dm.gui/gui/GuiScript.h | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/dm.gui/ReadableEditorDialog.cpp b/plugins/dm.gui/ReadableEditorDialog.cpp index 545a4d79bd..7cd4cb7248 100644 --- a/plugins/dm.gui/ReadableEditorDialog.cpp +++ b/plugins/dm.gui/ReadableEditorDialog.cpp @@ -758,13 +758,11 @@ void ReadableEditorDialog::initGuiState(const gui::IGuiPtr& gui) gui->setStateString("curPage", string::to_string(_currentPageIndex + 1)); gui->setStateString("numPages", string::to_string(_numPages->GetValue())); -#if 0 // ContentsFadeIn is reponsible of setting custom backgrounds if (gui->findWindowDef("ContentsFadeIn")) { - gui->findWindowDef("ContentsFadeIn")->notime = false; + gui->findWindowDef("ContentsFadeIn")->notime.setValue(false); } -#endif // Initialise the time of this GUI gui->initTime(0); diff --git a/plugins/dm.gui/gui/GuiScript.cpp b/plugins/dm.gui/gui/GuiScript.cpp index ed6af5982f..e5d8382b6a 100644 --- a/plugins/dm.gui/gui/GuiScript.cpp +++ b/plugins/dm.gui/gui/GuiScript.cpp @@ -340,9 +340,10 @@ GuiExpressionPtr GuiScript::getExpression(parser::DefTokeniser& tokeniser) return GuiExpression::CreateFromTokens(_owner.getGui(), tokeniser); } -GuiExpressionPtr GuiScript::getIfExpression(parser::DefTokeniser& tokeniser) +std::shared_ptr> GuiScript::getIfExpression(parser::DefTokeniser& tokeniser) { - return getExpression(tokeniser); + // Parse the IF condition and pack it into a bool-typed expression + return std::make_shared>(getExpression(tokeniser)); } const Statement& GuiScript::getStatement(std::size_t index) @@ -442,8 +443,12 @@ void GuiScript::execute() case Statement::ST_TRANSITION: break; case Statement::ST_IF: - // TODO: Evaluate expression, for now just perform the jump - _ip = st.jmpDest; + // Evaluate expression + if (!st._condition || st._condition->evaluate() == false) + { + // Expression evaluated to false, jump over the block + _ip = st.jmpDest; + } break; case Statement::ST_SET_FOCUS: break; diff --git a/plugins/dm.gui/gui/GuiScript.h b/plugins/dm.gui/gui/GuiScript.h index 939fc4a853..a920af6bbe 100644 --- a/plugins/dm.gui/gui/GuiScript.h +++ b/plugins/dm.gui/gui/GuiScript.h @@ -45,7 +45,7 @@ struct Statement Arguments args; // Condition used by ST_IF - GuiExpressionPtr _condition; + std::shared_ptr> _condition; // The jump destination used by ST_IF and ST_JMP std::size_t jmpDest; @@ -97,7 +97,7 @@ class GuiScript std::size_t getCurPosition(); GuiExpressionPtr getExpression(parser::DefTokeniser& tokeniser); - GuiExpressionPtr getIfExpression(parser::DefTokeniser& tokeniser); + std::shared_ptr> getIfExpression(parser::DefTokeniser& tokeniser); // Reads a "statement", which can be single one or a group (surrounded by curly braces) void parseStatement(parser::DefTokeniser& tokeniser);