//=============================================================================
//
// File : kvi_themeinfo.cpp
// Creation date : Mon Jan 08 2007 03:23:00 CEST by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2007 Szymon Stefanek (pragma at kvirc dot net)
//
// 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 opinion) any later version.
//
// This program is distributed in the HOPE that it will be USEFUL,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, write to the Free Software Foundation,
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================
# define __KVIRC__
# include "kvi_theme.h"
# include "kvi_fileutils.h"
# include "kvi_config.h"
# include "kvi_locale.h"
# include "kvi_miscutils.h"
# include "kvi_sourcesdate.h"
# include <tqimage.h>
# define KVI_THEME_SMALL_SCREENSHOT_NAME "screenshot_small.png"
# define KVI_THEME_MEDIUM_SCREENSHOT_NAME "screenshot_medium.png"
# define KVI_THEME_LARGE_SCREENSHOT_NAME "screenshot.png"
# ifdef COMPILE_USE_QT4
# define TQIMAGE_SCALE_MIN TQt::KeepAspectRatio
# else
# define TQIMAGE_SCALE_MIN TQ_ScaleMin
# endif
KviThemeInfo : : KviThemeInfo ( )
: KviHeapObject ( )
{
}
KviThemeInfo : : ~ KviThemeInfo ( )
{
}
bool KviThemeInfo : : load ( const TQString & szThemeFileName )
{
if ( ! KviFileUtils : : fileExists ( szThemeFileName ) )
{
m_szLastError = __tr2qs ( " The theme information file does not exist " ) ;
return false ;
}
KviConfig cfg ( szThemeFileName , KviConfig : : Read ) ;
cfg . setGroup ( KVI_THEMEINFO_CONFIG_GROUP ) ;
m_szThemeEngineVersion = cfg . readTQStringEntry ( " ThemeEngineVersion " , " 1.0.0 " ) ;
if ( KviMiscUtils : : compareVersions ( m_szThemeEngineVersion , KVI_CURRENT_THEME_ENGINE_VERSION ) < 0 )
{
KviTQString : : sprintf ( m_szLastError , __tr2qs ( " This KVIrc executable is too old for this theme (minimum theme engine version required is %Q while this theme engine has version %s) " ) , & m_szThemeEngineVersion , KVI_CURRENT_THEME_ENGINE_VERSION ) ;
return false ; // incompatible theme engine (will not work)
}
// mandatory fields
m_szName = cfg . readTQStringEntry ( " Name " , " " ) ;
if ( m_szName . isEmpty ( ) )
{
m_szLastError = __tr2qs ( " Theme information file is not valid " ) ;
return false ;
}
// optional fields
m_szVersion = cfg . readTQStringEntry ( " Version " , " " ) ;
if ( m_szVersion . isEmpty ( ) )
m_szVersion = " ?.?.? " ;
m_szAuthor = cfg . readTQStringEntry ( " Author " , " " ) ;
TQString szUnknown = __tr2qs ( " Unknown " ) ;
if ( m_szAuthor . isEmpty ( ) )
m_szAuthor = szUnknown ;
m_szDescription = cfg . readTQStringEntry ( " Description " , " " ) ;
m_szDate = cfg . readTQStringEntry ( " Date " , " " ) ;
if ( m_szDate . isEmpty ( ) )
m_szDate = szUnknown ;
m_szApplication = cfg . readTQStringEntry ( " Application " , " " ) ;
if ( m_szApplication . isEmpty ( ) )
m_szApplication = szUnknown ;
return true ;
}
bool KviThemeInfo : : save ( const TQString & szThemeFileName )
{
KviConfig inf ( szThemeFileName , KviConfig : : Write ) ;
inf . clear ( ) ;
inf . setGroup ( KVI_THEMEINFO_CONFIG_GROUP ) ;
inf . writeEntry ( " Name " , m_szName ) ;
inf . writeEntry ( " Version " , m_szVersion ) ;
inf . writeEntry ( " Author " , m_szAuthor ) ;
inf . writeEntry ( " Description " , m_szDescription ) ;
inf . writeEntry ( " Date " , m_szDate ) ;
inf . writeEntry ( " ThemeEngineVersion " , KVI_CURRENT_THEME_ENGINE_VERSION ) ;
inf . writeEntry ( " Application " , " KVIrc " KVI_VERSION " . " KVI_SOURCES_DATE ) ;
return true ;
}
bool KviThemeInfo : : loadFromDirectory ( const TQString & szThemeDirectory , bool bIgnoreThemeData )
{
TQString szD = szThemeDirectory ;
szD . append ( KVI_PATH_SEPARATOR_CHAR ) ;
szD . append ( KVI_THEMEINFO_FILE_NAME ) ;
if ( ! load ( szD ) )
return false ; // loading failed for some reason
m_szAbsoluteDirectory = szThemeDirectory ;
if ( bIgnoreThemeData )
return true ; // assume success
// check if themedata file exists
szD = szThemeDirectory ;
szD . append ( KVI_PATH_SEPARATOR_CHAR ) ;
szD . append ( KVI_THEMEDATA_FILE_NAME ) ;
return KviFileUtils : : fileExists ( szD ) ;
}
TQString KviThemeInfo : : smallScreenshotPath ( )
{
TQString ret ;
if ( ! m_szAbsoluteDirectory . isEmpty ( ) )
{
ret = m_szAbsoluteDirectory ;
KviTQString : : ensureLastCharIs ( ret , KVI_PATH_SEPARATOR_CHAR ) ;
ret . append ( KVI_THEME_SMALL_SCREENSHOT_NAME ) ;
}
return ret ;
}
const TQPixmap & KviThemeInfo : : smallScreenshot ( )
{
if ( ! m_pixScreenshotSmall . isNull ( ) ) return m_pixScreenshotSmall ;
if ( ! m_szAbsoluteDirectory . isEmpty ( ) )
{
TQString szFileName = m_szAbsoluteDirectory ;
KviTQString : : ensureLastCharIs ( szFileName , KVI_PATH_SEPARATOR_CHAR ) ;
szFileName . append ( KVI_THEME_SMALL_SCREENSHOT_NAME ) ;
TQPixmap pix ( szFileName ) ;
if ( ! pix . isNull ( ) )
{
m_pixScreenshotSmall = pix ;
return m_pixScreenshotSmall ;
}
// try to scale it from the large one (and save it by the way)
pix = mediumScreenshot ( ) ;
if ( pix . isNull ( ) ) return m_pixScreenshotSmall ;
if ( pix . width ( ) > 300 | | pix . height ( ) > 225 )
{
TQImage sbri = pix . convertToImage ( ) ;
pix . convertFromImage ( sbri . smoothScale ( 300 , 225 , TQIMAGE_SCALE_MIN ) ) ;
}
pix . save ( szFileName , " PNG " ) ;
m_pixScreenshotSmall = pix ;
return m_pixScreenshotSmall ;
}
return m_pixScreenshotSmall ;
}
const TQPixmap & KviThemeInfo : : mediumScreenshot ( )
{
if ( ! m_pixScreenshotMedium . isNull ( ) ) return m_pixScreenshotMedium ;
if ( ! m_szAbsoluteDirectory . isEmpty ( ) )
{
TQString szFileName = m_szAbsoluteDirectory ;
KviTQString : : ensureLastCharIs ( szFileName , KVI_PATH_SEPARATOR_CHAR ) ;
szFileName . append ( KVI_THEME_MEDIUM_SCREENSHOT_NAME ) ;
TQPixmap pix ( szFileName ) ;
if ( ! pix . isNull ( ) )
{
m_pixScreenshotMedium = pix ;
return m_pixScreenshotMedium ;
}
// try to scale it from the large one (and save it by the way)
pix = largeScreenshot ( ) ;
if ( pix . isNull ( ) ) return m_pixScreenshotMedium ;
if ( pix . width ( ) > 600 | | pix . height ( ) > 450 )
{
TQImage sbri = pix . convertToImage ( ) ;
pix . convertFromImage ( sbri . smoothScale ( 600 , 450 , TQIMAGE_SCALE_MIN ) ) ;
}
pix . save ( szFileName , " PNG " ) ;
m_pixScreenshotMedium = pix ;
return m_pixScreenshotMedium ;
}
return m_pixScreenshotMedium ;
}
const TQPixmap & KviThemeInfo : : largeScreenshot ( )
{
if ( ! m_pixScreenshotLarge . isNull ( ) ) return m_pixScreenshotLarge ;
if ( ! m_szAbsoluteDirectory . isEmpty ( ) )
{
TQString szFileName = m_szAbsoluteDirectory ;
KviTQString : : ensureLastCharIs ( szFileName , KVI_PATH_SEPARATOR_CHAR ) ;
szFileName . append ( KVI_THEME_LARGE_SCREENSHOT_NAME ) ;
TQPixmap pix ( szFileName ) ;
if ( pix . isNull ( ) ) return m_pixScreenshotLarge ;
m_pixScreenshotLarge = pix ;
}
return m_pixScreenshotLarge ;
}
namespace KviTheme
{
bool saveScreenshots ( KviThemeInfo & options , const TQString & szOriginalScreenshotPath )
{
TQImage pix ( szOriginalScreenshotPath ) ;
if ( pix . isNull ( ) )
{
options . setLastError ( __tr2qs ( " Failed to load the specified screenshot image " ) ) ;
return false ;
}
TQPixmap out ;
TQString szScreenshotFileName = options . absoluteDirectory ( ) ;
if ( szScreenshotFileName . isEmpty ( ) )
{
options . setLastError ( __tr2qs ( " Invalid option " ) ) ;
return false ;
}
KviTQString : : ensureLastCharIs ( szScreenshotFileName , KVI_PATH_SEPARATOR_CHAR ) ;
szScreenshotFileName . append ( KVI_THEME_LARGE_SCREENSHOT_NAME ) ;
if ( ! pix . save ( szScreenshotFileName , " PNG " ) )
{
options . setLastError ( __tr2qs ( " Failed to save the screenshot image " ) ) ;
return false ;
}
if ( pix . width ( ) > 600 | | pix . height ( ) > 450 )
out . convertFromImage ( pix . smoothScale ( 600 , 450 , TQIMAGE_SCALE_MIN ) ) ;
else
out . convertFromImage ( pix ) ;
szScreenshotFileName = options . absoluteDirectory ( ) ;
KviTQString : : ensureLastCharIs ( szScreenshotFileName , KVI_PATH_SEPARATOR_CHAR ) ;
szScreenshotFileName . append ( KVI_THEME_MEDIUM_SCREENSHOT_NAME ) ;
if ( ! out . save ( szScreenshotFileName , " PNG " ) )
{
options . setLastError ( __tr2qs ( " Failed to save the screenshot image " ) ) ;
return false ;
}
if ( pix . width ( ) > 300 | | pix . height ( ) > 225 )
out . convertFromImage ( pix . smoothScale ( 300 , 225 , TQIMAGE_SCALE_MIN ) ) ;
else
out . convertFromImage ( pix ) ;
szScreenshotFileName = options . absoluteDirectory ( ) ;
KviTQString : : ensureLastCharIs ( szScreenshotFileName , KVI_PATH_SEPARATOR_CHAR ) ;
szScreenshotFileName . append ( KVI_THEME_SMALL_SCREENSHOT_NAME ) ;
if ( ! out . save ( szScreenshotFileName , " PNG " ) )
{
options . setLastError ( __tr2qs ( " Failed to save the screenshot image " ) ) ;
return false ;
}
return true ;
}
} ;