diff --git a/ChangeLog.txt b/ChangeLog.txt index 6d8f68684..645493bce 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -72,6 +72,7 @@ - [#767] Valentina produces wrong main path. - Fix issue. Curves look too wavy. - [#773] Tool Point intersection curve and axis cannot find desired intersection point. +- [#776] Valentina cannot recognize translated functions. # Version 0.5.0 May 9, 2017 - [#581] User can now filter input lists by keyword in function wizard. diff --git a/src/libs/qmuparser/qmuparserbase.cpp b/src/libs/qmuparser/qmuparserbase.cpp index 5d1d1dc1d..9d35b608a 100644 --- a/src/libs/qmuparser/qmuparserbase.cpp +++ b/src/libs/qmuparser/qmuparserbase.cpp @@ -65,12 +65,12 @@ QmuParserBase::QmuParserBase() : m_locale(QLocale::c()), m_decimalPoint(QLocale::c().decimalPoint()), m_thousandsSeparator(QLocale::c().groupSeparator()), + m_FunDef(), m_pParseFormula(&QmuParserBase::ParseString), m_vRPN(), m_vStringBuf(), m_vStringVarBuf(), m_pTokenReader(), - m_FunDef(), m_PostOprtDef(), m_InfixOprtDef(), m_OprtDef(), @@ -101,12 +101,12 @@ QmuParserBase::QmuParserBase(const QmuParserBase &a_Parser) : m_locale(a_Parser.getLocale()), m_decimalPoint(a_Parser.getDecimalPoint()), m_thousandsSeparator(a_Parser.getThousandsSeparator()), + m_FunDef(), m_pParseFormula(&QmuParserBase::ParseString), m_vRPN(), m_vStringBuf(), m_vStringVarBuf(), m_pTokenReader(), - m_FunDef(), m_PostOprtDef(), m_InfixOprtDef(), m_OprtDef(), diff --git a/src/libs/qmuparser/qmuparserbase.h b/src/libs/qmuparser/qmuparserbase.h index b749a456e..6b3d6bbb4 100644 --- a/src/libs/qmuparser/qmuparserbase.h +++ b/src/libs/qmuparser/qmuparserbase.h @@ -138,8 +138,11 @@ protected: QLocale m_locale;///< The locale used by the parser QChar m_decimalPoint; QChar m_thousandsSeparator; + funmap_type m_FunDef; ///< Map of function names and pointers. static bool g_DbgDumpCmdCode; static bool g_DbgDumpStack; + void AddCallback(const QString &a_strName, const QmuParserCallback &a_Callback, funmap_type &a_Storage, + const QString &a_szCharSet ); void Init(); virtual void InitCharSets() = 0; virtual void InitFun() = 0; @@ -228,7 +231,6 @@ private: std::unique_ptr m_pTokenReader; ///< Managed pointer to the token reader object. - funmap_type m_FunDef; ///< Map of function names and pointers. funmap_type m_PostOprtDef; ///< Postfix operator callbacks funmap_type m_InfixOprtDef; ///< unary infix operator. funmap_type m_OprtDef; ///< Binary operator callbacks @@ -255,8 +257,6 @@ private: void Assign(const QmuParserBase &a_Parser); void InitTokenReader(); void ReInit() const; - void AddCallback(const QString &a_strName, const QmuParserCallback &a_Callback, - funmap_type &a_Storage, const QString &a_szCharSet ); void ApplyRemainingOprt(QStack &a_stOpt, QStack &a_stVal) const; void ApplyBinOprt(QStack &a_stOpt, QStack &a_stVal) const; void ApplyIfElse(QStack &a_stOpt, QStack &a_stVal) const; diff --git a/src/libs/qmuparser/qmuparsercallback.cpp b/src/libs/qmuparser/qmuparsercallback.cpp index be15787bf..e410b53eb 100644 --- a/src/libs/qmuparser/qmuparsercallback.cpp +++ b/src/libs/qmuparser/qmuparsercallback.cpp @@ -86,7 +86,6 @@ QmuParserCallback::QmuParserCallback ( fun_type3 a_pFun, bool a_bAllowOpti ) m_iCode ( cmFUNC ), m_iType ( tpDBL ), m_bAllowOpti ( a_bAllowOpti ) {} - //--------------------------------------------------------------------------------------------------------------------- #ifdef __GNUC__ __extension__ @@ -96,7 +95,6 @@ QmuParserCallback::QmuParserCallback ( fun_type4 a_pFun, bool a_bAllowOpti ) m_iCode ( cmFUNC ), m_iType ( tpDBL ), m_bAllowOpti ( a_bAllowOpti ) {} - //--------------------------------------------------------------------------------------------------------------------- #ifdef __GNUC__ __extension__ diff --git a/src/libs/qmuparser/qmutokenparser.cpp b/src/libs/qmuparser/qmutokenparser.cpp index 0dd8efd09..768d74507 100644 --- a/src/libs/qmuparser/qmutokenparser.cpp +++ b/src/libs/qmuparser/qmutokenparser.cpp @@ -53,8 +53,10 @@ QmuTokenParser::QmuTokenParser() * * @param formula string with formula. * @param fromUser true if we parse formula from user + * @param translatedFunctions */ -QmuTokenParser::QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser) +QmuTokenParser::QmuTokenParser(const QString &formula, bool osSeparator, + bool fromUser, const QMap &translatedFunctions) :QmuFormulaBase() { InitCharSets(); @@ -63,16 +65,26 @@ QmuTokenParser::QmuTokenParser(const QString &formula, bool osSeparator, bool fr SetSepForTr(osSeparator, fromUser); + // Fix for issue #776. Valentina cannot recognize translated functions. + QMap::const_iterator i = translatedFunctions.constBegin(); + while (i != translatedFunctions.constEnd()) + { + if (i.key() != i.value()) + { + auto search = m_FunDef.find(i.value()); + if(search != m_FunDef.end()) + { + AddCallback(i.key(), search->second, m_FunDef, ValidNameChars()); + } + } + ++i; + } + SetExpr(formula); //Need run for making tokens. Don't catch exception here, because we want know if formula has error. Eval(); } -//--------------------------------------------------------------------------------------------------------------------- -QmuTokenParser::~QmuTokenParser() -{ -} - //--------------------------------------------------------------------------------------------------------------------- /** * @brief IsSingle test formula and return true if it contain only one number. diff --git a/src/libs/qmuparser/qmutokenparser.h b/src/libs/qmuparser/qmutokenparser.h index 326e03502..9f0f08b5e 100644 --- a/src/libs/qmuparser/qmutokenparser.h +++ b/src/libs/qmuparser/qmutokenparser.h @@ -36,8 +36,9 @@ namespace qmu class QMUPARSERSHARED_EXPORT QmuTokenParser : public QmuFormulaBase { public: - QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser = true); - virtual ~QmuTokenParser() Q_DECL_OVERRIDE; + QmuTokenParser(const QString &formula, bool osSeparator, bool fromUser = true, + const QMap &translatedFunctions = QMap()); + virtual ~QmuTokenParser() = default; static bool IsSingle(const QString &formula); diff --git a/src/libs/vpatterndb/vtranslatevars.cpp b/src/libs/vpatterndb/vtranslatevars.cpp index f4fa577ea..c862deae4 100644 --- a/src/libs/vpatterndb/vtranslatevars.cpp +++ b/src/libs/vpatterndb/vtranslatevars.cpp @@ -55,13 +55,16 @@ VTranslateVars::VTranslateVars() functions(QMap()), postfixOperators(QMap()), placeholders(QMap()), - stDescriptions(QMap()) + stDescriptions(QMap()), + translatedFunctions(QMap()) { InitPatternMakingSystems(); InitVariables(); InitFunctions(); InitPostfixOperators(); InitPlaceholder(); + + PrepareFunctionTranslations(); } //--------------------------------------------------------------------------------------------------------------------- @@ -493,6 +496,22 @@ void VTranslateVars::InitPlaceholder() #undef translate +//--------------------------------------------------------------------------------------------------------------------- +void VTranslateVars::PrepareFunctionTranslations() +{ + translatedFunctions.clear(); + QMap::const_iterator i = functions.constBegin(); + while (i != functions.constEnd()) + { + const QString translated = i.value().translate(); + if (i.key() != translated) + { + translatedFunctions.insert(translated, i.key()); + } + ++i; + } +} + //--------------------------------------------------------------------------------------------------------------------- void VTranslateVars::InitSystem(const QString &code, const qmu::QmuTranslation &name, const qmu::QmuTranslation &author, const qmu::QmuTranslation &book) @@ -837,7 +856,9 @@ QString VTranslateVars::FormulaFromUser(const QString &formula, bool osSeparator } QString newFormula = formula;// Local copy for making changes - QScopedPointer cal(new qmu::QmuTokenParser(formula, osSeparator));// Eval formula + // Eval formula + QScopedPointer cal(new qmu::QmuTokenParser(formula, osSeparator, true, + qApp->TrVars()->GetTranslatedFunctions())); QMap tokens = cal->GetTokens();// Tokens (variables, measurements) QMap numbers = cal->GetNumbers();// All numbers in expression for changing decimal separator delete cal.take(); @@ -1107,6 +1128,14 @@ void VTranslateVars::Retranslate() InitFunctions(); InitPostfixOperators(); InitPlaceholder(); + + PrepareFunctionTranslations(); +} + +//--------------------------------------------------------------------------------------------------------------------- +QMap VTranslateVars::GetTranslatedFunctions() const +{ + return translatedFunctions; } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/libs/vpatterndb/vtranslatevars.h b/src/libs/vpatterndb/vtranslatevars.h index 4fcc0ac4e..5d4856b18 100644 --- a/src/libs/vpatterndb/vtranslatevars.h +++ b/src/libs/vpatterndb/vtranslatevars.h @@ -68,6 +68,7 @@ public: virtual void Retranslate() Q_DECL_OVERRIDE; + QMap GetTranslatedFunctions() const; QMap GetFunctions() const; static void BiasTokens(int position, int bias, QMap &tokens); @@ -82,6 +83,7 @@ private: QMap postfixOperators; QMap placeholders; QMap stDescriptions; + QMap translatedFunctions; void InitPatternMakingSystems(); void InitVariables(); @@ -89,6 +91,8 @@ private: void InitPostfixOperators(); void InitPlaceholder(); + void PrepareFunctionTranslations(); + void InitSystem(const QString &code, const qmu::QmuTranslation &name, const qmu::QmuTranslation &author, const qmu::QmuTranslation &book);