201 lines
5.9 KiB
C++
201 lines
5.9 KiB
C++
#include "PicDateItem.h"
|
|
#include <QDebug>
|
|
#include <QRegExp>
|
|
#include "LogInfo.h"
|
|
|
|
PicDateItem::PicDateItem(QGraphicsItem *parent, QGraphicsScene *scene, const SourceType type)
|
|
:PicTextItem(parent, scene, type)
|
|
{
|
|
m_timer.setInterval(20);
|
|
connect(&m_timer, &QTimer::timeout, [this](){
|
|
updateDatetimeStr();
|
|
});
|
|
|
|
m_timer.start();
|
|
}
|
|
|
|
QVariant PicDateItem::source()
|
|
{
|
|
return m_model.datetimePattern;
|
|
}
|
|
|
|
void PicDateItem::setSource(QVariant var)
|
|
{
|
|
m_model.datetimePattern = var.toString();
|
|
if(m_model.datetimePattern.isEmpty())
|
|
return;
|
|
|
|
m_currDateTimeStr = generateDatetimeStr(QDateTime::currentDateTime());
|
|
applyModify();
|
|
}
|
|
|
|
void PicDateItem::setModel(DateItemModel model)
|
|
{
|
|
m_model = std::move(model);
|
|
setSource(m_model.datetimePattern);
|
|
}
|
|
|
|
const DateItemModel& PicDateItem::model() const
|
|
{
|
|
return m_model;
|
|
}
|
|
|
|
bool PicDateItem::updateDatetimeStr()
|
|
{
|
|
if (m_model.datetimePattern.isEmpty())
|
|
return false;
|
|
|
|
if(m_currDateTimeStr.isEmpty()) {
|
|
m_currDateTimeStr = generateDatetimeStr(QDateTime::currentDateTime());
|
|
applyModify();
|
|
return true;
|
|
}
|
|
|
|
auto now = QDateTime::currentDateTime();
|
|
auto str = generateDatetimeStr(now);
|
|
if(str == m_currDateTimeStr) {
|
|
return false;
|
|
}
|
|
|
|
m_currDateTimeStr = str;
|
|
applyModify();
|
|
return true;
|
|
}
|
|
|
|
void PicDateItem::setCustomAttrs(const QXmlStreamAttributes &attrs)
|
|
{
|
|
// 结构类似这样
|
|
// weeksMap = "MON<br>TUR<br>WED<br>TUE<br>THU<br>FRI<br>SAT<br>SUN"
|
|
// yearsMap = "2023<subbr>2023年<br>2024<subbr>2024年<br>2025<subbr>2025年"
|
|
|
|
auto m = DateItemModel();
|
|
m.dataMap = attrs.value("dataMap").toString().split("<br>");
|
|
m.daysMap = attrs.value("daysMap").toString().split("<br>");
|
|
m.hoursMap = attrs.value("hoursMap").toString().split("<br>");
|
|
m.monthsMap = attrs.value("monthsMap").toString().split("<br>");
|
|
m.weeksMap = attrs.value("weeksMap").toString().split("<br>");
|
|
|
|
auto yearsMap = attrs.value("yearsMap").toString().split("<br>");
|
|
for(auto it = yearsMap.begin(); it != yearsMap.end(); ++it) {
|
|
auto yearPair = it->split("<subbr>");
|
|
if(yearPair.size() == 2) {
|
|
m.yearsMap[yearPair[0].toInt()] = yearPair[1];
|
|
}
|
|
}
|
|
|
|
m.monthsOffset = attrs.value("monthsOffset").toInt();
|
|
m.daysOffset = attrs.value("daysOffset").toInt();
|
|
m.datetimePattern = attrs.value("datetimePattern").toString();
|
|
setModel(std::move(m));
|
|
}
|
|
|
|
void PicDateItem::saveCustomAttrs(QXmlStreamAttributes &attrs)
|
|
{
|
|
auto dataMap = m_model.dataMap.join("<br>");
|
|
auto daysMap = m_model.daysMap.join("<br>");
|
|
auto hoursMap = m_model.hoursMap.join("<br>");
|
|
auto monthsMap = m_model.monthsMap.join("<br>");
|
|
auto weeksMap = m_model.weeksMap.join("<br>");
|
|
|
|
QString yearsMap;
|
|
for(auto it = m_model.yearsMap.begin(); it != m_model.yearsMap.end(); ++it) {
|
|
yearsMap.append(QString("%1<subbr>%2<br>").arg(it.key()).arg(it.value()));
|
|
}
|
|
|
|
attrs.append("dataMap", dataMap);
|
|
attrs.append("daysMap", daysMap);
|
|
attrs.append("hoursMap", hoursMap);
|
|
attrs.append("monthsMap", monthsMap);
|
|
attrs.append("weeksMap", weeksMap);
|
|
attrs.append("yearsMap", yearsMap);
|
|
attrs.append("datetimePattern", m_model.datetimePattern);
|
|
attrs.append("monthsOffset", QString::number(m_model.monthsOffset));
|
|
attrs.append("daysOffset", QString::number(m_model.daysOffset));
|
|
}
|
|
|
|
QImage PicDateItem::itemImage()
|
|
{
|
|
if(m_model.datetimePattern.isEmpty())
|
|
return QImage();
|
|
|
|
auto ret = strToImage(m_currDateTimeStr);
|
|
return ret;
|
|
}
|
|
|
|
QString PicDateItem::generateDatetimeStr(const QDateTime &datetime)
|
|
{
|
|
QString result = m_model.datetimePattern;
|
|
|
|
// 应用偏移量
|
|
QDateTime applyDateTime = datetime;
|
|
if(m_model.monthsOffset != 0) {
|
|
applyDateTime = datetime.addMonths(m_model.monthsOffset);
|
|
}
|
|
else if(m_model.daysOffset != 0) {
|
|
applyDateTime = datetime.addDays(m_model.daysOffset);
|
|
}
|
|
|
|
// 使用正则表达式匹配并替换各种格式化模式
|
|
|
|
// 匹配四位数年份 yyyy
|
|
int i = result.indexOf("yyyy");
|
|
if(i != -1) {
|
|
int year = applyDateTime.date().year();
|
|
QString yearStr = m_model.yearsMap.contains(year) ? m_model.yearsMap[year] : QString::number(year);
|
|
result.replace(i, 4, yearStr);
|
|
}
|
|
|
|
// 匹配两位数年份 yy
|
|
i = result.indexOf("YY");
|
|
if(i != -1) {
|
|
QString yearStr = QString::number(applyDateTime.date().year()).right(2);
|
|
result.replace(i, 2, yearStr);
|
|
}
|
|
|
|
// 匹配两位数月份 MM
|
|
i = result.indexOf("MM");
|
|
if(i != -1) {
|
|
result.replace(i, 2, m_model.monthsMap[applyDateTime.date().month() - 1]);
|
|
}
|
|
|
|
// 匹配两位数日期 dd
|
|
i = result.indexOf("dd");
|
|
if(i != -1) {
|
|
result.replace(i, 2, m_model.daysMap[applyDateTime.date().day() - 1]);
|
|
}
|
|
|
|
// 匹配两位数小时 HH
|
|
i = result.indexOf("HH");
|
|
if(i != -1) {
|
|
result.replace(i, 2, m_model.hoursMap[applyDateTime.time().hour()]);
|
|
}
|
|
|
|
// 匹配两位数分钟 mm
|
|
QRegExp minutePattern("mm");
|
|
if (result.contains(minutePattern)) {
|
|
int minute = applyDateTime.time().minute();
|
|
result.replace(minutePattern, QString::number(minute).rightJustified(2, '0'));
|
|
}
|
|
|
|
// 匹配两位数秒钟 ss
|
|
QRegExp secondPattern("ss");
|
|
if (result.contains(secondPattern)) {
|
|
int second = applyDateTime.time().second();
|
|
result.replace(secondPattern, QString::number(second).rightJustified(2, '0'));
|
|
}
|
|
|
|
// 格式化周几 w
|
|
i = result.indexOf("w");
|
|
if (i != -1) {
|
|
result.replace(i, 1, m_model.weeksMap[applyDateTime.date().dayOfWeek() - 1]);
|
|
}
|
|
|
|
// 格式化年中周数 c
|
|
QRegExp weekNumberPattern("c");
|
|
if (result.contains(weekNumberPattern)) {
|
|
result.replace(weekNumberPattern, QString::number(applyDateTime.date().weekNumber()));
|
|
}
|
|
|
|
return result;
|
|
}
|