summaryrefslogtreecommitdiff
path: root/plugins/Clist_ng/INCLUDE/skin.h
blob: 0c8d13e2aa76d788c86eca33af534eb3a1a26e81 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/*
 * astyle --force-indent=tab=4 --brackets=linux --indent-switches
 *		  --pad=oper --one-line=keep-blocks  --unpad=paren
 *
 * Miranda IM: the free IM client for Microsoft* Windows*
 *
 * Copyright 2000-2010 Miranda ICQ/IM project,
 * all portions of this codebase are copyrighted to the people
 * listed in contributors.txt.
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 * part of clist_ng plugin for Miranda.
 *
 * (C) 2005-2015 by silvercircle _at_ gmail _dot_ com and contributors
 *
 * clist_ng skin helper classes and functions. No low level Gfx here, just
 * managing the skin data structures...
 *
 * drawing is mostly in Gfx
 *
 * TODO implement settings override system. Allow user to save modified
 * skin settings to a separate override file and use these modified settings
 * when loading the skin.
 *
 * TODO implement logic to determine whether a skin has changed to optimize
 * loading performance (e.g. no need to import fonts and color settings when
 *
 * TODO implement replacement for the old clist_nicer style "per contact" skin
 * items. Allow colorization of contact rows on a per user base. The settings
 * could be added to the "Contact list settings" dialog.
 */

#ifndef __SKIN_H_
#define __SKIN_H_

#define ID_EXTBKOFFLINE			0
#define ID_EXTBKONLINE			1
#define ID_EXTBKAWAY			2
#define ID_EXTBKDND				3
#define ID_EXTBKNA				4
#define ID_EXTBKOCCUPIED		5
#define ID_EXTBKFREECHAT		6
#define ID_EXTBKINVISIBLE		7
#define ID_EXTBKONTHEPHONE		8
#define ID_EXTBKOUTTOLUNCH		9

#define ID_EXTBKIDLE            10
#define ID_EXTBKEXPANDEDGROUP   11
#define ID_EXTBKCOLLAPSEDDGROUP 12
#define ID_EXTBKEMPTYGROUPS     13
#define ID_EXTBKFIRSTITEM       14
#define ID_EXTBKSINGLEITEM      15
#define ID_EXTBKLASTITEM        16


#define ID_EXTBKFIRSTITEM_NG    17
#define ID_EXTBKSINGLEITEM_NG   18
#define ID_EXTBKLASTITEM_NG     19

#define ID_EXTBKEVEN_CNTCTPOS   20
#define ID_EXTBKODD_CNTCTPOS    21

#define ID_EXTBKSELECTION       22
#define ID_EXTBKHOTTRACK        23
#define ID_EXTBKFRAMETITLE      24
#define ID_EXTBKEVTAREA         25
#define ID_EXTBKSTATUSBAR       26
#define ID_EXTBKBUTTONSPRESSED  27
#define ID_EXTBKBUTTONSNPRESSED 28
#define ID_EXTBKBUTTONSMOUSEOVER 	29
#define ID_EXTBKSTATUSFLOATER	    30
#define ID_EXTBKOWNEDFRAMEBORDER    31
#define ID_EXTBKOWNEDFRAMEBORDERTB  32
#define ID_EXTBKAVATARFRAME         33
#define ID_EXTBKAVATARFRAMEOFFLINE  34
#define ID_EXTBK_LAST_D             34

#define ID_EXTBKSEPARATOR           40200

void extbk_import(char *file, HWND hwndDlg);
TStatusItem *GetProtocolStatusItem(const char *szProto);
void SaveNonStatusItemsSettings(HWND hwndDlg);

#define SKIN_DB_MODULE "CLNgSkin"					// database module for clng skinning

/*
 * flags for status item rendering
 */
#define AGG_USE_SOLID_RENDERER 1				// item has no gradient -> use a faster solid renderer
#define AGG_USE_GRADIENT_X_RENDERER 2			// item has horizontal gradient -> use agg::gradient_x function
#define AGG_USE_GRADIENT_Y_RENDERER 4			// item has vertical gradient -> use agg::gradient_y function
#define S_ITEM_SKIP_UNDERLAY 8					// skip all gradient underlays and render the image item only
#define S_ITEM_TEXT_AERO_GLOW 16				// render text with aero glow instead of solid color
#define S_ITEM_IMAGE_ONLY	  32				// this item cannot be used with gradients (only for image skinning)
#define S_ITEM_SKIP_IMAGE 64					// skip all gradient underlays and render the image item only

/*
 * this structure describes all relevant settings that are needed
 * for a skin except the skin items themselves. Usually, they are loaded
 * from the skin definition (.cng), but the user can override them.
 * Most of these settings are available on the option pages.
 *
 * These settings are copied to the database under ClNGSkin and have a m prefix.
 * (e.g. cLeftFramed member name = "mLeftFramed" in the db.
 */
struct TSkinMetrics {
	BYTE		cLeft, cTop, cRight, cBottom;								// these are the currently _effective_ values and are calculated
																			// from the other margins, never saved anywhere, only exist at runtime
	BYTE		cLeftFramed, cTopFramed, cRightFramed, cBottomFramed;		// margins when using a window frame
	BYTE		cLeftSkinned, cTopSkinned, cRightSkinned, cBottomSkinned;	// margins when using a window skin
	BYTE		cLeftButtonset, cTopButtonset, cRightButtonset, cBottomButtonset;	// additional margins for the button sets
	BYTE		bWindowStyle;												// border style (none, toolbar or normal title bar
	BYTE		cButtonHeight;												// height of the bottom buttons
	BYTE		bSBarHeight;												// status bar height adjustment (for skinned mode only)
	DWORD		dwTopOffset, dwBottomOffset;								// cTop + additional paddings (rare)
	BYTE		cFakeCaption;												// for frameless skin mode - artificial caption bar height, will be added to top aligned buttons
																			// which do not have the title bar attribute
	BYTE		cFakeLeftBorder;
	BYTE		cFakeRightBorder;
	BYTE		cFakeBtmBorder;
	bool		fHaveFrame;													// quick boolean, true if clist window has a frame
	bool		fHaveAeroSkin;												// true if using the background skin in aero mode
	bool		fHaveColorkey;												// true if using a background skin in non-aero mode and
																			// we need a colorkey to get transparent areas
	DWORD		cCornerRadius;												// corner radius used for gradient items
};

/*
 * settings for a skin (everything else with the exception of geometry information
 *
 * Database module: ClNGSkin and values have a s prefix.
 * e.gl member crColorKey = sColorKey in the db.
 */
struct TSkinSettings {
	COLORREF	crColorKey;													// the colorkey for LWA_COLORKEY
	bool		fTransparentFrames;											// make owned frames transparent
	COLORREF	crFramesColorKey;											// background color which should be made transparent in frames
	BYTE		bFramesAlpha;												// constant alpha for translucent frames
	bool		fUseAero;													// may be used to disable aero regardless of operating system state
	bool		fHaveAeroBG;												// we have a valid background item for aero mode
	wchar_t		wszSkinBaseFolder[MAX_PATH];								// internal use only - base directory of the currently loaded skin
	wchar_t		wszSkinName[MAX_PATH];										// internal use only - base name of the skin (the .cng file without extension)
};
/*
 * the Skin class has helper functions to manage skin items and stores the
 * items (image items, button items and status items
 */
class Skin
{
public:
	static void				Unload								();
	static void 			freeImageItem						(TImageItem *item);
	static void 			exportToFile						(const char *file);
	static void 			exportSettingsToFile				(const char *file);

	static void 			renderNamedImageItem				(const char *szItemname, RECT* rc, const HDC hdc);
	static void 			colorizeGlyphByName					(const char* szGlyphName, const COLORREF clr, float h, float s, float v);
	static void				Activate							();
	static void				setAeroMargins						();
	static void				updateAeroState						();
	static void				setupAGGItemContext					(TStatusItem* item);

	static int 				ID_EXTBK_LAST;
	static TStatusItem*		statusItems;
	static TImageItem*		imageItems;
	static TImageItem*		glyphItem;

	static TSkinMetrics		metrics;
	static TSkinSettings	settings;
};

/*
 * the skin loader class is a helper for reading and writing skin definition files
 */
class SkinLoader
{
public:
	SkinLoader(const wchar_t* wszFilename);
	~SkinLoader() {};

public:
	bool							isValid						() const { return(m_isValid); }
	HRESULT 						Load						();
	DWORD 							readInt						(const char* szSection, const char* szValue, DWORD dwDefault = 0);
	HRESULT 						loadItems					();
	void 							readButtonItem				(const char *itemName, const char *file);
	void 							readImageItem				(const char *itemname, const char *szFileName);
	void 							createImageItem				(TImageItem *item, const char *fileName, HDC hdc);
	void 							loadFonts					();
	void 							loadBaseItems				();
	void 							readItem					(TStatusItem *this_item, const char *szItem);

	static UINT 					nextButtonID;

private:
	bool							m_isValid;
	char							m_szFilename[MAX_PATH];
	wchar_t							m_wszFilename[MAX_PATH];
};

#endif /* __SKIN_H_ */