diff options
Diffstat (limited to 'examples/themes/metal.cpp')
-rw-r--r-- | examples/themes/metal.cpp | 486 |
1 files changed, 486 insertions, 0 deletions
diff --git a/examples/themes/metal.cpp b/examples/themes/metal.cpp new file mode 100644 index 000000000..02b0c02b2 --- /dev/null +++ b/examples/themes/metal.cpp @@ -0,0 +1,486 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "metal.h" + +#ifndef QT_NO_STYLE_WINDOWS + +#include "qapplication.h" +#include "qcombobox.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 "qslider.h" +#include <limits.h> + + +///////////////////////////////////////////////////////// +//#include "stonedark.xpm" +#include "stone1.xpm" +#include "marble.xpm" +/////////////////////////////////////////////////////// + + + +MetalStyle::MetalStyle() : TQWindowsStyle() { } + +/*! + Reimplementation from TQStyle + */ +void MetalStyle::polish( TQApplication *app) +{ + oldPalette = app->palette(); + + // we simply create a nice TQColorGroup with a couple of fancy + // pixmaps here and apply to it all widgets + + TQFont f("times", app->font().pointSize() ); + f.setBold( TRUE ); + f.setItalic( TRUE ); + app->setFont( f, TRUE, "TQMenuBar"); + app->setFont( f, TRUE, "TQPopupMenu"); + + + + // TQPixmap button( stonedark_xpm ); + + TQColor gold("#B9B9A5A54040"); //same as topgrad below + TQPixmap button( 1, 1 ); button.fill( gold ); + + TQPixmap background(marble_xpm); + TQPixmap dark( 1, 1 ); dark.fill( red.dark() ); + TQPixmap mid( stone1_xpm ); + TQPixmap light( stone1_xpm );//1, 1 ); light.fill( green ); + + TQPalette op = app->palette(); + + TQColor backCol( 227,227,227 ); + + // TQPalette op(white); + TQColorGroup active (op.active().foreground(), + TQBrush(op.active().button(),button), + TQBrush(op.active().light(), light), + TQBrush(op.active().dark(), dark), + TQBrush(op.active().mid(), mid), + op.active().text(), + TQt::white, + op.active().base(),// TQColor(236,182,120), + TQBrush(backCol, background) + ); + active.setColor( TQColorGroup::ButtonText, TQt::white ); + active.setColor( TQColorGroup::Shadow, TQt::black ); + TQColorGroup disabled (op.disabled().foreground(), + TQBrush(op.disabled().button(),button), + TQBrush(op.disabled().light(), light), + op.disabled().dark(), + TQBrush(op.disabled().mid(), mid), + op.disabled().text(), + TQt::white, + op.disabled().base(),// TQColor(236,182,120), + TQBrush(backCol, background) + ); + + TQPalette newPalette( active, disabled, active ); + app->setPalette( newPalette, TRUE ); +} + +/*! + Reimplementation from TQStyle + */ +void MetalStyle::unPolish( TQApplication *app) +{ + app->setPalette(oldPalette, TRUE); + app->setFont( app->font(), TRUE ); +} + +/*! + Reimplementation from TQStyle + */ +void MetalStyle::polish( TQWidget* 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("TQPushButton")){ + w->setBackgroundMode( TQWidget::NoBackground ); + return; + } + + if ( !w->isTopLevel() ) { + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( TQWidget::WindowOrigin ); + } +} + +void MetalStyle::unPolish( TQWidget* 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("TQPushButton")){ + w->setBackgroundMode( TQWidget::PaletteButton ); + return; + } + if ( !w->isTopLevel() ) { + if ( w->backgroundPixmap() ) + w->setBackgroundOrigin( TQWidget::WidgetOrigin ); + } + +} + +void MetalStyle::drawPrimitive( PrimitiveElement pe, + TQPainter *p, + const TQRect &r, + const TQColorGroup &cg, + SFlags flags, const TQStyleOption& opt ) const +{ + switch( pe ) { + case PE_HeaderSection: + if ( flags & Style_Sunken ) + flags ^= Style_Sunken | Style_Raised; + // fall through + case PE_ButtonBevel: + case PE_ButtonCommand: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + (flags & (Style_Sunken|Style_On|Style_Down)), + TRUE, !(flags & Style_Raised) ); + break; + case PE_PanelMenuBar: + drawMetalFrame( p, r.x(), r.y(), r.width(), r.height() ); + break; + case PE_ScrollBarAddLine: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + flags & Style_Down, !( flags & Style_Horizontal ) ); + drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowRight :PE_ArrowDown, + p, r, cg, flags, opt ); + break; + case PE_ScrollBarSubLine: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), + flags & Style_Down, !( flags & Style_Horizontal ) ); + drawPrimitive( (flags & Style_Horizontal) ? PE_ArrowLeft : PE_ArrowUp, + p, r, cg, flags, opt ); + break; + + + case PE_ScrollBarSlider: + drawMetalButton( p, r.x(), r.y(), r.width(), r.height(), FALSE, + flags & Style_Horizontal ); + break; + default: + TQWindowsStyle::drawPrimitive( pe, p, r, cg, flags, opt ); + break; + } +} + +void MetalStyle::drawControl( ControlElement element, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how, + const TQStyleOption& opt ) const +{ + switch( element ) { + case CE_PushButton: + { + const TQPushButton *btn; + btn = (const TQPushButton*)widget; + int x1, y1, x2, y2; + + r.coords( &x1, &y1, &x2, &y2 ); + + p->setPen( cg.foreground() ); + p->setBrush( TQBrush(cg.button(), NoBrush) ); + + + TQBrush fill; + if ( btn->isDown() ) + fill = cg.brush( TQColorGroup::Mid ); + else if ( btn->isOn() ) + fill = TQBrush( cg.mid(), Dense4Pattern ); + else + fill = cg.brush( TQColorGroup::Button ); + + if ( btn->isDefault() ) { + TQPointArray 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( TQt::black ); + p->drawPolyline( a ); + x1 += 2; + y1 += 2; + x2 -= 2; + y2 -= 2; + } + SFlags flags = Style_Default; + if ( btn->isOn() ) + flags |= Style_On; + if ( btn->isDown() ) + flags |= Style_Down; + if ( !btn->isFlat() && !btn->isDown() ) + flags |= Style_Raised; + drawPrimitive( PE_ButtonCommand, p, + TQRect( x1, y1, x2 - x1 + 1, y2 - y1 + 1), + cg, flags, opt ); + + if ( btn->isMenuButton() ) { + flags = Style_Default; + if ( btn->isEnabled() ) + flags |= Style_Enabled; + + int dx = ( y1 - y2 - 4 ) / 3; + drawPrimitive( PE_ArrowDown, p, + TQRect(x2 - dx, dx, y1, y2 - y1), + cg, flags, opt ); + } + if ( p->brush().style() != NoBrush ) + p->setBrush( NoBrush ); + break; + } + case CE_PushButtonLabel: + { + const TQPushButton *btn; + btn = (const TQPushButton*)widget; + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + int x1, y1, x2, y2; + r.coords( &x1, &y1, &x2, &y2 ); + 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; + drawItem( p, TQRect( x, y, w, h ), + AlignCenter|ShowPrefix, + cg, btn->isEnabled(), + btn->pixmap(), btn->text(), -1, + (btn->isDown() || btn->isOn())? &cg.brightText() : &cg.buttonText() ); + if ( dx || dy ) + p->translate( -dx, -dy ); + break; + } + default: + TQWindowsStyle::drawControl( element, p, widget, r, cg, how, opt ); + break; + } +} +void MetalStyle::drawComplexControl( ComplexControl cc, + TQPainter *p, + const TQWidget *widget, + const TQRect &r, + const TQColorGroup &cg, + SFlags how, + SCFlags sub, + SCFlags subActive, + const TQStyleOption& opt ) const +{ + switch ( cc ) { + case CC_Slider: + { + const TQSlider *slider = ( const TQSlider* ) widget; + TQRect handle = querySubControlMetrics( CC_Slider, widget, + SC_SliderHandle, opt); + if ( sub & SC_SliderGroove ) + TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, + SC_SliderGroove, subActive, opt ); + if ( (sub & SC_SliderHandle) && handle.isValid() ) + drawMetalButton( p, handle.x(), handle.y(), handle.width(), + handle.height(), FALSE, + slider->orientation() == TQSlider::Horizontal); + break; + } + case CC_ComboBox: + { + // not exactly correct... + const TQComboBox *cmb = ( const TQComboBox* ) widget; + + qDrawWinPanel( p, r.x(), r.y(), r.width(), r.height(), cg, TRUE, + cmb->isEnabled() ? &cg.brush( TQColorGroup::Base ) : + &cg.brush( TQColorGroup::Background ) ); + drawMetalButton( p, r.x() + r.width() - 2 - 16, r.y() + 2, 16, r.height() - 4, + how & Style_Sunken, TRUE ); + drawPrimitive( PE_ArrowDown, p, + TQRect( r.x() + r.width() - 2 - 16 + 2, + r.y() + 2 + 2, 16 - 4, r.height() - 4 -4 ), + cg, + cmb->isEnabled() ? Style_Enabled : Style_Default, + opt ); + break; + } + default: + TQWindowsStyle::drawComplexControl( cc, p, widget, r, cg, how, sub, subActive, + opt ); + break; + } +} + + +/*! + Draw a metallic button, sunken if \a sunken is TRUE, horizontal if + /a horz is TRUE. +*/ + +void MetalStyle::drawMetalButton( TQPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat ) const +{ + + drawMetalFrame( p, x, y, w, h ); + drawMetalGradient( p, x, y, w, h, sunken, horz, flat ); +} + + + + +void MetalStyle::drawMetalFrame( TQPainter *p, int x, int y, int w, int h ) const +{ + TQColor top1("#878769691515"); + TQColor top2("#C6C6B4B44949"); + + TQColor bot2("#70705B5B1414"); + TQColor bot1("#56564A4A0E0E"); //first from the bottom + + + 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 ); + + +} + + +void MetalStyle::drawMetalGradient( TQPainter *p, int x, int y, int w, int h, + bool sunken, bool horz, bool flat ) const + +{ + TQColor highlight("#E8E8DDDD6565"); + TQColor subh1("#CECEBDBD5151"); + TQColor subh2("#BFBFACAC4545"); + + TQColor topgrad("#B9B9A5A54040"); + TQColor botgrad("#89896C6C1A1A"); + + + + if ( flat && !sunken ) { + p->fillRect( x + 2, y + 2, w - 4,h -4, topgrad ); + } else { + // highlight: + int i = 0; + int x1 = x + 2; + int y1 = y + 2; + int x2 = x + w - 1; + int y2 = y + h - 1; + if ( horz ) + x2 = x2 - 2; + else + y2 = y2 - 2; + +#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( TQColor( h1 + ((h2-h1)*j)/(ng-1), + s1 + ((s2-s1)*j)/(ng-1), + v1 + ((v2-v1)*j)/(ng-1), TQColor::Hsv ) ); + DRAWLINE; + } + } else if ( ng == 1 ) { + p->setPen( TQColor((h1+h2)/2, (s1+s2)/2, (v1+v2)/2, TQColor::Hsv) ); + DRAWLINE; + } + if ( sunken ) { + p->setPen( subh2 ); + DRAWLINE; + + p->setPen( subh1 ); + DRAWLINE; + + p->setPen( highlight ); + DRAWLINE; + DRAWLINE; + } + } +} + + + +int MetalStyle::pixelMetric( PixelMetric metric, const TQWidget *w ) const +{ + switch ( metric ) { + case PM_MenuBarFrameWidth: + return 2; + default: + return TQWindowsStyle::pixelMetric( metric, w ); + } +} + +#endif |