Adding JamesAC's new ToolTips functionality.

Minor fix to the Rainmeter installer
Minor changes to RainBrowser and RainThemes
This commit is contained in:
jsmorley 2010-07-17 00:06:24 +00:00
parent a52758f9d2
commit ff153f3f86
6 changed files with 207 additions and 5 deletions

View File

@ -28,8 +28,8 @@ LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,3,0,466 FILEVERSION 1,3,0,467
PRODUCTVERSION 1,3,0,466 PRODUCTVERSION 1,3,0,467
FILEFLAGSMASK 0x17L FILEFLAGSMASK 0x17L
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -45,12 +45,12 @@ BEGIN
BLOCK "040b04b0" BLOCK "040b04b0"
BEGIN BEGIN
VALUE "FileDescription", "Rainmeter - A Customizable Resource Meter" VALUE "FileDescription", "Rainmeter - A Customizable Resource Meter"
VALUE "FileVersion", "1, 3, 0, 466" VALUE "FileVersion", "1, 3, 0, 467"
VALUE "InternalName", "Rainmeter" VALUE "InternalName", "Rainmeter"
VALUE "LegalCopyright", "Copyright (C) 2010 - Rainy" VALUE "LegalCopyright", "Copyright (C) 2010 - Rainy"
VALUE "OriginalFilename", "Rainmeter.exe" VALUE "OriginalFilename", "Rainmeter.exe"
VALUE "ProductName", "Rainmeter" VALUE "ProductName", "Rainmeter"
VALUE "ProductVersion", "1, 3, 0, 466" VALUE "ProductVersion", "1, 3, 0, 467"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -184,6 +184,24 @@ int CMeter::GetY(bool abs)
return m_Y; return m_Y;
} }
/*
** GetMeterRect
**
** Returns a RECT containing the dimensions of the meter within the MeterWindow
**
*/
RECT CMeter::GetMeterRect()
{
RECT meterRect;
meterRect.left = GetX();
meterRect.top = GetY();
meterRect.right = GetX() + m_W;
meterRect.bottom = GetY() + m_H;
return meterRect;
}
/* /*
** HitTest ** HitTest
** **
@ -340,6 +358,11 @@ void CMeter::ReadConfig(const WCHAR* section)
|| !m_MiddleMouseUpAction.empty() || !m_MiddleMouseDownAction.empty() || !m_MiddleMouseDoubleClickAction.empty() || !m_MiddleMouseUpAction.empty() || !m_MiddleMouseDownAction.empty() || !m_MiddleMouseDoubleClickAction.empty()
|| !m_RightMouseUpAction.empty() || !m_RightMouseDownAction.empty() || !m_RightMouseDoubleClickAction.empty() ); || !m_RightMouseUpAction.empty() || !m_RightMouseDownAction.empty() || !m_RightMouseDoubleClickAction.empty() );
m_ToolTipText = parser.ReadString(section, L"ToolTipText", L"", true);
m_ToolTipTitle = parser.ReadString(section, L"ToolTipTitle", L"", true);
m_ToolTipIcon = parser.ReadString(section, L"ToolTipIcon", L"", true);
m_ToolTipType = 0!=parser.ReadInt(section, L"ToolTipType", 0);
m_MeasureName = parser.ReadString(section, L"MeasureName", L""); m_MeasureName = parser.ReadString(section, L"MeasureName", L"");
m_UpdateDivider = parser.ReadInt(section, L"UpdateDivider", 1); m_UpdateDivider = parser.ReadInt(section, L"UpdateDivider", 1);
@ -466,6 +489,149 @@ bool CMeter::Update()
return true; return true;
} }
/*
** CreateToolTip
**
** Does the initial construction of the ToolTip for the meter
*/
void CMeter::CreateToolTip(CMeterWindow* meterWindow)
{
HWND hwndTT;
if(!m_ToolTipType)
{
hwndTT = CreateWindowEx(WS_EX_TOPMOST,
TOOLTIPS_CLASS,
NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
m_MeterWindow->GetWindow(),
NULL,
m_MeterWindow->GetMainObject()->GetInstance(),
NULL);
}
else
{
hwndTT = CreateWindowEx(WS_EX_TOPMOST,
TOOLTIPS_CLASS,
NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | TTS_BALLOON,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
m_MeterWindow->GetWindow(),
NULL,
m_MeterWindow->GetMainObject()->GetInstance(),
NULL);
}
SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
TOOLINFO ti = { 0 };
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_SUBCLASS;
ti.hwnd = m_MeterWindow->GetWindow();
ti.hinst = m_MeterWindow->GetMainObject()->GetInstance();
ti.lpszText = (PTSTR) m_ToolTipText.c_str();
ti.rect = GetMeterRect();
SendMessage(hwndTT, TTM_ADDTOOL, NULL, (LPARAM) (LPTOOLINFO) &ti);
if (!m_ToolTipTitle.empty())
{
HICON hIcon = NULL;
if (!m_ToolTipIcon.empty())
{
if (!_wcsicmp(m_ToolTipIcon.c_str(), L"INFO"))
{
hIcon = (HICON) TTI_INFO;
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"WARNING"))
{
hIcon = (HICON) TTI_WARNING;
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"ERROR"))
{
hIcon = (HICON) TTI_ERROR;
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"QUESTION"))
{
hIcon = LoadIcon(NULL, IDI_QUESTION);
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"SHIELD"))
{
hIcon = LoadIcon(NULL, IDI_SHIELD);
}
else
{
hIcon = (HICON) LoadImage(NULL, m_ToolTipIcon.c_str(), IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
}
}
SendMessage(hwndTT, TTM_SETTITLE, (WPARAM) hIcon, (LPARAM) m_ToolTipTitle.c_str());
DestroyIcon(hIcon);
}
m_ToolTipHandle = hwndTT;
}
/*
** UpdateToolTip
**
** Updates the ToolTip to match new values
*/
void CMeter::UpdateToolTip()
{
HWND hwndTT = m_ToolTipHandle;
TOOLINFO ti = { 0 };
ti.cbSize = sizeof(TOOLINFO);
ti.hwnd = m_MeterWindow->GetWindow();
SendMessage(hwndTT, TTM_GETTOOLINFO, NULL, (LPARAM) (LPTOOLINFO) &ti);
ti.lpszText = (PTSTR) m_ToolTipText.c_str();
ti.rect = GetMeterRect();
SendMessage(hwndTT, TTM_SETTOOLINFO, NULL, (LPARAM) (LPTOOLINFO) &ti);
if (!m_ToolTipTitle.empty())
{
HICON hIcon = NULL;
if (!m_ToolTipIcon.empty())
{
if (!_wcsicmp(m_ToolTipIcon.c_str(), L"INFO"))
{
hIcon = (HICON) TTI_INFO;
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"WARNING"))
{
hIcon = (HICON) TTI_WARNING;
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"ERROR"))
{
hIcon = (HICON) TTI_ERROR;
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"QUESTION"))
{
hIcon = LoadIcon(NULL, IDI_QUESTION);
}
else if (!_wcsicmp(m_ToolTipIcon.c_str(), L"SHIELD"))
{
hIcon = LoadIcon(NULL, IDI_SHIELD);
}
else
{
hIcon = (HICON) LoadImage(NULL, m_ToolTipIcon.c_str(), IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
}
}
SendMessage(hwndTT, TTM_SETTITLE, (WPARAM) hIcon, (LPARAM) m_ToolTipTitle.c_str());
DestroyIcon(hIcon);
}
}
/* /*
** Draw ** Draw
** **

View File

@ -47,6 +47,7 @@ public:
virtual int GetW() { return m_Hidden ? 0 : m_W; }; virtual int GetW() { return m_Hidden ? 0 : m_W; };
virtual int GetX(bool abs = false); virtual int GetX(bool abs = false);
virtual int GetY(bool abs = false); virtual int GetY(bool abs = false);
RECT GetMeterRect();
void SetX(int x) { m_X = x; m_RelativeX = POSITION_ABSOLUTE; }; void SetX(int x) { m_X = x; m_RelativeX = POSITION_ABSOLUTE; };
void SetY(int y) { m_Y = y; m_RelativeY = POSITION_ABSOLUTE; }; void SetY(int y) { m_Y = y; m_RelativeY = POSITION_ABSOLUTE; };
@ -63,6 +64,13 @@ public:
std::wstring& GetMouseOverAction() { return m_MouseOverAction; }; std::wstring& GetMouseOverAction() { return m_MouseOverAction; };
std::wstring& GetMouseLeaveAction() { return m_MouseLeaveAction; }; std::wstring& GetMouseLeaveAction() { return m_MouseLeaveAction; };
std::wstring& GetToolTipText() { return m_ToolTipText; };
HWND GetToolTipHandle() { return m_ToolTipHandle; };
void SetToolTipHandle(HWND handle) { m_ToolTipHandle = handle; };
void CreateToolTip(CMeterWindow* meterWindow);
void UpdateToolTip();
bool HasMouseAction() { return m_HasMouseAction; }; bool HasMouseAction() { return m_HasMouseAction; };
bool HasMouseActionCursor() { return m_MouseActionCursor; }; bool HasMouseActionCursor() { return m_MouseActionCursor; };
void SetMouseActionCursor(bool b) { m_MouseActionCursor = b; }; void SetMouseActionCursor(bool b) { m_MouseActionCursor = b; };
@ -113,6 +121,13 @@ protected:
CMeter* m_RelativeMeter; CMeter* m_RelativeMeter;
bool m_DynamicVariables; // If true, the measure contains dynamic variables bool m_DynamicVariables; // If true, the measure contains dynamic variables
std::wstring m_ToolTipText;
std::wstring m_ToolTipTitle;
std::wstring m_ToolTipIcon;
bool m_ToolTipType;
HWND m_ToolTipHandle;
std::wstring m_RightMouseDownAction; // Actions for left and right and middle mouse buttons std::wstring m_RightMouseDownAction; // Actions for left and right and middle mouse buttons
std::wstring m_RightMouseUpAction; std::wstring m_RightMouseUpAction;
std::wstring m_RightMouseDoubleClickAction; std::wstring m_RightMouseDoubleClickAction;

View File

@ -333,6 +333,11 @@ void CMeterWindow::Refresh(bool init, bool all)
std::list<CMeter*>::iterator j = m_Meters.begin(); std::list<CMeter*>::iterator j = m_Meters.begin();
for( ; j != m_Meters.end(); ++j) for( ; j != m_Meters.end(); ++j)
{ {
if ((*j)->GetToolTipHandle() != NULL)
{
DestroyWindow((*j)->GetToolTipHandle());
(*j)->SetToolTipHandle(NULL);
}
delete (*j); delete (*j);
} }
m_Meters.clear(); m_Meters.clear();
@ -1840,6 +1845,11 @@ void CMeterWindow::ReadSkin()
} }
meter->ReadConfig(strSection.c_str()); meter->ReadConfig(strSection.c_str());
if (!meter->GetToolTipText().empty())
{
meter->CreateToolTip(this);
}
} }
} }
catch (CError& error) catch (CError& error)
@ -2320,6 +2330,15 @@ void CMeterWindow::Update(bool nodraw)
Redraw(); Redraw();
} }
j = m_Meters.begin();
for ( ; j != m_Meters.end(); ++j)
{
if ((*j)->GetToolTipHandle() != NULL)
{
(*j)->UpdateToolTip();
}
}
// Check for transitions and start the timer if necessary // Check for transitions and start the timer if necessary
bool bActiveTransition = false; bool bActiveTransition = false;
j = m_Meters.begin(); j = m_Meters.begin();

View File

@ -129,6 +129,8 @@ public:
int Initialize(CRainmeter& Rainmeter); int Initialize(CRainmeter& Rainmeter);
CRainmeter* GetMainObject() { return m_Rainmeter; };
void RunBang(BANGCOMMAND bang, const WCHAR* arg); void RunBang(BANGCOMMAND bang, const WCHAR* arg);
void MoveMeter(int x, int y, const WCHAR* name); void MoveMeter(int x, int y, const WCHAR* name);

View File

@ -1,2 +1,2 @@
#pragma once #pragma once
const int revision_number = 466; const int revision_number = 467;