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.
tdeartwork/tdescreensaver/kdesavers/banner.cpp

510 lines
13 KiB

//-----------------------------------------------------------------------------
//
// kbanner - Basic screen saver for TDE
//
// Copyright (c) Martin R. Jones 1996
//
// layout management added 1998/04/19 by Mario Weilguni <mweilguni@kde.org>
// clock function and color cycling added 2000/01/09 by Alexander Neundorf <alexander.neundorf@rz.tu-ilmenau.de>
// 2001/03/04 Converted to use libtdescreensaver by Martin R. Jones
// 2002/04/07 Added random vertical position of text,
// changed horizontal step size to reduce jerkyness,
// text will return to right margin immediately (and not be drawn half a screen width off-screen)
// Harald H.-J. Bongartz <harald@bongartz.org>
// 2003/09/06 Converted to use KDialogBase - Nadeem Hasan <nhasan@kde.org>
#include <stdlib.h>
#include <tqlabel.h>
#include <tqlineedit.h>
#include <tqcombobox.h>
#include <tqcheckbox.h>
#include <tqgroupbox.h>
#include <tqslider.h>
#include <tqlayout.h>
#include <tqdatetime.h>
#include <tqfontdatabase.h>
#include <tqpainter.h>
#include <tdeapplication.h>
#include <krandomsequence.h>
#include <tdeglobal.h>
#include <tdelocale.h>
#include <tdeconfig.h>
#include <tdemessagebox.h>
#include <kcolorbutton.h>
#include <tdefontcombo.h>
#include "banner.h"
#include "banner.moc"
// libtdescreensaver interface
extern "C"
{
TDE_EXPORT const char *kss_applicationName = "kbanner.kss";
TDE_EXPORT const char *kss_description = I18N_NOOP( "KBanner" );
TDE_EXPORT const char *kss_version = "2.2.0";
TDE_EXPORT KScreenSaver *kss_create( WId id )
{
return new KBannerSaver( id );
}
TDE_EXPORT TQDialog *kss_setup()
{
return new KBannerSetup();
}
}
//-----------------------------------------------------------------------------
KBannerSetup::KBannerSetup( TQWidget *parent, const char *name )
: KDialogBase( parent, name, true, i18n( "Setup Banner Screen Saver" ),
Ok|Cancel|Help, Ok, true ), saver( 0 ), ed(0), speed( 50 )
{
setButtonText( Help, i18n( "A&bout" ) );
readSettings();
TQWidget *main = makeMainWidget();
TQLabel *label;
TQVBoxLayout *tl = new TQVBoxLayout(main, 0, spacingHint());
TQHBoxLayout *tl1 = new TQHBoxLayout( 0, 0, spacingHint() );
tl->addLayout(tl1);
TQVBoxLayout *tl11 = new TQVBoxLayout( 0, 0, spacingHint() );
tl1->addLayout(tl11);
TQGroupBox *group = new TQGroupBox( 0,TQt::Vertical, i18n("Font"), main );
TQGridLayout *gl = new TQGridLayout(group->layout(), 6, 2, spacingHint() );
label = new TQLabel( i18n("Family:"), group );
gl->addWidget(label, 1, 0);
TDEFontCombo* comboFonts = new TDEFontCombo( TQFontDatabase().families(), group );
comboFonts->setCurrentFont( fontFamily );
gl->addWidget(comboFonts, 1, 1);
connect( comboFonts, TQ_SIGNAL( activated( const TQString& ) ),
TQ_SLOT( slotFamily( const TQString& ) ) );
label = new TQLabel( i18n("Size:"), group );
gl->addWidget(label, 2, 0);
comboSizes = new TQComboBox( TRUE, group );
fillFontSizes();
gl->addWidget(comboSizes, 2, 1);
connect( comboSizes, TQ_SIGNAL( activated( int ) ), TQ_SLOT( slotSize( int ) ) );
connect( comboSizes, TQ_SIGNAL( textChanged( const TQString & ) ),
TQ_SLOT( slotSizeEdit( const TQString & ) ) );
TQCheckBox *cb = new TQCheckBox( i18n("Bold"),
group );
cb->setChecked( bold );
connect( cb, TQ_SIGNAL( toggled( bool ) ), TQ_SLOT( slotBold( bool ) ) );
gl->addWidget(cb, 3, 0);
cb = new TQCheckBox( i18n("Italic"), group );
cb->setChecked( italic );
gl->addWidget(cb, 3, 1);
connect( cb, TQ_SIGNAL( toggled( bool ) ), TQ_SLOT( slotItalic( bool ) ) );
label = new TQLabel( i18n("Color:"), group );
gl->addWidget(label, 4, 0);
colorPush = new KColorButton( fontColor, group );
gl->addWidget(colorPush, 4, 1);
connect( colorPush, TQ_SIGNAL( changed(const TQColor &) ),
TQ_SLOT( slotColor(const TQColor &) ) );
TQCheckBox *cyclingColorCb=new TQCheckBox(i18n("Cycling color"),group);
cyclingColorCb->setMinimumSize(cyclingColorCb->sizeHint());
gl->addMultiCellWidget(cyclingColorCb,5,5,0,1);
connect(cyclingColorCb,TQ_SIGNAL(toggled(bool)),this,TQ_SLOT(slotCyclingColor(bool)));
cyclingColorCb->setChecked(cyclingColor);
preview = new TQWidget( main );
preview->setFixedSize( 220, 170 );
preview->setBackgroundColor( black );
preview->show(); // otherwise saver does not get correct size
saver = new KBannerSaver( preview->winId() );
tl1->addWidget(preview);
tl11->addWidget(group);
label = new TQLabel( i18n("Speed:"), main );
tl11->addStretch(1);
tl11->addWidget(label);
TQSlider *sb = new TQSlider(0, 100, 10, speed, TQt::Horizontal, main );
sb->setMinimumWidth( 180);
sb->setFixedHeight(20);
sb->setTickmarks(TQSlider::Below);
sb->setTickInterval(10);
tl11->addWidget(sb);
connect( sb, TQ_SIGNAL( valueChanged( int ) ), TQ_SLOT( slotSpeed( int ) ) );
TQHBoxLayout *tl2 = new TQHBoxLayout;
tl->addLayout(tl2);
label = new TQLabel( i18n("Message:"), main );
tl2->addWidget(label);
ed = new TQLineEdit( main );
tl2->addWidget(ed);
ed->setText( message );
connect( ed, TQ_SIGNAL( textChanged( const TQString & ) ),
TQ_SLOT( slotMessage( const TQString & ) ) );
TQCheckBox *timeCb=new TQCheckBox( i18n("Show current time"), main);
timeCb->setFixedSize(timeCb->sizeHint());
tl->addWidget(timeCb,0,TQt::AlignLeft);
connect(timeCb,TQ_SIGNAL(toggled(bool)),this,TQ_SLOT(slotTimeToggled(bool)));
timeCb->setChecked(showTime);
tl->addStretch();
}
// read settings from config file
void KBannerSetup::readSettings()
{
TDEConfig *config = TDEGlobal::config();
config->setGroup( "Settings" );
speed=config->readNumEntry("Speed",50);
/* if ( speed > 100 )
speed = 100;
else if ( speed < 50 )
speed = 50;*/
message=config->readEntry("Message","TDE");
showTime=config->readBoolEntry("ShowTime",FALSE);
fontFamily=config->readEntry("FontFamily",(TQApplication::font()).family());
fontSize=config->readNumEntry("FontSize",48);
fontColor.setNamedColor(config->readEntry("FontColor","red"));
cyclingColor=config->readBoolEntry("CyclingColor",FALSE);
bold=config->readBoolEntry("FontBold",FALSE);
italic=config->readBoolEntry("FontItalic",FALSE);
}
void KBannerSetup::fillFontSizes()
{
bool block = comboSizes->signalsBlocked();
comboSizes->blockSignals( true );
comboSizes->clear();
int i = 0;
sizes = TQFontDatabase().pointSizes( fontFamily );
sizes << 96 << 128 << 156 << 0;
int current = 0;
while ( sizes[i] )
{
TQString num;
num.setNum( sizes[i] );
comboSizes->insertItem( num, i );
if ( fontSize == sizes[i] ) // fontsize equals one of the defined ones
{
current = i;
comboSizes->setCurrentItem( current );
slotSize( current );
}
i++;
}
if ( current == 0 ) // fontsize seems to be entered by hand
{
TQString fsize;
fsize.setNum( fontSize );
comboSizes->setEditText(fsize);
slotSizeEdit( fsize );
}
comboSizes->blockSignals( block );
}
void KBannerSetup::slotFamily( const TQString& fam )
{
fontFamily = fam;
fillFontSizes(); // different font, different sizes
if ( saver )
saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
}
void KBannerSetup::slotSize( int indx )
{
fontSize = sizes[indx];
if ( saver )
saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
}
void KBannerSetup::slotSizeEdit( const TQString& fs )
{
bool ok;
fontSize = fs.toInt( &ok, 10 );
if ( ok )
if ( saver )
saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
}
void KBannerSetup::slotColor( const TQColor &col )
{
fontColor = col;
if ( saver )
saver->setColor(fontColor);
}
void KBannerSetup::slotCyclingColor(bool on)
{
colorPush->setEnabled(!on);
cyclingColor=on;
if ( saver )
{
saver->setCyclingColor( on );
if ( !on )
saver->setColor( fontColor );
}
}
void KBannerSetup::slotBold( bool state )
{
bold = state;
if ( saver )
saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
}
void KBannerSetup::slotItalic( bool state )
{
italic = state;
if ( saver )
saver->setFont( fontFamily, fontSize, fontColor, bold, italic );
}
void KBannerSetup::slotSpeed( int num )
{
speed = num;
if ( saver )
saver->setSpeed( speed );
}
void KBannerSetup::slotMessage( const TQString &msg )
{
message = msg;
if ( saver )
saver->setMessage( message );
}
void KBannerSetup::slotTimeToggled( bool on )
{
ed->setEnabled(!on);
showTime=on;
if (saver)
{
if (showTime)
saver->setTimeDisplay();
else
{
message=ed->text();
saver->setMessage(message);
};
};
}
// Ok pressed - save settings and exit
void KBannerSetup::slotOk()
{
TDEConfig *config = TDEGlobal::config();
config->setGroup( "Settings" );
config->writeEntry( "Speed", speed );
config->writeEntry( "Message", message );
config->writeEntry( "ShowTime", showTime );
config->writeEntry( "FontFamily", fontFamily );
TQString fsize;
if (fontSize == 0) // an non-number was entered in the font size combo
{
fontSize = 48;
}
fsize.setNum( fontSize );
config->writeEntry( "FontSize", fsize );
TQString colName;
colName.sprintf( "#%02x%02x%02x", fontColor.red(), fontColor.green(),
fontColor.blue() );
config->writeEntry( "FontColor", colName );
config->writeEntry( "CyclingColor", cyclingColor );
config->writeEntry( "FontBold", bold );
config->writeEntry( "FontItalic", italic );
config->sync();
accept();
}
void KBannerSetup::slotHelp()
{
KMessageBox::about(this,
i18n("Banner Version 2.2.1\n\nWritten by Martin R. Jones 1996\nmjones@kde.org\nExtended by Alexander Neundorf 2000\nalexander.neundorf@rz.tu-ilmenau.de\n"));
}
//-----------------------------------------------------------------------------
KBannerSaver::KBannerSaver( WId id ) : KScreenSaver( id )
{
krnd = new KRandomSequence();
readSettings();
initialize();
colorContext = TQColor::enterAllocContext();
needBlank = TRUE;
timer.start( speed );
connect( &timer, TQ_SIGNAL( timeout() ), TQ_SLOT( slotTimeout() ) );
}
KBannerSaver::~KBannerSaver()
{
timer.stop();
TQColor::leaveAllocContext();
TQColor::destroyAllocContext( colorContext );
delete krnd;
}
void KBannerSaver::setSpeed( int spd )
{
timer.stop();
int inv = 100 - spd;
speed = 1 + ((inv * inv) / 100);
timer.start( speed );
}
void KBannerSaver::setFont( const TQString& family, int size, const TQColor &color,
bool b, bool i )
{
fontFamily = family;
fontSize = size;
fontColor = color;
bold = b;
italic = i;
initialize();
}
void KBannerSaver::setColor(TQColor &color)
{
fontColor = color;
cyclingColor = FALSE;
needUpdate = TRUE;
}
void KBannerSaver::setCyclingColor( bool on )
{
cyclingColor = on;
needUpdate = TRUE;
}
void KBannerSaver::setMessage( const TQString &msg )
{
showTime = FALSE;
message = msg;
pixmapSize = TQSize();
needBlank = TRUE;
}
void KBannerSaver::setTimeDisplay()
{
showTime = TRUE;
pixmapSize = TQSize();
needBlank = TRUE;
}
// read settings from config file
void KBannerSaver::readSettings()
{
TDEConfig *config = TDEGlobal::config();
config->setGroup( "Settings" );
setSpeed( config->readNumEntry("Speed",50) );
message=config->readEntry("Message","TDE");
showTime=config->readBoolEntry("ShowTime",FALSE);
fontFamily=config->readEntry("FontFamily",(TQApplication::font()).family());
fontSize=config->readNumEntry("FontSize",48);
fontColor.setNamedColor(config->readEntry("FontColor","red"));
cyclingColor=config->readBoolEntry("CyclingColor",FALSE);
bold=config->readBoolEntry("FontBold",FALSE);
italic=config->readBoolEntry("FontItalic",FALSE);
if ( cyclingColor )
{
currentHue=0;
fontColor.setHsv(0,SATURATION,VALUE);
}
}
// initialize font
void KBannerSaver::initialize()
{
fsize = fontSize * height() / TQApplication::desktop()->height();
font = TQFont( fontFamily, fsize, bold ? TQFont::Bold : TQFont::Normal, italic );
pixmapSize = TQSize();
needBlank = TRUE;
xpos = width();
ypos = fsize + (int) ((double)(height()-fsize)*krnd->getDouble());
step = 2 * width() / TQApplication::desktop()->width(); // 6 -> 2 -hhjb-
if ( step == 0 )
step = 1;
}
// erase old text and draw in new position
void KBannerSaver::slotTimeout()
{
if (cyclingColor)
{
int hueStep = speed/10;
currentHue=(currentHue+hueStep)%360;
fontColor.setHsv(currentHue,SATURATION,VALUE);
}
if (showTime)
{
TQString new_message = TDEGlobal::locale()->formatTime(TQTime::currentTime(), true);
if( new_message != message )
needUpdate = TRUE;
message = new_message;
}
if ( !pixmapSize.isValid() || cyclingColor || needUpdate || needBlank )
{
TQRect rect = TQFontMetrics( font ).boundingRect( message );
rect.setWidth( rect.width() + step );
if ( rect.width() > pixmapSize.width() )
pixmapSize.setWidth( rect.width() );
if ( rect.height() > pixmapSize.height() )
pixmapSize.setHeight( rect.height() );
pixmap = TQPixmap( pixmapSize );
pixmap.fill( black );
TQPainter p( &pixmap );
p.setFont( font );
p.setPen( fontColor );
p.drawText( -rect.x(), -rect.y(), message );
needUpdate = FALSE;
}
xpos -= step;
if ( xpos < -pixmapSize.width() ) {
TQPainter p( this );
p.fillRect( xpos + step, ypos, pixmapSize.width(), pixmapSize.height(), black );
xpos = width();
ypos = fsize + (int) ((double)(height()-2.0*fsize)*krnd->getDouble());
}
if ( needBlank )
{
setBackgroundColor( black );
erase();
needBlank = FALSE;
}
bitBlt( this, xpos, ypos, &pixmap, 0, 0, pixmapSize.width(), pixmapSize.height());
}