From 8ea3c6780ae4ba24eb519b1a5f0df273560e1038 Mon Sep 17 00:00:00 2001 From: jsmorley Date: Mon, 7 Sep 2009 20:00:50 +0000 Subject: [PATCH] Additional code changes by spx268 to address issues with other image meter types (MeterBar, MeterBitmap, MeterButton, MeterRotator) and dynamic variables. http://code.google.com/p/rainmeter/issues/detail?id=108 --- Library/MeterBar.cpp | 13 +++++++++++++ Library/MeterBitmap.cpp | 13 +++++++++++++ Library/MeterButton.cpp | 32 ++++++++++++++++++++++++++++++++ Library/MeterRotator.cpp | 13 +++++++++++++ 4 files changed, 71 insertions(+) diff --git a/Library/MeterBar.cpp b/Library/MeterBar.cpp index fbf34015..2a93b822 100644 --- a/Library/MeterBar.cpp +++ b/Library/MeterBar.cpp @@ -69,10 +69,14 @@ void CMeterBar::Initialize() // Load the bitmaps if defined if(!m_ImageName.empty()) { + if (m_Bitmap != NULL) delete m_Bitmap; m_Bitmap = new Bitmap(m_ImageName.c_str()); Status status = m_Bitmap->GetLastStatus(); if(Ok != status) { + delete m_Bitmap; + m_Bitmap = NULL; + throw CError(std::wstring(L"Bitmap image not found: ") + m_ImageName, __LINE__, __FILE__); } @@ -89,6 +93,9 @@ void CMeterBar::Initialize() */ void CMeterBar::ReadConfig(const WCHAR* section) { + // Store the current values so we know if the image needs to be updated + std::wstring oldImageName = m_ImageName; + // Read common configs CMeter::ReadConfig(section); @@ -118,6 +125,12 @@ void CMeterBar::ReadConfig(const WCHAR* section) { throw CError(std::wstring(L"No such BarOrientation: ") + orientation, __LINE__, __FILE__); } + + if (m_Initialized && + oldImageName != m_ImageName) + { + Initialize(); // Reload the image + } } /* diff --git a/Library/MeterBitmap.cpp b/Library/MeterBitmap.cpp index d7b13137..8de433f6 100644 --- a/Library/MeterBitmap.cpp +++ b/Library/MeterBitmap.cpp @@ -72,10 +72,14 @@ void CMeterBitmap::Initialize() // Load the bitmaps if defined if(!m_ImageName.empty()) { + if (m_Bitmap != NULL) delete m_Bitmap; m_Bitmap = new Bitmap(m_ImageName.c_str()); Status status = m_Bitmap->GetLastStatus(); if(Ok != status) { + delete m_Bitmap; + m_Bitmap = NULL; + throw CError(std::wstring(L"Bitmap image not found: ") + m_ImageName, __LINE__, __FILE__); } @@ -163,6 +167,9 @@ bool CMeterBitmap::HitTest(int x, int y) */ void CMeterBitmap::ReadConfig(const WCHAR* section) { + // Store the current values so we know if the image needs to be updated + std::wstring oldImageName = m_ImageName; + // Read common configs CMeter::ReadConfig(section); @@ -199,6 +206,12 @@ void CMeterBitmap::ReadConfig(const WCHAR* section) { throw CError(std::wstring(L"No such BitmapAlign: ") + align, __LINE__, __FILE__); } + + if (m_Initialized && + oldImageName != m_ImageName) + { + Initialize(); // Reload the image + } } /* diff --git a/Library/MeterButton.cpp b/Library/MeterButton.cpp index 709c01fd..22e396e7 100644 --- a/Library/MeterButton.cpp +++ b/Library/MeterButton.cpp @@ -81,10 +81,23 @@ void CMeterButton::Initialize() // Load the bitmaps if defined if(!m_ImageName.empty()) { + for (int i = 0; i < BUTTON_FRAMES; ++i) + { + if (m_Bitmaps[i] != NULL) + { + delete m_Bitmaps[i]; + m_Bitmaps[i] = NULL; + } + } + if (m_Bitmap != NULL) delete m_Bitmap; + m_Bitmap = new Bitmap(m_ImageName.c_str()); Status status = m_Bitmap->GetLastStatus(); if(Ok != status) { + delete m_Bitmap; + m_Bitmap = NULL; + throw CError(std::wstring(L"Bitmap image not found: ") + m_ImageName, __LINE__, __FILE__); } @@ -130,6 +143,11 @@ void CMeterButton::Initialize() */ void CMeterButton::ReadConfig(const WCHAR* section) { + // Store the current values so we know if the image needs to be updated + std::wstring oldImageName = m_ImageName; + int oldW = m_W; + int oldH = m_H; + // Read common configs CMeter::ReadConfig(section); @@ -139,6 +157,20 @@ void CMeterButton::ReadConfig(const WCHAR* section) m_ImageName = m_MeterWindow->MakePathAbsolute(m_ImageName); m_Command = parser.ReadString(section, L"ButtonCommand", L""); + + if (m_Initialized) + { + if (oldImageName != m_ImageName) + { + Initialize(); // Reload the image + } + else + { + // Reset to old dimensions + m_W = oldW; + m_H = oldH; + } + } } /* diff --git a/Library/MeterRotator.cpp b/Library/MeterRotator.cpp index ee3dff2d..792a9285 100644 --- a/Library/MeterRotator.cpp +++ b/Library/MeterRotator.cpp @@ -65,10 +65,14 @@ void CMeterRotator::Initialize() // Load the bitmaps if defined if(!m_ImageName.empty()) { + if (m_Bitmap != NULL) delete m_Bitmap; m_Bitmap = new Bitmap(m_ImageName.c_str()); Status status = m_Bitmap->GetLastStatus(); if(Ok != status) { + delete m_Bitmap; + m_Bitmap = NULL; + throw CError(std::wstring(L"Bitmap image not found: ") + m_ImageName, __LINE__, __FILE__); } } @@ -82,6 +86,9 @@ void CMeterRotator::Initialize() */ void CMeterRotator::ReadConfig(const WCHAR* section) { + // Store the current values so we know if the image needs to be updated + std::wstring oldImageName = m_ImageName; + // Read common configs CMeter::ReadConfig(section); @@ -97,6 +104,12 @@ void CMeterRotator::ReadConfig(const WCHAR* section) m_ValueRemainder = parser.ReadInt(section, L"ValueReminder", 0); // Typo m_ValueRemainder = parser.ReadInt(section, L"ValueRemainder", m_ValueRemainder); + + if (m_Initialized && + oldImageName != m_ImageName) + { + Initialize(); // Reload the image + } } /*