mirror of
https://github.com/chibicitiberiu/rainmeter-studio.git
synced 2024-02-24 04:33:31 +00:00
Fixed the issue that RANDOM is replaced incorrectly in Measure=Calc.
This commit is contained in:
parent
3d33a16f9f
commit
8fe2a26a51
@ -43,6 +43,10 @@ CMeasureCalc::CMeasureCalc(CMeterWindow* meterWindow) : CMeasure(meterWindow)
|
|||||||
|
|
||||||
m_Parser = MathParser_Create(NULL);
|
m_Parser = MathParser_Create(NULL);
|
||||||
|
|
||||||
|
m_LowBound = 0;
|
||||||
|
m_HighBound = 100;
|
||||||
|
m_UpdateRandom = false;
|
||||||
|
|
||||||
rand();
|
rand();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +78,7 @@ bool CMeasureCalc::Update()
|
|||||||
if (!CMeasure::PreUpdate()) return false;
|
if (!CMeasure::PreUpdate()) return false;
|
||||||
|
|
||||||
m_Parser->Parameters = c_VarMap;
|
m_Parser->Parameters = c_VarMap;
|
||||||
if(m_UpdateRandom > 0)
|
if (m_UpdateRandom)
|
||||||
{
|
{
|
||||||
FormulaReplace();
|
FormulaReplace();
|
||||||
}
|
}
|
||||||
@ -126,15 +130,31 @@ void CMeasureCalc::ReadConfig(CConfigParser& parser, const WCHAR* section)
|
|||||||
{
|
{
|
||||||
CMeasure::ReadConfig(parser, section);
|
CMeasure::ReadConfig(parser, section);
|
||||||
|
|
||||||
|
// Store the current values so we know if the value needs to be updated
|
||||||
|
int oldLowBound = m_LowBound;
|
||||||
|
int oldHighBound = m_HighBound;
|
||||||
|
bool oldUpdateRandom = m_UpdateRandom;
|
||||||
|
|
||||||
m_Formula = parser.ReadString(section, L"Formula", L"");
|
m_Formula = parser.ReadString(section, L"Formula", L"");
|
||||||
// Hold onto the formula, we are going to change it
|
|
||||||
m_FormulaHolder = m_Formula;
|
|
||||||
|
|
||||||
m_LowBound = parser.ReadInt(section, L"LowBound", 0);
|
m_LowBound = parser.ReadInt(section, L"LowBound", 0);
|
||||||
m_HighBound = parser.ReadInt(section, L"HighBound", 100);
|
m_HighBound = parser.ReadInt(section, L"HighBound", 100);
|
||||||
m_UpdateRandom = parser.ReadInt(section, L"UpdateRandom", 0);
|
m_UpdateRandom = 0!=parser.ReadInt(section, L"UpdateRandom", 0);
|
||||||
|
|
||||||
FormulaReplace();
|
if (!m_Initialized ||
|
||||||
|
m_FormulaHolder != m_Formula ||
|
||||||
|
oldLowBound != m_LowBound ||
|
||||||
|
oldHighBound != m_HighBound ||
|
||||||
|
oldUpdateRandom != m_UpdateRandom)
|
||||||
|
{
|
||||||
|
// Hold onto the formula, we are going to change it
|
||||||
|
m_FormulaHolder = m_Formula;
|
||||||
|
|
||||||
|
if (!m_UpdateRandom)
|
||||||
|
{
|
||||||
|
FormulaReplace();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -152,11 +172,13 @@ void CMeasureCalc::FormulaReplace()
|
|||||||
|
|
||||||
while ((loc = m_Formula.find_first_of(L"Rr", loc)) != std::wstring::npos)
|
while ((loc = m_Formula.find_first_of(L"Rr", loc)) != std::wstring::npos)
|
||||||
{
|
{
|
||||||
if (wcsnicmp(L"Random", m_Formula.c_str() + loc, 6) == 0)
|
if (wcsnicmp(L"Random", m_Formula.c_str() + loc, 6) == 0 &&
|
||||||
|
(loc == 0 || IsDelimiter(*(m_Formula.c_str() + loc - 1))) &&
|
||||||
|
(loc == (m_Formula.length() - 6) || IsDelimiter(*(m_Formula.c_str() + loc + 6))))
|
||||||
{
|
{
|
||||||
int range = (m_HighBound - m_LowBound) + 1;
|
int range = (m_HighBound - m_LowBound) + 1;
|
||||||
srand((unsigned) rand());
|
srand((unsigned) rand());
|
||||||
int randNumber = m_LowBound + (range * rand()/(RAND_MAX + 1.0));
|
int randNumber = m_LowBound + (int)(range * rand()/(RAND_MAX + 1.0));
|
||||||
|
|
||||||
WCHAR buffer[32];
|
WCHAR buffer[32];
|
||||||
wsprintf(buffer, L"%i", randNumber);
|
wsprintf(buffer, L"%i", randNumber);
|
||||||
@ -169,4 +191,25 @@ void CMeasureCalc::FormulaReplace()
|
|||||||
++loc;
|
++loc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** IsDelimiter
|
||||||
|
**
|
||||||
|
** Checks whether the given character is a operator or a delimiter.
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
bool CMeasureCalc::IsDelimiter(WCHAR ch)
|
||||||
|
{
|
||||||
|
const WCHAR symbols[] = L" \t\n()+-/*^~<>%$,?:=&|;";
|
||||||
|
|
||||||
|
for (size_t i = 0, len = wcslen(symbols); i < len; ++i)
|
||||||
|
{
|
||||||
|
if (ch == symbols[i])
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@ -35,6 +35,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void FormulaReplace();
|
void FormulaReplace();
|
||||||
|
bool IsDelimiter(WCHAR ch);
|
||||||
|
|
||||||
std::wstring m_Formula;
|
std::wstring m_Formula;
|
||||||
std::wstring m_FormulaHolder;
|
std::wstring m_FormulaHolder;
|
||||||
hqMathParser* m_Parser;
|
hqMathParser* m_Parser;
|
||||||
@ -42,9 +44,9 @@ private:
|
|||||||
static hqStrMap* c_VarMap;
|
static hqStrMap* c_VarMap;
|
||||||
static bool c_RandSeeded;
|
static bool c_RandSeeded;
|
||||||
|
|
||||||
int m_UpdateRandom;
|
|
||||||
int m_LowBound;
|
int m_LowBound;
|
||||||
int m_HighBound;
|
int m_HighBound;
|
||||||
|
bool m_UpdateRandom;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user