qt/LedOK/mainwindow.cpp
2024-06-19 18:54:32 +08:00

711 lines
28 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include "gutil/qgui.h"
#include "cfg.h"
#include "globaldefine.h"
#include "devicepanel.h"
#include "gutil/qnetwork.h"
#include "device/upgradeapkdialog.h"
#include <QColorDialog>
#include <QDesktopServices>
#include <QMenu>
#include <QMessageBox>
#include <QProcess>
#include <QSettings>
#include <QButtonGroup>
#include <QHeaderView>
#include <QStandardPaths>
#include <QDialogButtonBox>
#include <QToolButton>
#include <QDir>
#include <QCoreApplication>
extern QPoint gPlayPos;
class ImgBtn : public QToolButton {
public:
ImgBtn() {
auto policy = sizePolicy();
policy.setHorizontalPolicy(QSizePolicy::Preferred);
setSizePolicy(policy);
connect(this, &QToolButton::toggled, this, [this](bool checked) {
setIcon(icons[checked ? 1 : 0]);
});
}
void setIcons(const QIcon &unchecked, const QIcon &checked) {
setIcon(unchecked);
icons[0] = unchecked;
icons[1] = checked;
}
protected:
#if(QT_VERSION_MAJOR > 5)
void enterEvent(QEnterEvent *) override {
#else
void enterEvent(QEvent *) override {
#endif
if(this->isChecked()) return;
setIcon(icons[1]);
}
void leaveEvent(QEvent *) override {
if(this->isChecked()) return;
setIcon(icons[0]);
}
QIcon icons[2];
};
MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) {
setAttribute(Qt::WA_AlwaysShowToolTips);
auto ft = font();
ft.setPixelSize(14);
setFont(ft);
auto menuLang = new QMenu;
langGrp = new QActionGroup(menuLang);
connect(menuLang, &QMenu::triggered, this, [this](QAction* action) {
auto lanName = action->objectName();
qInfo() << "load translators" << lanName << translator.load("app_"+lanName, ":/i18n");
});
QSettings settings;
auto MainGeo = settings.value("MainGeo");
if(! MainGeo.isValid()) {
QSettings old("Shanghai Xixun Electronic Technology Co., Ltd.", "LedOK Express");
MainGeo = old.value("MainGeo");
if(MainGeo.isValid()) {
auto keys = old.allKeys();
for(auto &key : keys) settings.setValue(key, old.value(key));
old.remove("");
}
}
QString langName = settings.value("Language").toString();
QAction *actLan = 0;
#ifdef leyide
auto actTW = new QAction("中文繁体");
actTW->setCheckable(true);
actTW->setObjectName("zh_TW");
menuLang->addAction(actTW);
langGrp->addAction(actTW);
auto actEn = new QAction("English");
actEn->setCheckable(true);
actEn->setObjectName("en");
menuLang->addAction(actEn);
langGrp->addAction(actEn);
if(! langName.isEmpty()) {
if(langName.endsWith("TW")) actLan = actTW;
else if(langName.startsWith("en")) actLan = actEn;
}
if(actLan==0) {
langName = QLocale().name();
if(langName.startsWith("en")) actLan = actEn;
else actLan = actTW;
}
auto LogoPath = ":/res/Logo-leyide.png";
iconPos = QRectF(38, 20, 64, 64);
#elif defined(citta)
auto actPt = new QAction("Português");
actPt->setCheckable(true);
actPt->setObjectName("pt");
menuLang->addAction(actPt);
langGrp->addAction(actPt);
auto actEn = new QAction("English");
actEn->setCheckable(true);
actEn->setObjectName("en");
menuLang->addAction(actEn);
langGrp->addAction(actEn);
if(! langName.isEmpty()) {
if(langName.endsWith("pt")) actLan = actPt;
else if(langName.startsWith("en")) actLan = actEn;
}
if(actLan==0) {
langName = QLocale().name();
if(langName.startsWith("en")) actLan = actEn;
else actLan = actPt;
}
auto LogoPath = ":/res/Logo-citta.png";
iconPos = QRectF(14, 20, 132, 64);
#else
auto actCN = new QAction("中文");
actCN->setCheckable(true);
actCN->setObjectName("zh_CN");
menuLang->addAction(actCN);
langGrp->addAction(actCN);
auto actTW = new QAction("中文繁体");
actTW->setCheckable(true);
actTW->setObjectName("zh_TW");
menuLang->addAction(actTW);
langGrp->addAction(actTW);
auto actEn = new QAction("English");
actEn->setCheckable(true);
actEn->setObjectName("en");
menuLang->addAction(actEn);
langGrp->addAction(actEn);
auto actJa = new QAction("日本語");
actJa->setCheckable(true);
actJa->setObjectName("ja");
menuLang->addAction(actJa);
langGrp->addAction(actJa);
auto actPt = new QAction("Português");
actPt->setCheckable(true);
actPt->setObjectName("pt");
menuLang->addAction(actPt);
langGrp->addAction(actPt);
if(! langName.isEmpty()) {
if(langName.endsWith("CN")) actLan = actCN;
else if(langName.endsWith("TW")) actLan = actTW;
else if(langName.startsWith("en")) actLan = actEn;
else if(langName.startsWith("ja")) actLan = actJa;
else if(langName.startsWith("pt")) actLan = actPt;
}
if(actLan==0) {
langName = QLocale().name();
if(langName.endsWith("TW")) actLan = actTW;
else if(langName.startsWith("en")) actLan = actEn;
else if(langName.startsWith("ja")) actLan = actJa;
else if(langName.startsWith("pt")) actLan = actPt;
else actLan = actCN;
}
auto LogoPath = ":/res/Logo.png";
setWindowTitle("LedOK Express");
iconPos = QRectF(38, 20, 64, 64);
#endif
actLan->setChecked(true);
emit menuLang->triggered(actLan);
QCoreApplication::installTranslator(&translator);
auto geo = MainGeo.toRect();
if(geo.width()>=800 && geo.height()>=500 && geo.x()>=-600 && geo.x()<=1280 && geo.y()>=-200 && geo.y()<=800) setGeometry(geo);
else resize(1280, 800);
if(settings.value("MainIsMax", false).toBool()) setWindowState(Qt::WindowMaximized);
gPlayPos = settings.value("PlayPos").toPoint();
icon.load(LogoPath);
titlePos = QPointF(26, 80);
auto plt = palette();
plt.setBrush(QPalette::Window, QColor(0xdddddd));
setPalette(plt);
//项目保存的文档路径
auto dataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
if(! dataDir.isEmpty()) {
QDir dataQDir(dataDir);
if(! dataQDir.exists()) dataQDir.mkpath(dataDir);
}
auto vBox = new VBox(center);
vBox->setContentsMargins(0, 0, 0, 0);
vBox->setSpacing(0);
//自定义的标题上的工具栏创建(语言和设置选项)
m_wTitle = new LoQTitleBar(this);
installEventFilter(m_wTitle);
//水平布局,放置配置按钮,最小化,最大化,关闭按钮
QHBoxLayout *pLayout = new QHBoxLayout(m_wTitle);
pLayout->setContentsMargins(0, 0, 0, 0);
pLayout->addStretch();
bn_Setting = new QPushButton;
bn_Setting->setIcon(QIcon(":/res/AppSetting.png"));
bn_Setting->setToolTip(tr("Setting"));
pLayout->addWidget(bn_Setting);
pLayout->addWidget(m_wTitle->bn_Minimize);
pLayout->addWidget(m_wTitle->bn_Maximize);
pLayout->addWidget(m_wTitle->bn_Close);
auto menu_setting = new QMenu;
act_lang = new QAction;
act_lang->setMenu(menuLang);
menu_setting->addAction(act_lang);
actFirmware = new QAction(tr("firmware manager"));
connect(actFirmware, &QAction::triggered, this, [this] {
new UpgradeApkDialog(this);
});
menu_setting->addAction(actFirmware);
actPreferences = new QAction(tr("Preferences"));
connect(actPreferences, &QAction::triggered, this, [this] {
QDialog dlg(this);
dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, 0);
dlg.resize(400, 300);
dlg.setWindowTitle(tr("Preferences"));
auto vBox = new VBox(&dlg);
auto fdPress = new QCheckBox(tr("Video compress to")+" 720p");
fdPress->setChecked(gVideoCompress);
vBox->addWidget(fdPress);
auto fdTrans = new QCheckBox(tr("Video transcoding to")+" h264");
fdTrans->setChecked(gVideoTranscoding);
vBox->addWidget(fdTrans);
auto hBox = new HBox(vBox);
hBox->setContentsMargins(-1, 0, -1, -1);
auto fdAnti = new QCheckBox(tr("Text antialiasing"));
fdAnti->setChecked(gTextAntialiasing);
hBox->addWidget(fdAnti, 0, Qt::AlignTop);
auto fdAntiTip = new QLabel(tr("TextAntilaTip"));
fdAntiTip->setStyleSheet("QLabel{color: #f00;}");
fdAntiTip->setWordWrap(true);
hBox->addWidget(fdAntiTip, 1);
auto fdWidthSplit = new QCheckBox(tr("Ultra-Long Screen Split"));
fdWidthSplit->setChecked(gWidthSplit);
vBox->addWidget(fdWidthSplit);
hBox = new HBox(vBox);
hBox->addLabel(tr("Program Send Batch"));
auto fdSendBatch = new QSpinBox;
fdSendBatch->setRange(1, 20);
fdSendBatch->setValue(gSendBatch);
hBox->addWidget(fdSendBatch);
hBox->addStretch();
auto fdHideDetect = new QCheckBox(tr("Hide Detect Button"));
fdHideDetect->setChecked(gHideDetect);
vBox->addWidget(fdHideDetect);
auto fdShowAlias = new QCheckBox(tr("Show Alias in Terminal Control"));
fdShowAlias->setChecked(gShowAlias);
vBox->addWidget(fdShowAlias);
auto fdShowLora = new QCheckBox(tr("Show Lora Screen"));
fdShowLora->setChecked(gShowLora);
vBox->addWidget(fdShowLora);
vBox->addStretch();
auto btnBox = new QDialogButtonBox(QDialogButtonBox::Ok);
connect(btnBox, &QDialogButtonBox::accepted, &dlg, [=, &dlg] {
QSettings settings;
settings.setValue("VideoCompress", gVideoCompress = fdPress->isChecked());
settings.setValue("VideoTranscoding", gVideoTranscoding = fdTrans->isChecked());
settings.setValue("TextAntialiasing", gTextAntialiasing = fdAnti->isChecked());
settings.setValue("WidthSplit", gWidthSplit = fdWidthSplit->isChecked());
settings.setValue("SendBatch", gSendBatch = fdSendBatch->value());
settings.setValue("HideDetect", gHideDetect = fdHideDetect->isChecked());
settings.setValue("ShowAlias", gShowAlias = fdShowAlias->isChecked());
settings.setValue("GuangYingPin", gShowLora = fdShowLora->isChecked());
dlg.accept();
});
vBox->addWidget(btnBox);
dlg.exec();
fdDetectCard->setVisible(! gHideDetect);
if(mDevicePanel->mDeviceTable->isColumnHidden(mDevicePanel->mDeviceTable->columnCount()-1)) {
if(gShowAlias) {
mDevicePanel->mDeviceTable->showColumn("alias");
mDevicePanel->mDeviceTable->hideColumn("ip");
} else {
mDevicePanel->mDeviceTable->hideColumn("alias");
mDevicePanel->mDeviceTable->showColumn("ip");
}
mDevicePanel->mDeviceTable->adjSections(-1, 0);
}
mBtnGrp->button(MainPage_LoraScreen)->setVisible(gShowLora);
});
menu_setting->addAction(actPreferences);
#if !defined leyide && !defined citta
act_upd = new QAction(tr("Check for updates"));
connect(act_upd, &QAction::triggered, this, [this] {
{
QDialog dlg(this);
#ifdef Q_OS_WIN
dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, false);
#endif
dlg.setWindowTitle(tr("Software Update"));
dlg.resize(500, 400);
auto vBox = new VBox(&dlg);
auto label = new QLabel(tr("CurVersion")+": "+APP_VERSION);
auto font = label->font();
font.setPixelSize(18);
label->setFont(font);
vBox->addWidget(label);
label = new QLabel(hasNewVer ? tr("Latest Version")+": "+updates["ver"].toString() : tr("The current version is already the latest version"));
vBox->addWidget(label);
label = new QLabel(tr("Update Log")+":");
vBox->addWidget(label);
auto fdUpdLog = new QTextEdit;
fdUpdLog->setReadOnly(true);
vBox->addWidget(fdUpdLog);
auto reply = NetReq(updates["changelog_zh_CN"].toString()).timeout(60000).get();
ConnReply(reply, fdUpdLog) [=] {
auto err = errStr(reply);
if(! err.isEmpty()) {
qCritical()<<"Check Updates"<<err;
return;
}
fdUpdLog->setPlainText(reply->readAll());
});
auto btnBox = new QDialogButtonBox;
if(hasNewVer) {
btnBox->addButton(tr("Download"), QDialogButtonBox::AcceptRole);
connect(btnBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept);
}
btnBox->addButton(QDialogButtonBox::Cancel);
connect(btnBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject);
vBox->addWidget(btnBox);
if(dlg.exec() != QDialog::Accepted) return;
}
auto filePath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/ledok-express-updater";
auto url = updates["url"].toString();
auto idx = url.lastIndexOf('.');
if(idx!=-1) filePath += url.mid(idx);
qDebug()<<"filePath"<<filePath;
QFile qFile(filePath);
if(! qFile.open(QFile::WriteOnly)) {
QMessageBox::critical(this, tr("Fail"), tr("Cannot Save File")+": "+qFile.errorString()+"\n"+filePath);
return;
}
QMessageBox msgBox(this);
msgBox.setStandardButtons(QMessageBox::Cancel);
msgBox.setWindowTitle(tr("Downloading updates"));
msgBox.setText(tr("Downloading updates")+": 0% ");
auto reply = NetReq(url).timeout(60000).get();
auto pfile = &qFile;
ConnReply(reply, &msgBox) [=, &msgBox] {
auto err = errStr(reply);
if(! err.isEmpty()) {
msgBox.setIcon(QMessageBox::Critical);
msgBox.setText(tr("Error")+": "+err);
return;
}
msgBox.accept();
});
connect(reply, &QNetworkReply::downloadProgress, &msgBox, [=, &msgBox](qint64 bytesReceived, qint64 bytesTotal) {
if(bytesTotal==0) return;
msgBox.setText(tr("Downloading updates")+": "+QString::number(bytesReceived*100/bytesTotal)+"% ");
pfile->write(reply->readAll());
});
auto res = msgBox.exec();
qFile.close();
if(res != QDialog::Accepted) return;
QCoreApplication::quit();
QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));
});
menu_setting->addAction(act_upd);
auto reply = NetReq(UpdVerUrl).timeout(60000).get();
ConnReply(reply, this) [=] {
auto err = errStr(reply);
if(! err.isEmpty()) {
qCritical()<<"Check Updates"<<err;
return;
}
auto data = reply->readAll();
QJsonParseError jsonErr;
auto json = QJsonDocument::fromJson(data, &jsonErr);
if(jsonErr.error != QJsonParseError::NoError) {
qCritical()<<"Check Updates JsonError"<<jsonErr.errorString();
return;
}
#ifdef Q_OS_WIN
#if(QT_VERSION_MAJOR > 5)
updates = json["win-64"].toObject();
#else
updates = json["win-32"].toObject();
#endif
#endif
#ifdef Q_OS_MAC
updates = json["mac"].toObject();
#endif
if(verCompare(updates["ver"].toString(), APP_VERSION) > 0) {
hasNewVer = true;
bn_Setting->setIcon(QIcon(":/res/AppSettingTip.png"));
act_upd->setIcon(QIcon(":/res/reddot.png"));
}
});
#endif
act_help = new QAction();
connect(act_help, &QAction::triggered, this, [this] {
auto act = langGrp->checkedAction();
if(act==0) return;
QDesktopServices::openUrl(QUrl::fromLocalFile(QCoreApplication::applicationDirPath()+"/help/"+act->objectName()+".pdf"));
});
menu_setting->addAction(act_help);
actInfo = new QAction;
connect(actInfo, &QAction::triggered, this, [this] {
QMessageBox::information(this, tr("Info"), QFileInfo("aaa.file").absoluteFilePath()
.append("\nSupportsSsl: ").append(QSslSocket::supportsSsl()?"true":"false")
.append("\nSslLibraryBuildVersion: ").append(QSslSocket::sslLibraryBuildVersionString().append(" (").append(QString::number(QSslSocket::sslLibraryBuildVersionNumber())).append(")"))
.append("\nSslLibraryVersion: ").append(QSslSocket::sslLibraryVersionString()).append(" (").append(QString::number(QSslSocket::sslLibraryVersionNumber())).append(")"));
});
menu_setting->addAction(actInfo);
#if !defined leyide && !defined citta
act_about = new QAction(tr("About"));
connect(act_about, &QAction::triggered, this, [=] {
QDialog dlg(this);
dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, false);
dlg.setWindowTitle(tr("About"));
auto hBox = new HBox(&dlg);
hBox->setContentsMargins(24, 24, 24, 24);
hBox->setSpacing(24);
auto label = new QLabel;
label->setPixmap(QPixmap(LogoPath));
hBox->addWidget(label);
auto vBox = new VBox(hBox);
label = new QLabel("LedOK Express");
label->setAlignment(Qt::AlignCenter);
auto font = label->font();
font.setPixelSize(30);
label->setFont(font);
vBox->addWidget(label);
label = new QLabel("V" APP_VERSION" - " __DATE__);
font = label->font();
font.setPixelSize(18);
label->setFont(font);
label->setAlignment(Qt::AlignCenter);
vBox->addWidget(label);
label = new QLabel("<a href=\"https://www.ledok.cn/\">www.ledok.cn");
font = label->font();
font.setPixelSize(20);
label->setFont(font);
label->setAlignment(Qt::AlignCenter);
label->setOpenExternalLinks(true);
vBox->addWidget(label);
dlg.exec();
});
menu_setting->addAction(act_about);
#endif
bn_Setting->setMenu(menu_setting);//按钮上添加下拉菜单
vBox->addWidget(m_wTitle);
//设备管理,节目管理,高级节目管理页创建
mDevicePanel = new DevicePanel(settings);
auto hBox = new HBox(vBox);
hBox->setSpacing(2);
hBox->addSpacing(150);
mBtnGrp = new QButtonGroup(this);
for(int i=0; i<MainPage_End; i++) {
auto btn = new ImgBtn();
btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
btn->setCheckable(true);
btn->setIconSize(QSize(40,40));
btn->setProperty("ss", "MainTab");
if(i==MainPage_DeviceManager) btn->setIcons(QIcon{":/res/DeviceManager_u.png"}, QIcon{":/res/DeviceManager_s.png"});
else if(i==MainPage_ProgManager) btn->setIcons(QIcon{":/res/ProgramManager_u.png"}, QIcon{":/res/ProgramManager_s.png"});
else if(i==MainPage_Setting) btn->setIcons(QIcon{":/res/DeviceSetting_u.png"}, QIcon{":/res/DeviceSetting_s.png"});
else if(i==MainPage_LoraScreen) btn->setIcons(QIcon{":/res/GuangYingPin_u.png"}, QIcon{":/res/GuangYingPin_s.png"});
hBox->addWidget(btn);
mBtnGrp->addButton(btn, i);
}
wgts[MainPage_DeviceManager] = mDevicePanel;
wgts[MainPage_Setting] = mDevicePanel;
vBox->addWidget(wgts[mDevicePanel->mainPanelIdx]);//初始化响应页面为终端管理页面
mBtnGrp->button(mDevicePanel->mainPanelIdx)->setChecked(true);
connect(mBtnGrp, &QButtonGroup::idToggled, this, [this, vBox](int id, bool checked) {
if(!checked || id==mDevicePanel->mainPanelIdx) return;
if((id!=MainPage_DeviceManager || mDevicePanel->mainPanelIdx!=MainPage_Setting) && (id!=MainPage_Setting || mDevicePanel->mainPanelIdx!=MainPage_DeviceManager)){
if(wgts[id]==0) {
if(id==MainPage_ProgManager) wgts[id] = mProgPanel = new ProgPanel(center);
else if(id==MainPage_LoraScreen) wgts[id] = m_wGuangYingPinWidget = new mGuangYingPinWidget;
}
vBox->replaceWidget(wgts[mDevicePanel->mainPanelIdx], wgts[id]);
wgts[mDevicePanel->mainPanelIdx]->setParent(0);
}
mDevicePanel->mainPanelIdx = id;
if(id==MainPage_DeviceManager) { //设备信息列表页面
mDevicePanel->mDeviceTable->hideColumn("check");
mDevicePanel->mDeviceTable->fdCheckAll->hide();
mDevicePanel->fdCardNumInfo->hide();
if(mDevicePanel->mDeviceCtrlPanel) {
for(int j="id"**mDevicePanel->mDeviceTable+1; j<mDevicePanel->mDeviceTable->columnCount(); j++) mDevicePanel->mDeviceTable->showColumn(j);
mDevicePanel->mDeviceTable->setMaximumWidth(0xffffff);
mDevicePanel->mDeviceCtrlPanel->hide();
}
} else if(id==MainPage_Setting) { //终端控制页面
mDevicePanel->mDeviceTable->showColumn("check");
mDevicePanel->mDeviceTable->fdCheckAll->show();
mDevicePanel->fdCardNumInfo->show();
auto specialIdx = (gShowAlias ? "alias" : "ip")**mDevicePanel->mDeviceTable;
for(int j="id"**mDevicePanel->mDeviceTable+1; j<mDevicePanel->mDeviceTable->columnCount(); j++) if(j!=specialIdx) mDevicePanel->mDeviceTable->hideColumn(j);
if(mDevicePanel->mDeviceCtrlPanel) mDevicePanel->mDeviceCtrlPanel->show();
else mDevicePanel->newCtrl();
mDevicePanel->mDeviceTable->setMaximumWidth(300);
}
});
hBox = new HBox(vBox);
fdDetectCard = new QPushButton;
fdDetectCard->setCursor(Qt::PointingHandCursor);
fdDetectCard->setProperty("ssType", "progManageTool");
connect(fdDetectCard, &QPushButton::clicked, this, [this] {
auto res = QMessageBox::warning(this, tr("Tip Info"), tr("RestoreLedCardIpByUdpTip"), QMessageBox::Ok, QMessageBox::Cancel);
if(res != QMessageBox::Ok) return;
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
foreach(QNetworkInterface interfaces, networkinterfaces) {//networkinterfaces负责提供主机的IP地址和网络接口的列表
foreach(QNetworkAddressEntry entry, interfaces.addressEntries()) {//QNetworkAddressEntry存储了一个IP地址子网掩码和广播地址
entry.setBroadcast(QHostAddress::Broadcast);
QHostAddress broadcastAddress("255.255.255.255");
entry.setBroadcast(QHostAddress::Broadcast);
RESTORE_IP stTempIp;
memset(&stTempIp,0x00,sizeof(RESTORE_IP));
QString strNew=entry.ip().toString();
int itempOffset = strNew.lastIndexOf(".");
QString sstrNew=strNew.left(itempOffset)+".254";
if(sstrNew.length()<=20) memcpy(stTempIp.cNewIp,sstrNew.toLatin1().data(),sstrNew.length());
QString strMask=entry.netmask().toString();
if(strMask.length()<=20) memcpy(stTempIp.cMask,strMask.toLatin1().data(),strMask.length());
QString strGateway=entry.ip().toString();
if(strGateway.length()<=20) memcpy(stTempIp.cGateway,strGateway.toLatin1().data(),strGateway.length());
if(strGateway.length()<=20) memcpy(stTempIp.cDns,strGateway.toLatin1().data(),strGateway.length());
STREAM_PACKET packet;
memset(&packet, 0, sizeof(STREAM_PACKET));
memset(packet.SyncHead, 0x7e, 3);
memset(packet.ucSerialCode, 0x00, 20);
QByteArray ba("Broadcast!");
memcpy(packet.ucSerialCode, ba.data(), ba.size());
packet.iLength = 80;
packet.ucCommType = 0X43;
memcpy(packet.pDataBuffer, &stTempIp, 80);
packet.pDataBuffer[packet.iLength] = GetCheckCodeIn8(&packet.ucCommType,packet.iLength+sizeof(packet.ucCommType)+sizeof(char)*20+sizeof(packet.iLength));
int iLenPacket = packet.iLength+sizeof(int)+3*sizeof(unsigned char)+sizeof(char)+20*sizeof(char)+sizeof(char);/////除正文外的协议结构大小;
QUdpSocket *tempUdpSocket = new QUdpSocket(this);
if(!tempUdpSocket->bind(entry.ip())) break;
tempUdpSocket->writeDatagram((char *)&packet,iLenPacket,broadcastAddress, 31296);
}
}
});
hBox->addWidget(fdDetectCard);
// auto btn = new QPushButton("Test");
// connect(btn, &QPushButton::clicked, this, [=] {
// auto www = new TTTWgt;
// www->show();
// });
// hBox->addWidget(btn);
hBox->addStretch();
hBox->addLabel("V" APP_VERSION" - " __DATE__);
gApkHome = settings.value("ApkHome").toString();
gVideoCompress = settings.value("VideoCompress").toBool();
gVideoTranscoding = settings.value("VideoTranscoding").toBool();
gTextAntialiasing = settings.value("TextAntialiasing").toBool();
gWidthSplit = settings.value("WidthSplit").toBool();
gSendBatch = settings.value("SendBatch", 5).toInt();
gHideDetect = settings.value("HideDetect").toBool();
gShowAlias = settings.value("ShowAlias").toBool();
gShowLora = settings.value("GuangYingPin").toBool();
if(gHideDetect) fdDetectCard->hide();
if(! gShowLora) mBtnGrp->button(MainPage_LoraScreen)->hide();
if(settings.value("AddFirewallFlag").toString() !="1") {
//添加exe到win防火墙例外
auto appFile = QCoreApplication::applicationFilePath();
appFile.replace('/','\\');
QProcess cmd;
connect(&cmd, &QProcess::readyReadStandardOutput, this, [&cmd] {
qDebug()<<"out"<<QString::fromLocal8Bit(cmd.readAllStandardOutput());
});
connect(&cmd, &QProcess::readyReadStandardError, this, [&cmd] {
qDebug()<<"err"<<QString::fromLocal8Bit(cmd.readAllStandardError());
});
qDebug()<<"Add Firewall"<<appFile;
cmd.start("netsh advfirewall firewall add rule name=\"allow LedOK\" dir=in program=\""+appFile+"\"", {"security=authnoencap", "action=allow"});
cmd.waitForFinished();
settings.setValue("AddFirewallFlag", "1");
};
transUi();
int ci = 0;
int grays[] = {0, 0x22, 0x44, 0x66, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
for(; ci < 12; ci++) QColorDialog::setStandardColor(ci, QColor(grays[ci], grays[ci], grays[ci]));
int higs[] = {0x80, 0xff, 0xff};
int mids[] = {0x40, 0x80, 0xbf};
int lows[] = { 0, 0, 0x7f};
for(int i=0; i<3; i++) {
QColorDialog::setStandardColor(ci++, QColor(higs[i], lows[i], lows[i]));
QColorDialog::setStandardColor(ci++, QColor(higs[i], higs[i], lows[i]));
QColorDialog::setStandardColor(ci++, QColor(lows[i], higs[i], lows[i]));
QColorDialog::setStandardColor(ci++, QColor(lows[i], higs[i], higs[i]));
QColorDialog::setStandardColor(ci++, QColor(lows[i], lows[i], higs[i]));
QColorDialog::setStandardColor(ci++, QColor(higs[i], lows[i], higs[i]));
QColorDialog::setStandardColor(ci++, QColor(higs[i], lows[i], mids[i]));
QColorDialog::setStandardColor(ci++, QColor(higs[i], mids[i], lows[i]));
QColorDialog::setStandardColor(ci++, QColor(mids[i], higs[i], lows[i]));
QColorDialog::setStandardColor(ci++, QColor(lows[i], higs[i], mids[i]));
QColorDialog::setStandardColor(ci++, QColor(lows[i], mids[i], higs[i]));
QColorDialog::setStandardColor(ci++, QColor(mids[i], lows[i], higs[i]));
}
}
MainWindow::~MainWindow() {
QSettings settings;
auto act = langGrp->checkedAction();
if(act) settings.setValue("Language", act->objectName());
settings.setValue("MainGeo", normalGeometry());
settings.setValue("MainIsMax", isMaximized());
settings.setValue("PlayPos", gPlayPos);
if(! gApkHome.isEmpty()) settings.setValue("ApkHome", gApkHome);
if(mDevicePanel->fdIP) {
auto ipstr = mDevicePanel->fdIP->toPlainText();
if(! ipstr.isEmpty()) settings.setValue("SpecifyIP", ipstr);
else settings.remove("SpecifyIP");
}
if(mProgPanel) {
settings.setValue("ProgramListSortColumn", mProgPanel->mProgTree->sortColumn());
settings.setValue("ProgramListSortOrder", mProgPanel->mProgTree->header()->sortIndicatorOrder());
}
}
void MainWindow::changeEvent(QEvent *event) {
BaseWin::changeEvent(event);
if(event->type() == QEvent::LanguageChange) transUi();
}
void MainWindow::transUi() {
m_wTitle->refreshLable();
mBtnGrp->button(MainPage_DeviceManager)->setText(tr("Device"));
mBtnGrp->button(MainPage_ProgManager)->setText(tr("Program"));
mBtnGrp->button(MainPage_Setting)->setText(tr("Control"));
mBtnGrp->button(MainPage_LoraScreen)->setText(tr("Lora Screen"));
fdDetectCard->setText(tr("Check card"));
act_lang->setText(tr("Language"));
act_help->setText(tr("Help"));
actInfo->setText(tr("Info"));
if(act_about) act_about->setText(tr("About"));
if(act_upd) act_upd->setText(tr("Check for updates"));
actFirmware->setText(tr("firmware manager"));
actPreferences->setText(tr("Preferences"));
bn_Setting->setToolTip(tr("Setting"));
}