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_ */
|