qt/LedOK/wProgramManager/wEditProgram/wpagelist.cpp
2022-01-20 10:08:17 +08:00

329 lines
12 KiB
C++

#include "wpagelist.h"
#include "wpageitem.h"
#include "wpageitemwidget.h"
#include <LoUIClass/x_uimsgboxokcancel.h>
//节目编辑主页中靠左边的页切换类表组件
wPageList::wPageList(const QString &pRoot, int w, int h, QWidget *parent) :
QWidget(parent),
m_strProgramItemPath(pRoot),
m_width(w),
m_height(h)
{
setAttribute(Qt::WA_DeleteOnClose);
QToolBar *tb_page_list = new QToolBar(this);
tb_page_list->setIconSize(QSize(16,16));
tb_page_list->setProperty("ssType", "progEditor");
tb_page_list->setProperty("ssName", "pageManager");
// QAction *spacer = new QAction();
QAction *act_add = new QAction(QIcon(":/res/ProgramManager/EditProgram/Add.png"), tr("Add page"));
QAction *act_copy = new QAction(QIcon(":/res/ProgramManager/EditProgram/Copy.png"), tr("Copy page"));
QAction *act_del = new QAction(QIcon(":/res/ProgramManager/EditProgram/Delete.png"), tr("Delete page"));
QAction *act_goup = new QAction(QIcon(":/res/ProgramManager/EditProgram/GoUp.png"), tr("Move up"));
QAction *act_godown = new QAction(QIcon(":/res/ProgramManager/EditProgram/GoDown.png"), tr("Move down"));
tb_page_list->setStyleSheet("padding-left:6px;");
// tb_page_list->addAction(spacer);
tb_page_list->addAction(act_add);
tb_page_list->addAction(act_copy);
tb_page_list->addAction(act_del);
tb_page_list->addAction(act_goup);
tb_page_list->addAction(act_godown);
m_wPageList = new QListWidget(this);
m_wPageList->setProperty("ssType", "progEditor");
m_wPageList->setProperty("ssName", "pageViewer");
QVBoxLayout *playout = new QVBoxLayout();
m_ProgramListLable=new QLabel(tr("program"));
m_ProgramListLable->setStyleSheet("background-color:#A8A8A8");
m_ProgramListLable->setAlignment(Qt::AlignCenter);
playout->addWidget(m_ProgramListLable, 0);
playout->addWidget(tb_page_list, 1);
playout->addWidget(m_wPageList, 2);
playout->setSpacing(0);
playout->setContentsMargins(0, 0, 0, 0);
setLayout(playout);
connect(act_add, SIGNAL(triggered(bool)), this, SLOT(onAdd()));
connect(act_copy, SIGNAL(triggered(bool)), this, SLOT(onCopy()));
connect(act_del, SIGNAL(triggered(bool)), this, SLOT(onDelete()));
connect(act_goup, SIGNAL(triggered(bool)), this, SLOT(onGoUp()));
connect(act_godown, SIGNAL(triggered(bool)), this, SLOT(onGoDown()));
connect(m_wPageList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
this, SLOT(onCurrentItemChanged(QListWidgetItem*, QListWidgetItem*)));
}
void wPageList::Init()
{
if(load()<=0)
{
onAdd();
save();
}
}
int wPageList::load()
{
QDir dRoot(m_strProgramItemPath);
int iCount=0;
if(dRoot.exists()) {
QStringList name_list = dRoot.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
QList<QJsonDocument> json_list;
foreach(QString name, name_list) {
QDir dir(m_strProgramItemPath + MACRO_FENGEFU + name);
if(dir.exists("page.json")) {
QFile fPro(dir.path() + MACRO_FENGEFU+"page.json");
fPro.open(QIODevice::ReadOnly);
json_list.push_back(QJsonDocument::fromJson(fPro.readAll()));
iCount++;
fPro.close();
}
}
if(!json_list.isEmpty())
{
std::sort(json_list.begin(), json_list.end(), [](const QJsonDocument &a, const QJsonDocument &b)
{
return a["order"].toInt() < b["order"].toInt();
});
foreach(QJsonDocument json, json_list) {
onRestore(json);
}
}
}
return iCount;
}
bool wPageList::IsChanged()
{
//读取初始的文件所有page.json
QDir dRoot(m_strProgramItemPath);
int iCount=0;
if(dRoot.exists()) {
QStringList name_list = dRoot.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
QList<QJsonDocument> json_list;
foreach(QString name, name_list) {
QDir dir(m_strProgramItemPath + MACRO_FENGEFU + name);
if(dir.exists("page.json")) {
QFile fPro(dir.path() + MACRO_FENGEFU+"page.json");
fPro.open(QIODevice::ReadOnly);
json_list.push_back(QJsonDocument::fromJson(fPro.readAll()));
iCount++;
fPro.close();
}
}
//如果pagelist个数不同则提示保存
if(iCount!= m_wPageList->count())
return true;
if(!json_list.isEmpty())
{
//把json_list按照order键排序
std::sort(json_list.begin(), json_list.end(), [](const QJsonDocument &a, const QJsonDocument &b)
{
return a["order"].toInt() < b["order"].toInt();
});
//int itempIndex=0;
for(int itempIndex=0;itempIndex<json_list.count();itempIndex++)
{
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(itempIndex));
if(item->IsChange(json_list[itempIndex]))
return true;
}
}
}
return false;
}
void wPageList::setRes(int w, int h)
{
m_width = w;
m_height = h;
int n = m_wPageList->count();
for(int i=0; i<n; i++) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(i));
item->setRes(w, h);
}
}
void wPageList::keyReleaseEvent(QKeyEvent *event){
switch (event->key()) {
case Qt::Key_Delete: onDelete(); break;
default:break;
}
}
//停止每个页面元素的播放,将节目目录下的每个页面的文件夹另命名
void wPageList::save(){
//停止每个幻灯片的元素
int n = m_wPageList->count();
for(int i=0; i<n; i++) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(i));
item->stopElements();
}
QDir dRoot(m_strProgramItemPath);
if(! dRoot.exists()) dRoot.mkdir(m_strProgramItemPath);//只创建一级子目录,即必须保证上级目录存在
QStringList list = dRoot.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
foreach(QString name, list) dRoot.rename(name, name + PAGEDEL_SUFFIX);
//保存每个页面的元素和页面属性到page.json文档
for(int i=0; i<n; i++) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(i));
item->save(m_strProgramItemPath);
}
dRoot = QDir(m_strProgramItemPath);
QStringList filters;
filters << "*" PAGEDEL_SUFFIX;
list = dRoot.entryList(filters);
foreach(QString name, list) {
QDir dPage(m_strProgramItemPath + MACRO_FENGEFU + name);
dPage.removeRecursively();
}
for(int i=0; i<n; i++) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(i));
item->playElements();
}
}
void wPageList::onRestore(const QJsonDocument &json)
{
QString path = m_strProgramItemPath + MACRO_FENGEFU + json["name"].toString();
wPageItem *item = new wPageItem(json, path, QSize(m_width, m_height));
wPageItemWidget *w = item->wPage();
m_wPageList->addItem(item);
m_wPageList->setItemWidget(item, w);
}
void wPageList::onAdd()
{
int order = m_wPageList->count();
int repeat = 1;
QJsonObject obj_root;
QJsonObject obj_date;
QJsonArray obj_plans;
QJsonDocument json;
QDateTime now = QDateTime::currentDateTime();
QDate tmpdate;
tmpdate = now.date();
QString _tmpdate;
_tmpdate = tmpdate.toString("yyyy-MM-dd");
QDateTime end = now.addSecs(2678400);
QDate tmpdateend;
tmpdateend = end.date();
QString _tmpdateend;
_tmpdateend = tmpdateend.toString("yyyy-MM-dd");
// QString straa=QDate::currentDate().toString();
obj_date["isValid"] = QJsonValue(false);
obj_date["start"] = QJsonValue(_tmpdate);
obj_date["end"] = QJsonValue(_tmpdateend);
obj_root["name"] = QJsonValue(genNewPageName());
obj_root["order"] = QJsonValue(order);
obj_root["repeat"] = QJsonValue(repeat);
obj_root["validDate"] = obj_date;
obj_root["plans"] = obj_plans;
json.setObject(obj_root);
QString path = m_strProgramItemPath + MACRO_FENGEFU + json["name"].toString();
wPageItem *item = new wPageItem(json, path, QSize(m_width, m_height));
wPageItemWidget *w = item->wPage();
m_wPageList->addItem(item);
m_wPageList->setItemWidget(item, w);
m_wPageList->setCurrentItem(item);
}
void wPageList::onCopy()
{
if(m_wPageList->count() > 0) {
wPageItem *cur = static_cast<wPageItem*>(m_wPageList->currentItem());
cur->updateJson();
wPageItem *item = cur->clone();
QJsonDocument json = item->jRoot();
QJsonObject oRoot = json.object();
//复制创建一个新的pageitem
oRoot["name"] = QJsonValue(genNewPageName());
oRoot["order"] = QJsonValue(m_wPageList->count());
json.setObject(oRoot);
item->setJRoot(json);
wPageItemWidget *w = item->wPage();
m_wPageList->addItem(item);
m_wPageList->setItemWidget(item, w);
m_wPageList->setCurrentItem(item);
}
}
void wPageList::onDelete(){
if(m_wPageList->count() == 1){
wPageItem *item = static_cast<wPageItem*>(m_wPageList->currentItem());
emit sigDeletePageItem(item);
return;
}
if(m_wPageList->count() > 1) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->currentItem());
//m_wPageList->setCurrentRow(-1);
X_UIMsgBoxOkCancel *dlg = new X_UIMsgBoxOkCancel(tr("Tip Info"),tr("Are you sure you want to delete this program page?"), this);
if(dlg->exec() == QDialog::Accepted){
delete item;
if(m_wPageList->count() > 0) m_wPageList->setCurrentRow(0);
flashOrder();
}
}
}
void wPageList::onGoUp()
{
if(m_wPageList->count() > 1) {
int index = m_wPageList->currentRow();
if(index > 0) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(index));
m_wPageList->takeItem(index);
wPageItemWidget *w = item->wPage();
m_wPageList->insertItem(index-1, item);
m_wPageList->setItemWidget(item, w);
m_wPageList->setCurrentRow(index-1);
}
flashOrder();
}
}
void wPageList::onGoDown()
{
if(m_wPageList->count() > 1) {
int index = m_wPageList->currentRow();
if(index < (m_wPageList->count()-1)) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(index));
m_wPageList->takeItem(index);
wPageItemWidget *w = item->wPage();
m_wPageList->insertItem(index+1, item);
m_wPageList->setItemWidget(item, w);
m_wPageList->setCurrentRow(index+1);
}
flashOrder();
}
}
void wPageList::onCurrentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
wPageItem *curItem = static_cast<wPageItem*>(current);
wPageItem *preItem = static_cast<wPageItem*>(previous);
if(nullptr != preItem) {
preItem->scene()->clearSelection();
}
emit sigPageSelected(curItem);
}
QString wPageList::genNewPageName()
{
//return tr("New") + QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz");
return QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz");
}
void wPageList::flashOrder()
{
int n = m_wPageList->count();
for(int i=0; i<n; i++) {
wPageItem *item = static_cast<wPageItem*>(m_wPageList->item(i));
QJsonDocument jRoot = item->jRoot();
QJsonObject obj_root = jRoot.object();
obj_root["order"] = QJsonValue(i);
jRoot.setObject(obj_root);
item->setJRoot(jRoot);
}
}