author | llornkcor <llornkcor> | 2002-06-25 01:46:34 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-06-25 01:46:34 (UTC) |
commit | 4bf0efd9f4c6963b48be4a7b836a3c1c46431814 (patch) (side-by-side diff) | |
tree | c58bff748d51ef18e82c34b310b2b26462223a94 /noncore/styles/metal/metal.cpp | |
parent | 2da629c52c3cbfebff7b314b8668ccd579bb6742 (diff) | |
download | opie-4bf0efd9f4c6963b48be4a7b836a3c1c46431814.zip opie-4bf0efd9f4c6963b48be4a7b836a3c1c46431814.tar.gz opie-4bf0efd9f4c6963b48be4a7b836a3c1c46431814.tar.bz2 |
took about 3 minutes to add, so.. what the heck..
Diffstat (limited to 'noncore/styles/metal/metal.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/styles/metal/metal.cpp | 514 |
1 files changed, 514 insertions, 0 deletions
diff --git a/noncore/styles/metal/metal.cpp b/noncore/styles/metal/metal.cpp new file mode 100644 index 0000000..2380fed --- a/dev/null +++ b/noncore/styles/metal/metal.cpp @@ -0,0 +1,514 @@ +/**************************************************************************** +** $Id$ +** +** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. +** +** This file is part of an example program for Qt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "metal.h" +#include <qapplication.h> +#include <qpainter.h> +#include <qdrawutil.h> // for now +#include <qpixmap.h> // for now +#include <qpalette.h> // for now +#include <qwidget.h> +#include <qlabel.h> +#include <qimage.h> +#include <qpushbutton.h> +#include <qwidget.h> +#include <qrangecontrol.h> +#include <qscrollbar.h> +#include <limits.h> + + +///////////////////////////////////////////////////////// +#include "stonedark.xpm" +#include "stone1.xpm" +#include "marble.xpm" +/////////////////////////////////////////////////////// + + + +MetalStyle::MetalStyle() : QWindowsStyle() { } + +/*! + Reimplementation from QStyle + */ +void MetalStyle::polish( QApplication *app) +{ + oldPalette = app->palette(); + + // we simply create a nice QColorGroup with a couple of fancy + // pixmaps here and apply to it all widgets + + QFont f("times", app->font().pointSize() ); + f.setBold( TRUE ); + f.setItalic( TRUE ); + app->setFont( f, TRUE, "QMenuBar"); + app->setFont( f, TRUE, "QPopupMenu"); + + + //QPixmap button( stone1_xpm ); + QPixmap button( stonedark_xpm ); + QPixmap background(marble_xpm); +#if 0 + + int i; + for (i=0; i<img.numColors(); i++) { + QRgb rgb = img.color(i); + QColor c(rgb); + rgb = c.dark().rgb(); + img.setColor(i,rgb); + } + QPixmap mid; + mid.convertFromImage(img); + + img = orig; + for (i=0; i<img.numColors(); i++) { + QRgb rgb = img.color(i); + QColor c(rgb); + rgb = c.light().rgb(); + img.setColor(i,rgb); + } + QPixmap light; + light.convertFromImage(img); + + img = orig; + for (i=0; i<img.numColors(); i++) { + QRgb rgb = img.color(i); + QColor c(rgb); + rgb = c.dark().rgb(); + img.setColor(i,rgb); + } + QPixmap dark; + dark.convertFromImage(img); +#else + QPixmap dark( 1, 1 ); dark.fill( red.dark() ); + QPixmap mid( stone1_xpm ); + QPixmap light( stone1_xpm );//1, 1 ); light.fill( green ); +#endif + QPalette op = app->palette(); + + QColor backCol( 227,227,227 ); + + // QPalette op(white); + QColorGroup active (op.normal().foreground(), + QBrush(op.normal().button(),button), + QBrush(op.normal().light(), light), + QBrush(op.normal().dark(), dark), + QBrush(op.normal().mid(), mid), + op.normal().text(), + Qt::white, + op.normal().base(),// QColor(236,182,120), + QBrush(backCol, background) + ); + active.setColor( QColorGroup::ButtonText, Qt::white ); + active.setColor( QColorGroup::Shadow, Qt::black ); + QColorGroup disabled (op.disabled().foreground(), + QBrush(op.disabled().button(),button), + QBrush(op.disabled().light(), light), + op.disabled().dark(), + QBrush(op.disabled().mid(), mid), + op.disabled().text(), + Qt::white, + op.disabled().base(),// QColor(236,182,120), + QBrush(backCol, background) + ); + + QPalette newPalette( active, disabled, active ); + app->setPalette( newPalette, TRUE ); +} + +/*! + Reimplementation from QStyle + */ +void MetalStyle::unPolish( QApplication *app) +{ + app->setPalette(oldPalette, TRUE); + app->setFont( app->font(), TRUE ); +} + +/*! + Reimplementation from QStyle + */ +void MetalStyle::polish( QWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if (w->inherits("QPushButton")){ + w->setBackgroundMode( QWidget::NoBackground ); + return; + } + + if (w->inherits("QTipLabel") || w->inherits("QLCDNumber") ){ + return; + } + + if ( !w->isTopLevel() ) { + if ( w->inherits("QGroupBox") + || w->inherits("QTabWidget") ) { + w->setAutoMask( TRUE ); + return; + } + if (w->inherits("QLabel") + || w->inherits("QSlider") + || w->inherits("QButton") + || w->inherits("QProgressBar") + ){ + w->setBackgroundOrigin( QWidget::ParentOrigin ); + } + } +} + +void MetalStyle::unPolish( QWidget* w) +{ + + // the polish function sets some widgets to transparent mode and + // some to translate background mode in order to get the full + // benefit from the nice pixmaps in the color group. + + if (w->inherits("QPushButton")){ + w->setBackgroundMode( QWidget::PaletteButton ); + return; + } + + if (w->inherits("QTipLabel") || w->inherits("QLCDNumber") ){ + return; + } + + if ( !w->isTopLevel() ) { + if ( w->inherits("QGroupBox") + || w->inherits("QTabWidget") ) { + w->setAutoMask( FALSE ); + return; + } + if (w->inherits("QLabel") + || w->inherits("QSlider") + || w->inherits("QButton") + || w->inherits("QProgressBar") + ){ + w->setBackgroundOrigin( QWidget::WidgetOrigin ); + } + } + +} + +/*! + Draw a metallic button, sunken if \a sunken is TRUE, horizontal if + /a horz is TRUE. +*/ + +void MetalStyle::drawMetalButton( QPainter *p, int x, int y, int w, int h, + bool sunken, bool horz ) +{ + QColor top1("#878769691515"); + QColor top2("#C6C6B4B44949"); + + QColor bot2("#70705B5B1414"); + QColor bot1("56564A4A0E0E"); //first from the bottom + + QColor highlight("#E8E8DDDD6565"); + QColor subh1("#CECEBDBD5151"); + QColor subh2("#BFBFACAC4545"); + + QColor topgrad("#B9B9A5A54040"); + QColor botgrad("#89896C6C1A1A"); + + + int x2 = x + w - 1; + int y2 = y + h - 1; + + //frame: + + p->setPen( top1 ); + p->drawLine( x, y2, x, y ); + p->drawLine( x, y, x2-1, y ); + p->setPen( top2 ); + p->drawLine( x+1, y2 -1, x+1, y+1 ); + p->drawLine( x+1, y+1 , x2-2, y+1 ); + + p->setPen( bot1 ); + p->drawLine( x+1, y2, x2, y2 ); + p->drawLine( x2, y2, x2, y ); + p->setPen( bot2 ); + p->drawLine( x+1, y2-1, x2-1, y2-1 ); + p->drawLine( x2-1, y2-1, x2-1, y+1 ); + + // highlight: + int i = 0; + int x1 = x + 2; + int y1 = y + 2; + if ( horz ) + x2 = x2 - 2; + else + y2 = y2 - 2; + // Note that x2/y2 mean something else from this point down... + +#define DRAWLINE if (horz) \ + p->drawLine( x1, y1+i, x2, y1+i ); \ + else \ + p->drawLine( x1+i, y1, x1+i, y2 ); \ + i++; + + if ( !sunken ) { + p->setPen( highlight ); + DRAWLINE; + DRAWLINE; + p->setPen( subh1 ); + DRAWLINE; + p->setPen( subh2 ); + DRAWLINE; + } + // gradient: + int ng = (horz ? h : w) - 8; // how many lines for the gradient? + + int h1, h2, s1, s2, v1, v2; + if ( !sunken ) { + topgrad.hsv( &h1, &s1, &v1 ); + botgrad.hsv( &h2, &s2, &v2 ); + } else { + botgrad.hsv( &h1, &s1, &v1 ); + topgrad.hsv( &h2, &s2, &v2 ); + } + + if ( ng > 1 ) { + + for ( int j =0; j < ng; j++ ) { + p->setPen( QColor( h1 + ((h2-h1)*j)/(ng-1), + s1 + ((s2-s1)*j)/(ng-1), + v1 + ((v2-v1)*j)/(ng-1), QColor::Hsv ) ); + DRAWLINE; + } + } else if ( ng == 1 ) { + p->setPen( QColor( (h1+h2)/2, (s1+s2)/2, (v1+v2)/2, QColor::Hsv ) ); + DRAWLINE; + } + if ( sunken ) { + p->setPen( subh2 ); + DRAWLINE; + + p->setPen( subh1 ); + DRAWLINE; + + p->setPen( highlight ); + DRAWLINE; + DRAWLINE; + } + +} + + + +/*! + Reimplementation from QStyle + */ +void MetalStyle::drawButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &, bool sunken, const QBrush*) +{ + + drawMetalButton( p, x, y, w, h, sunken, TRUE ); +} + +/*! + Reimplementation from QStyle + */ +void MetalStyle::drawBevelButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &, bool sunken, const QBrush*) +{ + MetalStyle::drawMetalButton(p, x, y, w, h, sunken, TRUE ); +} + +/*! + Reimplementation from QStyle + */ +void MetalStyle::drawPushButton( QPushButton* btn, QPainter *p) +{ + QColorGroup g = btn->colorGroup(); + int x1, y1, x2, y2; + + btn->rect().coords( &x1, &y1, &x2, &y2 ); // get coordinates + + p->setPen( g.foreground() ); + p->setBrush( QBrush(g.button(),NoBrush) ); + + QBrush fill; + if ( btn->isDown() ) + fill = g.brush( QColorGroup::Mid ); + else if ( btn->isOn() ) + fill = QBrush( g.mid(), Dense4Pattern ); + else + fill = g.brush( QColorGroup::Button ); + + if ( btn->isDefault() ) { + QPointArray a; + a.setPoints( 9, + x1, y1, x2, y1, x2, y2, x1, y2, x1, y1+1, + x2-1, y1+1, x2-1, y2-1, x1+1, y2-1, x1+1, y1+1 ); + p->setPen( Qt::black ); + p->drawPolyline( a ); + x1 += 2; + y1 += 2; + x2 -= 2; + y2 -= 2; + } + + drawMetalButton( p, x1, y1, x2-x1+1, y2-y1+1, btn->isOn() || btn->isDown(), + TRUE ); // always horizontal + + + if ( btn->isMenuButton() ) { + int dx = (y1-y2-4)/3; + drawArrow( p, DownArrow, FALSE, + x2 - dx, dx, y1, y2 - y1, + g, btn->isEnabled() ); + } + + if ( p->brush().style() != NoBrush ) + p->setBrush( NoBrush ); + +} + + +/*! + Reimplementation from QStyle + */ +void MetalStyle::drawPushButtonLabel( QPushButton* btn, QPainter *p) +{ + QRect r = btn->rect(); + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + int x1, y1, x2, y2; + btn->rect().coords( &x1, &y1, &x2, &y2 ); // get coordinates + int dx = 0; + int dy = 0; + if ( btn->isMenuButton() ) + dx = (y2-y1) / 3; + if ( btn->isOn() || btn->isDown() ) { + dx--; + dy--; + } + if ( dx || dy ) + p->translate( dx, dy ); + + x += 2; y += 2; w -= 4; h -= 4; + QColorGroup g = btn->colorGroup(); + drawItem( p, x, y, w, h, + AlignCenter|ShowPrefix, + g, btn->isEnabled(), + btn->pixmap(), btn->text(), -1, + (btn->isDown() || btn->isOn())?&btn->colorGroup().brightText():&btn->colorGroup().buttonText()); + + if ( dx || dy ) + p->translate( -dx, -dy ); +} + + +void MetalStyle::drawPanel( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, + int lineWidth, const QBrush *fill ) +{ + + QStyle::drawPanel( p, x, y, w, h, + g, sunken, + lineWidth, fill ); +} + + +/*! + Reimplemented +*/ + +void MetalStyle::drawSlider( QPainter *p, int x, int y, int w, int h, + const QColorGroup &, Orientation orient, + bool /*tickAbove*/, bool /*tickBelow*/ ) +{ + drawMetalButton( p, x, y, w, h, FALSE, orient != Horizontal ); +} + + +void MetalStyle::drawScrollBarControls( QPainter* p, const QScrollBar* sb, + int sliderStart, uint controls, + uint activeControl ) +{ + QWindowsStyle::drawScrollBarControls( p, sb, sliderStart, controls & ~(AddLine|SubLine|Slider), + activeControl & ~(AddLine|SubLine|Slider) ); + bool horz = sb->orientation() == QScrollBar::Horizontal; + int b = 2; + int w = horz ? sb->height() : sb->width(); + + QColorGroup g = sb->colorGroup(); + + int sliderMin, sliderMax, sliderLength, buttonDim; + scrollBarMetrics( sb, sliderMin, sliderMax, sliderLength, buttonDim ); + + if (sliderStart > sliderMax) { // sanity check + sliderStart = sliderMax; + } + bool maxedOut = (sb->maxValue() == sb->minValue()); + + + if ( controls & AddLine ) { + bool sunken = activeControl & AddLine; + QRect r( b, b, w-2*b, w-2*b ) ; + if ( horz ) + r.moveBy( sb->width() - w, 0 ); + else + r.moveBy( 0, sb->height() - w ); + + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + sunken, !horz ); + drawArrow( p, horz ? RightArrow : DownArrow, sunken, + r.x(), r.y(), r.width(), r.height(), g, !maxedOut ); + + } + if ( controls & SubLine ) { + bool sunken = activeControl & SubLine; + QRect r( b, b, w-2*b, w-2*b ) ; + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + sunken, !horz ); + drawArrow( p, horz ? LeftArrow : UpArrow, sunken, + r.x(), r.y(), r.width(), r.height(), g, !maxedOut ); + } + + QRect sliderR; + if ( horz ) { + sliderR .setRect( sliderStart, b, sliderLength, w-2*b ); + } else { + sliderR .setRect( b, sliderStart, w-2*b, sliderLength ); + } + if ( controls & Slider ) { + if ( !maxedOut ) { + drawMetalButton( p, sliderR.x(), sliderR.y(), + sliderR.width(), sliderR.height(), + FALSE, horz ); + } + } + +} + + +void MetalStyle::drawComboButton( QPainter *p, int x, int y, int w, int h, + const QColorGroup &g, bool sunken, + bool /*editable*/, + bool enabled, + const QBrush *fill) +{ + + qDrawWinPanel(p, x, y, w, h, g, TRUE, + fill?fill:(enabled?&g.brush( QColorGroup::Base ): + &g.brush( QColorGroup::Background ))); + + + drawMetalButton( p, x+w-2-16, y+2, 16, h-4, sunken, TRUE ); + + drawArrow( p, QStyle::DownArrow, sunken, + x+w-2-16+ 2, y+2+ 2, 16- 4, h-4- 4, g, enabled ); + +} |