Imac style frames :) I updated the screenshot yet again on the Nov22 entry
on my webpage if you want to take a look. Pretty cool :) svn path=/trunk/kdebase/kwin/; revision=35486
This commit is contained in:
parent
de3d008e6d
commit
ff0574cad2
3 changed files with 90 additions and 27 deletions
|
@ -196,8 +196,8 @@ StdClient::StdClient( Workspace *ws, WId w, QWidget *parent, const char *name )
|
|||
g->addWidget( windowWrapper(), 1, 1 );
|
||||
g->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ) );
|
||||
|
||||
g->addColSpacing(0, 2);
|
||||
g->addColSpacing(2, 2);
|
||||
g->addColSpacing(0, 1);
|
||||
g->addColSpacing(2, 1);
|
||||
g->addRowSpacing(2, 2);
|
||||
|
||||
|
||||
|
|
108
systemclient.cpp
108
systemclient.cpp
|
@ -95,6 +95,7 @@ static void create_pixmaps()
|
|||
|
||||
}
|
||||
|
||||
|
||||
SystemButton::SystemButton(QWidget *parent, const char *name,
|
||||
const unsigned char *bitmap)
|
||||
: QButton(parent, name)
|
||||
|
@ -187,6 +188,9 @@ SystemClient::SystemClient( Workspace *ws, WId w, QWidget *parent,
|
|||
g->setRowStretch(1, 10);
|
||||
g->addWidget(windowWrapper(), 1, 1 );
|
||||
g->addItem( new QSpacerItem( 0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding ) );
|
||||
|
||||
g->addColSpacing(0, 2);
|
||||
g->addColSpacing(2, 2);
|
||||
g->addRowSpacing(2, 6);
|
||||
|
||||
button[0] = new SystemButton(this, "close", close_bits);
|
||||
|
@ -210,13 +214,13 @@ SystemClient::SystemClient( Workspace *ws, WId w, QWidget *parent,
|
|||
titlebar = new QSpacerItem(10, 16, QSizePolicy::Expanding,
|
||||
QSizePolicy::Minimum);
|
||||
hb->addItem(titlebar);
|
||||
hb->addSpacing(2);
|
||||
hb->addSpacing(3);
|
||||
hb->addWidget( button[1] );
|
||||
hb->addSpacing(2);
|
||||
hb->addWidget( button[2] );
|
||||
hb->addSpacing(2);
|
||||
hb->addWidget( button[3] );
|
||||
hb->addSpacing(2);
|
||||
hb->addSpacing(3);
|
||||
|
||||
for ( int i = 0; i < 4; i++) {
|
||||
button[i]->setMouseTracking( TRUE );
|
||||
|
@ -227,7 +231,7 @@ SystemClient::SystemClient( Workspace *ws, WId w, QWidget *parent,
|
|||
void SystemClient::resizeEvent( QResizeEvent* e)
|
||||
{
|
||||
Client::resizeEvent( e );
|
||||
|
||||
doShape();
|
||||
if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) {
|
||||
QPainter p( this );
|
||||
QRect t = titlebar->geometry();
|
||||
|
@ -244,6 +248,36 @@ void SystemClient::captionChange( const QString& )
|
|||
repaint( titlebar->geometry(), false );
|
||||
}
|
||||
|
||||
void SystemClient::drawRoundFrame(QPainter &p, int x, int y, int w, int h)
|
||||
{
|
||||
int x2=x+w-1, y2=y+h-1;
|
||||
QPointArray hPntArray, lPntArray;
|
||||
hPntArray.putPoints(0, 12, x+4,y+1, x+5,y+1, // top left
|
||||
x+3,y+2, x+2,y+3, x+1,y+4, x+1,y+5,
|
||||
x+1,y2-5, x+1,y2-4, x+2,y2-3, // half corners
|
||||
x2-5,y+1, x2-4,y+1, x2-3,y+2);
|
||||
|
||||
lPntArray.putPoints(0, 17, x2-5,y2-1, x2-4,y2-1, // btm right
|
||||
x2-3,y2-2, x2-2,y2-3, x2-1,y2-5, x2-1,y2-4,
|
||||
|
||||
x+3,y2-2, x+4,y2-1, x+5,y2-1, //half corners
|
||||
x2-2,y+3, x2-1,y+4, x2-1,y+5,
|
||||
|
||||
x2-5,y2-2, x2-4,y2-2, // testing
|
||||
x2-3,y2-3,
|
||||
x2-2,y2-5, x2-2,y2-4);
|
||||
|
||||
p.setPen(options->colorGroup(Options::Frame, isActive()).light());
|
||||
p.drawLine(x+6, y, x2-6, y);
|
||||
p.drawLine(0, y+6, 0, y2-6);
|
||||
p.drawPoints(hPntArray);
|
||||
p.setPen(options->colorGroup(Options::Frame, isActive()).dark());
|
||||
p.drawLine(x+6, y2, x2-6, y2);
|
||||
p.drawLine(x+6, y2-1, x2-6, y2-1);
|
||||
p.drawLine(x2, y+6, x2, y2-6);
|
||||
p.drawLine(x2-1, y+6, x2-1, y2-6);
|
||||
p.drawPoints(lPntArray);
|
||||
}
|
||||
|
||||
void SystemClient::paintEvent( QPaintEvent* )
|
||||
{
|
||||
|
@ -251,18 +285,13 @@ void SystemClient::paintEvent( QPaintEvent* )
|
|||
QRect t = titlebar->geometry();
|
||||
t.setTop( 1 );
|
||||
|
||||
p.setPen(Qt::black);
|
||||
p.drawRect(rect());
|
||||
QBrush fillBrush(colorGroup().brush(QColorGroup::Background).pixmap() ?
|
||||
colorGroup().brush(QColorGroup::Background) :
|
||||
options->colorGroup(Options::Frame, isActive()).
|
||||
brush(QColorGroup::Button));
|
||||
|
||||
qDrawShadePanel(&p, rect().x()+1, rect().y()+1, rect().width()-2,
|
||||
rect().height()-2,
|
||||
options->colorGroup(Options::Frame, isActive()), false, 1,
|
||||
&fillBrush);
|
||||
|
||||
p.fillRect(rect(), fillBrush);
|
||||
drawRoundFrame(p, 0, 0, width(), height());
|
||||
t.setTop( 2 );
|
||||
if(isActive())
|
||||
p.drawTiledPixmap(t, *titlePix);
|
||||
|
@ -286,22 +315,53 @@ void SystemClient::paintEvent( QPaintEvent* )
|
|||
|
||||
p.drawText( t, AlignCenter, caption() );
|
||||
|
||||
qDrawShadePanel(&p, rect().x()+1, rect().bottom()-6, 24, 6,
|
||||
options->colorGroup(Options::Handle, isActive()), false);
|
||||
p.drawTiledPixmap(rect().x()+2, rect().bottom()-5, 22, 4,
|
||||
isActive() ? *aHandlePix : *iHandlePix);
|
||||
|
||||
qDrawShadePanel(&p, rect().x()+25, rect().bottom()-6, rect().width()-50, 6,
|
||||
options->colorGroup(Options::Frame, isActive()), false);
|
||||
p.drawTiledPixmap(rect().x()+26, rect().bottom()-5, rect().width()-52, 4,
|
||||
isActive() ? *aFramePix : *iFramePix);
|
||||
|
||||
qDrawShadePanel(&p, rect().right()-24, rect().bottom()-6, 24, 6,
|
||||
options->colorGroup(Options::Handle, isActive()), false);
|
||||
p.drawTiledPixmap(rect().right()-23, rect().bottom()-5, 22, 4,
|
||||
isActive() ? *aHandlePix : *iHandlePix);
|
||||
p.setPen(options->colorGroup(Options::Frame, isActive()).light());
|
||||
p.drawLine(width()-20, height()-7, width()-10, height()-7);
|
||||
p.drawLine(width()-20, height()-5, width()-10, height()-5);
|
||||
p.setPen(options->colorGroup(Options::Frame, isActive()).dark());
|
||||
p.drawLine(width()-20, height()-6, width()-10, height()-6);
|
||||
p.drawLine(width()-20, height()-4, width()-10, height()-4);
|
||||
}
|
||||
|
||||
#define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2)
|
||||
|
||||
void SystemClient::doShape()
|
||||
{
|
||||
// using a bunch of QRect lines seems much more efficent than bitmaps or
|
||||
// point arrays
|
||||
|
||||
QRegion mask(QRect(6, 0, width()-12, height()));
|
||||
mask += QRegion(QRect(5, 1, 1, height()-2)); // left
|
||||
mask += QRegion(QRect(4, 1, 1, height()-2));
|
||||
mask += QRegion(QRect(3, 2, 1, height()-4));
|
||||
mask += QRegion(QRect(2, 3, 1, height()-6));
|
||||
mask += QRegion(QRect(1, 4, 1, height()-8));
|
||||
mask += QRegion(QRect(0, 6, 1, height()-12));
|
||||
int x2 = width()-1;
|
||||
mask += QRegion(QRect(x2-5, 1, 1, height()-2)); // right
|
||||
mask += QRegion(QRect(x2-4, 1, 1, height()-2));
|
||||
mask += QRegion(QRect(x2-3, 2, 1, height()-4));
|
||||
mask += QRegion(QRect(x2-2, 3, 1, height()-6));
|
||||
mask += QRegion(QRect(x2-1, 4, 1, height()-8));
|
||||
mask += QRegion(QRect(x2, 6, 1, height()-12));
|
||||
|
||||
setMask(mask);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SystemClient::showEvent(QShowEvent *ev)
|
||||
{
|
||||
Client::showEvent(ev);
|
||||
doShape();
|
||||
repaint();
|
||||
}
|
||||
|
||||
void SystemClient::windowWrapperShowEvent( QShowEvent* )
|
||||
{
|
||||
doShape();
|
||||
}
|
||||
|
||||
void SystemClient::mouseDoubleClickEvent( QMouseEvent * e )
|
||||
{
|
||||
if (titlebar->geometry().contains( e->pos() ) )
|
||||
|
|
|
@ -30,14 +30,17 @@ public:
|
|||
SystemClient( Workspace *ws, WId w, QWidget *parent=0, const char *name=0 );
|
||||
~SystemClient(){;}
|
||||
protected:
|
||||
void drawRoundFrame(QPainter &p, int x, int y, int w, int h);
|
||||
void resizeEvent( QResizeEvent* );
|
||||
void paintEvent( QPaintEvent* );
|
||||
|
||||
void showEvent( QShowEvent* );
|
||||
void windowWrapperShowEvent( QShowEvent* );
|
||||
void mouseDoubleClickEvent( QMouseEvent * );
|
||||
void init();
|
||||
void captionChange( const QString& name );
|
||||
void stickyChange(bool on);
|
||||
void maximizeChange(bool m);
|
||||
void doShape();
|
||||
private:
|
||||
SystemButton* button[4];
|
||||
QSpacerItem* titlebar;
|
||||
|
|
Loading…
Reference in a new issue