qt/LedOK/mainwindow.cpp

431 lines
18 KiB
C++
Raw Normal View History

2022-01-04 18:11:48 +08:00
#include "mainwindow.h"
2022-08-25 18:37:24 +08:00
#include "LoUIClass/aboutdlg.h"
#include "LoUIClass/softconfigdialog.h"
#include "LoUIClass/updaterdialog.h"
#include "cfg.h"
#include "tools.h"
#include "wDevicesManager/upgradeapkdialog.h"
#include <QColorDialog>
#include <QDesktopServices>
2022-01-04 18:11:48 +08:00
#include <QLabel>
2022-08-25 18:37:24 +08:00
#include <QMenu>
#include <QMessageBox>
2022-01-04 18:11:48 +08:00
#include <QProcess>
2022-08-25 18:37:24 +08:00
#include <QSettings>
2022-09-28 18:21:57 +08:00
#include <QButtonGroup>
2022-09-30 18:08:39 +08:00
#include <QHeaderView>
2022-08-25 18:37:24 +08:00
QWidget *gMainWin;
2022-09-06 23:40:02 +08:00
extern QPoint gPlayPos;
2022-08-25 18:37:24 +08:00
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:
void enterEvent(QEvent *) override {
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) {
gMainWin = this;
QMenu *menuLang = new QMenu();
QAction *actLan = nullptr;
QAction *actCN = new QAction("中文");
actCN->setCheckable(true);
actCN->setObjectName("zh_CN");
QAction *actTW = new QAction("中文繁体");
actTW->setCheckable(true);
actTW->setObjectName("zh_TW");
QAction *actEn = new QAction("English");
actEn->setCheckable(true);
actEn->setObjectName("en");
QAction *actJa = new QAction("日本語");
actJa->setCheckable(true);
actJa->setObjectName("ja");
menuLang->addAction(actCN);
menuLang->addAction(actTW);
menuLang->addAction(actEn);
menuLang->addAction(actJa);
langGrp = new QActionGroup(menuLang);
langGrp->addAction(actCN);
langGrp->addAction(actTW);
langGrp->addAction(actEn);
langGrp->addAction(actJa);
connect(menuLang, &QMenu::triggered, this, [this](QAction* action) {
auto lanName = action->objectName();
translator.load("app_"+lanName, ":/i18n");
transQt.load("qt_"+lanName, ":/i18n");
});
QSettings settings;
settings.remove("MainSetting");
settings.remove("MainWindowMaximized");
settings.remove("posMainWindow");
settings.remove("sizeMainWindow");
settings.remove("DirectlyConnectNetWork");
QString langName = settings.value("Language").toString();
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;
}
if(actLan==nullptr) {
langName = QLocale().name();
if(langName.endsWith("TW")) actLan = actTW;
else if(langName.startsWith("en")) actLan = actEn;
else if(langName.startsWith("ja")) actLan = actJa;
else actLan = actCN;
}
2022-01-04 18:11:48 +08:00
2022-08-25 18:37:24 +08:00
actLan->setChecked(true);
auto lanName = actLan->objectName();
translator.load("app_"+lanName, ":/i18n");
transQt.load("qt_"+lanName, ":/i18n");
QApplication::installTranslator(&translator);
QApplication::installTranslator(&transQt);
auto geo = settings.value("MainGeo").toRect();
if(geo.width()>=800 && geo.height()>=500 && geo.x()>=-600 && geo.x()<=1280 && geo.y()>=-200 && geo.y()<=720) setGeometry(geo);
else resize(1280, 720);
if(settings.value("MainIsMax", false).toBool()) setWindowState(Qt::WindowMaximized);
2022-09-06 23:40:02 +08:00
gPlayPos = settings.value("PlayPos").toPoint();
2022-08-25 18:37:24 +08:00
setWindowTitle("LedOK Express");
icon.load(":/res/Logo.png");
titlePos = QPointF(26, 80);
iconPos = QPointF(38, 20);
setStyleSheet(Tools::styleSheet());
auto plt = palette();
plt.setBrush(QPalette::Window, QColor(0xdddddd));
setPalette(plt);
2022-01-04 18:11:48 +08:00
//项目保存的文档路径
2022-08-25 18:37:24 +08:00
QString doc_path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
2022-01-04 18:11:48 +08:00
if(!doc_path.isEmpty()) {
2022-08-25 18:37:24 +08:00
QDir app_dir = QDir(doc_path + "/" + QApplication::applicationName());
2022-01-04 18:11:48 +08:00
if(!app_dir.exists()) {
QDir doc_dir(doc_path);
2022-08-25 18:37:24 +08:00
doc_dir.mkdir(QApplication::applicationName());
2022-01-04 18:11:48 +08:00
}
}
//创建一个垂直布局
2022-08-25 18:37:24 +08:00
auto vBox = new QVBoxLayout(center);
vBox->setContentsMargins(0, 0, 0, 0);
vBox->setSpacing(0);
2022-01-04 18:11:48 +08:00
2022-08-25 18:37:24 +08:00
//自定义的标题上的工具栏创建(语言和设置选项)
m_wTitle = new LoQTitleBar(this);
installEventFilter(m_wTitle);
2022-01-04 18:11:48 +08:00
2022-08-25 18:37:24 +08:00
//水平布局,放置配置按钮,最小化,最大化,关闭按钮
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"));
pLayout->addWidget(bn_Setting);
pLayout->addWidget(m_wTitle->bn_Minimize);
pLayout->addWidget(m_wTitle->bn_Maximize);
pLayout->addWidget(m_wTitle->bn_Close);
QMenu *menu_setting = new QMenu();
act_lang = new QAction();
act_lang->setMenu(menuLang);
menu_setting->addAction(act_lang);
act_softconfiguration = new QAction(tr("Software Configuration"));
act_softconfiguration->setObjectName("Software Configuration");
menu_setting->addAction(act_softconfiguration);
act_update = new QAction(tr("Check for updates"));
act_update->setObjectName("Update");
menu_setting->addAction(act_update);
act_updatefirmware = new QAction(tr("firmware manager"));
act_updatefirmware->setObjectName("Update firmware");
menu_setting->addAction(act_updatefirmware);
act_help = new QAction();
act_help->setObjectName("Help");
menu_setting->addAction(act_help);
auto actInfo = new QAction(tr("Info"));
connect(actInfo, &QAction::triggered, this, [this] {
QMessageBox::information(this, tr("Info"),
QString("SupportsSsl: ").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);
act_about = new QAction(tr("About"));
act_about->setObjectName("About");
menu_setting->addAction(act_about);
bn_Setting->setMenu(menu_setting);//按钮上添加下拉菜单
bn_Setting->setToolTip(tr("Setting"));
connect(menu_setting, &QMenu::triggered, this, [this](QAction* act) {
if(act->objectName()=="About") {
AboutDlg pDlg(this);
pDlg.exec();
}else if(act->objectName()=="Help") {
auto act = langGrp->checkedAction();
if(act==0) return;
QDesktopServices::openUrl(QUrl::fromLocalFile(QCoreApplication::applicationDirPath()+"/help/"+act->objectName()+".pdf"));
} else if(act->objectName()=="Update") {
UpdaterDialog *pDlg=new UpdaterDialog(this);
pDlg->exec();
} else if(act->objectName()=="Update firmware") {
auto dlg = new UpgradeApkDialog(this);
dlg->showMaximized();
} else if(act->objectName()=="Software Configuration") {
SoftConfigDialog *pDlg=new SoftConfigDialog(this);
pDlg->exec();
mBtnGrp->button(MainPage_LoraScreen)->setVisible(gShowLoraScreen);
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
});
QSimpleUpdater *updater = QSimpleUpdater::getInstance();
connect(updater, &QSimpleUpdater::checkingFinished, this, [this]() {
if(QSimpleUpdater::getInstance()->getUpdateAvailable(UpdVerUrl)) {//如果版本大于
if(QSimpleUpdater::getInstance()->getUpdateSameVersionAvailable(UpdVerUrl)) bn_Setting->setStyleSheet("image: url(:/res/AppSetting.png);");//如果同样的版本,不显示红点提示
else {//如果不同
bn_Setting->setStyleSheet("image: url(:/res/AppSettingTip.png);");
QIcon icon(":/res/reddot.png");
act_update->setIcon(icon);
}
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
else bn_Setting->setStyleSheet("image: url(:/res/AppSetting.png);");
});
updater->setModuleVersion(UpdVerUrl, APP_VERSION);
updater->setNotifyOnUpdate(UpdVerUrl, false);
updater->setNotifyOnFinish(UpdVerUrl, false);
updater->checkForUpdates(UpdVerUrl);
vBox->addWidget(m_wTitle);
2022-01-04 18:11:48 +08:00
2022-08-25 18:37:24 +08:00
//设备管理,节目管理,高级节目管理页创建
2022-09-30 18:08:39 +08:00
mDevicePanel = new DevicePanel(settings);
mProgPanel = new ProgPanel(settings);
2022-08-25 18:37:24 +08:00
m_wGuangYingPinWidget = new mGuangYingPinWidget();
2022-01-04 18:11:48 +08:00
2022-08-25 18:37:24 +08:00
auto hBox = new QHBoxLayout();
hBox->setSpacing(2);
mBtnGrp = new QButtonGroup(this);
hBox->addSpacing(144);
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);
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
vBox->addLayout(hBox);
wgts[MainPage_DeviceManager] = mDevicePanel;
wgts[MainPage_ProgManager] = mProgPanel;
wgts[MainPage_Setting] = mDevicePanel;
wgts[MainPage_LoraScreen] = m_wGuangYingPinWidget;
vBox->addWidget(wgts[curIndex]);//初始化响应页面为终端管理页面
mBtnGrp->button(curIndex)->setChecked(true);
connect(mBtnGrp, &QButtonGroup::idToggled, this, [this, vBox](int id, bool checked) {
if(!checked || id==curIndex) return;
if((id==MainPage_DeviceManager && curIndex==MainPage_Setting) || (id==MainPage_Setting && curIndex==MainPage_DeviceManager)){
mDevicePanel->ShowDevicesInfoOrControlWidget(id);
curIndex = id;
} else {
vBox->replaceWidget(wgts[curIndex], wgts[id]);
wgts[curIndex]->setParent(0);
curIndex = id;
if(curIndex == MainPage_DeviceManager || curIndex == MainPage_Setting) {
//开启UDP定时器
2022-09-28 18:21:57 +08:00
mDevicePanel->mUdpTimer.start(60000);
2022-08-25 18:37:24 +08:00
int cnt = mDevicePanel->mDeviceTable->topLevelItemCount();
for(int i=0; i<cnt; i++) {
auto item = static_cast<DeviceItem*>(mDevicePanel->mDeviceTable->topLevelItem(i));
item->mHeartbeatTimer.start(60000);
item->DeviceItemHttpPost();
}
mDevicePanel->ShowDevicesInfoOrControlWidget(id);
2022-01-04 18:11:48 +08:00
}
}
2022-08-25 18:37:24 +08:00
});
2022-01-04 18:11:48 +08:00
2022-08-25 18:37:24 +08:00
hBox = new QHBoxLayout();
m_pOneKeyCheckCard = new QPushButton;
m_pOneKeyCheckCard->setCursor(Qt::PointingHandCursor);
m_pOneKeyCheckCard->setProperty("ssType", "progManageTool");
connect(m_pOneKeyCheckCard, &QPushButton::clicked, this, [this] {
auto res = QMessageBox::warning(this, tr("Tip Info"), tr("RestoreLedCardIpByUdpTip"), QMessageBox::Ok, QMessageBox::Cancel);
2022-09-28 18:21:57 +08:00
if(res == QMessageBox::Ok) mDevicePanel->RestoreLedCardIpByUdpCmd();
2022-08-25 18:37:24 +08:00
});
hBox->addWidget(m_pOneKeyCheckCard);
hBox->addStretch();
vBox->addLayout(hBox);
gTextAntialiasing = settings.value("TextAntialiasing", false).toBool();
gShowLoraScreen = settings.value("GuangYingPin", false).toBool();
if(! gShowLoraScreen) 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();
appFile = QApplication::applicationDirPath()+"\\LedSet\\LedSet3.0.exe";
appFile.replace('/','\\');
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]));
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
// auto btn = new QPushButton("Test");
// hBox->addWidget(btn);
// connect(btn, &QPushButton::clicked, btn, [this] {
// test();
// });
}
void MainWindow::test() {
QNetworkRequest request{QUrl{"http://localhost/stock/test/timeout"}};
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
request.setTransferTimeout(4000);
auto doReply = [](QNetworkReply *reply) {
auto err = reply->error();
if(err != QNetworkReply::NoError) {
qDebug()<<"Error"<<err;
return;
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
auto status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if(status != 200) {
qDebug()<<"status"<<status;
return;
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
auto req = reply->request();
qDebug()<<"reply url"<<reply->url();
qDebug()<<"req url"<<req.url();
auto resp = reply->readAll();
qDebug()<<"resp"<<resp;
};
auto reply = Tools::netManager().get(request);
connect(reply, &QNetworkReply::finished, this, [reply, doReply, request] {
reply->deleteLater();
if(reply->error() != QNetworkReply::OperationCanceledError) {
doReply(reply);
return;
}
qDebug()<<"timeout again";
auto reply = Tools::netManager().get(request);
reply->connect(reply, &QNetworkReply::finished, reply, [reply, doReply] {
reply->deleteLater();
doReply(reply);
});
});
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
MainWindow::~MainWindow() {
QSettings settings;
auto act = langGrp->checkedAction();
if(act) settings.setValue("Language", act->objectName());
settings.setValue("MainGeo", normalGeometry());
settings.setValue("MainIsMax", isMaximized());
2022-09-06 23:40:02 +08:00
settings.setValue("PlayPos", gPlayPos);
2022-09-28 18:21:57 +08:00
if(mDevicePanel->fdIP) {
auto ipstr = mDevicePanel->fdIP->toPlainText();
if(! ipstr.isEmpty()) settings.setValue("SpecifyIP", ipstr);
2022-09-28 18:21:57 +08:00
}
2022-08-25 18:37:24 +08:00
if(m_pTimerSendResoreIpOneKey!=nullptr) {
if(m_pTimerSendResoreIpOneKey->isActive()) m_pTimerSendResoreIpOneKey->stop();
delete m_pTimerSendResoreIpOneKey;
2022-01-04 18:11:48 +08:00
}
2022-09-30 18:08:39 +08:00
settings.setValue("ProgramListSortColumn", mProgPanel->mProgTree->sortColumn());
settings.setValue("ProgramListSortOrder", mProgPanel->mProgTree->header()->sortIndicatorOrder());
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
void MainWindow::changeEvent(QEvent *event) {
BaseWin::changeEvent(event);
if(event->type() == QEvent::LanguageChange) transUi();
2022-01-04 18:11:48 +08:00
}
2022-08-25 18:37:24 +08:00
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("GuangYinPin"));
m_pOneKeyCheckCard->setText(tr("Check card"));
act_lang->setText(tr("Language"));
act_help->setText(tr("Help"));
act_about->setText(tr("About"));
act_update->setText(tr("Check for updates"));
act_updatefirmware->setText(tr("firmware manager"));
act_softconfiguration->setText(tr("Software Configuration"));
bn_Setting->setToolTip(tr("Setting"));
2022-01-04 18:11:48 +08:00
}