#include "progpanel.h" #include "globaldefine.h" #include "player/playwin.h" #include "tipdialog.h" #include #include #include #include ProgPanel::ProgPanel(QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_DeleteOnClose); setAutoFillBackground(true); QPalette pal; pal.setBrush(QPalette::Window, QColor(0xeeeeee)); setPalette(pal); auto vBox = new QVBoxLayout(this); vBox->setContentsMargins(0, 0, 0, 0); vBox->setSpacing(0); auto hBox = new QHBoxLayout(); hBox->setContentsMargins(6,6,6,6); hBox->setSpacing(6); vBox->addLayout(hBox); bnNew = new QPushButton(tr("New")); bnNew->setFixedSize(88, 38); bnNew->setProperty("ssType", "progManageTool"); hBox->addWidget(bnNew); connect(bnNew, SIGNAL(clicked(bool)), this, SLOT(onNewClicked(bool))); bnEdit = new QPushButton(tr("Edit")); bnEdit->setFixedSize(QSize(88, 38)); bnEdit->setProperty("ssType", "progManageTool"); bnEdit->setEnabled(false); hBox->addWidget(bnEdit); connect(bnEdit, SIGNAL(clicked(bool)), this, SLOT(onEditClicked(bool))); bnDelete = new QPushButton(tr("Delete")); bnDelete->setFixedSize(QSize(88, 38)); bnDelete->setProperty("ssType", "progManageTool"); bnDelete->setEnabled(false); hBox->addWidget(bnDelete); connect(bnDelete, SIGNAL(clicked(bool)), this, SLOT(onDeleteClicked(bool))); bnImport = new QPushButton(tr("Import")); bnImport->setFixedSize(QSize(88, 38)); bnImport->setProperty("ssType", "progManageTool"); hBox->addWidget(bnImport); connect(bnImport, SIGNAL(clicked(bool)), this, SLOT(onImportClicked(bool))); bnExport = new QPushButton(tr("Export")); bnExport->setFixedSize(QSize(88, 38)); bnExport->setEnabled(false); bnExport->setProperty("ssType", "progManageTool"); hBox->addWidget(bnExport); connect(bnExport, SIGNAL(clicked(bool)), this, SLOT(onExportClicked(bool))); bnSend = new QPushButton(tr("Send")); bnSend->setFixedSize(QSize(88, 38)); bnSend->setProperty("ssType", "progManageTool"); bnSend->setEnabled(false); bnSend->hide(); hBox->addWidget(bnSend); btnPlay = new QPushButton(tr("Play")+"/"+tr("Stop")); btnPlay->setFixedSize(QSize(88, 38)); btnPlay->setProperty("ssType", "progManageTool"); hBox->addWidget(btnPlay); connect(btnPlay, &QPushButton::clicked, this, [this](){ if(PlayWin::self!=nullptr) PlayWin::self->close(); else { int cnt = wProgramList->topLevelItemCount(); for(int i=0; itopLevelItem(i)->checkState(0) == Qt::Checked) { wProgramItem *item = static_cast(wProgramList->topLevelItem(i)); QString dir = progDir+"/"+item->name()+"_tmp"; QFile file(dir+"/program"); if(! file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QString value = file.readAll(); file.close(); QJsonParseError jsErr; QJsonObject prog = QJsonDocument::fromJson(value.toUtf8(), &jsErr).object(); if(jsErr.error) return; if(PlayWin::self!=nullptr) PlayWin::self->close(); PlayWin::self = new PlayWin(dir, 0, 0, item->width(), item->height(), prog); break; } } }); hBox->addStretch(); auto txtSearch = new QLineEdit(this); txtSearch->setFixedSize(QSize(240, 36)); QAction *search = new QAction(txtSearch); search->setIcon(QIcon(":/res/ProgramManager/bnSearch.png")); txtSearch->addAction(search, QLineEdit::LeadingPosition); txtSearch->setClearButtonEnabled(true); txtSearch->setStyleSheet("border: 2px solid #aaaaaa;"); hBox->addWidget(txtSearch); connect(txtSearch,SIGNAL(textChanged(const QString &)),this,SLOT(FilterProgram(const QString &))); wProgramList = new LoQTreeWidget(); wProgramList->setIndentation(10); wProgramList->setSortingEnabled(true); m_headerItem = new QTreeWidgetItem(); for(int i=1; isetTextAlignment(i, Qt::AlignCenter); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_CHECK, Qt::DisplayRole, ""); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_NAME, Qt::DisplayRole, tr("Name")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_RESOLUTION, Qt::DisplayRole, tr("Resolution")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_SIZE, Qt::DisplayRole, tr("File Size")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_LASTTIME, Qt::DisplayRole, tr("Last Modify")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_USB_EXPORT, Qt::DisplayRole, tr("Usb playback")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_SEND, Qt::DisplayRole, tr("Publish")); wProgramList->setHeaderItem(m_headerItem); wProgramList->header()->setSectionResizeMode(ENUM_PROGRAMLISTHEADERITEM_CHECK, QHeaderView::Fixed); wProgramList->header()->setSectionResizeMode(ENUM_PROGRAMLISTHEADERITEM_NAME, QHeaderView::Stretch); wProgramList->header()->setSectionResizeMode(ENUM_PROGRAMLISTHEADERITEM_RESOLUTION, QHeaderView::Stretch); wProgramList->header()->setSectionResizeMode(ENUM_PROGRAMLISTHEADERITEM_SIZE, QHeaderView::Stretch); wProgramList->header()->setSectionResizeMode(ENUM_PROGRAMLISTHEADERITEM_LASTTIME, QHeaderView::Stretch); wProgramList->header()->setSectionResizeMode(ENUM_PROGRAMLISTHEADERITEM_USB_EXPORT, QHeaderView::Fixed); wProgramList->header()->setSectionResizeMode(ENUM_PROGRAMLISTHEADERITEM_SEND, QHeaderView::Fixed); wProgramList->header()->setStretchLastSection(false); wProgramList->setColumnWidth(ENUM_PROGRAMLISTHEADERITEM_CHECK, 66); wProgramList->setColumnWidth(ENUM_PROGRAMLISTHEADERITEM_USB_EXPORT, 100); wProgramList->setColumnWidth(ENUM_PROGRAMLISTHEADERITEM_SEND, 72); vBox->addWidget(wProgramList); connect(wProgramList, &LoQTreeWidget::sigCheckStateChanged, this, [this](int f){ switch(f) { case LoQTreeWidget::CheckNone: bnEdit->setEnabled(false); bnDelete->setEnabled(false); bnExport->setEnabled(false); bnSend->setEnabled(false); break; case LoQTreeWidget::CheckOne: bnEdit ->setEnabled(true); bnDelete->setEnabled(true); bnExport->setEnabled(true); bnSend ->setEnabled(true); break; case LoQTreeWidget::CheckMulti: bnEdit ->setEnabled(false); bnDelete->setEnabled(true); bnExport->setEnabled(true); bnSend ->setEnabled(true); break; default: break; } }); QString doc_path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); if(!doc_path.isEmpty()) { QString app_path = doc_path + "/" + QApplication::applicationName(); progDir = app_path + "/NPrograms"; if(!QFileInfo::exists(progDir)) { QDir app_dir(app_path); app_dir.mkdir("NPrograms"); app_dir.mkdir("ApkStore"); } } //connect(search, SIGNAL(triggered(bool)), this, SLOT(FilterProgram())); //查找根路径下的项目文件夹,查找文件夹下的节目pro.json信息,包括节目名称,大小,像素,备注等信息 if(!progDir.isEmpty()) { QDir root_dir(progDir); QStringList pro_list = root_dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks); foreach(QString pro_name, pro_list) { QDir pro_dir(progDir + "/" + pro_name); if(pro_dir.exists("pro.json")) { QFile fPro(pro_dir.path() + "/pro.json"); fPro.open(QIODevice::ReadOnly); QJsonDocument pro = QJsonDocument::fromJson(fPro.readAll()); fPro.close(); onRestoreProgram(pro); } } } readSettings(); // ui->wProgramList->setSortingEnabled( false ); //不使能QT的自动排序 // ui->wProgramList->header()->setSortIndicatorShown( true ); // 设置三角标识符可见 // ui->wProgramList->header()->setSectionsClickable( true ); // 设置标题栏单击响应使能 // connect( ui->wProgramList->header(), SIGNAL( sectionClicked(int) ), this, SLOT( OnClickColumn(int) ) ); } ProgPanel::~ProgPanel() { writeSettings(); } void ProgPanel::OnClickColumn(int iColumn) { if(iColumn!=ENUM_PROGRAMLISTHEADERITEM_CHECK && iColumn!=ENUM_PROGRAMLISTHEADERITEM_SEND) wProgramList->sortByColumn(iColumn, wProgramList->header()->sortIndicatorOrder()); } void ProgPanel::writeSettings() { QSettings settings; settings.setValue("ProgramListSortColumn", wProgramList->sortColumn()); settings.setValue("ProgramListSortOrder", wProgramList->header()->sortIndicatorOrder()); } void ProgPanel::readSettings() { QSettings settings; if(settings.value("ProgramListSortOrder").toInt()==0) wProgramList->sortByColumn(settings.value("ProgramListSortColumn").toInt(),Qt::SortOrder::AscendingOrder); else wProgramList->sortByColumn(settings.value("ProgramListSortColumn").toInt(),Qt::SortOrder::DescendingOrder); } void ProgPanel::changeEvent(QEvent *event) { QWidget::changeEvent(event); if(event->type() == QEvent::LanguageChange) transUi(); } void ProgPanel::transUi() { m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_CHECK, 0, ""); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_NAME, 0, tr("Name")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_RESOLUTION, 0, tr("Resolution")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_SIZE, 0, tr("File Size")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_LASTTIME, 0, tr("Last Modify")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_USB_EXPORT, 0, tr("Usb playback")); m_headerItem->setData(ENUM_PROGRAMLISTHEADERITEM_SEND, 0, tr("Publish")); bnNew->setText(tr("New")); bnEdit->setText(tr("Edit")); bnDelete->setText(tr("Delete")); bnImport->setText(tr("Import")); bnExport->setText(tr("Export")); bnSend->setText(tr("Send")); btnPlay->setText(tr("Play")+"/"+tr("Stop")); for(int i=0;irefreshLable(); } void ProgPanel::onNewClicked(bool f){ Q_UNUSED(f); wNewProgram *dlg = new wNewProgram(this); connect(dlg, SIGNAL(sigAcceptData(QString,QSize,QString)), this, SLOT(onCreateNewProgram(QString,QSize,QString))); dlg->exec(); } void ProgPanel::onEditClicked(bool){ int cnt = wProgramList->topLevelItemCount(); for(int i=0; itopLevelItem(i)->checkState(0) == Qt::Checked) { wProgramItem *item = static_cast(wProgramList->topLevelItem(i)); emit item->sigEditProgram(); break; } } } bool ProgPanel::checkIfNameRepeated(const QString &name, QTreeWidgetItem *skip){ int cnt = wProgramList->topLevelItemCount(); for(int i=0; i(wProgramList->topLevelItem(i)); if(item == skip) continue; if(name == item->name()) { QMessageBox::warning(this, tr("Warning"), tr("Program name conflicted")); return true; } } return false; } void ProgPanel::onRestoreProgram(const QJsonDocument &pro) { m_pwPorgramItemList.append(new wProgramItem(progDir, pro.object(), wProgramList,this)); } void ProgPanel::onCreateNewProgram(QString name, QSize res, QString remarks) { if(checkIfNameRepeated(name)) { return; } auto item = new wProgramItem(progDir, name, res.width(), res.height(), remarks, wProgramList,this); item->save();//保存pro.json wProgramList->adjustCheckState(); } void ProgPanel::onCreateNewProgramOnOpenEditProgramWidget(QString name, QSize res, QString remarks) { if(checkIfNameRepeated(name)) return; auto item = new wProgramItem(progDir, name, res.width(), res.height(), remarks, wProgramList,this); item->save();//保存pro.json wProgramList->adjustCheckState(); } void ProgPanel::onDeleteClicked(bool){ auto res = QMessageBox::information(this, tr("Tip Info"), tr("You will delete the selected solution(s),are you sure?"), QMessageBox::Ok, QMessageBox::Cancel); if(res == QMessageBox::Ok) { int cnt = wProgramList->topLevelItemCount(); QList list; for(int i=0; itopLevelItem(i)->checkState(0) == Qt::Checked) { wProgramItem *item = static_cast(wProgramList->topLevelItem(i)); list.push_back(item); } } while(!list.isEmpty()) { wProgramItem *item = list.takeFirst(); item->del(); delete item; } wProgramList->adjustCheckState(); } } void ProgPanel::onImportClicked(bool){ TipDialog *dlg = new TipDialog(this,ENUM_IMPORT_DLG); connect(dlg, SIGNAL(sigAcceptData(QString,QString)), this, SLOT(onImportProgram(QString,QString))); dlg->exec(); } void ProgPanel::onImportProgram(QString strImportDir, QString){ if(!strImportDir.isEmpty()){ wProgramList->clear(); //查找根路径下的项目文件夹,查找文件夹下的节目pro.json信息,包括节目名称,大小,像素,备注等信息 if(!progDir.isEmpty()) { QDir root_dir(progDir); QStringList pro_list = root_dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks); foreach(QString pro_name, pro_list) { QDir pro_dir(progDir + MACRO_FENGEFU + pro_name); if(pro_dir.exists("pro.json")) { QFile fPro(pro_dir.path() + MACRO_FENGEFU+"pro.json"); fPro.open(QIODevice::ReadOnly); QJsonDocument pro = QJsonDocument::fromJson(fPro.readAll()); fPro.close(); onRestoreProgram(pro); } } } } } void ProgPanel::onExportClicked(bool){ int cnt = wProgramList->topLevelItemCount(); QStringList selectProgramlist; for(int i=0; itopLevelItem(i)->checkState(0) == Qt::Checked) { QString string =static_cast(wProgramList->topLevelItem(i))->GetBnName(); selectProgramlist.append(string); } } TipDialog *dlg = new TipDialog(this,ENUM_EXPORT_DLG,&selectProgramlist,0); connect(dlg, SIGNAL(sigAcceptData(QString,QString)), this, SLOT(onExportProgram(QString,QString))); dlg->exec(); } void ProgPanel::onExportProgram(QString strImportDir,QString strTip1){ Q_UNUSED(strImportDir); Q_UNUSED(strTip1); } void ProgPanel::FilterProgram(const QString &strtemp){ if (strtemp.isEmpty()) //显示全部 { for (int i = 0; i< wProgramList->topLevelItemCount(); ++i) { QTreeWidgetItem* topItem = wProgramList->topLevelItem(i); wProgramList->setRowHidden(i,wProgramList->indexFromItem(topItem->parent()),false); } } else { QList resultList = wProgramList->findItems(strtemp, Qt::MatchContains,ENUM_PROGRAMLISTHEADERITEM_NAME); //搜索结果 if (resultList.size() > 0) { for (int i = 0; i< wProgramList->topLevelItemCount(); ++i) { QTreeWidgetItem* topItem = wProgramList->topLevelItem(i); if (resultList.contains(topItem)) wProgramList->setRowHidden(i,wProgramList->indexFromItem(topItem->parent()),false); //显示匹配的结果 else wProgramList->setRowHidden(i,wProgramList->indexFromItem(topItem->parent()),true); //隐藏不匹配的结果 } } else { QList resultList1 = wProgramList->findItems(strtemp, Qt::MatchContains,ENUM_PROGRAMLISTHEADERITEM_RESOLUTION); //搜索结果 if (resultList1.size() > 0){ for (int i = 0; i< wProgramList->topLevelItemCount(); ++i){ QTreeWidgetItem* topItem = wProgramList->topLevelItem(i); if (resultList1.contains(topItem)) wProgramList->setRowHidden(i,wProgramList->indexFromItem(topItem->parent()),false); //显示匹配的结果 else wProgramList->setRowHidden(i,wProgramList->indexFromItem(topItem->parent()),true); //隐藏不匹配的结果 } } else { for (int i = 0; i< wProgramList->topLevelItemCount(); ++i){ QTreeWidgetItem* topItem = wProgramList->topLevelItem(i); wProgramList->setRowHidden(i,wProgramList->indexFromItem(topItem->parent()),true); //隐藏不匹配的结果 } } } } }