diff options
Diffstat (limited to 'kweather/weather_icon.cpp')
-rw-r--r-- | kweather/weather_icon.cpp | 443 |
1 files changed, 443 insertions, 0 deletions
diff --git a/kweather/weather_icon.cpp b/kweather/weather_icon.cpp new file mode 100644 index 0000000..1100ded --- /dev/null +++ b/kweather/weather_icon.cpp @@ -0,0 +1,443 @@ +#include <tqpair.h> + +#include <tdestandarddirs.h> +#include <kiconloader.h> +#include <kdebug.h> + +#include "weather_icon.h" + +WeatherIconPrivate* WeatherIconPrivate::s_instance = 0; + +WeatherIconPrivate::WeatherIconPrivate() +{ + iconLoader = new TDEIconLoader("kweather"); +} + +WeatherIconPrivate::~WeatherIconPrivate() +{ + delete iconLoader; +} + +WeatherIconPrivate* WeatherIconPrivate::instance() +{ + if ( s_instance == 0 ) + s_instance = new WeatherIconPrivate(); + + return s_instance; +} + +void WeatherIconPrivate::useIconTheme( bool use ) +{ + m_useIconTheme = use; +} + +bool WeatherIconPrivate::usingIconTheme() +{ + return m_useIconTheme; +} + +/** Returns the name of the best matching icon, either from the icon theme or the KWeather icons */ +struct WeatherSingleIconData WeatherIconPrivate::findIcon(TQStringList fallback, uint size) +{ + struct WeatherSingleIconData iconData; + + kdDebug(12006) << "[findIcon] Use icon theme? " << m_useIconTheme << endl; + if (m_useIconTheme) + { + // Check in theme + for (TQStringList::Iterator icon = fallback.begin(); icon != fallback.end(); ++icon) + { + kdDebug(12006) << "[findIcon] Searching for `" << *icon << "` in theme" << endl; + TQString iPath = iconPath(*icon, size, true); + if (!iPath.isNull()) + { + kdDebug(12006) << "[findIcon] Found `" << *icon << "` in theme: " << iPath << endl; + iconData = { *icon, iPath, true, size }; + return iconData; + } + } + } + + // Check in kweather fallback + for (TQStringList::Iterator icon = fallback.begin(); icon != fallback.end(); ++icon) + { + kdDebug(12006) << "[findIcon] Searching for `" << *icon << "` in kweather icons" << endl; + TQString iPath = iconPath(*icon, size, false); + if (!iPath.isEmpty()) + { + kdDebug(12006) << "[findIcon] Found `" << *icon << "` in kweather icons: " << iPath << endl; + iconData = { *icon, iPath, false, size }; + return iconData; + } + } + + return WeatherIcon::unknown(size); +} + +TQString WeatherIconPrivate::iconPath( TQString icon, uint size, bool inTheme ) +{ + TQString path = TQString::null; + if (inTheme) { + path = iconLoader->iconPath(icon, size, true); + if (path.isEmpty()) { + // maybe there is a scalable icon? + path = iconLoader->iconPath(icon, 0, true); + } + } + else { + path = locate( "data", "kweather/" + icon + ".png" ); + } + return path; +} + +TQString WeatherIconPrivate::iconPath( TQString icon, uint size ) +{ + return iconPath(icon, size, m_useIconTheme); +} + +WeatherIcon::WeatherIcon( int condition, bool night ) +{ + switch( condition ) + { + case Sunny: + { + if( night ) + { + fallback << "weather-clear-night"; //xdg, kweather + } + fallback << "weather-clear"; // xdg, kweather + break; + } + + case Fog: + { + if( night ) + { + fallback << "weather-fog-night"; // themes, kweather + } + fallback << "weather-fog"; // xdg, kweather + break; + } + + case Mist: + { + if( night ) + { + fallback << "weather-mist-night"; // themes, kweather + } + fallback << "weather-mist"; // themes, kweather + + if( night ) + { + fallback << "weather-fog-night"; // themes, kweather + } + fallback << "weather-fog"; // xdg, kweather + break; + } + + case Overcast: + { + fallback << "weather-overcast"; // xdg, kweather + break; + } + + case Hail: + { + fallback << "weather-hail"; // themes + fallback << "weather-freezing-rain"; // themes, kweather + fallback << "weather-snow"; // xdg, kweather + break; + } + + case LightRain: + { + fallback << "weather-showers-scattered"; // xdg, kweather + break; + } + + case Sleet: + { + fallback << "weather-snow-rain"; // themes, kweather + fallback << "weather-snow"; // xdg, kweather + break; + } + } +} + +WeatherIcon::WeatherIcon( int condition, bool night, unsigned int strength ) +{ + switch ( condition ) + { + case Cloudy: + { + switch ( strength ) + { + case 1: + { + if( night ) + { + fallback << "weather-few-clouds-night"; // xdg, kweather + } + fallback << "weather-few-clouds"; // xdg, kweather + break; + } + + case 2: + { + if( night ) + { + fallback << "weather-moderate-clouds-night"; // kweather + } + fallback << "weather-moderate-clouds"; // kweather + + if( night ) + { + fallback << "weather-few-clouds-night"; // xdg, kweather + } + fallback << "weather-few-clouds"; // xdg, kweather + break; + } + + case 3: { + if( night ) + { + fallback << "weather-clouds-night"; // themes, kweather + } + fallback << "weather-clouds"; // themes, kweather + + if( night ) + { + fallback << "weather-few-clouds-night"; // xdg, kweather + } + fallback << "weather-few-clouds"; // xdg, kweather + break; + } + + case 4: + { + if( night ) + { + fallback << "weather-ample-clouds-night"; // kweather + } + fallback << "weather-ample-clouds"; // kweather + fallback << "weather-many-clouds"; // themes, kweather + fallback << "weather-overcast"; // xdg, kweather + break; + } + + case 5: { + fallback << "weather-many-clouds"; // themes, kweather + fallback << "weather-overcast"; // xdg, kweather + break; + } + + default: { + fallback << "weather-clouds"; // themes, kweather + fallback << "weather-few-clouds"; // xdg, kweather + break; + } + } + break; + } + + case Showers: + { + switch ( strength ) + { + case 1: + { + if( night ) + { + fallback << "weather-showers-scattered-night"; // themes, kweather + } + else + { + fallback << "weather-showers-scattered-day"; // themes, kweather + } + fallback << "weather-showers-scattered"; // xdg, kweather + break; + } + + case 2: + { + if( night ) + { + fallback << "weather-showers-night"; // themes, kweather + } + else + { + fallback << "weather-showers-day"; // themes, kweather + } + fallback << "weather-showers"; // xdg, kweather + break; + } + + case 3: + default: + { + fallback << "weather-showers"; // xdg, kweather + break; + } + } + + break; + } + + case Snow: + { + switch( strength ) + { + case 1: + { + if( night ) + { + fallback << "weather-snow-scattered-night"; // themes, kweather + } + else + { + fallback << "weather-snow-scattered-day"; // themes, kweather + } + + fallback << "weather-snow-scattered"; // xdg, kweather + fallback << "weather-snow"; // workaround for some themes + break; + } + case 2: + { + if( night ) + { + fallback << "weather-snow-moderate-night"; // kweather + } + else + { + fallback << "weather-snow-moderate-day"; // kweather + } + + fallback << "weather-snow-moderate"; // kweather + + if( night ) + { + fallback << "weather-snow-scattered-night"; // themes, kweather + } + else + { + fallback << "weather-snow-scattered-day"; // themes, kweather + } + + fallback << "weather-snow-scattered"; // xdg, kweather + fallback << "weather-snow"; // workaround for some themes + break; + } + + case 3: + { + if( night ) + { + fallback << "weather-snow-ample-night"; // kweather + } + else + { + fallback << "weather-snow-ample-day"; // kweather + } + fallback << "weather-snow-ample"; // kweather + fallback << "weather-snow"; // xdg, kweather + break; + } + + case 4: + { + fallback << "weather-snow-scattered"; // xdg, kweather + fallback << "weather-snow"; // workaround for some themes + break; + } + + case 5: + default: + { + fallback << "weather-snow"; // xdg, kweather + break; + } + } + + break; + } + + case Thunderstorm: + switch ( strength ) + { + case 1: + { + if( night ) + { + fallback << "weather-storm-night"; // themes, kweather + } + else + { + fallback << "weather-storm-day"; // themes, kweather + } + fallback << "weather-storm"; // xdg, kweather + break; + } + + case 2: + { + if( night ) + { + fallback << "weather-storm-moderate-night"; // kweather + } + else + { + fallback << "weather-storm-moderate-day"; // kweather + } + fallback << "weather-storm-moderate"; // kweather + + if( night ) + { + fallback << "weather-storm-night"; // themes, kweather + } + else + { + fallback << "weather-storm-day"; // themes, kweather + } + fallback << "weather-storm"; // xdg, kweather + break; + } + case 3: + default: + { + fallback << "weather-storm"; // xdg, kweather + break; + } + } + break; + } +} + +// Unknown weather conditions +WeatherIcon::WeatherIcon() { + fallback << "weather-none-available"; +} + +WeatherIcon::~WeatherIcon() +{ +} + +struct WeatherSingleIconData WeatherIcon::iconData(uint size) { + return WeatherIconPrivate::instance()->findIcon(fallback, size); +} + +struct WeatherSingleIconData WeatherIcon::unknown(uint size) { + WeatherIcon *unknown = new WeatherIcon(); + struct WeatherSingleIconData unknownData = unknown->iconData(size); + delete unknown; + return unknownData; +} + +// convenience functions +TQString WeatherIcon::name(uint size) { + return iconData(size).name; +} + +TQString WeatherIcon::path(uint size) { + return iconData(size).path; +}
\ No newline at end of file |