From 6ad90aa1b86d4abee730fdd7580581facdc6b40b Mon Sep 17 00:00:00 2001 From: elexis Date: Tue, 13 Aug 2019 18:00:41 +0000 Subject: [PATCH] Delete wrongful proxy CGUIManager::GetPreDefinedColor from f0d9806b3f. It is wrong because the predefined colors should be loaded from the GUI page that requests to have the color parsed, which may be different from the topmost page. Similar to FindObjectByName removed in f9b529f2fb. Achieve this by implementing the CGUISetting::FromJSVal specialization, moved from ScriptInterface::FromJSVal, instead of adding a CGUI pointer to CGUIColor. Mark ScriptInterface::FromJSVal and inherited CColor::ParseString explicitly as deleted, so that people get a compile error if they forget to check for predefined colors when parsing a color. Refs #5387, D1746 > D1684 > this > f9b529f2fb, 9be8a560a9, 415939b59b, 2c47fbd66a, 85a622b13a. Differential Revision: https://code.wildfiregames.com/D2108 Tested on: clang 8, VS2015 This was SVN commit r22663. --- source/gui/CChart.cpp | 2 +- source/gui/CGUI.cpp | 38 ++++++------ source/gui/CGUIColor.cpp | 27 ++++++++ source/gui/CGUIColor.h | 18 ++++-- source/gui/CGUISprite.cpp | 4 +- source/gui/CGUISprite.h | 2 +- source/gui/CGUIString.cpp | 4 +- source/gui/COList.cpp | 6 +- source/gui/GUIManager.cpp | 6 -- source/gui/GUIManager.h | 5 -- source/gui/GUIRenderer.cpp | 4 +- source/gui/GUIRenderer.h | 2 +- source/gui/GUIutil.cpp | 62 +++++++++++++------ source/gui/GUIutil.h | 6 +- source/gui/scripting/GuiScriptConversions.cpp | 23 ++----- source/gui/tests/test_ParseString.h | 26 ++++---- 16 files changed, 132 insertions(+), 103 deletions(-) create mode 100644 source/gui/CGUIColor.cpp diff --git a/source/gui/CChart.cpp b/source/gui/CChart.cpp index 7409b15fc6..0826b34289 100644 --- a/source/gui/CChart.cpp +++ b/source/gui/CChart.cpp @@ -196,7 +196,7 @@ void CChart::UpdateSeries() { CChartData& data = m_Series[i]; - if (i < pSeriesColor->m_Items.size() && !data.m_Color.ParseString(pSeriesColor->m_Items[i].GetOriginalString().ToUTF8(), 0)) + if (i < pSeriesColor->m_Items.size() && !data.m_Color.ParseString(m_pGUI, pSeriesColor->m_Items[i].GetOriginalString().ToUTF8(), 0)) LOGWARNING("GUI: Error parsing 'series_color' (\"%s\")", utf8_from_wstring(pSeriesColor->m_Items[i].GetOriginalString())); data.m_Points = pSeries->m_Series[i]; diff --git a/source/gui/CGUI.cpp b/source/gui/CGUI.cpp index 4f471b01f3..f13348424c 100644 --- a/source/gui/CGUI.cpp +++ b/source/gui/CGUI.cpp @@ -359,7 +359,7 @@ void CGUI::DrawSprite(const CGUISpriteInstance& Sprite, int CellID, const float& // TODO: Clipping? - Sprite.Draw(Rect, CellID, m_Sprites, Z); + Sprite.Draw(this, Rect, CellID, m_Sprites, Z); } void CGUI::Destroy() @@ -1450,7 +1450,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "size") { CClientArea ca; - if (!GUI::ParseString(attr_value, ca)) + if (!GUI::ParseString(this, attr_value, ca)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_Size = ca; @@ -1458,7 +1458,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "texture_size") { CClientArea ca; - if (!GUI::ParseString(attr_value, ca)) + if (!GUI::ParseString(this, attr_value, ca)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_TextureSize = ca; @@ -1466,7 +1466,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "real_texture_placement") { CRect rect; - if (!GUI::ParseString(attr_value, rect)) + if (!GUI::ParseString(this, attr_value, rect)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_TexturePlacementInFile = rect; @@ -1474,7 +1474,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "cell_size") { CSize size; - if (!GUI::ParseString(attr_value, size)) + if (!GUI::ParseString(this, attr_value, size)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_CellSize = size; @@ -1482,7 +1482,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "fixed_h_aspect_ratio") { float val; - if (!GUI::ParseString(attr_value, val)) + if (!GUI::ParseString(this, attr_value, val)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_FixedHAspectRatio = val; @@ -1490,7 +1490,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "round_coordinates") { bool b; - if (!GUI::ParseString(attr_value, b)) + if (!GUI::ParseString(this, attr_value, b)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_RoundCoordinates = b; @@ -1509,7 +1509,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "z_level") { float z_level; - if (!GUI::ParseString(attr_value, z_level)) + if (!GUI::ParseString(this, attr_value, z_level)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_DeltaZ = z_level/100.f; @@ -1517,7 +1517,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "backcolor") { CGUIColor color; - if (!GUI::ParseString(attr_value, color)) + if (!GUI::ParseString(this, attr_value, color)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_BackColor = color; @@ -1525,7 +1525,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "bordercolor") { CGUIColor color; - if (!GUI::ParseString(attr_value, color)) + if (!GUI::ParseString(this, attr_value, color)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_BorderColor = color; @@ -1533,7 +1533,7 @@ void CGUI::Xeromyces_ReadImage(XMBElement Element, CXeromyces* pFile, CGUISprite else if (attr_name == "border") { bool b; - if (!GUI::ParseString(attr_value, b)) + if (!GUI::ParseString(this, attr_value, b)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, utf8_from_wstring(attr_value)); else Image->m_Border = b; @@ -1572,7 +1572,7 @@ void CGUI::Xeromyces_ReadEffects(XMBElement Element, CXeromyces* pFile, SGUIImag if (attr_name == "add_color") { CGUIColor color; - if (!color.ParseString(attr.Value, 0)) + if (!color.ParseString(this, attr.Value, 0)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr.Value); else effects.m_AddColor = color; } @@ -1628,7 +1628,7 @@ void CGUI::Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile) else if (attr_name == "show_edge_buttons") { bool b; - if (!GUI::ParseString(attr_value.FromUTF8(), b)) + if (!GUI::ParseString(this, attr_value.FromUTF8(), b)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_UseEdgeButtons = b; @@ -1636,7 +1636,7 @@ void CGUI::Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile) else if (attr_name == "width") { float f; - if (!GUI::ParseString(attr_value.FromUTF8(), f)) + if (!GUI::ParseString(this, attr_value.FromUTF8(), f)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_Width = f; @@ -1644,7 +1644,7 @@ void CGUI::Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile) else if (attr_name == "minimum_bar_size") { float f; - if (!GUI::ParseString(attr_value.FromUTF8(), f)) + if (!GUI::ParseString(this, attr_value.FromUTF8(), f)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_MinimumBarSize = f; @@ -1652,7 +1652,7 @@ void CGUI::Xeromyces_ReadScrollBarStyle(XMBElement Element, CXeromyces* pFile) else if (attr_name == "maximum_bar_size") { float f; - if (!GUI::ParseString(attr_value.FromUTF8(), f)) + if (!GUI::ParseString(this, attr_value.FromUTF8(), f)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name, attr_value); else scrollbar.m_MaximumBarSize = f; @@ -1707,7 +1707,7 @@ void CGUI::Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile) else if (attr_name == "size") { CSize size; - if (!GUI::ParseString(attr_value.FromUTF8(), size)) + if (!GUI::ParseString(this, attr_value.FromUTF8(), size)) LOGERROR("Error parsing '%s' (\"%s\") inside .", attr_name, attr_value); else icon.m_Size = size; @@ -1715,7 +1715,7 @@ void CGUI::Xeromyces_ReadIcon(XMBElement Element, CXeromyces* pFile) else if (attr_name == "cell_id") { int cell_id; - if (!GUI::ParseString(attr_value.FromUTF8(), cell_id)) + if (!GUI::ParseString(this, attr_value.FromUTF8(), cell_id)) LOGERROR("GUI: Error parsing '%s' (\"%s\") inside .", attr_name, attr_value); else icon.m_CellID = cell_id; @@ -1759,7 +1759,7 @@ void CGUI::Xeromyces_ReadColor(XMBElement Element, CXeromyces* pFile) return; // Try setting color to value - if (!color.ParseString(value)) + if (!color.ParseString(this, value)) { LOGERROR("GUI: Unable to create custom color '%s'. Invalid color syntax.", name.c_str()); return; diff --git a/source/gui/CGUIColor.cpp b/source/gui/CGUIColor.cpp new file mode 100644 index 0000000000..8d77be3b0e --- /dev/null +++ b/source/gui/CGUIColor.cpp @@ -0,0 +1,27 @@ +/* Copyright (C) 2019 Wildfire Games. + * This file is part of 0 A.D. + * + * 0 A.D. is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 0 A.D. is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with 0 A.D. If not, see . + */ + +#include "precompiled.h" + +#include "CGUIColor.h" +#include "ps/CStr.h" +#include "gui/CGUI.h" + +bool CGUIColor::ParseString(const CGUI* pGUI, const CStr& value, int defaultAlpha) +{ + return (pGUI != nullptr && pGUI->GetPreDefinedColor(value, *this)) || CColor::ParseString(value, defaultAlpha); +} diff --git a/source/gui/CGUIColor.h b/source/gui/CGUIColor.h index a9abf09473..33e28286cb 100644 --- a/source/gui/CGUIColor.h +++ b/source/gui/CGUIColor.h @@ -19,7 +19,9 @@ #define INCLUDED_GUICOLOR #include "graphics/Color.h" -#include "gui/GUIManager.h" +#include "ps/CStr.h" + +class CGUI; /** * Same as the CColor class, but this one can also parse colors predefined in the GUI page (such as "yellow"). @@ -30,10 +32,14 @@ struct CGUIColor : CColor CGUIColor(float r, float g, float b, float a) : CColor(r, g, b, a) {} - bool ParseString(const CStr& value, int defaultAlpha = 255) - { - return g_GUI->GetPreDefinedColor(value, *this) || CColor::ParseString(value, defaultAlpha); - } + /** + * Load color depending on current GUI page. + */ + bool ParseString(const CGUI* pGUI, const CStr& value, int defaultAlpha = 255); + + /** + * Ensure that all users check for predefined colors. + */ + bool ParseString(const CStr& value, int defaultAlpha = 255) = delete; }; #endif // INCLUDED_GUICOLOR - diff --git a/source/gui/CGUISprite.cpp b/source/gui/CGUISprite.cpp index 9a92fb4150..3195388edf 100644 --- a/source/gui/CGUISprite.cpp +++ b/source/gui/CGUISprite.cpp @@ -30,11 +30,11 @@ void CGUISprite::AddImage(SGUIImage* image) m_Images.push_back(image); } -void CGUISpriteInstance::Draw(const CRect& Size, int CellID, std::map& Sprites, float Z) const +void CGUISpriteInstance::Draw(const CGUI* pGUI, const CRect& Size, int CellID, std::map& Sprites, float Z) const { if (m_CachedSize != Size || m_CachedCellID != CellID) { - GUIRenderer::UpdateDrawCallCache(m_DrawCallCache, m_SpriteName, Size, CellID, Sprites); + GUIRenderer::UpdateDrawCallCache(pGUI, m_DrawCallCache, m_SpriteName, Size, CellID, Sprites); m_CachedSize = Size; m_CachedCellID = CellID; } diff --git a/source/gui/CGUISprite.h b/source/gui/CGUISprite.h index 249e62d3d9..0ca6906864 100644 --- a/source/gui/CGUISprite.h +++ b/source/gui/CGUISprite.h @@ -164,7 +164,7 @@ public: CGUISpriteInstance(); CGUISpriteInstance(const CStr& SpriteName); - void Draw(const CRect& Size, int CellID, std::map& Sprites, float Z) const; + void Draw(const CGUI* pGUI, const CRect& Size, int CellID, std::map& Sprites, float Z) const; bool IsEmpty() const; const CStr& GetName() const { return m_SpriteName; } void SetName(const CStr& SpriteName); diff --git a/source/gui/CGUIString.cpp b/source/gui/CGUIString.cpp index aeba801ddf..19cb024762 100644 --- a/source/gui/CGUIString.cpp +++ b/source/gui/CGUIString.cpp @@ -144,7 +144,7 @@ void CGUIString::GenerateTextCall(const CGUI* pGUI, SFeedback& Feedback, CStrInt // Displace the sprite CSize displacement; // Parse the value - if (!GUI::ParseString(tagAttrib.value, displacement)) + if (!GUI::ParseString(pGUI, tagAttrib.value, displacement)) LOGERROR("Error parsing 'displace' value for tag [ICON]"); else SpriteCall.m_Area += displacement; @@ -190,7 +190,7 @@ void CGUIString::GenerateTextCall(const CGUI* pGUI, SFeedback& Feedback, CStrInt case TextChunk::Tag::TAG_COLOR: TextCall.m_UseCustomColor = true; - if (!GUI::ParseString(tag.m_TagValue, TextCall.m_Color) && pObject) + if (!GUI::ParseString(pGUI, tag.m_TagValue, TextCall.m_Color) && pObject) LOGERROR("Error parsing the value of a [color]-tag in GUI text when reading object \"%s\".", pObject->GetPresentableName().c_str()); break; case TextChunk::Tag::TAG_FONT: diff --git a/source/gui/COList.cpp b/source/gui/COList.cpp index fd40d1e08f..90add78bbf 100644 --- a/source/gui/COList.cpp +++ b/source/gui/COList.cpp @@ -231,7 +231,7 @@ bool COList::HandleAdditionalChildren(const XMBElement& child, CXeromyces* pFile if (attr_name == "color") { CGUIColor color; - if (!GUI::ParseString(attr_value.FromUTF8(), color)) + if (!GUI::ParseString(m_pGUI, attr_value.FromUTF8(), color)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name.c_str(), attr_value.c_str()); else column.m_TextColor = color; @@ -242,13 +242,13 @@ bool COList::HandleAdditionalChildren(const XMBElement& child, CXeromyces* pFile } else if (attr_name == "hidden") { - if (!GUI::ParseString(attr_value.FromUTF8(), hidden)) + if (!GUI::ParseString(m_pGUI, attr_value.FromUTF8(), hidden)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name.c_str(), attr_value.c_str()); } else if (attr_name == "width") { float width; - if (!GUI::ParseString(attr_value.FromUTF8(), width)) + if (!GUI::ParseString(m_pGUI, attr_value.FromUTF8(), width)) LOGERROR("GUI: Error parsing '%s' (\"%s\")", attr_name.c_str(), attr_value.c_str()); else { diff --git a/source/gui/GUIManager.cpp b/source/gui/GUIManager.cpp index d500588d72..1478d16747 100644 --- a/source/gui/GUIManager.cpp +++ b/source/gui/GUIManager.cpp @@ -350,12 +350,6 @@ InReaction CGUIManager::HandleEvent(const SDL_Event_* ev) return IN_PASS; } - -bool CGUIManager::GetPreDefinedColor(const CStr& name, CGUIColor& output) const -{ - return top()->GetPreDefinedColor(name, output); -} - void CGUIManager::SendEventToAll(const CStr& eventName) const { top()->SendEventToAll(eventName); diff --git a/source/gui/GUIManager.h b/source/gui/GUIManager.h index 7f5660f792..ba76727dc4 100644 --- a/source/gui/GUIManager.h +++ b/source/gui/GUIManager.h @@ -102,11 +102,6 @@ public: */ InReaction HandleEvent(const SDL_Event_* ev); - /** - * See CGUI::GetPreDefinedColor; applies to the currently active page. - */ - bool GetPreDefinedColor(const CStr& name, CGUIColor& output) const; - /** * See CGUI::SendEventToAll; applies to the currently active page. */ diff --git a/source/gui/GUIRenderer.cpp b/source/gui/GUIRenderer.cpp index 8bbf73af93..6ef79fb024 100644 --- a/source/gui/GUIRenderer.cpp +++ b/source/gui/GUIRenderer.cpp @@ -59,7 +59,7 @@ DrawCalls& DrawCalls::operator=(const DrawCalls&) } -void GUIRenderer::UpdateDrawCallCache(DrawCalls& Calls, const CStr& SpriteName, const CRect& Size, int CellID, std::map& Sprites) +void GUIRenderer::UpdateDrawCallCache(const CGUI* pGUI, DrawCalls& Calls, const CStr& SpriteName, const CRect& Size, int CellID, std::map& Sprites) { // This is called only when something has changed (like the size of the // sprite), so it doesn't need to be particularly efficient. @@ -144,7 +144,7 @@ void GUIRenderer::UpdateDrawCallCache(DrawCalls& Calls, const CStr& SpriteName, CGUIColor color; // Check color is valid - if (!GUI::ParseString(value, color)) + if (!GUI::ParseString(pGUI, value, color)) { LOGERROR("GUI: Error parsing sprite 'color' (\"%s\")", utf8_from_wstring(value)); return; diff --git a/source/gui/GUIRenderer.h b/source/gui/GUIRenderer.h index 4233d64b44..e929150731 100644 --- a/source/gui/GUIRenderer.h +++ b/source/gui/GUIRenderer.h @@ -71,7 +71,7 @@ namespace GUIRenderer namespace GUIRenderer { - void UpdateDrawCallCache(DrawCalls& Calls, const CStr& SpriteName, const CRect& Size, int CellID, std::map& Sprites); + void UpdateDrawCallCache(const CGUI* pGUI, DrawCalls& Calls, const CStr& SpriteName, const CRect& Size, int CellID, std::map& Sprites); void Draw(DrawCalls& Calls, float Z); } diff --git a/source/gui/GUIutil.cpp b/source/gui/GUIutil.cpp index 668e130c9e..2734b19221 100644 --- a/source/gui/GUIutil.cpp +++ b/source/gui/GUIutil.cpp @@ -34,13 +34,36 @@ bool CGUISetting::FromString(const CStrW& Value, const bool& SkipMessage) { T settingValue; - if (!GUI::ParseString(Value, settingValue)) + if (!GUI::ParseString(m_pObject.GetGUI(), Value, settingValue)) return false; GUI::SetSetting(&m_pObject, m_Name, settingValue, SkipMessage); return true; }; +template<> +bool CGUISetting::FromJSVal(JSContext* cx, JS::HandleValue Value) +{ + CGUIColor settingValue; + if (Value.isString()) + { + CStr name; + if (!ScriptInterface::FromJSVal(cx, Value, name)) + return false; + + if (!settingValue.ParseString(m_pObject.GetGUI(), name)) + { + JS_ReportError(cx, "Invalid color '%s'", name.c_str()); + return false; + } + } + else if (!ScriptInterface::FromJSVal(cx, Value, settingValue)) + return false; + + GUI::SetSetting(&m_pObject, m_Name, settingValue); + return true; +}; + template bool CGUISetting::FromJSVal(JSContext* cx, JS::HandleValue Value) { @@ -59,7 +82,7 @@ void CGUISetting::ToJSVal(JSContext* cx, JS::MutableHandleValue Value) }; template <> -bool __ParseString(const CStrW& Value, bool& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, bool& Output) { if (Value == L"true") Output = true; @@ -72,28 +95,28 @@ bool __ParseString(const CStrW& Value, bool& Output) } template <> -bool __ParseString(const CStrW& Value, int& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, int& Output) { Output = Value.ToInt(); return true; } template <> -bool __ParseString(const CStrW& Value, u32& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, u32& Output) { Output = Value.ToUInt(); return true; } template <> -bool __ParseString(const CStrW& Value, float& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, float& Output) { Output = Value.ToFloat(); return true; } template <> -bool __ParseString(const CStrW& Value, CRect& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CRect& Output) { const unsigned int NUM_COORDS = 4; float coords[NUM_COORDS]; @@ -128,19 +151,19 @@ bool __ParseString(const CStrW& Value, CRect& Output) } template <> -bool __ParseString(const CStrW& Value, CClientArea& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CClientArea& Output) { return Output.SetClientArea(Value.ToUTF8()); } template <> -bool __ParseString(const CStrW& Value, CGUIColor& Output) +bool __ParseString(const CGUI* pGUI, const CStrW& Value, CGUIColor& Output) { - return Output.ParseString(Value.ToUTF8()); + return Output.ParseString(pGUI, Value.ToUTF8()); } template <> -bool __ParseString(const CStrW& Value, CSize& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CSize& Output) { const unsigned int NUM_COORDS = 2; float coords[NUM_COORDS]; @@ -175,7 +198,7 @@ bool __ParseString(const CStrW& Value, CSize& Output) } template <> -bool __ParseString(const CStrW& Value, CPos& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CPos& Output) { const unsigned int NUM_COORDS = 2; float coords[NUM_COORDS]; @@ -210,7 +233,7 @@ bool __ParseString(const CStrW& Value, CPos& Output) } template <> -bool __ParseString(const CStrW& Value, EAlign& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, EAlign& Output) { if (Value == L"left") Output = EAlign_Left; @@ -225,7 +248,7 @@ bool __ParseString(const CStrW& Value, EAlign& Output) } template <> -bool __ParseString(const CStrW& Value, EVAlign& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, EVAlign& Output) { if (Value == L"top") Output = EVAlign_Top; @@ -240,42 +263,41 @@ bool __ParseString(const CStrW& Value, EVAlign& Output) } template <> -bool __ParseString(const CStrW& Value, CGUIString& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CGUIString& Output) { Output.SetValue(Value); return true; } template <> -bool __ParseString(const CStrW& Value, CStr& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CStr& Output) { - // Do very little. Output = Value.ToUTF8(); return true; } template <> -bool __ParseString(const CStrW& Value, CStrW& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CStrW& Output) { Output = Value; return true; } template <> -bool __ParseString(const CStrW& Value, CGUISpriteInstance& Output) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& Value, CGUISpriteInstance& Output) { Output = CGUISpriteInstance(Value.ToUTF8()); return true; } template <> -bool __ParseString(const CStrW& UNUSED(Value), CGUIList& UNUSED(Output)) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& UNUSED(Value), CGUIList& UNUSED(Output)) { return false; } template <> -bool __ParseString(const CStrW& UNUSED(Value), CGUISeries& UNUSED(Output)) +bool __ParseString(const CGUI* UNUSED(pGUI), const CStrW& UNUSED(Value), CGUISeries& UNUSED(Output)) { return false; } diff --git a/source/gui/GUIutil.h b/source/gui/GUIutil.h index 7773a8f33d..3556f082c4 100644 --- a/source/gui/GUIutil.h +++ b/source/gui/GUIutil.h @@ -111,7 +111,7 @@ private: }; template -bool __ParseString(const CStrW& Value, T& tOutput); +bool __ParseString(const CGUI* pGUI, const CStrW& Value, T& tOutput); struct SGUIMessage; @@ -206,9 +206,9 @@ public: * * @see __ParseString() */ - static bool ParseString(const CStrW& Value, T& tOutput) + static bool ParseString(const CGUI* pGUI, const CStrW& Value, T& tOutput) { - return __ParseString(Value, tOutput); + return __ParseString(pGUI, Value, tOutput); } private: diff --git a/source/gui/scripting/GuiScriptConversions.cpp b/source/gui/scripting/GuiScriptConversions.cpp index 73dbecd7c0..2abf7729f7 100644 --- a/source/gui/scripting/GuiScriptConversions.cpp +++ b/source/gui/scripting/GuiScriptConversions.cpp @@ -150,25 +150,10 @@ template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHa ToJSVal(cx, ret, val); } -template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, CGUIColor& out) -{ - if (v.isString()) - { - CStr name; - if (!FromJSVal(cx, v, name)) - return false; - - if (!out.ParseString(name)) - { - JS_ReportError(cx, "Invalid color '%s'", name.c_str()); - return false; - } - return true; - } - - // Parse as object - return FromJSVal(cx, v, out); -} +/** + * The color depends on the predefined color database stored in the current GUI page. + */ +template<> bool ScriptInterface::FromJSVal(JSContext* cx, JS::HandleValue v, CGUIColor& out) = delete; template<> void ScriptInterface::ToJSVal(JSContext* cx, JS::MutableHandleValue ret, const CSize& val) { diff --git a/source/gui/tests/test_ParseString.h b/source/gui/tests/test_ParseString.h index aa9e97af70..e575b17c16 100644 --- a/source/gui/tests/test_ParseString.h +++ b/source/gui/tests/test_ParseString.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2014 Wildfire Games. +/* Copyright (C) 2019 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -68,12 +68,12 @@ public: TestLogger nolog; CRect test; - TS_ASSERT(__ParseString(CStrW(L"0.0 10.0 20.0 30.0"), test)); + TS_ASSERT(__ParseString(nullptr, CStrW(L"0.0 10.0 20.0 30.0"), test)); TS_ASSERT_EQUALS(CRect(0.0, 10.0, 20.0, 30.0), test); - TS_ASSERT(!__ParseString(CStrW(L"0 10 20"), test)); - TS_ASSERT(!__ParseString(CStrW(L"0 10 20 30 40"), test)); - TS_ASSERT(!__ParseString(CStrW(L"0,0 10,0 20,0 30,0"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0 10 20"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0 10 20 30 40"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0,0 10,0 20,0 30,0"), test)); } void test_size() @@ -81,12 +81,12 @@ public: TestLogger nolog; CSize test; - TS_ASSERT(__ParseString(CStrW(L"0.0 10.0"), test)); + TS_ASSERT(__ParseString(nullptr, CStrW(L"0.0 10.0"), test)); TS_ASSERT_EQUALS(CSize(0.0, 10.0), test); - TS_ASSERT(!__ParseString(CStrW(L"0"), test)); - TS_ASSERT(!__ParseString(CStrW(L"0 10 20"), test)); - TS_ASSERT(!__ParseString(CStrW(L"0,0 10,0"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0 10 20"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0,0 10,0"), test)); } void test_pos() @@ -94,11 +94,11 @@ public: TestLogger nolog; CPos test; - TS_ASSERT(__ParseString(CStrW(L"0.0 10.0"), test)); + TS_ASSERT(__ParseString(nullptr, CStrW(L"0.0 10.0"), test)); TS_ASSERT_EQUALS(CPos(0.0, 10.0), test); - TS_ASSERT(!__ParseString(CStrW(L"0"), test)); - TS_ASSERT(!__ParseString(CStrW(L"0 10 20"), test)); - TS_ASSERT(!__ParseString(CStrW(L"0,0 10,0"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0 10 20"), test)); + TS_ASSERT(!__ParseString(nullptr, CStrW(L"0,0 10,0"), test)); } };