mirror of
				https://github.com/chibicitiberiu/rainmeter-studio.git
				synced 2024-02-24 04:33:31 +00:00 
			
		
		
		
	Fixed: IfActions not fired when measure is disabled
This commit is contained in:
		@@ -424,85 +424,74 @@ std::wstring CMeasure::ExtractWord(std::wstring& buffer)
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** The base implementation of the update method. This includes the code
 | 
			
		||||
** that is common for all measures. This is called every time the measure
 | 
			
		||||
** is updated. The inherited classes must call the base implementation if
 | 
			
		||||
** they overwrite this method. If this method returns false, the update
 | 
			
		||||
** needs not to be done.
 | 
			
		||||
**
 | 
			
		||||
*/
 | 
			
		||||
bool CMeasure::PreUpdate()
 | 
			
		||||
bool CMeasure::Update()
 | 
			
		||||
{
 | 
			
		||||
	if (IsDisabled())
 | 
			
		||||
	bool update = !IsDisabled();
 | 
			
		||||
 | 
			
		||||
	if (update)
 | 
			
		||||
	{
 | 
			
		||||
		m_Value = 0.0;	// Disable measures return 0 as value
 | 
			
		||||
		return false;
 | 
			
		||||
		// Only update the counter if the divider
 | 
			
		||||
		++m_UpdateCounter;
 | 
			
		||||
		if (m_UpdateCounter < m_UpdateDivider) return false;
 | 
			
		||||
		m_UpdateCounter = 0;
 | 
			
		||||
 | 
			
		||||
		// If we're logging the maximum value of the measure, check if
 | 
			
		||||
		// the new value is greater than the old one, and update if necessary.
 | 
			
		||||
		if (m_LogMaxValue)
 | 
			
		||||
		{
 | 
			
		||||
			if (m_MedianMaxValues.empty())
 | 
			
		||||
			{
 | 
			
		||||
				m_MedianMaxValues.resize(MEDIAN_SIZE, 0);
 | 
			
		||||
				m_MedianMinValues.resize(MEDIAN_SIZE, 0);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			m_MedianMaxValues[m_MedianPos] = m_Value;
 | 
			
		||||
			m_MedianMinValues[m_MedianPos] = m_Value;
 | 
			
		||||
			++m_MedianPos;
 | 
			
		||||
			m_MedianPos %= MEDIAN_SIZE;
 | 
			
		||||
 | 
			
		||||
			std::vector<double> medianArray;
 | 
			
		||||
 | 
			
		||||
			medianArray = m_MedianMaxValues;
 | 
			
		||||
			std::sort(medianArray.begin(), medianArray.end());
 | 
			
		||||
			m_MaxValue = max(m_MaxValue, medianArray[MEDIAN_SIZE / 2]);
 | 
			
		||||
 | 
			
		||||
			medianArray = m_MedianMinValues;
 | 
			
		||||
			std::sort(medianArray.begin(), medianArray.end());
 | 
			
		||||
			m_MinValue = min(m_MinValue, medianArray[MEDIAN_SIZE / 2]);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Call derived method to update value
 | 
			
		||||
		UpdateValue();
 | 
			
		||||
 | 
			
		||||
		if (m_AverageSize > 0)
 | 
			
		||||
		{
 | 
			
		||||
			size_t averageValuesSize = m_AverageValues.size();
 | 
			
		||||
 | 
			
		||||
			if (m_AverageSize != averageValuesSize)
 | 
			
		||||
			{
 | 
			
		||||
				m_AverageValues.resize(m_AverageSize, m_Value);
 | 
			
		||||
				averageValuesSize = m_AverageValues.size();
 | 
			
		||||
				if (m_AveragePos >= averageValuesSize) m_AveragePos = 0;
 | 
			
		||||
			}
 | 
			
		||||
			m_AverageValues[m_AveragePos] = m_Value;
 | 
			
		||||
 | 
			
		||||
			++m_AveragePos;
 | 
			
		||||
			m_AveragePos %= averageValuesSize;
 | 
			
		||||
 | 
			
		||||
			// Calculate the average value
 | 
			
		||||
			m_Value = 0;
 | 
			
		||||
			for (size_t i = 0; i < averageValuesSize; ++i)
 | 
			
		||||
			{
 | 
			
		||||
				m_Value += m_AverageValues[i];
 | 
			
		||||
			}
 | 
			
		||||
			m_Value /= (double)averageValuesSize;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Only update the counter if the divider
 | 
			
		||||
	++m_UpdateCounter;
 | 
			
		||||
	if (m_UpdateCounter < m_UpdateDivider) return false;
 | 
			
		||||
	m_UpdateCounter = 0;
 | 
			
		||||
 | 
			
		||||
	// If we're logging the maximum value of the measure, check if
 | 
			
		||||
	// the new value is greater than the old one, and update if necessary.
 | 
			
		||||
	if (m_LogMaxValue)
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (m_MedianMaxValues.empty())
 | 
			
		||||
		{
 | 
			
		||||
			m_MedianMaxValues.resize(MEDIAN_SIZE, 0);
 | 
			
		||||
			m_MedianMinValues.resize(MEDIAN_SIZE, 0);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		m_MedianMaxValues[m_MedianPos] = m_Value;
 | 
			
		||||
		m_MedianMinValues[m_MedianPos] = m_Value;
 | 
			
		||||
		++m_MedianPos;
 | 
			
		||||
		m_MedianPos %= MEDIAN_SIZE;
 | 
			
		||||
 | 
			
		||||
		std::vector<double> medianArray;
 | 
			
		||||
 | 
			
		||||
		medianArray = m_MedianMaxValues;
 | 
			
		||||
		std::sort(medianArray.begin(), medianArray.end());
 | 
			
		||||
		m_MaxValue = max(m_MaxValue, medianArray[MEDIAN_SIZE / 2]);
 | 
			
		||||
 | 
			
		||||
		medianArray = m_MedianMinValues;
 | 
			
		||||
		std::sort(medianArray.begin(), medianArray.end());
 | 
			
		||||
		m_MinValue = min(m_MinValue, medianArray[MEDIAN_SIZE / 2]);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
** Does post measuring things to the value. All measures must call this
 | 
			
		||||
** after they have set the m_Value.
 | 
			
		||||
**
 | 
			
		||||
*/
 | 
			
		||||
bool CMeasure::PostUpdate()
 | 
			
		||||
{
 | 
			
		||||
	if (m_AverageSize > 0)
 | 
			
		||||
	{
 | 
			
		||||
		size_t averageValuesSize = m_AverageValues.size();
 | 
			
		||||
 | 
			
		||||
		if (m_AverageSize != averageValuesSize)
 | 
			
		||||
		{
 | 
			
		||||
			m_AverageValues.resize(m_AverageSize, m_Value);
 | 
			
		||||
			averageValuesSize = m_AverageValues.size();
 | 
			
		||||
			if (m_AveragePos >= averageValuesSize) m_AveragePos = 0;
 | 
			
		||||
		}
 | 
			
		||||
		m_AverageValues[m_AveragePos] = m_Value;
 | 
			
		||||
 | 
			
		||||
		++m_AveragePos;
 | 
			
		||||
		m_AveragePos %= averageValuesSize;
 | 
			
		||||
 | 
			
		||||
		// Calculate the average value
 | 
			
		||||
		m_Value = 0;
 | 
			
		||||
		for (size_t i = 0; i < averageValuesSize; ++i)
 | 
			
		||||
		{
 | 
			
		||||
			m_Value += m_AverageValues[i];
 | 
			
		||||
		}
 | 
			
		||||
		m_Value /= (double)averageValuesSize;
 | 
			
		||||
		// Disabled measures have 0 as value
 | 
			
		||||
		m_Value = 0.0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (m_MeterWindow)
 | 
			
		||||
@@ -513,7 +502,7 @@ bool CMeasure::PostUpdate()
 | 
			
		||||
			{
 | 
			
		||||
				if (!m_IfEqualCommitted)
 | 
			
		||||
				{
 | 
			
		||||
					m_IfEqualCommitted = true;  // To avoid crashing by !Update due to infinite loop
 | 
			
		||||
					m_IfEqualCommitted = true;	// To avoid infinite loop from !Update
 | 
			
		||||
					Rainmeter->ExecuteCommand(m_IfEqualAction.c_str(), m_MeterWindow);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@@ -529,7 +518,7 @@ bool CMeasure::PostUpdate()
 | 
			
		||||
			{
 | 
			
		||||
				if (!m_IfAboveCommitted)
 | 
			
		||||
				{
 | 
			
		||||
					m_IfAboveCommitted= true;  // To avoid crashing by !Update due to infinite loop
 | 
			
		||||
					m_IfAboveCommitted= true;	// To avoid infinite loop from !Update
 | 
			
		||||
					Rainmeter->ExecuteCommand(m_IfAboveAction.c_str(), m_MeterWindow);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@@ -545,7 +534,7 @@ bool CMeasure::PostUpdate()
 | 
			
		||||
			{
 | 
			
		||||
				if (!m_IfBelowCommitted)
 | 
			
		||||
				{
 | 
			
		||||
					m_IfBelowCommitted = true;  // To avoid crashing by !Update due to infinite loop
 | 
			
		||||
					m_IfBelowCommitted = true;	// To avoid infinite loop from !Update
 | 
			
		||||
					Rainmeter->ExecuteCommand(m_IfBelowAction.c_str(), m_MeterWindow);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
@@ -556,7 +545,7 @@ bool CMeasure::PostUpdate()
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
	return update;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user