aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core')
-rw-r--r--src-qt5/core/core.pro5
-rw-r--r--src-qt5/core/libLumina/LIconCache.cpp37
-rw-r--r--src-qt5/core/libLumina/LIconCache.h3
-rw-r--r--src-qt5/core/libLumina/LuminaXDG.cpp21
-rw-r--r--src-qt5/core/lumina-desktop-unified/global-includes.h3
-rw-r--r--src-qt5/core/lumina-desktop-unified/main.cpp2
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp8
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h69
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h140
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h9
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h102
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri2
-rw-r--r--src-qt5/core/lumina-desktop/LSession.cpp8
-rw-r--r--src-qt5/core/lumina-desktop/main.cpp4
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp6
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp2
-rw-r--r--src-qt5/core/lumina-session/main.cpp7
-rw-r--r--src-qt5/core/lumina-session/session.cpp6
-rw-r--r--src-qt5/core/lumina-theme-engine/colors/airy.conf4
-rw-r--r--src-qt5/core/lumina-theme-engine/colors/darker.conf4
-rw-r--r--src-qt5/core/lumina-theme-engine/colors/dusk.conf4
-rw-r--r--src-qt5/core/lumina-theme-engine/colors/sand.conf4
-rw-r--r--src-qt5/core/lumina-theme-engine/colors/simple.conf4
-rw-r--r--src-qt5/core/lumina-theme-engine/colors/waves.conf4
-rw-r--r--src-qt5/core/lumina-theme-engine/lthemeengine.pri29
-rw-r--r--src-qt5/core/lumina-theme-engine/lthemeengine.pro59
-rw-r--r--src-qt5/core/lumina-theme-engine/lumina-theme-engine.pro11
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro2
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp21
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h2
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro4
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp19
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h2
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp6
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h2
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro9
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp2
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp30
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h5
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui40
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp25
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h2
42 files changed, 541 insertions, 187 deletions
diff --git a/src-qt5/core/core.pro b/src-qt5/core/core.pro
index 4878b1f3..0f635960 100644
--- a/src-qt5/core/core.pro
+++ b/src-qt5/core/core.pro
@@ -8,9 +8,10 @@ SUBDIRS+= lumina-desktop \
lumina-session \
lumina-open \
lumina-info \
- $${PWD}/../../icon-theme
-# lumina-wm-INCOMPLETE \
+ $${PWD}/../../icon-theme \
+ lumina-theme-engine
# lumina-checkpass
+# lumina-desktop-unified
#Also install any special menu scripts
scripts.path = $${L_SHAREDIR}/lumina-desktop/menu-scripts
diff --git a/src-qt5/core/libLumina/LIconCache.cpp b/src-qt5/core/libLumina/LIconCache.cpp
index 38367cef..bb81bc47 100644
--- a/src-qt5/core/libLumina/LIconCache.cpp
+++ b/src-qt5/core/libLumina/LIconCache.cpp
@@ -55,9 +55,9 @@ QString LIconCache::findFile(QString icon){
if(icon.isEmpty()){ return ""; }
//Get the currently-set theme
QString cTheme = QIcon::themeName();
- if(cTheme.isEmpty()){
- QIcon::setThemeName("material-design-light");
- cTheme = "material-design-light";
+ if(cTheme.isEmpty()){
+ QIcon::setThemeName("material-design-light");
+ cTheme = "material-design-light";
}
//Make sure the current search paths correspond to this theme
if( QDir::searchPaths("icontheme").filter("/"+cTheme+"/").isEmpty() ){
@@ -80,7 +80,7 @@ QString LIconCache::findFile(QString icon){
fall << getChildIconDirs(paths[i]+"hicolor"); //XDG fallback (apps add to this)
}
//Now load all the icon theme dependencies in order (Theme1 -> Theme2 -> Theme3 -> Fallback)
-
+
//fall << LOS::AppPrefix()+"share/pixmaps"; //always use this as well as a final fallback
QDir::setSearchPaths("icontheme", theme);
QDir::setSearchPaths("default", oxy);
@@ -121,6 +121,10 @@ QString LIconCache::findFile(QString icon){
void LIconCache::loadIcon(QAbstractButton *button, QString icon, bool noThumb){
if(icon.isEmpty()){ return; }
+ if(isThemeIcon(icon)){
+ button->setIcon( iconFromTheme(icon));
+ return ;
+ }
//See if the icon has already been loaded into the HASH
bool needload = !HASH.contains(icon);
if(!needload){
@@ -138,6 +142,10 @@ void LIconCache::loadIcon(QAbstractButton *button, QString icon, bool noThumb){
void LIconCache::loadIcon(QAction *action, QString icon, bool noThumb){
if(icon.isEmpty()){ return; }
+ if(isThemeIcon(icon)){
+ action->setIcon( iconFromTheme(icon));
+ return ;
+ }
//See if the icon has already been loaded into the HASH
bool needload = !HASH.contains(icon);
if(!needload){
@@ -155,6 +163,10 @@ void LIconCache::loadIcon(QAction *action, QString icon, bool noThumb){
void LIconCache::loadIcon(QLabel *label, QString icon, bool noThumb){
if(icon.isEmpty()){ return; }
+ if(isThemeIcon(icon)){
+ label->setPixmap( iconFromTheme(icon).pixmap(label->sizeHint()) );
+ return ;
+ }
//See if the icon has already been loaded into the HASH
bool needload = !HASH.contains(icon);
if(!needload){
@@ -164,7 +176,7 @@ void LIconCache::loadIcon(QLabel *label, QString icon, bool noThumb){
//Need to load the icon
icon_data idata;
if(HASH.contains(icon)){ idata = HASH.value(icon); }
- else { idata = createData(icon);
+ else { idata = createData(icon);
if(idata.fullpath.isEmpty()){ return; } //nothing to do
}
idata.pendingLabels << QPointer<QLabel>(label); //save this QLabel for later
@@ -183,6 +195,8 @@ void LIconCache::clearIconTheme(){
QIcon LIconCache::loadIcon(QString icon, bool noThumb){
if(icon.isEmpty()){ return QIcon(); }
+ if(isThemeIcon(icon)){ return iconFromTheme(icon); }
+
if(HASH.contains(icon)){
if(!HASH[icon].icon.isNull()){ return HASH[icon].icon; }
else if(!HASH[icon].thumbnail.isNull() && !noThumb){ return HASH[icon].thumbnail; }
@@ -290,6 +304,19 @@ void LIconCache::ReadFile(LIconCache *obj, QString id, QString path){
obj->emit InternalIconLoaded(id, cdt, BA);
}
+bool LIconCache::isThemeIcon(QString id){
+ return (!id.contains("/") && !id.contains(".") );
+}
+
+QIcon LIconCache::iconFromTheme(QString id){
+ QIcon ico = QIcon::fromTheme(id);
+ if(ico.isNull()){
+ //icon missing in theme? run the old icon-finder system
+ ico = QIcon(findFile(id));
+ }
+ return ico;
+}
+
// === PRIVATE SLOTS ===
void LIconCache::IconLoaded(QString id, QDateTime sync, QByteArray *data){
//qDebug() << "Icon Loaded:" << id << HASH.contains(id);
diff --git a/src-qt5/core/libLumina/LIconCache.h b/src-qt5/core/libLumina/LIconCache.h
index f58a5510..428ffcab 100644
--- a/src-qt5/core/libLumina/LIconCache.h
+++ b/src-qt5/core/libLumina/LIconCache.h
@@ -67,6 +67,9 @@ private:
void startReadFile(QString id, QString path);
void ReadFile(LIconCache *obj, QString id, QString path);
+ bool isThemeIcon(QString id);
+ QIcon iconFromTheme(QString id);
+
private slots:
void IconLoaded(QString id, QDateTime sync, QByteArray *data);
diff --git a/src-qt5/core/libLumina/LuminaXDG.cpp b/src-qt5/core/libLumina/LuminaXDG.cpp
index 8da39564..01b3305e 100644
--- a/src-qt5/core/libLumina/LuminaXDG.cpp
+++ b/src-qt5/core/libLumina/LuminaXDG.cpp
@@ -723,7 +723,7 @@ QList<XDGDesktop*> LXDG::sortDesktopNames(QList<XDGDesktop*> apps){
//Sort the list by name of the application
QHash<QString, XDGDesktop*> sorter;
for(int i=0; i<apps.length(); i++){
- sorter.insert(apps[i]->name.toLower(), apps[i]);
+ sorter.insert(apps[i]->name.toLower(), apps[i]);
}
QStringList keys = sorter.keys();
keys.sort();
@@ -746,16 +746,25 @@ void LXDG::setEnvironmentVars(){
}
QIcon LXDG::findIcon(QString iconName, QString fallback){
+ //With the addition of the Lumina theme engine (8/3/17), switch back to using the Qt icon from theme method for apps
+ QIcon tmp;
+ if(!iconName.contains("libreoffice")){ //libreoffice is stupid - their svg icons are un-renderable with Qt
+ tmp = QIcon::fromTheme(iconName);
+ if(tmp.isNull()){ tmp = QIcon::fromTheme(fallback); }
+ }
+ if(!tmp.isNull()){ return tmp; } //found one in the theme
+
+
//NOTE: This was re-written on 11/10/15 to avoid using the QIcon::fromTheme() framework
// -- Too many issues with SVG files and/or search paths with the built-in system
-
+
//Check if the icon is an absolute path and exists
bool DEBUG =false;
if(DEBUG){ qDebug() << "[LXDG] Find icon for:" << iconName; }
if(QFile::exists(iconName) && iconName.startsWith("/")){ return QIcon(iconName); }
else if(iconName.startsWith("/")){ iconName.section("/",-1); } //Invalid absolute path, just look for the icon
//Check if the icon is actually given
- if(iconName.isEmpty()){
+ if(iconName.isEmpty()){
if(fallback.isEmpty()){ return QIcon(); }
else{ return LXDG::findIcon(fallback, ""); }
}
@@ -763,9 +772,9 @@ QIcon LXDG::findIcon(QString iconName, QString fallback){
if(DEBUG){ qDebug() << "[LXDG] Start search for icon"; }
//Get the currently-set theme
QString cTheme = QIcon::themeName();
- if(cTheme.isEmpty()){
- QIcon::setThemeName("material-design-light");
- cTheme = "material-design-light";
+ if(cTheme.isEmpty()){
+ QIcon::setThemeName("material-design-light");
+ cTheme = "material-design-light";
}
//Make sure the current search paths correspond to this theme
if( QDir::searchPaths("icontheme").filter("/"+cTheme+"/").isEmpty() ){
diff --git a/src-qt5/core/lumina-desktop-unified/global-includes.h b/src-qt5/core/lumina-desktop-unified/global-includes.h
index 92f895c2..8b8cd16c 100644
--- a/src-qt5/core/lumina-desktop-unified/global-includes.h
+++ b/src-qt5/core/lumina-desktop-unified/global-includes.h
@@ -34,6 +34,7 @@
#include <QAnimationGroup>
#include <QParallelAnimationGroup>
#include <QSequentialAnimationGroup>
+#include <QGraphicsOpacityEffect>
#include <QWindow>
#include <QWidget>
#include <QWidgetAction>
@@ -47,6 +48,8 @@
#include <QThread>
#include <QMediaObject>
#include <QMediaPlayer>
+#include <QVideoWidget>
+#include <QMediaPlaylist>
// libLumina includes
#include <LuminaX11.h>
diff --git a/src-qt5/core/lumina-desktop-unified/main.cpp b/src-qt5/core/lumina-desktop-unified/main.cpp
index 8e40f7eb..ef15cfcd 100644
--- a/src-qt5/core/lumina-desktop-unified/main.cpp
+++ b/src-qt5/core/lumina-desktop-unified/main.cpp
@@ -29,7 +29,7 @@ int main(int argc, char ** argv)
setenv("DESKTOP_SESSION","Lumina",1);
setenv("XDG_CURRENT_DESKTOP","Lumina",1);
setenv("QT_NO_GLIB", "1", 1); //Disable the glib event loop within Qt at runtime (performance hit + bugs)
- unsetenv("QT_QPA_PLATFORMTHEME"); //causes issues with Lumina themes - not many people have this by default...
+ //unsetenv("QT_QPA_PLATFORMTHEME"); //causes issues with Lumina themes - not many people have this by default...
unsetenv("QT_AUTO_SCREEN_SCALE_FACTOR"); //need exact-pixel measurements (no fake scaling)
//Startup the session
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp
index aaae8b41..7fc4eb50 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp
@@ -12,6 +12,8 @@
#include "Grav.h"
#include "SampleAnimation.h"
#include "Text.h"
+#include "ImageSlideshow.h"
+#include "VideoSlideshow.h"
//==============================
// PLUGIN LOADING/LISTING
@@ -24,6 +26,10 @@ BaseAnimGroup* BaseAnimGroup::NewAnimation(QString type, QWidget *parent, QSetti
return (new GravAnimation(parent, set));
}else if(type == "text") {
return (new TextAnimation(parent, set));
+ }else if(type == "imageSlideshow") {
+ return (new ImageAnimation(parent, set));
+ }else if(type == "videoSlideshow") {
+ return (new VideoAnimation(parent, set));
}else {
//Unknown screensaver, return a blank animation group
return (new BaseAnimGroup(parent, set));
@@ -31,5 +37,5 @@ BaseAnimGroup* BaseAnimGroup::NewAnimation(QString type, QWidget *parent, QSetti
}
QStringList BaseAnimGroup::KnownAnimations(){
- return (QStringList() << "grav");
+ return (QStringList() << "videoSlideshow" /*<< "grav" << "text" << "imageSlideshow" << "fireflies"*/);
}
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h
index ec1de914..50d733e9 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h
@@ -9,10 +9,8 @@
//PI is equal to 2*pi
#define PI 6.2832
-
#include "global-includes.h"
#include "BaseAnimGroup.h"
-#include <QParallelAnimationGroup>
#include <QtMath>
#include <QMatrix>
@@ -32,44 +30,53 @@ private:
radius = qSqrt( (qPow(start.x()-ref->x(),2) + qPow(start.y()-ref->y(),2) ));
//Number of frames in animation. Increase for smother motion
- double step = 1000.0;
+ double step = 300.0;
//Random values that give the eliptical pattern to the orbit. Between 0.4 and 2.3
- double xrand = (qrand()%20+4)/10.0;
- double yrand = (qrand()%20+4)/10.0;
-
- QPoint firstP = QPoint(ref->x() + xrand*start.x()*(qCos(0/step) -qSin(0/step)), ref->y() + yrand*start.y()*(qCos(0/step) -qSin(0/step)));
- QPoint lastP = QPoint(ref->x() + xrand*start.x()*(qCos(PI/step) -qSin(PI/step)), ref->y() + yrand*start.y()*(qCos(PI/step) -qSin(PI/step)));
- orbit->setKeyValueAt(0, firstP);
- orbit->setKeyValueAt(1, lastP);
+ double xrand = 0.4; //(qrand()%10+4)/10.0;
+ double yrand = 0.4; //(qrand()%10+4)/10.0;
+
+ double theta = 1.5707963;
+ //double theta = aTan((start.x() - ref->x())/(start.y() - ref->y()));
+ QMatrix rotation = QMatrix(qCos(theta), qSin(theta), -qSin(theta), qCos(theta), -ref->x(), -ref->y());
+ qDebug() << rotation;
+ //qDebug() << "Starting Point" << start;
+ //qDebug() << "Angle" << theta;
+ //qDebug() << "Distance" << radius;
+ //qDebug() << "Center" << *ref;
+
+ QPoint firstP = (QPoint(ref->x() + xrand*start.x()*(qCos(0/step) -qSin(0/step)), ref->y() + yrand*start.y()*(qCos(0/step) -qSin(0/step))));
+ QPoint rotFP = rotation.map(firstP);
+ qDebug() << "First Point" << firstP;
+ qDebug() << "Rotation by Matrix" << rotFP;
+ QPoint lastP = (QPoint(ref->x() + xrand*start.x()*(qCos(PI/step) -qSin(PI/step)), ref->y() + yrand*start.y()*(qCos(PI/step) -qSin(PI/step))));
+ orbit->setKeyValueAt(0, firstP);
+ orbit->setKeyValueAt(1, lastP);
//path.push_back(firstP);
//Loops through all steps and creates all the points of the orbit
for(int i=1; i<step; i++) {
//Calculates the new point, including gravitational pull and eccentricity. Goes from 0 to 2PI in steps.
- double newX = ref->x() + xrand*start.x()*(qCos((PI*i)/step) -qSin((PI*i)/step));
- double newY = ref->y() + yrand*start.y()*(qSin((PI*i)/step) + qCos((PI*i)/step));
-
- //Calculates the radius from the sun as the distance between the points
- radius = (qSqrt( (qPow(newX-ref->x(),2) + qPow(newY-ref->y(),2) )));
+ double newX = ref->x() + xrand*start.x()*(qCos((PI*i)/step) - qSin((PI*i)/step));
+ double newY = ref->y() + yrand*start.y()*(qSin((PI*i)/step) + qCos((PI*i)/step));
//Creates a new point and creates a key as part of the animation
- QPoint newLoc = QPoint(newX, newY);
- orbit->setKeyValueAt(i/step, newLoc);
+ QPoint newLoc = (QPoint(newX, newY));
+ orbit->setKeyValueAt(i/step, newLoc);
//path.push_back(newLoc);
}
//Sets the time for a full orbit. Increasing makes the orbit slower.
//path.push_back(lastP);
}
private slots:
- void LoopChanged(int loop){
+ /*void LoopChanged(int loop){
//Adjust the orbit animation a bit
- /*if(loop >= 0) {
+ if(loop >= 0) {
orbit->setStartValue(orbit->endValue()); //start at the previous end point
orbit->setEndValue(path.at(loop%1000));
orbit->setDuration(10);
- }*/
- }
+ }
+ }*/
void stopped(){ qDebug() << "Planet stopped"; planet->hide();}
public:
@@ -96,22 +103,18 @@ public:
QRect invalid = QRect(center+QPoint(-50,-50), center+QPoint(50,50));
QPoint tmp = center;
while(invalid.contains(tmp)){
- int randwidth = qrand()%(range.width() - 2*planet_radius) + planet_radius;
- int randheight= qrand()%(range.height()- 2*planet_radius) + planet_radius;
+ int randwidth = qrand()%(range.width() - 2*planet_radius) + planet_radius;
+ int randheight = qrand()%(range.height()- 2*planet_radius) + planet_radius;
tmp = QPoint(randwidth, randheight);
}
- /*double tmpDistance = qSqrt((qPow((tmp.x()-center.x()), 2) + qPow((tmp.y()-center.y()), 2)));
- double theta = qAsin(qAbs(tmp.y()-center.y())/tmpDistance);
- QMatrix rotation = QMatrix(qCos(theta), qSin(theta), -qSin(theta), qCos(theta), -center.x(), -center.y());*/
-
//Creates all frames for the animation
setupLoop(tmp, &center);
this->addAnimation(orbit);
planet->show();
//Ensures the screensaver will not stop until the user wishes to login or it times out
- this->setLoopCount(5); //number of orbits
+ this->setLoopCount(1); //number of orbits
orbit->setDuration( qrand() %1000 + 19000); //20 second orbits
//orbit->setEndValue(path.at(0));
//LoopChanged(0); //load initial values
@@ -138,13 +141,14 @@ private slots:
for(int i=0; i<this->animationCount(); i++){
if(this->animationAt(i)->state()==QAbstractAnimation::Running){ running++; }
}
- if(running<=1){ wobble->stop(); emit wobble->finished();}
+ if(running<=1){ wobble->stop(); emit wobble->finished();}
}
public:
GravAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
~GravAnimation(){
- //this->stop();
+ sun->deleteLater();
+ while(planets.length()>0){ planets.takeAt(0)->deleteLater(); }
}
void LoadAnimations(){
@@ -152,8 +156,8 @@ public:
sun = new QWidget(canvas);
QPoint center = canvas->geometry().center();
QString sunstyle = QStringLiteral("background-color:qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, ") +
- QStringLiteral("stop:0 rgba(0, 0, 0, 0), stop:0.38 rgba(0, 0, 0, 0), stop:0.4 rgba(82, 121, 76, 33), stop:0.5 rgba(159, 235, 148, 64), ") +
- QStringLiteral("stop:0.6 rgba(255, 238, 150, 129), stop:0.7 rgba(0, 0, 0, 0));");
+ QStringLiteral("stop:0 rgba(0, 0, 0, 0), stop:0.38 rgba(0, 0, 0, 0), stop:0.4 rgba(82, 121, 76, 33), stop:0.5 rgba(159, 235, 148, 64), ") +
+ QStringLiteral("stop:0.6 rgba(255, 238, 150, 129), stop:0.7 rgba(0, 0, 0, 0));");
sun->setStyleSheet(sunstyle);
//Creates the sun's pulsing animation
@@ -170,7 +174,6 @@ public:
this->addAnimation(wobble);
sun->show();
sun->setGeometry(initgeom);
- while(planets.length()>0){ planets.takeAt(0)->deleteLater(); }
//Gives the screensaver a black background
canvas->setStyleSheet("background: black;");
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h
new file mode 100644
index 00000000..4abc3ae7
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/ImageSlideshow.h
@@ -0,0 +1,140 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_IMAGESLIDESHOW_ANIMATION_H
+#define _LUMINA_DESKTOP_SCREEN_SAVER_IMAGESLIDESHOW_ANIMATION_H
+
+#include "global-includes.h"
+#include "BaseAnimGroup.h"
+
+class ImageSlideshow: public QParallelAnimationGroup{
+ Q_OBJECT
+private:
+ QLabel *image;
+ QPropertyAnimation *bounce, *fading;
+ QPixmap pixmap;
+ QStringList imageFiles;
+ QString imagePath;
+ QSize screenSize;
+ bool animate;
+
+private:
+ void setupAnimation() {
+ //Choose between starting from top or bottom at random
+ if(qrand() % 2) {
+ bounce->setKeyValueAt(0, QPoint(0,screenSize.height()-image->height()));
+ bounce->setKeyValueAt(0.25, QPoint((screenSize.width()-image->width())/2,0));
+ bounce->setKeyValueAt(0.5, QPoint(screenSize.width()-image->width(),screenSize.height()-image->height()));
+ bounce->setKeyValueAt(0.75, QPoint((screenSize.width()-image->width())/2,0));
+ bounce->setKeyValueAt(1, QPoint(0,screenSize.height()-image->height()));
+ }else{
+ bounce->setKeyValueAt(0, QPoint(0,0));
+ bounce->setKeyValueAt(0.25, QPoint((screenSize.width()-image->width())/2,screenSize.height()-image->height()));
+ bounce->setKeyValueAt(0.5, QPoint(screenSize.width()-image->width(),0));
+ bounce->setKeyValueAt(0.75, QPoint((screenSize.width()-image->width())/2,screenSize.height()-image->height()));
+ bounce->setKeyValueAt(1, QPoint(0,0));
+ }
+ }
+
+ void chooseImage() {
+ QString randomFile = imagePath+imageFiles[qrand() % imageFiles.size()];
+
+ //Choose a new file if the chosen one is not an image
+ while(QImageReader::imageFormat(randomFile).isEmpty())
+ randomFile = imagePath+imageFiles[qrand() % imageFiles.size()];
+ pixmap.load(imagePath+imageFiles[qrand() % imageFiles.size()]);
+
+ //If the image is larger than the screen, then shrink the image down to 3/4 it's size (so there's still some bounce)
+ //Scale the pixmap to keep the aspect ratio instead of resizing the label itself
+ if(pixmap.width() > screenSize.width() or pixmap.height() > screenSize.height())
+ pixmap = pixmap.scaled(screenSize*(3.0/4.0), Qt::KeepAspectRatio);
+
+ //Set pixmap to the image label
+ image->setPixmap(pixmap);
+ image->resize(pixmap.size());
+ }
+
+private slots:
+ void LoopChanged(){
+ //Load a new random image. Resize the label based on the image's size
+ chooseImage();
+ setupAnimation();
+ }
+ void stopped(){ qDebug() << "Image Stopped"; image->hide();}
+
+public:
+ ImageSlideshow(QWidget *parent, QString path, bool animate) : QParallelAnimationGroup(parent){
+ imagePath = path;
+ image = new QLabel(parent);
+ screenSize = parent->size();
+ this->animate = animate;
+
+ //Generate the list of files in the directory
+ imageFiles = QDir(imagePath).entryList(QDir::Files);
+ if(imageFiles.empty())
+ qDebug() << "Current image file path has no files.";
+
+ //Change some default settings for the image. If scaledContents is false, the image will be cut off if resized
+ image->setScaledContents(true);
+ image->setAlignment(Qt::AlignHCenter);
+
+ //Load a random initial image
+ chooseImage();
+
+ //Create the animation that moves the image across the screen
+ bounce = new QPropertyAnimation(image, "pos", parent);
+
+ //Add the animation that fades the image in and out
+ QGraphicsOpacityEffect *eff = new QGraphicsOpacityEffect(parent);
+ image->setGraphicsEffect(eff);
+ fading = new QPropertyAnimation(eff,"opacity");
+ fading->setKeyValueAt(0, 0);
+ fading->setKeyValueAt(0.20, 1);
+ fading->setKeyValueAt(0.80, 1);
+ fading->setKeyValueAt(1, 0);
+ this->addAnimation(fading);
+
+ setupAnimation();
+ image->show();
+ //Only add the animation if set in the configuration file
+ if(animate)
+ this->addAnimation(bounce);
+ else
+ //If no animation, center the image in the middle of the screen
+ image->move(QPoint((parent->width()-image->width())/2,(parent->height()-image->height())/2));
+
+ //Loop through 30 times for a total for 4 minutes
+ this->setLoopCount(30);
+ bounce->setDuration(8000);
+ fading->setDuration(8000);
+
+ connect(this, SIGNAL(currentLoopChanged(int)), this, SLOT(LoopChanged()) );
+ connect(this, SIGNAL(finished()), this, SLOT(stopped()) );
+ }
+ ~ImageSlideshow(){}
+
+};
+
+class ImageAnimation: public BaseAnimGroup{
+ Q_OBJECT
+public:
+ ImageAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
+ ~ImageAnimation(){
+ this->stop();
+ }
+
+ void LoadAnimations(){
+ canvas->setStyleSheet("background: black;");
+ //Load the path of the images from the configuration file (default /usr/local/backgrounds/)
+ QString imagePath = settings->value("imageSlideshow/path","/usr/local/backgrounds/").toString();
+ //Load whether to animate the image (default true)
+ bool animate = settings->value("imageSlideshow/animate", true).toBool();
+ ImageSlideshow *tmp = new ImageSlideshow(canvas, imagePath, animate);
+ this->addAnimation(tmp);
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h
index a4c49692..3ec0af82 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h
@@ -4,11 +4,8 @@
// Available under the 3-clause BSD license
// See the LICENSE file for full details
//===========================================
-#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_Text_ANIMATION_H
-#define _LUMINA_DESKTOP_SCREEN_SAVER_Text_ANIMATION_H
-
-//PI is equal to 2*pi
-#define PI 6.2832
+#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_TEXT_ANIMATION_H
+#define _LUMINA_DESKTOP_SCREEN_SAVER_TEXT_ANIMATION_H
#include "global-includes.h"
#include "BaseAnimGroup.h"
@@ -38,7 +35,7 @@ private slots:
currLoc.setY(currLoc.y() + v.y());
movement->setEndValue(currLoc);
}
- void stopped(){ qDebug() << "text stopped"; text->hide();}
+ void stopped(){ qDebug() << "Text Stopped"; text->hide();}
public:
Text(QWidget *parent) : QParallelAnimationGroup(parent){
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h
new file mode 100644
index 00000000..fdddaf93
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/VideoSlideshow.h
@@ -0,0 +1,102 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_VIDEOSLIDESHOW_ANIMATION_H
+#define _LUMINA_DESKTOP_SCREEN_SAVER_VIDEOSLIDESHOW_ANIMATION_H
+
+#include "global-includes.h"
+#include "BaseAnimGroup.h"
+
+class VideoSlideshow: public QPropertyAnimation{
+ Q_OBJECT
+public:
+ VideoSlideshow(QWidget *parent, QVideoWidget *videoWidget) : QPropertyAnimation(videoWidget, "pos", parent){
+ this->setKeyValueAt(0,QPoint(0,0));
+ this->setKeyValueAt(1,QPoint(0,0));
+ }
+ ~VideoSlideshow(){}
+
+};
+
+class VideoAnimation: public BaseAnimGroup{
+ Q_OBJECT
+private:
+ QString videoPath;
+ VideoSlideshow *tmp;
+ QVideoWidget *videoWidget;
+ QMediaPlayer *video;
+ QStringList videoFiles;
+ QMediaPlaylist *playlist;
+ bool multimonitor, random;
+
+private slots:
+ void startVideo() {
+ this->addAnimation(tmp);
+ tmp->setDuration(video->duration());
+ qDebug() << "Status: " << video->mediaStatus();
+ video->setPlaylist(playlist);
+ video->setVolume(100);
+ video->play();
+ }
+
+ void LoopChanged(){
+ qDebug() << "New Video";
+ if(random)
+ playlist->setCurrentIndex(qrand() % videoFiles.size());
+ else
+ playlist->setCurrentIndex(playlist->currentIndex()+1);
+ }
+
+ void stopped(){qDebug() << "Video Stopped"; videoWidget->hide();}
+
+public:
+ VideoAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
+
+ ~VideoAnimation(){
+ this->stop();
+ }
+
+ void LoadAnimations(){
+ canvas->setStyleSheet("background: black;");
+
+ //Load the path of the videos from the configuration file (default /usr/local/videos/)
+ videoPath = settings->value("videoSlideshow/path","/usr/local/videos/").toString();
+
+ //Set whether to copy videos on two monitors or play different videos
+ multimonitor = settings->value("videoSlideshow/multimonitor",true).toBool();
+
+ //Set whether to play random videos or in order
+ random = settings->value("videoSlideshow/random",false).toBool();
+
+ video = new QMediaPlayer(canvas, QMediaPlayer::VideoSurface);
+ videoWidget = new QVideoWidget(canvas);
+
+ tmp = new VideoSlideshow(canvas, videoWidget);
+
+ //Generate the list of files in the directory
+ videoFiles = QDir(videoPath).entryList(QDir::Files);
+ if(videoFiles.empty())
+ qDebug() << "Current video file path has no files.";
+
+ this->setLoopCount(videoFiles.size());
+
+ //Load a random initial video
+ playlist = new QMediaPlaylist();
+ for(int i = 0; i < videoFiles.size(); i++)
+ playlist->addMedia(QUrl::fromLocalFile(videoFiles[i]));
+ if(random)
+ playlist->setCurrentIndex(qrand() % videoFiles.size());
+
+ video->setVideoOutput(videoWidget);
+ videoWidget->show();
+ qDebug() << "VideoWidget Displayed";
+ connect(video, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(startVideo()));
+ connect(this, SIGNAL(currentLoopChanged(int)), this, SLOT(LoopChanged()) );
+ connect(this, SIGNAL(finished()), this, SLOT(stopped()) );
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri
index 35141a0e..fdc75717 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri
@@ -4,5 +4,7 @@ HEADERS += $$PWD/BaseAnimGroup.h \
$$PWD/SampleAnimation.h \
$${PWD}/Fireflies.h \
$${PWD}/Grav.h \
+ $${PWD}/ImageSlideshow.h \
+ $${PWD}/VideoSlideshow.h \
$${PWD}/Text.h
#FORMS +=
diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp
index 93318b0f..777affd1 100644
--- a/src-qt5/core/lumina-desktop/LSession.cpp
+++ b/src-qt5/core/lumina-desktop/LSession.cpp
@@ -191,7 +191,10 @@ void LSession::CleanupSession(){
int vol = LOS::audioVolume();
if(vol>=0){ sessionsettings->setValue("last_session_state/audio_volume", vol); }
bool playaudio = sessionsettings->value("PlayLogoutAudio",true).toBool();
- if( playaudio ){ playAudioFile(LOS::LuminaShare()+"Logout.ogg"); }
+ if( playaudio ){
+ QString sfile = sessionsettings->value("audiofiles/logout", LOS::LuminaShare()+"Logout.ogg").toString();
+ playAudioFile(sfile);
+ }
//Stop the background system tray (detaching/closing apps as necessary)
stopSystemTray(!cleansession);
//Now perform any other cleanup
@@ -296,7 +299,8 @@ void LSession::launchStartupApps(){
//Now play the login music since we are finished
if(sessionsettings->value("PlayStartupAudio",true).toBool()){
- LSession::playAudioFile(LOS::LuminaShare()+"Login.ogg");
+ QString sfile = sessionsettings->value("audiofiles/login", LOS::LuminaShare()+"Login.ogg").toString();
+ playAudioFile(sfile);
}
qDebug() << "[DESKTOP INIT FINISHED]";
}
diff --git a/src-qt5/core/lumina-desktop/main.cpp b/src-qt5/core/lumina-desktop/main.cpp
index 1b0e5e4d..6017cad7 100644
--- a/src-qt5/core/lumina-desktop/main.cpp
+++ b/src-qt5/core/lumina-desktop/main.cpp
@@ -72,8 +72,8 @@ int main(int argc, char ** argv)
LXDG::setEnvironmentVars();
setenv("DESKTOP_SESSION","Lumina",1);
setenv("XDG_CURRENT_DESKTOP","Lumina",1);
- unsetenv("QT_QPA_PLATFORMTHEME"); //causes issues with Lumina themes - not many people have this by default...
- //setenv("QT_QPA_PLATFORMTHEME", "lthemeengine");
+ //unsetenv("QT_QPA_PLATFORMTHEME"); //causes issues with Lumina themes - not many people have this by default...
+ setenv("QT_QPA_PLATFORMTHEME", "lthemeengine", 1);
unsetenv("QT_AUTO_SCREEN_SCALE_FACTOR"); //causes pixel-specific scaling issues with the desktop - turn this on after-the-fact for other apps
//Startup the session
LSession a(argc, argv);
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp
index 5e9d7a7f..be5b8488 100644
--- a/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp
+++ b/src-qt5/core/lumina-desktop/panel-plugins/battery/LBattery.cpp
@@ -78,8 +78,10 @@ void LBattery::updateBattery(bool force){
}
if(icon<iconOld && icon==0){
//Play some audio warning chime when
- LSession::handle()->playAudioFile(LOS::LuminaShare()+"low-battery.ogg");
- }
+ QString sfile = LSession::handle()->sessionSettings()->value("audiofiles/batterylow", LOS::LuminaShare()+"low-battery.ogg").toString();
+ LSession::handle()->playAudioFile(sfile);
+ }
+
if(icon==0){ label->setStyleSheet("QLabel{ background: red;}"); }
else if(icon==14 && charge>98){ label->setStyleSheet("QLabel{ background: green;}"); }
else{ label->setStyleSheet("QLabel{ background: transparent;}"); }
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp
index bdf9b27e..db661841 100644
--- a/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp
+++ b/src-qt5/core/lumina-desktop/panel-plugins/clock/LClock.cpp
@@ -102,7 +102,7 @@ void LClock::updateTime(bool adjustformat){
lwid = metrics.width(lines[i]);
if(lwid>wid){ wid = lwid; }
}
- this->setMinimumWidth( wid - (4*metrics.width("O")) );
+ this->setMinimumWidth(wid);
this->setMaximumWidth(wid + (4*metrics.width("O")));
}else{
//vertical layout
diff --git a/src-qt5/core/lumina-session/main.cpp b/src-qt5/core/lumina-session/main.cpp
index 3696ed20..71244a8b 100644
--- a/src-qt5/core/lumina-session/main.cpp
+++ b/src-qt5/core/lumina-session/main.cpp
@@ -21,6 +21,11 @@
#include <unistd.h>
#define DEBUG 0
+int findAvailableSession(){
+ int num = 0;
+ while(QFile::exists("/tmp/.X11-unix/X"+QString::number(num))){ num++; }
+ return num;
+}
int main(int argc, char ** argv)
{
@@ -45,7 +50,7 @@ int main(int argc, char ** argv)
QString prog = QString(argv[0]).section("/",-1);
LUtils::isValidBinary(prog); //will adjust the path to be absolute
if(unified){ prog = prog+" --unified"; }
- QStringList args; args << prog;
+ QStringList args; args << prog << "--" << ":"+QString::number(findAvailableSession());
//if(LUtils::isValidBinary("x11vnc")){ args << "--" << "-listen" << "tcp"; } //need to be able to VNC into this session
return QProcess::execute("xinit", args);
}
diff --git a/src-qt5/core/lumina-session/session.cpp b/src-qt5/core/lumina-session/session.cpp
index 48a25a8f..f9c8060a 100644
--- a/src-qt5/core/lumina-session/session.cpp
+++ b/src-qt5/core/lumina-session/session.cpp
@@ -85,6 +85,12 @@ void LSession::start(bool unified){
if(!LUtils::isValidBinary("lumina-desktop") ){
exit(1);
}
+ setenv("DESKTOP_SESSION","Lumina",1);
+ setenv("XDG_CURRENT_DESKTOP","Lumina",1);
+ setenv("QT_QPA_PLATFORMTHEME","lthemeengine", true);
+ setenv("QT_NO_GLIB", "1", 1); //Disable the glib event loop within Qt at runtime (performance hit + bugs)
+ unsetenv("QT_AUTO_SCREEN_SCALE_FACTOR"); //need exact-pixel measurements (no fake scaling)
+
if(!unified){
QSettings sessionsettings("lumina-desktop","sessionsettings");
QString WM = sessionsettings.value("WindowManager", "fluxbox").toString();
diff --git a/src-qt5/core/lumina-theme-engine/colors/airy.conf b/src-qt5/core/lumina-theme-engine/colors/airy.conf
new file mode 100644
index 00000000..94008b7a
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/colors/airy.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors=#000000, #dcdcdc, #dcdcdc, #5e5c5b, #646464, #e1e1e1, #000000, #0a0a0a, #0a0a0a, #c8c8c8, #ffffff, #e7e4e0, #0986d3, #0a0a0a, #0986d3, #a70b06, #5c5b5a, #ffffff, #646464, #050505
+disabled_colors=#ffffff, #424245, #dcdcdc, #5e5c5b, #646464, #e1e1e1, #808080, #ffffff, #808080, #969696, #c8c8c8, #e7e4e0, #0986d3, #808080, #0986d3, #a70b06, #5c5b5a, #ffffff, #646464, #ffffff
+inactive_colors=#323232, #b4b4b4, #dcdcdc, #5e5c5b, #646464, #e1e1e1, #323232, #323232, #323232, #969696, #c8c8c8, #e7e4e0, #0986d3, #323232, #0986d3, #a70b06, #5c5b5a, #ffffff, #646464, #323232
diff --git a/src-qt5/core/lumina-theme-engine/colors/darker.conf b/src-qt5/core/lumina-theme-engine/colors/darker.conf
new file mode 100644
index 00000000..9c822b60
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/colors/darker.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors=#ffffff, #424245, #979797, #5e5c5b, #302f2e, #4a4947, #ffffff, #ffffff, #ffffff, #3d3d3d, #222020, #e7e4e0, #12608a, #f9f9f9, #0986d3, #a70b06, #5c5b5a, #ffffff, #3f3f36, #ffffff
+disabled_colors=#808080, #424245, #979797, #5e5c5b, #302f2e, #4a4947, #808080, #ffffff, #808080, #3d3d3d, #222020, #e7e4e0, #12608a, #808080, #0986d3, #a70b06, #5c5b5a, #ffffff, #3f3f36, #ffffff
+inactive_colors=#ffffff, #424245, #979797, #5e5c5b, #302f2e, #4a4947, #ffffff, #ffffff, #ffffff, #3d3d3d, #222020, #e7e4e0, #12608a, #f9f9f9, #0986d3, #a70b06, #5c5b5a, #ffffff, #3f3f36, #ffffff
diff --git a/src-qt5/core/lumina-theme-engine/colors/dusk.conf b/src-qt5/core/lumina-theme-engine/colors/dusk.conf
new file mode 100644
index 00000000..5186ecef
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/colors/dusk.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors=#000000, #7f7f7f, #ffffff, #cbc7c4, #7f7f7f, #b8b5b2, #000000, #ffffff, #000000, #7f7f7f, #7f7f7f, #707070, #308cc6, #ffffff, #0000ff, #ff00ff, #7f7f7f, #000000, #7f7f7f, #000000
+disabled_colors=#bebebe, #7f7f7f, #ffffff, #cbc7c4, #7f7f7f, #b8b5b2, #bebebe, #ffffff, #bebebe, #7f7f7f, #7f7f7f, #b1aeab, #7f7f7f, #ffffff, #0000ff, #ff00ff, #7f7f7f, #000000, #7f7f7f, #000000
+inactive_colors=#000000, #7f7f7f, #ffffff, #cbc7c4, #7f7f7f, #b8b5b2, #000000, #ffffff, #000000, #7f7f7f, #7f7f7f, #707070, #308cc6, #ffffff, #0000ff, #ff00ff, #7f7f7f, #000000, #7f7f7f, #000000
diff --git a/src-qt5/core/lumina-theme-engine/colors/sand.conf b/src-qt5/core/lumina-theme-engine/colors/sand.conf
new file mode 100644
index 00000000..92349195
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/colors/sand.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors=#000000, #ffffdc, #979797, #5e5c5b, #302f2e, #4a4947, #000000, #000000, #000000, #ffffdc, #ffffdc, #e7e4e0, #5f5b5d, #f9f9f9, #0986d3, #a70b06, #ffffdc, #000000, #3f3f36, #000000
+disabled_colors=#4a4947, #ffffdc, #979797, #5e5c5b, #302f2e, #4a4947, #4a4947, #4a4947, #4a4947, #ffffdc, #ffffdc, #e7e4e0, #5f5b5d, #f9f9f9, #0986d3, #a70b06, #ffffdc, #000000, #3f3f36, #000000
+inactive_colors=#000000, #ffffdc, #979797, #5e5c5b, #302f2e, #4a4947, #000000, #000000, #000000, #ffffdc, #ffffdc, #e7e4e0, #5f5b5d, #f9f9f9, #0986d3, #a70b06, #ffffdc, #000000, #3f3f36, #000000
diff --git a/src-qt5/core/lumina-theme-engine/colors/simple.conf b/src-qt5/core/lumina-theme-engine/colors/simple.conf
new file mode 100644
index 00000000..8db9d75b
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/colors/simple.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors=#000000, #efebe7, #ffffff, #cbc7c4, #9f9d9a, #b8b5b2, #000000, #ffffff, #000000, #ffffff, #efebe7, #b1aeab, #308cc6, #ffffff, #0000ff, #ff0000, #f7f5f3, #000000, #ffffdc, #000000
+disabled_colors=#bebebe, #efebe7, #ffffff, #cbc7c4, #9f9d9a, #b8b5b2, #bebebe, #ffffff, #bebebe, #efebe7, #efebe7, #b1aeab, #9f9d9a, #ffffff, #0000ff, #ff0000, #f7f5f3, #000000, #ffffdc, #000000
+inactive_colors=#000000, #efebe7, #ffffff, #cbc7c4, #9f9d9a, #b8b5b2, #000000, #ffffff, #000000, #ffffff, #efebe7, #b1aeab, #308cc6, #ffffff, #0000ff, #ff0000, #f7f5f3, #000000, #ffffdc, #000000
diff --git a/src-qt5/core/lumina-theme-engine/colors/waves.conf b/src-qt5/core/lumina-theme-engine/colors/waves.conf
new file mode 100644
index 00000000..7c7b4530
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/colors/waves.conf
@@ -0,0 +1,4 @@
+[ColorScheme]
+active_colors=#b0b0b0, #010b2c, #979797, #5e5c5b, #302f2e, #4a4947, #b0b0b0, #b0b0b0, #b0b0b0, #010b2c, #010b2c, #b0b0b0, #302f2e, #b0b0b0, #0986d3, #a70b06, #5c5b5a, #ffffff, #0a0a0a, #ffffff
+disabled_colors=#808080, #010b2c, #979797, #5e5c5b, #302f2e, #4a4947, #808080, #808080, #808080, #00071d, #00071d, #b0b0b0, #00071d, #808080, #0986d3, #a70b06, #5c5b5a, #ffffff, #0a0a0a, #ffffff
+inactive_colors=#b0b0b0, #010b2c, #979797, #5e5c5b, #302f2e, #4a4947, #b0b0b0, #b0b0b0, #b0b0b0, #010b2c, #010b2c, #b0b0b0, #302f2e, #b0b0b0, #0986d3, #a70b06, #5c5b5a, #ffffff, #0a0a0a, #ffffff
diff --git a/src-qt5/core/lumina-theme-engine/lthemeengine.pri b/src-qt5/core/lumina-theme-engine/lthemeengine.pri
index aa8a58bb..40202045 100644
--- a/src-qt5/core/lumina-theme-engine/lthemeengine.pri
+++ b/src-qt5/core/lumina-theme-engine/lthemeengine.pri
@@ -1,24 +1,11 @@
-#Some conf to redirect intermediate stuff in separate dirs
-UI_DIR=./.build/ui/
-MOC_DIR=./.build/moc/
-OBJECTS_DIR=./.build/obj
-RCC_DIR=./.build/rcc
-
-QMAKE_DISTCLEAN += -r .build
+QT *= core gui widgets x11extras network
+!isEqual (QT_MAJOR_VERSION, 5) {
+ error("Use Qt 5.4.0 or higher.")
+}
+include(../../OS-detect.pri)
-CONFIG += c++11
+CONFIG *= c++11
#Install paths
-unix {
- isEmpty(PREFIX) {
- PREFIX = /usr/local/
- }
- isEmpty(PLUGINDIR) {
- PLUGINDIR = $$[QT_INSTALL_PLUGINS]
- }
-
- BINDIR = $$PREFIX/bin
- DATADIR = $$PREFIX/share
-
- DEFINES += LTHEMEENGINE_DATADIR=\\\"$$DATADIR\\\"
-}
+ PLUGINDIR = $${DISTDIR}$$[QT_INSTALL_PLUGINS]
+ DEFINES += LTHEMEENGINE_DATADIR=\\\"$$L_SHAREDIR\\\"
diff --git a/src-qt5/core/lumina-theme-engine/lthemeengine.pro b/src-qt5/core/lumina-theme-engine/lthemeengine.pro
deleted file mode 100644
index e3cb47b1..00000000
--- a/src-qt5/core/lumina-theme-engine/lthemeengine.pro
+++ /dev/null
@@ -1,59 +0,0 @@
-QT += core gui widgets x11extras network
-!isEqual (QT_MAJOR_VERSION, 5) {
- error("Use Qt 5.4.0 or higher.")
-}
-
-QMAKE_DISTCLEAN += -r .build
-
-CONFIG += c++11
-
-desktop.files=src/lthemeengine/ltheme.desktop
-desktop.path=$${L_SHAREDIR}/applications/
-
-#Install paths
-unix {
- isEmpty(PREFIX) {
- PREFIX = /usr/local
- }
- isEmpty(PLUGINDIR) {
- PLUGINDIR = $$[QT_INSTALL_PLUGINS]
- }
-
- BINDIR = $$PREFIX/bin
- DATADIR = $$PREFIX/share
-
- DEFINES += LTHEMEENGINE_DATADIR=\\\"$$DATADIR\\\"
-}
-
-TEMPLATE = subdirs
-
-SUBDIRS += src/lthemeengine-qtplugin src/lthemeengine-style src/lthemeengine
-
-unix:exists($$[QT_INSTALL_BINS]/lrelease){
-LRELEASE_EXECUTABLE = $$[QT_INSTALL_BINS]/lrelease
-}
-
-unix:exists($$[QT_INSTALL_BINS]/lrelease-qt5){
-LRELEASE_EXECUTABLE = $$[QT_INSTALL_BINS]/lrelease-qt5
-}
-
-
-isEmpty(LRELEASE_EXECUTABLE){
-error(Could not find lrelease executable)
-}
-else {
-message(Found lrelease executable: $$LRELEASE_EXECUTABLE)
-}
-
-message (PREFIX=$$PREFIX)
-message (BINDIR=$$BINDIR)
-message (DATADIR=$$DATADIR)
-message (PLUGINDIR=$$PLUGINDIR)
-equals (DISABLE_WIDGETS,1):message ("QtWidgets are disabled!")
-
-#Some conf to redirect intermediate stuff in separate dirs
-UI_DIR=./.build/ui/
-MOC_DIR=./.build/moc/
-OBJECTS_DIR=./.build/obj
-RCC_DIR=./.build/rcc
-
diff --git a/src-qt5/core/lumina-theme-engine/lumina-theme-engine.pro b/src-qt5/core/lumina-theme-engine/lumina-theme-engine.pro
new file mode 100644
index 00000000..d91091d3
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/lumina-theme-engine.pro
@@ -0,0 +1,11 @@
+include(../../OS-detect.pri)
+
+TEMPLATE = subdirs
+SUBDIRS += src/lthemeengine-qtplugin \
+ src/lthemeengine-style \
+ src/lthemeengine
+
+colors.files = colors/*.conf
+colors.path = $${L_SHAREDIR}/lthemeengine/colors
+
+INSTALLS += colors
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro
index a186cd49..3dca4fd1 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro
@@ -2,7 +2,7 @@ include(../../lthemeengine.pri)
TEMPLATE = lib
TARGET = lthemeengine
-CONFIG += plugin
+CONFIG *= plugin
greaterThan(QT_MINOR_VERSION, 7) {
QT += gui-private theme_support-private
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp
index 9d6c9bea..453bde1d 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp
@@ -70,7 +70,7 @@ QPlatformSystemTrayIcon *lthemeenginePlatformTheme::createPlatformSystemTrayIcon
QDBusMenuConnection conn;
m_dbusTrayAvailable = conn.isStatusNotifierHostRegistered();
m_checkDBusTray = false;
- qCDebug(llthemeengine) << "D-Bus system tray:" << (m_dbusTrayAvailable ? "yes" : "no");
+ //qCDebug(llthemeengine) << "D-Bus system tray:" << (m_dbusTrayAvailable ? "yes" : "no");
}
return (m_dbusTrayAvailable ? new QDBusTrayIcon() : nullptr);
}
@@ -177,10 +177,10 @@ void lthemeenginePlatformTheme::readSettings(){
settings.beginGroup("Appearance");
m_style = settings.value("style", "Fusion").toString();
if(settings.value("custom_palette", false).toBool()){
- QString schemePath = settings.value("color_scheme_path").toString();
+ QString schemePath = settings.value("color_scheme_path","airy").toString();
m_customPalette = new QPalette(loadColorScheme(schemePath));
}
- m_iconTheme = settings.value("icon_theme").toString();
+ m_iconTheme = settings.value("icon_theme", "material-design-light").toString();
settings.endGroup();
settings.beginGroup("Fonts");
m_generalFont = settings.value("general", QPlatformTheme::font(QPlatformTheme::SystemFont)).value<QFont>();
@@ -237,7 +237,20 @@ QString lthemeenginePlatformTheme::loadStyleSheets(const QStringList &paths){
return content;
}
-QPalette lthemeenginePlatformTheme::loadColorScheme(const QString &filePath){
+QPalette lthemeenginePlatformTheme::loadColorScheme(QString filePath){
+ if(!filePath.contains("/") && !filePath.endsWith(".conf") && !filePath.isEmpty()){
+ //relative theme name, auto-complete it
+ QStringList dirs;
+ dirs << getenv("XDG_CONFIG_HOME");
+ dirs << QString(getenv("XDG_CONFIG_DIRS")).split(":");
+ dirs << QString(getenv("XDG_DATA_DIRS")).split(":");
+ QString relpath = "/lthemeengine/colors/%1.conf";
+ relpath = relpath.arg(filePath);
+ for(int i=0; i<dirs.length(); i++){
+ if(QFile::exists(dirs[i]+relpath)){ filePath = dirs[i]+relpath; break; }
+ }
+ }
+
QPalette customPalette;
QSettings settings(filePath, QSettings::IniFormat);
settings.beginGroup("ColorScheme");
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h
index 5313b73e..17323328 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h
@@ -65,7 +65,7 @@ private:
bool hasWidgets();
#endif
QString loadStyleSheets(const QStringList &paths);
- QPalette loadColorScheme(const QString &filePath);
+ QPalette loadColorScheme(QString filePath);
QString m_style, m_iconTheme, m_userStyleSheet, m_prevStyleSheet;
QPalette *m_customPalette = nullptr;
QFont m_generalFont, m_fixedFont;
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro
index 0b40de64..0f68e7e4 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro
@@ -2,11 +2,11 @@ include(../../lthemeengine.pri)
TEMPLATE = lib
TARGET = lthemeengine-style
-QT += widgets
+QT *= widgets
# Input
-CONFIG += plugin
+CONFIG *= plugin
target.path = $$PLUGINDIR/styles
INSTALLS += target
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp
index 4d585409..04ca6a0b 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp
@@ -190,8 +190,7 @@ void AppearancePage::readSettings(){
m_ui->customPaletteButton->setChecked(settings.value("custom_palette", false).toBool());
QString colorSchemePath = settings.value("color_scheme_path").toString();
QDir("/").mkpath(lthemeengine::userColorSchemePath());
- findColorSchemes(lthemeengine::userColorSchemePath());
- findColorSchemes(lthemeengine::sharedColorSchemePath().join(", "));
+ findColorSchemes( QStringList() << lthemeengine::userColorSchemePath() << lthemeengine::sharedColorSchemePath());
if(m_ui->colorSchemeComboBox->count() == 0){
m_customPalette = palette(); //load fallback palette
}
@@ -223,12 +222,16 @@ void AppearancePage::setPalette(QWidget *w, QPalette p){
w->setPalette(p);
}
-void AppearancePage::findColorSchemes(const QString &path){
- QDir dir(path);
- dir.setFilter(QDir::Files);
- dir.setNameFilters(QStringList() << "*.conf");
- foreach (QFileInfo info, dir.entryInfoList()){
- m_ui->colorSchemeComboBox->addItem(info.baseName(), info.filePath());
+void AppearancePage::findColorSchemes(QStringList paths){
+ paths.removeDuplicates();
+ for(int i=0; i<paths.length(); i++){
+ if( !QFile::exists(paths[i])){ continue; }
+ QDir dir(paths[i]);
+ dir.setFilter(QDir::Files);
+ dir.setNameFilters(QStringList() << "*.conf");
+ foreach (QFileInfo info, dir.entryInfoList()){
+ m_ui->colorSchemeComboBox->addItem(info.baseName(), info.filePath());
+ }
}
}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h
index 23bab52f..3f0fa427 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h
@@ -35,7 +35,7 @@ private:
void readSettings();
void setStyle(QWidget *w, QStyle *s);
void setPalette(QWidget *w, QPalette p);
- void findColorSchemes(const QString &path);
+ void findColorSchemes(QStringList paths);
QPalette loadColorScheme(const QString &filePath);
void createColorScheme(const QString &name, const QPalette &palette);
Ui::AppearancePage *m_ui;
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp
index 36b0c2fa..fdeb8966 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp
@@ -6,6 +6,7 @@
#define LTHEMEENGINE_DATADIR "/usr/local/share"
#endif
+#include <QDebug>
QString lthemeengine::configPath(){
return QDir::homePath() + "/.config/lthemeengine/";
@@ -46,7 +47,8 @@ QStringList lthemeengine::sharedStyleSheetPath(){
QStringList dirs;
dirs << QString(getenv("XDG_CONFIG_HOME"));
dirs << QString(getenv("XDG_CONFIG_DIRS")).split(":");
- for(int i=0; i<dirs.length(); i++){ dirs[i].append("/lthemeengine/colors/"); }
+ dirs << QString(getenv("XDG_DATA_DIRS")).split(":");
+ for(int i=0; i<dirs.length(); i++){ dirs[i].append("/lthemeengine/qss/"); }
if(dirs.isEmpty()){ dirs << LTHEMEENGINE_DATADIR"/lthemeengine/qss/"; } //no XDG settings - use the hardcoded path
return dirs;
}
@@ -59,8 +61,10 @@ QStringList lthemeengine::sharedColorSchemePath(){
QStringList dirs;
dirs << QString(getenv("XDG_CONFIG_HOME"));
dirs << QString(getenv("XDG_CONFIG_DIRS")).split(":");
+ dirs << QString(getenv("XDG_DATA_DIRS")).split(":");
for(int i=0; i<dirs.length(); i++){ dirs[i].append("/lthemeengine/colors/"); }
if(dirs.isEmpty()){ dirs << LTHEMEENGINE_DATADIR"/lthemeengine/colors/"; } //no XDG settings - use the hardcoded path
+ qDebug() << "Got Color Dirs:" << dirs;
return dirs;
}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h
index 93a1d433..8a466ed9 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h
@@ -8,7 +8,7 @@
#define LTHEMEENGINE_STRINGIFY(s) LTHEMEENGINE_TOSTRING(s)
#define LTHEMEENGINE_VERSION_INT (LTHEMEENGINE_VERSION_MAJOR<<8 | LTHEMEENGINE_VERSION_MINOR)
-#define LTHEMEENGINE_VERSION_STR LTHEMEENGINE_STRINGIFY(LTHEMEENGINE_VERSION_MAJOR.QT5CT_VERSION_MINOR)
+#define LTHEMEENGINE_VERSION_STR LTHEMEENGINE_STRINGIFY(LTHEMEENGINE_VERSION_MAJOR.LTHEMEENGINE_VERSION_MINOR)
#include <QString>
#include <QStringList>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro
index cc36ee5b..721b8888 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro
@@ -2,7 +2,7 @@ include(../../lthemeengine.pri)
TEMPLATE = app
-QT += widgets
+QT *= widgets
SOURCES += \
main.cpp \
@@ -43,13 +43,12 @@ HEADERS += \
qsspage.h \
qsseditordialog.h
-!equals (DISABLE_WIDGETS,1) {
DEFINES += USE_WIDGETS
-}
-target.path = $$BINDIR
+TARGET = lthemeengine
+target.path = $${L_BINDIR}
desktop.files = lthemeengine.desktop
-desktop.path = $$DATADIR/applications
+desktop.path = $${L_SHAREDIR}/applications
INSTALLS += target desktop
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp
index 4c1b89fa..b0d5fe08 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp
@@ -23,7 +23,7 @@ int main(int argc, char **argv){
QStringList errorMessages;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
if(env.contains("QT_STYLE_OVERRIDE")){ errorMessages << app.translate("main", "Please remove the <b>QT_STYLE_OVERRIDE</b> environment variable"); }
- if(env.value("QT_QPA_PLATFORMTHEME") != "lthemeengine"){ errorMessages << app.translate("main", "The <b>QT_QPA_PLATFORMTHEME</b> environment variable is not set correctly"); }
+ //if(env.value("QT_QPA_PLATFORMTHEME") != "lthemeengine"){ errorMessages << app.translate("main", "The <b>QT_QPA_PLATFORMTHEME</b> environment variable is not set correctly"); }
if(!QStyleFactory::keys().contains("lthemeengine-style")){ errorMessages << app.translate("main", "Unable to find <b>liblthemeengine-style.so</b>"); }
if(!errorMessages.isEmpty()){
QMessageBox::critical(0, app.translate("main", "Error"), errorMessages.join("<br><br>"));
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp
index 97d4ea1a..ac891a80 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp
@@ -13,6 +13,30 @@ QSSEditorDialog::QSSEditorDialog(const QString &filePath, QWidget *parent) : QDi
setWindowTitle(tr("%1 - Style Sheet Editor").arg(file.fileName()));
QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
restoreGeometry(settings.value("QSSEditor/geometry").toByteArray());
+ //Generate the list of standard colors for the user to pick
+ QStringList colors;
+ colors << tr("base (alternate)")+"::::alternate-base"
+ << tr("base")+"::::base"
+ << tr("text (bright)")+"::::bright-text"
+ << tr("button")+"::::button"
+ << tr("text (button)")+"::::button-text"
+ << tr("dark")+"::::dark"
+ << tr("highlight")+"::::highlight"
+ << tr("text (highlight)")+"::::highlighted-text"
+ << tr("light")+"::::light"
+ << tr("link")+"::::link"
+ << tr("link (visited)")+"::::link-visited"
+ << tr("mid")+"::::mid"
+ << tr("midlight")+"::::midlight"
+ << tr("shadow")+"::::shadow"
+ << tr("text")+"::::text"
+ << tr("window")+"::::window"
+ << tr("text (window)")+"::::window-text";
+ colors.sort(); //sort by translated display name
+ colorMenu = new QMenu(m_ui->tool_color);
+ for(int i=0; i<colors.length(); i++){ colorMenu->addAction( colors[i].section("::::",0,0) )->setWhatsThis(colors[i].section("::::",1,1) ); }
+ m_ui->tool_color->setMenu(colorMenu);
+ connect(colorMenu, SIGNAL(triggered(QAction*)), this, SLOT(colorPicked(QAction*)) );
}
QSSEditorDialog::~QSSEditorDialog(){
@@ -39,3 +63,9 @@ void QSSEditorDialog::on_buttonBox_clicked(QAbstractButton *button){
else if(id == QDialogButtonBox::Save){ save(); }
else{ reject(); }
}
+
+void QSSEditorDialog::colorPicked(QAction* act){
+ QString id = act->whatsThis();
+ if(id.isEmpty()){ return; }
+ m_ui->textEdit->insertPlainText( QString("palette(%1)").arg(id) );
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h
index ea615e81..114611fe 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h
@@ -3,6 +3,8 @@
#include <QDialog>
#include <QString>
+#include <QMenu>
+#include <QAction>
namespace Ui {
class QSSEditorDialog;
@@ -20,12 +22,15 @@ public:
private slots:
void on_buttonBox_clicked(QAbstractButton *button);
+ void colorPicked(QAction*);
private:
void save();
void hideEvent(QHideEvent *);
Ui::QSSEditorDialog *m_ui;
QString m_filePath;
+ QMenu *colorMenu;
+
};
#endif // QSSEDITORDIALOG_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui
index 7627b4d4..f75a21c6 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui
@@ -31,14 +31,38 @@
</widget>
</item>
<item>
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Save</set>
- </property>
- </widget>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QToolButton" name="tool_color">
+ <property name="text">
+ <string>Palette</string>
+ </property>
+ <property name="icon">
+ <iconset theme="preferences-desktop-color">
+ <normaloff>.</normaloff>.</iconset>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Save</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</widget>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp
index d690ef5d..2cf0f221 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp
@@ -95,8 +95,7 @@ void QSSPage::on_removeButton_clicked(){
void QSSPage::readSettings(){
//load stylesheets
m_ui->qssListWidget->clear();
- findStyleSheets(lthemeengine::userStyleSheetPath());
- findStyleSheets(lthemeengine::sharedStyleSheetPath().join(", "));
+ findStyleSheets(QStringList() << lthemeengine::userStyleSheetPath() << lthemeengine::sharedStyleSheetPath());
QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
QStringList styleSheets = settings.value("Interface/stylesheets").toStringList();
for(int i = 0; i < m_ui->qssListWidget->count(); ++i){
@@ -106,16 +105,20 @@ void QSSPage::readSettings(){
}
}
-void QSSPage::findStyleSheets(const QString &path){
- QDir dir(path);
- dir.setFilter(QDir::Files);
- dir.setNameFilters(QStringList() << "*.qss");
- foreach (QFileInfo info, dir.entryInfoList()){
- QListWidgetItem *item = new QListWidgetItem(info.fileName(), m_ui->qssListWidget);
- item->setToolTip(info.filePath());
- item->setData(QSS_FULL_PATH_ROLE, info.filePath());
- item->setData(QSS_WRITABLE_ROLE, info.isWritable());
+void QSSPage::findStyleSheets(QStringList paths){
+ paths.removeDuplicates();
+ for(int i=0; i<paths.length(); i++){
+ if(!QFile::exists(paths[i])){ continue; }
+ QDir dir(paths[i]);
+ dir.setFilter(QDir::Files);
+ dir.setNameFilters(QStringList() << "*.qss");
+ foreach (QFileInfo info, dir.entryInfoList()){
+ QListWidgetItem *item = new QListWidgetItem(info.fileName(), m_ui->qssListWidget);
+ item->setToolTip(info.filePath());
+ item->setData(QSS_FULL_PATH_ROLE, info.filePath());
+ item->setData(QSS_WRITABLE_ROLE, info.isWritable());
}
+ }
}
void QSSPage::on_renameButton_clicked(){
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h
index 1fe0ed73..5e924ad9 100644
--- a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h
@@ -30,7 +30,7 @@ private slots:
private:
void readSettings();
- void findStyleSheets(const QString &path);
+ void findStyleSheets(QStringList paths);
Ui::QSSPage *m_ui;
QMenu *m_menu;
};
bgstack15