aboutsummaryrefslogtreecommitdiff
path: root/libLumina
diff options
context:
space:
mode:
authorKen Moore <ken@pcbsd.org>2014-10-06 17:49:31 -0400
committerKen Moore <ken@pcbsd.org>2014-10-06 17:49:31 -0400
commit9a7d82954a8e77ca72a9d0b995ec5c0160e6018c (patch)
tree0ecacf8b0510e4330bd368af86459709857eed9d /libLumina
parentClean up the new global.h usage in all the Lumina subprojects. (diff)
downloadlumina-9a7d82954a8e77ca72a9d0b995ec5c0160e6018c.tar.gz
lumina-9a7d82954a8e77ca72a9d0b995ec5c0160e6018c.tar.bz2
lumina-9a7d82954a8e77ca72a9d0b995ec5c0160e6018c.zip
Get the new LuminaThemes class working with a sample color theme for Insight (for testing). The theme loading/usage appears to be working, now I just need to generalize the theme template so that it applies to all the QAbstract* widgets
Diffstat (limited to 'libLumina')
-rw-r--r--libLumina/LuminaThemes.cpp84
-rw-r--r--libLumina/LuminaThemes.h1
-rw-r--r--libLumina/LuminaUtils.cpp2
-rw-r--r--libLumina/colors/SampleColors.qss.colors12
-rw-r--r--libLumina/libLumina.pro11
-rw-r--r--libLumina/themes/SampleTheme.qss.template64
6 files changed, 160 insertions, 14 deletions
diff --git a/libLumina/LuminaThemes.cpp b/libLumina/LuminaThemes.cpp
index 0ec46c67..5100a084 100644
--- a/libLumina/LuminaThemes.cpp
+++ b/libLumina/LuminaThemes.cpp
@@ -8,11 +8,14 @@
#include "LuminaUtils.h"
#include "LuminaOS.h"
+#include <QIcon>
+#include <QDebug>
+
QStringList LTHEME::availableSystemThemes(){
//returns: [name::::path] for each item
QDir dir(LOS::LuminaShare()+"themes");
- QStringList list = dir.entryList(QStringList() <<"*.qss.template", QDir::Files, QDir::Name());
+ QStringList list = dir.entryList(QStringList() <<"*.qss.template", QDir::Files, QDir::Name);
for(int i=0; i<list.length(); i++){
//Format the output entry [<name>::::<fullpath>]
list[i] = list[i].section(".qss.",0,0)+"::::"+dir.absoluteFilePath(list[i]);
@@ -22,7 +25,7 @@ QStringList LTHEME::availableSystemThemes(){
QStringList LTHEME::availableLocalThemes(){ //returns: [name::::path] for each item
QDir dir(QDir::homePath()+"/.lumina/themes");
- QStringList list = dir.entryList(QStringList() <<"*.qss.template", QDir::Files, QDir::Name());
+ QStringList list = dir.entryList(QStringList() <<"*.qss.template", QDir::Files, QDir::Name);
for(int i=0; i<list.length(); i++){
//Format the output entry [<name>::::<fullpath>]
list[i] = list[i].section(".qss.",0,0)+"::::"+dir.absoluteFilePath(list[i]);
@@ -33,7 +36,7 @@ QStringList LTHEME::availableLocalThemes(){ //returns: [name::::path] for each i
QStringList LTHEME::availableSystemColors(){ //returns: [name::::path] for each item
//returns: [name::::path] for each item
QDir dir(LOS::LuminaShare()+"colors");
- QStringList list = dir.entryList(QStringList() <<"*.qss.colortemplate", QDir::Files, QDir::Name());
+ QStringList list = dir.entryList(QStringList() <<"*.qss.colors", QDir::Files, QDir::Name);
for(int i=0; i<list.length(); i++){
//Format the output entry [<name>::::<fullpath>]
list[i] = list[i].section(".qss.",0,0)+"::::"+dir.absoluteFilePath(list[i]);
@@ -43,7 +46,7 @@ QStringList LTHEME::availableSystemColors(){ //returns: [name::::path] for each
QStringList LTHEME::availableLocalColors(){ //returns: [name::::path] for each item
QDir dir(QDir::homePath()+"/.lumina/colors");
- QStringList list = dir.entryList(QStringList() <<"*.qss.template", QDir::Files, QDir::Name());
+ QStringList list = dir.entryList(QStringList() <<"*.qss.colors", QDir::Files, QDir::Name);
for(int i=0; i<list.length(); i++){
//Format the output entry [<name>::::<fullpath>]
list[i] = list[i].section(".qss.",0,0)+"::::"+dir.absoluteFilePath(list[i]);
@@ -52,22 +55,79 @@ QStringList LTHEME::availableLocalColors(){ //returns: [name::::path] for each
}
QStringList LTHEME::availableSystemIcons(){ //returns: [name] for each item
- return QStringList(); //not implemented yet
+ QStringList paths;
+ paths << QDir::homePath()+"/.icons";
+ QStringList xdd = QString(getenv("XDG_DATA_HOME")).split(":");
+ xdd << QString(getenv("XDG_DATA_DIRS")).split(":");
+ for(int i=0; i<xdd.length(); i++){
+ if(QFile::exists(xdd[i]+"/icons")){
+ paths << xdd[i]+"/icons";
+ }
+ }
+ //Now get all the icon themes in these directories
+ QStringList themes;
+ QDir dir;
+ for(int i=0; i<paths.length(); i++){
+ if(dir.cd(paths[i])){
+ themes << dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
+ }
+ }
+ themes.removeDuplicates();
+ themes.sort();
+ return themes;
}
//Return the currently selected Theme/Colors/Icons
QStringList LTHEME::currentSettings(){ //returns [theme path, colorspath, iconsname]
-
+ 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(); }
+ }
+ out[2] = QIcon::themeName();
+ bool nofile = settings.isEmpty();
+ if(out[0].isEmpty()){ out[0] = LOS::LuminaShare()+"themes/SampleTheme.qss.template"; }
+ if(out[1].isEmpty()){ out[1] = LOS::LuminaShare()+"colors/SampleColors.qss.colors"; }
+ if(nofile){ setCurrentSettings(out[0], out[1], out[2]); }
+
+ return out;
}
//Change the current Theme/Colors/Icons
bool LTHEME::setCurrentSettings(QString themepath, QString colorpath, QString iconname){
-
+ QStringList contents;
+ contents << "THEMEFILE="+themepath;
+ contents << "COLORFILE="+colorpath;
+ contents << "ICONTHEME="+iconname;
+ 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 stylesheet = LUtils::readFile(themepath).join("\n");
+ QStringList colors = LUtils::readFile(colorpath);
+ //qDebug() << "Found Theme:" << themepath << stylesheet;
+ //qDebug() << "Found Colors:" << colorpath << colors;
+ for(int i=0; i<colors.length(); i++){
+ if(colors[i].isEmpty() || colors[i].startsWith("#")){ continue; }
+ else if(colors[i].startsWith("PRIMARYCOLOR=")){ stylesheet = stylesheet.replace("%%PRIMARYCOLOR%%", colors[i].section("=",1,1).simplified()); }
+ else if(colors[i].startsWith("SECONDARYCOLOR=")){ stylesheet = stylesheet.replace("%%SECONDARYCOLOR%%", colors[i].section("=",1,1).simplified()); }
+ else if(colors[i].startsWith("HIGHLIGHTCOLOR=")){ stylesheet = stylesheet.replace("%%HIGHLIGHTCOLOR%%", colors[i].section("=",1,1).simplified()); }
+ else if(colors[i].startsWith("ACCENTCOLOR=")){ stylesheet = stylesheet.replace("%%ACCENTCOLOR%%", colors[i].section("=",1,1).simplified()); }
+ else if(colors[i].startsWith("PRIMARYDISABLECOLOR=")){ stylesheet = stylesheet.replace("%%PRIMARYDISABLECOLOR%%", colors[i].section("=",1,1).simplified()); }
+ else if(colors[i].startsWith("SECONDARYDISABLECOLOR=")){ stylesheet = stylesheet.replace("%%SECONDARYDISABLECOLOR%%", colors[i].section("=",1,1).simplified()); }
+ else if(colors[i].startsWith("HIGHLIGHTDISABLECOLOR=")){ stylesheet = stylesheet.replace("%%HIGHLIGHTDISABLECOLOR%%", colors[i].section("=",1,1).simplified()); }
+ else if(colors[i].startsWith("ACCENTDISABLECOLOR=")){ stylesheet = stylesheet.replace("%%ACCENTDISABLECOLOR%%", colors[i].section("=",1,1).simplified()); }
+ 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("TEXTHIGHLIGHTCOLOR=")){ stylesheet = stylesheet.replace("%%TEXTHIGHLIGHTCOLOR%%", colors[i].section("=",1,1).simplified()); }
+ }
+ //qDebug() << "Assembled Style Sheet:\n" << stylesheet;
+ return stylesheet;
}
//==================
@@ -77,10 +137,10 @@ LuminaThemeEngine::LuminaThemeEngine(QApplication *app){
application=app; //save this pointer for later
QStringList current = LTHEME::currentSettings();
theme = current[0]; colors=current[1]; icons=current[2];
- application->setCurrentStyleSheet( LTHEME::assembleStyleSheet(theme, colors) );
+ application->setStyleSheet( LTHEME::assembleStyleSheet(theme, colors) );
watcher = new QFileSystemWatcher(this);
- watcher->addPath( QDir::homePath()+"/.lumina/currenttheme.conf" );
- connect(watcher, SIGNAL(fileChanged(const &QString)), this, SLOT(watcherChange()) );
+ watcher->addPath( QDir::homePath()+"/.lumina/themesettings.cfg" );
+ connect(watcher, SIGNAL(fileChanged(QString)), this, SLOT(watcherChange()) );
}
LuminaThemeEngine::~LuminaThemeEngine(){
@@ -90,7 +150,7 @@ LuminaThemeEngine::~LuminaThemeEngine(){
void LuminaThemeEngine::watcherChange(){
QStringList current = LTHEME::currentSettings();
if(theme!=current[0] || colors!=current[1]){
- application->setCurrentStyleSheet( LTHEME::assembleStyleSheet(current[0], current[1]) );
+ application->setStyleSheet( LTHEME::assembleStyleSheet(current[0], current[1]) );
}
if(icons!=current[3]){
emit updateIcons();
diff --git a/libLumina/LuminaThemes.h b/libLumina/LuminaThemes.h
index a3e558d9..1026622b 100644
--- a/libLumina/LuminaThemes.h
+++ b/libLumina/LuminaThemes.h
@@ -18,6 +18,7 @@
#include <QDir>
class LTHEME{
+public:
//Read the Themes/Colors/Icons that are available on the system
static QStringList availableSystemThemes();//returns: [name::::path] for each item
static QStringList availableLocalThemes(); //returns: [name::::path] for each item
diff --git a/libLumina/LuminaUtils.cpp b/libLumina/LuminaUtils.cpp
index 8a652e96..03b71cc9 100644
--- a/libLumina/LuminaUtils.cpp
+++ b/libLumina/LuminaUtils.cpp
@@ -58,7 +58,7 @@ bool LUtils::writeFile(QString filepath, QStringList contents, bool overwrite){
bool ok = false;
if(file.open( mode ) ){
QTextStream out(&file);
- for(int i=0; i<contents.length(); i++){ out << contents[i]; }
+ out << contents.join("\n");
file.close();
ok = true;
}
diff --git a/libLumina/colors/SampleColors.qss.colors b/libLumina/colors/SampleColors.qss.colors
new file mode 100644
index 00000000..fa770fa2
--- /dev/null
+++ b/libLumina/colors/SampleColors.qss.colors
@@ -0,0 +1,12 @@
+PRIMARYCOLOR=#7292bf
+SECONDARYCOLOR=#efeeed
+HIGHLIGHTCOLOR=#7292bf
+ACCENTCOLOR=#9abbbe
+PRIMARYDISABLECOLOR=#d0dbea
+SECONDARYDISABLECOLOR=#f5f0e7
+HIGHLIGHTDISABLECOLOR=#d0dbea
+ACCENTDISABLECOLOR=#f5f0e7
+BASECOLOR=#f4f0e8
+ALTBASECOLOR=white
+TEXTCOLOR=black
+TEXTHIGHLIGHTCOLOR=black \ No newline at end of file
diff --git a/libLumina/libLumina.pro b/libLumina/libLumina.pro
index 3bc6b516..97ebb799 100644
--- a/libLumina/libLumina.pro
+++ b/libLumina/libLumina.pro
@@ -23,11 +23,13 @@ VERSION = 1
HEADERS += LuminaXDG.h \
LuminaUtils.h \
LuminaX11.h \
+ LuminaThemes.h \
LuminaOS.h
SOURCES += LuminaXDG.cpp \
LuminaUtils.cpp \
LuminaX11.cpp \
+ LuminaThemes.cpp \
LuminaOS-FreeBSD.cpp \
LuminaOS-DragonFly.cpp \
LuminaOS-OpenBSD.cpp \
@@ -43,8 +45,15 @@ include.path=$$PREFIX/include/
include.files=LuminaXDG.h \
LuminaUtils.h \
LuminaX11.h \
+ LuminaThemes.h \
LuminaOS.h
-INSTALLS += target include
+colors.path=$$PREFIX/share/Lumina-DE/colors/
+colors.files=colors/SampleColors.qss.colors
+
+themes.path=$$PREFIX/share/Lumina-DE/themes/
+themes.files=themes/SampleTheme.qss.template
+
+INSTALLS += target include colors themes
QMAKE_LIBDIR = $$LIBPREFIX/qt4 $$LIBPREFIX
diff --git a/libLumina/themes/SampleTheme.qss.template b/libLumina/themes/SampleTheme.qss.template
new file mode 100644
index 00000000..b60fbf5a
--- /dev/null
+++ b/libLumina/themes/SampleTheme.qss.template
@@ -0,0 +1,64 @@
+QWidget{ color: %%TEXTCOLOR%%; }
+QWidget#page_browser,#page_audioPlayer,#page_zfs,#page_image_view{background:
+qradialgradient(cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2,
+stop: 0 %%ACCENTCOLOR%%,
+stop: 1 %%PRIMARYCOLOR%%);
+}
+QMainWindow, QMenu{ background: %%BASECOLOR%%; }
+QMenuBar, QMenuBar::item, QToolBar{ background: transparent; }
+QMenuBar::item:selected, QMenuBar::item:pressed, QMenu::item:selected{ background: qradialgradient(cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2,
+stop: 0 %%ACCENTCOLOR%%,
+stop: 1 %%HIGHLIGHTCOLOR%%);
+color: %%TEXTHIGHLIGHTCOLOR%%;
+}
+QMenu::item{ background: transparent; border: none; color: %%TEXTCOLOR%%; padding: 2px 25px 2px 20px;}
+QMenu::indicator{ width: 14px; height: 14px; }
+
+ QMenu::indicator:non-exclusive:unchecked {
+ image: url(:/trolltech/styles/commonstyle/images/standardbutton-no-16.png);
+ }
+
+ QMenu::indicator:non-exclusive:unchecked:selected {
+ image: url(:/trolltech/styles/commonstyle/images/standardbutton-no-16.png);
+ }
+
+ QMenu::indicator:non-exclusive:checked {
+ image: url(:/trolltech/styles/commonstyle/images/standardbutton-yes-16.png);
+ }
+
+ QMenu::indicator:non-exclusive:checked:selected {
+ image: url(:/trolltech/styles/commonstyle/images/standardbutton-yes-16.png);
+ }
+
+ QTabBar::tab {
+ background: qradialgradient(cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2,
+stop: 0 %%SECONDARYDISABLECOLOR%%,
+stop: 1 %%SECONDARYCOLOR%%);
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ min-width: 8ex;
+ padding: 2px;
+ }
+
+ QTabBar::tab:selected{
+ background: qradialgradient(cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2,
+stop: 0 %%ACCENTDISABLECOLOR%%,
+stop: 1 %%HIGHLIGHTCOLOR%%);
+ }
+QTabBar::tab:hover {
+ background: qradialgradient(cx: 0.5, cy: -1.8, fx: 0.5, fy: 0, radius: 2,
+stop: 0 %%ACCENTDISABLECOLOR%%,
+stop: 1 %%HIGHLIGHTDISABLECOLOR%%);
+ }
+
+ QTabBar::tab:!selected {
+ margin-top: 2px; /* make non-selected tabs look smaller */
+ }
+
+QToolTip{
+ background: %%BASECOLOR%%;
+ border: 1px solid %%PRIMARYDISABLECOLOR%%;
+ border-radius: 2px;
+ padding: 1px;
+ color: %%TEXTCOLOR%%;
+} \ No newline at end of file
bgstack15