qt/LedOK/wProgramManager/wEditProgram/wpageitem.cpp

334 lines
12 KiB
C++
Raw Normal View History

2022-01-04 18:11:48 +08:00
#include "wpageitem.h"
#include "wpageattr.h"
#include "wpageitemwidget.h"
#include "wProgramManager/wEditProgram/wElement/eobject.h"
#include "wProgramManager/wEditProgram/wElement/etext.h"
#include "wProgramManager/wEditProgram/wElement/ephoto.h"
#include "wProgramManager/wEditProgram/wElement/emovie.h"
#include "wProgramManager/wEditProgram/wElement/egif.h"
#include "wProgramManager/wEditProgram/wElement/edclock.h"
#include "wProgramManager/wEditProgram/wElement/eaclock.h"
#include "wProgramManager/wEditProgram/wElement/etemp.h"
#include "wProgramManager/wEditProgram/wElement/eweather.h"
#include "wProgramManager/wEditProgram/wElement/etimer.h"
#include "wProgramManager/wEditProgram/wElement/ewindow.h"
wPageItem::wPageItem(const QJsonDocument &json, const QString &path, const QSize &resolution, QListWidget *view, int type) :
QObject(view),
QListWidgetItem(view, type),
m_jRoot(json),
m_jOldRoot(json),
m_strProgramItemPath(path),
m_resolution(resolution)
{
init();
}
wPageItem::wPageItem(const wPageItem &other) :
QObject(other.listWidget()),
QListWidgetItem(other),
m_jRoot(other.jRoot()),
m_jOldRoot(other.jRoot()),
m_strProgramItemPath(other.pRoot()),
m_resolution(other.resolution())
{
init();
}
wPageItem::~wPageItem()
{
m_scene->deleteLater();
// delete m_scene; // Crash when app closing.
}
void wPageItem::init()
{
QRectF rect(0, 0, m_resolution.width(), m_resolution.height());
m_scene = new QGraphicsScene();
m_scene->setObjectName("wDrawingScene");
m_scene->setSceneRect(rect);
QPen pen(Qt::black);
QBrush bsh(Qt::black);
auto wBackground = m_scene->addRect(rect, pen, bsh);
auto flags = wBackground->flags();
flags &= ~QGraphicsItem::ItemIsMovable;
flags &= ~QGraphicsItem::ItemIsSelectable;
flags &= ~QGraphicsItem::ItemIsFocusable;
wBackground->setFlags(flags);
m_wBackground = wBackground;
QJsonArray elements = m_jRoot["elements"].toArray();
int n = elements.count();
for(int i=0; i<n; i++) {
QJsonObject json = elements.at(i).toObject();
restoreElement(json);
}
}
//根据json中的elementTypeId来判断创建对应的媒体组件属性页
2022-01-20 10:08:17 +08:00
void wPageItem::restoreElement(const QJsonObject &json) {
2022-01-04 18:11:48 +08:00
QString type = json["elementType"].toString();
const QString &pRoot = m_strProgramItemPath;
eObject *element = nullptr;
2022-01-20 10:08:17 +08:00
if(type=="Text") element = new eText(json);
else if(type=="Photo") element = new ePhoto(json, pRoot);
else if(type=="Movie") element = new eMovie(json, pRoot);
else if(type=="Gif") element = new eGif(json, pRoot);
else if(type=="DClock") element = new eDClock(json);
else if(type=="AClock") element = new eAClock(json);
else if(type=="Office") element = nullptr;
else if(type=="Temp") element = new eTemp(json);
else if(type=="Weather") element = new eWeather(json);
else if(type=="Rss") element = nullptr;
else if(type=="Timer") element = new eTimer(json);
else if(type=="ColorText") element = nullptr;
else if(type=="Window") element = new eWindow(json, pRoot);
else element = nullptr;
2022-01-04 18:11:48 +08:00
if(element != nullptr) {
m_scene->addItem(element);
element->setRLimit(QRectF(0, 0, m_resolution.width(), m_resolution.height()));
}
}
void wPageItem::connectCiTieSignal(wDrawingBoard *drawingboard)
{
QStringList flist;
QList<QGraphicsItem *> list = m_scene->items();
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
if(element!=nullptr)
{
2022-01-07 18:22:58 +08:00
connect(element,SIGNAL(sigCiTie(bool,int)),drawingboard,SLOT(OnCiTieProcess(bool,int)));
2022-01-04 18:11:48 +08:00
}
}
}
}
void wPageItem::disconnectCiTieSignal(wDrawingBoard *drawingboard)
{
QStringList flist;
QList<QGraphicsItem *> list = m_scene->items();
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
if(element!=nullptr)
{
2022-01-07 18:22:58 +08:00
disconnect(element,SIGNAL(sigCiTie(bool,int)),drawingboard,SLOT(OnCiTieProcess(bool,int)));
2022-01-04 18:11:48 +08:00
}
}
}
}
QStringList wPageItem::filesList() const
{
QStringList flist;
QList<QGraphicsItem *> list = m_scene->items();
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
if(element->interactiveType() == eObject::Dynamic)
flist.append(element->filesList());
}
}
return flist;
}
//创建左边幻灯片,返回改项组件指针
wPageItemWidget* wPageItem::wPage(bool newOne)
{
if(newOne) {
m_wPage = new wPageItemWidget(m_scene);
m_wPage->onRepeatChanged(jRoot()["repeat"].toInt());
}
return m_wPage;
}
//创建右边页属性组件,返回页属性组件指针
2022-01-20 10:08:17 +08:00
wPageAttr *wPageItem::wAttr(bool newOne){
2022-01-04 18:11:48 +08:00
if(newOne) {
m_wPageAttr = new wPageAttr(this);
m_globalstrSavePath=m_strProgramItemPath;//+MACRO_FENGEFU + m_jRoot["name"].toString();
}
return m_wPageAttr;
}
2022-01-20 10:08:17 +08:00
void wPageItem::save(const QString &pParent){
2022-01-04 18:11:48 +08:00
//pagelist中的一个pageitem在节目名的目录下根据pageitem的pagename创建文件夹文件夹中包含page.json
QString pRoot = pParent + MACRO_FENGEFU + name();
QDir dRoot(pRoot);
2022-01-20 10:08:17 +08:00
if(!dRoot.exists()) {//如果目录不存在则创建目录
2022-01-04 18:11:48 +08:00
QDir dParent(pParent);
dParent.mkdir(name());
}
if(dRoot.exists()) {
QJsonArray oElements;
QJsonObject oRoot = m_jRoot.object();
QList<QGraphicsItem *> list = m_scene->items();
//循环查找元素将元素写入page.json
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
2022-01-20 10:08:17 +08:00
if(element->interactiveType() == eObject::Dynamic && element->save(pRoot)) oElements.append(element->elementJson());
2022-01-04 18:11:48 +08:00
}
}
oRoot["elements"] = oElements;
m_jRoot.setObject(oRoot);
m_strProgramItemPath = pRoot;
QFile f(pRoot + "\\page.json");
f.open(QIODevice::WriteOnly);
f.write(m_jRoot.toJson());
f.close();
}
}
//更新页属性参数到page.json
void wPageItem::updateJson()
{
QJsonObject oRoot = m_jRoot.object();
QJsonArray oElements;
QList<QGraphicsItem *> list = m_scene->items();
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
if(element->interactiveType() == eObject::Dynamic)
oElements.append(element->elementJson());
}
}
oRoot["elements"] = oElements;
m_jRoot.setObject(oRoot);
}
bool wPageItem::IsChange(const QJsonDocument &OldJsonDocument)
{
// QJsonObject oRoot1 = m_jOldRoot.object();
updateJson();
QJsonObject oRoot = m_jRoot.object();
QJsonObject oOldRoot = OldJsonDocument.object();
if(oRoot["name"]!=oOldRoot["name"])
return true;
if(oRoot["order"]!=oOldRoot["order"])
return true;
if(oRoot["repeat"]!=oOldRoot["repeat"])
return true;
if(oRoot["validDate"]!=oOldRoot["validDate"])
return true;
if(oRoot["plans"]!=oOldRoot["plans"])
return true;
QJsonArray oElements = oRoot["elements"].toArray();
QJsonArray oOldElements = oOldRoot["elements"].toArray();
int n = oElements.count();
for(int i=0; i<n; i++) {
QJsonObject oElement = oElements.at(i).toObject();
QJsonObject oOldElement = oOldElements.at(i).toObject();
if(oElement["elementType"]!=oOldElement["elementType"])
return true;
if(oElement["elementTypeId"]!=oOldElement["elementTypeId"])
return true;
if(oElement["geometry"]!=oOldElement["geometry"])
return true;
if(oElement["play"]!=oOldElement["play"])
return true;
if(oElement["elementType"]=="Window")
{
QJsonArray subElements=oElement["elements"].toArray();
QJsonArray subOldElements=oOldElement["elements"].toArray();
int nn = subElements.count();
for (int ii=0;ii<nn;ii++) {
QJsonObject subElement = subElements.at(ii).toObject();
QJsonObject subOldElement = subOldElements.at(ii).toObject();
if(subElement["elementType"]!=subOldElement["elementType"])
return true;
if(subElement["elementTypeId"]!=subOldElement["elementTypeId"])
return true;
if(subElement["geometry"]!=subOldElement["geometry"])
return true;
if(subElement["play"]!=subOldElement["play"])
return true;
QJsonObject oSubWidget = subElement.value("widget").toObject();
QJsonObject oSubOldWidget = subOldElement.value("widget").toObject();
QString aaa=oSubWidget.value("file").toString();
QString bbb=oSubOldWidget.value("file").toString();
if(aaa!=bbb)
return true;
aaa=oSubWidget.value("path").toString();
bbb=oSubOldWidget.value("path").toString();
if(aaa!=bbb)
return true;
}
}
else {
QJsonObject oWidget = oElement.value("widget").toObject();
QJsonObject oOldWidget = oOldElement.value("widget").toObject();
QString aa=oWidget.value("file").toString();
QString bb=oOldWidget.value("file").toString();
if(aa!=bb)
return true;
aa=oWidget.value("path").toString();
bb=oOldWidget.value("path").toString();
if(aa!=bb)
return true;
}
}
if(oRoot["validDate"]!=oOldRoot["validDate"])
return true;
if(oRoot != oOldRoot)
return true;
return false;
}
void wPageItem::setRes(qreal w, qreal h)
{
m_resolution = QSizeF(w, h);
QRectF rect(0, 0, w, h);
m_scene->setSceneRect(rect);
m_wBackground->setRect(rect);
m_wPage->updateScale(m_scene);
QList<QGraphicsItem *> list = m_scene->items();
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
if(element->interactiveType() == eObject::Dynamic)
element->setRLimit(QRectF(0, 0, w, h));
}
}
m_scene->update(m_scene->sceneRect());
}
void wPageItem::playElements()
{
QList<QGraphicsItem *> list = m_scene->items();
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
if(element->interactiveType() == eObject::Dynamic)
emit element->sPlayBQ();
}
}
}
void wPageItem::stopElements()
{
QList<QGraphicsItem *> list = m_scene->items();
foreach(QGraphicsItem *item, list) {
if(item->type() > QGraphicsItem::UserType) {
eObject *element = static_cast<eObject*>(item);
if(element->interactiveType() == eObject::Dynamic)
emit element->sStopBQ();
}
}
}
//使用json键值对更新json文档
void wPageItem::onAttrUpdated(const QJsonObject &json)
{
QJsonObject oRoot = m_jRoot.object();
oRoot["name"] = json["name"];
oRoot["repeat"] = json["repeat"];
oRoot["validDate"] = json["validDate"];
oRoot["plans"] = json["plans"];
m_jRoot.setObject(oRoot);
}