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.
k3b/src/k3bthememanager.cpp

325 lines
7.5 KiB

/*
*
* $Id$
* Copyright (C) 2003 Sebastian Trueg <trueg@k3b.org>
*
* This file is part of the K3b project.
* Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* See the file "COPYING" for the exact licensing terms.
*/
#include "k3bthememanager.h"
#include <k3bversion.h>
#include <kstandarddirs.h>
#include <tdeglobalsettings.h>
#include <ksimpleconfig.h>
#include <kdebug.h>
#include <tdeglobal.h>
#include <tqpixmap.h>
#include <tqfile.h>
#include <tqfileinfo.h>
#include <tqdir.h>
#include <tqstringlist.h>
#include <tqvaluelist.h>
K3bTheme::K3bTheme()
: m_bgMode(BG_TILE)
{
}
TQColor K3bTheme::backgroundColor() const
{
if( m_bgColor.isValid() )
return m_bgColor;
else
return TDEGlobalSettings::activeTitleColor();
}
TQColor K3bTheme::foregroundColor() const
{
if( m_fgColor.isValid() )
return m_fgColor;
else
return TDEGlobalSettings::activeTextColor();
}
const TQPixmap& K3bTheme::pixmap( const TQString& name ) const
{
TQMap<TQString, TQPixmap>::const_iterator it = m_pixmapMap.find( name );
if( it != m_pixmapMap.end() )
return *it;
// try loading the image
if( TQFile::exists( m_path + name ) )
return *m_pixmapMap.insert( name, TQPixmap( m_path + name ) );
kdDebug() << "(K3bTheme) " << m_name << ": could not load image " << name << endl;
return m_emptyPixmap;
}
const TQPixmap& K3bTheme::pixmap( K3bTheme::PixmapType t ) const
{
return pixmap( filenameForPixmapType( t ) );
}
TQString K3bTheme::filenameForPixmapType( PixmapType t )
{
TQString name;
switch( t ) {
case MEDIA_AUDIO:
name = "media_audio";
break;
case MEDIA_DATA:
name = "media_data";
break;
case MEDIA_VIDEO:
name = "media_video";
break;
case MEDIA_EMPTY:
name = "media_empty";
break;
case MEDIA_MIXED:
name = "media_mixed";
break;
case MEDIA_NONE:
name = "media_none";
break;
case MEDIA_LEFT:
name = "media_left";
break;
case PROGRESS_WORKING:
name = "progress_working";
break;
case PROGRESS_SUCCESS:
name = "progress_success";
break;
case PROGRESS_FAIL:
name = "progress_fail";
break;
case PROGRESS_RIGHT:
name = "progress_right";
break;
case DIALOG_LEFT:
name = "dialog_left";
break;
case DIALOG_RIGHT:
name = "dialog_right";
break;
case SPLASH:
name = "splash";
break;
case PROJECT_LEFT:
name = "project_left";
break;
case PROJECT_RIGHT:
name = "project_right";
break;
case WELCOME_BG:
name = "welcome_bg";
break;
default:
break;
}
name.append( ".png" );
return name;
}
K3bTheme::BackgroundMode K3bTheme::backgroundMode() const
{
return m_bgMode;
}
class K3bThemeManager::Private
{
public:
Private()
: currentTheme(&emptyTheme) {
}
TQValueList<K3bTheme*> themes;
K3bTheme* currentTheme;
TQString currentThemeName;
K3bTheme emptyTheme;
};
K3bThemeManager::K3bThemeManager( TQObject* parent, const char* name )
: TQObject( parent, name )
{
d = new Private();
d->emptyTheme.m_name = "Empty Theme";
}
K3bThemeManager::~K3bThemeManager()
{
delete d;
}
const TQValueList<K3bTheme*>& K3bThemeManager::themes() const
{
return d->themes;
}
K3bTheme* K3bThemeManager::currentTheme() const
{
return d->currentTheme;
}
void K3bThemeManager::readConfig( TDEConfigBase* c )
{
TDEConfigGroup generalOptions( c, "General Options" );
// allow to override the default theme by packaging a default config file
TQString defaultTheme = generalOptions.readEntry( "default theme", "quant" );
K3bVersion configVersion( generalOptions.readEntry( "config version", "0.1" ) );
if( configVersion >= K3bVersion("0.98") )
setCurrentTheme( generalOptions.readEntry( "current theme", defaultTheme ) );
else
setCurrentTheme( defaultTheme );
}
void K3bThemeManager::saveConfig( TDEConfigBase* c )
{
if( !d->currentThemeName.isEmpty() )
TDEConfigGroup( c, "General Options" ).writeEntry( "current theme", d->currentThemeName );
}
void K3bThemeManager::setCurrentTheme( const TQString& name )
{
if( name != d->currentThemeName ) {
if( K3bTheme* theme = findTheme( name ) )
setCurrentTheme( theme );
}
}
void K3bThemeManager::setCurrentTheme( K3bTheme* theme )
{
if( !theme )
theme = d->themes.first();
if( theme ) {
if( theme != d->currentTheme ) {
d->currentTheme = theme;
d->currentThemeName = theme->name();
emit themeChanged();
emit themeChanged( theme );
}
}
}
K3bTheme* K3bThemeManager::findTheme( const TQString& name ) const
{
for( TQValueList<K3bTheme*>::iterator it = d->themes.begin(); it != d->themes.end(); ++it )
if( (*it)->name() == name )
return *it;
return 0;
}
void K3bThemeManager::loadThemes()
{
// first we cleanup the loaded themes
for( TQValueList<K3bTheme*>::iterator it = d->themes.begin(); it != d->themes.end(); ++it )
delete *it;
d->themes.clear();
TQStringList dirs = TDEGlobal::dirs()->findDirs( "data", "k3b/pics" );
// now search for themes. As there may be multiple themes with the same name
// we only use the names from this list and then use findResourceDir to make sure
// the local is preferred over the global stuff (like testing a theme by copying it
// to the .kde dir)
TQStringList themeNames;
for( TQStringList::const_iterator dirIt = dirs.begin(); dirIt != dirs.end(); ++dirIt ) {
TQDir dir( *dirIt );
TQStringList entries = dir.entryList( TQDir::Dirs );
entries.remove( "." );
entries.remove( ".." );
// every theme dir needs to contain a k3b.theme file
for( TQStringList::const_iterator entryIt = entries.begin(); entryIt != entries.end(); ++entryIt ) {
TQString themeDir = *dirIt + *entryIt + "/";
if( !themeNames.contains( *entryIt ) && TQFile::exists( themeDir + "k3b.theme" ) ) {
bool themeValid = true;
// check for all nessessary pixmaps (this is a little evil hacking)
for( int i = 0; i <= K3bTheme::WELCOME_BG; ++i ) {
if( !TQFile::exists( themeDir + K3bTheme::filenameForPixmapType( (K3bTheme::PixmapType)i ) ) ) {
kdDebug() << "(K3bThemeManager) theme misses pixmap: " << K3bTheme::filenameForPixmapType( (K3bTheme::PixmapType)i ) << endl;
themeValid = false;
break;
}
}
if( themeValid )
themeNames.append( *entryIt );
}
}
}
// now load the themes
for( TQStringList::const_iterator themeIt = themeNames.begin(); themeIt != themeNames.end(); ++themeIt )
loadTheme( *themeIt );
// load the current theme
setCurrentTheme( findTheme(d->currentThemeName) );
}
void K3bThemeManager::loadTheme( const TQString& name )
{
TQString path = TDEGlobal::dirs()->findResource( "data", "k3b/pics/" + name + "/k3b.theme" );
if( !path.isEmpty() ) {
K3bTheme* t = new K3bTheme();
t->m_name = name;
t->m_path = path.left( path.length() - 9 );
TQFileInfo fi( t->m_path );
t->m_local = fi.isWritable();
// load the stuff
KSimpleConfig cfg( path, true );
t->m_author = cfg.readEntry( "Author" );
t->m_comment = cfg.readEntry( "Comment" );
t->m_version = cfg.readEntry( "Version" );
t->m_bgColor = cfg.readColorEntry( "Backgroundcolor" );
t->m_fgColor = cfg.readColorEntry( "Foregroundcolor" );
t->m_bgMode = ( cfg.readEntry( "BackgroundMode" ) == "Scaled" ? K3bTheme::BG_SCALE : K3bTheme::BG_TILE );
d->themes.append( t );
}
}
#include "k3bthememanager.moc"