rainmeter-studio/Library/Meter.h

194 lines
6.5 KiB
C
Raw Normal View History

2009-02-10 18:37:48 +00:00
/*
Copyright (C) 2001 Kimmo Pekkola
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.
2009-02-10 18:37:48 +00:00
*/
#ifndef __METER_H__
#define __METER_H__
#include <windows.h>
#include <gdiplus.h>
#include <vector>
2011-02-15 16:26:54 +00:00
#include <string>
2009-02-10 18:37:48 +00:00
#include "Litestep.h"
2011-11-12 15:36:05 +00:00
#include "ConfigParser.h"
2009-02-10 18:37:48 +00:00
#include "MeterWindow.h"
#include "Group.h"
2009-02-10 18:37:48 +00:00
class CMeasure;
class CMeter : public CGroup
2009-02-10 18:37:48 +00:00
{
public:
2011-02-15 16:26:54 +00:00
CMeter(CMeterWindow* meterWindow, const WCHAR* name);
2009-02-10 18:37:48 +00:00
virtual ~CMeter();
2011-02-15 16:26:54 +00:00
void ReadConfig(CConfigParser& parser) { ReadConfig(parser, GetName()); parser.ClearStyleTemplate(); }
2009-02-10 18:37:48 +00:00
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; }
void SetDynamicVariables(bool b) { m_DynamicVariables = b; }
2009-02-10 18:37:48 +00:00
2010-10-19 22:03:32 +00:00
virtual int GetW() { return m_Hidden ? 0 : m_W; }
virtual int GetH() { return m_Hidden ? 0 : m_H; }
2009-02-10 18:37:48 +00:00
virtual int GetX(bool abs = false);
virtual int GetY(bool abs = false);
RECT GetMeterRect();
2009-02-10 18:37:48 +00:00
void SetW(int w) { m_W = w; }
void SetH(int h) { m_H = h; }
2010-10-19 22:03:32 +00:00
void SetX(int x) { m_X = x; m_RelativeX = POSITION_ABSOLUTE; }
void SetY(int y) { m_Y = y; m_RelativeY = POSITION_ABSOLUTE; }
const std::wstring& GetRightMouseDownAction() { return m_RightMouseDownAction; }
const std::wstring& GetRightMouseUpAction() { return m_RightMouseUpAction; }
const std::wstring& GetRightMouseDoubleClickAction() { return m_RightMouseDoubleClickAction; }
const std::wstring& GetLeftMouseDownAction() { return m_LeftMouseDownAction; }
const std::wstring& GetLeftMouseUpAction() { return m_LeftMouseUpAction; }
const std::wstring& GetLeftMouseDoubleClickAction() { return m_LeftMouseDoubleClickAction; }
const std::wstring& GetMiddleMouseDownAction() { return m_MiddleMouseDownAction; }
const std::wstring& GetMiddleMouseUpAction() { return m_MiddleMouseUpAction; }
const std::wstring& GetMiddleMouseDoubleClickAction() { return m_MiddleMouseDoubleClickAction; }
const std::wstring& GetMouseOverAction() { return m_MouseOverAction; }
const std::wstring& GetMouseLeaveAction() { return m_MouseLeaveAction; }
2010-10-19 22:03:32 +00:00
const std::wstring& GetToolTipText() { return m_ToolTipText; }
bool HasToolTip() { return m_ToolTipHandle != NULL; }
void CreateToolTip(CMeterWindow* meterWindow);
void UpdateToolTip();
2010-10-19 22:03:32 +00:00
bool HasMouseAction() { return m_HasMouseAction; }
bool HasMouseActionCursor() { return m_MouseActionCursor; }
2010-10-19 22:03:32 +00:00
virtual void Hide();
virtual void Show();
bool IsHidden() { return m_Hidden; }
2009-02-10 18:37:48 +00:00
2011-11-04 12:48:03 +00:00
const Gdiplus::Matrix* GetTransformationMatrix() { return m_Transformation; }
2009-02-10 18:37:48 +00:00
virtual bool HitTest(int x, int y);
void SetMouseOver(bool over) { m_MouseOver = over; }
bool IsMouseOver() { return m_MouseOver; }
2010-10-19 22:03:32 +00:00
const WCHAR* GetName() { return m_Name.c_str(); }
2011-11-18 22:40:58 +00:00
const std::wstring& GetOriginalName() { return m_Name; }
2009-02-10 18:37:48 +00:00
void ResetUpdateCounter() { m_UpdateCounter = m_UpdateDivider; }
int GetUpdateCounter() { return m_UpdateCounter; }
int GetUpdateDivider() { return m_UpdateDivider; }
CMeterWindow* GetMeterWindow() { return m_MeterWindow; }
2011-02-15 16:26:54 +00:00
static CMeter* Create(const WCHAR* meter, CMeterWindow* meterWindow, const WCHAR* name);
static void DrawBevel(Gdiplus::Graphics& graphics, const Gdiplus::Rect& rect, const Gdiplus::Pen& light, const Gdiplus::Pen& dark);
2009-02-10 18:37:48 +00:00
protected:
enum METER_ALIGNMENT
{
ALIGN_LEFT,
ALIGN_RIGHT,
ALIGN_CENTER
};
enum METER_POSITION
{
POSITION_ABSOLUTE,
POSITION_RELATIVE_TL,
POSITION_RELATIVE_BR
};
virtual void ReadConfig(CConfigParser& parser, const WCHAR* section);
void SetAllMeasures(CMeasure* measure);
void SetAllMeasures(const std::vector<CMeasure*>& measures);
void ReplaceToolTipMeasures(std::wstring& str);
static void ReadMeasureNames(CConfigParser& parser, const WCHAR* section, std::vector<std::wstring>& measureNames);
static bool ReplaceMeasures(const std::vector<std::wstring>& stringValues, std::wstring& str);
2011-02-15 16:26:54 +00:00
const std::wstring m_Name; // Name of the meter
2009-02-10 18:37:48 +00:00
std::wstring m_MeasureName; // Name of the measure this is bound to
CMeasure* m_Measure; // Pointer to the measure this meter is bound to
std::vector<CMeasure*> m_AllMeasures;
2009-02-10 18:37:48 +00:00
int m_X; // X-position of the meter
int m_Y; // Y-position of the meter
int m_W; // Width of the meter
int m_H; // Height of the meter
bool m_Hidden; // Status of the meter
2011-11-01 04:56:46 +00:00
bool m_WDefined;
bool m_HDefined;
2009-02-10 18:37:48 +00:00
CMeter* m_RelativeMeter;
bool m_DynamicVariables; // If true, the measure contains dynamic variables
2009-02-10 18:37:48 +00:00
2011-11-04 12:48:03 +00:00
Gdiplus::Matrix* m_Transformation; // The transformation matrix
std::wstring m_StyleX;
std::wstring m_StyleY;
std::wstring m_StyleHidden;
std::wstring m_ToolTipText;
std::wstring m_ToolTipTitle;
std::wstring m_ToolTipIcon;
unsigned int m_ToolTipWidth;
unsigned int m_ToolTipDelay;
bool m_ToolTipType;
bool m_ToolTipHidden;
HWND m_ToolTipHandle;
2011-11-18 22:40:58 +00:00
std::wstring m_LeftMouseDownAction; // Actions for left/right/middle mouse buttons
std::wstring m_RightMouseDownAction;
std::wstring m_MiddleMouseDownAction;
2011-11-18 22:40:58 +00:00
std::wstring m_LeftMouseUpAction;
std::wstring m_RightMouseUpAction;
std::wstring m_MiddleMouseUpAction;
2011-11-18 22:40:58 +00:00
std::wstring m_LeftMouseDoubleClickAction;
std::wstring m_RightMouseDoubleClickAction;
* Changed the way to get the information of the multiple display monitors. This change brings the order of monitors close to the order of "Display Properties" due to using EnumDisplayDevices and EnumDisplaySettings instead of EnumDisplayMonitors. (If EnumDisplayDevices failed, EnumDisplayMonitors is used as before.) ----- * Added the "Display Monitor" submenu in [Skins Menu]-[Position]. These menus convert the present position to the relative position from the specified monitor. (But the meter window doesn't move to the specified monitor area immediately. Only converts.) - "Use default: Primary monitor" removes the @-directive from WindowX/Y. - @0(@1, @2, ...) adds the specified monitor number to WindowX/Y. @0 means "The Virtual Screen". (http://msdn.microsoft.com/en-us/library/dd145136%28VS.85%29.aspx) - If "Auto-select based on window position" is checked, the WindowX and WindowY "@n" settings are made automatically based on the position of the meter's window. If a monitor is selected directly using "Display Monitor" in the Rainmeter / skin context menu, this menu is unchecked. This setting can be manually made in either the [Rainmeter] (all configs) or individual config sections of Rainmeter.ini. AutoSelectScreen If set to 1, the WindowX and WindowY "@n" settings are made automatically based on the position of the meter's window. If a monitor is selected directly using "Display Monitor" in the Rainmeter / skin context menu, this setting is reset to 0. ----- * Added the variables for multiple display monitors and the virtual screen. All X/Y positions are represented in the virtual screen coordinates. The following variables are for the virtual screen. #VSCREENAREAX# is the X-position of the left-side of the virtual screen. #VSCREENAREAY# is the Y-position of the top-side of the virtual screen. #VSCREENAREAWIDTH# is the width of the virtual screen. #VSCREENAREAHEIGHT# is the height of the virtual screen. The following variables are for the PRESENT monitor. Note that these variables automatically change by the WindowX and WindowY "@n" settings. If "@n" is not set, these variables return the value of the primary monitor. #WORKAREAX# is the X-position of the left-side of the work area. #WORKAREAY# is the Y-position of the top-side of the work area. #WORKAREAWIDTH# is the width of the work area. #WORKAREAHEIGHT# is the height of the work area. #SCREENAREAX# is the X-position of the left-side of the monitor screen. #SCREENAREAY# is the Y-position of the top-side of the monitor screen. #SCREENAREAWIDTH# is the width of the display resolution. #SCREENAREAHEIGHT# is the height of the display resolution. The following variables are for the PRIMARY monitor. #PWORKAREAX# is the X-position of the left-side of the work area. #PWORKAREAY# is the Y-position of the top-side of the work area. #PWORKAREAWIDTH# is the width of the work area. #PWORKAREAHEIGHT# is the height of the work area. #PSCREENAREAX# is the X-position of the left-side of the monitor screen. (maybe, always 0) #PSCREENAREAY# is the Y-position of the top-side of the monitor screen. (maybe, always 0) #PSCREENAREAWIDTH# is the width of the display resolution. #PSCREENAREAHEIGHT# is the height of the display resolution. The following variables are for the SPECIFIED monitor. (@n = @1, @2, ...) #WORKAREAX@n# is the X-position of the left-side of the work area. #WORKAREAY@n# is the Y-position of the top-side of the work area. #WORKAREAWIDTH@n# is the width of the work area. #WORKAREAHEIGHT@n# is the height of the work area. #SCREENAREAX@n# is the X-position of the left-side of the monitor screen. #SCREENAREAY@n# is the Y-position of the top-side of the monitor screen. #SCREENAREAWIDTH@n# is the width of the display resolution. #SCREENAREAHEIGHT@n# is the height of the display resolution. ----- * Other related changes: - Fixed the problem that the primary monitor isn't recognized correctly. - Fixed the problem that the information of the multiple display monitors is refreshed excessively. - For DynamicVariables, when display setting or workarea size has been changed, all variables are now updated to apply changed WORKAREA/SCREENAREA variables. - Fixed the problem that the "On Desktop" window isn't dragged correctly when the top-left corner of the virtual screen has negative coordinates. - Changed the way to stick the "On Desktop" window. ("SysListView32/FolderView" is used instead of "Progman/Program Manager".) ----- * Other changes: - When the meter window is draggable and isn't dragged, LeftMouseUpAction is now executed. - Added MouseDoubleClickAction (LeftMouseDoubleClickAction, RightMouseDoubleClickAction, MiddleMouseDoubleClickAction). If MouseDoubleClickAction is empty when mouse button is double-clicked, MouseDownAction is executed instead. - Fixed the problem that the Meter's hit-test code checks outside the area. - Changed the way to set the #CURRENTCONFIG#. (CMeterWindow::GetSkinName() is now used instead of parsing the path.)
2009-12-18 05:58:37 +00:00
std::wstring m_MiddleMouseDoubleClickAction;
2009-02-10 18:37:48 +00:00
std::wstring m_MouseOverAction;
std::wstring m_MouseLeaveAction;
bool m_HasMouseAction;
bool m_MouseActionCursor;
2009-02-10 18:37:48 +00:00
bool m_MouseOver;
METER_POSITION m_RelativeX;
METER_POSITION m_RelativeY;
int m_UpdateDivider; // Divider for the update
int m_UpdateCounter; // Current update counter
2009-02-10 18:37:48 +00:00
BEVELTYPE m_SolidBevel;
Gdiplus::Color m_SolidColor;
Gdiplus::Color m_SolidColor2;
Gdiplus::REAL m_SolidAngle;
bool m_AntiAlias; // If true, the line is antialiased
bool m_Initialized;
2009-02-10 18:37:48 +00:00
CMeterWindow* m_MeterWindow;
};
#endif