kwin/clients/kde/Static.cpp

325 lines
9 KiB
C++
Raw Normal View History

/*
Default KWin client
Copyright 2000
Rik Hemsley <rik@kde.org>
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; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include <qimage.h>
#include <qpixmap.h>
#include <qpainter.h>
#include <kpixmapeffect.h>
#include "../../options.h"
#include "Static.h"
namespace Default
{
static void drawButtonFrame(KPixmap & pix, const QColorGroup &g, bool sunken)
{
QPainter p;
int w = pix.width();
int h = pix.height();
p.begin(&pix);
p.setPen(g.dark());
p.drawLine(0, 0, w-1, 0);
p.drawLine(0, 0, 0, h-1);
p.setPen(sunken ? g.dark() : g.light());
p.drawLine(1, 1, w-2, 1);
p.drawLine(1, 1, 1, h-2);
p.setPen(sunken ? g.light() : g.dark());
p.drawLine(w-2, 1, w-2, h-2);
p.drawLine(1, h-2, w-2, h-2);
p.setPen(g.light());
p.drawLine(w-1, 0, w-1, h-1);
p.drawLine(0, h-1, w-1, h-1);
p.end();
}
Static * Static::instance_ = 0L;
void
Static::_init()
{
aResize_.setOptimization(QPixmap::MemoryOptim);
iResize_.setOptimization(QPixmap::MemoryOptim);
aResize_.resize(30, RESIZE_BAR_HEIGHT);
iResize_.resize(30, RESIZE_BAR_HEIGHT);
aResize_.fill(Qt::black);
iResize_.fill(Qt::black);
aTitle_ .setOptimization(QPixmap::BestOptim);
iTitle_ .setOptimization(QPixmap::BestOptim);
aResizeMidLeft_ .setOptimization(QPixmap::BestOptim);
aResizeMidRight_ .setOptimization(QPixmap::BestOptim);
aResizeMid_ .setOptimization(QPixmap::BestOptim);
iResizeMidLeft_ .setOptimization(QPixmap::BestOptim);
iResizeMidRight_ .setOptimization(QPixmap::BestOptim);
iResizeMid_ .setOptimization(QPixmap::BestOptim);
aResizeMidLeft_ .resize(3, 12);
aResizeMidRight_ .resize(3, 12);
aResizeMidLeft_ .fill(Qt::black);
aResizeMidRight_ .fill(Qt::black);
iResizeMidLeft_ .resize(3, 12);
iResizeMidRight_ .resize(3, 12);
iResizeMidLeft_ .fill(Qt::black);
iResizeMidRight_ .fill(Qt::black);
aResizeMid_ .resize(128, RESIZE_BAR_HEIGHT);
iResizeMid_ .resize(128, RESIZE_BAR_HEIGHT);
aResizeMid_ .fill(Qt::black);
iResizeMid_ .fill(Qt::black);
_loadGlyphs();
update();
}
void
Static::update()
{
QPainter p;
titleHeight_ = 24;
btnWidth1_ = 36;
btnWidth2_ = 24;
unsigned int availableTitleHeight = titleHeight_ - 6;
aTitle_.resize(36, availableTitleHeight);
iTitle_.resize(36, availableTitleHeight);
aTitleText_.resize(36, availableTitleHeight);
iTitleText_.resize(36, availableTitleHeight);
aTitleLeft_.resize(2, availableTitleHeight);
iTitleLeft_.resize(2, availableTitleHeight);
aTitleRight_.resize(2, availableTitleHeight);
iTitleRight_.resize(2, availableTitleHeight);
QColor bgColor, light, dark;
QColorGroup buttonBgColorGroup = options->colorGroup(Options::ButtonBg, true);
KPixmapEffect::GradientType vertGrad = KPixmapEffect::VerticalGradient;
KPixmapEffect::GradientType diagGrad = KPixmapEffect::DiagonalGradient;
QSize buttonSize1(btnWidth1_, availableTitleHeight);
QSize buttonSize2(btnWidth2_, availableTitleHeight);
// Titlebar
bgColor = options->color(Options::TitleBar, true);
light = bgColor.light(120);
dark = bgColor.dark(120);
KPixmapEffect::gradient(aTitle_, light, dark, vertGrad);
KPixmapEffect::gradient(aTitleText_, light, dark, vertGrad);
KPixmapEffect::gradient(aTitleLeft_, light, dark, vertGrad);
KPixmapEffect::gradient(aTitleRight_, light, dark, vertGrad);
p.begin(&aTitle_);
p.setPen(dark);
p.drawLine(0, 0, 36, 0);
p.setPen(light);
p.drawLine(0, availableTitleHeight - 1, 36, availableTitleHeight - 1);
p.end();
p.begin(&aTitleText_);
p.setPen(dark);
p.drawLine(0, 0, 36, 0);
p.setPen(light);
p.drawLine(0, availableTitleHeight - 1, 36, availableTitleHeight - 1);
p.end();
p.begin(&aTitleLeft_);
p.setPen(dark);
p.drawPoint(1, 0);
p.drawLine(0, 0, 0, availableTitleHeight - 1);
p.setPen(light);
p.drawPoint(1, availableTitleHeight - 1);
p.end();
p.begin(&aTitleRight_);
p.setPen(dark);
p.drawPoint(0, 1);
p.setPen(light);
p.drawLine(1, 0, 1, availableTitleHeight - 1);
p.drawPoint(0, availableTitleHeight - 1);
p.end();
bgColor = options->color(Options::TitleBar, false);
light = bgColor.light(120);
dark = bgColor.dark(120);
KPixmapEffect::gradient(iTitle_, light, dark, vertGrad);
KPixmapEffect::gradient(iTitleText_, light, dark, vertGrad);
KPixmapEffect::gradient(iTitleLeft_, light, dark, vertGrad);
KPixmapEffect::gradient(iTitleRight_, light, dark, vertGrad);
p.begin(&iTitle_);
p.setPen(dark);
p.drawLine(0, 0, 36, 0);
p.setPen(light);
p.drawLine(0, availableTitleHeight - 1, 36, availableTitleHeight - 1);
p.end();
p.begin(&iTitleText_);
p.setPen(dark);
p.drawLine(0, 0, 36, 0);
p.setPen(light);
p.drawLine(0, availableTitleHeight - 1, 36, availableTitleHeight - 1);
p.end();
p.begin(&iTitleLeft_);
p.setPen(dark);
p.drawPoint(1, 0);
p.drawLine(0, 0, 0, availableTitleHeight - 1);
p.setPen(light);
p.drawPoint(1, availableTitleHeight - 1);
p.end();
p.begin(&iTitleRight_);
p.setPen(dark);
p.drawPoint(0, 1);
p.setPen(light);
p.drawLine(1, 0, 1, availableTitleHeight - 1);
p.drawPoint(0, availableTitleHeight - 1);
p.end();
p.begin(&aTitle_);
p.setPen(options->color(Options::TitleBar, true).light(150));
for (unsigned int y = 3; y < availableTitleHeight - 3; y += 3)
for (unsigned int x = 1; x < 36; x += 3)
p.drawPoint(x, y);
p.setPen(options->color(Options::TitleBar, true).dark(150));
for (unsigned int y = 3; y < availableTitleHeight - 3; y += 3)
for (unsigned int x = 1; x < 36; x += 3)
p.drawPoint(x + 1, y + 1);
p.end();
// Buttons
bgColor = buttonBgColorGroup.background();
light = bgColor.light(120);
dark = bgColor.dark(120);
btnPix1_ .resize(buttonSize1);
btnDownPix1_ .resize(buttonSize1);
btnPix2_ .resize(buttonSize2);
btnDownPix2_ .resize(buttonSize2);
iBtnPix1_ .resize(buttonSize1);
iBtnDownPix1_ .resize(buttonSize1);
iBtnPix2_ .resize(buttonSize2);
iBtnDownPix2_ .resize(buttonSize2);
KPixmapEffect::gradient(btnPix1_, light, dark, diagGrad);
KPixmapEffect::gradient(btnDownPix1_, dark, light, diagGrad);
KPixmapEffect::gradient(btnPix2_, light, dark, diagGrad);
KPixmapEffect::gradient(btnDownPix2_, dark, light, diagGrad);
KPixmapEffect::gradient(iBtnPix1_, light, dark, diagGrad);
KPixmapEffect::gradient(iBtnDownPix1_, dark, light, diagGrad);
KPixmapEffect::gradient(iBtnPix2_, light, dark, diagGrad);
KPixmapEffect::gradient(iBtnDownPix2_, dark, light, diagGrad);
drawButtonFrame(btnPix1_, buttonBgColorGroup, false);
drawButtonFrame(btnDownPix1_, buttonBgColorGroup, true);
drawButtonFrame(btnPix2_, buttonBgColorGroup, false);
drawButtonFrame(btnDownPix2_, buttonBgColorGroup, true);
drawButtonFrame(iBtnPix1_, buttonBgColorGroup, false);
drawButtonFrame(iBtnDownPix1_, buttonBgColorGroup, true);
drawButtonFrame(iBtnPix2_, buttonBgColorGroup, false);
drawButtonFrame(iBtnDownPix2_, buttonBgColorGroup, true);
p.flush();
}
QPixmap
Static::button(SymbolType t, bool active, bool down)
{
bool buttonSize2 = (t == Sticky || t == Unsticky);
QPixmap px = buttonPixmap(!buttonSize2, active, down);
QBitmap b = glyph(t);
b.setMask(b);
QPainter p(&px);
QPoint offset((buttonSize2 ? btnWidth2_ : btnWidth1_) / 2 - 4, (titleHeight_ - 6) / 2 - 4);
p.drawPixmap(offset, b);
return px;
}
static unsigned char iconify_bits[] = {
0xff, 0xff, 0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18};
static unsigned char close_bits[] = {
0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3, 0x00 };
static unsigned char maximize_bits[] = {
0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0xff, 0xff };
static unsigned char unmax_bits[] = {
0x30, 0x18, 0xcc, 0xe6, 0xf3, 0xf9, 0xfc, 0xfc};
static unsigned char unsticky_bits[] = {
0x3c, 0x42, 0x99, 0xbd, 0xbd, 0x99, 0x42, 0x3c};
static unsigned char sticky_bits[] = {
0x3c, 0x42, 0x81, 0x81, 0x81, 0x81, 0x42, 0x3c};
static unsigned char question_bits[] = {
0x3c, 0x66, 0x60, 0x30, 0x18, 0x00, 0x18, 0x18};
void
Static::_loadGlyphs()
{
glyphClose_ = QBitmap(8, 8, close_bits);
glyphMaximise_ = QBitmap(8, 8, maximize_bits);
glyphUnmaximise_ = QBitmap(8, 8, unmax_bits);
glyphSticky_ = QBitmap(8, 8, sticky_bits);
glyphUnsticky_ = QBitmap(8, 8, unsticky_bits);
glyphIconify_ = QBitmap(8, 8, iconify_bits);
}
} // End namespace
// vim:ts=2:sw=2:tw=78