qt/LedOK/player/eledigiclock.cpp
2023-10-20 18:30:14 +08:00

232 lines
8.0 KiB
C++

#include "eledigiclock.h"
EleDigiClock::EleDigiClock(QString prefix, const JValue &layer, QWidget *parent) : QWidget{parent} {
timeZone = QTimeZone(layer["timeZone"].toString().toUtf8());
auto spaceWidth = layer["spaceWidth"].toDouble();
auto pics = layer["arrayPics"];
for(auto &pic : pics) imgs[pic["name"].toString()] = QPixmap(prefix+pic["id"].toString());
int dateStyle = layer["dateStyle"].toInt();
isSingleMonth = dateStyle==1||dateStyle==2||dateStyle==4||dateStyle==6||dateStyle==8||dateStyle==10||dateStyle==12;
auto& timeSep = imgs["maohao"];
weekly = layer["weekly"].toBool();
auto hour12 = layer["hour12"].toBool();
auto AmPm = hour12 ? layer["AmPm"].toBool() : false;
timeptn = hour12 ? "hhmmssa" : "HHmmss";
auto hour = layer["hour"].toBool();
auto min = layer["min"].toBool();
auto sec = layer["sec"].toBool();
multiline = layer["multiline"].toBool();
if(multiline) {
auto vBox = new VBox(this);
vBox->setAlignment(Qt::AlignCenter);
vBox->setContentsMargins(0,0,0,0);
vBox->setSpacing(0);
vBox->addStretch();
auto hBox = new HBox(vBox);
hBox->addStretch();
addDate(dateStyle, layer, hBox);
hBox->addStretch();
if(weekly) {
hBox = new HBox(vBox);
hBox->addStretch();
hBox->addWidget(weekComp);
hBox->addStretch();
}
hBox = new HBox(vBox);
hBox->addStretch();
if(AmPm) {
hBox->addWidget(ampmComp);
hBox->addSpacing(spaceWidth);
}
if(hour) {
hBox->addWidget(hourComps[0]);
hBox->addWidget(hourComps[1]);
}
if(hour&&min) hBox->addWidget(new ImgWgt(timeSep));
if(min) {
hBox->addWidget(minComps[0]);
hBox->addWidget(minComps[1]);
}
if(min&&sec) hBox->addWidget(new ImgWgt(timeSep));
if(sec) {
hBox->addWidget(secComps[0]);
hBox->addWidget(secComps[1]);
}
hBox->addStretch();
vBox->addStretch();
} else {
auto hBox = new HBox(this);
hBox->setContentsMargins(0,0,0,0);
hBox->setSpacing(0);
hBox->addStretch();
addDate(dateStyle, layer, hBox);
if(hBox->count()>1) hBox->addSpacing(spaceWidth*2);
if(weekly) {
hBox->addWidget(weekComp);
hBox->addSpacing(spaceWidth*2);
}
if(AmPm) {
hBox->addWidget(ampmComp);
hBox->addSpacing(spaceWidth);
}
if(hour) {
hBox->addWidget(hourComps[0]);
hBox->addWidget(hourComps[1]);
}
if(hour&&min) hBox->addWidget(new ImgWgt(timeSep));
if(min) {
hBox->addWidget(minComps[0]);
hBox->addWidget(minComps[1]);
}
if(min&&sec) hBox->addWidget(new ImgWgt(timeSep));
if(sec) {
hBox->addWidget(secComps[0]);
hBox->addWidget(secComps[1]);
}
hBox->addStretch();
}
}
void EleDigiClock::addDate(int dateStyle, const JValue &layer, HBox *tar) {
if(dateStyle==0 || dateStyle==1) {
addYear(layer, tar, imgs["YEAR"]);
if(layer["month"].toBool()) {
tar->addWidget(monthComps[0]);
tar->addWidget(monthComps[1]);
tar->addWidget(new ImgWgt(imgs["MONTH"]));
}
if(layer["day"].toBool()) {
tar->addWidget(dayComps[0]);
tar->addWidget(dayComps[1]);
tar->addWidget(new ImgWgt(imgs["DAY"]));
}
} else if(dateStyle==2 || dateStyle==3) {
auto& sep = imgs["xiegang"];
if(layer["month"].toBool()) {
tar->addWidget(monthComps[0]);
tar->addWidget(monthComps[1]);
tar->addWidget(new ImgWgt(sep));
}
if(layer["day"].toBool()) {
tar->addWidget(dayComps[0]);
tar->addWidget(dayComps[1]);
tar->addWidget(new ImgWgt(sep));
}
addYear(layer, tar, QPixmap());
} else if(dateStyle==4 || dateStyle==5) {
auto& sep = imgs["xiegang"];
if(layer["day"].toBool()) {
tar->addWidget(dayComps[0]);
tar->addWidget(dayComps[1]);
tar->addWidget(new ImgWgt(sep));
}
if(layer["month"].toBool()) {
tar->addWidget(monthComps[0]);
tar->addWidget(monthComps[1]);
tar->addWidget(new ImgWgt(sep));
}
addYear(layer, tar, QPixmap());
} else if(dateStyle==6 || dateStyle==7) {
auto& sep = imgs["xiegang"];
addYear(layer, tar, sep);
if(layer["month"].toBool()) {
tar->addWidget(monthComps[0]);
tar->addWidget(monthComps[1]);
tar->addWidget(new ImgWgt(sep));
}
if(layer["day"].toBool()) {
tar->addWidget(dayComps[0]);
tar->addWidget(dayComps[1]);
}
} else if(dateStyle==8 || dateStyle==9) {
auto& sep = imgs["hengxian"];
if(layer["month"].toBool()) {
tar->addWidget(monthComps[0]);
tar->addWidget(monthComps[1]);
tar->addWidget(new ImgWgt(sep));
}
if(layer["day"].toBool()) {
tar->addWidget(dayComps[0]);
tar->addWidget(dayComps[1]);
tar->addWidget(new ImgWgt(sep));
}
addYear(layer, tar, QPixmap());
} else if(dateStyle==10 || dateStyle==11) {
auto& sep = imgs["hengxian"];
if(layer["day"].toBool()) {
tar->addWidget(dayComps[0]);
tar->addWidget(dayComps[1]);
tar->addWidget(new ImgWgt(sep));
}
if(layer["month"].toBool()) {
tar->addWidget(monthComps[0]);
tar->addWidget(monthComps[1]);
tar->addWidget(new ImgWgt(sep));
}
addYear(layer, tar, QPixmap());
} else if(dateStyle==12 || dateStyle==13) {
auto& sep = imgs["hengxian"];
addYear(layer, tar, sep);
if(layer["month"].toBool()) {
tar->addWidget(monthComps[0]);
tar->addWidget(monthComps[1]);
tar->addWidget(new ImgWgt(sep));
}
if(layer["day"].toBool()) {
tar->addWidget(dayComps[0]);
tar->addWidget(dayComps[1]);
}
}
}
void EleDigiClock::addYear(const JValue &layer, HBox *tar, const QPixmap &sep) {
if(layer["year"].toBool()) {
if(layer["fullYear"].toBool()) {
tar->addWidget(yearComps[0]);
tar->addWidget(yearComps[1]);
}
tar->addWidget(yearComps[2]);
tar->addWidget(yearComps[3]);
if(!sep.isNull()) tar->addWidget(new ImgWgt(sep));
}
}
void EleDigiClock::cal() {
auto dt = QDateTime::currentDateTime().toTimeZone(timeZone);
auto time = dt.time();
auto 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)) {
auto date = dt.date();
if(weekly) *weekComp = imgs[weeks[date.dayOfWeek()-1]];
auto 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)];
*monthComps[0] = isSingleMonth && ymd.at(4)=='0' ? QPixmap() : imgs[ymd.mid(4,1)];
*monthComps[1] = imgs[ymd.mid(5,1)];
*dayComps[0] = isSingleMonth && ymd.at(6)=='0' ? QPixmap() : imgs[ymd.mid(6,1)];
*dayComps[1] = imgs[ymd.mid(7,1)];
}
}
void EleDigiClock::showEvent(QShowEvent *) {
if(timerId==0) {
timerId = startTimer(1000, Qt::PreciseTimer);
cal();
}
}
void EleDigiClock::timerEvent(QTimerEvent *) {
if(isVisible()) {
cal();
update();
} else if(timerId) {
killTimer(timerId);
timerId = 0;
}
}