#include "progitem.h" #include "QtWidgets/qdialogbuttonbox.h" #include "QtWidgets/qlineedit.h" #include "gutil/qcore.h" #include "gutil/qgui.h" #include "gutil/qwaitingdlg.h" #include "gutil/qwaitingdlg.h" #include "gentmpthread.h" #include #include "sendprogramdialog.h" #include "program/progeditorwin.h" #include #include #include ProgItem::ProgItem(const QString &progsDir, const QString &name, int w, int h, const QString &remarks, QList &splitWidths, int maxWidth, LoQTreeWidget *tree) : TreeWidgetItem(tree), mName(name), mWidth(w), mHeight(h), mRemark(remarks), mSplitWidths(splitWidths), mMaxWidth(maxWidth), mProgsDir(progsDir) { m_last = QDateTime::currentDateTime(); mProgDir = progsDir + "/" + mName; m_orgName = mName; init(); } ProgItem::ProgItem(const QString &progsDir, const QJsonObject &json, LoQTreeWidget *tree) : TreeWidgetItem(tree), mProgsDir(progsDir) { mName = json["name"].toString(); mWidth = json["resolution"]["w"].toInt(); mHeight = json["resolution"]["h"].toInt(); mRemark = json["remarks"].toString(); auto splitWidths = json["splitWidths"].toArray(); foreach(auto splitWidth, splitWidths) { int width = splitWidth.toInt(); if(mMaxWidth < width) mMaxWidth = width; mSplitWidths.append(width); } m_fsize = json["file_size"].toDouble(); m_last = QDateTime::fromString(json["last_edit"].toString(), "yyyy-MM-dd hh:mm:ss"); mProgDir = progsDir + "/" + mName; m_orgName = mName; init(); } void ProgItem::init() { setFlags(flags() & ~Qt::ItemIsUserCheckable); setCheckState("check", Qt::Unchecked); auto ft = font(0); ft.setPixelSize(14); for(int i=1; icolumnCount()-2; i++) { setFont(i, ft); setTextAlignment(i, Qt::AlignCenter); } setForeground("name"**treeWidget(), Qt::transparent); setText("name", mName); setText("resolution", QString("%1 x %2").arg(mWidth).arg(mHeight)); setText("size", m_fsize<=0 ? "100B" : byteSizeStr(m_fsize)); setText("lasttime", m_last.toString("yyyy-MM-dd hh:mm:ss")); m_bnName = new QPushButton(mName); m_bnName->setFont(ft); m_bnName->setCursor(QCursor(Qt::PointingHandCursor)); m_bnName->setStyleSheet(R"delimiter( QPushButton{border-radius: 4px;} QPushButton:hover { background-color: #ccc; text-decoration: underline; } )delimiter"); QObject::connect(m_bnName, &QPushButton::clicked, treeWidget(), [=] { auto editor = new ProgEditorWin(this, treeWidget()->parentWidget()); editor->show(); }); setCellWidget("name", m_bnName); auto btnExport = new QPushButton; btnExport->setCursor(QCursor(Qt::PointingHandCursor)); btnExport->setStyleSheet(R"rrr( QPushButton { border-radius: 4px; image: url(:/res/program/bnExport_u.png); } QPushButton:pressed{image: url(:/res/program/bnExport_s.png);} QPushButton:hover{background-color: #cccccc;} )rrr"); QObject::connect(btnExport, &QPushButton::clicked, treeWidget(), [=] { QDialog dlg(treeWidget()); dlg.setWindowTitle(QObject::tr("USB Update Program")); #ifdef Q_OS_WIN dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, 0); #endif dlg.resize(300, 260); auto vBox = new VBox(&dlg); auto hBox = new HBox(vBox); hBox->addWidget(new QLabel(QObject::tr("Password"))); auto fdPassword = new QLineEdit; fdPassword->setEchoMode(QLineEdit::Password); fdPassword->setPlaceholderText(QObject::tr("Input password")); hBox->addWidget(fdPassword); auto fdDrives = new ListWgt; fdDrives->setSelectionRectVisible(true); vBox->addWidget(fdDrives); auto btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QObject::connect(btnBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject); QObject::connect(btnBox, &QDialogButtonBox::accepted, &dlg, [=, &dlg] { auto selects = fdDrives->selectedItems(); if(selects.count() > 0) { foreach(auto select, selects) { auto strPath = select->data(Qt::UserRole).toString(); auto waitingDlg = new WaitingDlg(&dlg, QObject::tr("Convertering")+" ..."); auto gen = new GenTmpThread(this, mName, strPath + (strPath.endsWith('/') ? "program.zip" : "/program.zip"), fdPassword->text()); QObject::connect(gen, &GenTmpThread::onErr, &dlg, [=, &dlg](QString err) { QMessageBox::warning(&dlg, "GenTmpThread Error", err); }); QObject::connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::success); gen->start(); waitingDlg->exec(); } dlg.accept(); return; } if(fdDrives->count() <= 0) QMessageBox::warning(&dlg, QObject::tr("Tip"), QObject::tr("No checked USB device")); else QMessageBox::warning(&dlg, QObject::tr("Tip"), QObject::tr("please select usb device in list")); }); vBox->addWidget(btnBox); fdDrives->clear(); auto volumes = QStorageInfo::mountedVolumes(); foreach(auto volume, volumes) { auto text = volume.displayName(); auto rootPath = volume.rootPath(); if(text!=rootPath) text += " ("+rootPath+")"; fdDrives->addItem(text, rootPath); } dlg.exec(); }); setCellWidget("usb", btnExport); auto btnSend = new QPushButton; btnSend->setCursor(QCursor(Qt::PointingHandCursor)); btnSend->setStyleSheet(R"rrr( QPushButton{ border-radius: 4px; image: url(:/res/program/bnSend_u.png); } QPushButton:pressed{image: url(:/res/program/bnSend_s.png);} QPushButton:hover{background-color: #cccccc;} )rrr"); QObject::connect(btnSend, &QPushButton::clicked, treeWidget(), [this] { auto waitingDlg = new WaitingDlg(treeWidget(), QObject::tr("Convertering")+" ..."); auto gen = new GenTmpThread(this, mName, "", ""); QObject::connect(gen, &GenTmpThread::onErr, treeWidget(), [=](QString err) { QMessageBox::warning(treeWidget(), "GenTmpThread Error", err); }); QObject::connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::close); gen->start(); waitingDlg->exec(); SendProgramDialog dlg(mName, treeWidget()->window()); dlg.exec(); }); setCellWidget("send", btnSend); } void ProgItem::save() { QDir dRoot(mProgDir); QDir dParent(mProgsDir); if(!dRoot.exists()) { dParent.mkdir(mName); } else if(mName != m_orgName) { dParent.rename(m_orgName, mName); m_orgName = mName; mProgDir = mProgsDir + "/" + mName; } dRoot = QDir(mProgDir); if(dRoot.exists()) { QJsonObject obj; obj["name"] = mName; obj["resolution"] = QJsonObject{{"w", mWidth}, {"h", mHeight}}; obj["remarks"] = mRemark; QJsonArray splitWidths; foreach(auto splitWidth, mSplitWidths) splitWidths.append(splitWidth); obj["splitWidths"] = splitWidths; obj["file_size"] = m_fsize; obj["last_edit"] = m_last.toString("yyyy-MM-dd hh:mm:ss"); QFile f(mProgDir + "/pro.json"); f.open(QIODevice::WriteOnly); f.write(QJsonDocument(obj).toJson()); f.close(); } } void ProgItem::del() { QDir dRoot(mProgDir); if(dRoot.exists()) dRoot.removeRecursively(); } //设置列表项的值 void ProgItem::onSetProgram() { m_bnName->setText(mName); setText("resolution", QString("%1 x %2").arg(mWidth).arg(mHeight)); setText("size", byteSizeStr(m_fsize<=0 ? 100 : m_fsize)); setText("lasttime", m_last.toString("yyyy-MM-dd hh:mm:ss")); save(); }