|
|
|
/*
|
|
|
|
*
|
|
|
|
* $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"
|