diff --git a/Library/Library.vcxproj b/Library/Library.vcxproj index 25190616..3774f52c 100644 --- a/Library/Library.vcxproj +++ b/Library/Library.vcxproj @@ -194,6 +194,9 @@ Use + + Use + Create diff --git a/Library/Library.vcxproj.filters b/Library/Library.vcxproj.filters index 73eac537..241c76b7 100644 --- a/Library/Library.vcxproj.filters +++ b/Library/Library.vcxproj.filters @@ -321,6 +321,9 @@ Source Files + + Source Files + Common diff --git a/Library/Measure.cpp b/Library/Measure.cpp index c6eaebe2..088f86cf 100644 --- a/Library/Measure.cpp +++ b/Library/Measure.cpp @@ -69,7 +69,7 @@ extern CRainmeter* Rainmeter; ** The constructor ** */ -CMeasure::CMeasure(CMeterWindow* meterWindow, const WCHAR* name) : CSection(name), m_MeterWindow(meterWindow), +CMeasure::CMeasure(CMeterWindow* meterWindow, const WCHAR* name) : CSection(meterWindow, name), m_Invert(false), m_LogMaxValue(false), m_MinValue(), @@ -87,8 +87,8 @@ CMeasure::CMeasure(CMeterWindow* meterWindow, const WCHAR* name) : CSection(name m_IfBelowCommitted(false), m_Disabled(false), m_Initialized(false), - m_OldValue(0.0), - m_OldStringValue(L"") + m_OldValue(), + m_OldValueInitialized(false) { } @@ -728,6 +728,36 @@ void CMeasure::RemoveTrailingZero(WCHAR* str, int strLen) } } +/* +** Execute OnChangeAction if action is set +** +*/ +void CMeasure::DoChangeAction() +{ + if (!m_OldValueInitialized) + { + double newValue = GetValue(); + const WCHAR* newStringValue = GetStringValue(AUTOSCALE_OFF, 1, -1, false); + + m_OldValue = newValue; + m_OldStringValue = newStringValue; + m_OldValueInitialized = true; + } + else if (!m_OnChangeAction.empty()) + { + double newValue = GetValue(); + const WCHAR* newStringValue = GetStringValue(AUTOSCALE_OFF, 1, -1, false); + + if (m_OldValue != newValue || wcscmp(m_OldStringValue.c_str(), newStringValue) != 0) + { + m_OldValue = newValue; + m_OldStringValue = newStringValue; + + Rainmeter->ExecuteCommand(m_OnChangeAction.c_str(), m_MeterWindow); + } + } +} + /* ** Creates the given measure. This is the factory method for the measures. ** If new measures are implemented this method needs to be updated. diff --git a/Library/Measure.h b/Library/Measure.h index 59a18e7a..7c7d5a02 100644 --- a/Library/Measure.h +++ b/Library/Measure.h @@ -68,10 +68,7 @@ public: static void RemoveTrailingZero(WCHAR* str, int strLen); const std::wstring& GetOnChangeAction() { return m_OnChangeAction; } - void SetOldValue(double value) { m_OldValue = value; } - double GetOldValue() { return m_OldValue; } - void SetOldStringValue(std::wstring value) { m_OldStringValue = value; } - const std::wstring& GetOldStringValue() { return m_OldStringValue; } + void DoChangeAction(); CMeterWindow* GetMeterWindow() { return m_MeterWindow; } @@ -119,8 +116,7 @@ protected: std::wstring m_OnChangeAction; double m_OldValue; std::wstring m_OldStringValue; - - CMeterWindow* m_MeterWindow; + bool m_OldValueInitialized; }; #endif diff --git a/Library/Meter.cpp b/Library/Meter.cpp index 217ecc6a..82378f8e 100644 --- a/Library/Meter.cpp +++ b/Library/Meter.cpp @@ -39,7 +39,7 @@ extern CRainmeter* Rainmeter; ** The constructor ** */ -CMeter::CMeter(CMeterWindow* meterWindow, const WCHAR* name) : CSection(name), m_MeterWindow(meterWindow), +CMeter::CMeter(CMeterWindow* meterWindow, const WCHAR* name) : CSection(meterWindow, name), m_X(), m_Y(), m_W(0), diff --git a/Library/Meter.h b/Library/Meter.h index 97657ca2..d082f8c7 100644 --- a/Library/Meter.h +++ b/Library/Meter.h @@ -150,8 +150,6 @@ protected: Gdiplus::REAL m_SolidAngle; bool m_AntiAlias; bool m_Initialized; - - CMeterWindow* m_MeterWindow; }; #endif diff --git a/Library/MeterWindow.cpp b/Library/MeterWindow.cpp index a591f104..c5011d3d 100644 --- a/Library/MeterWindow.cpp +++ b/Library/MeterWindow.cpp @@ -1228,7 +1228,7 @@ void CMeterWindow::UpdateMeter(const std::wstring& name, bool group) { if (UpdateMeter((*j), bActiveTransition, true)) { - DoUpdateAction((*j)); + (*j)->DoUpdateAction(); } SetResizeWindowMode(RESIZEMODE_CHECK); // Need to recalculate the window size @@ -1354,8 +1354,8 @@ void CMeterWindow::UpdateMeasure(const std::wstring& name, bool group) if (UpdateMeasure((*i), true)) { - DoUpdateAction((*i)); - //DoChangeAction((*i), false); // TODO: Check that this is the first update or not + (*i)->DoUpdateAction(); + (*i)->DoChangeAction(); } if (!group) return; @@ -2678,6 +2678,11 @@ void CMeterWindow::Update(bool refresh) { ++m_UpdateCounter; +#ifdef DEBUG_PERF_UPDATE + _QPC(s1); + __int64 e1; +#endif + if (!m_Measures.empty()) { // Pre-updates @@ -2687,20 +2692,34 @@ void CMeterWindow::Update(bool refresh) CMeasureNet::UpdateStats(); } +#ifdef DEBUG_PERF_UPDATE + e1 = QPC(); +#endif + // Update all measures std::vector::const_iterator i = m_Measures.begin(); for ( ; i != m_Measures.end(); ++i) { if (UpdateMeasure((*i), refresh)) { - DoUpdateAction((*i)); - DoChangeAction((*i), refresh); + (*i)->DoUpdateAction(); + (*i)->DoChangeAction(); } } } +#ifdef DEBUG_PERF_UPDATE + else + { + e1 = QPC(); + } +#endif CDialogAbout::UpdateMeasures(this); +#ifdef DEBUG_PERF_UPDATE + _QPC(e2); +#endif + // Update all meters bool bActiveTransition = false; bool bUpdate = false; @@ -2711,10 +2730,16 @@ void CMeterWindow::Update(bool refresh) { bUpdate = true; - DoUpdateAction((*j)); + (*j)->DoUpdateAction(); } } +#ifdef DEBUG_PERF_UPDATE + _QPC(e3); + double q1 = QPCms(s1,e1), q2 = QPCms(e1,e2), q3 = QPCms(e2,e3); + DebugString(L"Update: %.5f [ms] (PreUpdate: %.5f / Measure: %.5f / Meter: %.5f) :: %s", q1 + q2 + q3, q1, q2, q3, m_FolderPath.c_str()); +#endif + // Redraw all meters if (bUpdate || m_ResizeWindow || refresh) { @@ -2741,40 +2766,6 @@ void CMeterWindow::Update(bool refresh) } } -void CMeterWindow::DoUpdateAction(CSection* section) -{ - const std::wstring& updateAction = section->GetOnUpdateAction(); - if (!updateAction.empty()) - { - Rainmeter->ExecuteCommand(updateAction.c_str(), this); - } -} - -void CMeterWindow::DoChangeAction(CMeasure* measure, bool first) -{ - const std::wstring& changeAction = measure->GetOnChangeAction(); - if (first) - { - double newValue = measure->GetValue(); - const WCHAR* newStringValue = measure->GetStringValue(AUTOSCALE_OFF, 1, -1, false); - - measure->SetOldValue(newValue); - measure->SetOldStringValue(newStringValue); - } - else if (!changeAction.empty()) - { - double newValue = measure->GetValue(); - const WCHAR* newStringValue = measure->GetStringValue(AUTOSCALE_OFF, 1, -1, false); - - if (measure->GetOldValue() != newValue || wcscmp(measure->GetOldStringValue().c_str(), newStringValue) != 0) - { - measure->SetOldValue(newValue); - measure->SetOldStringValue(newStringValue); - Rainmeter->ExecuteCommand(changeAction.c_str(), this); - } - } -} - /* ** Updates the window contents ** diff --git a/Library/MeterWindow.h b/Library/MeterWindow.h index af8699ae..cf242f38 100644 --- a/Library/MeterWindow.h +++ b/Library/MeterWindow.h @@ -25,7 +25,6 @@ #include #include #include "ConfigParser.h" -#include "Section.h" #include "Group.h" #include "Mouse.h" @@ -318,8 +317,6 @@ private: bool UpdateMeasure(CMeasure* measure, bool force); bool UpdateMeter(CMeter* meter, bool& bActiveTransition, bool force); void Update(bool refresh); - void DoUpdateAction(CSection* section); - void DoChangeAction(CMeasure* measure, bool first); void UpdateWindow(int alpha, bool reset); void ReadOptions(); void WriteOptions(INT setting = OPTION_ALL); diff --git a/Library/Section.cpp b/Library/Section.cpp new file mode 100644 index 00000000..b2168cc6 --- /dev/null +++ b/Library/Section.cpp @@ -0,0 +1,54 @@ +/* + Copyright (C) 2013 spx + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "StdAfx.h" +#include "Section.h" +#include "Rainmeter.h" + +extern CRainmeter* Rainmeter; + +/* +** The constructor +** +*/ +CSection::CSection(CMeterWindow* meterWindow, const WCHAR* name) : m_MeterWindow(meterWindow), m_Name(name), + m_DynamicVariables(false), + m_UpdateDivider(1), + m_UpdateCounter(1) +{ +} + +/* +** The destructor +** +*/ +CSection::~CSection() +{ +} + +/* +** Execute OnUpdateAction if action is set +** +*/ +void CSection::DoUpdateAction() +{ + if (!m_OnUpdateAction.empty()) + { + Rainmeter->ExecuteCommand(m_OnUpdateAction.c_str(), m_MeterWindow); + } +} diff --git a/Library/Section.h b/Library/Section.h index 1bcd0929..211cea6d 100644 --- a/Library/Section.h +++ b/Library/Section.h @@ -23,10 +23,12 @@ #include #include "Group.h" +class CMeterWindow; + class CSection : public CGroup { public: - virtual ~CSection() {}; + virtual ~CSection(); virtual UINT GetTypeID() = 0; @@ -41,9 +43,10 @@ public: int GetUpdateDivider() const { return m_UpdateDivider; } const std::wstring& GetOnUpdateAction() { return m_OnUpdateAction; } + void DoUpdateAction(); protected: - CSection(const WCHAR* name) : m_Name(name), m_DynamicVariables(false), m_UpdateDivider(1), m_UpdateCounter(1) {} + CSection(CMeterWindow* meterWindow, const WCHAR* name); const std::wstring m_Name; // Name of this Section @@ -52,6 +55,8 @@ protected: int m_UpdateCounter; // Current update counter std::wstring m_OnUpdateAction; + + CMeterWindow* m_MeterWindow; }; #endif