Skip to content

Commit

Permalink
Tweaked measure binding
Browse files Browse the repository at this point in the history
  • Loading branch information
poiru committed Jul 17, 2012
1 parent f39d1a3 commit 4bbc372
Show file tree
Hide file tree
Showing 17 changed files with 133 additions and 303 deletions.
129 changes: 46 additions & 83 deletions Library/Meter.cpp
Expand Up @@ -40,7 +40,6 @@ extern CRainmeter* Rainmeter;
**
*/
CMeter::CMeter(CMeterWindow* meterWindow, const WCHAR* name) : m_MeterWindow(meterWindow), m_Name(name),
m_Measure(),
m_X(),
m_Y(),
m_W(),
Expand Down Expand Up @@ -339,11 +338,6 @@ void CMeter::ReadOptions(CConfigParser& parser, const WCHAR* section)
m_Hidden = 0!=parser.ParseInt(hidden.c_str(), 0);
}

if (!m_Initialized)
{
m_MeasureName = parser.ReadString(section, L"MeasureName", L"");
}

m_SolidBevel = (BEVELTYPE)parser.ReadInt(section, L"BevelType", BEVELTYPE_NONE);

m_SolidColor = parser.ReadColor(section, L"SolidColor", Color::MakeARGB(0, 0, 0, 0));
Expand Down Expand Up @@ -404,34 +398,9 @@ void CMeter::ReadOptions(CConfigParser& parser, const WCHAR* section)
** several meters but one meter and only be bound to one measure.
**
*/
void CMeter::BindMeasure(const std::list<CMeasure*>& measures)
void CMeter::BindMeasures(CConfigParser& parser, const WCHAR* section)
{
// The meter is not bound to anything
if (m_MeasureName.empty())
{
std::wstring error = L"The meter [" + m_Name;
error += L"] is unbound";
throw CError(error);
}

// Go through the list and check it there is a measure for us
const WCHAR* measure = m_MeasureName.c_str();
std::list<CMeasure*>::const_iterator i = measures.begin();
for ( ; i != measures.end(); ++i)
{
if (_wcsicmp((*i)->GetName(), measure) == 0)
{
m_Measure = (*i);
return;
}
}

// Error :)
std::wstring error = L"The meter [" + m_Name;
error += L"] cannot be bound with [";
error += m_MeasureName;
error += L']';
throw CError(error);
BindPrimaryMeasure(parser, section, false);
}

/*
Expand Down Expand Up @@ -498,56 +467,61 @@ bool CMeter::Update()
}

/*
** Creates a vector containing all the defined measures (for Histogram)
*/
void CMeter::SetAllMeasures(CMeasure* measure)
{
m_AllMeasures.clear();
m_AllMeasures.reserve(2);
m_AllMeasures.push_back(m_Measure);
m_AllMeasures.push_back(measure);
}

/*
** Creates a vector containing all the defined measures (for Image/Line/String)
** Reads and binds the primary MeasureName.
**
*/
void CMeter::SetAllMeasures(const std::vector<CMeasure*>& measures)
bool CMeter::BindPrimaryMeasure(CConfigParser& parser, const WCHAR* section, bool optional)
{
m_AllMeasures.clear();
m_AllMeasures.reserve(1 + measures.size());
m_AllMeasures.push_back(m_Measure);
const std::wstring& measureName = parser.ReadString(section, L"MeasureName", L"");

std::vector<CMeasure*>::const_iterator i = measures.begin();
for ( ; i != measures.end(); ++i)
// The meter is not bound to anything
CMeasure* measure = parser.GetMeasure(measureName);
if (measure)
{
m_AllMeasures.push_back(*i);
m_Measures.push_back(measure);
return true;
}
else if (!optional)
{
LogWithArgs(LOG_ERROR, L"MeasureName=%s is not valid in [%s]", measureName.c_str(), section);
}

return false;
}

/*
** Reads measure names (MeasureName2 - MeasureName[N])
** Reads and binds secondary measures (MeasureName2 - MeasureNameN).
**
*/
void CMeter::ReadMeasureNames(CConfigParser& parser, const WCHAR* section, std::vector<std::wstring>& measureNames)
void CMeter::BindSecondaryMeasures(CConfigParser& parser, const WCHAR* section)
{
WCHAR tmpName[64];

int i = 2;
bool loop = true;
do
if (!m_Measures.empty())
{
_snwprintf_s(tmpName, _TRUNCATE, L"MeasureName%i", i);
const std::wstring& measure = parser.ReadString(section, tmpName, L"");
if (!measure.empty())
{
measureNames.push_back(measure);
}
else
WCHAR tmpName[64];

int i = 2;
do
{
loop = false;
_snwprintf_s(tmpName, _TRUNCATE, L"MeasureName%i", i);
const std::wstring& measureName = parser.ReadString(section, tmpName, L"");
CMeasure* measure = parser.GetMeasure(measureName);
if (measure)
{
m_Measures.push_back(measure);
}
else
{
if (!measureName.empty())
{
LogWithArgs(LOG_ERROR, L"MeasureName%i=%s is not valid in [%s]", i, measureName.c_str(), section);
}

break;
}
++i;
}
++i;
while (true);
}
while(loop);
}

/*
Expand Down Expand Up @@ -590,26 +564,15 @@ void CMeter::ReplaceToolTipMeasures(std::wstring& str)
{
std::vector<std::wstring> stringValues;

if (!m_AllMeasures.empty())
if (!m_Measures.empty())
{
// Get the values for the measures
std::vector<CMeasure*>::const_iterator iter = m_AllMeasures.begin();
for ( ; iter != m_AllMeasures.end(); ++iter)
std::vector<CMeasure*>::const_iterator iter = m_Measures.begin();
for ( ; iter != m_Measures.end(); ++iter)
{
stringValues.push_back((*iter)->GetStringValue(AUTOSCALE_ON, 1, 0, false));
}
}
else if (m_Measure != NULL)
{
stringValues.push_back(m_Measure->GetStringValue(AUTOSCALE_ON, 1, 0, false));
}
else
{
return;
}

if (!stringValues.empty())
{
ReplaceMeasures(stringValues, str);
}
}
Expand Down
14 changes: 6 additions & 8 deletions Library/Meter.h
Expand Up @@ -39,11 +39,11 @@ class CMeter : public CGroup
virtual UINT GetTypeID() = 0;

void ReadOptions(CConfigParser& parser) { ReadOptions(parser, GetName()); parser.ClearStyleTemplate(); }
void BindMeasures(CConfigParser& parser) { BindMeasures(parser, GetName()); }

virtual void Initialize();
virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics);
virtual void BindMeasure(const std::list<CMeasure*>& measures);
virtual bool HasActiveTransition() { return false; }

bool HasDynamicVariables() { return m_DynamicVariables; }
Expand Down Expand Up @@ -116,18 +116,16 @@ class CMeter : public CGroup
};

virtual void ReadOptions(CConfigParser& parser, const WCHAR* section);
virtual void BindMeasures(CConfigParser& parser, const WCHAR* section);

void SetAllMeasures(CMeasure* measure);
void SetAllMeasures(const std::vector<CMeasure*>& measures);
void ReplaceToolTipMeasures(std::wstring& str);
bool BindPrimaryMeasure(CConfigParser& parser, const WCHAR* section, bool optional);
void BindSecondaryMeasures(CConfigParser& parser, const WCHAR* section);

static void ReadMeasureNames(CConfigParser& parser, const WCHAR* section, std::vector<std::wstring>& measureNames);
void ReplaceToolTipMeasures(std::wstring& str);
static bool ReplaceMeasures(const std::vector<std::wstring>& stringValues, std::wstring& str);

const std::wstring m_Name;
std::wstring m_MeasureName; // Name of bound measure
CMeasure* m_Measure; // Pointer to bound measure
std::vector<CMeasure*> m_AllMeasures;
std::vector<CMeasure*> m_Measures;
int m_X;
int m_Y;
int m_W;
Expand Down
4 changes: 2 additions & 2 deletions Library/MeterBar.cpp
Expand Up @@ -148,9 +148,9 @@ void CMeterBar::ReadOptions(CConfigParser& parser, const WCHAR* section)
*/
bool CMeterBar::Update()
{
if (CMeter::Update() && m_Measure)
if (CMeter::Update() && !m_Measures.empty())
{
m_Value = m_Measure->GetRelativeValue();
m_Value = m_Measures[0]->GetRelativeValue();
return true;
}
return false;
Expand Down
5 changes: 3 additions & 2 deletions Library/MeterBitmap.cpp
Expand Up @@ -227,9 +227,10 @@ void CMeterBitmap::ReadOptions(CConfigParser& parser, const WCHAR* section)
*/
bool CMeterBitmap::Update()
{
if (CMeter::Update() && m_Measure)
if (CMeter::Update() && !m_Measures.empty())
{
double value = (m_Extend) ? m_Measure->GetValue() : m_Measure->GetRelativeValue();
CMeasure* measure = m_Measures[0];
double value = (m_Extend) ? measure->GetValue() : measure->GetRelativeValue();

if (m_TransitionFrameCount > 0)
{
Expand Down
8 changes: 2 additions & 6 deletions Library/MeterButton.cpp
Expand Up @@ -200,13 +200,9 @@ bool CMeterButton::Draw(Graphics& graphics)
** Overridden method. The meters need not to be bound on anything
**
*/
void CMeterButton::BindMeasure(const std::list<CMeasure*>& measures)
void CMeterButton::BindMeasures(CConfigParser& parser, const WCHAR* section)
{
// It's ok not to bind meter to anything
if (!m_MeasureName.empty())
{
CMeter::BindMeasure(measures);
}
BindPrimaryMeasure(parser, section, true);
}

/*
Expand Down
2 changes: 1 addition & 1 deletion Library/MeterButton.h
Expand Up @@ -35,7 +35,6 @@ class CMeterButton : public CMeter
virtual void Initialize();
virtual bool Update();
virtual bool Draw(Gdiplus::Graphics& graphics);
virtual void BindMeasure(const std::list<CMeasure*>& measures);

bool MouseMove(POINT pos);
bool MouseUp(POINT pos, bool execute);
Expand All @@ -45,6 +44,7 @@ class CMeterButton : public CMeter

protected:
virtual void ReadOptions(CConfigParser& parser, const WCHAR* section);
virtual void BindMeasures(CConfigParser& parser, const WCHAR* section);

private:
bool HitTest2(int px, int py, bool checkAlpha);
Expand Down

0 comments on commit 4bbc372

Please sign in to comment.