diff --git a/Library/CommandHandler.cpp b/Library/CommandHandler.cpp index acc41d88..b11fee24 100644 --- a/Library/CommandHandler.cpp +++ b/Library/CommandHandler.cpp @@ -67,6 +67,9 @@ const BangInfo s_Bangs[] = { Bang::DisableMeasure, L"DisableMeasure", 1 }, { Bang::EnableMeasure, L"EnableMeasure", 1 }, { Bang::ToggleMeasure, L"ToggleMeasure", 1 }, + { Bang::PauseMeasure, L"PauseMeasure", 1 }, + { Bang::UnpauseMeasure, L"UnpauseMeasure", 1 }, + { Bang::TogglePauseMeasure, L"TogglePauseMeasure", 1 }, { Bang::UpdateMeasure, L"UpdateMeasure", 1 }, { Bang::CommandMeasure, L"CommandMeasure", 2 }, { Bang::PluginBang, L"PluginBang", 1 }, @@ -94,6 +97,9 @@ const BangInfo s_Bangs[] = { Bang::DisableMeasureGroup, L"DisableMeasureGroup", 1 }, { Bang::EnableMeasureGroup, L"EnableMeasureGroup", 1 }, { Bang::ToggleMeasureGroup, L"ToggleMeasureGroup", 1 }, + { Bang::PauseMeasureGroup, L"PauseMeasureGroup", 1 }, + { Bang::UnpauseMeasureGroup, L"UnpauseMeasureGroup", 1 }, + { Bang::TogglePauseMeasureGroup, L"TogglePauseMeasureGroup", 1 }, { Bang::UpdateMeasureGroup, L"UpdateMeasureGroup", 1 } }; diff --git a/Library/CommandHandler.h b/Library/CommandHandler.h index 72e467e7..2f8ce570 100644 --- a/Library/CommandHandler.h +++ b/Library/CommandHandler.h @@ -46,6 +46,9 @@ enum class Bang DisableMeasure, EnableMeasure, ToggleMeasure, + PauseMeasure, + UnpauseMeasure, + TogglePauseMeasure, UpdateMeasure, CommandMeasure, PluginBang, @@ -83,6 +86,9 @@ enum class Bang DisableMeasureGroup, EnableMeasureGroup, ToggleMeasureGroup, + PauseMeasureGroup, + UnpauseMeasureGroup, + TogglePauseMeasureGroup, UpdateMeasureGroup, DeactivateConfigGroup, ZPosGroup, diff --git a/Library/Measure.cpp b/Library/Measure.cpp index 027eba4f..53e41b4c 100644 --- a/Library/Measure.cpp +++ b/Library/Measure.cpp @@ -84,6 +84,7 @@ Measure::Measure(MeterWindow* meterWindow, const WCHAR* name) : Section(meterWin m_IfAboveCommitted(false), m_IfBelowCommitted(false), m_Disabled(false), + m_Paused(false), m_Initialized(false), m_OldValue(), m_ValueAssigned(false) @@ -435,6 +436,9 @@ std::wstring Measure::ExtractWord(std::wstring& buffer) bool Measure::Update() { + // Don't do anything if paused + if (m_Paused) return false; + if (!m_Disabled) { // Only update the counter if the divider diff --git a/Library/Measure.h b/Library/Measure.h index 3a2d8dbd..1ac06179 100644 --- a/Library/Measure.h +++ b/Library/Measure.h @@ -66,6 +66,10 @@ public: void Enable(); bool IsDisabled() { return m_Disabled; } + void Pause() { m_Paused = true; } + void Unpause() { m_Paused = false; } + bool IsPaused() { return m_Paused; } + virtual void Command(const std::wstring& command); double GetValue(); @@ -123,6 +127,7 @@ protected: bool m_IfAboveCommitted; // True when the IfAbove action is executed bool m_IfBelowCommitted; // True when the IfBelow action is executed bool m_Disabled; // Status of the measure + bool m_Paused; bool m_Initialized; std::wstring m_OnChangeAction; diff --git a/Library/MeterWindow.cpp b/Library/MeterWindow.cpp index 277fa45d..7c3f4eba 100644 --- a/Library/MeterWindow.cpp +++ b/Library/MeterWindow.cpp @@ -790,6 +790,18 @@ void MeterWindow::DoBang(Bang bang, const std::vector& args) DisableMeasure(args[0]); break; + case Bang::PauseMeasure: + PauseMeasure(args[0]); + break; + + case Bang::UnpauseMeasure: + UnpauseMeasure(args[0]); + break; + + case Bang::TogglePauseMeasure: + TogglePauseMeasure(args[0]); + break; + case Bang::UpdateMeasure: UpdateMeasure(args[0]); DialogAbout::UpdateMeasures(this); @@ -807,6 +819,18 @@ void MeterWindow::DoBang(Bang bang, const std::vector& args) EnableMeasure(args[0], true); break; + case Bang::PauseMeasureGroup: + PauseMeasure(args[0], true); + break; + + case Bang::UnpauseMeasureGroup: + UnpauseMeasure(args[0], true); + break; + + case Bang::TogglePauseMeasureGroup: + TogglePauseMeasure(args[0], true); + break; + case Bang::UpdateMeasureGroup: UpdateMeasure(args[0], true); DialogAbout::UpdateMeasures(this); @@ -1320,6 +1344,76 @@ void MeterWindow::ToggleMeasure(const std::wstring& name, bool group) if (!group) LogErrorF(this, L"!ToggleMeasure: [%s] not found", measure); } +/* +** Pauses the given measure +** +*/ +void MeterWindow::PauseMeasure(const std::wstring& name, bool group) +{ + const WCHAR* measure = name.c_str(); + + std::vector::const_iterator i = m_Measures.begin(); + for ( ; i != m_Measures.end(); ++i) + { + if (CompareName((*i), measure, group)) + { + (*i)->Pause(); + if (!group) return; + } + } + + if (!group) LogErrorF(this, L"!PauseMeasure: [%s] not found", measure); +} + +/* +** Unpauses the given measure +** +*/ +void MeterWindow::UnpauseMeasure(const std::wstring& name, bool group) +{ + const WCHAR* measure = name.c_str(); + + std::vector::const_iterator i = m_Measures.begin(); + for ( ; i != m_Measures.end(); ++i) + { + if (CompareName((*i), measure, group)) + { + (*i)->Unpause(); + if (!group) return; + } + } + + if (!group) LogErrorF(this, L"!UnpauseMeasure: [%s] not found", measure); +} + +/* +** Toggles the pause state of the given measure +** +*/ +void MeterWindow::TogglePauseMeasure(const std::wstring& name, bool group) +{ + const WCHAR* measure = name.c_str(); + + std::vector::const_iterator i = m_Measures.begin(); + for ( ; i != m_Measures.end(); ++i) + { + if (CompareName((*i), measure, group)) + { + if ((*i)->IsPaused()) + { + (*i)->Unpause(); + } + else + { + (*i)->Pause(); + } + if (!group) return; + } + } + + if (!group) LogErrorF(this, L"!TogglePauseMeasure: [%s] not found", measure); +} + /* ** Updates the given measure ** diff --git a/Library/MeterWindow.h b/Library/MeterWindow.h index 36144e88..c4f8d8b6 100644 --- a/Library/MeterWindow.h +++ b/Library/MeterWindow.h @@ -127,6 +127,9 @@ public: void DisableMeasure(const std::wstring& name, bool group = false); void EnableMeasure(const std::wstring& name, bool group = false); void ToggleMeasure(const std::wstring& name, bool group = false); + void PauseMeasure(const std::wstring& name, bool group = false); + void UnpauseMeasure(const std::wstring& name, bool group = false); + void TogglePauseMeasure(const std::wstring& name, bool group = false); void UpdateMeasure(const std::wstring& name, bool group = false); void Deactivate(); void Refresh(bool init, bool all = false);