You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kcontrol/colors/widgetcanvas.cpp

597 lines
19 KiB

//
// A special widget which draws a sample of KDE widgets
// It is used to preview color schemes
//
// Copyright (c) Mark Donohoe 1998
//
#include <tqdrawutil.h>
#include <tqpainter.h>
#include <tqscrollbar.h>
#include <tqbitmap.h>
#include <tqtooltip.h>
#include <tqstyle.h>
#include <tqpopupmenu.h>
#include <kcolordrag.h>
#include <kpixmapeffect.h>
#include <kglobalsettings.h>
#include <kconfig.h>
#include <klocale.h>
#include <kpixmap.h>
#include "widgetcanvas.h"
#include "widgetcanvas.moc"
#include "stdclient_bitmaps.h"
static TQPixmap* close_pix = 0;
static TQPixmap* maximize_pix = 0;
static TQPixmap* minimize_pix = 0;
static TQPixmap* normalize_pix = 0;
static TQPixmap* pinup_pix = 0;
static TQPixmap* pindown_pix = 0;
static TQPixmap* menu_pix = 0;
static TQPixmap* dis_close_pix = 0;
static TQPixmap* dis_maximize_pix = 0;
static TQPixmap* dis_minimize_pix = 0;
static TQPixmap* dis_normalize_pix = 0;
static TQPixmap* dis_pinup_pix = 0;
static TQPixmap* dis_pindown_pix = 0;
static TQPixmap* dis_menu_pix = 0;
WidgetCanvas::WidgetCanvas( TQWidget *parent, const char *name )
: TQWidget( parent, name ), shadeSortColumn( true )
{
setMouseTracking( true );
setBackgroundMode( NoBackground );
setAcceptDrops( true);
setMinimumSize(200, 100);
currentHotspot = -1;
}
void WidgetCanvas::addToolTip( int area, const TQString &tip )
{
tips.insert(area, tip);
}
void WidgetCanvas::paintEvent(TQPaintEvent *)
{
bitBlt( this, 0, 0, &smplw );
}
void WidgetCanvas::mousePressEvent( TQMouseEvent *me )
{
for ( int i = 0; i < MAX_HOTSPOTS; i++ )
if ( hotspots[i].rect.contains( me->pos() ) ) {
emit widgetSelected( hotspots[i].number );
return;
}
}
void WidgetCanvas::mouseMoveEvent( TQMouseEvent *me )
{
for ( int i = 0; i < MAX_HOTSPOTS; i++ )
if ( hotspots[i].rect.contains( me->pos() ) ) {
if ( i != currentHotspot ) {
TQString tip = tips[hotspots[i].number];
TQToolTip::remove( this );
TQToolTip::add( this, tip );
currentHotspot = i;
}
return;
}
TQToolTip::remove( this );
}
void WidgetCanvas::dropEvent( TQDropEvent *e)
{
TQColor c;
if (KColorDrag::decode( e, c)) {
for ( int i = 0; i < MAX_HOTSPOTS; i++ )
if ( hotspots[i].rect.contains( e->pos() ) ) {
emit colorDropped( hotspots[i].number, c);
return;
}
}
}
void WidgetCanvas::dragEnterEvent( TQDragEnterEvent *e)
{
e->accept( KColorDrag::canDecode( e));
}
void WidgetCanvas::paletteChange(const TQPalette &)
{
drawSampleWidgets();
}
void WidgetCanvas::resizeEvent(TQResizeEvent *)
{
drawSampleWidgets();
}
/*
* This is necessary because otherwise the scrollbar in drawSampleWidgets()
* doesn't show the first time.
*/
void WidgetCanvas::showEvent(TQShowEvent *)
{
drawSampleWidgets();
}
void WidgetCanvas::resetTitlebarPixmaps(const TQColor &actMed,
const TQColor &disMed)
{
if(close_pix) delete close_pix;
if(maximize_pix) delete maximize_pix;
if(minimize_pix) delete minimize_pix;
if(normalize_pix) delete normalize_pix;
if(pinup_pix) delete pinup_pix;
if(pindown_pix) delete pindown_pix;
if(menu_pix) delete menu_pix;
if(dis_close_pix) delete dis_close_pix;
if(dis_maximize_pix) delete dis_maximize_pix;
if(dis_minimize_pix) delete dis_minimize_pix;
if(dis_normalize_pix) delete dis_normalize_pix;
if(dis_pinup_pix) delete dis_pinup_pix;
if(dis_pindown_pix) delete dis_pindown_pix;
if(dis_menu_pix) delete dis_menu_pix;
TQPainter pact, pdis;
TQBitmap bitmap;
TQColor actHigh = actMed.light(150);
TQColor actLow = actMed.dark(120);
TQColor disHigh = disMed.light(150);
TQColor disLow = disMed.dark(120);
close_pix = new TQPixmap(16, 16);
dis_close_pix = new TQPixmap(16, 16);
pact.begin(close_pix); pdis.begin(dis_close_pix);
bitmap = TQBitmap(16, 16, close_white_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actHigh); pdis.setPen(disHigh);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, close_dgray_bits, true);
pact.setPen(actLow); pdis.setPen(disLow);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
pact.end(); pdis.end();
bitmap = TQBitmap(16, 16, close_mask_bits, true);
close_pix->setMask(bitmap); dis_close_pix->setMask(bitmap);
minimize_pix = new TQPixmap(16, 16);
dis_minimize_pix = new TQPixmap(16, 16);
pact.begin(minimize_pix); pdis.begin(dis_minimize_pix);
bitmap = TQBitmap(16, 16, iconify_white_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actHigh); pdis.setPen(disHigh);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, iconify_dgray_bits, true);
pact.setPen(actLow); pdis.setPen(disLow);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
pact.end(); pdis.end();
bitmap = TQBitmap(16, 16, iconify_mask_bits, true);
minimize_pix->setMask(bitmap); dis_minimize_pix->setMask(bitmap);
maximize_pix = new TQPixmap(16, 16);
dis_maximize_pix = new TQPixmap(16, 16);
pact.begin(maximize_pix); pdis.begin(dis_maximize_pix);
bitmap = TQBitmap(16, 16, maximize_white_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actHigh); pdis.setPen(disHigh);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, maximize_dgray_bits, true);
pact.setPen(actLow); pdis.setPen(disLow);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
pact.end(); pdis.end();
bitmap = TQBitmap(16, 16, maximize_mask_bits, true);
maximize_pix->setMask(bitmap); dis_maximize_pix->setMask(bitmap);
normalize_pix = new TQPixmap(16, 16);
dis_normalize_pix = new TQPixmap(16, 16);
pact.begin(normalize_pix); pdis.begin(dis_normalize_pix);
bitmap = TQBitmap(16, 16, maximizedown_white_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actHigh); pdis.setPen(disHigh);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, maximizedown_dgray_bits, true);
pact.setPen(actLow); pdis.setPen(disLow);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
pact.end(); pdis.end();
bitmap = TQBitmap(16, 16, maximizedown_mask_bits, true);
normalize_pix->setMask(bitmap); dis_normalize_pix->setMask(bitmap);
menu_pix = new TQPixmap(16, 16);
dis_menu_pix = new TQPixmap(16, 16);
pact.begin(menu_pix); pdis.begin(dis_menu_pix);
bitmap = TQBitmap(16, 16, menu_white_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actHigh); pdis.setPen(disHigh);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, menu_dgray_bits, true);
pact.setPen(actLow); pdis.setPen(disLow);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
pact.end(); pdis.end();
bitmap = TQBitmap(16, 16, menu_mask_bits, true);
menu_pix->setMask(bitmap); dis_menu_pix->setMask(bitmap);
pinup_pix = new TQPixmap(16, 16);
dis_pinup_pix = new TQPixmap(16, 16);
pact.begin(pinup_pix); pdis.begin(dis_pinup_pix);
bitmap = TQBitmap(16, 16, pinup_white_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actHigh); pdis.setPen(disHigh);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, pinup_gray_bits, true);
pact.setPen(actMed); pdis.setPen(disMed);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, pinup_dgray_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actLow); pdis.setPen(disLow);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
pact.end(); pdis.end();
bitmap = TQBitmap(16, 16, pinup_mask_bits, true);
pinup_pix->setMask(bitmap); dis_pinup_pix->setMask(bitmap);
pindown_pix = new TQPixmap(16, 16);
dis_pindown_pix = new TQPixmap(16, 16);
pact.begin(pindown_pix); pdis.begin(dis_pindown_pix);
bitmap = TQBitmap(16, 16, pindown_white_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actHigh); pdis.setPen(disHigh);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, pindown_gray_bits, true);
pact.setPen(actMed); pdis.setPen(disMed);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
bitmap = TQBitmap(16, 16, pindown_dgray_bits, true);
bitmap.setMask(bitmap);
pact.setPen(actLow); pdis.setPen(disLow);
pact.drawPixmap(0, 0, bitmap);
pdis.drawPixmap(0, 0, bitmap);
pact.end(); pdis.end();
bitmap = TQBitmap(16, 16, pindown_mask_bits, true);
pindown_pix->setMask(bitmap); dis_pindown_pix->setMask(bitmap);
}
void WidgetCanvas::drawSampleWidgets()
{
int textLen, tmp;
int highlightVal, lowlightVal;
KConfig * c = new KConfig("kcmfonts");
// Keep in sync with kglobalsettings.
TQFont windowFontGuess(KGlobalSettings::generalFont().family(), 12, TQFont::SansSerif, true);
windowFontGuess.setPixelSize(12);
c->setGroup("WM");
TQFont windowFont = c->readFontEntry("activeFont", &windowFontGuess);
c->setGroup("General");
TQFont defaultMenuFont = KGlobalSettings::menuFont();
TQFont menuFont = c->readFontEntry("menuFont", &defaultMenuFont);
delete c;
c = 0;
// Calculate the highlight and lowloght from contrast value and create
// color group from color scheme.
highlightVal=100+(2*contrast+4)*16/10;
lowlightVal=100+(2*contrast+4)*10;
TQColorGroup cg( txt, back,
back.light(highlightVal),
back.dark(lowlightVal),
back.dark(120),
txt, window );
// We will need this brush.
TQBrush brush(SolidPattern);
brush.setColor( back );
// Create a scrollbar and redirect drawing into a temp. pixmap to save a
// lot of fiddly drawing later.
TQScrollBar *vertScrollBar = new TQScrollBar( Qt::Vertical, this );
// TODO: vertScrollBar->setStyle( new TQMotifStyle() );
vertScrollBar->setGeometry( 400, 400, SCROLLBAR_SIZE, height());
vertScrollBar->setRange( 0, 0 );
vertScrollBar->setPalette( TQPalette(cg,cg,cg));
vertScrollBar->show();
TQPixmap pm( vertScrollBar->width(), vertScrollBar->height() );
pm.fill( back );
#ifndef __osf__
TQPainter::redirect( vertScrollBar, &pm );
#endif
vertScrollBar->tqrepaint();
TQPainter::redirect( vertScrollBar, 0 );
vertScrollBar->hide();
// Reset the titlebar pixmaps
resetTitlebarPixmaps(aTitleBtn, iTitleBtn);
// Initialize the pixmap which we draw sample widgets into.
smplw.resize(width(), height());
//smplw.fill( parentWidget()->back() );
smplw.fill( parentWidget()->tqcolorGroup().mid() );
// Actually start painting in
TQPainter paint( &smplw );
// Inactive window
qDrawWinPanel ( &paint, 15, 5, width()-48, height(), cg, FALSE,
&brush);
paint.setBrush( iaTitle );
paint.setPen( iaTitle );
//paint.drawRect( 20, 10, width()-60, 20 );
KPixmap pmTitle;
pmTitle.resize( width()-160, 20 );
// Switched to vertical gradient because those kwin styles that
// use the gradient have it vertical.
KPixmapEffect::gradient(pmTitle, iaTitle, iaBlend,
KPixmapEffect::HorizontalGradient);
paint.drawPixmap( 60, 10, pmTitle );
paint.setFont( windowFont );
paint.setPen( iaTxt );
paint.drawText( 65, 25, i18n("Inactive window") );
textLen = paint.fontMetrics().width( i18n("Inactive window") );
tmp = width()-100;
paint.drawPixmap(22, 12, *dis_menu_pix);
paint.drawPixmap(42, 12, *dis_pinup_pix);
paint.drawPixmap(tmp+2, 12, *dis_minimize_pix);
paint.drawPixmap(tmp+22, 12, *dis_maximize_pix);
paint.drawPixmap(tmp+42, 12, *dis_close_pix);
int spot = 0;
hotspots[ spot++ ] =
HotSpot( TQRect( 65, 25-14, textLen, 14 ), CSM_Inactive_title_text );
hotspots[ spot++ ] =
HotSpot( TQRect( 60, 10, (width()-160)/2, 20 ), CSM_Inactive_title_bar );
hotspots[ spot++ ] =
HotSpot( TQRect( 60+(width()-160)/2, 10,
(width()-160)/2, 20 ), CSM_Inactive_title_blend );
hotspots[spot++] =
HotSpot(TQRect(20, 12, 40, 20), CSM_Inactive_title_button);
hotspots[spot++] =
HotSpot(TQRect(tmp, 12, 60, 20), CSM_Inactive_title_button);
// Active window
qDrawWinPanel ( &paint, 20, 25+5, width()-40, height(), cg, FALSE,
&brush);
paint.setBrush( aTitle );paint.setPen( aTitle );
paint.drawRect( 65, 30+5, width()-152, 20 );
// Switched to vertical gradient because those kwin styles that
// use the gradient have it vertical.
pmTitle.resize( width()-152, 20 );
KPixmapEffect::gradient(pmTitle, aTitle, aBlend,
KPixmapEffect::HorizontalGradient);
paint.drawPixmap( 65, 35, pmTitle );
paint.setFont( windowFont );
paint.setPen( aTxt );
paint.drawText( 75, 50, i18n("Active window") );
textLen = paint.fontMetrics().width( i18n("Active window" ));
tmp = width()-152+65;
paint.drawPixmap(27, 35, *menu_pix);
paint.drawPixmap(47, 35, *pinup_pix);
paint.drawPixmap(tmp+2, 35, *minimize_pix);
paint.drawPixmap(tmp+22, 35, *maximize_pix);
paint.drawPixmap(tmp+42, 35, *close_pix);
hotspots[ spot++ ] =
HotSpot( TQRect( 75, 50-14, textLen, 14 ), CSM_Active_title_text);
hotspots[ spot ++] =
HotSpot( TQRect( 65, 35, (width()-152)/2, 20 ), CSM_Active_title_bar );
hotspots[ spot ++] =
HotSpot( TQRect( 65+(width()-152)/2, 35,
(width()-152)/2, 20 ), CSM_Active_title_blend );
hotspots[spot++] =
HotSpot(TQRect(25, 35, 40, 20), CSM_Active_title_button);
hotspots[spot++] =
HotSpot(TQRect(tmp, 35, 60, 20), CSM_Active_title_button);
// Menu bar
//qDrawShadePanel ( &paint, 25, 55, width()-52, 28, cg, FALSE, 2, &brush);
kapp->tqstyle().tqdrawPrimitive(TQStyle::PE_PanelMenuBar, &paint,
TQRect(TQPoint(25, 55), TQSize(width()-52, 28)), cg);
paint.setFont( menuFont );
paint.setPen(txt );
TQString file = i18n("File");
textLen = paint.fontMetrics().width( file );
//qDrawShadePanel ( &paint, 30, 59, textLen + 10, 21, cg, FALSE, 2, &brush);
kapp->tqstyle().tqdrawPrimitive(TQStyle::PE_Panel, &paint,
TQRect(30, 59, textLen + 10, 21), cg);
paint.drawText( 35, 74, file );
hotspots[ spot++ ] =
HotSpot( TQRect( 35, 62, textLen, 14 ), CSM_Text );
hotspots[ spot++ ] =
HotSpot( TQRect( 27, 57, 33, 21 ), CSM_Background );
paint.setFont( menuFont );
paint.setPen( txt );
paint.drawText( 35 + textLen + 20, 74, i18n("Edit") );
textLen = paint.fontMetrics().width( i18n("Edit") );
hotspots[ spot++ ] = HotSpot( TQRect( 35 + textLen + 20, 62, textLen, 14 ), CSM_Text );
// Button Rects need to go before window
// Frame and window contents
brush.setColor( window );
qDrawShadePanel ( &paint, 25, 80+5-4, width()-7-45-2,
height(), cg, TRUE, 2, &brush);
// Standard text
TQFont fnt = KGlobalSettings::generalFont();
paint.setFont( fnt );
paint.setPen( windowTxt );
paint.drawText( 140, 127-20, i18n( "Standard text") );
textLen = paint.fontMetrics().width( i18n("Standard text") );
int column2 = 120 + textLen + 40 + 16;
hotspots[ spot++ ] =
HotSpot( TQRect( 140, 113-20, textLen, 14 ), CSM_Standard_text );
// Selected text
textLen = paint.fontMetrics().width( i18n("Selected text") );
if (120 + textLen + 40 + 16 > column2)
column2 = 120 + textLen + 40 + 16;
paint.setBrush( select );paint.setPen( select );
paint.drawRect ( 120, 115, textLen+40, 32);
paint.setFont( fnt );
paint.setPen( selectTxt );
paint.drawText( 140, 135, i18n( "Selected text") );
hotspots[ spot++ ] =
HotSpot( TQRect( 140, 121, textLen, 14 ), CSM_Select_text );
hotspots[ spot++ ] =
HotSpot( TQRect( 120, 115, textLen+40, 32), CSM_Select_background ); // select bg
// Link
paint.setPen( link );
paint.drawText( column2+18, 127-20, i18n( "link") );
textLen = paint.fontMetrics().width( i18n("link") );
paint.drawLine( column2+18, 109, column2+18+textLen, 109);
hotspots[ spot++ ] =
HotSpot( TQRect( column2+18, 113-20, textLen, 17 ), CSM_Link );
int column3 = column2 + 25 + textLen;
// Followed Link
paint.setPen( visitedLink );
paint.drawText( column3, 127-20, i18n( "followed link") );
textLen = paint.fontMetrics().width( i18n("followed link") );
paint.drawLine( column3, 109, column3+textLen, 109);
hotspots[ spot++ ] =
HotSpot( TQRect( column3, 113-20, textLen, 17 ), CSM_Followed_Link );
// Button
int xpos = column2;
int ypos = 115 + 2;
textLen = paint.fontMetrics().width(i18n("Push Button"));
hotspots[ spot++ ] =
HotSpot( TQRect(xpos+16, ypos+((28-paint.fontMetrics().height())/2),
textLen, paint.fontMetrics().height()), CSM_Button_text );
hotspots[ spot++ ] =
HotSpot( TQRect(xpos, ypos, textLen+32, 28), CSM_Button_background );
//brush.setColor( button );
TQColorGroup cg2(cg);
cg2.setColor(TQColorGroup::Button, button);
cg2.setColor(TQColorGroup::Background, window);
//qDrawWinButton(&paint, xpos, ypos, textLen+32, 28, cg, false, &brush);
kapp->tqstyle().tqdrawPrimitive(TQStyle::PE_ButtonCommand, &paint,
TQRect(xpos, ypos, textLen+32, 28), cg2, TQStyle::Style_Enabled | TQStyle::Style_Raised);
paint.setPen(buttonTxt);
paint.drawText(xpos, ypos, textLen+32, 28, AlignCenter,
i18n("Push Button"));
// Scrollbar
paint.drawPixmap(width()-55+27-16-2,80+5-2,pm);
// Menu
brush.setColor( back );
int textLenNew, textLenOpen, textLenSave;
textLenNew = paint.fontMetrics().width( i18n("New") );
hotspots[ spot++ ] =
HotSpot( TQRect( 56, 83, textLenNew, 14 ), CSM_Text );
paint.setFont( menuFont );
textLenOpen = paint.fontMetrics().width( i18n("Menu item", "Open") );
hotspots[ spot++ ] =
HotSpot( TQRect( 56, 105, textLenOpen, 14 ), CSM_Text );
paint.setFont( menuFont );
textLenSave = paint.fontMetrics().width( i18n("Menu item", "Save") );
TQPopupMenu *popup = new TQPopupMenu( this );
popup->setFont( menuFont );
popup->setPalette( TQPalette(cg,cg,cg));
popup->insertItem(i18n("New"));
popup->insertItem(i18n("Menu item", "Open"));
int id = popup->insertItem(i18n("Menu item", "Save"));
popup->setItemEnabled( id, false );
// HACK: Force Layouting
//Sad Eagle: tqsizeHint() forces layouting too, and it's a lot less visible
//popup->tqsizeHint(); // Breaks with Qt 3.3
popup->resize(popup->tqsizeHint());
pm = TQPixmap::grabWidget( popup );
delete popup;
bitBlt(&smplw, 30, 80, &pm, 0, 0, pm.width(), pm.height());
hotspots[ spot++ ] =
HotSpot( TQRect( 28, 78, 88, 77 ), CSM_Background );
hotspots[ spot++ ] =
HotSpot( TQRect(25, 80+5-4, width()-7-45-2-16, height()), CSM_Standard_background );
// Valance
qDrawWinPanel ( &paint, 0, 0, width(), height(),
parentWidget()->tqcolorGroup(), TRUE, 0);
// Stop the painting
hotspots[ spot++ ] =
HotSpot( TQRect( 0, 0, width(), height() ), CSM_Background ); // ?
tqrepaint( FALSE );
}