245 lines
9.0 KiB
C++
245 lines
9.0 KiB
C++
|
#include "digiclock.h"
|
||
|
#include "gqt.h"
|
||
|
#include <QJsonObject>
|
||
|
#include <QJsonArray>
|
||
|
#include <QVBoxLayout>
|
||
|
|
||
|
DigiClock::DigiClock(QString prefix, QJsonObject layer, QWidget *parent) : QWidget{parent} {
|
||
|
timeZone = QTimeZone(layer["timezone"].toString().toUtf8());
|
||
|
QJsonArray pics = layer["arrayPics"].toArray();
|
||
|
for(int i=0; i<pics.size(); i++) {
|
||
|
QJsonObject pic = pics[i].toObject();
|
||
|
QString aname = pic["name"].toString();
|
||
|
imgs.insert(aname, QPixmap(prefix+pic["id"].toString()));
|
||
|
}
|
||
|
int digiWidth = imgs["0"].width();
|
||
|
int dateStyle = layer["dateStyle"].toInt();
|
||
|
isSingleMonth = dateStyle==1||dateStyle==2||dateStyle==4||dateStyle==6||dateStyle==8;
|
||
|
QPixmap& timeSep = imgs["maohao"];
|
||
|
weekly = layer["weekly"].toBool();
|
||
|
bool hour12 = layer["hour12"].toBool();
|
||
|
bool AmPm = hour12 ? layer["AmPm"].toBool() : false;
|
||
|
timeptn = hour12 ? "hhmmssa" : "HHmmss";
|
||
|
bool hour = layer["hour"].toBool();
|
||
|
bool min = layer["min"].toBool();
|
||
|
bool sec = layer["sec"].toBool();
|
||
|
multiline = layer["multiline"].toBool();
|
||
|
if(multiline) {
|
||
|
QVBoxLayout *vBox = new QVBoxLayout(this);
|
||
|
vBox->setAlignment(Qt::AlignCenter);
|
||
|
vBox->setContentsMargins(0,0,0,0);
|
||
|
vBox->setSpacing(0);
|
||
|
vBox->addStretch();
|
||
|
QHBoxLayout *hBox = new QHBoxLayout();
|
||
|
vBox->addLayout(hBox);
|
||
|
hBox->addStretch();
|
||
|
addDate(dateStyle, layer, hBox);
|
||
|
hBox->addStretch();
|
||
|
if(weekly) {
|
||
|
hBox = new QHBoxLayout();
|
||
|
vBox->addLayout(hBox);
|
||
|
hBox->addStretch();
|
||
|
hBox->addWidget((QWidget*)weekComp);
|
||
|
hBox->addStretch();
|
||
|
}
|
||
|
hBox = new QHBoxLayout();
|
||
|
vBox->addLayout(hBox);
|
||
|
hBox->addStretch();
|
||
|
if(AmPm) {
|
||
|
hBox->addWidget((QWidget*)ampmComp);
|
||
|
hBox->addSpacing(digiWidth/2);
|
||
|
}
|
||
|
if(hour) {
|
||
|
hBox->addWidget((QWidget*)hourComps[0]);
|
||
|
hBox->addWidget((QWidget*)hourComps[1]);
|
||
|
}
|
||
|
if(hour&&min) hBox->addWidget((QWidget*)new ImgWgt(timeSep));
|
||
|
if(min) {
|
||
|
hBox->addWidget((QWidget*)minComps[0]);
|
||
|
hBox->addWidget((QWidget*)minComps[1]);
|
||
|
}
|
||
|
if(min&&sec) hBox->addWidget((QWidget*)new ImgWgt(timeSep));
|
||
|
if(sec) {
|
||
|
hBox->addWidget((QWidget*)secComps[0]);
|
||
|
hBox->addWidget((QWidget*)secComps[1]);
|
||
|
}
|
||
|
hBox->addStretch();
|
||
|
vBox->addStretch();
|
||
|
} else {
|
||
|
QHBoxLayout *hBox = new QHBoxLayout(this);
|
||
|
hBox->setContentsMargins(0,0,0,0);
|
||
|
hBox->setSpacing(0);
|
||
|
hBox->addStretch();
|
||
|
addDate(dateStyle, layer, hBox);
|
||
|
if(hBox->count()>1) hBox->addSpacing(digiWidth);
|
||
|
if(weekly) {
|
||
|
hBox->addWidget((QWidget*)weekComp);
|
||
|
hBox->addSpacing(digiWidth);
|
||
|
}
|
||
|
if(AmPm) {
|
||
|
hBox->addWidget((QWidget*)ampmComp);
|
||
|
hBox->addSpacing(digiWidth/2);
|
||
|
}
|
||
|
if(hour) {
|
||
|
hBox->addWidget((QWidget*)hourComps[0]);
|
||
|
hBox->addWidget((QWidget*)hourComps[1]);
|
||
|
}
|
||
|
if(hour&&min) hBox->addWidget((QWidget*)new ImgWgt(timeSep));
|
||
|
if(min) {
|
||
|
hBox->addWidget((QWidget*)minComps[0]);
|
||
|
hBox->addWidget((QWidget*)minComps[1]);
|
||
|
}
|
||
|
if(min&&sec) hBox->addWidget((QWidget*)new ImgWgt(timeSep));
|
||
|
if(sec) {
|
||
|
hBox->addWidget((QWidget*)secComps[0]);
|
||
|
hBox->addWidget((QWidget*)secComps[1]);
|
||
|
}
|
||
|
hBox->addStretch();
|
||
|
}
|
||
|
}
|
||
|
void DigiClock::addDate(int dateStyle, QJsonObject layer, QHBoxLayout* tar) {
|
||
|
if(dateStyle==0 || dateStyle==1) {
|
||
|
addYear(layer, tar, imgs["YEAR"]);
|
||
|
if(layer["month"].toBool()) {
|
||
|
tar->addWidget((QWidget*)monthComps[0]);
|
||
|
tar->addWidget((QWidget*)monthComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(imgs["MONTH"]));
|
||
|
}
|
||
|
if(layer["day"].toBool()) {
|
||
|
tar->addWidget((QWidget*)dayComps[0]);
|
||
|
tar->addWidget((QWidget*)dayComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(imgs["DAY"]));
|
||
|
}
|
||
|
} else if(dateStyle==2 || dateStyle==3) {
|
||
|
QPixmap sep = imgs["xiegang"];
|
||
|
if(layer["month"].toBool()) {
|
||
|
tar->addWidget((QWidget*)monthComps[0]);
|
||
|
tar->addWidget((QWidget*)monthComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
if(layer["day"].toBool()) {
|
||
|
tar->addWidget((QWidget*)dayComps[0]);
|
||
|
tar->addWidget((QWidget*)dayComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
addYear(layer, tar, QPixmap());
|
||
|
} else if(dateStyle==4 || dateStyle==5) {
|
||
|
QPixmap sep = imgs["xiegang"];
|
||
|
if(layer["day"].toBool()) {
|
||
|
tar->addWidget((QWidget*)dayComps[0]);
|
||
|
tar->addWidget((QWidget*)dayComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
if(layer["month"].toBool()) {
|
||
|
tar->addWidget((QWidget*)monthComps[0]);
|
||
|
tar->addWidget((QWidget*)monthComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
addYear(layer, tar, QPixmap());
|
||
|
} else if(dateStyle==6 || dateStyle==7) {
|
||
|
QPixmap sep = imgs["xiegang"];
|
||
|
addYear(layer, tar, sep);
|
||
|
if(layer["month"].toBool()) {
|
||
|
tar->addWidget((QWidget*)monthComps[0]);
|
||
|
tar->addWidget((QWidget*)monthComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
if(layer["day"].toBool()) {
|
||
|
tar->addWidget((QWidget*)dayComps[0]);
|
||
|
tar->addWidget((QWidget*)dayComps[1]);
|
||
|
}
|
||
|
} else if(dateStyle==8 || dateStyle==9) {
|
||
|
QPixmap sep = imgs["hengxian"];
|
||
|
if(layer["month"].toBool()) {
|
||
|
tar->addWidget((QWidget*)monthComps[0]);
|
||
|
tar->addWidget((QWidget*)monthComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
if(layer["day"].toBool()) {
|
||
|
tar->addWidget((QWidget*)dayComps[0]);
|
||
|
tar->addWidget((QWidget*)dayComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
addYear(layer, tar, QPixmap());
|
||
|
} else if(dateStyle==10 || dateStyle==11) {
|
||
|
QPixmap sep = imgs["hengxian"];
|
||
|
if(layer["day"].toBool()) {
|
||
|
tar->addWidget((QWidget*)dayComps[0]);
|
||
|
tar->addWidget((QWidget*)dayComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
if(layer["month"].toBool()) {
|
||
|
tar->addWidget((QWidget*)monthComps[0]);
|
||
|
tar->addWidget((QWidget*)monthComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
addYear(layer, tar, QPixmap());
|
||
|
} else if(dateStyle==12 || dateStyle==13) {
|
||
|
QPixmap sep = imgs["hengxian"];
|
||
|
addYear(layer, tar, sep);
|
||
|
if(layer["month"].toBool()) {
|
||
|
tar->addWidget((QWidget*)monthComps[0]);
|
||
|
tar->addWidget((QWidget*)monthComps[1]);
|
||
|
tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
if(layer["day"].toBool()) {
|
||
|
tar->addWidget((QWidget*)dayComps[0]);
|
||
|
tar->addWidget((QWidget*)dayComps[1]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
void DigiClock::addYear(QJsonObject layer, QHBoxLayout* tar, QPixmap sep) {
|
||
|
if(layer["year"].toBool()) {
|
||
|
if(layer["fullYear"].toBool()) {
|
||
|
tar->addWidget((QWidget*)yearComps[0]);
|
||
|
tar->addWidget((QWidget*)yearComps[1]);
|
||
|
}
|
||
|
tar->addWidget((QWidget*)yearComps[2]);
|
||
|
tar->addWidget((QWidget*)yearComps[3]);
|
||
|
if(!sep.isNull()) tar->addWidget((QWidget*)new ImgWgt(sep));
|
||
|
}
|
||
|
}
|
||
|
void DigiClock::cal() {
|
||
|
QDateTime dt = QDateTime::currentDateTime().toTimeZone(timeZone);
|
||
|
QTime time = dt.time();
|
||
|
QString hms = time.toString(timeptn);
|
||
|
*ampmComp = imgs[time.hour()<12?"AM":"PM"];
|
||
|
*hourComps[0] = imgs[hms.mid(0,1)];
|
||
|
*hourComps[1] = imgs[hms.mid(1,1)];
|
||
|
*minComps[0] = imgs[hms.mid(2,1)];
|
||
|
*minComps[1] = imgs[hms.mid(3,1)];
|
||
|
*secComps[0] = imgs[hms.mid(4,1)];
|
||
|
*secComps[1] = imgs[hms.mid(5,1)];
|
||
|
if(yearComps[0]->img.isNull() || (time.hour()==0 && time.second()==0)) {
|
||
|
QDate date = dt.date();
|
||
|
if(weekly) *weekComp = imgs[weeks[date.dayOfWeek()-1]];
|
||
|
QString ymd = date.toString("yyyyMMdd");
|
||
|
*yearComps[0] = imgs[ymd.mid(0,1)];
|
||
|
*yearComps[1] = imgs[ymd.mid(1,1)];
|
||
|
*yearComps[2] = imgs[ymd.mid(2,1)];
|
||
|
*yearComps[3] = imgs[ymd.mid(3,1)];
|
||
|
QChar ch = ymd.at(4);
|
||
|
if(isSingleMonth && ch=='0') *monthComps[0] = QPixmap();
|
||
|
else *monthComps[0] = imgs[ymd.mid(4,1)];
|
||
|
*monthComps[1] = imgs[ymd.mid(5,1)];
|
||
|
*dayComps[0] = imgs[ymd.mid(6,1)];
|
||
|
*dayComps[1] = imgs[ymd.mid(7,1)];
|
||
|
}
|
||
|
}
|
||
|
void DigiClock::showEvent(QShowEvent *) {
|
||
|
if(timerId==0) {
|
||
|
timerId = startTimer(1000, Qt::PreciseTimer);
|
||
|
cal();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DigiClock::timerEvent(QTimerEvent *) {
|
||
|
if(isVisible()) {
|
||
|
cal();
|
||
|
update();
|
||
|
} else if(timerId!=0) {
|
||
|
killTimer(timerId);
|
||
|
timerId = 0;
|
||
|
}
|
||
|
}
|