/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "../src/weathermanager.h"
#include "commonfunc.h"
#include "screensaver.h"
#include
#include
#include
#include
#include "config.h"
#define TIME_TYPE_SCHEMA "org.ukui.control-center.panel.plugins"
#define THEME_TYPE_SCHENA "org.ukui.style"
#define GSETTINGS_SCHEMA_SCREENSAVER "org.ukui.screensaver"
#define KEY_MESSAGE_NUMBER "message-number"
#define KEY_MESSAGE_SHOW_ENABLED "show-message-enabled"
#define KEY_HOURSYSTEM "hoursystem"
#define KEY_DATE_FORMAT "date"
#define WORKING_DIRECTORY "/usr/share/ukui-screensaver"
QTime Screensaver::m_currentTime = QTime::currentTime();
extern bool bControlFlg;
Screensaver::Screensaver(bool isscreensaver,QWidget *parent):
isScreensaver(isscreensaver),
QWidget(parent),
switchTimer(nullptr),
backgroundPath(""),
cycleTime(300),
isCustom(false),
isCShowRestTime(true),
isUShowRestTime(true),
myTextLabel(nullptr),
myPreviewLabel(nullptr),//预览label标签
configuration(SCConfiguration::instance()),
myTextWidget(nullptr),
centerWidget(nullptr),
sleepTime(nullptr),
timer(nullptr),
background(""),
autoSwitch(nullptr),
vboxFrame(nullptr),
isAutoSwitch(false),
flag(0),
hasChanged(false),
process(nullptr),
screenLabel(nullptr),
respondClick(false)
{
installEventFilter(this);
// setWindowFlags(Qt::X11BypassWindowManagerHint);
setUpdateCenterWidget();
setMouseTracking(true);
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
isCustom = configuration->getIsCustom();
if(isCustom){
cycleTime = configuration->getCycleTime();
isAutoSwitch = configuration->getAutoSwitch();
backgroundPath = configuration->getBackgroundPath();
isCShowRestTime = configuration->getCShowRestTime();
textIsCenter = configuration->getTextIsCenter();
myText = configuration->getMyText();
}else
isUShowRestTime = configuration->getUShowRestTime();
curFontSize = configuration->getFontSize();
m_ptToPx = configuration->getPtToPx();
initUI();
m_background = new MBackground();
QString backgroundFile = configuration->getDefaultBackground();
background = loadFromFile(backgroundFile);
QList labelList = this->findChildren();
for(int i = 0;isetAlignment(Qt::AlignCenter);
}
#ifndef USE_INTEL
updateBackgroundPath();
startSwitchImages();
connectSingles();
#endif
QGSettings *themeSettings;
if(QGSettings::isSchemaInstalled(TIME_TYPE_SCHEMA))
themeSettings = new QGSettings(TIME_TYPE_SCHEMA,"",this);
connect(themeSettings, &QGSettings::changed,
this, &Screensaver::themeChanged);
screenLabel = new QLabel(this);
screenLabel->setObjectName("screenLabel");
screenLabel->setText(tr("Picture does not exist"));
screenLabel->adjustSize();
screenLabel->hide();
m_strPreViewTrans = tr("View");
}
Screensaver::~Screensaver()
{
}
void Screensaver::themeChanged()
{
if(myTextLabel){
QColor highLightColor = palette().color(QPalette::Base);
QString stringColor = QString("rgba(%1,%2,%3,82%)")
.arg(highLightColor.red())
.arg(highLightColor.green())
.arg(highLightColor.blue());
QColor textColor = palette().color(QPalette::Text);
QString textString = QString("rgb(%1,%2,%3)")
.arg(textColor.red())
.arg(textColor.green())
.arg(textColor.blue());
QColor borderColor = palette().color(QPalette::BrightText);
QString borderString = QString("rgba(%1,%2,%3,85%)")
.arg(borderColor.red())
.arg(borderColor.green())
.arg(borderColor.blue());
if(width() < 600 || height()<400)
myTextLabel->setStyleSheet(QString("font-size:5px;border-radius: 2px;background: %1;color: %2;padding: 4px 8px 4px 8px;border-width: 1px;border-style: solid;border-color:%3;") \
.arg(stringColor).arg(textString).arg(borderString));
else
myTextLabel->setStyleSheet(QString("font-size:24px;border-radius: 6px;background: %1;color: %2;padding: 24px 24px 24px 24px;border-width: 1px;border-style: solid;border-color:%3;") \
.arg(stringColor).arg(textString).arg(borderString));
}
}
void Screensaver::connectSingles()
{
connect(configuration, &SCConfiguration::autoSwitchChanged,
this, &Screensaver::autoSwitchChanged);
connect(configuration, &SCConfiguration::backgroundPathChanged,
this, &Screensaver::backgroundPathChanged);
connect(configuration, &SCConfiguration::cycleTimeChanged,
this, &Screensaver::cycleTimeChanged);
connect(configuration, &SCConfiguration::myTextChanged,
this, &Screensaver::myTextChanged);
connect(configuration, &SCConfiguration::showCRestTimeChanged,
this, &Screensaver::showCRestTimeChanged);
connect(configuration, &SCConfiguration::showURestTimeChanged,
this, &Screensaver::showURestTimeChanged);
connect(configuration, &SCConfiguration::textIsCenterChanged,
this, &Screensaver::textIsCenterChanged);
connect(configuration, &SCConfiguration::messageNumberChanged,
this, &Screensaver::onMessageNumberChanged);
connect(configuration, &SCConfiguration::messageShowEnableChanged,
this, &Screensaver::onMessageShowEnabledChanged);
connect(configuration, &SCConfiguration::timeTypeChanged,
this, &Screensaver::onTimeFormatChanged);
connect(configuration, &SCConfiguration::dateTypeChanged,
this, &Screensaver::onDateFormatChanged);
connect(configuration, &SCConfiguration::blurChanged,
this, &Screensaver::onBlurNumChanged);
connect(configuration, &SCConfiguration::styleChanged,
this, &Screensaver::onStyleChanged);
}
void Screensaver::onBlurNumChanged(int num)
{
blur_Num = num;
if(curStyle == "ukui-dark" || curStyle == "ukui-black"){
myTextLabel->setStyleSheet(QString("QLabel{background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:16px}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:8px}").arg(blur_Num * 0.01));
} else{
myTextLabel->setStyleSheet(QString("QLabel{background: rgba(255, 255, 255, %1); border-radius:16px}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(255, 255, 255, %1); border-radius:8px}").arg(blur_Num * 0.01));
}
}
void Screensaver::onStyleChanged(QString style)
{
curStyle = style;
if(curStyle == "ukui-dark" || curStyle == "ukui-black"){
myTextLabel->setStyleSheet(QString("QLabel{background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:16px}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:8px}").arg(blur_Num * 0.01));
} else{
myTextLabel->setStyleSheet(QString("QLabel{background: rgba(255, 255, 255, %1); border-radius:16px}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(255, 255, 255, %1); border-radius:8px}").arg(blur_Num * 0.01));
}
}
void Screensaver::onTimeFormatChanged(int type){
timeType = type;
}
void Screensaver::onDateFormatChanged(QString type){
dateType = type;
}
void Screensaver::onFontSizeChanged(int fontSize)
{
curFontSize = fontSize;
}
void Screensaver::onMessageNumberChanged(int num)
{
int number = configuration->getMessageNumber();
(configuration->getMessageShowEnable() && number > 0) ? showNotice() : hideNotice();
}
void Screensaver::onMessageShowEnabledChanged(bool enabled)
{
int number = configuration->getMessageNumber();
(configuration->getMessageShowEnable() && number > 0) ? showNotice() : hideNotice();
}
void Screensaver::autoSwitchChanged(bool isSwitch)
{
if(!isCustom)
return ;
isAutoSwitch = isSwitch;
if(!isSwitch){
stopSwitchImages();
}
startSwitchImages();
}
/*
* 图片路径改变
*/
void Screensaver::backgroundPathChanged(QString path)
{
backgroundPath = path;
if(!isCustom)
return ;
updateBackgroundPath();//更新图片路径
stopSwitchImages();
startSwitchImages();
}
void Screensaver::cycleTimeChanged(int cTime)
{
cycleTime = cTime;
if(!isCustom || !autoSwitch)
return ;
stopSwitchImages();
startSwitchImages();
}
void Screensaver::myTextChanged(QString text)
{
if(!isCustom)
return ;
myText = text;
if(textIsCenter && centerWidget){
if(centerlabel1)
centerlabel1->setText(myText);
if(centerlabel2){
centerlabel2->setText("");
centerlabel2->hide();
}
if(authorlabel){
authorlabel->setText("");
authorlabel->hide();
}
centerWidget->adjustSize();
centerWidget->setGeometry((width()-centerWidget->width())/2,(height()-centerWidget->height())/2,
centerWidget->width(),centerWidget->height());
if((height()-centerWidget->height())/2 < timeLayout->y() + timeLayout->height())
centerWidget->setGeometry((width()-centerWidget->width())/2,timeLayout->y() + timeLayout->height(),
centerWidget->width(),centerWidget->height());
}else{
setRandomText();
setRandomPos();
if(centerWidget)
centerWidget->hide();
}
}
void Screensaver::showCRestTimeChanged(bool isShow)
{
isCShowRestTime = isShow;
if(!isCustom)
return;
setSleeptime(isCShowRestTime);
}
void Screensaver::showURestTimeChanged(bool isShow)
{
isUShowRestTime = isShow;
if(isCustom)
return;
setSleeptime(isUShowRestTime);
}
void Screensaver::textIsCenterChanged(bool isCenter)
{
textIsCenter = isCenter;
if(!isCustom)
return ;
if(isCenter){
if(myTextWidget)
myTextWidget->hide();
if(!centerWidget){
setCenterWidget();
resize(width(),height());
}
else{
centerWidget->show();
myTextChanged(myText);
}
}else{
if(centerWidget)
centerWidget->hide();
setRandomText();
setRandomPos();
}
}
bool Screensaver::eventFilter(QObject *obj, QEvent *event)
{
#ifndef USE_INTEL
if(obj == this){
if(event->type()==QEvent::MouseButtonPress){
if(!isScreensaver){
if(!process){
process = new QProcess(this);
}
process->start("ukui-screensaver-command -s");
}
}
}
#endif
return false;
}
void Screensaver::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
/*时间未同步的时候重新刷新一次,主要是避免睡眠唤醒时的时间跳变*/
/* if (m_currentTime.hour() != QTime::currentTime().hour() ||
m_currentTime.minute() != QTime::currentTime().minute()) {
updateTime();
}
*/
if(isCustom && imagePaths.count()==0){
painter.setBrush(QColor("#000000"));
if(screenLabel->isHidden()){
screenLabel->show();
}
}else{
if(background.isNull()){
QColor cor = "#035290";
painter.setBrush(cor);
painter.drawRect(-1,-1,this->width()+1,this->height()+1);
} else {
painter.drawPixmap(0,0,this->width(),this->height(), getPaddingPixmap());
QPainterPath path;
QPainter painter1(this);
painter1.setOpacity(0.25);
painter1.setRenderHint(QPainter::Antialiasing); // 反锯齿;
painter1.setClipping(true);
painter1.setPen(Qt::transparent);
path.addRect(this->rect());
path.setFillRule(Qt::WindingFill);
painter1.setBrush(QColor("#000000"));
painter1.setPen(Qt::transparent);
painter1.drawPath(path);
}
}
/*这里是为了不显示笔的线条*/
//painter.drawRect(-1,-1,this->width()+1,this->height()+1);
}
void Screensaver::isMovie()
{
if(!currentPixmap.isEmpty()){
currentPixmap.clear();
currentCount = 0;
if(movieTimer){
movieTimer->stop();
movieTimer->deleteLater();
movieTimer = nullptr;
}
}
if(!is_gif){
repaint();
return;
}
QMovie *movie = new QMovie(currentPath);
movie->setScaledSize(QSize(this->width(), this->height()));
for (int i =0; i< movie->frameCount(); ++i) {
movie->jumpToFrame(i);
currentPixmap.append(movie->currentPixmap());
if(i == 0)
delayTime = movie->nextFrameDelay();
}
if(!movieTimer){
movieTimer = new QTimer(this);
connect(movieTimer, &QTimer::timeout, this, [&]{
if(currentCount == currentPixmap.count() - 1)
currentCount = 0;
else
currentCount += 1;
background = currentPixmap.at(currentCount);
repaint();
});
}
if(delayTime < 50)
movieTimer->start(50);
else
movieTimer->start(delayTime);
}
QPixmap Screensaver::getPaddingPixmap()
{
if (background.width() == 0 || background.height() == 0)
{
return QPixmap();
}
bool useHeight;
float scaled = 0.0;
QPixmap scaledPixmap;
QPixmap paddingPixmap;
qint64 rw = qint64(this->height()) * qint64(background.width()) / qint64(background.height());
useHeight = (rw >= this->width());
if (useHeight) {
scaled = float(this->height()) / float(background.height());
scaledPixmap = background.scaled(background.width() * scaled, this->height());
paddingPixmap = scaledPixmap.copy((background.width() * scaled - this->width()) / 2 , 0, this->width(), this->height());
} else {
scaled = float(this->width()) / float(background.width());
scaledPixmap = background.scaled(this->width(), background.height() * scaled);
paddingPixmap = scaledPixmap.copy(0 , (background.height() * scaled - this->height()) / 2,this->width(), this->height());
}
return paddingPixmap;
}
void Screensaver::addClickedEvent(){
respondClick = true;
}
void Screensaver::resizeEvent(QResizeEvent */*event*/)
{
float scale = 1.0;
scale = (float)width()/1920;
if((width() < 600 || height()<400) && !isScreensaver){//当显示在控制面板上时,字体缩小三倍。
if(flag == 0)
{
QList labelList = this->findChildren();
for(int i = 0;ifont().pixelSize();
int fontpt = labelList.at(i)->font().pointSize();
if (fontsize > 0) {
#ifdef USE_INTEL
const QString SheetStyle = QString("font-size:%1px;").arg(fontsize/3);
#else
const QString SheetStyle = QString("font-size:%1px;").arg(fontsize/4);
#endif
labelList.at(i)->setStyleSheet(SheetStyle);
} else {
QFont font = labelList.at(i)->font();
#ifdef USE_INTEL
font.setPointSize(fontpt/3);
#else
font.setPointSize(fontpt/4);
#endif
labelList.at(i)->setFont(font);
}
}
QList childList = timeLayout->findChildren();
for (int i = 0; i < childList.count(); ++i) {
childList.at(i)->adjustSize();
}
timeLayout->adjustSize();
if(centerWidget)
centerWidget->adjustSize();
}
flag = 1;
#ifndef USE_INTEL
if(myTextWidget){
if(curStyle == "ukui-dark" || curStyle == "ukui-black"){
myTextLabel->setStyleSheet(QString("QLabel{font-size:5px;border-radius: 2px;padding: 4px 8px 4px 8px;border-width: 1px;\
background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:16px}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:8px}").arg(blur_Num * 0.01));
} else{
myTextLabel->setStyleSheet(QString("QLabel{font-size:5px;border-radius: 2px;padding: 4px 8px 4px 8px;border-width: 1px;\
background: rgba(255, 255, 255, %1);}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(255, 255, 255, %1); border-radius:8px}").arg(blur_Num * 0.01));
}
cycleLabel->setFixedSize(5, 5);
}
if(screenLabel)
screenLabel->adjustSize();
if(sleepTime)
sleepTime->setSmallMode();
#endif
scale = 0.1;
}
#ifdef USE_INTEL
int x = 840*scale;
int y = 96*scale;
m_weatherLaout->setGeometry((this->width()-m_weatherLaout->width())/2, y, m_weatherLaout->geometry().width(), m_weatherLaout->geometry().height());
timeLayout->setGeometry((this->width()-timeLayout->width())/2,m_weatherLaout->geometry().bottom()+33,
timeLayout->geometry().width(),timeLayout->geometry().height());
if(centerWidget){
centerWidget->adjustSize();
centerWidget->setGeometry((width()-centerWidget->width())/2,(height() * 85) / 100 - (centerWidget->height())/2,
centerWidget->width(),centerWidget->height());
if((height()-centerWidget->height())/2 < timeLayout->y() + timeLayout->height())
centerWidget->setGeometry((width()-centerWidget->width())/2,timeLayout->y() + timeLayout->height(),
centerWidget->width(),centerWidget->height());
}
if (m_widgetNotice)
{
m_widgetNotice->setGeometry((this->width()-m_widgetNotice->width())/2, (centerWidget->y() + centerWidget->height() + 20),
m_widgetNotice->geometry().width(), m_widgetNotice->geometry().height());
}
#else
int x = (this->width()-timeLayout->geometry().width())/2;
int y = 59*scale;
timeLayout->setGeometry(x,y,timeLayout->geometry().width(),timeLayout->geometry().height());
if(sleepTime){
x = 26*scale;
y = this->height() - sleepTime->geometry().height() - 26*scale;
sleepTime->setGeometry(x,y,sleepTime->geometry().width(),sleepTime->geometry().height());
}
if(screenLabel){
screenLabel->setGeometry((width() - screenLabel->width())/2,y,screenLabel->width(),screenLabel->height());
}
if(centerWidget){
centerWidget->adjustSize();
centerWidget->setGeometry((width()-centerWidget->width())/2,(height()-centerWidget->height())/2,
centerWidget->width(),centerWidget->height());
if((height()-centerWidget->height())/2 < timeLayout->y() + timeLayout->height())
centerWidget->setGeometry((width()-centerWidget->width())/2,timeLayout->y() + timeLayout->height(),
centerWidget->width(),centerWidget->height());
}
if(myTextWidget)
setRandomPos();
#endif
}
void Screensaver::setRandomPos()
{
myTextWidget->adjustSize();
int x1 = 10;
int x2 = width() - 10 - myTextWidget->width();
int y1 = timeLayout->geometry().bottom() + 10;
int y2;
if(sleepTime)
y2 = sleepTime->geometry().top() - myTextWidget->height() - 10;
else
y2 = geometry().bottom() - myTextWidget->height() - 10;
int x = 0;
int y = 0;
if(x2 > x1)
x = qrand()%(x2 - x1) + x1;
if(y2 > y1)
y = qrand()%(y2 - y1) + y1;
myTextWidget->move(x,y);
}
void Screensaver::setUpdateCenterWidget()
{
//QString lang = qgetenv("LANG");
QString lang = QLocale::system().name();
QString homePath=qgetenv("HOME");
QString cwdPath="/usr/share/ukui-screensaver/";
QString languageDirPath=cwdPath+"language/";
QString defaultLanguageFilePath=languageDirPath+"screensaver-en_US.ini";
qDebug()<<"homePath="<= date1 && QDate::currentDate()<=date2){
useJd = true;
}
if(useJd && jdConfigFileInfo.isFile()){
qsettings = new QSettings(jdLanguageFilePath,QSettings::IniFormat);
}else if (homeConfigFileInfo.isFile()){
qsettings = new QSettings(homeLanguageFilePath,QSettings::IniFormat);
}
else if(fileInfo.isFile()){
qsettings = new QSettings(languageFilePath,QSettings::IniFormat);
}
else{
qsettings = new QSettings(defaultLanguageFilePath,QSettings::IniFormat);
}
}
else{
qsettings = new QSettings(defaultLanguageFilePath,QSettings::IniFormat);
}
qsettings->setIniCodec(QTextCodec::codecForName("UTF-8"));
}
void Screensaver::updateBackgroundPath()
{
qDebug() << "ScreenSaver::startSwitchImages";
QFileInfo fileInfo(backgroundPath);
imagePaths.clear();
if(fileInfo.isFile())
return;
QList formats = QImageReader::supportedImageFormats();
if(fileInfo.isDir()) {
QDir dir(backgroundPath);
QStringList files = dir.entryList(QDir::Files | QDir::Readable);
for(QString file : files) {
fileInfo.setFile(file);
QString suffix = fileInfo.suffix();
if(formats.contains(suffix.toUtf8()) && file.right(4) != ".ico" && file.right(4) != ".tga"){
// qDebug() << "file:" <=imagePaths.count() - 1 || currentIndex<0){
currentIndex = 0;
}else{
currentIndex ++;
}
background = loadFromFile(imagePaths.at(currentIndex));
currentPath = imagePaths.at(currentIndex);
is_gif = currentPath.endsWith(".gif");
}
isMovie();
});
}
switchTimer->start(cycleTime * 1000);
isMovie();
}
}
void Screensaver::stopSwitchImages()
{
if(switchTimer && switchTimer->isActive())
switchTimer->stop();
}
void Screensaver::onBackgroundChanged()
{
opacity = 1.0;
fadeTimer = new QTimer(this);
connect(fadeTimer, &QTimer::timeout, this, [&]{
opacity -= 0.1;
if(opacity <= 0)
fadeTimer->stop();
else
repaint();
});
fadeTimer->start(50);
}
void Screensaver::updateCenterWidget(int index)
{
if(!centerWidget )
return ;
QStringList qlist = qsettings->childGroups();
if(qlist.count()<1)
return;
if(index<=1){
index = qrand() % qlist.count() + 1;
}
qsettings->beginGroup(QString::number(index));
if(qsettings->contains("OL")){
if(qsettings->value("OL").typeName() == "QString")
centerlabel1->setText(qsettings->value("OL").toString());
else
centerlabel1->setText(qsettings->value("OL").toStringList().join(' '));
centerlabel2->hide();
#ifndef USE_INTEL
authorlabel->setText(qsettings->value("author").toString());
#endif
}
else if(qsettings->contains("FL"))
{
if(qsettings->value("FL").typeName() == "QString")
centerlabel2->setText(qsettings->value("FL").toString());
else
centerlabel2->setText(qsettings->value("FL").toStringList().join(' '));
if(qsettings->value("SL").typeName() == "QString")
centerlabel2->setText(qsettings->value("SL").toString());
else
centerlabel2->setText(qsettings->value("SL").toStringList().join(' '));
centerlabel2->show();
#ifndef USE_INTEL
authorlabel->setText(qsettings->value("author").toString());
#endif
}
#ifdef USE_INTEL
if(qsettings->contains("author") && !qsettings->value("author").toString().isEmpty())
{
authorlabel->setText(qsettings->value("author").toString());
authorlabel->show();
}
else
{
authorlabel->setText("");
authorlabel->hide();
}
#endif
centerWidget->adjustSize();
#ifdef USE_INTEL
centerWidget->setGeometry((width()-centerWidget->width())/2,(height() * 85) / 100 - (centerWidget->height())/2,
centerWidget->width(),centerWidget->height());
if((height()-centerWidget->height())/2 < timeLayout->y() + timeLayout->height())
centerWidget->setGeometry((width()-centerWidget->width())/2,timeLayout->y() + timeLayout->height(),
centerWidget->width(),centerWidget->height());
#else
centerWidget->setGeometry((width()-centerWidget->width())/2,(height()-centerWidget->height())/2,
centerWidget->width(),centerWidget->height());
if((height()-centerWidget->height())/2 < timeLayout->y() + timeLayout->height())
centerWidget->setGeometry((width()-centerWidget->width())/2,timeLayout->y() + timeLayout->height(),
centerWidget->width(),centerWidget->height());
#endif
qsettings->endGroup();
}
void Screensaver::initUI()
{
QFile qssFile;
#ifdef USE_INTEL
qssFile.setFileName(":/qss/assets/default-intel.qss");
#else
qssFile.setFileName(":/qss/assets/default.qss");
#endif
if(qssFile.open(QIODevice::ReadOnly)) {
setStyleSheet(qssFile.readAll());
}
qssFile.close();
#ifdef USE_INTEL
setWeatherLayout();
setDatelayout();
setCenterWidget();
setNoticeLaout();
m_weatherManager->getWeather();
connect(m_weatherManager, &WeatherManager::onWeatherUpdate,
this, &Screensaver::getWeatherFinish);
#else
if(isCustom)
setSleeptime(isCShowRestTime);
else
setSleeptime(isUShowRestTime);
setDatelayout();
setCenterWidget();
setRandomText();
if(textIsCenter || myText == ""){
myTextWidget->hide();
centerWidget->show();
}else{
centerWidget->hide();
myTextWidget->show();
}
#endif
}
void Screensaver::setDatelayout()
{
timeType = configuration->getTimeType();
dateType = configuration->getDateType();
#ifdef USE_INTEL
timeLayout = new QWidget(this);
timeLayout->setFixedSize(((timeType == 12) ? 397:326), 117);
QHBoxLayout *htimeLayout = new QHBoxLayout(timeLayout);
htimeLayout->setContentsMargins(0,0,0,0);
QWidget *timeWidget = new QWidget(this);
timeWidget->setFixedSize(235, 117);
QGridLayout *gtimeLayout = new QGridLayout(timeWidget);
gtimeLayout->setContentsMargins(0,0,0,12);
this->dateOfLocaltimeHour = new QLabel(this);
this->dateOfLocaltimeHour->setObjectName("dateOfLocaltime");
this->dateOfLocaltimeHour->setAlignment(Qt::AlignTop | Qt::AlignLeft);
this->dateOfLocaltimeHour->setFixedSize(107, 96);
this->dateofLocaltimeColon = new QLabel(this);
this->dateofLocaltimeColon->setObjectName("dateOfLocaltime");
this->dateofLocaltimeColon->setAlignment(Qt::AlignCenter);
this->dateofLocaltimeColon->setFixedSize(21, 96);
this->dateofLocaltimeColon->setText(":");
this->dateOfLocaltimeMinute = new QLabel(this);
this->dateOfLocaltimeMinute->setObjectName("dateOfLocaltime");
this->dateOfLocaltimeMinute->setAlignment(Qt::AlignTop | Qt::AlignLeft);
this->dateOfLocaltimeMinute->setFixedSize(107, 96);
gtimeLayout->setSpacing(0);
gtimeLayout->setRowMinimumHeight(0, 9);
gtimeLayout->setRowMinimumHeight(1, 87);
gtimeLayout->setRowMinimumHeight(2, 9);
gtimeLayout->setColumnMinimumWidth(0, 107);
gtimeLayout->setColumnMinimumWidth(1, 21);
gtimeLayout->setColumnMinimumWidth(2, 107);
gtimeLayout->addWidget(dateOfLocaltimeHour, 1, 0, 2, 1);
gtimeLayout->addWidget(dateofLocaltimeColon, 0, 1, 2, 1);
gtimeLayout->addWidget(dateOfLocaltimeMinute, 1, 2, 2, 1);
QWidget *dateWidget = new QWidget(this);
dateWidget->setFixedSize(((timeType == 12) ? 154:83), 117);
QVBoxLayout *vDateLaout = new QVBoxLayout(dateWidget);
vDateLaout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
vDateLaout->setContentsMargins(0,18,0,12);
this->dateOfWeek = new QLabel(this);
this->dateOfWeek->setObjectName("dateOfWeek");
this->dateOfWeek->setAlignment(Qt::AlignTop | Qt::AlignLeft);
this->dateOfWeek->setFixedWidth(83);
this->dateOfDay = new QLabel(this);
this->dateOfDay->setObjectName("dateOfDay");
this->dateOfDay->setAlignment(Qt::AlignTop | Qt::AlignLeft);
this->dateOfDay->setFixedSize(((timeType == 12) ? 154:83),32);
updateTime();
updateDate();
this->dateOfWeek->adjustSize();
vDateLaout->addWidget(dateOfWeek);
vDateLaout->setSpacing(4);
vDateLaout->addWidget(dateOfDay);
htimeLayout->addWidget(timeWidget);
htimeLayout->addSpacing(8);
htimeLayout->addWidget(dateWidget);
#else
timeLayout = new QWidget(this);
QVBoxLayout *vtimeLayout = new QVBoxLayout(timeLayout);
this->dateOfLocaltime = new QLabel(this);
sysFont= qApp->font();
sysFont.setPointSize((58 + curFontSize) *m_ptToPx);
this->dateOfLocaltime->setFont(sysFont);
if(timeType == 12)
this->dateOfLocaltime->setText(QDateTime::currentDateTime().toString("A hh:mm"));
else
this->dateOfLocaltime->setText(QDateTime::currentDateTime().toString("hh:mm"));
this->dateOfLocaltime->setObjectName("dateOfLocaltime");
this->dateOfLocaltime->setAlignment(Qt::AlignCenter);
this->dateOfLocaltime->adjustSize();
vtimeLayout->addWidget(dateOfLocaltime);
this->dateOfDay = new QLabel(this);
sysFont.setPointSize((16 + curFontSize) *m_ptToPx);
this->dateOfDay->setFont(sysFont);
if(dateType == "cn")
this->dateOfDay->setText(QDate::currentDate().toString("yyyy/MM/dd ddd").replace("周","星期"));
else
this->dateOfDay->setText(QDate::currentDate().toString("yyyy-MM-dd ddd").replace("周","星期"));
this->dateOfDay->setObjectName("dateOfDay");
this->dateOfDay->setAlignment(Qt::AlignCenter);
this->dateOfDay->adjustSize();
vtimeLayout->addWidget(this->dateOfDay);
timeLayout->adjustSize();
updateDate();
#endif
}
void Screensaver::setWeatherLayout()
{
m_weatherLaout = new QWidget(this);
QHBoxLayout *hWeatherLayout = new QHBoxLayout(m_weatherLaout);
hWeatherLayout->setContentsMargins(0, 0, 0, 0);
this->m_weatherIcon = new QLabel(this);
this->m_weatherArea = new QLabel(this);
this->m_weatherCond = new QLabel(this);
this->m_weatherTemperature = new QLabel(this);
m_weatherIcon->setPixmap(m_weatherManager->getWeatherIcon());
m_weatherArea->setText(m_weatherManager->getCityName());
if (!m_weatherManager->getCond().isEmpty())
m_weatherCond->setText("·" + m_weatherManager->getCond());
m_weatherTemperature->setText(m_weatherManager->getTemperature());
m_weatherArea->setStyleSheet("font-size:26px;color:#ffffff");
m_weatherCond->setStyleSheet("font-size:26px;color:#ffffff");
m_weatherTemperature->setStyleSheet("font-size:26px;color:#ffffff");
hWeatherLayout->addWidget(m_weatherIcon);
hWeatherLayout->addSpacing(8);
hWeatherLayout->addWidget(m_weatherArea);
hWeatherLayout->addWidget(m_weatherCond);
hWeatherLayout->addSpacing(8);
hWeatherLayout->addWidget(m_weatherTemperature);
m_weatherLaout->adjustSize();
}
void Screensaver::setSleeptime(bool Isshow)
{
if(!sleepTime)
sleepTime = new SleepTime(this);
sleepTime->adjustSize();
if(Isshow){
sleepTime->show();
}
else{
sleepTime->hide();
if(timer){
timer->stop();
}
}
}
void Screensaver::updateDate()
{
if(!timer){
timer = new QTimer(this);
timer->setTimerType(Qt::PreciseTimer);
connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));
}
timer->start(500);
updateTime();
}
void Screensaver::updateTime()
{
#ifdef USE_INTEL
QLocale locale(QLocale::system().name());
QTimeZone timeZone(QString::fromLatin1(QTimeZone::systemTimeZoneId()).toLatin1());
QDateTime tzNow = QDateTime::currentDateTime().toTimeZone(timeZone);
QString time;
if (timeType == 12)
{
time = tzNow.toString("hh:mm AP").split(" ").at(0);
this->dateOfWeek->setText(tzNow.toString("AP"));
if(dateType == "en")
{
this->dateOfDay->setText(tzNow.toString("ddd MM-dd"));
} else {
this->dateOfDay->setText(tzNow.toString("ddd MM/dd"));
}
} else {
time = tzNow.toString("hh:mm");
this->dateOfWeek->setText(tzNow.toString("ddd"));
if(dateType == "en")
{
this->dateOfDay->setText(tzNow.toString("MM-dd"));
} else {
this->dateOfDay->setText(tzNow.toString("MM/dd"));
}
}
this->dateOfLocaltimeHour->setText(time.split(":").at(0));
this->dateOfLocaltimeMinute->setText(time.split(":").at(1));
m_currentTime = QTime::currentTime();
#else
QDateTime curDateTime = QDateTime::currentDateTime();
if (m_lastDateTime.isNull() || qAbs(curDateTime.secsTo(m_lastDateTime)) >=1) {
if(timeType == 12)
this->dateOfLocaltime->setText(curDateTime.toString("A hh:mm"));
else
this->dateOfLocaltime->setText(curDateTime.toString("hh:mm"));
if(dateType == "cn")
this->dateOfDay->setText(curDateTime.date().toString("yyyy/MM/dd ddd").replace("周","星期"));
else
this->dateOfDay->setText(curDateTime.date().toString("yyyy-MM-dd ddd").replace("周","星期"));
m_lastDateTime = curDateTime;
}
if(sleepTime){
if(!sleepTime->setTime(QDateTime::currentDateTime())){
sleepTime->hide();
delete sleepTime;
sleepTime=NULL;
}
}
#endif
}
void Screensaver::setUpdateBackground()
{
}
void Screensaver::updateBackground()
{
QString path = m_background->getRand();
if(!path.isEmpty() && ispicture(path)){
background = loadFromFile(path);
hasChanged=true;
isMovie();
}
// updateCenterWidget(-1);
}
void Screensaver::setRandomText()
{
if(!myTextWidget){
myTextWidget = new QWidget(this);
QHBoxLayout *layout = new QHBoxLayout(myTextWidget);
cycleLabel = new QLabel(this);
cycleLabel->setFixedSize(16,16);
layout->addWidget(cycleLabel);
layout->setSpacing(8);
myTextLabel = new QLabel(myTextWidget);
myTextLabel->setObjectName("myText");
// myTextLabel->setBackgroundRole(QPalette::Base);
// myTextLabel->setAutoFillBackground(true);
// myTextLabel->setMaximumWidth(800);
// QColor highLightColor = palette().color(QPalette::Base);
// QString stringColor = QString("rgba(%1,%2,%3,82%)")
// .arg(highLightColor.red())
// .arg(highLightColor.green())
// .arg(highLightColor.blue());
// QColor textColor = palette().color(QPalette::Text);
// QString textString = QString("rgb(%1,%2,%3)")
// .arg(textColor.red())
// .arg(textColor.green())
// .arg(textColor.blue());
// QColor borderColor = palette().color(QPalette::BrightText);
// QString borderString = QString("rgba(%1,%2,%3,85%)")
// .arg(borderColor.red())
// .arg(borderColor.green())
// .arg(borderColor.blue());
// myTextLabel->setStyleSheet(QString("font-size:18px;border-radius: 6px;background: %1;color: %2;padding: 24px 48px 24px 48px;border-width: 1px;border-style: solid;border-color:%3;") \
// .arg(stringColor).arg(textString).arg(borderString));
blur_Num = configuration->getBlurNumber();
curStyle = configuration->getcurStyle();
qDebug()<<"curStyle= "<setStyleSheet(QString("QLabel{background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:16px}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(0, 0, 0, %1); color:#FFFFFF; border-radius:8px}").arg(blur_Num * 0.01));
} else{
myTextLabel->setStyleSheet(QString("QLabel{background: rgba(255, 255, 255, %1); border-radius:16px}").arg(blur_Num * 0.01));
cycleLabel->setStyleSheet(QString("QLabel{background: rgba(255, 255, 255, %1); border-radius:8px}").arg(blur_Num * 0.01));
}
layout->addWidget(myTextLabel);
}
sysFont.setPointSize((18 + curFontSize) *m_ptToPx);
myTextLabel->setFont(sysFont);
myTextLabel->setText(myText);
myTextWidget->adjustSize();
if(myText != "")
myTextWidget->setVisible(true);
else
myTextWidget->setVisible(false);
}
void Screensaver::setPreviewText(bool bVisible)
{
if(!myPreviewLabel){
myPreviewLabel = new QLabel(this);
myPreviewLabel->setFixedSize(58,30);
//设置样式
myPreviewLabel->setStyleSheet("background-color: rgb(38,38,38); border-radius: 0px; color:white;");
//先采取固定大小方式
myPreviewLabel->move(120,142);
myPreviewLabel->setAlignment(Qt::AlignCenter);
}
myPreviewLabel->setText(m_strPreViewTrans);
myPreviewLabel->adjustSize();
myPreviewLabel->setVisible(bVisible);
}
void Screensaver::setCenterWidget()
{
QStringList qlist = qsettings->childGroups();
if(qlist.count()<1)
return;
QDate date = QDate::currentDate();
int days = date.daysTo(QDate(2100,1,1));
int index = days%qlist.count()+1;
QString configPath = QDir::homePath() + "/.ukui-screensaver-default.conf";
QSettings settings1(configPath, QSettings::IniFormat);
if(settings1.value("FIRST").toString().isEmpty()){
settings1.setValue("FIRST",QDate::currentDate().toString("yy/MM/dd"));
index = 1;
}
if(settings1.value("FIRST").toString() == QDate::currentDate().toString("yy/MM/dd"))
index = 1;
qsettings->beginGroup(QString::number(index));
if(isCustom){
centerlabel1 = new QLabel(myText);
centerlabel2 = new QLabel("");
centerlabel2->hide();
authorlabel = new QLabel("");
}
else if(qsettings->contains("OL")){
if(qsettings->value("OL").typeName() == "QString")
centerlabel1 = new QLabel(qsettings->value("OL").toString());
else
centerlabel1 = new QLabel(qsettings->value("OL").toStringList().join(' '));
centerlabel2 = new QLabel("");
centerlabel2->hide();
#ifndef USE_INTEL
authorlabel = new QLabel(qsettings->value("author").toString());
#endif
}
else if(qsettings->contains("FL"))
{
if(qsettings->value("FL").typeName() == "QString")
centerlabel1 = new QLabel(qsettings->value("FL").toString());
else
centerlabel1 = new QLabel(qsettings->value("FL").toStringList().join(' '));
if(qsettings->value("SL").typeName() == "QString")
centerlabel2 = new QLabel(qsettings->value("SL").toString());
else
centerlabel2 = new QLabel(qsettings->value("SL").toStringList().join(' '));
centerlabel2->show();
#ifndef USE_INTEL
authorlabel = new QLabel(qsettings->value("author").toString());
#endif
}
#ifdef USE_INTEL
if(qsettings->contains("author") && !qsettings->value("author").toString().isEmpty())
{
authorlabel = new QLabel(qsettings->value("author").toString());
authorlabel->show();
}
else
{
authorlabel = new QLabel("");
authorlabel->hide();
}
#endif
centerlabel1->setObjectName("centerLabel");
centerlabel2->setObjectName("centerLabel");
authorlabel->setObjectName("authorLabel");
sysFont.setPointSize((36 + curFontSize) *m_ptToPx);
centerlabel1->setFont(sysFont);
centerlabel2->setFont(sysFont);
sysFont.setPointSize((28 + curFontSize) *m_ptToPx);
authorlabel->setFont(sysFont);
qsettings->endGroup();
#ifdef USE_INTEL
//设置背景透明,qss中更改为透明不生效
centerlabel1->setStyleSheet("QLabel{background-color: transparent;}");
centerlabel2->setStyleSheet("QLabel{background-color: transparent;}");
authorlabel->setStyleSheet("QLabel{background-color: transparent;}");
centerWidget = new QWidget(this);
centerWidget->setStyleSheet("QWidget{background:rgb(0,0,0,64);border-radius:16px}");
QVBoxLayout *layout = new QVBoxLayout(centerWidget);
// QPushButton *line =new QPushButton(this);
// line->setWindowOpacity(0.08);
// line->setFocusPolicy(Qt::NoFocus);
// line->setMaximumHeight(1);
layout->addWidget(centerlabel1);
layout->addWidget(centerlabel2);
// layout->addWidget(line);
layout->addWidget(authorlabel);
adjustSize();
centerWidget->setVisible(true);
#else
centerWidget = new QWidget(this);
QVBoxLayout *layout = new QVBoxLayout(centerWidget);
layout->addWidget(centerlabel1);
layout->addWidget(centerlabel2);
if(!isCustom){
QPushButton *line =new QPushButton(this);
line->setWindowOpacity(0.08);
line->setFocusPolicy(Qt::NoFocus);
line->setMaximumHeight(1);
layout->addWidget(line);
}
layout->addWidget(authorlabel);
centerWidget->adjustSize();
centerWidget->setGeometry((width()-centerWidget->width())/2,(height()-centerWidget->height())/2,
centerWidget->width(),centerWidget->height());
centerWidget->setVisible(true);
#endif
}
void Screensaver::getWeatherFinish(QString city, QString cond, QString tmp)
{
qDebug() << "getWeatherFinish";
qDebug() << city << "," << cond << "," << tmp;
this->m_weatherIcon->setPixmap(m_weatherManager->getWeatherIcon(cond));
this->m_weatherArea->setText(city);
if(!cond.isEmpty())
{
this->m_weatherCond->show();
this->m_weatherCond->setText("·" + cond);
}
else
this->m_weatherCond->hide();
if(!tmp.isEmpty())
{
this->m_weatherTemperature->show();
this->m_weatherTemperature->setText(tmp);
}
else
this->m_weatherTemperature->hide();
m_weatherLaout->adjustSize();
m_weatherLaout->setGeometry((this->width()-m_weatherLaout->width())/2,96 * (float)width()/1920,
m_weatherLaout->geometry().width(), m_weatherLaout->geometry().height());
}
void Screensaver::setNoticeLaout()
{
m_widgetNotice = new QWidget(this);
QHBoxLayout *hNoticeLayout = new QHBoxLayout(m_widgetNotice);
hNoticeLayout->setContentsMargins(0, 0, 0, 0);
m_labelNoticeIcon = new QLabel(this);
m_labelNoticeMessage = new QLabel(this);
m_labelNoticeMessage->setStyleSheet("font-size:16px;color:#ffffff");
m_labelNoticeIcon->setPixmap(QPixmap(":/assets/message.png"));
m_labelNoticeMessage->setText(tr("You have new notification"));
int num = configuration->getMessageNumber();
(configuration->getMessageShowEnable() && num > 0)? showNotice() : hideNotice();
hNoticeLayout->addWidget(m_labelNoticeIcon);
hNoticeLayout->addWidget(m_labelNoticeMessage);
m_widgetNotice->adjustSize();
}
//显示新消息通知
void Screensaver::showNotice()
{
m_widgetNotice->show();
}
void Screensaver::hideNotice()
{
m_widgetNotice->hide();
}
QPixmap Screensaver::loadFromFile(QString strPath)
{
QImageReader reader;
reader.setFileName(strPath);
reader.setAutoTransform(true);
reader.setDecideFormatFromContent(true);
return QPixmap::fromImageReader(&reader);
}
/*
void Screensaver::setDesktopBackground()
{
vboxFrame->hide();
QString mBackground;
if(!hasChanged){
mBackground=defaultBackground;
}else{
if(m_background->getCurrent().isEmpty())
return;
mBackground=m_background->getCurrent();
}
settings->set("picture-filename",QVariant(mBackground));
QDBusInterface * interface = new QDBusInterface("org.freedesktop.Accounts",
"/org/freedesktop/Accounts",
"org.freedesktop.Accounts",
QDBusConnection::systemBus());
if (!interface->isValid()){
return;
}
QDBusReply reply = interface->call("FindUserByName", getenv("USER"));
QString userPath;
if (reply.isValid()){
userPath = reply.value().path();
}
else {
return;
}
QDBusInterface * useriFace = new QDBusInterface("org.freedesktop.Accounts",
userPath,
"org.freedesktop.Accounts.User",
QDBusConnection::systemBus());
if (!useriFace->isValid()){
return;
}
QDBusMessage msg = useriFace->call("SetBackgroundFile", mBackground);
if (!msg.errorMessage().isEmpty())
qDebug() << "update user background file error: " << msg.errorMessage();
}*/