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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
//////////////////////////////////////////////////////////////////////////////
// polyester.h
// -------------------
// Polyester window decoration for KDE
// Copyright (c) 2005 Marco Martin <notmart@gmail.com>
// -------------------
// derived from Smooth Blend
// Copyright (c) 2005 Ryan Nickell <p0z3r@users.sourceforge.net>
// -------------------
// Shadow engine from Plastik decoration
// Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
// -------------------
//
// 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.
//////////////////////////////////////////////////////////////////////////////
#ifndef polyester_H
#define polyester_H
#include <qbutton.h>
#include <kdecoration.h>
#include <kdecorationfactory.h>
#define TITLEBAR_GLASS 1
#define BUTTON_GRADIENT 0
#define BUTTON_GLASS 1
#define BUTTON_REVGRADIENT 2
#define BUTTON_FLAT 3
class QSpacerItem;
class QPoint;
namespace polyester {
class polyesterClient;
enum ButtonType {
ButtonHelp=0,
ButtonMax,
ButtonMin,
ButtonClose,
ButtonMenu,
ButtonSticky,
ButtonAbove,
ButtonBelow,
ButtonShade,
ButtonTypeCount
};
// polyesterFactory /////////////////////////////////////////////////////////
//
// add variables and flags for config like...
//
// public: type function()
// private: type var_
// inline type function(){ return var_ };
//
class polyesterFactory: public KDecorationFactory {
public:
polyesterFactory();
virtual ~polyesterFactory();
virtual KDecoration *createDecoration(KDecorationBridge *b);
virtual bool reset(unsigned long changed);
static bool initialized();
static Qt::AlignmentFlags titleAlign();
static int contrast();
static bool roundedCorners();
static int titleSize();
static int buttonSize();
static bool squareButton();
static int frameSize();
static int roundSize();
static QFont titleFontTool() { return m_titleFontTool; }
static bool titleShadow();
static int titleBarStyle() { return titleBarStyle_;}
static int buttonStyle() { return buttonStyle_;}
static bool animateButtons() { return animatebuttons; }
static bool noModalButtons() { return nomodalbuttons; }
static bool lightBorder() { return lightBorder_; }
static int getBtnComboBox() { return btnComboBox; }
static bool menuClosed() { return menuClose; }
private:
bool readConfig();
private:
static bool initialized_;
static Qt::AlignmentFlags titlealign_;
static int contrast_;
static bool cornerflags_;
static int titlesize_;
static int buttonsize_;
static bool squareButton_;
static bool lightBorder_;
static int framesize_;
static int titleBarStyle_;
static int buttonStyle_;
static int roundsize_;
static QFont m_titleFontTool;
static bool titleshadow_;
static bool animatebuttons;
static bool nomodalbuttons;
static int btnComboBox;
static bool menuClose;
};
inline bool polyesterFactory::initialized() {
return initialized_;
}
inline Qt::AlignmentFlags polyesterFactory::titleAlign() {
return titlealign_;
}
inline int polyesterFactory::contrast(){
return contrast_;
}
inline bool polyesterFactory::roundedCorners() {
return cornerflags_;
}
inline int polyesterFactory::titleSize() {
return titlesize_;
};
inline int polyesterFactory::buttonSize() {
return buttonsize_;
};
inline bool polyesterFactory::squareButton() {
return squareButton_;
};
inline int polyesterFactory::frameSize() {
return framesize_;
};
inline int polyesterFactory::roundSize() {
return roundsize_;
};
inline bool polyesterFactory::titleShadow() {
return titleshadow_;
};
// polyesterButton //////////////////////////////////////////////////////////
class polyesterButton : public QButton {
Q_OBJECT
public:
polyesterButton(polyesterClient *parent=0, const char *name=0,
const QString &tip=NULL,
ButtonType type=ButtonHelp,
int button_size=18,
bool squareButton = true,
bool toggle=false);
//const unsigned char *bitmap=0);
~polyesterButton();
void setBitmap(const unsigned char *bitmap);
QSize sizeHint() const;
ButtonState lastMousePress() const;
void reset();
QImage getButtonImage(ButtonType type);
virtual void setOn(bool on);
virtual void setDown(bool on);
protected slots:
void animate();
void buttonClicked();
void buttonReleased();
private:
void enterEvent(QEvent *e);
void leaveEvent(QEvent *e);
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void drawButton(QPainter *painter);
void genButtonPix( bool active );
private:
polyesterClient *client_;
ButtonType type_;
int size_;
double buttonProportions_;
QBitmap *deco_;
QPixmap *pixmap[2][4];
QImage *buttonImgActive;
QImage *buttonImgInactive;
ButtonState lastmouse_;
bool buttonImgActive_created;
bool buttonImgInactive_created;
bool hover_;
bool m_clicked;
QTimer *animTmr;
uint animProgress;
};
inline Qt::ButtonState polyesterButton::lastMousePress() const {
return lastmouse_;
}
inline void polyesterButton::reset() {
repaint(false);
}
// polyesterClient //////////////////////////////////////////////////////////
class polyesterClient : public KDecoration {
Q_OBJECT
public:
polyesterClient(KDecorationBridge *b, KDecorationFactory *f);
virtual ~polyesterClient();
virtual void init();
virtual void activeChange();
virtual void desktopChange();
virtual void captionChange();
virtual void iconChange();
virtual void maximizeChange();
virtual void shadeChange();
virtual void borders(int &l, int &r, int &t, int &b) const;
virtual void resize(const QSize &size);
virtual QSize minimumSize() const;
virtual Position mousePosition(const QPoint &point) const;
QPixmap getTitleBarTile(bool active) const
{
return active ? *aTitleBarTile : *iTitleBarTile;
}
private:
void addButtons(QBoxLayout* layout, const QString& buttons, int buttonSize = 18);
bool eventFilter(QObject *obj, QEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);
void wheelEvent(QWheelEvent *e);
void paintEvent(QPaintEvent *e);
void resizeEvent(QResizeEvent *);
void showEvent(QShowEvent *);
void updateMask();
void _resetLayout();
int frameSize, titleSize, buttonSize;
bool roundedCorners;
QVBoxLayout *mainLayout_;
QHBoxLayout *titleLayout_;
QSpacerItem *topSpacer_,
*titleSpacer_,
*leftTitleSpacer_, *rightTitleSpacer_,
*decoSpacer_,
*leftSpacer_, *rightSpacer_,
*bottomSpacer_, *windowSpacer_;
QPixmap *aCaptionBuffer, *iCaptionBuffer;
private slots:
void maxButtonPressed();
void menuButtonPressed();
void menuButtonReleased();
void aboveButtonPressed();
void belowButtonPressed();
void shadeButtonPressed();
void keepAboveChange(bool);
void keepBelowChange(bool);
signals:
void keepAboveChanged(bool);
void keepBelowChanged(bool);
private:
QPixmap *aTitleBarTile, *iTitleBarTile, *aTitleBarTopTile, *iTitleBarTopTile;
polyesterButton *button[ButtonTypeCount];
QSpacerItem *titlebar_;
bool pixmaps_created;
bool closing;
int s_titleHeight;
QFont s_titleFont;
int handlebar;
bool maskDirty, aDoubleBufferDirty, iDoubleBufferDirty;
QPixmap activeBuff, inactiveBuff;
void create_pixmaps();
void delete_pixmaps();
};
} // namespace polyester
#endif // polyester_H
|