1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
//===========================================
// 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, scriptPath;
QSize screenSize;
bool animate, scriptLoad;
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()];
if(scriptLoad){
QProcess process;
process.start("/home/zwelch/test.sh");
process.waitForFinished(1000);
QByteArray output = process.readAllStandardOutput();
qDebug() << output;
pixmap.load(imagePath+imageFiles[qrand() % imageFiles.size()]);
}else{
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, bool scriptLoad, QString scriptPath) : QParallelAnimationGroup(parent){
imagePath = path;
image = new QLabel(parent);
screenSize = parent->size();
this->animate = animate;
this->scriptLoad = scriptLoad;
this->scriptPath = scriptPath;
//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();
bool scriptLoad = settings->value("imageSlideshow/scriptLoad", true).toBool();
QString scriptPath;
if(scriptLoad)
scriptPath = settings->value("imageSlideshow/scriptPath", "/usr/local/backgrounds/script.sh").toString();
ImageSlideshow *tmp = new ImageSlideshow(canvas, imagePath, animate, scriptLoad, scriptPath);
this->addAnimation(tmp);
}
};
#endif
|