426 lines
17 KiB
C++
426 lines
17 KiB
C++
|
#include "edclock.h"
|
||
|
#include "loapptools.h"
|
||
|
#include "edclockattr.h"
|
||
|
#include "QThread"
|
||
|
#include <QSettings>
|
||
|
eDClock::eDClock(QRectF rectInit,InteractiveType type, QGraphicsItem *parent) :
|
||
|
eObject(rectInit, type, parent)
|
||
|
{
|
||
|
m_iType=eObject::DClock;
|
||
|
m_attr.timeZoneId = QTimeZone::systemTimeZoneId();
|
||
|
m_attr.year = true;
|
||
|
m_attr.month = true;
|
||
|
m_attr.day = true;
|
||
|
m_attr.hour = true;
|
||
|
m_attr.min = true;
|
||
|
m_attr.sec = true;
|
||
|
m_attr.weekly = true;
|
||
|
m_attr.fullYear = true;
|
||
|
m_attr.hour12 = true;
|
||
|
m_attr.AmPm = true;
|
||
|
m_attr.dateStyle = 0;
|
||
|
m_attr.timeStyle = 0;
|
||
|
m_attr.multiline = true;
|
||
|
m_attr.fontFamily = "Arial";
|
||
|
m_attr.fontSize = 9;
|
||
|
m_attr.fontBold = false;
|
||
|
m_attr.fontItalics = false;
|
||
|
m_attr.fontUnderline = false;
|
||
|
m_attr.textColor = Qt::red;
|
||
|
m_attr.playDuration = MACRO_DEFAULT_PLAYDURATION;
|
||
|
init();
|
||
|
}
|
||
|
|
||
|
eDClock::eDClock(const QJsonObject &json, InteractiveType type, QGraphicsItem *parent) :
|
||
|
eObject(json["geometry"].toObject(), type, parent)
|
||
|
{
|
||
|
m_iType=eObject::DClock;
|
||
|
setElement(json, m_attr);
|
||
|
init();
|
||
|
}
|
||
|
|
||
|
void eDClock::init()
|
||
|
{
|
||
|
connect(LoAppTools::getInstance(), SIGNAL(sTick()), this, SLOT(updateGeometry()));
|
||
|
}
|
||
|
|
||
|
void eDClock::setElement(const QJsonObject &json, Data &attr)
|
||
|
{
|
||
|
auto apptool = LoAppTools::getInstance();
|
||
|
attr.timeZoneId = QByteArray().append(json["widget"]["timeZone"].toString());
|
||
|
attr.year = json["widget"]["year"].toBool();
|
||
|
attr.month = json["widget"]["month"].toBool();
|
||
|
attr.day = json["widget"]["day"].toBool();
|
||
|
attr.hour = json["widget"]["hour"].toBool();
|
||
|
attr.min = json["widget"]["min"].toBool();
|
||
|
attr.sec = json["widget"]["sec"].toBool();
|
||
|
attr.weekly = json["widget"]["weekly"].toBool();
|
||
|
attr.fullYear = json["widget"]["fullYear"].toBool();
|
||
|
attr.hour12 = json["widget"]["12Hour"].toBool();
|
||
|
attr.AmPm = json["widget"]["AmPm"].toBool();
|
||
|
attr.dateStyle = json["widget"]["dataStyle"].toInt();
|
||
|
attr.timeStyle = json["widget"]["timeStyle"].toInt();
|
||
|
attr.multiline = json["widget"]["multiline"].toBool();
|
||
|
attr.fontFamily = json["widget"]["font"]["family"].toString();
|
||
|
attr.fontSize = json["widget"]["font"]["size"].toInt();
|
||
|
attr.fontBold = json["widget"]["font"]["bold"].toBool();
|
||
|
attr.fontItalics = json["widget"]["font"]["italics"].toBool();
|
||
|
attr.fontUnderline = json["widget"]["font"]["underline"].toBool();
|
||
|
attr.textColor = apptool->int2Color(json["widget"]["font"]["color"].toInt());
|
||
|
attr.playDuration = json["play"]["duration"].toInt();
|
||
|
}
|
||
|
|
||
|
void eDClock::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
|
||
|
{
|
||
|
QString sDate;
|
||
|
QString sWeekly;
|
||
|
QString sTime;
|
||
|
QDateTime dt = QDateTime::currentDateTime().toTimeZone(QTimeZone(m_attr.timeZoneId));
|
||
|
QDate date = dt.date();
|
||
|
QTime time = dt.time();
|
||
|
QString spacer = m_attr.multiline ? "\n" : "\x20\x20\x20\x20";
|
||
|
auto tool = LoAppTools::getInstance();
|
||
|
|
||
|
QString yearStyle = tool->selectStr(m_attr.fullYear, "yyyy", "yy");
|
||
|
switch (m_attr.dateStyle) {
|
||
|
case 0:
|
||
|
sDate = tool->selectStr(m_attr.year, date.toString(yearStyle) + tr("Y_")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("MM") + tr("M_")) +
|
||
|
tool->selectStr(m_attr.day, date.toString("dd") + tr("D_"));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 1:
|
||
|
sDate = tool->selectStr(m_attr.year, date.toString(yearStyle) + tr("Y_")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("M") + tr("M_")) +
|
||
|
tool->selectStr(m_attr.day, date.toString("d") + tr("D_"));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 2:
|
||
|
sDate = tool->selectStr(m_attr.month, date.toString("M") + tr("/")) +
|
||
|
tool->selectStr(m_attr.day, date.toString("d")) +
|
||
|
tool->selectStr(m_attr.year, tr("/") + date.toString(yearStyle));
|
||
|
if(!m_attr.day) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 3:
|
||
|
sDate = tool->selectStr(m_attr.month, date.toString("MM") + tr("/")) +
|
||
|
tool->selectStr(m_attr.day, date.toString("dd")) +
|
||
|
tool->selectStr(m_attr.year, tr("/") + date.toString(yearStyle));
|
||
|
if(!m_attr.day) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 4:
|
||
|
sDate = tool->selectStr(m_attr.day, date.toString("d") + tr("/")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("M")) +
|
||
|
tool->selectStr(m_attr.year, tr("/") + date.toString(yearStyle));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 5:
|
||
|
sDate = tool->selectStr(m_attr.day, date.toString("dd") + tr("/")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("MM")) +
|
||
|
tool->selectStr(m_attr.year, tr("/") + date.toString(yearStyle));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 6:
|
||
|
sDate = tool->selectStr(m_attr.year, date.toString(yearStyle) + tr("/")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("M")) +
|
||
|
tool->selectStr(m_attr.day, tr("/") + date.toString("d"));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 7:
|
||
|
sDate = tool->selectStr(m_attr.year, date.toString(yearStyle) + tr("/")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("MM")) +
|
||
|
tool->selectStr(m_attr.day, tr("/") + date.toString("dd"));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 8:
|
||
|
sDate = tool->selectStr(m_attr.month, date.toString("M") + tr("-")) +
|
||
|
tool->selectStr(m_attr.day, date.toString("d")) +
|
||
|
tool->selectStr(m_attr.year, tr("-") + date.toString(yearStyle));
|
||
|
if(!m_attr.day) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 9:
|
||
|
sDate = tool->selectStr(m_attr.month, date.toString("MM") + tr("-")) +
|
||
|
tool->selectStr(m_attr.day, date.toString("dd")) +
|
||
|
tool->selectStr(m_attr.year, tr("-") + date.toString(yearStyle));
|
||
|
if(!m_attr.day) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 10:
|
||
|
sDate = tool->selectStr(m_attr.day, date.toString("d") + tr("-")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("M")) +
|
||
|
tool->selectStr(m_attr.year, tr("-") + date.toString(yearStyle));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 11:
|
||
|
sDate = tool->selectStr(m_attr.day, date.toString("dd") + tr("-")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("MM")) +
|
||
|
tool->selectStr(m_attr.year, tr("-") + date.toString(yearStyle));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 12:
|
||
|
sDate = tool->selectStr(m_attr.year, date.toString(yearStyle) + tr("-")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("M")) +
|
||
|
tool->selectStr(m_attr.day, tr("-") + date.toString("d"));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
case 13:
|
||
|
sDate = tool->selectStr(m_attr.year, date.toString(yearStyle) + tr("-")) +
|
||
|
tool->selectStr(m_attr.month, date.toString("MM")) +
|
||
|
tool->selectStr(m_attr.day, tr("-") + date.toString("dd"));
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
if(!m_attr.month) { int i = sDate.indexOf('/'); if(i < 0) i = sDate.indexOf('-'); if(i>=0) sDate.remove(i, 1); }
|
||
|
if(!sDate.isEmpty()) sDate += spacer;
|
||
|
|
||
|
sWeekly = tool->selectStr(m_attr.weekly, QDate::currentDate().toString("dddd") + spacer);
|
||
|
|
||
|
QString timeHead = tool->selectStr(m_attr.hour12, "A ");
|
||
|
switch (m_attr.timeStyle) {
|
||
|
case 0: sTime = time.toString(timeHead +
|
||
|
(m_attr.hour ? "hh:" : "") +
|
||
|
(m_attr.min ? "mm" : "") +
|
||
|
(m_attr.sec ? ":ss" : "")); break;
|
||
|
case 1: sTime = time.toString(timeHead +
|
||
|
(m_attr.hour ? "h:" : "") +
|
||
|
(m_attr.min ? "mm" : "") +
|
||
|
(m_attr.sec ? ":ss" : "")); break;
|
||
|
default: break;
|
||
|
}
|
||
|
|
||
|
|
||
|
if(m_attr.hour12 && !m_attr.AmPm) sTime = sTime.split(' ').at(1);
|
||
|
if(!m_attr.min) sTime.remove(sTime.indexOf(':'), 1);
|
||
|
|
||
|
QString res = sDate + sWeekly + sTime;
|
||
|
QFont font;
|
||
|
QTextOption opt;
|
||
|
font.setFamily(m_attr.fontFamily);
|
||
|
font.setPointSize(m_attr.fontSize);
|
||
|
font.setBold(m_attr.fontBold);
|
||
|
font.setItalic(m_attr.fontItalics);
|
||
|
font.setUnderline(m_attr.fontUnderline);
|
||
|
MACRO_FONT_FANG_JUCHI_2(font)
|
||
|
|
||
|
opt.setAlignment(Qt::AlignCenter);
|
||
|
painter->save();
|
||
|
MACRO_FAN_JUCHI(painter)
|
||
|
//painter->setRenderHint(QPainter::Antialiasing, false);
|
||
|
painter->setPen(m_attr.textColor);
|
||
|
painter->setFont(font);
|
||
|
painter->drawText(rect(), res, opt);
|
||
|
painter->restore();
|
||
|
eObject::paint(painter, option, widget);
|
||
|
}
|
||
|
|
||
|
QWidget* eDClock::wAttr()
|
||
|
{
|
||
|
QWidget *wObj = eObject::wAttr();
|
||
|
QWidget *w = wAttrElement();
|
||
|
static_cast<QBoxLayout*>(w->layout())->insertWidget(0, wObj);
|
||
|
return w;
|
||
|
}
|
||
|
|
||
|
QWidget* eDClock::wAttrElement()
|
||
|
{
|
||
|
eDClockAttr *w = new eDClockAttr(m_attr);
|
||
|
connect(w, SIGNAL(sAttrChanged(const eDClock::Data &)), this, SLOT(onAttrChanged(const eDClock::Data &)));
|
||
|
return w;
|
||
|
}
|
||
|
|
||
|
QJsonObject eDClock::elementJson() const
|
||
|
{
|
||
|
QJsonObject oRoot;
|
||
|
QJsonObject oWidget;
|
||
|
QJsonObject oFont;
|
||
|
QJsonObject oPlay;
|
||
|
auto apptool = LoAppTools::getInstance();
|
||
|
|
||
|
oRoot["elementType"] = "DClock";
|
||
|
oRoot["elementTypeId"] = type();
|
||
|
oRoot["geometry"] = eObject::elementJson();
|
||
|
oWidget["timeZone"] = QString(m_attr.timeZoneId);
|
||
|
oWidget["year"] = m_attr.year;
|
||
|
oWidget["month"] = m_attr.month;
|
||
|
oWidget["day"] = m_attr.day;
|
||
|
oWidget["hour"] = m_attr.hour;
|
||
|
oWidget["min"] = m_attr.min;
|
||
|
oWidget["sec"] = m_attr.sec;
|
||
|
oWidget["weekly"] = m_attr.weekly;
|
||
|
oWidget["fullYear"] = m_attr.fullYear;
|
||
|
oWidget["12Hour"] = m_attr.hour12;
|
||
|
oWidget["AmPm"] = m_attr.AmPm;
|
||
|
oWidget["dataStyle"] = m_attr.dateStyle;
|
||
|
oWidget["timeStyle"] = m_attr.timeStyle;
|
||
|
oWidget["multiline"] = m_attr.multiline;
|
||
|
oFont["family"] = m_attr.fontFamily;
|
||
|
oFont["size"] = m_attr.fontSize;
|
||
|
oFont["bold"] = m_attr.fontBold;
|
||
|
oFont["italics"] = m_attr.fontItalics;
|
||
|
oFont["underline"] = m_attr.fontUnderline;
|
||
|
oFont["color"] = apptool->color2Int(m_attr.textColor);
|
||
|
oWidget["font"] = oFont;
|
||
|
oWidget["html"] = m_attr.strHtml;
|
||
|
QRectF r1 = geometry();
|
||
|
QRect r=r1.toRect();
|
||
|
QString strDir=QString("%1%2%3%4%5").arg(zValue()).arg(r.x()).arg(r.y()).arg(r.width()).arg(r.height());
|
||
|
oWidget.insert("idDir",strDir);
|
||
|
|
||
|
|
||
|
oRoot["widget"] = oWidget;
|
||
|
oPlay["duration"] = m_attr.playDuration;
|
||
|
oRoot["play"] = oPlay;
|
||
|
|
||
|
|
||
|
return oRoot;
|
||
|
}
|
||
|
|
||
|
void eDClock::onAttrChanged(const eDClock::Data &data)
|
||
|
{
|
||
|
m_attr = data;
|
||
|
updateGeometry();
|
||
|
}
|
||
|
void eDClock::CreateAllWordPic(QString strPath)
|
||
|
{
|
||
|
QStringList strWordList;
|
||
|
strWordList.append(tr("0"));
|
||
|
strWordList.append(tr("1"));
|
||
|
strWordList.append(tr("2"));
|
||
|
strWordList.append(tr("3"));
|
||
|
strWordList.append(tr("4"));
|
||
|
strWordList.append(tr("5"));
|
||
|
strWordList.append(tr("6"));
|
||
|
strWordList.append(tr("7"));
|
||
|
strWordList.append(tr("8"));
|
||
|
strWordList.append(tr("9"));
|
||
|
strWordList.append(tr("MON"));
|
||
|
strWordList.append(tr("TUE"));
|
||
|
strWordList.append(tr("WED"));
|
||
|
strWordList.append(tr("THU"));
|
||
|
strWordList.append(tr("FRI"));
|
||
|
strWordList.append(tr("SAT"));
|
||
|
strWordList.append(tr("SUN"));
|
||
|
strWordList.append(tr("AM"));
|
||
|
strWordList.append(tr("PM"));
|
||
|
strWordList.append(tr("YEAR"));
|
||
|
strWordList.append(tr("MONTH"));
|
||
|
strWordList.append(tr("DAY"));
|
||
|
strWordList.append(":");
|
||
|
strWordList.append("/");
|
||
|
strWordList.append("-");
|
||
|
|
||
|
|
||
|
QStringList strFileList;
|
||
|
strFileList.append("0");
|
||
|
strFileList.append("1");
|
||
|
strFileList.append("2");
|
||
|
strFileList.append("3");
|
||
|
strFileList.append("4");
|
||
|
strFileList.append("5");
|
||
|
strFileList.append("6");
|
||
|
strFileList.append("7");
|
||
|
strFileList.append("8");
|
||
|
strFileList.append("9");
|
||
|
strFileList.append("MON");
|
||
|
strFileList.append("TUE");
|
||
|
strFileList.append("WED");
|
||
|
strFileList.append("THU");
|
||
|
strFileList.append("FRI");
|
||
|
strFileList.append("SAT");
|
||
|
strFileList.append("SUN");
|
||
|
strFileList.append("AM");
|
||
|
strFileList.append("PM");
|
||
|
strFileList.append("YEAR");
|
||
|
strFileList.append("MONTH");
|
||
|
strFileList.append("DAY");
|
||
|
strFileList.append("maohao");
|
||
|
strFileList.append("xiegang");
|
||
|
strFileList.append("hengxian");
|
||
|
for(int i=0;i<strWordList.count();i++)
|
||
|
CreateWordPic(strWordList.at(i),strFileList.at(i),strPath);
|
||
|
|
||
|
}
|
||
|
void eDClock::CreateWordPic(QString strWord,QString strFileName,QString strPath)
|
||
|
{
|
||
|
//设置字体
|
||
|
QFont font;
|
||
|
font.setFamily(m_attr.fontFamily);
|
||
|
font.setPointSize(m_attr.fontSize);
|
||
|
// font.setPixelSize(m_attr.fontSize);
|
||
|
font.setBold(m_attr.fontBold);
|
||
|
font.setUnderline(m_attr.fontUnderline);
|
||
|
font.setItalic(m_attr.fontItalics);
|
||
|
MACRO_FONT_FANG_JUCHI_2(font)
|
||
|
QFontMetrics fm(font);
|
||
|
QRect rec = fm.boundingRect(strWord);
|
||
|
int iFontHeight=rec.height();
|
||
|
// int iFontHeight=font.pointSize();
|
||
|
// int iFontHeight=m_attr.fontSize;
|
||
|
//字符串所占的像素宽度,高度
|
||
|
//int textWidth = rec.width();
|
||
|
//int leading=fm.leading();
|
||
|
int linespacing=fm.lineSpacing();
|
||
|
//int textHeight = rec.height()-leading-linespacing;
|
||
|
QPixmap *tempPixamp=new QPixmap(rec.width()+1,iFontHeight);
|
||
|
tempPixamp->fill(Qt::transparent);
|
||
|
QPainter *painter=new QPainter();
|
||
|
MACRO_FAN_JUCHI(painter)
|
||
|
painter->begin(tempPixamp);
|
||
|
|
||
|
|
||
|
QTextOption opt;
|
||
|
opt.setAlignment(Qt::AlignVCenter|Qt::AlignLeft);
|
||
|
opt.setWrapMode(QTextOption::NoWrap);
|
||
|
//opt.setAlignment(Qt::AlignCenter|Qt::AlignVCenter);
|
||
|
painter->setPen(m_attr.textColor);
|
||
|
painter->setFont(font);
|
||
|
//QRectF aa(0,(iFontHeight-linespacing)/2,rect().width(),rec.height());
|
||
|
QRectF aa(0,0,rect().width(),rec.height());
|
||
|
painter->drawText(aa, strWord, opt);
|
||
|
painter->end();
|
||
|
delete painter;
|
||
|
|
||
|
QString strSaveFile=strPath+MACRO_FENGEDANFU+strFileName+".png";
|
||
|
strSaveFile.replace(MACRO_DANYINFANXIEGAN, MACRO_DANYINXIEGAN);
|
||
|
tempPixamp->save(strSaveFile,"PNG");
|
||
|
delete tempPixamp;
|
||
|
|
||
|
|
||
|
}
|
||
|
QJsonObject eDClock::save(const QString &pRoot)
|
||
|
{
|
||
|
QRectF r1 = geometry();
|
||
|
QRect r=r1.toRect();
|
||
|
QString strDir=QString("%1%2%3%4%5").arg(zValue()).arg(r.x()).arg(r.y()).arg(r.width()).arg(r.height());
|
||
|
//保存图片元素到相应目录
|
||
|
QDir dirTemp(pRoot+MACRO_FENGEFU+strDir);
|
||
|
if(dirTemp.exists())
|
||
|
{
|
||
|
if(dirTemp.removeRecursively())
|
||
|
{
|
||
|
int iReTryCount=0;
|
||
|
QDir dRoot(pRoot);
|
||
|
while(!dRoot.mkdir(strDir))
|
||
|
{
|
||
|
QThread::sleep(1);
|
||
|
iReTryCount++;
|
||
|
if(iReTryCount>10)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
int iReTryCount=0;
|
||
|
QDir dRoot(pRoot);
|
||
|
while(!dRoot.mkdir(strDir))
|
||
|
{
|
||
|
QThread::sleep(1);
|
||
|
iReTryCount++;
|
||
|
if(iReTryCount>10)
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
CreateAllWordPic(pRoot+MACRO_FENGEFU+strDir);
|
||
|
return elementJson();
|
||
|
}
|