diff options
author | Weblate <noreply@weblate.org> | 2017-07-19 18:57:55 +0000 |
---|---|---|
committer | Weblate <noreply@weblate.org> | 2017-07-19 18:57:55 +0000 |
commit | 72e16f90563b4998a71feed573140041f2db8fc3 (patch) | |
tree | cc9418321d40d2fa187c6b48e174cea360f7fd27 /src-qt5/core/lumina-desktop-unified/src-screensaver/animations | |
parent | Translated using Weblate (Czech) (diff) | |
parent | Merge branch 'master' of github.com:trueos/lumina (diff) | |
download | lumina-72e16f90563b4998a71feed573140041f2db8fc3.tar.gz lumina-72e16f90563b4998a71feed573140041f2db8fc3.tar.bz2 lumina-72e16f90563b4998a71feed573140041f2db8fc3.zip |
Merge branch 'master' of github.com:trueos/lumina
Diffstat (limited to 'src-qt5/core/lumina-desktop-unified/src-screensaver/animations')
7 files changed, 298 insertions, 14 deletions
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 2abd1f90..017eaf9f 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 @@ -9,6 +9,9 @@ //Include all the known subclasses here, then add a unique ID for it to the functions at the bottom //#include "SampleAnimation.h" #include "Fireflies.h" +#include "Grav.h" +#include "SampleAnimation.h" +#include "Text.h" //============================== // PLUGIN LOADING/LISTING @@ -17,14 +20,16 @@ BaseAnimGroup* BaseAnimGroup::NewAnimation(QString type, QWidget *parent, QSetti //This is where we place all the known plugin ID's, and load the associated subclass if(type=="fireflies"){ return (new FirefliesAnimation(parent,set)); - /*}else if(type == "sample"){ - return (new SampleAnimation(parent, set));*/ - }else{ + }else if(type == "grav") { + return (new GravAnimation(parent, set)); + }else if(type == "text") { + return (new TextAnimation(parent, set)); + }else { //Unknown screensaver, return a blank animation group return (new BaseAnimGroup(parent, set)); } } - + QStringList BaseAnimGroup::KnownAnimations(){ - return (QStringList() << "fireflies" << "none"); + return (QStringList() << "fireflies" << "grav" << "text"); } diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h index 8798577f..b1324e78 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h @@ -26,13 +26,13 @@ public: canvas->setCursor( QCursor(Qt::BlankCursor) ); } ~BaseAnimGroup(){} - + //============================== // PLUGIN LOADING/LISTING (Change in the .cpp file) //============================== static BaseAnimGroup* NewAnimation(QString type, QWidget *parent, QSettings *set); static QStringList KnownAnimations(); - + }; #endif diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h index f1ef5fa3..75dfb1ae 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h @@ -46,7 +46,7 @@ public: fly = new QWidget(parent); range = parent->size(); maxX = range.width()/4; maxY = range.height()/4; - fly->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(215, 215, 143, 255), stop:0.83871 rgba(221, 235, 64, 140), stop:1 rgba(0, 0, 0, 255));"); + fly->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(215, 215, 143, 255), stop:0.83871 rgba(221, 235, 64, 140), stop:0.99 rgba(0, 0, 0, 255), stop:1 transparent);"); //setup the movement animation movement = new QPropertyAnimation(fly); movement->setTargetObject(fly); @@ -79,8 +79,8 @@ private: public: FirefliesAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} - ~FirefliesAnimation(){ - this->stop(); + ~FirefliesAnimation(){ + this->stop(); //while(fireflies.length()>0){ fireflies.takeAt(0)->deleteLater(); } } 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 new file mode 100644 index 00000000..ad1b1122 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h @@ -0,0 +1,185 @@ +//=========================================== +// 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_GRAV_ANIMATION_H +#define _LUMINA_DESKTOP_SCREEN_SAVER_GRAV_ANIMATION_H + +//PI is equal to 2*pi +#define PI 6.2832 + +#include "global-includes.h" +#include "BaseAnimGroup.h" +#include <QParallelAnimationGroup> +#include <QtMath> + +class Grav: public QParallelAnimationGroup{ + Q_OBJECT +private: + QWidget *planet; + QPropertyAnimation *orbit; + QSize range; + QList<QPoint> path; + double radius; + + void setupLoop(QPoint start, QPoint *ref){ + orbit->setStartValue(start); + + //Used to find overall speed. Distance from the planet to the sun + 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; + + //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); + 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) ))); + + //Creates a new point and creates a key as part of the animation + 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){ + //Adjust the orbit animation a bit + 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: + Grav(QWidget *parent) : QParallelAnimationGroup(parent){ + planet = new QWidget(parent); + range = parent->size(); + QPoint center = parent->geometry().center(); + + //Creates a random planet size. Between 12 and 45 pixels + double planet_radius = 1.75* ((qrand()%20)+7); + + //Creates a random color in RGB, then creates a circular gradient + QString color = "rgba(" + QString::number(qrand() % 256) + ", " + QString::number(qrand() % 256) + ", " + QString::number(qrand() % 256); + QString style = "background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 " + color+ + ", 255)" + " , stop:0.83871 " + color + ", 140)" + " , stop:0.99 rgba(0, 0, 0, 255), stop:1 transparent);"; + planet->setStyleSheet(style); + + //setup the orbit animation + orbit = new QPropertyAnimation(planet); + orbit->setPropertyName("pos"); + orbit->setTargetObject(planet); + + //Creates the random position of the planet, making sure it isn't too close to the sun + int randwidth = qrand()%(range.width()/2); + if(randwidth < range.width() + 100 and randwidth > range.width() - 100) randwidth = 100; + int randheight= qrand()%(range.height()/2); + if(randheight < range.height() + 100 and randheight > range.height() - 100) randheight = 100; + + //Creates all frames for the animation + setupLoop(QPoint(randwidth, randheight), ¢er); + this->addAnimation(orbit); + planet->show(); + + //Ensures the screensaver will not stop until the user wishes to login or it times out + this->setLoopCount(2000); //number of orbits + orbit->setEndValue(path.at(0)); + LoopChanged(0); //load initial values + + //Sets the initial size and location of the planet + planet->setGeometry(QRect(orbit->startValue().toPoint(), QSize(planet_radius, planet_radius))); + connect(this, SIGNAL(currentLoopChanged(int)), this, SLOT(LoopChanged(int)) ); + connect(this, SIGNAL(finished()), this, SLOT(stopped()) ); + } + ~Grav(){} + +}; + +class GravAnimation : public BaseAnimGroup{ + Q_OBJECT +private: + QList<Grav*> planets; + QWidget *sun; + QPropertyAnimation *wobble; + +private slots: + void checkFinished(){ + int running = 0; + for(int i=0; i<this->animationCount(); i++){ + if(this->animationAt(i)->state()==QAbstractAnimation::Running){ running++; } + } + if(running<=1){ wobble->stop(); emit wobble->finished();} + } + +public: + GravAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + ~GravAnimation(){ + //this->stop(); + } + + void LoadAnimations(){ + //Creates the sun, which is a thin shell with a gradient from green to yellow + 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));"); + sun->setStyleSheet(sunstyle); + + //Creates the sun's pulsing animation + wobble = new QPropertyAnimation(sun); + wobble->setPropertyName("geometry"); + wobble->setTargetObject(sun); + QRect initgeom = QRect(center-QPoint(12,12), QSize(60, 60)); + wobble->setStartValue(initgeom); + wobble->setKeyValueAt(0, initgeom ); //starting point + wobble->setKeyValueAt(1, initgeom ); //starting point + wobble->setKeyValueAt(0.5, QRect(center-QPoint(18,18), QSize(90, 90))); //starting point + wobble->setDuration(2000); + wobble->setLoopCount(-1); + 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;"); + + //Pulls number of planets from settings, with 10 as default + int number = settings->value("planets/number",10).toInt(); + + //Loops through all planets and sets up the animations, then adds them to the base group and vector, which + for(int i=0; i<number; i++){ + if(planets.length()>number){ continue; } + Grav *tmp = new Grav(canvas); + this->addAnimation(tmp); + connect(tmp, SIGNAL(finished()), this, SLOT(checkFinished())); + planets << tmp; + } + while(planets.length()>number){planets.takeAt(number)->deleteLater(); } + } + +}; +#endif diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h index 972a5109..c2bb0c96 100644 --- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h @@ -20,7 +20,7 @@ private: public: SampleAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} ~SampleAnimation(){ this->stop(); delete ball; } - + void LoadAnimations(){ //qDebug() << "Loading Sample Animation"; ball = new QWidget(canvas); 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 new file mode 100644 index 00000000..a4c49692 --- /dev/null +++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h @@ -0,0 +1,93 @@ +//=========================================== +// 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_Text_ANIMATION_H +#define _LUMINA_DESKTOP_SCREEN_SAVER_Text_ANIMATION_H + +//PI is equal to 2*pi +#define PI 6.2832 + +#include "global-includes.h" +#include "BaseAnimGroup.h" +#include <QParallelAnimationGroup> +#include <QtMath> + +class Text: public QParallelAnimationGroup{ + Q_OBJECT +private: + QLabel *text; + QPropertyAnimation *movement; + QSize range; + QPoint v; + bool bounce; + +private slots: + void LoopChanged(){ + movement->setStartValue(movement->endValue()); + QPoint currLoc = movement->startValue().toPoint(); + bounce = !(currLoc.y() < 100 or currLoc.y() > range.height()-100 or currLoc.x() > range.width()-100 or currLoc.x() < 100); + if((currLoc.y() < 10 or currLoc.y() > range.height()-40) and !bounce) { + v.setY((v.y() * -1) + (qrand() % 20 - 10)); + }else if((currLoc.x() > range.width()-10 or currLoc.x() < 10) and !bounce) { + v.setX((v.x() * -1) + (qrand() % 20 - 10)); + } + currLoc.setX(currLoc.x() + v.x()); + currLoc.setY(currLoc.y() + v.y()); + movement->setEndValue(currLoc); + } + void stopped(){ qDebug() << "text stopped"; text->hide();} + +public: + Text(QWidget *parent) : QParallelAnimationGroup(parent){ + text = new QLabel(parent); + range = parent->size(); + QPoint center = parent->geometry().center(); + + QString color = "rgba(" + QString::number(qrand() % 206 + 50) + ", " + QString::number(qrand() % 206 + 50) + ", " + QString::number(qrand() % 206 + 50); + text->setStyleSheet("QLabel {background-color: rgba(255, 255, 255, 10); color: " + color + "); }"); + text->setFont(QFont("Courier", 24, QFont::Bold)); + text->setText("test"); + QFontMetrics metrics(text->font()); + text->setMinimumSize(QSize( metrics.width(text->text())+10, metrics.height()*text->text().count("\n") +10)); + + movement = new QPropertyAnimation(text); + movement->setPropertyName("pos"); + movement->setTargetObject(text); + + this->addAnimation(movement); + text->show(); + v.setX((qrand() % 100 + 50) * qPow(-1, qrand() % 2)); + v.setY((qrand() % 100 + 50) * qPow(-1, qrand() % 2)); + movement->setStartValue(center); + //Ensures the screensaver will not stop until the user wishes to login or it times out + this->setLoopCount(2000); //number of movements + movement->setDuration(200); + movement->setEndValue(QPoint(qrand() % (int)range.height(), qrand() % range.width())); + LoopChanged(); //load initial values + + connect(this, SIGNAL(currentLoopChanged(int)), this, SLOT(LoopChanged()) ); + connect(this, SIGNAL(finished()), this, SLOT(stopped()) ); + } + ~Text(){} + +}; + +class TextAnimation : public BaseAnimGroup{ + Q_OBJECT +public: + TextAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){} + ~TextAnimation(){ + this->stop(); + } + + void LoadAnimations(){ + canvas->setStyleSheet("background: black;"); + Text *tmp = new Text(canvas); + this->addAnimation(tmp); + } + +}; +#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 919ec4e0..35141a0e 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 @@ -1,7 +1,8 @@ SOURCES += $$PWD/BaseAnimGroup.cpp HEADERS += $$PWD/BaseAnimGroup.h \ -# $$PWD/SampleAnimation.h \ - $${PWD}/Fireflies.h - + $$PWD/SampleAnimation.h \ + $${PWD}/Fireflies.h \ + $${PWD}/Grav.h \ + $${PWD}/Text.h #FORMS += |