diff options
Diffstat (limited to 'libLumina/LuminaThemes.cpp')
-rw-r--r-- | libLumina/LuminaThemes.cpp | 74 |
1 files changed, 57 insertions, 17 deletions
diff --git a/libLumina/LuminaThemes.cpp b/libLumina/LuminaThemes.cpp index 5100a084..0b328502 100644 --- a/libLumina/LuminaThemes.cpp +++ b/libLumina/LuminaThemes.cpp @@ -9,6 +9,7 @@ #include "LuminaUtils.h" #include "LuminaOS.h" #include <QIcon> +#include <QFont> #include <QDebug> @@ -65,11 +66,15 @@ QStringList LTHEME::availableSystemIcons(){ //returns: [name] for each item } } //Now get all the icon themes in these directories - QStringList themes; + QStringList themes, tmpthemes; QDir dir; for(int i=0; i<paths.length(); i++){ if(dir.cd(paths[i])){ - themes << dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); + tmpthemes = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); + for(int j=0; j<tmpthemes.length(); j++){ + if(tmpthemes[j].startsWith("default")){ continue; } + if(QFile::exists(dir.absoluteFilePath(tmpthemes[j]+"/index.theme")) ){ themes << tmpthemes[j]; } + } } } themes.removeDuplicates(); @@ -77,36 +82,61 @@ QStringList LTHEME::availableSystemIcons(){ //returns: [name] for each item return themes; } - //Return the currently selected Theme/Colors/Icons -QStringList LTHEME::currentSettings(){ //returns [theme path, colorspath, iconsname] - QStringList out; out << "" << "" << ""; +//Save a new theme/color file +bool LTHEME::saveLocalTheme(QString name, QStringList contents){ + QString localdir = QDir::homePath()+"/.lumina/themes/"; + if(!QFile::exists(localdir)){ QDir dir; dir.mkpath(localdir); } + return LUtils::writeFile(localdir+name+".qss.template", contents, true); +} + +bool LTHEME::saveLocalColors(QString name, QStringList contents){ + QString localdir = QDir::homePath()+"/.lumina/colors/"; + if(!QFile::exists(localdir)){ QDir dir; dir.mkpath(localdir); } + return LUtils::writeFile(localdir+name+".qss.colors", contents, true); +} + +//Return the currently selected Theme/Colors/Icons +QStringList LTHEME::currentSettings(){ //returns [theme path, colorspath, iconsname, font, fontsize] + QStringList out; out << "" << "" << "" << "" << ""; QStringList settings = LUtils::readFile(QDir::homePath()+"/.lumina/themesettings.cfg"); for(int i=0; i<settings.length(); i++){ if(settings[i].startsWith("THEMEFILE=")){ out[0] = settings[i].section("=",1,1).simplified(); } else if(settings[i].startsWith("COLORFILE=")){ out[1] = settings[i].section("=",1,1).simplified(); } + else if(settings[i].startsWith("ICONTHEME=")){ out[2] = settings[i].section("=",1,1).simplified(); } + else if(settings[i].startsWith("FONTFAMILY=")){ out[3] = settings[i].section("=",1,1).simplified(); } + else if(settings[i].startsWith("FONTSIZE=")){ out[4] = settings[i].section("=",1,1).simplified(); } } - out[2] = QIcon::themeName(); bool nofile = settings.isEmpty(); - if(out[0].isEmpty()){ out[0] = LOS::LuminaShare()+"themes/SampleTheme.qss.template"; } + if(out[0].isEmpty()){ out[0] = LOS::LuminaShare()+"themes/Lumina-default.qss.template"; } if(out[1].isEmpty()){ out[1] = LOS::LuminaShare()+"colors/SampleColors.qss.colors"; } - if(nofile){ setCurrentSettings(out[0], out[1], out[2]); } + if(out[3].isEmpty()){ out[3] = QFont().defaultFamily(); } + if(out[4].isEmpty()){ + int num = QFont().pointSize(); out[4] = QString::number(num)+"pt"; //Check point size first + if(num<0){ num = QFont().pixelSize(); out[4] = QString::number(num)+"px";} //Now check pixel size + if(num<0){ out[4] = "9pt"; } //Now hard-code a fallback (just in case) + } + if(nofile){ setCurrentSettings(out[0], out[1], out[2], out[3], out[4]); } return out; } //Change the current Theme/Colors/Icons -bool LTHEME::setCurrentSettings(QString themepath, QString colorpath, QString iconname){ +bool LTHEME::setCurrentSettings(QString themepath, QString colorpath, QString iconname, QString font, QString fontsize){ + QIcon::setThemeName(iconname); + //Now save the theme settings file QStringList contents; contents << "THEMEFILE="+themepath; contents << "COLORFILE="+colorpath; contents << "ICONTHEME="+iconname; + contents << "FONTFAMILY="+font; + contents << "FONTSIZE="+fontsize; bool ok = LUtils::writeFile(QDir::homePath()+"/.lumina/themesettings.cfg", contents, true); - QIcon::setThemeName(iconname); + return ok; } //Return the complete stylesheet for a given theme/colors -QString LTHEME::assembleStyleSheet(QString themepath, QString colorpath){ +QString LTHEME::assembleStyleSheet(QString themepath, QString colorpath, QString font, QString fontsize){ QString stylesheet = LUtils::readFile(themepath).join("\n"); QStringList colors = LUtils::readFile(colorpath); //qDebug() << "Found Theme:" << themepath << stylesheet; @@ -124,8 +154,11 @@ QString LTHEME::assembleStyleSheet(QString themepath, QString colorpath){ else if(colors[i].startsWith("BASECOLOR=")){ stylesheet = stylesheet.replace("%%BASECOLOR%%", colors[i].section("=",1,1).simplified()); } else if(colors[i].startsWith("ALTBASECOLOR=")){ stylesheet = stylesheet.replace("%%ALTBASECOLOR%%", colors[i].section("=",1,1).simplified()); } else if(colors[i].startsWith("TEXTCOLOR=")){ stylesheet = stylesheet.replace("%%TEXTCOLOR%%", colors[i].section("=",1,1).simplified()); } + else if(colors[i].startsWith("TEXTDISABLECOLOR=")){ stylesheet = stylesheet.replace("%%TEXTDISABLECOLOR%%", colors[i].section("=",1,1).simplified()); } else if(colors[i].startsWith("TEXTHIGHLIGHTCOLOR=")){ stylesheet = stylesheet.replace("%%TEXTHIGHLIGHTCOLOR%%", colors[i].section("=",1,1).simplified()); } } + stylesheet = stylesheet.replace("%%FONT%%", font); + stylesheet = stylesheet.replace("%%FONTSIZE%%", fontsize); //qDebug() << "Assembled Style Sheet:\n" << stylesheet; return stylesheet; } @@ -135,9 +168,15 @@ QString LTHEME::assembleStyleSheet(QString themepath, QString colorpath){ //================== LuminaThemeEngine::LuminaThemeEngine(QApplication *app){ application=app; //save this pointer for later + //Make sure to prefer font antialiasing on the application + QFont tmp = application->font(); + tmp.setStyleStrategy(QFont::PreferAntialias); + application->setFont(tmp); + // Now load the theme stylesheet QStringList current = LTHEME::currentSettings(); - theme = current[0]; colors=current[1]; icons=current[2]; - application->setStyleSheet( LTHEME::assembleStyleSheet(theme, colors) ); + theme = current[0]; colors=current[1]; icons=current[2]; font=current[3]; fontsize=current[4]; + application->setStyleSheet( LTHEME::assembleStyleSheet(theme, colors, font, fontsize) ); + QIcon::setThemeName(icons); //make sure this sets set within this environment watcher = new QFileSystemWatcher(this); watcher->addPath( QDir::homePath()+"/.lumina/themesettings.cfg" ); connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(watcherChange()) ); @@ -149,12 +188,13 @@ LuminaThemeEngine::~LuminaThemeEngine(){ void LuminaThemeEngine::watcherChange(){ QStringList current = LTHEME::currentSettings(); - if(theme!=current[0] || colors!=current[1]){ - application->setStyleSheet( LTHEME::assembleStyleSheet(current[0], current[1]) ); + if(theme!=current[0] || colors!=current[1] || font!=current[3] || fontsize!=current[4]){ + application->setStyleSheet( LTHEME::assembleStyleSheet(current[0], current[1], current[3], current[4]) ); } - if(icons!=current[3]){ + if(icons!=current[2]){ + QIcon::setThemeName(current[2]); //make sure this sets set within this environment emit updateIcons(); } //Now save this for later checking - theme = current[0]; colors=current[1]; icons=current[2]; + theme = current[0]; colors=current[1]; icons=current[2]; font=current[3]; fontsize=current[4]; } |