diff --git a/LedOK/LedOK.pro b/LedOK/LedOK.pro index 3b18836..fdec71e 100644 --- a/LedOK/LedOK.pro +++ b/LedOK/LedOK.pro @@ -8,7 +8,7 @@ QT += webenginewidgets greaterThan(QT_MAJOR_VERSION, 5) { QT += openglwidgets } -CONFIG += c++14 +CONFIG += c++17 CONFIG += lrelease CONFIG += embed_translations # CONFIG += console @@ -19,7 +19,7 @@ CONFIG += embed_translations #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 TARGET = $$quote(LedOK Express) -VERSION = 1.4.0 +VERSION = 1.4.1 DEFINES += APP_VERSION=\\\"$$VERSION\\\" msvc { contains(QT_ARCH, i386) { @@ -49,6 +49,7 @@ RESOURCES += res.qrc copydir.files += AClock +copydir.files += borders copydir.files += $$quote(y50 param) copydir.files += $$quote(files) @@ -94,9 +95,6 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin SOURCES += \ base/changepasswordform.cpp \ - base/customprogressindicator.cpp \ - base/loemptydialog.cpp \ - base/softconfigdialog.cpp \ base/switchcontrol.cpp \ base/extendedgroupbox.cpp \ base/ffutil.cpp \ @@ -114,7 +112,6 @@ SOURCES += \ device/ctrlpwdpanel.cpp \ device/ctrltestpanel.cpp \ device/ctrlvolumepanel.cpp \ - devicectrlpanel.cpp \ deviceitem.cpp \ devicepanel.cpp \ ffplayer.cpp \ @@ -171,9 +168,6 @@ SOURCES += \ HEADERS += \ base/changepasswordform.h \ - base/customprogressindicator.h \ - base/loemptydialog.h \ - base/softconfigdialog.h \ base/switchcontrol.h \ base/extendedgroupbox.h \ base/locolorselector.h \ @@ -190,7 +184,6 @@ HEADERS += \ device/ctrlpwdpanel.h \ device/ctrltestpanel.h \ device/ctrlvolumepanel.h \ - devicectrlpanel.h \ deviceitem.h \ devicepanel.h \ ffplayer.h \ diff --git a/LedOK/base/customprogressindicator.cpp b/LedOK/base/customprogressindicator.cpp deleted file mode 100644 index 743fcf1..0000000 --- a/LedOK/base/customprogressindicator.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include "customprogressindicator.h" -#include -#include - -CustomProgressIndicator::CustomProgressIndicator(QWidget* parent) - : QWidget(parent), - angle_(0), - timerId_(-1), - delay_(20), - displayedWhenStopped_(false), - color_(Qt::green) { - setAttribute(Qt::WA_DeleteOnClose); - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - setFocusPolicy(Qt::NoFocus); - setWindowFlags(Qt::FramelessWindowHint);//无窗体 - setAttribute(Qt::WA_TranslucentBackground);//背景透明 -} - -bool CustomProgressIndicator::isAnimated () const { - return (timerId_ != -1); -} - -void CustomProgressIndicator::setDisplayedWhenStopped(bool state) { - displayedWhenStopped_ = state; - - update(); -} - -bool CustomProgressIndicator::isDisplayedWhenStopped() const { - return displayedWhenStopped_; -} -void CustomProgressIndicator::setDisplayModel(int iFlag) -{ - m_iLoopBackFlag=iFlag; -} -void CustomProgressIndicator::startAnimation() { - angle_ = 0; - - if (timerId_ == -1) { - timerId_ = startTimer(delay_); - } -} -void CustomProgressIndicator::setDisplayStringInfo(QString strTip,QString strTiping) { - m_strTip=strTip; - m_strTiping=strTiping; - update(); -} -void CustomProgressIndicator::stopAnimation() { - if (timerId_ != -1) { - killTimer(timerId_); - } - - timerId_ = -1; - - update(); -} - -void CustomProgressIndicator::setAnimationDelay(int delay) { - if (timerId_ != -1){ - killTimer(timerId_); - } - - delay_ = delay; - - if (timerId_ != -1){ - timerId_ = startTimer(delay_); - } -} - -void CustomProgressIndicator::setColor(const QColor & color) { - color_ = color; - - update(); -} - -QSize CustomProgressIndicator::sizeHint() const { - return QSize(80,80); -} - - -void CustomProgressIndicator::timerEvent(QTimerEvent *) { - angle_ = (angle_+30)%360; - - update(); -} - -void CustomProgressIndicator::paintEvent(QPaintEvent *) { - QPainter p(this); - drawJuHua(&p); -} -void CustomProgressIndicator::drawJuHua(QPainter *painter) -{ - painter->setRenderHint(QPainter::Antialiasing); - if (displayedWhenStopped_ && !isAnimated()) //如果displayedWhenStopped_==flash并且动画已经停止则不绘制 - { - painter->setPen(color_); - painter->drawPixmap(rect(),currentPix_); - painter->drawText(rect(), Qt::AlignCenter, m_strTip); - - return; - } - - int width = qMin(this->width(), this->height()); - - int outerRadius = (width-1) >> 1; - int innerRadius = int(((width-1) >> 1)*0.38); - - int capsuleHeight = outerRadius - innerRadius; - int capsuleWidth = (width > 32 ) ? (int)(capsuleHeight *0.23) : (int)(capsuleHeight *0.35); - int capsuleRadius = capsuleWidth >> 1; - if(m_iLoopBackFlag==1) - { - painter->setPen(color_); - painter->drawText(rect(), Qt::AlignCenter, m_strTiping); - } - else { - /* 撰写进度 */ - if (progress_ > 0 && progress_ < 100) { - painter->setPen(color_); - painter->drawText(rect(), Qt::AlignCenter, QString("%1%").arg(progress_)); - } - else if (progress_ == 100) { - stopAnimation(); - } - } - for (int i=0; i<12; ++i) { - QColor color = color_; - color.setAlphaF(1.0f - (i/12.0f)); - painter->setPen(Qt::NoPen); - painter->setBrush(color); - painter->save(); - painter->translate(rect().center()); - painter->rotate(angle_ - i*30.0f); - painter->drawRoundedRect(((-capsuleWidth) >> 1), -(innerRadius+capsuleHeight), capsuleWidth, capsuleHeight, capsuleRadius, capsuleRadius); - painter->restore(); - } -} diff --git a/LedOK/base/customprogressindicator.h b/LedOK/base/customprogressindicator.h deleted file mode 100644 index 3238a08..0000000 --- a/LedOK/base/customprogressindicator.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef CUSTOMPROGRESSINDICATOR_H -#define CUSTOMPROGRESSINDICATOR_H - -#include -#include -#include -/* -* 菊花转 进度类,基于代码无需图片资源 -* 作者:陈鲁勇 -* 邮箱:727057301@qq.com -* 创建时间:2017年2月10日16:26:48 -* QT版本:5.0.2 -* CSDN:http://blog.csdn.net/csnd_ayo -* ************************************** -* 说明: -* 使用前请确保在QT.pro中加入 C++11 的支持 -* -* 示例代码: - - pIndicator = new CustomProgressIndicator(this); - pIndicator->setColor(Qt::red); - pIndicator->startAnimation(); -*/ - -class CustomProgressIndicator : public QWidget -{ - Q_OBJECT - Q_PROPERTY(int delay READ animationDelay WRITE setAnimationDelay) - Q_PROPERTY(bool displayedWhenStopped READ isDisplayedWhenStopped WRITE setDisplayedWhenStopped) - Q_PROPERTY(QColor color READ color WRITE setColor) -public: - CustomProgressIndicator(QWidget* parent = nullptr); - - int animationDelay() const { return delay_; } - - /* 动画是否正在进行中 */ - bool isAnimated () const; - - /* 动画完毕后,是否隐藏菊花转 */ - bool isDisplayedWhenStopped() const; - - /* 当前菊花转的颜色 */ - const QColor & color() const { return color_; } - - /* 虚函数:当前大小 */ - virtual QSize sizeHint() const; - - void setBackground(const QString& _icon) { - currentPix_ = QPixmap(_icon); - } -signals: - void Finished(void); -public slots: - - /* 开始动画 */ - void startAnimation(); - - /* 停止动画 */ - void stopAnimation(); - /* 设置停止菊花,显示圆圈加对号*/ - void setDisplayStringInfo(QString strTip,QString strTiping); - void setDisplayModel(int iFlag);//iFlag 0:表示进度统计,1:表示strTiping提示,结束后显示strTip - - /* 设置菊花转的转速 */ - void setAnimationDelay(int delay); - - /* 动画完毕后,是否隐藏菊花转 */ - void setDisplayedWhenStopped(bool state); - - /* 设置菊花转颜色 */ - void setColor(const QColor & color); - - /* - * 进度 - * 参数 _progress:当前进度 0 < _progress < 100 - */ - void onProgress(QString msg, int _progress, bool done) - { - Q_UNUSED(msg) - progress_ = _progress; - if(done) - { - progress_=100; - - } - } -protected: - /* 系统基类函数 */ - virtual void timerEvent(QTimerEvent * event); - virtual void paintEvent(QPaintEvent * event); - void drawJuHua(QPainter *painter); - -private: - /* 角度 */ - unsigned int angle_; - /* 定时器ID */ - int timerId_; - /* 转速 */ - int delay_; - /* 是否隐藏 */ - bool displayedWhenStopped_; - /* 菊花转颜色 */ - QColor color_; - /* 进度 */ - int progress_; - /* 背景图 */ - QPixmap currentPix_; - /*显示圆圈中的字符串内容*/ - QString m_strTip = ""; - QString m_strTiping = ""; - int m_iLoopBackFlag = 0; - -}; - - -#endif // CUSTOMPROGRESSINDICATOR_H diff --git a/LedOK/base/loemptydialog.cpp b/LedOK/base/loemptydialog.cpp deleted file mode 100644 index b24d64a..0000000 --- a/LedOK/base/loemptydialog.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "loemptydialog.h" -#include - -LoEmptyDialog::LoEmptyDialog(QWidget *parent) : BaseDlg(parent) { - setAttribute(Qt::WA_DeleteOnClose); - - auto pal = palette(); - pal.setBrush(QPalette::Window, QColor(0xdd, 0xdd, 0xdd, 0xdd)); - setPalette(pal); - - auto vBox = new QVBoxLayout(this); - vBox->addStretch(); - - mIndicator = new CustomProgressIndicator(this); - mIndicator->setDisplayModel(1); - mIndicator->setColor(QColor(0x0088dd)); - mIndicator->setDisplayedWhenStopped(true);//动画停止后任就显示,直到关闭窗口 - mIndicator->startAnimation(); - vBox->addWidget(mIndicator, 0, Qt::AlignCenter); - - vBox->addStretch(); - - label = new QLabel(); - label->setAlignment(Qt::AlignCenter); - label->setStyleSheet("font-size: 24px; font-weight: bold; color: #08d;"); - vBox->addWidget(label); - - vBox->addStretch(); -} - -void LoEmptyDialog::SetTipTextContent(QString strTip) { - label->setText(strTip); -} -void LoEmptyDialog::SetFailedTipString(QString strTip) { - mTimeroutTip = strTip; -} -bool LoEmptyDialog::getLockStatus() { - return iLockFlag; -} - -void LoEmptyDialog::lock(QString strTip, QString finishTip, QString timeroutTip) { - iLockFlag = true; - label->setText(strTip); - mFinishTip = finishTip; - mTimeroutTip = timeroutTip; -} - -void LoEmptyDialog::unlock() { - if(iClosedFlag==1) return; - label->setText(mFinishTip); - if(mIndicator != nullptr) { - mIndicator->setBackground(":/res/success.png"); - mIndicator->stopAnimation(); - CloseWndByDelaySec(600); - } - iClosedFlag=1; - iLockFlag = false; -} -void LoEmptyDialog::TimerOutUnlock() { - if(iClosedFlag==1) return; - label->setText(mTimeroutTip); - if(mIndicator != nullptr) { - mIndicator->setBackground(":/res/tip.png"); - mIndicator->stopAnimation(); - CloseWndByDelaySec(600); - } - iClosedFlag = 1; -} -void LoEmptyDialog::CloseWndByDelaySec(int iCloseWndDelaySec) { - auto timer = new QTimer(this); - timer->setSingleShot(true); - connect(timer, &QTimer::timeout, this, [this, timer] { - timer->stop(); - close(); - emit sigClose(); - }); - timer->start(iCloseWndDelaySec); -} diff --git a/LedOK/base/loemptydialog.h b/LedOK/base/loemptydialog.h deleted file mode 100644 index 456ec1c..0000000 --- a/LedOK/base/loemptydialog.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef LOEMPTYDIALOG_H -#define LOEMPTYDIALOG_H - -#include -#include -#include - -class LoEmptyDialog : public BaseDlg { - Q_OBJECT -public: - explicit LoEmptyDialog(QWidget *parent = nullptr); - int exec() override { - emit startUp(); - return BaseDlg::exec(); - } - CustomProgressIndicator *mIndicator{0}; -signals: - void startUp(); - void sigClose(); -public slots: - void lock(QString strTip,QString strUnLockTip,QString strTimerOutUnLockTip); - void unlock(); - void TimerOutUnlock(); - bool getLockStatus(); - void SetFailedTipString(QString strTip); - void SetTipTextContent(QString strTip); -private: - QLabel *label; - int iClosedFlag=0; - bool iLockFlag = false; - QString mFinishTip; - QString mTimeroutTip; - LoEmptyDialog *m_pSelf=nullptr; - void CloseWndByDelaySec(int iCloseWndDelaySec); -}; - -#endif // LOEMPTYDIALOG_H diff --git a/LedOK/base/softconfigdialog.cpp b/LedOK/base/softconfigdialog.cpp deleted file mode 100644 index 8c713c1..0000000 --- a/LedOK/base/softconfigdialog.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "softconfigdialog.h" -#include "cfg.h" -#include "globaldefine.h" -#include -#include -#include -#include - -SoftConfigDialog::SoftConfigDialog(QWidget *parent) : QDialog(parent) { - setWindowFlag(Qt::WindowContextHelpButtonHint, 0); - resize(400, 300); - setWindowTitle(tr("Software Config")); - auto vbox = new QVBoxLayout(this); - - press_fd = new QCheckBox(tr("Video compress to")+" 720p"); - press_fd->setChecked(gVideoCompress); - vbox->addWidget(press_fd); - - trans_fd = new QCheckBox(tr("Video transcoding to")+" h264"); - trans_fd->setChecked(gVideoTranscoding); - vbox->addWidget(trans_fd); - - auto hbox = new QHBoxLayout(); - hbox->setContentsMargins(-1, 0, -1, -1); - anti_fd = new QCheckBox(tr("Text antialiasing")); - anti_fd->setChecked(gTextAntialiasing); - hbox->addWidget(anti_fd, 0, Qt::AlignTop); - - auto anti_tip = new QLabel(tr("TextAntilaTip")); - anti_tip->setStyleSheet("QLabel{color: #f00;}"); - anti_tip->setWordWrap(true); - hbox->addWidget(anti_tip); - - vbox->addLayout(hbox); - - vbox->addWidget(guangying_fd = new QCheckBox(tr("GuangYinPin"))); - guangying_fd->setChecked(gShowLoraScreen); - - vbox->addWidget(fdWidthSplit = new QCheckBox(tr("Width Split"))); - fdWidthSplit->setChecked(gWidthSplit); - - - auto ok_btn = new QPushButton(tr("OK")); - vbox->addWidget(ok_btn, 0, Qt::AlignCenter); - connect(ok_btn, &QPushButton::clicked, this, [this]() { - QSettings settings; - settings.setValue("VideoCompress", gVideoCompress = press_fd->isChecked()); - settings.setValue("VideoTranscoding", gVideoTranscoding = trans_fd->isChecked()); - settings.setValue("TextAntialiasing", gTextAntialiasing = anti_fd->isChecked()); - settings.setValue("GuangYingPin",gShowLoraScreen = guangying_fd->isChecked()); - settings.setValue("WidthSplit", gWidthSplit = fdWidthSplit->isChecked()); - accept(); - }); -} diff --git a/LedOK/base/softconfigdialog.h b/LedOK/base/softconfigdialog.h deleted file mode 100644 index 2ed1e80..0000000 --- a/LedOK/base/softconfigdialog.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SOFTCONFIGDIALOG_H -#define SOFTCONFIGDIALOG_H - -#include -#include - -class SoftConfigDialog : public QDialog { - Q_OBJECT -public: - explicit SoftConfigDialog(QWidget *parent = 0); - - QCheckBox *press_fd, *trans_fd, *anti_fd, *guangying_fd, *fdWidthSplit; -}; - -#endif // SOFTCONFIGDIALOG_H diff --git a/LedOK/base/waitingdlg.cpp b/LedOK/base/waitingdlg.cpp index 0174a08..96c46cd 100644 --- a/LedOK/base/waitingdlg.cpp +++ b/LedOK/base/waitingdlg.cpp @@ -1,61 +1,120 @@ #include "waitingdlg.h" -#include +#include "gutil/qgui.h" #include -#include +#include +#include -WaitingDlg::WaitingDlg(QWidget *parent, QString text, QString sucText) : BaseDlg{parent}, sucText(sucText) { +WaitingDlg::WaitingDlg(QWidget *parent, QString text, QString sucText) : QDialog{parent, Qt::Tool}, sucText(sucText) { setAttribute(Qt::WA_DeleteOnClose); setModal(true); - auto pal = palette(); - pal.setBrush(QPalette::Window, QColor(0xdddddd)); - setPalette(pal); + auto vBox = new VBox(this); - auto vBox = new QVBoxLayout(this); - vBox->setContentsMargins(6, 3, 6, 6); - vBox->addStretch(); - - btnAbort = new QPushButton("X"); - btnAbort->setStyleSheet(R"rrr( -QPushButton {border-radius: 4px; padding: 2px 6px; background: transparent;} -QPushButton:hover {background: rgba(0,0,0,0.2);} -QPushButton:pressed {background: rgba(0,0,0,0.3);} -)rrr"); - connect(btnAbort, &QPushButton::clicked, this, &QDialog::reject); - vBox->addWidget(btnAbort, 0, Qt::AlignRight); - - mIndicator = new CustomProgressIndicator(this); - mIndicator->setDisplayModel(1); - mIndicator->setColor(QColor(0x0088dd)); - mIndicator->startAnimation(); + mIndicator = new WaitingIndicator(this); + mIndicator->setFixedSize(120, 120); vBox->addWidget(mIndicator, 0, Qt::AlignCenter); - vBox->addStretch(); - fdText = new QLabel(text); fdText->setAlignment(Qt::AlignCenter); - auto font = fdText->font(); - font.setPixelSize(18); - font.setBold(true); - fdText->setFont(font); - pal = fdText->palette(); - pal.setBrush(QPalette::WindowText, QColor(0x0088dd)); - fdText->setPalette(pal); + gFont(fdText, 18, true); vBox->addWidget(fdText); - - vBox->addStretch(); } +void WaitingDlg::closeEvent(QCloseEvent *event) { + if(showTimerId) { + killTimer(showTimerId); + showTimerId = 0; + } + if(closeTimerId) { + killTimer(closeTimerId); + closeTimerId = 0; + } + QDialog::closeEvent(event); +} void WaitingDlg::timerEvent(QTimerEvent *event) { - if(closeTimerId==event->timerId()) { + if(showTimerId==event->timerId()) { + killTimer(showTimerId); + showTimerId = 0; + show(); + } else if(closeTimerId==event->timerId()) { killTimer(closeTimerId); closeTimerId = 0; close(); - } else BaseDlg::timerEvent(event); + } else QDialog::timerEvent(event); +} +void WaitingDlg::show() { + QDialog::show(); + raise(); + activateWindow(); +} +void WaitingDlg::showLater() { + if(isVisible()) return; + if(showTimerId) killTimer(showTimerId); + showTimerId = startTimer(200); } void WaitingDlg::success() { fdText->setText(sucText.isEmpty() ? tr("Success") : sucText); - mIndicator->setBackground(":/res/success.png"); - mIndicator->stopAnimation(); - closeTimerId = startTimer(800); + mIndicator->success(); + if(showTimerId) { + killTimer(showTimerId); + showTimerId = 0; + } + if(! isVisible()) show(); + if(closeTimerId) killTimer(closeTimerId); + closeTimerId = startTimer(1000); +} + + +void WaitingIndicator::success() { + if(timerId > 0) killTimer(timerId); + timerId = -1; + angle = 0; + update(); +} + +void WaitingIndicator::timerEvent(QTimerEvent *event) { + if(timerId!=event->timerId()) QWidget::timerEvent(event); + else if(isVisible()) { + angle += 30; + if(angle>=360) angle -= 360; + update(); + } else if(timerId > 0) { + killTimer(timerId); + timerId = 0; + angle = 0; + } +} + +void WaitingIndicator::paintEvent(QPaintEvent *) { + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + if(timerId > 0) { + int radius = qMin(width(), height()) * 0.33; + int innerRadius = radius >> 1; + QPen pen(mColor, radius / 6, Qt::SolidLine, Qt::RoundCap); + painter.translate(width()>>1, height()>>1); + auto color = mColor; + for(int i=0; i<12; ++i) { + if(i) { + color.setAlphaF(1 - i/12.0); + pen.setColor(color); + painter.rotate(-30); + } else if(angle) painter.rotate(angle); + painter.setPen(pen); + painter.drawLine(0, innerRadius, 0, radius); + } + } else if(timerId==0) timerId = startTimer(33); + else { + int radius = qMin(width(), height()) >> 1; + int lineWidth = radius / 8; + radius -= lineWidth>>1; + QPen pen(QColor(0x00aa00), lineWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); + painter.setPen(pen); + painter.translate(width()>>1, height()>>1); + painter.drawEllipse(QPoint(0, 0), radius, radius); + QPainterPath path({-0.8*radius, 0}); + path.lineTo(-0.25*radius, 0.6*radius); + path.lineTo(0.6*radius, -0.5*radius); + painter.drawPath(path); + } } diff --git a/LedOK/base/waitingdlg.h b/LedOK/base/waitingdlg.h index 32453d8..7beb2ec 100644 --- a/LedOK/base/waitingdlg.h +++ b/LedOK/base/waitingdlg.h @@ -1,12 +1,26 @@ #ifndef WAITINGDLG_H #define WAITINGDLG_H -#include "basedlg.h" -#include "base/customprogressindicator.h" #include #include +#include -class WaitingDlg : public BaseDlg { +class WaitingIndicator : public QWidget { + Q_OBJECT +public: + using QWidget::QWidget; + QColor mColor{0x0088ff}; +public slots: + void success(); +protected: + void timerEvent(QTimerEvent * event) override; + void paintEvent(QPaintEvent * event) override; + + int angle{0}; + int timerId{0}; +}; + +class WaitingDlg : public QDialog { Q_OBJECT public: explicit WaitingDlg(QWidget *parent = nullptr, QString text = 0, QString sucText = 0); @@ -19,16 +33,18 @@ public: reply->deleteLater(); }); } - QPushButton *btnAbort; QLabel *fdText; QString sucText; - CustomProgressIndicator *mIndicator; + WaitingIndicator *mIndicator; public slots: + void show(); + void showLater(); void success(); protected: void timerEvent(QTimerEvent *) override; + void closeEvent(QCloseEvent *) override; private: - int closeTimerId{0}; + int closeTimerId{0}, showTimerId{0}; }; #endif // WAITINGDLG_H diff --git a/LedOK/basewin.h b/LedOK/basewin.h index 361b192..747d67d 100644 --- a/LedOK/basewin.h +++ b/LedOK/basewin.h @@ -7,8 +7,8 @@ class BaseWin : public QWidget { Q_OBJECT public: - explicit BaseWin(QWidget *parent = nullptr); - QWidget *center{nullptr}; + explicit BaseWin(QWidget *parent = 0); + QWidget *center{0}; QPen borderPenAct{Qt::gray}; QPen borderPenUnact{Qt::lightGray}; qreal roundRadius{6.0}; diff --git a/LedOK/res/borders/M1_0.bmp b/LedOK/borders/M1_0.bmp similarity index 100% rename from LedOK/res/borders/M1_0.bmp rename to LedOK/borders/M1_0.bmp diff --git a/LedOK/res/borders/M1_1.bmp b/LedOK/borders/M1_1.bmp similarity index 100% rename from LedOK/res/borders/M1_1.bmp rename to LedOK/borders/M1_1.bmp diff --git a/LedOK/res/borders/M1_2.bmp b/LedOK/borders/M1_2.bmp similarity index 100% rename from LedOK/res/borders/M1_2.bmp rename to LedOK/borders/M1_2.bmp diff --git a/LedOK/res/borders/M1_3.bmp b/LedOK/borders/M1_3.bmp similarity index 100% rename from LedOK/res/borders/M1_3.bmp rename to LedOK/borders/M1_3.bmp diff --git a/LedOK/res/borders/M1_4.bmp b/LedOK/borders/M1_4.bmp similarity index 100% rename from LedOK/res/borders/M1_4.bmp rename to LedOK/borders/M1_4.bmp diff --git a/LedOK/res/borders/M1_5.bmp b/LedOK/borders/M1_5.bmp similarity index 100% rename from LedOK/res/borders/M1_5.bmp rename to LedOK/borders/M1_5.bmp diff --git a/LedOK/res/borders/M1_6.bmp b/LedOK/borders/M1_6.bmp similarity index 100% rename from LedOK/res/borders/M1_6.bmp rename to LedOK/borders/M1_6.bmp diff --git a/LedOK/res/borders/M1_7.bmp b/LedOK/borders/M1_7.bmp similarity index 100% rename from LedOK/res/borders/M1_7.bmp rename to LedOK/borders/M1_7.bmp diff --git a/LedOK/res/borders/M1_8.bmp b/LedOK/borders/M1_8.bmp similarity index 100% rename from LedOK/res/borders/M1_8.bmp rename to LedOK/borders/M1_8.bmp diff --git a/LedOK/res/borders/M2_0.bmp b/LedOK/borders/M2_0.bmp similarity index 100% rename from LedOK/res/borders/M2_0.bmp rename to LedOK/borders/M2_0.bmp diff --git a/LedOK/res/borders/M2_1.bmp b/LedOK/borders/M2_1.bmp similarity index 100% rename from LedOK/res/borders/M2_1.bmp rename to LedOK/borders/M2_1.bmp diff --git a/LedOK/res/borders/M2_2.bmp b/LedOK/borders/M2_2.bmp similarity index 100% rename from LedOK/res/borders/M2_2.bmp rename to LedOK/borders/M2_2.bmp diff --git a/LedOK/res/borders/M2_3.bmp b/LedOK/borders/M2_3.bmp similarity index 100% rename from LedOK/res/borders/M2_3.bmp rename to LedOK/borders/M2_3.bmp diff --git a/LedOK/res/borders/M2_5.bmp b/LedOK/borders/M2_5.bmp similarity index 100% rename from LedOK/res/borders/M2_5.bmp rename to LedOK/borders/M2_5.bmp diff --git a/LedOK/res/borders/M2_6.bmp b/LedOK/borders/M2_6.bmp similarity index 100% rename from LedOK/res/borders/M2_6.bmp rename to LedOK/borders/M2_6.bmp diff --git a/LedOK/res/borders/M2_7.bmp b/LedOK/borders/M2_7.bmp similarity index 100% rename from LedOK/res/borders/M2_7.bmp rename to LedOK/borders/M2_7.bmp diff --git a/LedOK/res/borders/M2_8.bmp b/LedOK/borders/M2_8.bmp similarity index 100% rename from LedOK/res/borders/M2_8.bmp rename to LedOK/borders/M2_8.bmp diff --git a/LedOK/res/borders/M3_0.bmp b/LedOK/borders/M3_0.bmp similarity index 100% rename from LedOK/res/borders/M3_0.bmp rename to LedOK/borders/M3_0.bmp diff --git a/LedOK/res/borders/M3_1.bmp b/LedOK/borders/M3_1.bmp similarity index 100% rename from LedOK/res/borders/M3_1.bmp rename to LedOK/borders/M3_1.bmp diff --git a/LedOK/res/borders/M3_2.bmp b/LedOK/borders/M3_2.bmp similarity index 100% rename from LedOK/res/borders/M3_2.bmp rename to LedOK/borders/M3_2.bmp diff --git a/LedOK/res/borders/M3_3.bmp b/LedOK/borders/M3_3.bmp similarity index 100% rename from LedOK/res/borders/M3_3.bmp rename to LedOK/borders/M3_3.bmp diff --git a/LedOK/res/borders/M3_4.bmp b/LedOK/borders/M3_4.bmp similarity index 100% rename from LedOK/res/borders/M3_4.bmp rename to LedOK/borders/M3_4.bmp diff --git a/LedOK/res/borders/M3_5.bmp b/LedOK/borders/M3_5.bmp similarity index 100% rename from LedOK/res/borders/M3_5.bmp rename to LedOK/borders/M3_5.bmp diff --git a/LedOK/res/borders/M3_6.bmp b/LedOK/borders/M3_6.bmp similarity index 100% rename from LedOK/res/borders/M3_6.bmp rename to LedOK/borders/M3_6.bmp diff --git a/LedOK/res/borders/M3_7.bmp b/LedOK/borders/M3_7.bmp similarity index 100% rename from LedOK/res/borders/M3_7.bmp rename to LedOK/borders/M3_7.bmp diff --git a/LedOK/res/borders/M3_8.bmp b/LedOK/borders/M3_8.bmp similarity index 100% rename from LedOK/res/borders/M3_8.bmp rename to LedOK/borders/M3_8.bmp diff --git a/LedOK/res/borders/M4_0.bmp b/LedOK/borders/M4_0.bmp similarity index 100% rename from LedOK/res/borders/M4_0.bmp rename to LedOK/borders/M4_0.bmp diff --git a/LedOK/res/borders/M4_1.bmp b/LedOK/borders/M4_1.bmp similarity index 100% rename from LedOK/res/borders/M4_1.bmp rename to LedOK/borders/M4_1.bmp diff --git a/LedOK/res/borders/M4_2.bmp b/LedOK/borders/M4_2.bmp similarity index 100% rename from LedOK/res/borders/M4_2.bmp rename to LedOK/borders/M4_2.bmp diff --git a/LedOK/res/borders/M4_3.bmp b/LedOK/borders/M4_3.bmp similarity index 100% rename from LedOK/res/borders/M4_3.bmp rename to LedOK/borders/M4_3.bmp diff --git a/LedOK/res/borders/M4_4.bmp b/LedOK/borders/M4_4.bmp similarity index 100% rename from LedOK/res/borders/M4_4.bmp rename to LedOK/borders/M4_4.bmp diff --git a/LedOK/res/borders/M4_5.bmp b/LedOK/borders/M4_5.bmp similarity index 100% rename from LedOK/res/borders/M4_5.bmp rename to LedOK/borders/M4_5.bmp diff --git a/LedOK/res/borders/M4_6.bmp b/LedOK/borders/M4_6.bmp similarity index 100% rename from LedOK/res/borders/M4_6.bmp rename to LedOK/borders/M4_6.bmp diff --git a/LedOK/res/borders/M4_7.bmp b/LedOK/borders/M4_7.bmp similarity index 100% rename from LedOK/res/borders/M4_7.bmp rename to LedOK/borders/M4_7.bmp diff --git a/LedOK/res/borders/M4_8.bmp b/LedOK/borders/M4_8.bmp similarity index 100% rename from LedOK/res/borders/M4_8.bmp rename to LedOK/borders/M4_8.bmp diff --git a/LedOK/res/borders/M5_0.bmp b/LedOK/borders/M5_0.bmp similarity index 100% rename from LedOK/res/borders/M5_0.bmp rename to LedOK/borders/M5_0.bmp diff --git a/LedOK/res/borders/M5_1.bmp b/LedOK/borders/M5_1.bmp similarity index 100% rename from LedOK/res/borders/M5_1.bmp rename to LedOK/borders/M5_1.bmp diff --git a/LedOK/res/borders/M5_2.bmp b/LedOK/borders/M5_2.bmp similarity index 100% rename from LedOK/res/borders/M5_2.bmp rename to LedOK/borders/M5_2.bmp diff --git a/LedOK/res/borders/M5_3.bmp b/LedOK/borders/M5_3.bmp similarity index 100% rename from LedOK/res/borders/M5_3.bmp rename to LedOK/borders/M5_3.bmp diff --git a/LedOK/res/borders/M5_4.bmp b/LedOK/borders/M5_4.bmp similarity index 100% rename from LedOK/res/borders/M5_4.bmp rename to LedOK/borders/M5_4.bmp diff --git a/LedOK/res/borders/M5_5.bmp b/LedOK/borders/M5_5.bmp similarity index 100% rename from LedOK/res/borders/M5_5.bmp rename to LedOK/borders/M5_5.bmp diff --git a/LedOK/res/borders/M5_6.bmp b/LedOK/borders/M5_6.bmp similarity index 100% rename from LedOK/res/borders/M5_6.bmp rename to LedOK/borders/M5_6.bmp diff --git a/LedOK/res/borders/M5_7.bmp b/LedOK/borders/M5_7.bmp similarity index 100% rename from LedOK/res/borders/M5_7.bmp rename to LedOK/borders/M5_7.bmp diff --git a/LedOK/res/borders/M5_8.bmp b/LedOK/borders/M5_8.bmp similarity index 100% rename from LedOK/res/borders/M5_8.bmp rename to LedOK/borders/M5_8.bmp diff --git a/LedOK/res/borders/M6_0.bmp b/LedOK/borders/M6_0.bmp similarity index 100% rename from LedOK/res/borders/M6_0.bmp rename to LedOK/borders/M6_0.bmp diff --git a/LedOK/res/borders/M6_1.bmp b/LedOK/borders/M6_1.bmp similarity index 100% rename from LedOK/res/borders/M6_1.bmp rename to LedOK/borders/M6_1.bmp diff --git a/LedOK/res/borders/M6_2.bmp b/LedOK/borders/M6_2.bmp similarity index 100% rename from LedOK/res/borders/M6_2.bmp rename to LedOK/borders/M6_2.bmp diff --git a/LedOK/res/borders/M6_3.bmp b/LedOK/borders/M6_3.bmp similarity index 100% rename from LedOK/res/borders/M6_3.bmp rename to LedOK/borders/M6_3.bmp diff --git a/LedOK/res/borders/M6_4.bmp b/LedOK/borders/M6_4.bmp similarity index 100% rename from LedOK/res/borders/M6_4.bmp rename to LedOK/borders/M6_4.bmp diff --git a/LedOK/res/borders/M6_5.bmp b/LedOK/borders/M6_5.bmp similarity index 100% rename from LedOK/res/borders/M6_5.bmp rename to LedOK/borders/M6_5.bmp diff --git a/LedOK/res/borders/M6_6.bmp b/LedOK/borders/M6_6.bmp similarity index 100% rename from LedOK/res/borders/M6_6.bmp rename to LedOK/borders/M6_6.bmp diff --git a/LedOK/res/borders/M6_7.bmp b/LedOK/borders/M6_7.bmp similarity index 100% rename from LedOK/res/borders/M6_7.bmp rename to LedOK/borders/M6_7.bmp diff --git a/LedOK/res/borders/M6_8.bmp b/LedOK/borders/M6_8.bmp similarity index 100% rename from LedOK/res/borders/M6_8.bmp rename to LedOK/borders/M6_8.bmp diff --git a/LedOK/res/borders/M6_9.bmp b/LedOK/borders/M6_9.bmp similarity index 100% rename from LedOK/res/borders/M6_9.bmp rename to LedOK/borders/M6_9.bmp diff --git a/LedOK/res/borders/M7_0.bmp b/LedOK/borders/M7_0.bmp similarity index 100% rename from LedOK/res/borders/M7_0.bmp rename to LedOK/borders/M7_0.bmp diff --git a/LedOK/res/borders/M7_1.bmp b/LedOK/borders/M7_1.bmp similarity index 100% rename from LedOK/res/borders/M7_1.bmp rename to LedOK/borders/M7_1.bmp diff --git a/LedOK/res/borders/M7_2.bmp b/LedOK/borders/M7_2.bmp similarity index 100% rename from LedOK/res/borders/M7_2.bmp rename to LedOK/borders/M7_2.bmp diff --git a/LedOK/res/borders/M7_3.bmp b/LedOK/borders/M7_3.bmp similarity index 100% rename from LedOK/res/borders/M7_3.bmp rename to LedOK/borders/M7_3.bmp diff --git a/LedOK/res/borders/M7_4.bmp b/LedOK/borders/M7_4.bmp similarity index 100% rename from LedOK/res/borders/M7_4.bmp rename to LedOK/borders/M7_4.bmp diff --git a/LedOK/res/borders/M7_5.bmp b/LedOK/borders/M7_5.bmp similarity index 100% rename from LedOK/res/borders/M7_5.bmp rename to LedOK/borders/M7_5.bmp diff --git a/LedOK/res/borders/M7_6.bmp b/LedOK/borders/M7_6.bmp similarity index 100% rename from LedOK/res/borders/M7_6.bmp rename to LedOK/borders/M7_6.bmp diff --git a/LedOK/res/borders/M7_7.bmp b/LedOK/borders/M7_7.bmp similarity index 100% rename from LedOK/res/borders/M7_7.bmp rename to LedOK/borders/M7_7.bmp diff --git a/LedOK/res/borders/M7_8.bmp b/LedOK/borders/M7_8.bmp similarity index 100% rename from LedOK/res/borders/M7_8.bmp rename to LedOK/borders/M7_8.bmp diff --git a/LedOK/res/borders/M8_0.bmp b/LedOK/borders/M8_0.bmp similarity index 100% rename from LedOK/res/borders/M8_0.bmp rename to LedOK/borders/M8_0.bmp diff --git a/LedOK/res/borders/M8_1.bmp b/LedOK/borders/M8_1.bmp similarity index 100% rename from LedOK/res/borders/M8_1.bmp rename to LedOK/borders/M8_1.bmp diff --git a/LedOK/res/borders/M8_2.bmp b/LedOK/borders/M8_2.bmp similarity index 100% rename from LedOK/res/borders/M8_2.bmp rename to LedOK/borders/M8_2.bmp diff --git a/LedOK/res/borders/M8_3.bmp b/LedOK/borders/M8_3.bmp similarity index 100% rename from LedOK/res/borders/M8_3.bmp rename to LedOK/borders/M8_3.bmp diff --git a/LedOK/res/borders/M8_4.bmp b/LedOK/borders/M8_4.bmp similarity index 100% rename from LedOK/res/borders/M8_4.bmp rename to LedOK/borders/M8_4.bmp diff --git a/LedOK/res/borders/M8_5.bmp b/LedOK/borders/M8_5.bmp similarity index 100% rename from LedOK/res/borders/M8_5.bmp rename to LedOK/borders/M8_5.bmp diff --git a/LedOK/res/borders/M8_6.bmp b/LedOK/borders/M8_6.bmp similarity index 100% rename from LedOK/res/borders/M8_6.bmp rename to LedOK/borders/M8_6.bmp diff --git a/LedOK/res/borders/M8_7.bmp b/LedOK/borders/M8_7.bmp similarity index 100% rename from LedOK/res/borders/M8_7.bmp rename to LedOK/borders/M8_7.bmp diff --git a/LedOK/res/borders/M8_8.bmp b/LedOK/borders/M8_8.bmp similarity index 100% rename from LedOK/res/borders/M8_8.bmp rename to LedOK/borders/M8_8.bmp diff --git a/LedOK/res/borders/M9_0.bmp b/LedOK/borders/M9_0.bmp similarity index 100% rename from LedOK/res/borders/M9_0.bmp rename to LedOK/borders/M9_0.bmp diff --git a/LedOK/css.css b/LedOK/css.css index e394af0..a32e348 100644 --- a/LedOK/css.css +++ b/LedOK/css.css @@ -86,6 +86,7 @@ LoColorSelector { background-color: transparent; padding: 3px 6px; max-height: 30px; + font-size: 14px; } QTreeWidget[ssType="topList"]::item { @@ -147,13 +148,13 @@ QToolButton[ss="CtrlTab"] { QToolButton[ss="MainTab"]:checked, QToolButton[ss="MainTab"]:hover { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ddd, stop: 1.0 #8cd); - font-size: 15px; + font-size: 13px; color: #04d; } QToolButton[ss="CtrlTab"]:checked, QToolButton[ss="CtrlTab"]:hover { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eee, stop: 1.0 #ade); - font-size: 15px; + font-size: 13px; color: #04d; } diff --git a/LedOK/device/ctrladvancedpanel.cpp b/LedOK/device/ctrladvancedpanel.cpp index 08be57a..2b44428 100644 --- a/LedOK/device/ctrladvancedpanel.cpp +++ b/LedOK/device/ctrladvancedpanel.cpp @@ -5,8 +5,10 @@ #include "tools.h" #include "gutil/qgui.h" #include "gutil/qnetwork.h" +#include "gutil/qjson.h" #include "program/ephoto.h" #include "upgradeapkdialog.h" +#include "deviceitem.h" #include #include #include @@ -25,7 +27,7 @@ #include "devicepanel.h" #include -CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { +CtrlAdvancedPanel::CtrlAdvancedPanel() { setFocusPolicy(Qt::StrongFocus); auto vBox = new QVBoxLayout(this); @@ -105,11 +107,6 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { return; } auto alias = fdAlias->text(); - if(alias.isEmpty()) { - QMessageBox::information(this, tr("Tip"),tr("InputAliasTip")); - fdAlias->setFocus(); - return; - } QJsonObject json; json.insert("_id", "SetCardAlias"); json.insert("_type", "SetCardAlias"); @@ -119,10 +116,25 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { Def_CtrlReqPre connect(reply, &QNetworkReply::finished, this, [=] { Def_CtrlSetReqAfter + auto item = findItem(card.id); + if(item) { + item->mCard.alias = alias; + item->setText(DeviceTable_Remark, alias); + } }); } else { foreach(auto card, gSelCards) { - Def_CtrlSetMulti(tr("SetCardAlias")) + auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + connect(reply, &QNetworkReply::finished, gFdResInfo, [=] { + QString err = checkReplyForJson(reply); + gFdResInfo->append(card.id+" "+tr("SetCardAlias")+" "+(err.isEmpty() ? QCoreApplication::translate("Def","Success") : err)); + if(! err.isEmpty()) return; + auto item = findItem(card.id); + if(item) { + item->mCard.alias = alias; + item->setText(DeviceTable_Remark, alias); + } + }); } } }); @@ -521,9 +533,103 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { } } }); - hBox->addWidget(btnClearProg); + btnGetPlayerState = new QPushButton; + btnGetPlayerState->setProperty("ssType", "progManageTool"); + connect(btnGetPlayerState, &QPushButton::clicked, this, [this] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); + return; + } + JObj json{{"_type","getPlayerState"},{"_id","getPlayerState"},{"zVer","xixun1"}}; + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("Clearing Program")+" ..."); + waitingDlg->show(); + auto card = gSelCards[0]; + auto tcp = new QTcpSocket(); + auto timer = new QTimer(tcp); + timer->setSingleShot(true); + connect(timer, &QTimer::timeout, tcp, [=] { + waitingDlg->close(); + tcp->abort(); + tcp->deleteLater(); + QMessageBox::critical(this, tr("Tip"), tr("Clear Program")+" "+tr("Timeout")); + }); + connect(waitingDlg, &WaitingDlg::rejected, tcp, [=] { + timer->stop(); + tcp->abort(); + tcp->deleteLater(); + }); + connect(tcp, &QTcpSocket::connected, tcp, [=] { + timer->stop(); + tcp->write(JToBytes(json)); + timer->start(10000); + }); + connect(tcp, &QTcpSocket::readyRead, tcp, [=] { + timer->stop(); + QByteArray resp = tcp->readAll(); + tcp->close(); + tcp->deleteLater(); + QJsonParseError parseErr; + QJsonDocument json = QJsonDocument::fromJson(resp, &parseErr); + if(parseErr.error != QJsonParseError::NoError) { + waitingDlg->close(); + QMessageBox::critical(this, tr("Tip"), parseErr.errorString()); + } else if(! json["success"].toBool()) { + waitingDlg->close(); + QMessageBox::critical(this, tr("Tip"), tr("Clear Program")+" "+tr("Failed")); + } else waitingDlg->success(); + }); + connect(tcp, &QTcpSocket::errorOccurred, tcp, [=](QAbstractSocket::SocketError err) { + timer->stop(); + tcp->close(); + tcp->deleteLater(); + waitingDlg->close(); + QMessageBox::critical(this, tr("Tip"), QString(socketErrKey(err))+" ("+QString::number(err)+") "+tcp->errorString()); + }); + tcp->connectToHost(card.ip, 3333); + timer->start(10000); + } else { + foreach(auto card, gSelCards) { + auto tcp = new QTcpSocket(); + auto timer = new QTimer(tcp); + timer->setSingleShot(true); + auto cardId = card.id; + connect(timer, &QTimer::timeout, tcp, [tcp, cardId] { + tcp->abort(); + tcp->deleteLater(); + gFdResInfo->append(cardId+" "+tr("Clear Program")+" "+tr("Timeout")); + }); + connect(tcp, &QTcpSocket::connected, tcp, [tcp, json, timer] { + timer->stop(); + tcp->write(JToBytes(json)); + timer->start(10000); + }); + connect(tcp, &QTcpSocket::readyRead, tcp, [tcp, timer, cardId] { + timer->stop(); + QByteArray resp = tcp->readAll(); + tcp->close(); + tcp->deleteLater(); + QJsonParseError parseErr; + QJsonDocument json = QJsonDocument::fromJson(resp, &parseErr); + if(parseErr.error != QJsonParseError::NoError) gFdResInfo->append(cardId+" "+tr("Clear Program")+" "+parseErr.errorString()); + else if(! json["success"].toBool()) gFdResInfo->append(cardId+" "+tr("Clear Program")+" "+tr("Failed")); + else gFdResInfo->append(cardId+" "+tr("Clear Program")+" "+tr("Success")); + }); + connect(tcp, &QTcpSocket::errorOccurred, tcp, [tcp, timer, cardId](QAbstractSocket::SocketError err) { + timer->stop(); + tcp->close(); + tcp->deleteLater(); + gFdResInfo->append(cardId+" "+tr("Clear Program")+" "+QMetaEnum::fromType().valueToKey(err)+" ("+QString::number(err)+") "+tcp->errorString()); + }); + tcp->connectToHost(card.ip, 3333); + timer->start(10000); + } + } + }); + hBox->addWidget(btnGetPlayerState); + btnGetLog = new QPushButton; btnGetLog->setProperty("ssType", "progManageTool"); connect(btnGetLog, &QPushButton::clicked, this, [this] { @@ -626,99 +732,72 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { hBox->addStretch(); - grpM80 = new QGroupBox; - hBox = new HBox(grpM80); + grpY50 = new QGroupBox; + { + auto hBox = new HBox(grpY50); - fdM80Resolu = new QComboBox; - fdM80Resolu->setMinimumWidth(160); - hBox->addWidget(fdM80Resolu); + auto fdY50Resolu = new QComboBox; + auto dirs = QDir(QApplication::applicationDirPath()+"/y50 param").entryList(QDir::Dirs | QDir::NoDotAndDotDot); + foreach(auto dir, dirs) fdY50Resolu->addItem(dir); + fdY50Resolu->setMinimumWidth(160); + hBox->addWidget(fdY50Resolu); - btnM80Set = new QPushButton(); - btnM80Set->setProperty("ssType", "progManageTool"); - connect(btnM80Set, &QPushButton::clicked, this, [this] { - if(gSelCards.isEmpty()) { - QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); - return; - } - QJsonObject json; - json.insert("_id", "SetSpecialResolution"); - json.insert("_type", "SetSpecialResolution"); - json.insert("displayResolution", fdM80Resolu->currentText()); //显示分辨率 - json.insert("totalResolution", fdM80Resolu->currentData().toString()); //显示分辨率 - if(gSelCards.count() == 1) { - auto waitingDlg = new WaitingDlg(this, tr("SetSpecialResolution")); - Def_CtrlReqPre - connect(reply, &QNetworkReply::finished, this, [=] { - Def_CtrlSetReqAfter - }); - } else { - foreach(auto card, gSelCards) { - Def_CtrlSetMulti(tr("SetSpecialResolution")) + btnY50Set = new QPushButton; + btnY50Set->setProperty("ssType", "progManageTool"); + connect(btnY50Set, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); + return; } - } - }); - hBox->addWidget(btnM80Set); + auto filePath = QApplication::applicationDirPath()+"/y50 param/"+fdY50Resolu->currentText()+"/rk_lcd_parameters"; + QFile qFile(filePath); + if(! qFile.exists()) { + QMessageBox::information(this, tr("Tip"), tr("File not exist")); + return; + } + if(! qFile.open(QIODevice::ReadOnly)) { + QMessageBox::information(this, tr("Tip"), tr("Cannot Open File")+": "+qFile.errorString()+"\n"+filePath); + return; + } + auto fileData = qFile.readAll(); + qFile.close(); - btnM80Refresh = new QPushButton(); - btnM80Refresh->setProperty("ssType", "progManageTool"); - connect(btnM80Refresh, &QPushButton::clicked, this, [this] { - if(gSelCards.isEmpty()) { - QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); - return; - } - QJsonObject json; - json.insert("_id", "GetSpecialResolution"); - json.insert("_type", "GetSpecialResolution"); - if(gSelCards.count() == 1) { - auto waitingDlg = new WaitingDlg(this, tr("GetSpecialResolution")); - Def_CtrlReqPre - connect(reply, &QNetworkReply::finished, this, [this, reply, waitingDlg] { - Def_CtrlSingleGetReply - waitingDlg->success(); - fdM80Resolu->setCurrentText(json["displayResolution"].toString()); - }); - } else { - foreach(auto card, gSelCards) { - auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); - auto cardId = card.id; - connect(reply, &QNetworkReply::finished, this, [reply, cardId] { - QJsonDocument json; - QString err = checkReplyForJson(reply, &json); - if(err.isEmpty()) err = tr("totalResolution")+"["+json["totalResolution"].toString()+"], "+tr("strCurDisplayResolution")+"["+json["displayResolution"].toString()+"]"; - gFdResInfo->append(cardId+" "+tr("GetSpecialResolution")+" "+err); + auto Boundary = "----QtLedOK_.oOo._"+QUuid::createUuid().toByteArray(QUuid::WithoutBraces); + QByteArray data; + data.append("--").append(Boundary).append("\r\nContent-Disposition: form-data; name=\"rk_lcd_parameters\"; filename=\"rk_lcd_parameters\"\r\n\r\n").append(fileData).append("\r\n"); + data.append("--").append(Boundary).append("--\r\n"); + + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("Uploading")+" ..."); + waitingDlg->show(); + NetReq req("http://"+gSelCards[0].ip+":2016/upload?type=update_display"); + auto reply = req.timeout(120000).type("multipart/form-data; boundary="+Boundary).post(data); + waitingDlg->connAbort(reply); + connect(reply, &QNetworkReply::finished, this, [=] { + QString err = checkReply(reply); + if(! err.isEmpty()) { + waitingDlg->close(); + QMessageBox::critical(this, tr("Error"), err); + return; + } + waitingDlg->success(); }); + } else { + foreach(auto card, gSelCards) { + NetReq req("http://"+card.ip+":2016/upload?type=update_display"); + auto reply = req.timeout(120000).type("multipart/form-data; boundary="+Boundary).post(data); + connect(reply, &QNetworkReply::finished, this, [=] { + QString err = checkReply(reply); + gFdResInfo->append(card.id+" "+tr("Update")+" "+(err.isEmpty()?tr("Success"):err)); + }); + } } - } - }); - hBox->addWidget(btnM80Refresh); + }); + hBox->addWidget(btnY50Set); + hBox->addStretch(); + } + vBox->addWidget(grpY50); - btnM80Restore = new QPushButton(); - btnM80Restore->setProperty("ssType", "progManageTool"); - connect(btnM80Restore, &QPushButton::clicked, this, [this] { - if(gSelCards.isEmpty()) { - QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); - return; - } - QJsonObject json; - json.insert("_id", "CleanDisplayScreenSize"); - json.insert("_type", "CleanDisplayScreenSize"); - if(gSelCards.count() == 1) { - auto waitingDlg = new WaitingDlg(this, tr("CleanDisplayScreenSize")); - Def_CtrlReqPre - connect(reply, &QNetworkReply::finished, this, [=] { - Def_CtrlSetReqAfter - }); - } else { - foreach(auto card, gSelCards) { - Def_CtrlSetMulti(tr("CleanDisplayScreenSize")) - } - } - }); - hBox->addWidget(btnM80Restore); - - hBox->addStretch(); - - vBox->addWidget(grpM80); hBox = new HBox(vBox); @@ -874,66 +953,18 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { hBox = new HBox(vBox); - btnLedSet3 = new QPushButton; - btnLedSet3->setMinimumHeight(34); - btnLedSet3->setProperty("ssType", "progManageTool"); - connect(btnLedSet3, &QPushButton::clicked, this, [=] { - QString strLedSetFile = QApplication::applicationDirPath()+"/LedSet/LedSet3.0.exe"; - QFileInfo cc22(strLedSetFile); - if(cc22.exists()) { - QProcess::startDetached(strLedSetFile,QStringList()); - return; - } - QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\sysolution\\LedSet3.0", QSettings::NativeFormat); - QString strLedsetPath = reg.value("Program_path").toString(); - if(!strLedsetPath.isEmpty()) { - QFileInfo cc(strLedsetPath); - if(cc.exists()) QProcess::startDetached(strLedsetPath,QStringList()); - else QMessageBox::critical(this, tr("Tip Info"), tr("Can not find LedSet3.0.exe")+strLedsetPath); - return; - } - QSettings reg1("HKEY_LOCAL_MACHINE\\SOFTWARE\\sysolution\\LedSet3.0", QSettings::NativeFormat); - strLedsetPath = reg1.value("Program_path").toString(); - QFileInfo cc(strLedsetPath); - if(!strLedsetPath.isEmpty()) { - if(cc.exists()) QProcess::startDetached(strLedsetPath,QStringList()); - else { - QString str1="C:/Program Files/sysolution/LedSet3.0/LedSet3.0.exe"; - QFileInfo cc1(str1); - if(cc1.exists()) QProcess::startDetached(str1,QStringList()); - else { - QString str2="C:/Program Files (x86)/sysolution/LedSet3.0/LedSet3.0.exe"; - QFileInfo cc2(str1); - if(cc2.exists()) QProcess::startDetached(str2,QStringList()); - else QMessageBox::critical(this, tr("Tip Info"), tr("Can not find LedSet3.0.exe")+strLedsetPath); - } - } - } else { - QString str1="C:/Program Files/sysolution/LedSet3.0/LedSet3.0.exe"; - QFileInfo cc1(str1); - if(cc1.exists()) QProcess::startDetached(str1,QStringList()); - else { - QString str2="C:/Program Files (x86)/sysolution/LedSet3.0/LedSet3.0.exe"; - QFileInfo cc2(str1); - if(cc2.exists())QProcess::startDetached(str2,QStringList()); - else QMessageBox::critical(this, tr("Tip Info"), tr("Can not find LedSet3.0.exe")+strLedsetPath); - } - } - }); - hBox->addWidget(btnLedSet3); - - btnLedSet4 = new QPushButton; - btnLedSet4->setMinimumHeight(34); - btnLedSet4->setProperty("ssType", "progManageTool"); - connect(btnLedSet4, &QPushButton::clicked, btnLedSet4, [] { + btnLedSet = new QPushButton; + btnLedSet->setMinimumHeight(30); + btnLedSet->setProperty("ssType", "progManageTool"); + connect(btnLedSet, &QPushButton::clicked, btnLedSet, [] { QFileInfo file("LedSet4.0/LedSet4.0.exe"); if(file.exists()) QProcess::startDetached(file.absoluteFilePath(), QStringList()); }); - hBox->addWidget(btnLedSet4); + hBox->addWidget(btnLedSet); + hBox->addStretch(); #ifndef Q_OS_WIN - btnLedSet3->setVisible(false); - btnLedSet4->setVisible(false); + btnLedSet->setVisible(false); #endif auto line = new QFrame; @@ -1432,7 +1463,7 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { if(! info.isFile()) return; if(gSelCards.count() == 1) { auto waitingDlg = new WaitingDlg(this, tr("Setting player background")+" ..."); - waitingDlg->btnAbort->hide(); + waitingDlg->setWindowFlag(Qt::WindowCloseButtonHint, 0); waitingDlg->show(); auto thread = new PlayerBackSendThread(file, gSelCards[0].ip); connect(thread, &PlayerBackSendThread::emErr, this, [=](QString err) { @@ -1556,71 +1587,101 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { line->setFrameStyle(QFrame::HLine | QFrame::Sunken); vBox->addWidget(line); - grpY50 = new QGroupBox; + + grpM80 = new QGroupBox; { - hBox = new HBox(grpY50); + auto hBox = new HBox(grpM80); - auto fdY50Resolu = new QComboBox; - auto dirs = QDir(QApplication::applicationDirPath()+"/y50 param").entryList(QDir::Dirs | QDir::NoDotAndDotDot); - foreach(auto dir, dirs) fdY50Resolu->addItem(dir); - fdY50Resolu->setMinimumWidth(160); - hBox->addWidget(fdY50Resolu); + fdM80Resolu = new QComboBox; + fdM80Resolu->setMinimumWidth(160); + hBox->addWidget(fdM80Resolu); - btnY50Set = new QPushButton; - btnY50Set->setProperty("ssType", "progManageTool"); - connect(btnY50Set, &QPushButton::clicked, this, [=] { + btnM80Set = new QPushButton(); + btnM80Set->setProperty("ssType", "progManageTool"); + connect(btnM80Set, &QPushButton::clicked, this, [this] { if(gSelCards.isEmpty()) { QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); return; } - auto filePath = QApplication::applicationDirPath()+"/y50 param/"+fdY50Resolu->currentText()+"/rk_lcd_parameters"; - QFile qFile(filePath); - if(! qFile.exists()) { - QMessageBox::information(this, tr("Tip"), tr("File not exist")); - return; - } - if(! qFile.open(QIODevice::ReadOnly)) { - QMessageBox::information(this, tr("Tip"), tr("Cannot Open File")+": "+qFile.errorString()+"\n"+filePath); - return; - } - auto fileData = qFile.readAll(); - qFile.close(); - - auto Boundary = "----QtLedOK_.oOo._"+QUuid::createUuid().toByteArray(QUuid::WithoutBraces); - QByteArray data; - data.append("--").append(Boundary).append("\r\nContent-Disposition: form-data; name=\"rk_lcd_parameters\"; filename=\"rk_lcd_parameters\"\r\n\r\n").append(fileData).append("\r\n"); - data.append("--").append(Boundary).append("--\r\n"); - + QJsonObject json; + json.insert("_id", "SetSpecialResolution"); + json.insert("_type", "SetSpecialResolution"); + json.insert("displayResolution", fdM80Resolu->currentText()); //显示分辨率 + json.insert("totalResolution", fdM80Resolu->currentData().toString()); //显示分辨率 if(gSelCards.count() == 1) { - auto waitingDlg = new WaitingDlg(this, tr("Uploading")+" ..."); - waitingDlg->show(); - NetReq req("http://"+gSelCards[0].ip+":2016/upload?type=update_display"); - auto reply = req.timeout(120000).type("multipart/form-data; boundary="+Boundary).post(data); - waitingDlg->connAbort(reply); + auto waitingDlg = new WaitingDlg(this, tr("SetSpecialResolution")); + Def_CtrlReqPre connect(reply, &QNetworkReply::finished, this, [=] { - QString err = checkReply(reply); - if(! err.isEmpty()) { - waitingDlg->close(); - QMessageBox::critical(this, tr("Error"), err); - return; - } - waitingDlg->success(); + Def_CtrlSetReqAfter }); } else { foreach(auto card, gSelCards) { - NetReq req("http://"+card.ip+":2016/upload?type=update_display"); - auto reply = req.timeout(120000).type("multipart/form-data; boundary="+Boundary).post(data); - connect(reply, &QNetworkReply::finished, this, [=] { - QString err = checkReply(reply); - gFdResInfo->append(card.id+" "+tr("Update")+" "+(err.isEmpty()?tr("Success"):err)); + Def_CtrlSetMulti(tr("SetSpecialResolution")) + } + } + }); + hBox->addWidget(btnM80Set); + + btnM80Refresh = new QPushButton(); + btnM80Refresh->setProperty("ssType", "progManageTool"); + connect(btnM80Refresh, &QPushButton::clicked, this, [this] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); + return; + } + QJsonObject json; + json.insert("_id", "GetSpecialResolution"); + json.insert("_type", "GetSpecialResolution"); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("GetSpecialResolution")); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [this, reply, waitingDlg] { + Def_CtrlSingleGetReply + waitingDlg->success(); + fdM80Resolu->setCurrentText(json["displayResolution"].toString()); + }); + } else { + foreach(auto card, gSelCards) { + auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + auto cardId = card.id; + connect(reply, &QNetworkReply::finished, this, [reply, cardId] { + QJsonDocument json; + QString err = checkReplyForJson(reply, &json); + if(err.isEmpty()) err = tr("totalResolution")+"["+json["totalResolution"].toString()+"], "+tr("strCurDisplayResolution")+"["+json["displayResolution"].toString()+"]"; + gFdResInfo->append(cardId+" "+tr("GetSpecialResolution")+" "+err); }); } } }); - hBox->addWidget(btnY50Set); + hBox->addWidget(btnM80Refresh); + + btnM80Restore = new QPushButton(); + btnM80Restore->setProperty("ssType", "progManageTool"); + connect(btnM80Restore, &QPushButton::clicked, this, [this] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); + return; + } + QJsonObject json; + json.insert("_id", "CleanDisplayScreenSize"); + json.insert("_type", "CleanDisplayScreenSize"); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("CleanDisplayScreenSize")); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + foreach(auto card, gSelCards) { + Def_CtrlSetMulti(tr("CleanDisplayScreenSize")) + } + } + }); + hBox->addWidget(btnM80Restore); hBox->addStretch(); } - vBox->addWidget(grpY50); + vBox->addWidget(grpM80); + hBox = new HBox(vBox); @@ -1636,24 +1697,24 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { hBox->addWidget(fdDeg180); auto fdDeg270 = new QRadioButton("270°"); hBox->addWidget(fdDeg270); - - hBox->addStretch(); - - auto btnGrp = new QButtonGroup; + auto btnGrp = new QButtonGroup(hBox); btnGrp->addButton(fdDeg0, 0); btnGrp->addButton(fdDeg90, 1); btnGrp->addButton(fdDeg180, 2); btnGrp->addButton(fdDeg270, 3); - connect(btnGrp, &QButtonGroup::idToggled, this, [this](int value, bool checked) { - if(! checked) return; + + btnRotateSet = new QPushButton; + btnRotateSet->setProperty("ssType", "progManageTool"); + connect(btnRotateSet, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); return; } + auto id = btnGrp->checkedId(); QJsonObject json; json.insert("_id", "SetScreenRotation"); json.insert("_type", "SetScreenRotation"); - json.insert("rotation", value); + json.insert("rotation", id); if(gSelCards.count() == 1) { auto waitingDlg = new WaitingDlg(this, tr("SetScreenRotation")); Def_CtrlReqPre @@ -1666,6 +1727,47 @@ CtrlAdvancedPanel::CtrlAdvancedPanel(QWidget *parent) : QWidget(parent) { } } }); + hBox->addWidget(btnRotateSet); + + btnRotateGet = new QPushButton; + btnRotateGet->setProperty("ssType", "progManageTool"); + connect(btnRotateGet, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, tr("Tip"), tr("NoSelectedController")); + return; + } + QJsonObject json; + json.insert("_id", "GetScreenRotation"); + json.insert("_type", "GetScreenRotation"); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("GetScreenRotation")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + waitingDlg->success(); + auto btn = btnGrp->button(json["rotation"].toInt()); + if(btn) btn->setChecked(true); + }); + } else { + foreach(auto card, gSelCards) { + auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + connect(reply, &QNetworkReply::finished, this, [=] { + QJsonDocument json; + QString err = checkReplyForJson(reply, &json); + if(err.isEmpty()) { + auto rotation = json["rotation"].toInt(); + auto btn = btnGrp->button(rotation); + err = btn ? btn->text() : QString::number(rotation); + } + gFdResInfo->append(card.id+" "+tr("GetScreenRotation")+" "+err); + }); + } + } + }); + hBox->addWidget(btnRotateGet); + + hBox->addStretch(); + hBox = new HBox(vBox); @@ -2163,15 +2265,14 @@ void CtrlAdvancedPanel::changeEvent(QEvent *event) { void CtrlAdvancedPanel::transUi() { btnBindTaxiIc->setText(tr("Binding *.ic account indentity voucher")); btnGetTopLevel->setText(tr("Readback")); - btnLedSet3->setText(tr("Start LedSet3.0 configure LED module")); - btnLedSet4->setText(tr("Start LedSet4")); + btnLedSet->setText(tr("Start LedSet4")); grpM80->setTitle("M80 "+tr("Config")); btnM80Refresh->setText(tr("Refresh")); btnM80Restore->setText(tr("Restore to default")); btnM80Set->setText(tr("Set")); - grpY50->setTitle("ST50 / M50S / M60S / M70S / Y5A "+tr("Resolution Config")); + grpY50->setTitle("M50S / M60S / M70S / M5H / ST50 / Y1G / Y1C / Y4A / Y5A "+tr("Resolution Config")); fdDisMode->setItemText(0, tr("Full screen")); fdDisMode->setItemText(1, tr("Part")); btnY50Set->setText(tr("Set")); @@ -2193,6 +2294,8 @@ void CtrlAdvancedPanel::transUi() { fdHighForBusy->setText(tr("Service:High Out of service:Low")); fdTopLevelLH->setText(tr("Service:Low Out of service:High")); lbRotate->setText(tr("Rotate")); + btnRotateSet->setText(tr("Set")); + btnRotateGet->setText(tr("Get")); grpBoxHiddenSettings->setTitle(tr("Hidden Settings")+" ("+tr("Click right button to hide")+")"); btnSysUpd->setText(tr("System Update")); diff --git a/LedOK/device/ctrladvancedpanel.h b/LedOK/device/ctrladvancedpanel.h index e75af53..dfc9a70 100644 --- a/LedOK/device/ctrladvancedpanel.h +++ b/LedOK/device/ctrladvancedpanel.h @@ -16,7 +16,7 @@ class CtrlAdvancedPanel : public QWidget { Q_OBJECT public: - explicit CtrlAdvancedPanel(QWidget *parent = nullptr); + explicit CtrlAdvancedPanel(); protected: void showEvent(QShowEvent *event) override; void init(); @@ -54,7 +54,7 @@ private: QPushButton *fdUninstall; QPushButton *btnIsRunning; QPushButton *btnRestart; - QPushButton *btnClearProg; + QPushButton *btnGetPlayerState, *btnClearProg; QPushButton *btnGetLog; QPushButton *btnSetBack, *btnPlayerBackSet, *btnPlayerBackClear; @@ -77,8 +77,7 @@ private: QRadioButton *fdTopLevelLH; QPushButton *btnHighForBusySet; QPushButton *btnGetTopLevel; - QPushButton *btnLedSet3; - QPushButton *btnLedSet4; + QPushButton *btnLedSet; QPushButton *btnBindTaxiIc; QGroupBox *grpMinMaxBrightness; @@ -93,6 +92,7 @@ private: QGroupBox *grpBoxHiddenSettings; QPushButton *btnSysUpd, *btnMcuUpd, *btnMcuGet; + QPushButton *btnRotateSet, *btnRotateGet; QLabel *lbRotate, *lbBaudCfg, *lbBaudModel, *lbUart, *lbBaud; QPushButton *btnBaudSet, *btnBaudGet; QCheckBox *fdIsOpenADB; diff --git a/LedOK/device/ctrlbrightpanel.cpp b/LedOK/device/ctrlbrightpanel.cpp index 3c76d50..d66dce2 100644 --- a/LedOK/device/ctrlbrightpanel.cpp +++ b/LedOK/device/ctrlbrightpanel.cpp @@ -15,7 +15,7 @@ #include #include "devicepanel.h" -CtrlBrightPanel::CtrlBrightPanel(QWidget *parent) : QWidget(parent) { +CtrlBrightPanel::CtrlBrightPanel() { auto vBox = new VBox(this); vBox->setContentsMargins(0,0,0,0); vBox->addSpacing(8); diff --git a/LedOK/device/ctrlbrightpanel.h b/LedOK/device/ctrlbrightpanel.h index c44a94d..0f902c5 100644 --- a/LedOK/device/ctrlbrightpanel.h +++ b/LedOK/device/ctrlbrightpanel.h @@ -10,7 +10,7 @@ class CtrlBrightPanel : public QWidget { Q_OBJECT public: - explicit CtrlBrightPanel(QWidget *parent = nullptr); + CtrlBrightPanel(); protected: void showEvent(QShowEvent *event) override; void init(); diff --git a/LedOK/device/ctrlnetworkpanel.cpp b/LedOK/device/ctrlnetworkpanel.cpp index 02d5064..bf56062 100644 --- a/LedOK/device/ctrlnetworkpanel.cpp +++ b/LedOK/device/ctrlnetworkpanel.cpp @@ -10,7 +10,7 @@ #include #include -CtrlNetworkPanel::CtrlNetworkPanel(QWidget *parent) : QWidget(parent) { +CtrlNetworkPanel::CtrlNetworkPanel() { auto vBox = new VBox(this); lbLanCfg = new QLabel; diff --git a/LedOK/device/ctrlnetworkpanel.h b/LedOK/device/ctrlnetworkpanel.h index cf754ab..712c5f2 100644 --- a/LedOK/device/ctrlnetworkpanel.h +++ b/LedOK/device/ctrlnetworkpanel.h @@ -30,7 +30,7 @@ struct ApnInfo { class CtrlNetworkPanel : public QWidget { Q_OBJECT public: - explicit CtrlNetworkPanel(QWidget *parent = nullptr); + explicit CtrlNetworkPanel(); void getCurrentAPN(QString &); protected: void showEvent(QShowEvent *event) override; diff --git a/LedOK/device/ctrlpwdpanel.cpp b/LedOK/device/ctrlpwdpanel.cpp index 570ec0e..51a128d 100644 --- a/LedOK/device/ctrlpwdpanel.cpp +++ b/LedOK/device/ctrlpwdpanel.cpp @@ -10,7 +10,7 @@ #include "deviceitem.h" #include "devicepanel.h" -CtrlPwdPanel::CtrlPwdPanel(QWidget *parent) : QWidget(parent) { +CtrlPwdPanel::CtrlPwdPanel() { auto vBox = new VBox(this); lbPwdConfig = new QLabel; lbPwdConfig->setAlignment(Qt::AlignCenter); diff --git a/LedOK/device/ctrlpwdpanel.h b/LedOK/device/ctrlpwdpanel.h index d6055b4..d93e21b 100644 --- a/LedOK/device/ctrlpwdpanel.h +++ b/LedOK/device/ctrlpwdpanel.h @@ -8,7 +8,7 @@ class CtrlPwdPanel : public QWidget { Q_OBJECT public: - explicit CtrlPwdPanel(QWidget *parent = nullptr); + explicit CtrlPwdPanel(); protected: void showEvent(QShowEvent *event) override; void init(); diff --git a/LedOK/device/ctrltestpanel.cpp b/LedOK/device/ctrltestpanel.cpp index 2939750..d365dba 100644 --- a/LedOK/device/ctrltestpanel.cpp +++ b/LedOK/device/ctrltestpanel.cpp @@ -12,7 +12,7 @@ #include #include -CtrlTestPanel::CtrlTestPanel(QWidget *parent) : QWidget(parent) { +CtrlTestPanel::CtrlTestPanel() { auto vBox = new VBox(this); labelTestScreen = new QLabel; diff --git a/LedOK/device/ctrltestpanel.h b/LedOK/device/ctrltestpanel.h index c98cf34..738d26b 100644 --- a/LedOK/device/ctrltestpanel.h +++ b/LedOK/device/ctrltestpanel.h @@ -13,7 +13,7 @@ class CtrlTestPanel : public QWidget { Q_OBJECT public: - explicit CtrlTestPanel(QWidget *parent = nullptr); + explicit CtrlTestPanel(); protected: void changeEvent(QEvent *) override; void transUi(); diff --git a/LedOK/device/ctrlverifyclockpanel.cpp b/LedOK/device/ctrlverifyclockpanel.cpp index eb0ff13..54d78df 100644 --- a/LedOK/device/ctrlverifyclockpanel.cpp +++ b/LedOK/device/ctrlverifyclockpanel.cpp @@ -9,7 +9,7 @@ #include #include "devicepanel.h" -CtrlVerifyClockPanel::CtrlVerifyClockPanel(QWidget *parent) : QWidget(parent) { +CtrlVerifyClockPanel::CtrlVerifyClockPanel() { auto vBox = new VBox(this); auto hBox = new HBox(vBox); diff --git a/LedOK/device/ctrlverifyclockpanel.h b/LedOK/device/ctrlverifyclockpanel.h index df0c2d7..1c6f581 100644 --- a/LedOK/device/ctrlverifyclockpanel.h +++ b/LedOK/device/ctrlverifyclockpanel.h @@ -12,7 +12,7 @@ class CtrlVerifyClockPanel : public QWidget { Q_OBJECT public: - explicit CtrlVerifyClockPanel(QWidget *parent = nullptr); + explicit CtrlVerifyClockPanel(); protected: void showEvent(QShowEvent *event) override; void init(); diff --git a/LedOK/device/upgradeapkdialog.cpp b/LedOK/device/upgradeapkdialog.cpp index fa0e163..80a95c1 100644 --- a/LedOK/device/upgradeapkdialog.cpp +++ b/LedOK/device/upgradeapkdialog.cpp @@ -168,6 +168,7 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { QEventLoop loop; connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); connect(reply, &QNetworkReply::downloadProgress, waitingDlg, [=](qint64 bytesReceived, qint64 bytesTotal) { + if(bytesTotal==0) return; waitingDlg->fdText->setText(tr("Downloading Online File")+" "+QString::number(bytesReceived*100/bytesTotal)+" %"); }); loop.exec(QEventLoop::ExcludeUserInputEvents); @@ -198,7 +199,7 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { NetReq req("http://"+item->mCard.ip+":2016/upload?type="+(isApk ? "software":"hardware")); auto reply = req.timeout(120000).type("multipart/form-data; boundary="+Boundary).post(data); connect(reply, &QNetworkReply::uploadProgress, item->mProgress, [item](qint64 bytesSent, qint64 bytesTotal) { - if(bytesTotal<=0) return; + if(bytesTotal==0) return; item->mProgress->setValue(bytesSent*100/bytesTotal); }); connect(reply, &QNetworkReply::finished, item->mProgress, [=] { @@ -209,7 +210,7 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { return; } item->mProgress->setValue(100); - item->setResult(tr("Installing")+" ..."); + auto info = tr("Installing")+" ..."; QJsonObject json; if(isApk) { json.insert("_id", "UpgradeSoftware"); @@ -217,9 +218,11 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { json.insert("fileName", fileName); json.insert("isCustom", true); } else { + info += tr("Don't power off during this process"); json.insert("_id", "SynchronousHardwareVersion"); json.insert("_type", "SynchronousHardwareVersion"); } + item->setResult(info); auto reply = NetReq("http://"+item->mCard.ip+":2016/settings").timeout(120000).post(json); connect(reply, &QNetworkReply::finished, item->mProgress, [=] { item->isUpdating = false; diff --git a/LedOK/device/wupgradeapkitem.cpp b/LedOK/device/wupgradeapkitem.cpp index d39d78d..b1063ae 100644 --- a/LedOK/device/wupgradeapkitem.cpp +++ b/LedOK/device/wupgradeapkitem.cpp @@ -59,11 +59,11 @@ wUpgradeApkItem::wUpgradeApkItem(LedCard pLedCard, LoQTreeWidget *parent) : QTre } waitingDlg->success(); mCard.isLocked = false; - btnUnlock->setIcon(QIcon(":/res/device/UnLock.png")); + btnUnlock->setIcon(QIcon(":/res/UnLock.png")); auto item = findItem(mCard.id); if(item) { item->mCard.isLocked = false; - item->btnUnlock->setIcon(QIcon(":/res/device/UnLock.png")); + item->btnUnlock->setIcon(QIcon(":/res/UnLock.png")); } }); }); @@ -132,12 +132,12 @@ void wUpgradeApkItem::SetItemParam(LedCard card) { setData(Upgrade_SCREEN_ID, 0, card.id); setData(Upgrade_SCREEN_IP, 0, card.ip); setData(Upgrade_REMARK_NAME, 0, card.alias); - m_ImageOnline->setPixmap(QPixmap(mCard.isOnline ? ":/res/device/O_Online.png" : ":/res/device/O_Offline.png")); + m_ImageOnline->setPixmap(QPixmap(mCard.isOnline ? ":/res/O_Online.png" : ":/res/O_Offline.png")); OnCheckSoftVersions(); OnCheckFpgaVersions(); if(! card.hasPassword) btnUnlock->hide(); else { if(! btnUnlock->isVisible()) btnUnlock->show(); - btnUnlock->setIcon(QIcon(card.isLocked ? ":/res/device/Lock.png" : ":/res/device/UnLock.png")); //如果已经验证通过密码显示绿色图标 没有验证显示蓝色锁图标 + btnUnlock->setIcon(QIcon(card.isLocked ? ":/res/Lock.png" : ":/res/UnLock.png")); //如果已经验证通过密码显示绿色图标 没有验证显示蓝色锁图标 } } diff --git a/LedOK/devicectrlpanel.cpp b/LedOK/devicectrlpanel.cpp deleted file mode 100644 index c412037..0000000 --- a/LedOK/devicectrlpanel.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include "devicectrlpanel.h" -#include "devicepanel.h" -#include "tools.h" -#include "device/ctrlbrightpanel.h" -#include "device/ctrlpowerpanel.h" -#include "device/ctrlnetworkpanel.h" -#include "device/ctrlverifyclockpanel.h" -#include "device/ctrlhdmipanel.h" -#include "device/ctrlvolumepanel.h" -#include "device/ctrlpwdpanel.h" -#include "device/ctrladvancedpanel.h" -#include "device/ctrltestpanel.h" - -QTextEdit *gFdResInfo; - -DeviceCtrlPanel::DeviceCtrlPanel(DevicePanel *parent) : QWidget(parent), mDevWgt(parent) { - auto vBox = new QVBoxLayout(this); - vBox->setContentsMargins(0,0,0,0); - vBox->setSpacing(0); - - auto hBox = new QHBoxLayout; - hBox->setSpacing(2); - - mBtnGrp = new QButtonGroup(this); - for(int i=0; isizePolicy(); - policy.setHorizontalPolicy(QSizePolicy::Preferred); - btn->setSizePolicy(policy); - btn->setIconSize(QSize(48, 48)); - btn->setCheckable(true); - btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); - btn->setProperty("ss", "CtrlTab"); - hBox->addWidget(btn); - mBtnGrp->addButton(btn, i); - } - mBtnGrp->button(Setting_Bright)->setIcon(QIcon(":/res/bnBrightnessAdjustMent_s.png")); - mBtnGrp->button(Setting_PowerControl)->setIcon(QIcon(":/res/bnPowerControl_s.png")); - mBtnGrp->button(Setting_NetCfg)->setIcon(QIcon(":/res/bnNetConfig_s.png")); - mBtnGrp->button(Setting_VerifyClock)->setIcon(QIcon(":/res/bnVerifyClock_s.png")); - mBtnGrp->button(Setting_Encrypt)->setIcon(QIcon(":/res/encrypt.png")); - mBtnGrp->button(Setting_HDMI)->setIcon(QIcon(":/res/Hdmi.png")); - mBtnGrp->button(Setting_Volume)->setIcon(QIcon(":/res/volume.png")); - mBtnGrp->button(Setting_Advanced)->setIcon(QIcon(":/res/AdvParam.png")); - mBtnGrp->button(Setting_Test)->setIcon(QIcon(":/res/test.png")); - - connect(mBtnGrp, &QButtonGroup::idToggled, this, [this](int index, bool checked) { - if(!checked || index==curIndex) return; - curIndex = index; - if(wgts[index]==0) { - if(index==Setting_Bright) wgts[index] = new CtrlBrightPanel(this); - else if(index==Setting_PowerControl) wgts[index] = new CtrlPowerPanel; - else if(index==Setting_NetCfg) wgts[index] = new CtrlNetworkPanel(this); - else if(index==Setting_VerifyClock) wgts[index] = new CtrlVerifyClockPanel(this); - else if(index==Setting_Encrypt) wgts[index] = new CtrlPwdPanel(this); - else if(index==Setting_HDMI) wgts[index] = new CtrlHdmiPanel; - else if(index==Setting_Volume) wgts[index] = new CtrlVolumePanel; - else if(index==Setting_Advanced) wgts[index] = new CtrlAdvancedPanel(this); - else if(index==Setting_Test) wgts[index] = new CtrlTestPanel(this); - } - scrollArea->takeWidget(); - scrollArea->setWidget(wgts[index]); - }); - vBox->addLayout(hBox); - - auto line = new QFrame; - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - vBox->addWidget(line); - - hBox = new QHBoxLayout(); - - scrollArea = new QScrollArea(); - scrollArea->setWidgetResizable(true); - hBox->addWidget(scrollArea); - - auto vBox2 = new QVBoxLayout(); - - fdInfo = new QTextEdit(); - gFdResInfo = fdInfo; - fdInfo->setReadOnly(true); - fdInfo->setMaximumWidth(360); - vBox2->addWidget(fdInfo); - - btnClear = new QPushButton(tr("Clear")); - btnClear->setMinimumHeight(30); - btnClear->setProperty("ssType", "progManageTool"); - connect(btnClear, &QPushButton::clicked, fdInfo, &QTextEdit::clear); - vBox2->addWidget(btnClear); - - hBox->addLayout(vBox2); - - vBox->addLayout(hBox); - - fdInfo->hide(); - btnClear->hide(); - - connect(mDevWgt, &DevicePanel::sigSelectedDeviceList, this, [this] { - if(gSelCards.count() < 2) { - if(gSelCards.count()==1) mDevWgt->fdCardNumInfo->setText(tr("Current Screen")+": "+gSelCards[0].id); - else mDevWgt->fdCardNumInfo->setText(tr("Current Screen")+": "+tr("none")); - fdInfo->hide(); - btnClear->hide(); - } else { - mDevWgt->fdCardNumInfo->setText(tr("Multi screen operation")+". "+tr("selected num")+": "+QString::number(gSelCards.count())); - fdInfo->clear(); - fdInfo->show(); - btnClear->show(); - } - }); - - transUi(); - - mBtnGrp->button(0)->setChecked(true); -} - -void DeviceCtrlPanel::changeEvent(QEvent *event) { - QWidget::changeEvent(event); - if(event->type() == QEvent::LanguageChange) transUi(); -} -void DeviceCtrlPanel::showEvent(QShowEvent *event) { - QWidget::showEvent(event); - mDevWgt->mDeviceTable->setSelectionMode(QAbstractItemView::SingleSelection); -} -void DeviceCtrlPanel::hideEvent(QHideEvent *event) { - QWidget::hideEvent(event); - mDevWgt->mDeviceTable->setSelectionMode(QAbstractItemView::NoSelection); -} -void DeviceCtrlPanel::transUi() { - mBtnGrp->button(Setting_Bright)->setText(tr("Brightness Adj.")); - mBtnGrp->button(Setting_PowerControl)->setText(tr("Power Control")); - mBtnGrp->button(Setting_NetCfg)->setText(tr("Net Config")); - mBtnGrp->button(Setting_VerifyClock)->setText(tr("Time Sync")); - mBtnGrp->button(Setting_HDMI)->setText(tr("Video source")); - mBtnGrp->button(Setting_Encrypt)->setText(tr("Password")); - mBtnGrp->button(Setting_Advanced)->setText(tr("Advanced")); - mBtnGrp->button(Setting_Volume)->setText(tr("Volume Adj.")); - mBtnGrp->button(Setting_Test)->setText(tr("Test")); - - if(gSelCards.count() < 1) mDevWgt->fdCardNumInfo->setText(tr("Current Screen")+": "+tr("none")); - else if(gSelCards.count()==1) mDevWgt->fdCardNumInfo->setText(tr("Current Screen")+": "+gSelCards[0].id); - else mDevWgt->fdCardNumInfo->setText(tr("Multi screen operation")+". "+tr("selected num")+": "+QString::number(gSelCards.count())); - btnClear->setText(tr("Clear")); -} diff --git a/LedOK/devicectrlpanel.h b/LedOK/devicectrlpanel.h deleted file mode 100644 index 59e122d..0000000 --- a/LedOK/devicectrlpanel.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef DEVICECTRLPANEL_H -#define DEVICECTRLPANEL_H - -#include "globaldefine.h" -#include -#include -#include -#include -#include - -class DevicePanel; -class DeviceCtrlPanel : public QWidget { - Q_OBJECT -public: - explicit DeviceCtrlPanel(DevicePanel *parent = nullptr); - - QTextEdit *fdInfo; -protected: - void showEvent(QShowEvent *event) override; - void hideEvent(QHideEvent *event) override; - void changeEvent(QEvent *) override; - void transUi(); -private: - DevicePanel *mDevWgt; - QButtonGroup *mBtnGrp; - - QScrollArea *scrollArea; - QPushButton *btnClear; - QWidget *wgts[Setting_End]{}; - int curIndex{-1}; -}; - - -#endif // DEVICECTRLPANEL_H diff --git a/LedOK/deviceitem.cpp b/LedOK/deviceitem.cpp index 90fa12d..710f19e 100644 --- a/LedOK/deviceitem.cpp +++ b/LedOK/deviceitem.cpp @@ -19,7 +19,7 @@ DeviceItem::DeviceItem(LoQTreeWidget *parent) : QObject(parent), QTreeWidgetItem m_bnCardDetailInfo->setStyleSheet(R"rrr( QPushButton { border-radius: 4px; - image: url(:/res/device/bnDetail.png); + image: url(:/res/bnDetail.png); } QPushButton:hover{background-color: #ccc;} )rrr"); @@ -31,7 +31,7 @@ QPushButton:hover{background-color: #ccc;} m_bnReadbackPic->setStyleSheet(R"rrr( QPushButton { border-radius: 4px; - image: url(:/res/device/deviceReadbackPic.png); + image: url(:/res/deviceReadbackPic.png); } QPushButton:hover{background-color: #ccc;} )rrr"); @@ -58,7 +58,7 @@ QPushButton:hover{background-color: #ccc;} m_parent->setItemWidget(this, DeviceTable_Screenshot, m_bnReadbackPic); m_ImageOnline = new QLabel; - m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Online.png")); + m_ImageOnline->setPixmap(QPixmap(":/res/O_Online.png")); m_ImageOnline->setAlignment(Qt::AlignCenter); m_parent->setItemWidget(this, DeviceTable_Online, m_ImageOnline); @@ -92,7 +92,7 @@ QPushButton:hover{background-color: #ccc;} } waitingDlg->success(); mCard.isLocked = false; - btnUnlock->setIcon(QIcon(":/res/device/UnLock.png")); + btnUnlock->setIcon(QIcon(":/res/UnLock.png")); }); }); auto wgt = new QWidget; @@ -101,14 +101,19 @@ QPushButton:hover{background-color: #ccc;} hBox->addWidget(btnUnlock); m_parent->setItemWidget(this, DeviceTable_Password, wgt); - for(int i=1; isetIcon(QIcon(mCard.isLocked ? ":/res/device/Lock.png" : ":/res/device/UnLock.png")); + if(mCard.hasPassword) btnUnlock->setIcon(QIcon(mCard.isLocked ? ":/res/Lock.png" : ":/res/UnLock.png")); else btnUnlock->hide(); } void DeviceItem::DeviceItemHttpPost() { @@ -191,7 +196,7 @@ void DeviceItem::DeviceItemHttpPost() { mCard.hasPassword = json["result"].toBool(); if(mCard.hasPassword) {//加过密 btnUnlock->show(); - btnUnlock->setIcon(QIcon(mCard.isLocked ? ":/res/device/Lock.png" : ":/res/device/UnLock.png")); + btnUnlock->setIcon(QIcon(mCard.isLocked ? ":/res/Lock.png" : ":/res/UnLock.png")); } else btnUnlock->hide(); }); } diff --git a/LedOK/devicepanel.cpp b/LedOK/devicepanel.cpp index c525c68..8a3f0f0 100644 --- a/LedOK/devicepanel.cpp +++ b/LedOK/devicepanel.cpp @@ -2,21 +2,27 @@ #include "globaldefine.h" #include "gutil/qgui.h" #include "gutil/qnetwork.h" -#include "base/waitingdlg.h" #include "deviceitem.h" +#include "device/ctrlbrightpanel.h" +#include "device/ctrlpowerpanel.h" +#include "device/ctrlnetworkpanel.h" +#include "device/ctrlverifyclockpanel.h" +#include "device/ctrlhdmipanel.h" +#include "device/ctrlvolumepanel.h" +#include "device/ctrlpwdpanel.h" +#include "device/ctrladvancedpanel.h" +#include "device/ctrltestpanel.h" #include -#include -#include -#include -#include #include #include #include #include -#include #include +#include DevicePanel *gDevicePanel; +QTextEdit *gFdResInfo; + void setCard(LedCard &card, const QString &addr, const QJsonDocument &json) { if(! addr.isEmpty()) card.ip = addr; else { @@ -43,7 +49,7 @@ DevicePanel::DevicePanel(QSettings &settings, QWidget *parent) : QWidget(parent) hBox->setSpacing(2); auto label = new QLabel(); - label->setPixmap({":/res/device/DeviceNum_All.png"}); + label->setPixmap({":/res/DeviceNum_All.png"}); label->setScaledContents(true); label->setFixedSize(33, 24); hBox->addWidget(label); @@ -99,7 +105,7 @@ QComboBox { } QComboBox:hover {background-color: #08b;} QComboBox::drop-down {width: 25px;} -QComboBox::down-arrow {image: url(:/res/device/FlashArrow.png);} +QComboBox::down-arrow {image: url(:/res/FlashArrow.png);} QComboBox QAbstractItemView::item { height: 28px; color: #fff; @@ -157,8 +163,7 @@ QPushButton:hover {background-color: #08b;} auto cardId = json["cardId"].toString(); int cnt = mDeviceTable->topLevelItemCount(); for(int i=0; itopLevelItem(i))->mCard.id==cardId) { - item->mCard.id = cardId; - item->mCard.isOnline = true; + item->mCard.isOnline = true; setCard(item->mCard, addr, json); item->init(); goto end; @@ -171,7 +176,6 @@ QPushButton:hover {background-color: #08b;} auto packet = (UDPPacket *)bytes.data(); int cnt = mDeviceTable->topLevelItemCount(); for(int i=0; itopLevelItem(i))->mCard.id==packet->serialCode) { - item->mCard.id = packet->serialCode; item->mCard.isOnline = true; item->mCard.ip = addr; item->init(); @@ -189,7 +193,7 @@ QPushButton:hover {background-color: #08b;} msgpre.append(tr("Android Version")).append(": ").append(item->mCard.androidVersion).append("\n"); msgpre.append(tr("FPGA Version")).append(": ").append(item->mCard.HardVersion).append("\n"); msgpre.append(tr("Firmware Version")).append(": ").append(item->mCard.FirmwareVersion).append("\n"); - msgpre.append(tr("IMEI")).append(": ").append(item->mCard.IMEI).append("\n"); + msgpre.append("IMEI: ").append(item->mCard.IMEI).append("\n"); QMessageBox msgBox(QMessageBox::Information, item->mCard.id+" "+tr("Detail Info"), msgpre + tr("Player Version")+": "+tr("Getting")+" ..."); QJsonObject json; json.insert("_id", "CheckSoftVersions"); @@ -320,13 +324,13 @@ DevicePanel::~DevicePanel() { } void DevicePanel::sendGetInfo() { - const QByteArray data = QJsonDocument(QJsonObject{{"action", "getInfo"}}).toJson(QJsonDocument::Compact); + auto data = QJsonDocument(QJsonObject{{"action", "getInfo"}}).toJson(QJsonDocument::Compact); uchar ccc[]{0x7E, 0x7E, 0x7E, 0x90, 0x42, 0x72, 0x6F, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x9F}; if(mUdpSocket.writeDatagram(data, QHostAddress("255.255.255.255"), 22222) != data.length()) qDebug() << "getInfo write to 255.255.255.255 failed"; if(mUdpSocket.writeDatagram((char *)ccc, sizeof(ccc), QHostAddress("255.255.255.255"), 31296) != sizeof(ccc)) qDebug() << "getInfo write to 255.255.255.255 failed"; - QList networkinterfaces = QNetworkInterface::allInterfaces(); - foreach(QNetworkInterface face, networkinterfaces) { + auto networkinterfaces = QNetworkInterface::allInterfaces(); + foreach(auto face, networkinterfaces) { auto flags = face.flags(); bool can = (flags & QNetworkInterface::IsRunning) && (flags & QNetworkInterface::CanBroadcast) && ! (flags & QNetworkInterface::IsLoopBack); if(! can) continue; @@ -370,4 +374,125 @@ void DevicePanel::transUi() { auto item = (DeviceItem*) mDeviceTable->topLevelItem(i); item->setData(DeviceTable_Power, 0, item->mCard.isScreenOn ? tr("On") : tr("Off")); } + transCtrl(); +} +void DevicePanel::transCtrl() { + if(mDeviceCtrlPanel) { + mBtnGrp->button(Setting_Bright)->setText(tr("Brightness Adj.")); + mBtnGrp->button(Setting_PowerControl)->setText(tr("Power Control")); + mBtnGrp->button(Setting_NetCfg)->setText(tr("Net Config")); + mBtnGrp->button(Setting_VerifyClock)->setText(tr("Time Sync")); + mBtnGrp->button(Setting_HDMI)->setText(tr("Video source")); + mBtnGrp->button(Setting_Encrypt)->setText(tr("Password")); + mBtnGrp->button(Setting_Advanced)->setText(tr("Advanced")); + mBtnGrp->button(Setting_Volume)->setText(tr("Volume Adj.")); + mBtnGrp->button(Setting_Test)->setText(tr("Test")); + + if(gSelCards.count() < 1) fdCardNumInfo->setText(tr("Current Screen")+": "+tr("none")); + else if(gSelCards.count()==1) fdCardNumInfo->setText(tr("Current Screen")+": "+gSelCards[0].id); + else fdCardNumInfo->setText(tr("Multi screen operation")+". "+tr("selected num")+": "+QString::number(gSelCards.count())); + btnClear->setText(tr("Clear")); + } +} +void DevicePanel::newCtrl() { + mHBox->addWidget(mDeviceCtrlPanel = new QWidget); + auto vBox = new QVBoxLayout(mDeviceCtrlPanel); + vBox->setContentsMargins(0,0,0,0); + vBox->setSpacing(0); + + auto hBox = new QHBoxLayout; + hBox->setSpacing(2); + + mBtnGrp = new QButtonGroup(mDeviceCtrlPanel); + for(int i=0; isizePolicy(); + policy.setHorizontalPolicy(QSizePolicy::Preferred); + btn->setSizePolicy(policy); + btn->setIconSize(QSize(48, 48)); + btn->setCheckable(true); + btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + btn->setProperty("ss", "CtrlTab"); + hBox->addWidget(btn); + mBtnGrp->addButton(btn, i); + } + mBtnGrp->button(Setting_Bright)->setIcon(QIcon(":/res/bnBrightnessAdjustMent_s.png")); + mBtnGrp->button(Setting_PowerControl)->setIcon(QIcon(":/res/bnPowerControl_s.png")); + mBtnGrp->button(Setting_NetCfg)->setIcon(QIcon(":/res/bnNetConfig_s.png")); + mBtnGrp->button(Setting_VerifyClock)->setIcon(QIcon(":/res/bnVerifyClock_s.png")); + mBtnGrp->button(Setting_Encrypt)->setIcon(QIcon(":/res/encrypt.png")); + mBtnGrp->button(Setting_HDMI)->setIcon(QIcon(":/res/Hdmi.png")); + mBtnGrp->button(Setting_Volume)->setIcon(QIcon(":/res/volume.png")); + mBtnGrp->button(Setting_Advanced)->setIcon(QIcon(":/res/AdvParam.png")); + mBtnGrp->button(Setting_Test)->setIcon(QIcon(":/res/test.png")); + + connect(mBtnGrp, &QButtonGroup::idToggled, this, [this](int index, bool checked) { + if(!checked || index==curIndex) return; + curIndex = index; + if(wgts[index]==0) { + if(index==Setting_Bright) wgts[index] = new CtrlBrightPanel; + else if(index==Setting_PowerControl) wgts[index] = new CtrlPowerPanel; + else if(index==Setting_NetCfg) wgts[index] = new CtrlNetworkPanel; + else if(index==Setting_VerifyClock) wgts[index] = new CtrlVerifyClockPanel; + else if(index==Setting_Encrypt) wgts[index] = new CtrlPwdPanel; + else if(index==Setting_HDMI) wgts[index] = new CtrlHdmiPanel; + else if(index==Setting_Volume) wgts[index] = new CtrlVolumePanel; + else if(index==Setting_Advanced) wgts[index] = new CtrlAdvancedPanel; + else if(index==Setting_Test) wgts[index] = new CtrlTestPanel; + } + scrollArea->takeWidget(); + scrollArea->setWidget(wgts[index]); + wgts[index]->setFocus(); + }); + vBox->addLayout(hBox); + + auto line = new QFrame; + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Sunken); + vBox->addWidget(line); + + hBox = new QHBoxLayout(); + + scrollArea = new QScrollArea(); + scrollArea->setWidgetResizable(true); + hBox->addWidget(scrollArea); + + auto vBox2 = new QVBoxLayout(); + + fdInfo = new QTextEdit(); + gFdResInfo = fdInfo; + fdInfo->setReadOnly(true); + fdInfo->setMaximumWidth(360); + vBox2->addWidget(fdInfo); + + btnClear = new QPushButton(tr("Clear")); + btnClear->setMinimumHeight(30); + btnClear->setProperty("ssType", "progManageTool"); + connect(btnClear, &QPushButton::clicked, fdInfo, &QTextEdit::clear); + vBox2->addWidget(btnClear); + + hBox->addLayout(vBox2); + + vBox->addLayout(hBox); + + fdInfo->hide(); + btnClear->hide(); + + connect(this, &DevicePanel::sigSelectedDeviceList, this, [this] { + if(gSelCards.count() < 2) { + if(gSelCards.count()==1) fdCardNumInfo->setText(tr("Current Screen")+": "+gSelCards[0].id); + else fdCardNumInfo->setText(tr("Current Screen")+": "+tr("none")); + fdInfo->hide(); + btnClear->hide(); + } else { + fdCardNumInfo->setText(tr("Multi screen operation")+". "+tr("selected num")+": "+QString::number(gSelCards.count())); + fdInfo->clear(); + fdInfo->show(); + btnClear->show(); + } + }); + + mBtnGrp->button(0)->setChecked(true); + + transCtrl(); } diff --git a/LedOK/devicepanel.h b/LedOK/devicepanel.h index 9d05431..2c0acb8 100644 --- a/LedOK/devicepanel.h +++ b/LedOK/devicepanel.h @@ -2,6 +2,7 @@ #define DEVICEPANEL_H #include "base/loqtreewidget.h" +#include "globaldefine.h" #include #include #include @@ -9,10 +10,10 @@ #include #include #include +#include #include #include -class DeviceCtrlPanel; class DevicePanel : public QWidget { Q_OBJECT public: @@ -20,6 +21,7 @@ public: ~DevicePanel(); void sendGetInfo(); + void newCtrl(); QLabel *fdCardNumInfo; LoQTreeWidget *mDeviceTable; @@ -28,15 +30,23 @@ public: QDialog *specifyIPDlg{0}; QTextEdit *fdIP{0}; int mainPanelIdx{0}; - DeviceCtrlPanel *mDeviceCtrlPanel{0}; + QWidget *mDeviceCtrlPanel{0}; QLabel *label_3, *nDeviceNum; QComboBox *bnSpecifyIP; QPushButton *btnRefresh; QTreeWidgetItem *m_headerItem; QHBoxLayout *mHBox{0}; + + QTextEdit *fdInfo; + QButtonGroup *mBtnGrp; + QScrollArea *scrollArea; + QPushButton *btnClear; + QWidget *wgts[Setting_End]{}; + int curIndex{-1}; protected: void changeEvent(QEvent *) override; void transUi(); + void transCtrl(); signals: void sigSelectedDeviceList(); }; diff --git a/LedOK/globaldefine.cpp b/LedOK/globaldefine.cpp index b494352..b207875 100644 --- a/LedOK/globaldefine.cpp +++ b/LedOK/globaldefine.cpp @@ -12,8 +12,9 @@ QList gSelCards; bool gVideoCompress = true; bool gVideoTranscoding = true; bool gTextAntialiasing = false; -bool gShowLoraScreen = false; bool gWidthSplit = false; +bool gHideDetect = false; +bool gShowLora = false; DeviceItem *findItem(QString id) { int cnt = gDevicePanel->mDeviceTable->topLevelItemCount(); diff --git a/LedOK/globaldefine.h b/LedOK/globaldefine.h index 1ead39e..5ff0e50 100644 --- a/LedOK/globaldefine.h +++ b/LedOK/globaldefine.h @@ -47,8 +47,9 @@ extern QList gSelCards; extern bool gVideoCompress; extern bool gVideoTranscoding; extern bool gTextAntialiasing; -extern bool gShowLoraScreen; extern bool gWidthSplit; +extern bool gHideDetect; +extern bool gShowLora; extern quint64 dirFileSize(const QString &path); extern bool copyDir(const QString &source, const QString &destination, bool override); diff --git a/LedOK/gutil/qgui.h b/LedOK/gutil/qgui.h index d7f7978..98bd097 100644 --- a/LedOK/gutil/qgui.h +++ b/LedOK/gutil/qgui.h @@ -22,6 +22,18 @@ extern const int AlignRight; +inline QWidget *parentWgt(QObject *obj) { + while(obj && ! obj->isWidgetType()) obj = obj->parent(); + return (QWidget*) obj; +} +inline QWidget *parentWin(QObject *obj) { + while(obj) { + if(obj->isWidgetType()) return ((QWidget*) obj)->window(); + obj = obj->parent(); + } + return (QWidget*) obj; +} + inline int setCurrentData(QComboBox *combo, const QVariant &data) { auto idx = combo->findData(data); if(idx>-1) combo->setCurrentIndex(idx); diff --git a/LedOK/main.cpp b/LedOK/main.cpp index 506c14d..3df2f1e 100644 --- a/LedOK/main.cpp +++ b/LedOK/main.cpp @@ -11,15 +11,15 @@ LONG WINAPI handleException(_EXCEPTION_POINTERS *excep) { auto errCode = QString::number(excep->ExceptionRecord->ExceptionCode, 16); auto errAddr = QString::number((uint)excep->ExceptionRecord->ExceptionAddress, 16); - auto hDumpFile = CreateFile(L"c:/ledok-crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + auto hDumpFile = CreateFile(L"ledok-crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hDumpFile == INVALID_HANDLE_VALUE) { - qCritical()<<"handleException hDumpFile INVALID"<<"ExceptionCode"<程序出错! (code: "+errCode+". addr: "+errAddr+")
请将C盘下的 ledok-crash.dmp 文件发送到 gangphon@qq.com 邮箱, 研发人员会尽快处理."); + QMessageBox::critical(0, "程序出错 (V" APP_VERSION" - " __DATE__", Code: "+errCode+")", "程序出错!
请将安装目录下的 ledok-crash.dmp 文件发送到 gangphon@qq.com 邮箱, 研发人员会尽快处理."); return EXCEPTION_EXECUTE_HANDLER; // EXCEPTION_EXECUTE_HANDLER 已处理异常, 让 windows 正常结束 // EXCEPTION_CONTINUE_SEARCH 未处理异常, 让 windows 弹出错误框并结束 (Qt会卡死一段时间) @@ -44,8 +44,7 @@ int main(int argc, char *argv[]) { file.close(); } QFont font; - font.setFamilies(QStringList{"Arial","Microsoft YaHei UI"}); - font.setPixelSize(14); + font.setFamilies(QStringList{"Arial","PingFang SC","Hiragino Sans GB","STHeiti","Microsoft YaHei","WenQuanYi Micro Hei","sans-serif"}); a.setFont(font); gFileHome = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); diff --git a/LedOK/mainwindow.cpp b/LedOK/mainwindow.cpp index 426d0f6..3ee0b28 100644 --- a/LedOK/mainwindow.cpp +++ b/LedOK/mainwindow.cpp @@ -1,10 +1,10 @@ #include "mainwindow.h" -#include "base/softconfigdialog.h" #include "gutil/qgui.h" #include "cfg.h" -#include "tools.h" #include "globaldefine.h" -#include "devicectrlpanel.h" +#include "deviceitem.h" +#include "devicepanel.h" +#include "gutil/qnetwork.h" #include "device/upgradeapkdialog.h" #include #include @@ -17,9 +17,8 @@ #include #include #include -#include "deviceitem.h" -#include "devicepanel.h" -#include "gutil/qnetwork.h" +#include +#include extern QPoint gPlayPos; @@ -56,7 +55,11 @@ protected: MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { setAttribute(Qt::WA_AlwaysShowToolTips); - auto menuLang = new QMenu(); + auto ft = font(); + ft.setPixelSize(14); + setFont(ft); + + auto menuLang = new QMenu; auto actCN = new QAction("中文"); actCN->setCheckable(true); @@ -92,14 +95,14 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { QSettings settings; QString langName = settings.value("Language").toString(); - QAction *actLan = nullptr; + QAction *actLan = 0; 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) { + if(actLan==0) { langName = QLocale().name(); if(langName.endsWith("TW")) actLan = actTW; else if(langName.startsWith("en")) actLan = actEn; @@ -140,7 +143,7 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { } //创建一个垂直布局 - auto vBox = new QVBoxLayout(center); + auto vBox = new VBox(center); vBox->setContentsMargins(0, 0, 0, 0); vBox->setSpacing(0); @@ -153,7 +156,7 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { pLayout->setContentsMargins(0, 0, 0, 0); pLayout->addStretch(); - bn_Setting = new QPushButton(); + bn_Setting = new QPushButton; bn_Setting->setIcon(QIcon(":/res/AppSetting.png")); bn_Setting->setToolTip(tr("Setting")); @@ -162,18 +165,78 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { pLayout->addWidget(m_wTitle->bn_Maximize); pLayout->addWidget(m_wTitle->bn_Close); - auto menu_setting = new QMenu(); - act_lang = new QAction(); + auto menu_setting = new QMenu; + act_lang = new QAction; act_lang->setMenu(menuLang); menu_setting->addAction(act_lang); - act_softconfiguration = new QAction(tr("Software Config")); - connect(act_softconfiguration, &QAction::triggered, this, [this] { - SoftConfigDialog dlg(this); + actFirmware = new QAction(tr("firmware manager")); + connect(actFirmware, &QAction::triggered, this, [this] { + UpgradeApkDialog dlg(this); dlg.exec(); - mBtnGrp->button(MainPage_LoraScreen)->setVisible(gShowLoraScreen); }); - menu_setting->addAction(act_softconfiguration); + 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("Width Split")); + fdWidthSplit->setChecked(gWidthSplit); + vBox->addWidget(fdWidthSplit); + + auto fdHideDetect = new QCheckBox(tr("Hide Detect Button")); + fdHideDetect->setChecked(gHideDetect); + vBox->addWidget(fdHideDetect); + + 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("HideDetect", gHideDetect = fdHideDetect->isChecked()); + settings.setValue("GuangYingPin", gShowLora = fdShowLora->isChecked()); + dlg.accept(); + }); + vBox->addWidget(btnBox); + + dlg.exec(); + fdDetectCard->setVisible(! gHideDetect); + mBtnGrp->button(MainPage_LoraScreen)->setVisible(gShowLora); + }); + menu_setting->addAction(actPreferences); act_update = new QAction(tr("Check for updates")); connect(act_update, &QAction::triggered, this, [this] { @@ -243,6 +306,7 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { abortSilence(reply); }); connect(reply, &QNetworkReply::downloadProgress, &msgBox, [&, reply](qint64 bytesReceived, qint64 bytesTotal) { + if(bytesTotal==0) return; msgBox.setText(tr("Downloading updates")+": "+QString::number(bytesReceived*100/bytesTotal)+"% "); qFile.write(reply->readAll()); }); @@ -290,13 +354,6 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { } }); - act_updatefirmware = new QAction(tr("firmware manager")); - connect(act_updatefirmware, &QAction::triggered, this, [this] { - UpgradeApkDialog dlg(this); - dlg.exec(); - }); - menu_setting->addAction(act_updatefirmware); - act_help = new QAction(); connect(act_help, &QAction::triggered, this, [this] { auto act = langGrp->checkedAction(); @@ -337,7 +394,7 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { label->setFont(font); vBox->addWidget(label); - label = new QLabel(APP_VERSION); + label = new QLabel("V" APP_VERSION" - " __DATE__); font = label->font(); font.setPixelSize(18); label->setFont(font); @@ -361,10 +418,8 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { //设备管理,节目管理,高级节目管理页创建 mDevicePanel = new DevicePanel(settings); - mProgPanel = new ProgPanel(settings); - m_wGuangYingPinWidget = new mGuangYingPinWidget(); - auto hBox = new QHBoxLayout(); + auto hBox = new HBox(vBox); hBox->setSpacing(2); hBox->addSpacing(144); @@ -383,12 +438,8 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { mBtnGrp->addButton(btn, i); } - vBox->addLayout(hBox); - wgts[MainPage_DeviceManager] = mDevicePanel; - wgts[MainPage_ProgManager] = mProgPanel; wgts[MainPage_Setting] = mDevicePanel; - wgts[MainPage_LoraScreen] = m_wGuangYingPinWidget; vBox->addWidget(wgts[mDevicePanel->mainPanelIdx]);//初始化响应页面为终端管理页面 @@ -397,6 +448,10 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { 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); } @@ -407,6 +462,7 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { if(mDevicePanel->mDeviceCtrlPanel) { for(int j=DeviceTable_ScreenSize;jmDeviceTable->showColumn(j); mDevicePanel->mDeviceTable->setMaximumWidth(0xffffff); + mDevicePanel->mDeviceTable->setSelectionMode(QAbstractItemView::NoSelection); mDevicePanel->mDeviceCtrlPanel->hide(); mDevicePanel->fdCardNumInfo->hide(); } @@ -414,23 +470,24 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { mDevicePanel->mDeviceTable->showColumn(0); mDevicePanel->mDeviceTable->fdIsSelAll->show(); for(int j=DeviceTable_ScreenSize; jmDeviceTable->hideColumn(j); - if(mDevicePanel->mDeviceCtrlPanel==0) mDevicePanel->mHBox->addWidget(mDevicePanel->mDeviceCtrlPanel = new DeviceCtrlPanel(mDevicePanel)); - else mDevicePanel->mDeviceCtrlPanel->show(); - mDevicePanel->fdCardNumInfo->show(); + if(mDevicePanel->mDeviceCtrlPanel) mDevicePanel->mDeviceCtrlPanel->show(); + else mDevicePanel->newCtrl(); mDevicePanel->mDeviceTable->setMaximumWidth(340); + mDevicePanel->mDeviceTable->setSelectionMode(QAbstractItemView::SingleSelection); + mDevicePanel->fdCardNumInfo->show(); } }); - hBox = new QHBoxLayout(); - m_pOneKeyCheckCard = new QPushButton; - m_pOneKeyCheckCard->setCursor(Qt::PointingHandCursor); - m_pOneKeyCheckCard->setProperty("ssType", "progManageTool"); - connect(m_pOneKeyCheckCard, &QPushButton::clicked, this, [this] { + 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 networkinterfaces = QNetworkInterface::allInterfaces(); - foreach (QNetworkInterface interfaces, networkinterfaces) {//networkinterfaces负责提供主机的IP地址和网络接口的列表 - foreach (QNetworkAddressEntry entry, interfaces.addressEntries()) {//QNetworkAddressEntry存储了一个IP地址,子网掩码和广播地址 + 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); @@ -462,20 +519,20 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { } } }); - hBox->addWidget(m_pOneKeyCheckCard); + hBox->addWidget(fdDetectCard); hBox->addStretch(); - //hBox->addWidget(new QLabel("ver: " APP_VERSION ".2")); - - vBox->addLayout(hBox); + hBox->addWidget(new QLabel("V" APP_VERSION" - " __DATE__)); gVideoCompress = settings.value("VideoCompress", true).toBool(); gVideoTranscoding = settings.value("VideoTranscoding", true).toBool(); gTextAntialiasing = settings.value("TextAntialiasing", false).toBool(); - gShowLoraScreen = settings.value("GuangYingPin", false).toBool(); gWidthSplit = settings.value("WidthSplit", false).toBool(); + gHideDetect = settings.value("HideDetect", false).toBool(); + gShowLora = settings.value("GuangYingPin", false).toBool(); - if(! gShowLoraScreen) mBtnGrp->button(MainPage_LoraScreen)->hide(); + if(gHideDetect) fdDetectCard->hide(); + if(! gShowLora) mBtnGrp->button(MainPage_LoraScreen)->hide(); if(settings.value("AddFirewallFlag").toString() !="1") { //添加exe到win防火墙例外 auto appFile = QCoreApplication::applicationFilePath(); @@ -490,12 +547,6 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { qDebug()<<"Add Firewall"<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"<attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - if(status != 200) { - qDebug()<<"status"<url(); - auto resp = reply->readAll(); - qDebug()<<"resp"<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); - }); - }); } MainWindow::~MainWindow() { @@ -576,12 +587,14 @@ MainWindow::~MainWindow() { if(! ipstr.isEmpty()) settings.setValue("SpecifyIP", ipstr); else settings.remove("SpecifyIP"); } - if(m_pTimerSendResoreIpOneKey!=nullptr) { + if(m_pTimerSendResoreIpOneKey) { if(m_pTimerSendResoreIpOneKey->isActive()) m_pTimerSendResoreIpOneKey->stop(); delete m_pTimerSendResoreIpOneKey; } - settings.setValue("ProgramListSortColumn", mProgPanel->mProgTree->sortColumn()); - settings.setValue("ProgramListSortOrder", mProgPanel->mProgTree->header()->sortIndicatorOrder()); + if(mProgPanel) { + settings.setValue("ProgramListSortColumn", mProgPanel->mProgTree->sortColumn()); + settings.setValue("ProgramListSortOrder", mProgPanel->mProgTree->header()->sortIndicatorOrder()); + } } void MainWindow::changeEvent(QEvent *event) { BaseWin::changeEvent(event); @@ -592,14 +605,14 @@ void MainWindow::transUi() { 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")); + 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")); act_about->setText(tr("About")); act_update->setText(tr("Check for updates")); - act_updatefirmware->setText(tr("firmware manager")); - act_softconfiguration->setText(tr("Software Config")); + actFirmware->setText(tr("firmware manager")); + actPreferences->setText(tr("Preferences")); bn_Setting->setToolTip(tr("Setting")); } diff --git a/LedOK/mainwindow.h b/LedOK/mainwindow.h index ab2b545..46d0bdc 100644 --- a/LedOK/mainwindow.h +++ b/LedOK/mainwindow.h @@ -27,20 +27,19 @@ private: QAction *act_lang; QAction *act_help, *actInfo; QAction *act_update; - QAction *act_updatefirmware; - QAction *act_softconfiguration; + QAction *actFirmware; + QAction *actPreferences; QAction *act_about; QPushButton *bn_Setting; QButtonGroup *mBtnGrp; - QWidget *wgts[MainPage_End]{}; - QPushButton *m_pOneKeyCheckCard; - DevicePanel *mDevicePanel; - ProgPanel *mProgPanel; - mGuangYingPinWidget *m_wGuangYingPinWidget; - QTimer *m_pTimerSendResoreIpOneKey=nullptr; + QWidget *wgts[MainPage_End]{0}; + QPushButton *fdDetectCard{0}; + DevicePanel *mDevicePanel{0}; + ProgPanel *mProgPanel{0}; + mGuangYingPinWidget *m_wGuangYingPinWidget{0}; + QTimer *m_pTimerSendResoreIpOneKey{0}; bool hasNewVer{false}; - void test(); }; struct RESTORE_IP { diff --git a/LedOK/player/playwin.cpp b/LedOK/player/playwin.cpp index 68514e4..da1ce49 100644 --- a/LedOK/player/playwin.cpp +++ b/LedOK/player/playwin.cpp @@ -253,6 +253,6 @@ void PlayWin::contextMenuEvent(QContextMenuEvent *event){ menu->exec(event->globalPos()); } void PlayWin::closeEvent(QCloseEvent *) { - if(self==this) self = nullptr; + if(self==this) self = 0; gPlayPos = pos(); } diff --git a/LedOK/progpanel.cpp b/LedOK/progpanel.cpp index 4d7ebdd..65ae585 100644 --- a/LedOK/progpanel.cpp +++ b/LedOK/progpanel.cpp @@ -13,7 +13,7 @@ #include #include -ProgPanel::ProgPanel(QSettings &settings, QWidget *parent) : QWidget(parent) { +ProgPanel::ProgPanel(QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_DeleteOnClose); setAutoFillBackground(true); QPalette pal; @@ -38,14 +38,15 @@ ProgPanel::ProgPanel(QSettings &settings, QWidget *parent) : QWidget(parent) { if(checkIfNameRepeated(dlg.fdName->text())) return; auto splitWidths = dlg.fdSplitWidths->text().split(" ", Qt::SkipEmptyParts); QList widths; int max = 0, ttl = 0; + auto width = dlg.fdWidth->value(); foreach(auto splitWidth, splitWidths) { int val = splitWidth.toInt(); if(val==0) continue; if(max < val) max = val; - ttl += val; widths.append(val); + ttl += val; + if(ttl>=width) break; } - auto width = dlg.fdWidth->value(); if(max) { while(ttl < width) { widths.append(max); @@ -178,8 +179,8 @@ ProgPanel::ProgPanel(QSettings &settings, QWidget *parent) : QWidget(parent) { 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(); + connect(btnPlay, &QPushButton::clicked, this, [this] { + if(PlayWin::self) PlayWin::self->close(); else { int cnt = mProgTree->topLevelItemCount(); for(int i=0; itopLevelItem(i)->checkState(0) == Qt::Checked) { @@ -192,7 +193,6 @@ ProgPanel::ProgPanel(QSettings &settings, QWidget *parent) : QWidget(parent) { QJsonParseError jsErr; QJsonObject prog = QJsonDocument::fromJson(value.toUtf8(), &jsErr).object(); if(jsErr.error) return; - if(PlayWin::self!=nullptr) PlayWin::self->close(); if(item->mSplitWidths.isEmpty()) PlayWin::self = PlayWin::newIns(item->mWidth, item->mHeight, dir, prog); else PlayWin::self = PlayWin::newIns(item->mMaxWidth, item->mHeight * item->mSplitWidths.size(), dir, prog); break; @@ -266,11 +266,7 @@ ProgPanel::ProgPanel(QSettings &settings, QWidget *parent) : QWidget(parent) { if(!doc_path.isEmpty()) { QString app_path = doc_path + "/" + QApplication::applicationName(); mProgsDir = app_path + "/NPrograms"; - if(!QFileInfo::exists(mProgsDir)) { - QDir app_dir(app_path); - app_dir.mkdir("NPrograms"); - app_dir.mkdir("ApkStore"); - } + if(!QFileInfo::exists(mProgsDir)) QDir(app_path).mkdir("NPrograms"); } //connect(search, SIGNAL(triggered(bool)), this, SLOT(FilterProgram())); @@ -289,6 +285,7 @@ ProgPanel::ProgPanel(QSettings &settings, QWidget *parent) : QWidget(parent) { } } } + QSettings settings; if(settings.value("ProgramListSortOrder").toInt()==0) mProgTree->sortByColumn(settings.value("ProgramListSortColumn").toInt(),Qt::SortOrder::AscendingOrder); else mProgTree->sortByColumn(settings.value("ProgramListSortColumn").toInt(),Qt::SortOrder::DescendingOrder); diff --git a/LedOK/progpanel.h b/LedOK/progpanel.h index 7e71679..fcfe738 100644 --- a/LedOK/progpanel.h +++ b/LedOK/progpanel.h @@ -11,10 +11,10 @@ class ProgPanel : public QWidget { Q_OBJECT public: - explicit ProgPanel(QSettings &settings, QWidget *parent = nullptr); + explicit ProgPanel(QWidget *parent = nullptr); - QTreeWidgetItem *m_headerItem = nullptr; - LoQTreeWidget *mProgTree = nullptr; + QTreeWidgetItem *m_headerItem{0}; + LoQTreeWidget *mProgTree{0}; protected: void changeEvent(QEvent *) override; void transUi(); diff --git a/LedOK/program/eaclock.cpp b/LedOK/program/eaclock.cpp index ec2b45a..534e092 100644 --- a/LedOK/program/eaclock.cpp +++ b/LedOK/program/eaclock.cpp @@ -370,7 +370,7 @@ QWidget* EAClock::attrWgt() { }); hBox->addWidget(fdHourMarkSize); - auto fdHourMarkColor = new LoColorSelector(tr("T"), m_attr.hourMarkColor); + auto fdHourMarkColor = new LoColorSelector("T", m_attr.hourMarkColor); fdHourMarkColor->setFixedWidth(30); connect(fdHourMarkColor, &LoColorSelector::sColorChanged, this, [this](const QColor &color) { m_attr.hourMarkColor = color; @@ -403,7 +403,7 @@ QWidget* EAClock::attrWgt() { }); hBox->addWidget(fdMinMarkSize); - auto fdMinMarkColor = new LoColorSelector(tr("T"), m_attr.minMarkColor); + auto fdMinMarkColor = new LoColorSelector("T", m_attr.minMarkColor); fdMinMarkColor->setFixedWidth(30); connect(fdMinMarkColor, &LoColorSelector::sColorChanged, this, [this](const QColor &color) { m_attr.minMarkColor = color; @@ -592,7 +592,7 @@ QWidget* EAClock::attrWgt() { }); hBox->addWidget(fdUnderline); - auto fdTextColor = new LoColorSelector(tr("T"), m_attr.textColor); + auto fdTextColor = new LoColorSelector("T", m_attr.textColor); fdTextColor->setFixedWidth(30); connect(fdTextColor, &LoColorSelector::sColorChanged, this, [this](const QColor &color) { m_attr.textColor = color; diff --git a/LedOK/program/ebase.cpp b/LedOK/program/ebase.cpp index f7b223a..b99b6a0 100644 --- a/LedOK/program/ebase.cpp +++ b/LedOK/program/ebase.cpp @@ -18,15 +18,13 @@ struct BorderImg { QVector borderImgs; int borderImgMaxWidth = 0; int borderImgMaxHeight = 0; -struct Initer{ +struct Initer { Initer() { - QDirIterator it(":res/borders/", QDirIterator::Subdirectories); - while(it.hasNext()) { + auto names = QDir("borders").entryList(QDir::Files); + foreach(auto name, names) { BorderImg bdImg; - bdImg.name = it.next(); - bdImg.img = QPixmap(bdImg.name); - int idx = bdImg.name.lastIndexOf('/'); - if(idx>-1) bdImg.name = bdImg.name.mid(idx+1); + bdImg.name = name; + bdImg.img = QPixmap("borders/"+bdImg.name); borderImgs.append(bdImg); if(bdImg.img.width() > borderImgMaxWidth) borderImgMaxWidth = bdImg.img.width(); if(bdImg.img.height() > borderImgMaxHeight) borderImgMaxHeight = bdImg.img.height(); diff --git a/LedOK/program/ephoto.cpp b/LedOK/program/ephoto.cpp index 4a6e30a..ca3331a 100644 --- a/LedOK/program/ephoto.cpp +++ b/LedOK/program/ephoto.cpp @@ -76,18 +76,6 @@ void EPhoto::loadFiles() { if(! img.isNull()) return; if(! QFileInfo::exists(mDir + "/" + mName)) return; img = QImage(mDir + "/" + mName); - if(gProgItem->mMaxWidth) { - QImage square(gProgItem->mMaxWidth, gProgItem->mHeight*gProgItem->mSplitWidths.size(), QImage::Format_ARGB32); - QPainter painter(&square); - QRectF rect(x(), y(), mWidth, mHeight); - painter.drawImage(rect, img); - auto end = gProgItem->mSplitWidths.size() - 1; - for(int i=0; imSplitWidths[i], rect.y() + gProgItem->mHeight); - painter.drawImage(rect, img); - } - square.save(mDir + "/" + mName+"-square.png", "PNG"); - } } bool EPhoto::save(const QString &pageDir) { QString newName = mName; @@ -109,7 +97,7 @@ QWidget* EPhoto::attrWgt() { auto wgtAttr = new QWidget(); auto vBox = new QVBoxLayout(wgtAttr); vBox->setContentsMargins(6, 0, 6, 0); - if(mMultiWin!=nullptr) vBox->setSpacing(3); + if(mMultiWin) vBox->setSpacing(3); addBaseAttrWgt(vBox); diff --git a/LedOK/program/evideo.cpp b/LedOK/program/evideo.cpp index 9988360..5e8402c 100644 --- a/LedOK/program/evideo.cpp +++ b/LedOK/program/evideo.cpp @@ -37,11 +37,11 @@ EVideo *EVideo::create(const QJsonObject &json, PageListItem *pageItem, EBase *m QString file = dir + "/" + name; if(QFileInfo::exists(file)) ; else if(QFileInfo::exists(file = pageItem->mPageDir + "/" + name)) dir = pageItem->mPageDir; - else return nullptr; + else return 0; int64_t dur; QImage img; QString err = videoInfo(file.toUtf8(), img, &dur, 0); - if(! err.isEmpty()) return nullptr; + if(! err.isEmpty()) return 0; auto ins = new EVideo(dir, name, widget["pathRaw"].toString(), widget["fileRaw"].toString(), img, dur/1000000, pageItem, multiWin); ins->setBaseAttr(json); auto play = json["play"]; @@ -102,10 +102,10 @@ void EVideo::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QW } QWidget* EVideo::attrWgt() { - auto wgtAttr = new QWidget(); + auto wgtAttr = new QWidget; auto vBox = new QVBoxLayout(wgtAttr); vBox->setContentsMargins(6, 0, 6, 0); - if(mMultiWin!=nullptr) vBox->setSpacing(3); + if(mMultiWin) vBox->setSpacing(3); addBaseAttrWgt(vBox); @@ -188,7 +188,7 @@ QWidget* EVideo::attrWgt() { fdFileName->setText(mRawName); playDuration = dur/1000000; fdDuration->setValue(playDuration); - QString outFile = transcoding(wgtAttr, rawFile, mRawName, mPageItem->mPageDir, mCoverImg.width(), mCoverImg.height(), codecId); + auto outFile = transcoding(wgtAttr, rawFile, mRawName, mPageItem->mPageDir, mCoverImg.width(), mCoverImg.height(), codecId); if(outFile.isEmpty()) return; QFile oldfile(mDir+"/"+mName); if(oldfile.exists()) oldfile.remove(); @@ -231,11 +231,11 @@ bool EVideo::save(const QString &pageDir) { QFile(oldFile).copy(saveFile); mDir = pageDir; if(gProgItem->mMaxWidth) { - auto waitingDlg = new WaitingDlg(parentWgt(scene()), "正在转码视频 ..."); + auto waitingDlg = new WaitingDlg(mPageItem->listWidget()->window(), "正在转码视频 ..."); auto thread = new VideoSplitThread(mWidth, mHeight, gProgItem->mMaxWidth, gProgItem->mHeight, gProgItem->mSplitWidths, pos(), saveFile.toUtf8()); connect(thread, &VideoSplitThread::emErr, this, [=](QString err) { waitingDlg->close(); - if(! err.isEmpty()) QMessageBox::critical(parentWgt(scene()), "Video trans error", err+"\n"+saveFile); + if(! err.isEmpty()) QMessageBox::critical(mPageItem->listWidget()->window(), "Video trans error", err+"\n"+saveFile); }); connect(thread, &VideoSplitThread::emProgress, this, [saveFile, waitingDlg](int progress) { waitingDlg->fdText->setText(QString("正在转码视频 %1%").arg(progress)); @@ -264,14 +264,20 @@ QJsonObject EVideo::attrJson() const { } QString EVideo::transcoding(QWidget *parent, QString rawFile, QString rawName, QString dir, int w, int h, AVCodecID codec_id) { + if(gProgItem->mMaxWidth) { + auto outFile = dir+"/"+rawName; + QFile::copy(rawFile, outFile); + return outFile; + } QSettings settings; int rawMax = qMax(w, h); if(settings.value("VideoCompress", true).toBool() && rawMax > 1360 && (w > gProgItem->mWidth || h > gProgItem->mHeight)) { - double rate = 1280.0 / rawMax; + auto rate = 1280.0 / rawMax; w *= rate; h *= rate; + qDebug()<<"Compressed Size"<mMaxWidth) { - srcFile += "-square.png"; + auto scaled = img.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + QImage square(gProgItem->mMaxWidth, gProgItem->mHeight*gProgItem->mSplitWidths.size(), QImage::Format_ARGB32); + square.fill(0); + QPainter painter(&square); + QPointF pos(x, y); + painter.drawImage(pos, scaled, QRectF(0, 0, gProgItem->mSplitWidths[0]-pos.x(), height)); + auto end = gProgItem->mSplitWidths.size(); + for(int i=1; imSplitWidths[i-1]; + pos.ry() += gProgItem->mHeight; + painter.drawImage(pos, scaled, QRectF(0, 0, gProgItem->mSplitWidths[i]-pos.x(), height)); + } + QBuffer buf; + square.save(&buf, "PNG"); + QCryptographicHash cryptoHash(QCryptographicHash::Md5); + cryptoHash.addData(buf.data()); + auto md5 = QString::fromLatin1(cryptoHash.result().toHex()); + QFile file(dstDir+"/"+md5); + if(! file.open(QFile::WriteOnly)) return source; + file.write(buf.data()); + file.close(); + source["id"] = md5; + source["md5"] = md5; + source["size"] = buf.size(); + source["name"] = srcInfo.baseName()+".png"; + source["fileExt"] = "png"; + source["mime"] = "image/png"; + } else if(img.width() > width*2 && img.height() > height*2) { + QBuffer buf; + img.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).save(&buf, "PNG"); + QCryptographicHash cryptoHash(QCryptographicHash::Md5); + cryptoHash.addData(buf.data()); + auto md5 = QString::fromLatin1(cryptoHash.result().toHex()); + QFile file(dstDir+"/"+md5); + if(! file.open(QFile::WriteOnly)) return source; + file.write(buf.data()); + file.close(); + source["id"] = md5; + source["md5"] = md5; + source["size"] = buf.size(); + source["name"] = srcInfo.baseName()+".png"; + source["fileExt"] = "png"; + source["mime"] = "image/png"; + } else { auto md5 = Tools::fileMd5(srcFile); if(md5.isEmpty()) return source; QFile::copy(srcFile, dstDir+"/"+md5); @@ -356,41 +402,9 @@ QJsonObject GenTmpThread::convertPhoto(const QJsonObject &ele){ source["md5"] = md5; source["size"] = srcInfo.size(); source["name"] = name; - source["fileExt"] = "png"; - source["mime"] = "image/png"; - } else { - QImage img(srcFile); - auto geometry = ele["geometry"]; - int width = geometry["w"].toInt(); - int height = geometry["h"].toInt(); - if(img.width() > width*2 && img.height() > height*2) { - QBuffer buf; - img.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).save(&buf, "PNG"); - QCryptographicHash cryptoHash(QCryptographicHash::Md5); - cryptoHash.addData(buf.data()); - auto md5 = QString::fromLatin1(cryptoHash.result().toHex()); - QFile file(dstDir+"/"+md5); - if(! file.open(QFile::WriteOnly)) return source; - file.write(buf.data()); - file.close(); - source["id"] = md5; - source["md5"] = md5; - source["size"] = buf.size(); - source["name"] = srcInfo.baseName()+".png"; - source["fileExt"] = "png"; - source["mime"] = "image/png"; - } else { - auto md5 = Tools::fileMd5(srcFile); - if(md5.isEmpty()) return source; - QFile::copy(srcFile, dstDir+"/"+md5); - source["id"] = md5; - source["md5"] = md5; - source["size"] = srcInfo.size(); - source["name"] = name; - QString sufLower = srcInfo.suffix().toLower(); - source["fileExt"] = sufLower; - source["mime"] = "image/"+(sufLower=="jpg" ? "jpeg" : sufLower); - } + QString sufLower = srcInfo.suffix().toLower(); + source["fileExt"] = sufLower; + source["mime"] = "image/"+(sufLower=="jpg" ? "jpeg" : sufLower); } source["_type"] = "Image"; auto play = ele["play"]; diff --git a/LedOK/program/gentmpthread.h b/LedOK/program/gentmpthread.h index b71dee2..888aa11 100644 --- a/LedOK/program/gentmpthread.h +++ b/LedOK/program/gentmpthread.h @@ -22,7 +22,6 @@ protected: QJsonObject convertWeb(const QJsonObject &json); QJsonObject convertTimer(const QJsonObject &json); signals: - void sProgress(QString, int, bool = false); void onErr(QString); private: QString prog_name, dstDir, srcPageDir; diff --git a/LedOK/program/progeditorwin.cpp b/LedOK/program/progeditorwin.cpp index 5f6d10b..9cb9a0f 100644 --- a/LedOK/program/progeditorwin.cpp +++ b/LedOK/program/progeditorwin.cpp @@ -1,5 +1,4 @@ #include "progeditorwin.h" -#include "base/customprogressindicator.h" #include "cfg.h" #include "ebase.h" #include "pagelistitem.h" @@ -207,7 +206,7 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare action = new QAction(QIcon(":/res/program/preview.png"), tr("Play")+"/"+tr("Stop")); connect(action, &QAction::triggered, this, [this] { - if(PlayWin::self!=nullptr) PlayWin::self->close(); + if(PlayWin::self) PlayWin::self->close(); else { if(isProgChanged()) onSave(); auto waitingDlg = new WaitingDlg(this, tr("Generate preview data")+" ..."); @@ -216,7 +215,6 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare QMessageBox::warning(this, "GenTmpThread Error", err); }); connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::close); - connect(gen, &GenTmpThread::sProgress, waitingDlg->mIndicator, &CustomProgressIndicator::onProgress); gen->start(); waitingDlg->exec(); QFile file(mProgItem->mProgDir+"_tmp/program"); @@ -244,7 +242,6 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare QMessageBox::warning(this, "GenTmpThread Error", err); }); connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::close); - connect(gen, &GenTmpThread::sProgress, waitingDlg->mIndicator, &CustomProgressIndicator::onProgress); gen->start(); waitingDlg->exec(); SendProgramDialog dlg(mProgItem->mName, this); @@ -447,7 +444,7 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare vBoxPage->addWidget(toolBar); - listPage = new QListWidget(); + listPage = new QListWidget; listPage->setMaximumWidth(190); connect(listPage, &QListWidget::currentItemChanged, this, [=](QListWidgetItem *current, QListWidgetItem *previous) { auto curItem = static_cast(current); @@ -617,14 +614,14 @@ bool ProgEditorWin::save() { void ProgEditorWin::onSave() { auto waitingDlg = new WaitingDlg(this, tr("Saving..."), tr("Success")); - waitingDlg->btnAbort->hide(); + waitingDlg->setWindowFlag(Qt::WindowCloseButtonHint, 0); waitingDlg->show(); if(save()) waitingDlg->success(); else waitingDlg->close(); waitingDlg->exec(); - this->mProgItem->m_last = QDateTime::currentDateTime(); - this->mProgItem->m_fsize = dirFileSize(this->mProgItem->mProgDir); - this->mProgItem->onSetProgram(); + mProgItem->m_last = QDateTime::currentDateTime(); + mProgItem->m_fsize = dirFileSize(mProgItem->mProgDir); + mProgItem->onSetProgram(); } void ProgEditorWin::UdpSendJson(QJsonObject json) { diff --git a/LedOK/program/progitem.cpp b/LedOK/program/progitem.cpp index 266a2ff..d6bf75c 100644 --- a/LedOK/program/progitem.cpp +++ b/LedOK/program/progitem.cpp @@ -40,6 +40,10 @@ ProgItem::ProgItem(const QString &progsDir, const QJsonObject &json, LoQTreeWidg } void ProgItem::init() { + auto ft = font(0); + ft.setPixelSize(14); + for(int i=1; iinsertTopLevelItem(0,this); m_bnName = new QPushButton(mName); + m_bnName->setFont(ft); m_bnName->setStyleSheet(R"delimiter( QPushButton{border-radius: 4px;} QPushButton:hover { @@ -115,7 +120,6 @@ QPushButton:hover{background-color: #cccccc;} QMessageBox::warning(&dlg, "GenTmpThread Error", err); }); QObject::connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::success); - QObject::connect(gen, &GenTmpThread::sProgress, waitingDlg->mIndicator, &CustomProgressIndicator::onProgress); gen->start(); waitingDlg->exec(); } @@ -154,7 +158,6 @@ QPushButton:hover{background-color: #cccccc;} QMessageBox::warning(mTree, "GenTmpThread Error", err); }); QObject::connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::close); - QObject::connect(gen, &GenTmpThread::sProgress, waitingDlg->mIndicator, &CustomProgressIndicator::onProgress); gen->start(); waitingDlg->exec(); SendProgramDialog dlg(mName, mTree); diff --git a/LedOK/program/videosplitthread.cpp b/LedOK/program/videosplitthread.cpp index c15b591..123106c 100644 --- a/LedOK/program/videosplitthread.cpp +++ b/LedOK/program/videosplitthread.cpp @@ -122,7 +122,6 @@ void VideoSplitThread::run() { uint8_t *out_img_data[4]{new uchar[out_img_linesize[0] * outPar->height]}; QImage out_img(out_img_data[0], outPar->width, outPar->height, out_img_linesize[0], QImage::Format_ARGB32, imgCleanupHandler, out_img_data[0]); QPainter painter(&out_img); - auto end = mWidths.size() - 1; while(1) { if((ret = av_read_frame(in_fmt, packet)) < 0) { if(ret!=AVERROR_EOF) { @@ -151,11 +150,11 @@ void VideoSplitThread::run() { } else { sws_scale(sws_ctx, frm->data, frm->linesize, 0, de_ctx->height, img_data, img_linesize); auto apos = pos; - painter.drawImage(apos, img, QRectF(0, 0, mWidths[0]-apos.rx(), img.height())); - for(int i=0; ipts; auto dur = frm->pkt_duration; diff --git a/LedOK/program/wprogrampublishitem.cpp b/LedOK/program/wprogrampublishitem.cpp index 78f99f7..ada4dab 100644 --- a/LedOK/program/wprogrampublishitem.cpp +++ b/LedOK/program/wprogrampublishitem.cpp @@ -41,7 +41,7 @@ wProgramPublishItem::wProgramPublishItem(LedCard pLedCard, LoQTreeWidget *parent auto pwd = QInputDialog::getText(treeWidget(), tr("Input password"), tr("Input password"), QLineEdit::Password, QString(), &ok); if(! ok) return; QJsonObject json; - json.insert("_type", "VerifyPassword"); + json.insert("_id", "VerifyPassword"); json.insert("_type", "VerifyPassword"); json.insert("pwd", pwd); auto waitingDlg = new WaitingDlg(treeWidget(), tr("VerifyPassword")+" ..."); @@ -63,11 +63,11 @@ wProgramPublishItem::wProgramPublishItem(LedCard pLedCard, LoQTreeWidget *parent } waitingDlg->success(); mLedCard.isLocked = false; - btnUnlock->setIcon(QIcon(":/res/device/UnLock.png")); + btnUnlock->setIcon(QIcon(":/res/UnLock.png")); auto item = findItem(mLedCard.id); if(item) { item->mCard.isLocked = false; - item->btnUnlock->setIcon(QIcon(":/res/device/UnLock.png")); + item->btnUnlock->setIcon(QIcon(":/res/UnLock.png")); } }); }); @@ -80,10 +80,10 @@ void wProgramPublishItem::SetItemParam(LedCard card) { setData(ENUM_DEVICE_PUBLISH_HEADE_REMARK_NAME, 0, card.alias); setData(ENUM_DEVICE_PUBLISH_HEADE_SCREEN_IP, 0, card.ip); setData(ENUM_DEVICE_PUBLISH_HEADE_SCREEN_SIZE, 0, QString("%1 x %2").arg(card.mWidth).arg(card.mHeight)); - m_ImageOnline->setPixmap(QPixmap(mLedCard.isOnline ? ":/res/device/O_Online.png" : ":/res/device/O_Offline.png")); + m_ImageOnline->setPixmap(QPixmap(mLedCard.isOnline ? ":/res/O_Online.png" : ":/res/O_Offline.png")); if(! card.hasPassword) btnUnlock->hide(); else { if(! btnUnlock->isVisible()) btnUnlock->show(); - btnUnlock->setIcon(QIcon(card.isLocked ? ":/res/device/Lock.png" : ":/res/device/UnLock.png")); //如果已经验证通过密码显示绿色图标 没有验证显示蓝色锁图标 + btnUnlock->setIcon(QIcon(card.isLocked ? ":/res/Lock.png" : ":/res/UnLock.png")); //如果已经验证通过密码显示绿色图标 没有验证显示蓝色锁图标 } } diff --git a/LedOK/res.qrc b/LedOK/res.qrc index 88e6d95..86b07fe 100644 --- a/LedOK/res.qrc +++ b/LedOK/res.qrc @@ -14,20 +14,14 @@ res/ArrowDropUp.png res/CheckBoxChecked.png res/CheckBoxUnchecked.png - res/device/Add.png - res/device/DeviceNum_All.png - res/device/DeviceNum_Offline.png - res/device/DeviceNum_Online.png - res/device/DeviceNum_Unlogin.png - res/device/Equal.png - res/device/FlashArrow.png - res/device/Lock.png - res/device/O_Offline.png - res/device/O_Online.png - res/device/O_Unlogin.png - res/device/UnLock.png - res/device/bnDetail.png - res/device/deviceReadbackPic.png + res/DeviceNum_All.png + res/FlashArrow.png + res/Lock.png + res/O_Offline.png + res/O_Online.png + res/UnLock.png + res/bnDetail.png + res/deviceReadbackPic.png res/DeviceManager_s.png res/DeviceManager_u.png res/DeviceSetting_s.png @@ -37,7 +31,6 @@ res/Hdmi.png res/Logo.ico res/Logo.png - res/Lora.png res/program/AClock.png res/program/Add.png res/program/AddPlan.png @@ -101,101 +94,23 @@ res/program/bnSend_u.png res/ProgramManager_s.png res/ProgramManager_u.png - res/Warning.png res/WndClose.png res/WndMaximize.png res/WndMinimize.png - res/apk.png res/bnBrightnessAdjustMent_s.png res/bnNetConfig_s.png res/bnPowerControl_s.png res/bnVerifyClock_s.png - res/borders/M1_0.bmp - res/borders/M1_1.bmp - res/borders/M1_2.bmp - res/borders/M1_3.bmp - res/borders/M1_4.bmp - res/borders/M1_5.bmp - res/borders/M1_6.bmp - res/borders/M1_7.bmp - res/borders/M1_8.bmp - res/borders/M2_0.bmp - res/borders/M2_1.bmp - res/borders/M2_2.bmp - res/borders/M2_3.bmp - res/borders/M2_5.bmp - res/borders/M2_6.bmp - res/borders/M2_7.bmp - res/borders/M2_8.bmp - res/borders/M3_0.bmp - res/borders/M3_1.bmp - res/borders/M3_2.bmp - res/borders/M3_3.bmp - res/borders/M3_4.bmp - res/borders/M3_5.bmp - res/borders/M3_6.bmp - res/borders/M3_7.bmp - res/borders/M3_8.bmp - res/borders/M4_0.bmp - res/borders/M4_1.bmp - res/borders/M4_2.bmp - res/borders/M4_3.bmp - res/borders/M4_4.bmp - res/borders/M4_5.bmp - res/borders/M4_6.bmp - res/borders/M4_7.bmp - res/borders/M4_8.bmp - res/borders/M5_0.bmp - res/borders/M5_1.bmp - res/borders/M5_2.bmp - res/borders/M5_3.bmp - res/borders/M5_4.bmp - res/borders/M5_5.bmp - res/borders/M5_6.bmp - res/borders/M5_7.bmp - res/borders/M5_8.bmp - res/borders/M6_0.bmp - res/borders/M6_1.bmp - res/borders/M6_2.bmp - res/borders/M6_3.bmp - res/borders/M6_4.bmp - res/borders/M6_5.bmp - res/borders/M6_6.bmp - res/borders/M6_7.bmp - res/borders/M6_8.bmp - res/borders/M6_9.bmp - res/borders/M7_0.bmp - res/borders/M7_1.bmp - res/borders/M7_2.bmp - res/borders/M7_3.bmp - res/borders/M7_4.bmp - res/borders/M7_5.bmp - res/borders/M7_6.bmp - res/borders/M7_7.bmp - res/borders/M7_8.bmp - res/borders/M8_0.bmp - res/borders/M8_1.bmp - res/borders/M8_2.bmp - res/borders/M8_3.bmp - res/borders/M8_4.bmp - res/borders/M8_5.bmp - res/borders/M8_6.bmp - res/borders/M8_7.bmp - res/borders/M8_8.bmp - res/borders/M9_0.bmp res/encrypt.png res/groupbox-checked.png res/groupbox-unchecked.png - res/ledset.png res/loop.png res/next.png res/previous.png res/random.png res/reddot.png res/splash.png - res/success.png res/test.png - res/tip.png res/video-pre.png res/volume.png diff --git a/LedOK/res/AppSetting.png b/LedOK/res/AppSetting.png index 72a5123..92277e8 100644 Binary files a/LedOK/res/AppSetting.png and b/LedOK/res/AppSetting.png differ diff --git a/LedOK/res/AppSettingTip.png b/LedOK/res/AppSettingTip.png index f791c3a..9da9d4d 100644 Binary files a/LedOK/res/AppSettingTip.png and b/LedOK/res/AppSettingTip.png differ diff --git a/LedOK/res/device/DeviceNum_All.png b/LedOK/res/DeviceNum_All.png similarity index 100% rename from LedOK/res/device/DeviceNum_All.png rename to LedOK/res/DeviceNum_All.png diff --git a/LedOK/res/device/FlashArrow.png b/LedOK/res/FlashArrow.png similarity index 100% rename from LedOK/res/device/FlashArrow.png rename to LedOK/res/FlashArrow.png diff --git a/LedOK/res/device/Lock.png b/LedOK/res/Lock.png similarity index 100% rename from LedOK/res/device/Lock.png rename to LedOK/res/Lock.png diff --git a/LedOK/res/Logo.icns b/LedOK/res/Logo.icns deleted file mode 100644 index 11d47e0..0000000 Binary files a/LedOK/res/Logo.icns and /dev/null differ diff --git a/LedOK/res/Lora.png b/LedOK/res/Lora.png deleted file mode 100644 index 387dc85..0000000 Binary files a/LedOK/res/Lora.png and /dev/null differ diff --git a/LedOK/res/device/O_Offline.png b/LedOK/res/O_Offline.png similarity index 100% rename from LedOK/res/device/O_Offline.png rename to LedOK/res/O_Offline.png diff --git a/LedOK/res/device/O_Online.png b/LedOK/res/O_Online.png similarity index 100% rename from LedOK/res/device/O_Online.png rename to LedOK/res/O_Online.png diff --git a/LedOK/res/device/UnLock.png b/LedOK/res/UnLock.png similarity index 100% rename from LedOK/res/device/UnLock.png rename to LedOK/res/UnLock.png diff --git a/LedOK/res/Warning.png b/LedOK/res/Warning.png deleted file mode 100644 index 10788d9..0000000 Binary files a/LedOK/res/Warning.png and /dev/null differ diff --git a/LedOK/res/apk.png b/LedOK/res/apk.png deleted file mode 100644 index 930e814..0000000 Binary files a/LedOK/res/apk.png and /dev/null differ diff --git a/LedOK/res/backup/AdvanceManager_s.png b/LedOK/res/backup/AdvanceManager_s.png deleted file mode 100644 index ef3804f..0000000 Binary files a/LedOK/res/backup/AdvanceManager_s.png and /dev/null differ diff --git a/LedOK/res/backup/AdvanceManager_u.png b/LedOK/res/backup/AdvanceManager_u.png deleted file mode 100644 index 22adcb7..0000000 Binary files a/LedOK/res/backup/AdvanceManager_u.png and /dev/null differ diff --git a/LedOK/res/backup/Checked11.png b/LedOK/res/backup/Checked11.png deleted file mode 100644 index 733251d..0000000 Binary files a/LedOK/res/backup/Checked11.png and /dev/null differ diff --git a/LedOK/res/backup/DeviceManager_s.png b/LedOK/res/backup/DeviceManager_s.png deleted file mode 100644 index 1105e19..0000000 Binary files a/LedOK/res/backup/DeviceManager_s.png and /dev/null differ diff --git a/LedOK/res/backup/DeviceManager_u.png b/LedOK/res/backup/DeviceManager_u.png deleted file mode 100644 index 54311da..0000000 Binary files a/LedOK/res/backup/DeviceManager_u.png and /dev/null differ diff --git a/LedOK/res/backup/DeviceSetting_s.png b/LedOK/res/backup/DeviceSetting_s.png deleted file mode 100644 index c5d8b0e..0000000 Binary files a/LedOK/res/backup/DeviceSetting_s.png and /dev/null differ diff --git a/LedOK/res/backup/DeviceSetting_u.png b/LedOK/res/backup/DeviceSetting_u.png deleted file mode 100644 index 0f9cbbd..0000000 Binary files a/LedOK/res/backup/DeviceSetting_u.png and /dev/null differ diff --git a/LedOK/res/backup/ProgramManager_s.png b/LedOK/res/backup/ProgramManager_s.png deleted file mode 100644 index 2a4600e..0000000 Binary files a/LedOK/res/backup/ProgramManager_s.png and /dev/null differ diff --git a/LedOK/res/backup/ProgramManager_u.png b/LedOK/res/backup/ProgramManager_u.png deleted file mode 100644 index 1e6912f..0000000 Binary files a/LedOK/res/backup/ProgramManager_u.png and /dev/null differ diff --git a/LedOK/res/backup/Warning.png b/LedOK/res/backup/Warning.png deleted file mode 100644 index 2db6e38..0000000 Binary files a/LedOK/res/backup/Warning.png and /dev/null differ diff --git a/LedOK/res/device/bnDetail.png b/LedOK/res/bnDetail.png similarity index 100% rename from LedOK/res/device/bnDetail.png rename to LedOK/res/bnDetail.png diff --git a/LedOK/res/device/Add.png b/LedOK/res/device/Add.png deleted file mode 100644 index 403eb56..0000000 Binary files a/LedOK/res/device/Add.png and /dev/null differ diff --git a/LedOK/res/device/DeviceNum_Offline.png b/LedOK/res/device/DeviceNum_Offline.png deleted file mode 100644 index 868a891..0000000 Binary files a/LedOK/res/device/DeviceNum_Offline.png and /dev/null differ diff --git a/LedOK/res/device/DeviceNum_Online.png b/LedOK/res/device/DeviceNum_Online.png deleted file mode 100644 index d122904..0000000 Binary files a/LedOK/res/device/DeviceNum_Online.png and /dev/null differ diff --git a/LedOK/res/device/DeviceNum_Unlogin.png b/LedOK/res/device/DeviceNum_Unlogin.png deleted file mode 100644 index 2b0f0ac..0000000 Binary files a/LedOK/res/device/DeviceNum_Unlogin.png and /dev/null differ diff --git a/LedOK/res/device/Equal.png b/LedOK/res/device/Equal.png deleted file mode 100644 index 14ac320..0000000 Binary files a/LedOK/res/device/Equal.png and /dev/null differ diff --git a/LedOK/res/device/O_Unlogin.png b/LedOK/res/device/O_Unlogin.png deleted file mode 100644 index 8f04097..0000000 Binary files a/LedOK/res/device/O_Unlogin.png and /dev/null differ diff --git a/LedOK/res/device/deviceReadbackPic.png b/LedOK/res/deviceReadbackPic.png similarity index 100% rename from LedOK/res/device/deviceReadbackPic.png rename to LedOK/res/deviceReadbackPic.png diff --git a/LedOK/res/ledset.png b/LedOK/res/ledset.png deleted file mode 100644 index 6fa5db4..0000000 Binary files a/LedOK/res/ledset.png and /dev/null differ diff --git a/LedOK/res/success - 副本.png b/LedOK/res/success - 副本.png deleted file mode 100644 index f42baf4..0000000 Binary files a/LedOK/res/success - 副本.png and /dev/null differ diff --git a/LedOK/res/success.png b/LedOK/res/success.png deleted file mode 100644 index 9e2e3f8..0000000 Binary files a/LedOK/res/success.png and /dev/null differ diff --git a/LedOK/res/tip.png b/LedOK/res/tip.png deleted file mode 100644 index 40b3cd8..0000000 Binary files a/LedOK/res/tip.png and /dev/null differ diff --git a/LedOK/tools.h b/LedOK/tools.h index 164a458..c7522d8 100644 --- a/LedOK/tools.h +++ b/LedOK/tools.h @@ -18,11 +18,6 @@ extern QString gFileHome; extern ProgItem *gProgItem; extern QString css; -inline QWidget *parentWgt(QObject *obj) { - while(obj && ! obj->isWidgetType()) obj = obj->parent(); - return (QWidget*) obj; -} - class Tools : public QObject { Q_OBJECT public: diff --git a/LedOK/translations/app_en.ts b/LedOK/translations/app_en.ts index 6c95bbe..4ca752a 100644 --- a/LedOK/translations/app_en.ts +++ b/LedOK/translations/app_en.ts @@ -56,986 +56,975 @@ CtrlAdvancedPanel - + Advanced Advanced - + Screen Width(pixel) Screen Width(pixel) - + Width Width - - + + Height Height - - - - - + + + - - - - + + + + + - - - - + + + + + + Set Set - + Alias Alias - + Web Server Address: Web Server Address: - + www.m2mled.net - + www.ledaips.com - + https://www.taxihub.cn:2340 - + https://www.ledaips.com:2340 - + https://www.36taxi.com:2340 - + www.tlzxled.com - + MCU Uploading - + Traffic screen settings - + Setting protocol ... - + Set protocol - + Getting protocol ... - + Get protocol - - + + Port - + Realtimer Server Address: Realtimer Server Address: - + Firmware Management - + update or uninstall - + Clear Clear - + Check Apk Check Apk - + Uninstall Uninstall - + Running check Running check - + Restart Restart - + Check Log Check Log - + Start LedSet4 Start LedSet4.0 (Apk Display2.0 and higher) - + Open ADB Open ADB debugging function - + Post Custom JSON Post Custom JSON - - - - - - - - + + + + + + + + Clear Program Clear Program - + www.ledokcloud.com/realtime - + Config Config - + Refresh Refresh - + Restore to default Restore to default - + Taxi top screen configuration Taxi top screen configuration - - + + Service:High Out of service:Low Service:High Out of service:Low - - + + Service:Low Out of service:High Service:Low Out of service:High - - Start LedSet3.0 configure LED module - Start LedSet3.0 configure LED module (used by manufacturer's professionals) - - - + Binding *.ic account indentity voucher Binding *.ic account indentity voucher - + Rotate Rotate - + Min brightness Min brightness - - - + + + Readback Readback - + Send Send - + Max brightness Max brightness - - + + SetScreenSize Set Screen Size - - - - - + + + + + Success Success - + Compant ID: Company ID - + Compant ID Company ID - + InputWebServerAddressTip Please enter web server address - + InputCompanyIdTip Please enter company ID - + Do you want to modify webserveraddress and companyId? Are you sure you want to configure the server address and company ID? - - + + SetOnlineAddr Set Web server address - - + + ClearRealtimeServer Clear - - + + SetRealtimeServer Set realtimer address - - - - + Tip Info Tip Info - - - - Can not find LedSet3.0.exe - - - - - + + RestartAndroid Restart - - + + running running - - + + no running no running - + Check Apk Version Check Apk Version - - + + UninstallSoftware Uninstall - - + + Check apk running status - - + + OpenAdb Open ADB debugging function - + indentity voucher (*.ic) indentity voucher (*.ic) - - - - - + + + + + InvokeTaxiAppFunction Binding certificate - - + + AliIotSetting - + Software Version Info - + Package - + Version - - + + Package name is null - + Clearing Program - - - - + + + + Timeout Timeout - - - - + + + + Failed - + Getting Log - - - - - - - - - - - + + + + + + + + + + + Error Error - + Setting Timing Reboot - + Set Timing Reboot - + Getting Timing Reboot - + Get Timing Reboot - + totalResolution FPGA total resoltuion - + strCurDisplayResolution Cur display resolution - - + + File not exist - - + + Cannot Open File - + Uploading - + Update Update - - + + Set Display Mode - - + + Get Display Mode - - + + Set Screen Offset - - + + Get Screen Offset - + Open file Failed Open file Failed - + Setting Wallpaper - - + + Set Wallpaper - + System Updating - - + + System Update - + Getting MCU Version - - + + MCU Version - + Select File Select File - + Setting player background - - + + Set player background - + Clearing player background - - - - - - - - + + + + + + + + Clear player background - + + + GetScreenRotation + Get Screen Rotation + + + Setting Baud Rate - + Set Baud Rate - + Getting Baud Rate - + Get Baud Rate - + Text is empty - + Json Parse Error - + Json isn't an Object - + Setting card work mode ... - + Set card work mode - + Getting card work mode ... - + Get card work mode - + Input password Input password - + Change Password Change Password - + Resolution Config - + Full screen - + Part - + Display Mode - + Screen Position - + Offset - + Hidden Settings - + Click right button to hide - - + + Update MCU - + Get MCU Version - + Baud Config - + Model - + Uart - + Baud - - - - - - + + + + + + + Get - + Timing Reboot - + Protocol - + Server - + Client - - + + SetScreenRotation Set screen rotation - - + + SetMinBrightness Set min brightness value - - + + SetMaxBrightness Set maximum brightness value - - + + GetMinBrightness Get min brightness - - + + GetMaxBrightness Get maximum brightness - - + + Card work mode - - + + SetSpecialResolution Set Special Resolution - - + + GetSpecialResolution Get Special Resolution - - + + CleanDisplayScreenSize Restore to default relolution - - + + SetHighForBusy Set level for busy - - + + GetStateForBusy Get level of busy - - InputAliasTip - Please input alias - - - - + + SetCardAlias Set alias - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + Tip Tip - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NoSelectedController Please select screen first - + InputWidthTip Please enter the correct width pixel value - + InputHeightTip Please enter the correct height pixel value - + Password is error Password is error @@ -2534,8 +2523,8 @@ - - + + Anycast Anycast @@ -2551,8 +2540,8 @@ - - + + Tip Tip @@ -2588,34 +2577,34 @@ loopback mode - + Connect timeout Connect timeout - - + + receive Receive - + Connect Connect - + timeout timeout - + Reset loop mode Reset loop mode - - + + success success @@ -3086,113 +3075,33 @@ Def - - Connection Timeout - - - - + + + + - - - + + + Device replied - + + - + Success Success - + + Fail Fail - - DeviceCtrlPanel - - - - - - Current Screen - Current screen - - - - - none - none - - - - - Clear - Clear - - - - - Multi screen operation - Multi screen operation - - - - - selected num - Selected number - - - - Brightness Adj. - Brightness Adj. - - - - Power Control - Power Control - - - - Net Config - Network Config - - - - Time Sync - Time Sync - - - - Video source - Video Source - - - - Password - Password - - - - Advanced - Advanced - - - - Test - Test - - - - Volume Adj. - Volume - - DeviceItem @@ -3237,12 +3146,12 @@ password is wrong - + On ON - + Off OFF @@ -3250,167 +3159,239 @@ DevicePanel - - + + All ALL ALL - + Online Online Online - - + + Refresh Refresh Refresh - - - + + + Specify IP Specify IP Specify IP - + + + + + Current Screen Current screen - + + + none none - - CheckSoftVersions - Get Soft Versions - - - + Current Brightness - + Android Version - + FPGA Version FPGA Version - + Brightness Level Brightness Level - + Android OS Resolution Android OS Resolution - + Firmware Version Firmware Version - + + + + Player Version - + Detail Info Detail Info - + + Getting + + + + Specify IP list - + Search Search - - + + Attention Attention - - + + Please input IP address! Please input IP address! - + Cancel Cancel - + Screen ID Screen ID - + Screen IP Screen IP - + Screen Size Screen Size - + Remark Name Alias - + readback pic Screenshot - + On ON - + Off OFF - + + Brightness Adj. + Brightness Adj. + + + + Power Control + Power Control + + + + Net Config + Network Config + + + + Time Sync + Time Sync + + + + Video source + Video Source + + + + Password + Password + + + + Advanced + Advanced + + + + Volume Adj. + Volume + + + + Test + Test + + + + + Multi screen operation + Multi screen operation + + + + + selected num + Selected number + + + + + Clear + Clear + + + More Info More Info - + Screen Brightness Screen Brightness - + Power Status Power Status - + Security encryption @@ -3464,13 +3445,6 @@ Number Number - - - - - T - - Min Mark @@ -3535,73 +3509,73 @@ EBase - + Area Area(px) - + X X - + Y Y - + W W - + H H - + Border Border - - + + None None - + Effect Effect - + Rotate Rotate - + Blink Blink - + Speed Speed - + Slow Slow - + Moderate Moderate - + Fast Fast @@ -4021,113 +3995,113 @@ EPhoto - + Basic Properties Basic properties - + File File - + Select File Select File - + Image Read Error Image Read Error - + Play Properties - + Play Duration Play Duration - - + + s s - + Enter Style Entrance Effect - + None None - + Alpha_In ALPHA_IN - + Moving to left MOVING_TO_LEFT - + Moving to right MOVE_TO_RIGHT - + Moving to top MOVING_TO_TOP - + Move to bottom MOVE_TO_BOTTOM - + Zoom in ZOOM_IN - + Zoom in to left_bottom ZOOM_IN_LEFT_BOTTOM - + Zoom in to left_top ZOOM_IN_LEFT_TOP - + Zoom in to right_top ZOOM_IN_RIGHT_TOP - + Zoom in to right bottom ZOOM_IN_RIGHT_BOTTOM - + Rotate to right ROTATE_TO_RIGHT - + Rotate to left ROTATE_TO_LEFT - + Enter Duration Effect Duration @@ -4455,19 +4429,19 @@ Play Times - + Video Transcoding - - + + Video Transcoding Progress - - + + Error Error @@ -4526,90 +4500,75 @@ GenTmpThread - - Preparing ... - Preparing ... - - - + MON MON - + TUE TUE - + WED WED - + THU THU - + FRI FRI - + SAT SAT - + SUN SUN - + AM AM - + PM PM - + day Days - + hour Hours - + min Mins - + sec Secs - - - Create json ... - Create json ... - - - - Scan program ... - Scan program ... - ImgDlg - + Screenshot @@ -4660,136 +4619,172 @@ MainWindow - + Language Language - + Help Help - - + + Check for updates Check for updates - - + + firmware manager Firmware management - - - Software Config - Software Config + + + + Preferences + - - + + Info - - - + + + About About - - + + Setting Setting - + Software Update Software Update - + CurVersion CurVersion - + Latest Version - + Update Log - + The current version is already the latest version The current version is already the latest version - + + Video compress to + + + + + Video transcoding to + + + + + Text antialiasing + + + + + TextAntilaTip + (Note: this option is suitable for screens with small spacing and large size. If this option is selected, the shadow on the edge of the text will be smooth; it is not recommended for small size screens and single and double color screens.) + + + + Width Split + + + + + Hide Detect Button + + + + + Show Lora Screen + + + + Download - + Fail Fail - + Cannot Save File - - - + + + Downloading updates Downloading updates - + Error Error - + Device Terminals - + Program Solutions - + Control Terminal Control - - GuangYinPin - Lora screen + + Lora Screen + - + Check card Detect - + Tip Info Tip Info - + RestoreLedCardIpByUdpTip This operation will fix all the control cards in the LAN that are not in the same network segment as the computer IP. Please be careful! @@ -4913,84 +4908,84 @@ PageListItem - + times Times - + Page name Program name - + New New - + Play times Play times - + Sources Repeat - + Audios - + Total Dur - - + + s s - + Select File Select File - + Duration - + Vol - + Valid Date Valid date - - + + Warning Warning - + Start Time can't be later than End Time - + End Time can't be earlier than Start Time - + Plan Plan @@ -5016,12 +5011,12 @@ PlayerBackSendThread - + Open file failed Open file failed - + Read file failed Read file failed @@ -5080,197 +5075,197 @@ ProgEditorWin - + Save Save - + Setting Setting - + Text Text - + Photo Photo - + Video Video - + Gif Gif - + Clock Clock - + Analog Clock Analog Clock - + Environment Environmental Monitoring - + Web Web page - + MuliContentWindow Multi material window - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; In this window, a plurality of different program materials can be added and played according to the order of joining the list - + Timer Timer - + Demo Video - + Play - + Stop Stop - + Publish Publish - - - + + + Select File Select File - + program Program - + Add page Add page - + Copy page Copy page - + Delete page Delete page - - + + Tip Info Tip Info - + Are you sure you want to delete this program page? Are you sure you want to delete this program page? - + Move up Move up - + Move down Move down - + widget properties Widget properties - + Page properties Program properties - + Do you want to save the modifications? Do you want to save the modifications? - + Create Dir failed - + Saving... Saving... - + Success Success - + Convertering Convertering - + Generate preview data Generate preview data - - - + + + Error Error - + Rename fail when saving - + Remove Recursively fail when saving - + Warning Warning @@ -5279,129 +5274,129 @@ ProgPanel - + New New - - + + Edit Edit - - + + Delete Delete - - - + + + Import Import - - - + + + Export Export - - + + Send Send - + Publish Publish - + Name Name - - + + Choose Directory Choose Directory - + Tip Tip - + The imported directory is already in the working directory, so there is no need to import it again! The imported directory is already in the working directory, so there is no need to import it again! - + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? - - + + Play - - + + Stop Stop - + Resolution Resolution - + File Size File Size - + Last Modify Last Modified - + Usb playback USB playback - + Program name conflicted Program name conflicted - + Warning Warning - + You will delete the selected solution(s),are you sure? You will delete the selected solution(s),are you sure? - - + + Tip Info Tip Info @@ -5409,17 +5404,17 @@ ProgPortDlg - + Solution Name Solution Name - + Progress Progress - + Done Done @@ -5427,13 +5422,13 @@ QObject - + Setting up the LedOK Express... Setting up the LedOK Express... - + Input password Input password @@ -5459,46 +5454,46 @@ password is wrong - - + + ExportButtonTip USB playback - + Usb upgrade program Usb upgrade program - + Password Password - - + + Convertering Convertering - - + + Tip Tip - + No checked USB device No checked USB device - + please select usb device in list please select usb device in list - - + + SendButtonTip Publish @@ -5591,49 +5586,6 @@ ALL - - SoftConfigDialog - - - Software Config - Software Config - - - - Video compress to - Video compress to - - - - Video transcoding to - Video transcoding to - - - - Text antialiasing - Text antialiasing - - - - TextAntilaTip - (Note: this option is suitable for screens with small spacing and large size. If this option is selected, the shadow on the edge of the text will be smooth; it is not recommended for small size screens and single and double color screens.) - - - - GuangYinPin - Lora screen - - - - Width Split - - - - - OK - Ok - - UpgradeApkDialog @@ -5652,12 +5604,12 @@ Upgrade - + Uninstall Uninstall - + check running state check running state @@ -5667,98 +5619,98 @@ Select Fpga - + Installing - + Refresh Refresh - + Cancel Cancel - + Screen ID Screen ID - + Remark Name Alias - + Online Online - + Screen IP Screen IP - + Security encryption - + Progress Progress - + xixunplayer - + cardsystem - + taxiapp - + starter - + connection - + displayer - + FPGA FPGA - + update - + State State - - + + All ALL @@ -5801,7 +5753,7 @@ - + Tip Tip @@ -5817,93 +5769,98 @@ - + Downloading Online File - - + + Error Error - + Online file is empty - + Uploading - + Upload error - + + Don't power off during this process + + + + Install error - + Install success - + Reminder - + Reminder: Uninstalling this program may cause the device to offline, cannot be found, lost configs and have a black screen. Please uninstall with caution! - + Do you want to continue? - + Uninstalling Uninstalling - + Uninstall error - + Uninstall success - + Check apk running status - + Check error - + Running Running - + Not running - + The encrypted control card can be upgraded directly The encrypted control card can be upgraded directly @@ -5911,7 +5868,7 @@ WaitingDlg - + Success Success diff --git a/LedOK/translations/app_ja.ts b/LedOK/translations/app_ja.ts index 3fab824..56a48c6 100644 --- a/LedOK/translations/app_ja.ts +++ b/LedOK/translations/app_ja.ts @@ -56,986 +56,975 @@ CtrlAdvancedPanel - + Advanced 上級パラメータ - + Screen Width(pixel) 画面幅(ピクセル) - + Width - - + + Height 高さ - - - - - + + + - - - - + + + + + - - - - + + + + + + Set セット - + Alias 別名 - + Web Server Address: Webサーバのアドレス: - + www.m2mled.net - + www.ledaips.com - + https://www.taxihub.cn:2340 - + https://www.ledaips.com:2340 - + https://www.36taxi.com:2340 - + www.tlzxled.com - + MCU Uploading - + Traffic screen settings - + Setting protocol ... - + Set protocol - + Getting protocol ... - + Get protocol - - + + Port ポート - + Realtimer Server Address: Realtimerアドレス: - + Firmware Management ファームウェア管理 - + update or uninstall 更新またはアンインストール - + Clear クリア - + Check Apk APKを検出 - + Uninstall アンマウント - + Running check 運転状態モニタ - + Restart 再起動 - + Check Log ログを見る - + Start LedSet4 - + Open ADB ADBデバッグ機能を開く - + Post Custom JSON Post Custom JSON - - - - - - - - + + + + + + + + Clear Program 番組をクリア - + www.ledokcloud.com/realtime - + Config の設定 - + Refresh 更新 - + Restore to default 標準の値を復元 - + Taxi top screen configuration タクシートップ画面の設定 - - + + Service:High Out of service:Low 客がいます:高 客がいません:低 - - + + Service:Low Out of service:High 客がいます:低 客がいません:高 - - Start LedSet3.0 configure LED module - LedSet 3.0を使ってLEDモジュールを配置する(メーカーの専門家が使用する) - - - + Binding *.ic account indentity voucher テーピングtaxihubプラットフォームのユーザーID証明書 - + Rotate 回転 - + Min brightness 最低輝度 - - - + + + Readback 読み戻し - + Send 送信 - + Max brightness 最高輝度 - - + + SetScreenSize スクリーンのピクセルサイズを設定 - - - - - + + + + + Success 成功 - + Compant ID: 会社ID: - + Compant ID 会社ID - + InputWebServerAddressTip Webサーバのアドレスを入力してください - + InputCompanyIdTip 会社IDを入力してください - + Do you want to modify webserveraddress and companyId? 設定サーバアドレスと会社IDを確認しますか? - - + + SetOnlineAddr ウェブサーバのアドレスを設定 - - + + ClearRealtimeServer クリア - - + + SetRealtimeServer RealTimerアドレスを設定 - - - - + Tip Info ヒント - - - - Can not find LedSet3.0.exe - LedSet3.0.exe を見つけることができません - - - - + + RestartAndroid 再起動 - - + + running 実行中 - - + + no running 実行されていません - + Check Apk Version チェック APK バージョン - - + + UninstallSoftware アンマウント - - + + Check apk running status APK運転状態監視 - - + + OpenAdb ADBデバッグ機能を開く - + indentity voucher (*.ic) 身分証明書(*.ic) - - - - - + + + + + InvokeTaxiAppFunction 証明書をバインド - - + + AliIotSetting - + Software Version Info - + Package - + Version バージョン - - + + Package name is null パッケージ名は空です - + Clearing Program プログラムクリア - - - - + + + + Timeout タイムアウト - - - - + + + + Failed 失敗 - + Getting Log ログを取得中 - - - - - - - - - - - + + + + + + + + + + + Error エラー - + Setting Timing Reboot スケジュール再起動を設定中 - + Set Timing Reboot スケジュール再起動の設定 - + Getting Timing Reboot スケジュール再起動を取得中 - + Get Timing Reboot スケジュール再起動の取得 - + totalResolution トータル解像度 - + strCurDisplayResolution 表示解像度 - - + + File not exist ファイルが存在しません - - + + Cannot Open File ファイルのオープンに失敗しました - + Uploading アップロード中 - + Update 更新 - - + + Set Display Mode - - + + Get Display Mode - - + + Set Screen Offset - - + + Get Screen Offset - + Open file Failed ファイルのオープンに失敗しました - + Setting Wallpaper - - + + Set Wallpaper - + System Updating - - + + System Update - + Getting MCU Version - - + + MCU Version - + Select File ファイルを選択 - + Setting player background - - + + Set player background - + Clearing player background - - - - - - - - + + + + + + + + Clear player background - + + + GetScreenRotation + 画面回転の取得 + + + Setting Baud Rate - + Set Baud Rate - + Getting Baud Rate - + Get Baud Rate - + Text is empty - + Json Parse Error - + Json isn't an Object - + Setting card work mode ... - + Set card work mode - + Getting card work mode ... - + Get card work mode - + Input password パスワードを入力 - + Change Password パスワード変更 - + Resolution Config 解像度設定 - + Full screen フルスクリーン - + Part セクション - + Display Mode 表示モード - + Screen Position - + Offset - + Hidden Settings - + Click right button to hide - - + + Update MCU - + Get MCU Version - + Baud Config - + Model - + Uart - + Baud - - - - - - + + + + + + + Get 得る - + Timing Reboot スケジュール再起動 - + Protocol プロトコル - + Server サービス - + Client クライアント - - + + SetScreenRotation 画面の回転を設定する - - + + SetMinBrightness 最小輝度値を設定します - - + + SetMaxBrightness 輝度最大値を設定 - - + + GetMinBrightness 輝度最小値を取得 - - + + GetMaxBrightness 輝度最大値を取得 - - + + Card work mode - - + + SetSpecialResolution 解像度を設定 - - + + GetSpecialResolution 読み込み解像度 - - + + CleanDisplayScreenSize デフォルトの解像度を復元 - - + + SetHighForBusy 客レベルの設定 - - + + GetStateForBusy ゲストレベルを取得 - - InputAliasTip - エイリアスを入力してください - - - - + + SetCardAlias エイリアスの設定 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + Tip 提示 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NoSelectedController 先に大きいスクリーンを選んでください - + InputWidthTip 正しい幅のピクセル値を入力してください - + InputHeightTip 正しい高さのピクセル値を入力してください - + Password is error パスワード @@ -2534,8 +2523,8 @@ - - + + Anycast リクエスト @@ -2551,8 +2540,8 @@ - - + + Tip 提示 @@ -2588,34 +2577,34 @@ サイクルモード - + Connect timeout 接続タイムアウト - - + + receive 受信 - + Connect 接続 - + timeout タイムアウト - + Reset loop mode ループを設定 - - + + success 成功 @@ -3086,113 +3075,33 @@ Def - - Connection Timeout - 接続タイムアウト - - - + + + + - - - + + + Device replied デバイス応答 - + + - + Success 成功 - + + Fail 失敗 - - DeviceCtrlPanel - - - - - - Current Screen - 現在のスクリーン - - - - - none - なし - - - - - Clear - クリア - - - - - Multi screen operation - マルチスクリーン操作 - - - - - selected num - 選択された数 - - - - Brightness Adj. - 輝度設定 - - - - Power Control - 電源コントロール - - - - Net Config - ネット配置 - - - - Time Sync - タイマ配置 - - - - Video source - ビデオソース - - - - Password - ひそかに言う - - - - Advanced - 上級パラメータ - - - - Test - テスト - - - - Volume Adj. - 音量調節 - - DeviceItem @@ -3237,12 +3146,12 @@ パスワードエラー - + On オン - + Off オフ @@ -3250,289 +3159,242 @@ DevicePanel - - + + All トータル トータル - + Online オンライン中 - - + + Refresh 更新 更新 - - - + + + Specify IP 指定IP 指定IP - + + + + + Current Screen 現在のスクリーン - + + + none なし - - CheckSoftVersions - ソフトウェアバージョンの取得 - - - + Current Brightness 現在の明るさ - + Android Version Androidバージョン - + FPGA Version FPGAバージョン - + Brightness Level 輝度レベル - + Android OS Resolution Androidの解像度 - + Firmware Version ファームウェアバージョン - + + + + Player Version プレーヤーファームウェアバージョン - + Detail Info 詳細 - + + Getting + + + + Specify IP list 指定 IP リスト - + Search 検索 - - + + Attention 注意 - - + + Please input IP address! IPアドレスを入力してください! - + Cancel キャンセル - + Screen ID ターミナルID - + Screen IP ターミナルIP - + Screen Size スクリーンサイズ - + Remark Name 別名 - + readback pic 読み戻し - + On オン - + Off オフ - + + Brightness Adj. + 輝度設定 + + + + Power Control + 電源コントロール + + + + Net Config + ネット配置 + + + + Time Sync + タイマ配置 + + + + Video source + ビデオソース + + + + Password + ひそかに言う + + + + Advanced + 上級パラメータ + + + + Volume Adj. + 音量調節 + + + + Test + テスト + + + + + Multi screen operation + マルチスクリーン操作 + + + + + selected num + 選択された数 + + + + + Clear + クリア + + + More Info 詳細 - + Screen Brightness 画面の明るさ - + Power Status 画面切り替えステータス - + Security 暗号化 - - Downloader - - Updater - 更新 - - - X - X - - - Downloading updates - 更新をダウンロード - - - Time remaining: 0 minutes - 残り:0分 - - - Open - オープン - - - Stop - 停止 - - - Time remaining - 残り時間 - - - unknown - 不明 - - - Error - エラー - - - Cannot find downloaded update! - ダウンロードされたアップデートを見つけることができません! - - - Close - 確定 - - - Download complete! - ダウンロード完了! - - - The installer will open separately - インストーラは別々に開きます - - - In order to install the update - 更新をインストール - - - In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application - 更新をインストールするには、アプリケーションを終了する必要があります。これは必須の更新プログラムは、今すぐ終了アプリケーションが終了します - - - Tip Info - ヒント - - - Click the "Open" button to apply the update - ボタンをクリックして更新を適用します - - - Are you sure you want to cancel the download? - あなたは確かにダウンロードをキャンセルしたいですか? - - - Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application - あなたは確かにダウンロードをキャンセルしたいですか?これは必須の更新プログラムは、今すぐ終了アプリケーションが終了します - - - of - ,総サイズ - - - Downloading Updates - アップデートのダウンロード - - - Time Remaining - 残り時間 - - - Unknown - 不明 - - - about %1 hours - 約%1時間 - - - about one hour - 約1時間 - - - %1 minutes - %1 分 - - - 1 minute - 1 分 - - - %1 seconds - %1 秒 - - - 1 second - 1 秒 - - EAClock @@ -3582,13 +3444,6 @@ Number デジタル - - - - - T - - Min Mark @@ -3653,73 +3508,73 @@ EBase - + Area 領域(px) - + X X - + Y Y - + W W - + H H - + Border ボーダー - - + + None なし - + Effect 特効 - + Rotate 回転 - + Blink きらめき - + Speed スピード - + Slow 遅い - + Moderate - + Fast 速い @@ -4139,113 +3994,113 @@ EPhoto - + Basic Properties 基本的な属性 - + File ファイル - + Select File ファイルを選択 - + Image Read Error 画像読み込みエラー - + Play Properties 再生方法 - + Play Duration 再生時間 - - + + s - + Enter Style 開始効果 - + None なし - + Alpha_In 淡入 - + Moving to left 連続する左シフト - + Moving to right 連続右シフト - + Moving to top 連続アップコンバート - + Move to bottom 連続的下向 - + Zoom in 拡大 - + Zoom in to left_bottom 左下の拡大 - + Zoom in to left_top 左上の角を大きく - + Zoom in to right_top 右上拡大 - + Zoom in to right bottom 右下隅を大きく - + Rotate to right 右回り - + Rotate to left 左回り - + Enter Duration 効果時間 @@ -4573,19 +4428,19 @@ 再生回数 - + Video Transcoding - - + + Video Transcoding Progress ビデオ変換の進歩 - - + + Error エラー @@ -4644,90 +4499,75 @@ GenTmpThread - - Preparing ... - 準備... - - - + MON 月曜日 - + TUE 火曜日 - + WED 水曜日 - + THU 木曜日 - + FRI 金曜日 - + SAT 土曜日 - + SUN 日曜日 - + AM 午前 - + PM 午後 - + day - + hour - + min - + sec - - - Create json ... - クリエイトjson... - - - - Scan program ... - スキャン番組… - ImgDlg - + Screenshot スクリーンショット @@ -4778,136 +4618,172 @@ MainWindow - + Language 言語 - + Help ヘルプ - - + + Check for updates アップデートをチェック - - + + firmware manager ファームウェア管理 - - - Software Config - ソフトウェアの設定 + + + + Preferences + プリファレンス設定 - - + + Info 情報 - - - + + + About 当ソフトウェアについて - - + + Setting 設置 - + Software Update ソフトウェアの更新 - + CurVersion 現在のバージョン - + Latest Version 最新バージョン - + Update Log 更新ログ - + The current version is already the latest version すでに最新バージョンです。 - + + Video compress to + ビデオ圧縮 to + + + + Video transcoding to + トランスコード to + + + + Text antialiasing + 文字のアンチエイリアス + + + + TextAntilaTip + (ヒント:小さい間隔の大きい画面に適しています。このオプションを有効にすると、文字の端に影がフォントのエッジの滑らかさに達します。小さいサイズのスクリーンと単色のスクリーンは使用を推奨しません) + + + + Width Split + + + + + Hide Detect Button + + + + + Show Lora Screen + + + + Download ダウンロード - + Fail 失敗 - + Cannot Save File ファイルの保存に失敗しました - - - + + + Downloading updates 更新をダウンロード - + Error エラー - + Device 端末管理 - + Program コンテンツ管理 - + Control ターミナルコントロール - - GuangYinPin - スクリーン + + Lora Screen + - + Check card ワンタッチ修復 - + Tip Info ヒント - + RestoreLedCardIpByUdpTip この操作はLAN内のすべてのコンピュータIPと同じセグメントにないコントロールカードを固定IPに修正します。慎重に操作してください。 @@ -5031,84 +4907,84 @@ PageListItem - + times - + Page name プログラム名 - + New 新規 - + Play times 再生回数 - + Sources Repeat ソースの繰り返し - + Audios オーディオ - + Total Dur 全期間 - - + + s - + Select File ファイルを選択 - + Duration 期間 - + Vol 音量 - + Valid Date 有効期間 - - + + Warning 警告 - + Start Time can't be later than End Time 開始時間は終了時間より後にようにしてください - + End Time can't be earlier than Start Time 終了時間は開始時間より遅いようにしてください - + Plan タイムスケジュール @@ -5134,12 +5010,12 @@ PlayerBackSendThread - + Open file failed ファイルのオープンに失敗しました - + Read file failed ファイルの読み込みに失敗しました @@ -5198,197 +5074,197 @@ ProgEditorWin - + Save 保存 - + Setting 設置 - + Text テキスト - + Photo 写真 - + Video ビデオ - + Gif アニメーション - + Clock デジタル時計 - + Analog Clock アナログ時計 - + Environment 環境モニタリング - + Web ウェブページ - + MuliContentWindow マルチ素材ウィンドウ - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; このウィンドウには、複数の異なる番組素材を追加して、リストに追加した順に再生することができます - + Timer タイマー - + Demo Video テストビデオ - + Play 再生 - + Stop 停止 - + Publish 転送 - - - + + + Select File ファイルを選択 - + program 番組リスト - + Add page ページを追加 - + Copy page コピーページ - + Delete page ページを削除 - - + + Tip Info ヒント - + Are you sure you want to delete this program page? 本当にこの番組ページを削除しますか? - + Move up 前へ - + Move down 次頁 - + widget properties パッケージプロパティ - + Page properties プログラムのプロパティ - + Do you want to save the modifications? 変更された内容を保存してもよろしいですか? - + Create Dir failed ディレクトリの作成に失敗しました - + Saving... 保存中、少々お待ちください... - + Success 成功 - + Convertering データを整理する - + Generate preview data プレビューデータの生成 - - - + + + Error エラー - + Rename fail when saving - + Remove Recursively fail when saving - + Warning 警告 @@ -5397,129 +5273,129 @@ ProgPanel - + New 新規 - - + + Edit 編集 - - + + Delete 削除 - - - + + + Import インポート - - - + + + Export 出力 - - + + Send 送信 - + Publish 転送 - + Name 名前 - - + + Choose Directory ディレクトリを選択 - + Tip 提示 - + The imported directory is already in the working directory, so there is no need to import it again! このインポートしたディレクトリはすでにワークディレクトリの下にあります。再インポートする必要はありません! - + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? 解決策は既に存在します。既存の解決策を上書きしたいと思いますか? - - + + Play 再生 - - + + Stop 停止 - + Resolution 解像度 - + File Size サイズ - + Last Modify 最終更新日 - + Usb playback USBメモリで再生する - + Program name conflicted 番組名が重なる - + Warning 警告 - + You will delete the selected solution(s),are you sure? 是否确认删除选中的节目? - - + + Tip Info ヒント @@ -5527,17 +5403,17 @@ ProgPortDlg - + Solution Name リスト名 - + Progress 程度 - + Done 完了 @@ -5545,13 +5421,13 @@ QObject - + Setting up the LedOK Express... 初期化LedOK Express… - + Input password パスワードを入力 @@ -5577,46 +5453,46 @@ パスワードエラー - - + + ExportButtonTip USBメモリで再生する - + Usb upgrade program Uディスク更新プログラム - + Password パスワード - - + + Convertering データを整理する - - + + Tip 提示 - + No checked USB device チェックUSBデバイス - + please select usb device in list リスト内のUSBデバイスを選択してください - - + + SendButtonTip 転送 @@ -5709,68 +5585,6 @@ トータル - - SoftConfigDialog - - - Software Config - ソフトウェアの設定 - - - - Video compress to - ビデオ圧縮 to - - - - Video transcoding to - トランスコード to - - - - Text antialiasing - 文字のアンチエイリアス - - - - TextAntilaTip - (ヒント:小さい間隔の大きい画面に適しています。このオプションを有効にすると、文字の端に影がフォントのエッジの滑らかさに達します。小さいサイズのスクリーンと単色のスクリーンは使用を推奨しません) - - - - GuangYinPin - スクリーン - - - - Width Split - - - - - OK - 確定 - - - - Updater - - Would you like to download the update now? - 今ダウンロードして更新したいですか? - - - Would you like to download the update now? This is a mandatory update, exiting now will close the application - 今すぐ更新をダウンロードしますか?これは必須の更新プログラムは、今すぐ終了アプリケーションが終了します - - - No updates are available for the moment - いいえ更新は、現在入手可能です - - - Congratulations! You are running the latest version of %1 - おめでとう!あなたは%1の最新バージョンを実行しています - - UpgradeApkDialog @@ -5789,12 +5603,12 @@ アップグレード - + Uninstall アンマウント - + check running state 運転状態を検出 @@ -5804,98 +5618,98 @@ FPGAファイルを選択 - + Installing インストール中 - + Refresh 更新 - + Cancel キャンセル - + Screen ID ターミナルID - + Remark Name 別名 - + Online オンライン中 - + Screen IP ターミナルIP - + Security 暗号化 - + Progress 程度 - + xixunplayer - + cardsystem - + taxiapp - + starter - + connection - + displayer - + FPGA FPGA - + update - + State 状態 - - + + All トータル @@ -5938,7 +5752,7 @@ - + Tip 提示 @@ -5954,93 +5768,98 @@ - + Downloading Online File オンラインファイルをダウンロード中 - - + + Error エラー - + Online file is empty オンラインファイルが空です - + Uploading アップロード中 - + Upload error アップロード エラー - + + Don't power off during this process + アップグレード中は電源を切らないでください + + + Install error インストール エラー - + Install success インストールに成功しました - + Reminder ヒント - + Reminder: Uninstalling this program may cause the device to offline, cannot be found, lost configs and have a black screen. Please uninstall with caution! ヒント:このプログラムをアンインストールすると、プラットフォームがオフラインになり、デバイスが見つかりません。構成パラメータが失われ、黒画面の問題が発生します。慎重にアンインストールしてください。 - + Do you want to continue? 続行しますか? - + Uninstalling アンマウント中 - + Uninstall error アンインストール エラー - + Uninstall success アンインストールに成功しました - + Check apk running status APK運転状態監視 - + Check error チェック エラー - + Running 実行中 - + Not running 実行されていません - + The encrypted control card can be upgraded directly 暗号化されたコントロールカードを直接アップグレードすることができます @@ -6048,7 +5867,7 @@ WaitingDlg - + Success 成功 diff --git a/LedOK/translations/app_zh_CN.ts b/LedOK/translations/app_zh_CN.ts index 0c36236..105ce8c 100644 --- a/LedOK/translations/app_zh_CN.ts +++ b/LedOK/translations/app_zh_CN.ts @@ -56,986 +56,975 @@ CtrlAdvancedPanel - + Advanced - 高级参数 + 高级设置 - + Screen Width(pixel) 屏幕宽(像素) - + Width - - + + Height - - - - - + + + - - - - + + + + + - - - - + + + + + + Set 设置 - + Alias 别名 - + Web Server Address: Web服务器地址: - + www.m2mled.net - + www.ledaips.com - + https://www.taxihub.cn:2340 - + https://www.ledaips.com:2340 - + https://www.36taxi.com:2340 - + www.tlzxled.com - + MCU Uploading 正在上传单片机 - + Traffic screen settings 交通屏设置 - + Setting protocol ... 正在设置协议 ... - + Set protocol 设置协议 - + Getting protocol ... 正在回读协议 ... - + Get protocol 回读协议 - - + + Port 端口 - + Realtimer Server Address: Realtimer地址: - + Firmware Management 固件管理 - + update or uninstall 更新或卸载 - + Clear 清空 - + Check Apk 检查Apk - + Uninstall 卸载 - + Running check 运行状态监测 - + Restart 重启 - + Check Log 查看日志 - + Start LedSet4 使用 LedSet4.0 配置LED模组(Apk Display2.0以上版本) - + Open ADB 打开ADB调试功能 - + Post Custom JSON Post Custom JSON - - - - - - - - + + + + + + + + Clear Program 清除节目 - + www.ledokcloud.com/realtime - + Config 配置 - + Refresh 刷新 - + Restore to default 恢复默认值 - + Taxi top screen configuration 车顶有无客电平配置 - - + + Service:High Out of service:Low 有客:高电平 无客:低电平 - - + + Service:Low Out of service:High 有客:低电平 无客:高电平 - - Start LedSet3.0 configure LED module - 使用LedSet3.0配置LED模组(厂家专业人员使用) - - - + Binding *.ic account indentity voucher 绑定taxihub平台用户身份凭证 - + Rotate 旋转 - + Min brightness 最低亮度 - - - + + + Readback 回读 - + Send 发送 - + Max brightness 最高亮度 - - + + SetScreenSize 设置屏幕像素尺寸 - - - - - + + + + + Success 成功 - + Compant ID: 公司ID: - + Compant ID 公司ID - + InputWebServerAddressTip 请输入Web服务器地址 - + InputCompanyIdTip 请输入公司ID - + Do you want to modify webserveraddress and companyId? 是否确认配置服务器地址和公司ID? - - + + SetOnlineAddr 设置web服务器地址 - - + + ClearRealtimeServer 清除 - - + + SetRealtimeServer 设置RealTimer地址 - - - - + Tip Info 提示 - - - - Can not find LedSet3.0.exe - 找不到 LedSet3.0.exe - - - - + + RestartAndroid 重启 - - + + running 正在运行 - - + + no running 没有运行 - + Check Apk Version 查询已安装apk版本 - - + + UninstallSoftware 卸载 - - + + Check apk running status 监测APK运行状态 - - + + OpenAdb 打开ADB调试功能 - + indentity voucher (*.ic) 身份凭证(*.ic) - - - - - + + + + + InvokeTaxiAppFunction 绑定证书 - - + + AliIotSetting - + Software Version Info 软件版本信息 - + Package 包名 - + Version 版本 - - + + Package name is null 包名为空 - + Clearing Program 正在清除节目 - - - - + + + + Timeout 超时 - - - - + + + + Failed 失败 - + Getting Log 正在获取日志 - - - - - - - - - - - + + + + + + + + + + + Error 错误 - + Setting Timing Reboot 正在设置定时重启 - + Set Timing Reboot 设置定时重启 - + Getting Timing Reboot 正在获取定时重启 - + Get Timing Reboot 获取定时重启 - + totalResolution 包括行场数的分辨率 - + strCurDisplayResolution 当前显示屏分辨率 - - + + File not exist 文件不存在 - - + + Cannot Open File 文件打开失败 - + Uploading 正在上传 - + Update 更新 - - + + Set Display Mode 设置显示模式 - - + + Get Display Mode 获取显示模式 - - + + Set Screen Offset 设置屏幕偏移 - - + + Get Screen Offset 获取屏幕偏移 - + Open file Failed 文件打开失败 - + Setting Wallpaper 正在设置系统桌面背景 - - + + Set Wallpaper 设置系统桌面背景 - + System Updating 系统升级中 - - + + System Update 系统升级 - + Getting MCU Version 正在获取单片机版本 - - + + MCU Version 单片机版本 - + Select File 选择文件 - + Setting player background 正在设置播放器背景 - - + + Set player background 设置播放器背景 - + Clearing player background 正在清除播放器背景 - - - - - - - - + + + + + + + + Clear player background 清除播放器背景 - + + + GetScreenRotation + 获取屏幕旋转 + + + Setting Baud Rate 正在设置波特率 - + Set Baud Rate 设置波特率 - + Getting Baud Rate 正在获取波特率 - + Get Baud Rate 获取波特率 - + Text is empty 文本为空 - + Json Parse Error - + Json isn't an Object - + Setting card work mode ... 正在设置控制卡工作模式 ... - + Set card work mode 设置控制卡工作模式 - + Getting card work mode ... 正在回读控制卡工作模式 ... - + Get card work mode 回读控制卡工作模式 - + Input password 输入密码 - + Change Password 修改密码 - + Resolution Config 分辨率配置 - + Full screen 全屏 - + Part 局部 - + Display Mode 显示模式 - + Screen Position 屏幕位置 - + Offset 偏移 - + Hidden Settings 隐藏的设置 - + Click right button to hide 点击右键隐藏 - - + + Update MCU 更新单片机 - + Get MCU Version 获取单片机版本 - + Baud Config 波特率配置 - + Model 设备型号 - + Uart 串口节点 - + Baud 波特率 - - - - - - + + + + + + + Get 获取 - + Timing Reboot 定时重启 - + Protocol 协议 - + Server 服务端 - + Client 客户端 - - + + SetScreenRotation 设置屏幕旋转 - - + + SetMinBrightness 设置最小的亮度值 - - + + SetMaxBrightness 设置亮度最大值 - - + + GetMinBrightness 获取亮度最小值 - - + + GetMaxBrightness 获取亮度最大值 - - + + Card work mode 控制卡工作模式 - - + + SetSpecialResolution 设置分辨率 - - + + GetSpecialResolution 读取分辨率 - - + + CleanDisplayScreenSize 恢复默认分辨率 - - + + SetHighForBusy 设置有无客电平 - - + + GetStateForBusy 获取有无客电平 - - InputAliasTip - 请输入别名 - - - - + + SetCardAlias 设置别名 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + Tip 提示 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NoSelectedController 请先选择大屏幕 - + InputWidthTip 请输入正确的宽度像素值 - + InputHeightTip 请输入正确的高度像素值 - + Password is error 密码错误 @@ -2534,8 +2523,8 @@ - - + + Anycast 点播 @@ -2551,8 +2540,8 @@ - - + + Tip 提示 @@ -2588,34 +2577,34 @@ 循环模式 - + Connect timeout 连接超时 - - + + receive 接收 - + Connect 连接 - + timeout 超时 - + Reset loop mode 设置循环 - - + + success 成功 @@ -3086,113 +3075,33 @@ Def - - Connection Timeout - 连接超时 - - - + + + + - - - + + + Device replied 设备回复 - + + - + Success 成功 - + + Fail 失败 - - DeviceCtrlPanel - - - - - - Current Screen - 当前屏幕 - - - - - none - - - - - - Clear - 清空 - - - - - Multi screen operation - 多屏操作 - - - - - selected num - 选中数目 - - - - Brightness Adj. - 亮度调节 - - - - Power Control - 电源控制 - - - - Net Config - 网络配置 - - - - Time Sync - 对时管理 - - - - Video source - 同异步配置 - - - - Password - 设置密码 - - - - Advanced - 高级设置 - - - - Test - 测试 - - - - Volume Adj. - 音量调节 - - DeviceItem @@ -3237,12 +3146,12 @@ 密码错误 - + On - + Off @@ -3250,290 +3159,243 @@ DevicePanel - - + + All 总数 总数 - + Online 在线 在线 - - + + Refresh 刷新 刷新 - + + + + + Current Screen 当前屏幕 - + + + none - - - + + + Specify IP 指定IP 指定IP - - CheckSoftVersions - 获取软件版本 - - - + Current Brightness 当前亮度 - + Android Version 安卓版本 - + FPGA Version FPGA版本 - + Brightness Level 亮度等级 - + Android OS Resolution 安卓分辨率 - + Firmware Version 固件版本 - + + + + Player Version 播放器固件版本 - + Detail Info 详细信息 - + + Getting + 正在获取 + + + Specify IP list 指定IP列表 - + Search 搜索 - - + + Attention 注意 - - + + Please input IP address! 请输入IP地址! - + Cancel 取消 - + Screen ID 屏幕ID - + Screen IP 屏幕IP - + Screen Size 屏幕像素 - + Remark Name 别名 - + readback pic 回读画面 - + On - + Off - + + Brightness Adj. + 亮度调节 + + + + Power Control + 电源控制 + + + + Net Config + 网络配置 + + + + Time Sync + 对时管理 + + + + Video source + 同异步配置 + + + + Password + 设置密码 + + + + Advanced + 高级设置 + + + + Volume Adj. + 音量调节 + + + + Test + 测试 + + + + + Multi screen operation + 多屏操作 + + + + + selected num + 选中数目 + + + + + Clear + 清空 + + + More Info 详细信息 - + Screen Brightness 屏幕亮度 - + Power Status 屏幕开关状态 - + Security 加密 - - Downloader - - Updater - 更新 - - - X - X - - - Downloading updates - 下载更新 - - - Time remaining: 0 minutes - 还剩:0分钟 - - - Open - 打开 - - - Stop - 停止 - - - Time remaining - 剩余时间 - - - unknown - 未知 - - - Error - 错误 - - - Cannot find downloaded update! - 找不到下载的更新! - - - Close - 确认 - - - Download complete! - 下载完成! - - - The installer will open separately - 安装程序将单独打开 - - - In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application - 要安装更新,可能需要退出应用程序。这是强制更新,现在退出将关闭应用程序 - - - In order to install the update - 安装更新 - - - Tip Info - 提示 - - - Click the "Open" button to apply the update - 单击“打开”按钮应用更新 - - - Are you sure you want to cancel the download? - 您想现在下载更新吗? - - - Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application - 确实要取消下载吗?这是强制更新,现在退出将关闭应用程序 - - - of - ,总大小 - - - Downloading Updates - 正在下载更新 - - - Time Remaining - 剩余时间 - - - Unknown - 未知 - - - about %1 hours - 约%1小时 - - - about one hour - 约1小时 - - - %1 minutes - %1 分钟 - - - 1 minute - 1 分钟 - - - %1 seconds - %1 秒 - - - 1 second - 1 秒 - - EAClock @@ -3583,13 +3445,6 @@ Number 数字 - - - - - T - - Min Mark @@ -3654,73 +3509,73 @@ EBase - + Area 区域(px) - + X - + Y - + W - + H - + Border 边框 - - + + None - + Effect 特效 - + Rotate 旋转 - + Blink 闪烁 - + Speed 速度 - + Slow - + Moderate - + Fast @@ -4140,113 +3995,113 @@ EPhoto - + Basic Properties 基本属性 - + File 文件 - + Select File 选择文件 - + Image Read Error 图片读取错误 - + Play Properties 播放方式 - + Play Duration 播放时长 - - + + s - + Enter Style 入场特效 - + None - + Alpha_In 淡入 - + Moving to left 连续左移 - + Moving to right 连续右移 - + Moving to top 连续上移 - + Move to bottom 连续下移 - + Zoom in 放大 - + Zoom in to left_bottom 左下角放大 - + Zoom in to left_top 左上角放大 - + Zoom in to right_top 右上角放大 - + Zoom in to right bottom 右下角放大 - + Rotate to right 向右旋转 - + Rotate to left 向左旋转 - + Enter Duration 特效时长 @@ -4574,19 +4429,19 @@ 播放次数 - + Video Transcoding 视频转码 - - + + Video Transcoding Progress 视频转码进度 - - + + Error 错误 @@ -4645,90 +4500,75 @@ GenTmpThread - - Preparing ... - 准备中... - - - + MON 星期一 - + TUE 星期二 - + WED 星期三 - + THU 星期四 - + FRI 星期五 - + SAT 星期六 - + SUN 星期日 - + AM 上午 - + PM 下午 - + day - + hour - + min - + sec - - - Create json ... - 生成json... - - - - Scan program ... - 扫描节目... - ImgDlg - + Screenshot 屏幕截图 @@ -4779,136 +4619,172 @@ MainWindow - + Language 语言 - + Help 帮助 - - + + Check for updates 检查更新 - - + + firmware manager 固件管理 - - - Software Config - 软件配置 + + + + Preferences + 偏好设置 - - + + Info 信息 - - - + + + About 关于 - - + + Setting 设置 - + Software Update 软件更新 - + CurVersion 当前版本 - + Latest Version 最新版本 - + Update Log 更新日志 - + The current version is already the latest version 已经是最新的版本 - + + Video compress to + 视频压缩成 + + + + Video transcoding to + 视频转码成 + + + + Text antialiasing + 文字反锯齿 + + + + TextAntilaTip + (提示:该选项适合小间距大尺寸的屏幕,选中此项,文字边缘会有暗影已达到字体边缘光滑的效果;小尺寸屏幕和单双色屏幕不建议使用) + + + + Width Split + 超长屏打折 + + + + Hide Detect Button + 隐藏一键找卡 + + + + Show Lora Screen + 显示光影屏 + + + Download 下载 - + Fail 失败 - + Cannot Save File 保存文件失败 - - - + + + Downloading updates 正在下载更新 - + Error 错误 - + Device 设备管理 - + Program 节目管理 - + Control 终端控制 - - GuangYinPin + + Lora Screen 光影屏 - + Check card 一键找卡 - + Tip Info 提示 - + RestoreLedCardIpByUdpTip 该操作会把局域网内的所有与计算机IP不在同一网段的控制卡修复成固定IP,请谨慎操作! @@ -5032,84 +4908,84 @@ PageListItem - + times - + Page name 节目名称 - + New 新建 - + Play times 播放次数 - + Sources Repeat 素材循环 - + Audios 音频 - + Total Dur 总时长 - - + + s - + Select File 选择文件 - + Duration 时长 - + Vol 音量 - + Valid Date 有效日期 - - + + Warning 警告 - + Start Time can't be later than End Time 开始时间不能晚于结束时间 - + End Time can't be earlier than Start Time 结束时间不能早于开始时间 - + Plan 时间计划表 @@ -5135,12 +5011,12 @@ PlayerBackSendThread - + Open file failed 文件读取失败 - + Read file failed 文件读取失败 @@ -5199,197 +5075,197 @@ ProgEditorWin - + Save 保存 - + Setting 设置 - + Text 文本 - + Photo 图片 - + Video 视频 - + Gif 动画 - + Clock 数字时钟 - + Analog Clock 模拟时钟 - + Environment 环境监测 - + Web 网页 - + MuliContentWindow 多素材窗口 - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; 该窗口中可以加入多个不同是节目素材,并按照加入列表的先后顺序播放 - + Timer 计时器 - + Demo Video 测试视频 - + Play 播放 - + Stop 停止 - + Publish 发布 - - - + + + Select File 选择文件 - + program 节目列表 - + Add page 添加页面 - + Copy page 复制页面 - + Delete page 删除页面 - - + + Tip Info 提示 - + Are you sure you want to delete this program page? 确定要删除该节目页吗? - + Move up 向上移动一个页面 - + Move down 向下移动一个页面 - + widget properties 组件属性 - + Page properties 节目属性 - + Do you want to save the modifications? 是否保存修改? - + Create Dir failed 创建目录失败 - + Saving... 正在保存... - + Success 成功 - + Convertering 整理数据中 - + Generate preview data 生成预览数据 - - - + + + Error 错误 - + Rename fail when saving 重命名文件夹失败 - + Remove Recursively fail when saving - + Warning 警告 @@ -5398,129 +5274,129 @@ ProgPanel - + New 新建 - - + + Edit 编辑 - - + + Delete 删除 - - - + + + Import 导入 - - - + + + Export 导出 - - + + Send 发送 - + Publish 发布 - + Name 名称 - - + + Choose Directory 选择目录 - + Tip 提示 - + The imported directory is already in the working directory, so there is no need to import it again! 该导入的目录已经在工作目录下,无需再次导入! - + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? :节目已存在。是否确实要覆盖现有节目? - - + + Play 播放 - - + + Stop 停止 - + Resolution 分辨率 - + File Size 文件大小 - + Last Modify 最后修改时间 - + Usb playback U盘更新 - + Program name conflicted 节目名称重复 - + Warning 警告 - + You will delete the selected solution(s),are you sure? 是否确认删除选中的节目? - - + + Tip Info 提示 @@ -5528,17 +5404,17 @@ ProgPortDlg - + Solution Name 节目名称 - + Progress 进度 - + Done 完成 @@ -5546,13 +5422,13 @@ QObject - + Setting up the LedOK Express... 初始化LedOK Express... - + Input password 输入密码 @@ -5578,46 +5454,46 @@ 密码错误 - - + + ExportButtonTip U盘播放 - + Usb upgrade program U盘更新节目 - + Password 密码 - - + + Convertering 整理数据中 - - + + Tip 提示 - + No checked USB device 未检查USB设备 - + please select usb device in list 请在列表中选择usb设备 - - + + SendButtonTip 发布 @@ -5710,68 +5586,6 @@ 总数 - - SoftConfigDialog - - - Software Config - 软件配置 - - - - Video compress to - 视频压缩成 - - - - Video transcoding to - 视频转码成 - - - - Text antialiasing - 文字反锯齿 - - - - TextAntilaTip - (提示:该选项适合小间距大尺寸的屏幕,选中此项,文字边缘会有暗影已达到字体边缘光滑的效果;小尺寸屏幕和单双色屏幕不建议使用) - - - - GuangYinPin - 光影屏 - - - - Width Split - 超长屏打折 - - - - OK - 确认 - - - - Updater - - Would you like to download the update now? - 您想现在下载更新吗? - - - Would you like to download the update now? This is a mandatory update, exiting now will close the application - 您想现在下载更新吗?这是强制更新,现在退出将关闭应用程序 - - - No updates are available for the moment - 暂时没有可用的更新 - - - Congratulations! You are running the latest version of %1 - 祝贺你!您正在运行最新版本的%1 - - UpgradeApkDialog @@ -5790,12 +5604,12 @@ 升级 - + Uninstall 卸载 - + check running state 检测运行状态 @@ -5805,98 +5619,98 @@ 选择FPGA文件 - + Installing 正在安装 - + Refresh 刷新 - + Cancel 取消 - + Screen ID 屏幕ID - + Remark Name 别名 - + Online 在线 - + Screen IP 屏幕IP - + Security 加密 - + Progress 进度 - + xixunplayer - + cardsystem - + taxiapp - + starter - + connection - + displayer - + FPGA FPGA - + update 更新 - + State 状态 - - + + All 总数 @@ -5939,7 +5753,7 @@ - + Tip 提示 @@ -5955,93 +5769,98 @@ - + Downloading Online File 正在下载在线文件 - - + + Error 错误 - + Online file is empty 在线文件为空 - + Uploading 正在上传 - + Upload error 上传错误 - + + Don't power off during this process + 升级过程中请勿断电 + + + Install error 安装错误 - + Install success 安装成功 - + Reminder 提示 - + Reminder: Uninstalling this program may cause the device to offline, cannot be found, lost configs and have a black screen. Please uninstall with caution! 提示:卸载此程序会导致平台掉线,找不到设备,配置参数丢失和黑屏问题,请谨慎卸载! - + Do you want to continue? 是否继续? - + Uninstalling 正在卸载 - + Uninstall error 卸载错误 - + Uninstall success 卸载成功 - + Check apk running status 监测APK运行状态 - + Check error 检查错误 - + Running 正在运行 - + Not running 没有运行 - + The encrypted control card can be upgraded directly 加密控制卡可以直接升级 @@ -6049,7 +5868,7 @@ WaitingDlg - + Success 成功 diff --git a/LedOK/translations/app_zh_TW.ts b/LedOK/translations/app_zh_TW.ts index 6038344..efa6ec8 100644 --- a/LedOK/translations/app_zh_TW.ts +++ b/LedOK/translations/app_zh_TW.ts @@ -56,986 +56,975 @@ CtrlAdvancedPanel - + Advanced - 高級參數 + 高級設定 - + Screen Width(pixel) 螢幕寬(點數) - + Width - - + + Height - - - - - + + + - - - - + + + + + - - - - + + + + + + Set 設定 - + Alias 別名 - + Web Server Address: Web伺服器地址: - + www.m2mled.net - + www.ledaips.com - + https://www.taxihub.cn:2340 - + https://www.ledaips.com:2340 - + https://www.36taxi.com:2340 - + www.tlzxled.com - + MCU Uploading 正在上傳單片機 - + Traffic screen settings 交通屏設定 - + Setting protocol ... 正在設定協定 - + Set protocol 設定協定 - + Getting protocol ... 正在回讀協定 ... - + Get protocol 回讀協定 - - + + Port - + Realtimer Server Address: Realtimer地址: - + Firmware Management 固件管理 - + update or uninstall 更新或卸載 - + Clear 清空 - + Check Apk 檢查Apk - + Uninstall 卸載 - + Running check 運行狀態監測 - + Restart 重啓 - + Check Log 查看日誌 - + Start LedSet4 - + Open ADB 打開ADB調試功能 - + Post Custom JSON Post Custom JSON - - - - - - - - + + + + + + + + Clear Program 清除節目 - + www.ledokcloud.com/realtime - + Config 配寘 - + Refresh 檢測 - + Restore to default 恢復預設值 - + Taxi top screen configuration 車頂有無客電平配寘 - - + + Service:High Out of service:Low 有客:高電平無客:低電平 - - + + Service:Low Out of service:High 有客:低電平 無客:高電平 - - Start LedSet3.0 configure LED module - 使用LedSet3.0配寘LED模組(廠家專業人員使用) - - - + Binding *.ic account indentity voucher 綁定taxihub平臺用戶身份憑證 - + Rotate 旋轉 - + Min brightness 最低亮度 - - - + + + Readback 回讀 - + Send 發送 - + Max brightness 最高亮度 - - + + SetScreenSize 設定螢幕點數尺寸 - - - - - + + + + + Success 成功 - + Compant ID: 公司ID: - + Compant ID 公司ID - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NoSelectedController 請先選擇大螢幕 - + InputWebServerAddressTip 請輸入Web伺服器地址 - + InputCompanyIdTip 請輸入公司ID - + Do you want to modify webserveraddress and companyId? 是否確認配寘伺服器地址和公司ID? - - + + SetOnlineAddr 設定web伺服器地址 - - + + ClearRealtimeServer 清除 - - + + SetRealtimeServer 設定RealTimer地址 - - - - + Tip Info 提示 - - - - Can not find LedSet3.0.exe - 找不到 LedSet3.0.exe,確認下載並安裝 - - - - + + RestartAndroid 重啓 - - + + running 正在運行 - - + + no running 沒有運行 - + Check Apk Version 査詢已安裝apk版本 - - + + UninstallSoftware 卸載 - - + + Check apk running status 監測APK運行狀態 - - + + OpenAdb 打開ADB調試功能 - + indentity voucher (*.ic) 身份憑證(*.ic) - - - - - + + + + + InvokeTaxiAppFunction 綁定證書 - - + + AliIotSetting - + Software Version Info 軟體版本資訊 - + Package 包名 - + Version 版本 - - + + Package name is null 包名為空 - + Clearing Program 正在清除節目 - - - - + + + + Timeout 超時 - - - - + + + + Failed 失敗 - + Getting Log 讀取日誌 - - - - - - - - - - - + + + + + + + + + + + Error 錯誤 - + Setting Timing Reboot 正在設定定時重啓 - + Set Timing Reboot 設定定時重啓 - + Getting Timing Reboot 正在獲取定時重啓 - + Get Timing Reboot 獲取定時重啓 - + totalResolution 行数を含む解像度 - + strCurDisplayResolution 當前顯示分辯率 - - + + File not exist 檔案不存在 - - + + Cannot Open File 檔案打開失敗 - + Uploading 正在上傳 - + Update 更新 - - + + Set Display Mode 設定顯示模式 - - + + Get Display Mode 獲取顯示模式 - - + + Set Screen Offset 設定螢幕偏移 - - + + Get Screen Offset 獲取螢幕偏移 - + Open file Failed 檔案打開失敗 - + Setting Wallpaper 正在設定系統桌面背景 - - + + Set Wallpaper 設定系統桌面背景 - + System Updating 系統升級中 - - + + System Update 系統升級 - + Getting MCU Version 正在獲取單片機版本 - - + + MCU Version 單片機版本 - + Select File 選擇檔案 - + Setting player background 正在設定播放機背景 - - + + Set player background 設定播放機背景 - + Clearing player background 正在清除播放機背景 - - - - - - - - + + + + + + + + Clear player background 清除播放機背景 - + + + GetScreenRotation + 獲取荧幕旋轉 + + + Setting Baud Rate 正在設定串列傳輸速率 - + Set Baud Rate 設定串列傳輸速率 - + Getting Baud Rate 正在讀取串列傳輸速率 - + Get Baud Rate 讀取串列傳輸速率 - + Text is empty - + Json Parse Error - + Json isn't an Object - + Setting card work mode ... 正在設定控制卡工作模式 ... - + Set card work mode 設定控制卡工作模式 - + Getting card work mode ... 正在回讀控制卡工作模式 ... - + Get card work mode 回讀控制卡工作模式 - + Input password 輸入密碼 - + Change Password 修改密碼 - + Resolution Config 分辯率配寘 - + Full screen 全屏 - + Part 局部 - + Display Mode 顯示模式 - + Screen Position 螢幕位置 - + Offset 偏移 - + Hidden Settings 隱藏的設定 - + Click right button to hide 點擊右鍵隱藏 - - + + Update MCU 更新單片機 - + Get MCU Version 獲取單片機版本 - + Baud Config 串列傳輸速率配寘 - + Model 設備型號 - + Uart 串口節點 - + Baud 串列傳輸速率 - - - - - - + + + + + + + Get 讀取 - + Timing Reboot 定時重啓 - + Protocol 協定 - + Server 服務端 - + Client 用戶端 - - + + SetScreenRotation 設定螢幕旋轉 - - + + SetMinBrightness 設定最小的亮度值 - - + + SetMaxBrightness 設定亮度最大值 - - + + GetMinBrightness 獲取亮度最小值 - - + + GetMaxBrightness 獲取亮度最大值 - - + + Card work mode 控制卡工作模式 - - + + SetSpecialResolution 設定分辯率 - - + + GetSpecialResolution 讀取分辯率 - - + + CleanDisplayScreenSize 恢復默認分辯率 - - + + SetHighForBusy 設定有無客電平 - - + + GetStateForBusy 獲取有無客電平 - - InputAliasTip - 請輸入別名 - - - - + + SetCardAlias 設定別名 - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + Tip 提示 - + InputWidthTip 請輸入正確的寬度點數值 - + InputHeightTip 請輸入正確的高度點數值 - + Password is error 密碼錯誤 @@ -2539,8 +2528,8 @@ - - + + Anycast 點播 @@ -2556,8 +2545,8 @@ - - + + Tip 提示 @@ -2593,34 +2582,34 @@ 迴圈模式 - + Connect timeout 連接超時 - - + + receive 接收 - + Connect 連接 - + timeout 超時 - + Reset loop mode 設定迴圈 - - + + success 成功 @@ -3091,113 +3080,33 @@ Def - - Connection Timeout - 連接超時 - - - + + + + - - - + + + Device replied 設備回復 - + + - + Success 成功 - + + Fail 失敗 - - DeviceCtrlPanel - - - - - - Current Screen - 当前屏幕 - - - - - none - - - - - - Clear - 清空 - - - - - Multi screen operation - 多屏操作 - - - - - selected num - 選中數目 - - - - Brightness Adj. - 亮度調節 - - - - Power Control - 電源控制 - - - - Net Config - 網絡配寘 - - - - Time Sync - 對時管理 - - - - Video source - 同異步配寘 - - - - Password - 設寘密碼 - - - - Advanced - 高級設定 - - - - Test - 測試 - - - - Volume Adj. - 音量調節 - - DeviceItem @@ -3242,12 +3151,12 @@ 密碼錯誤 - + On - + Off @@ -3255,288 +3164,241 @@ DevicePanel - - + + All 總數 - + Online 在线 線上 - - + + Refresh 檢測 - - - + + + Specify IP 指定IP 指定IP - + + + + + Current Screen 当前屏幕 - + + + none - - CheckSoftVersions - 獲取軟體版本 - - - + Current Brightness 當前亮度 - + Android Version 安卓版本 - + FPGA Version FPGA版本 - + Brightness Level 亮度等級 - + Android OS Resolution 安卓分辯率 - + Firmware Version 固件版本 - + + + + Player Version 播放機固件版本 - + Detail Info 詳細資訊 - + + Getting + 正在獲取 + + + Specify IP list 指定IP清單 - + Search 蒐索 - - + + Attention 注意 - - + + Please input IP address! 請輸入IP地址! - + Cancel 取消 - + Screen ID 螢幕ID - + Screen IP 螢幕IP - + Screen Size 螢幕點數 - + Remark Name 別名 - + readback pic 回讀畫面 - + On - + Off - + + Brightness Adj. + 亮度調節 + + + + Power Control + 電源控制 + + + + Net Config + 網絡配寘 + + + + Time Sync + 對時管理 + + + + Video source + 同異步配寘 + + + + Password + 設寘密碼 + + + + Advanced + 高級設定 + + + + Volume Adj. + 音量調節 + + + + Test + 測試 + + + + + Multi screen operation + 多屏操作 + + + + + selected num + 選中數目 + + + + + Clear + 清空 + + + More Info 詳細資訊 - + Screen Brightness 螢幕亮度 - + Power Status 螢幕開關狀態 - + Security 加密 - - Downloader - - Updater - 更新 - - - X - X - - - Downloading updates - 下载更新 - - - Time remaining: 0 minutes - 还剩:0分钟 - - - Open - 打開 - - - Stop - 停止 - - - Time remaining - 剩餘時間 - - - unknown - 未知 - - - Error - 錯誤 - - - Cannot find downloaded update! - 找不到下载的更新! - - - Close - 确认 - - - Download complete! - 下载完成! - - - The installer will open separately - 安裝程式將單獨打開 - - - In order to install the update - 安装更新 - - - In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application - 要安裝更新,可能需要退出應用程序。 這是強制更新,現在退出將關閉應用程序 - - - Tip Info - 提示 - - - Click the "Open" button to apply the update - 按一下“打開”按鈕應用更新 - - - Are you sure you want to cancel the download? - 您想現在下載更新嗎? - - - Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application - 確實要取消下載嗎? 這是強制更新,現在退出將關閉應用程序 - - - of - ,总大小 - - - Downloading Updates - 正在下载更新 - - - Time Remaining - 剩餘時間 - - - Unknown - 未知 - - - about %1 hours - 約%1小時 - - - about one hour - 約1小時 - - - %1 minutes - %1 分鐘 - - - 1 minute - 1 分鐘 - - - %1 seconds - %1 秒 - - - 1 second - 1 秒 - - EAClock @@ -3586,13 +3448,6 @@ Number 數位 - - - - - T - - Min Mark @@ -3657,73 +3512,73 @@ EBase - + Area 區域(px) - + X - + Y - + W - + H - + Border 邊框 - - + + None - + Effect 特效 - + Rotate 旋轉 - + Blink 閃爍 - + Speed 速度 - + Slow - + Moderate - + Fast @@ -4143,113 +3998,113 @@ EPhoto - + Basic Properties 基本屬性 - + File 檔案 - + Select File 選擇檔案 - + Image Read Error 圖片讀取錯誤 - + Play Properties 播放管道 - + Play Duration 播放時長 - - + + s - + Enter Style 入場特效 - + None - + Alpha_In 淡入 - + Moving to left 連續左移 - + Moving to right 連續右移 - + Moving to top 連續上移 - + Move to bottom 連續下移 - + Zoom in 放大 - + Zoom in to left_bottom 左下角放大 - + Zoom in to left_top 左上角放大 - + Zoom in to right_top 右上角放大 - + Zoom in to right bottom 右下角放大 - + Rotate to right 向右旋轉 - + Rotate to left 向左旋轉 - + Enter Duration 特效時長 @@ -4577,19 +4432,19 @@ 播放次數 - + Video Transcoding - - + + Video Transcoding Progress 視頻轉碼進度 - - + + Error 錯誤 @@ -4648,90 +4503,75 @@ GenTmpThread - - Preparing ... - 準備中… - - - + MON 星期一 - + TUE 星期二 - + WED 星期三 - + THU 星期四 - + FRI 星期五 - + SAT 星期六 - + SUN 星期日 - + AM 上午 - + PM 下午 - + day - + hour - + min - + sec - - - Create json ... - 生成json… - - - - Scan program ... - 掃描節目… - ImgDlg - + Screenshot 螢幕截圖 @@ -4782,136 +4622,172 @@ MainWindow - + Language 語言 - + Help 幫助 - - + + Check for updates 檢查更新 - - + + firmware manager 固件管理 - - - Software Config - 軟件配寘 + + + + Preferences + 偏好設定 - - + + Info 資訊 - - - + + + About 關於 - - + + Setting 設定 - + Software Update 軟體更新 - + CurVersion 當前版本 - + Latest Version 最新版本 - + Update Log 更新日誌 - + The current version is already the latest version 已經是最新的版本 - + + Video compress to + 視頻壓縮成 + + + + Video transcoding to + 視頻轉碼成 + + + + Text antialiasing + 文字反鋸齒 + + + + TextAntilaTip + (提示:該選項適合小間距大尺寸的螢幕,選中此項,文字邊緣會有暗影已達到字體邊緣光滑的效果;小尺寸螢幕和單雙色螢幕不建議使用) + + + + Width Split + 超長屏打折 + + + + Hide Detect Button + 隱藏一鍵找卡 + + + + Show Lora Screen + 顯示光影屏 + + + Download 下載 - + Fail 失敗 - + Cannot Save File 保存檔案失敗 - - - + + + Downloading updates 下載更新 - + Error 錯誤 - + Device 設備管理 - + Program 節目管理 - + Control 終端控制 - - GuangYinPin + + Lora Screen 光影屏 - + Check card 一鍵找卡 - + Tip Info 提示 - + RestoreLedCardIpByUdpTip 該操作會把局域網內的所有與電腦IP不在同一網段的控制卡修復成固定IP,請謹慎操作! @@ -5035,84 +4911,84 @@ PageListItem - + times - + Page name 節目名稱 - + New 新建 - + Play times 播放次數 - + Sources Repeat 素材迴圈 - + Audios 音訊 - + Total Dur 總時長 - - + + s - + Select File 選擇檔案 - + Duration 時長 - + Vol 音量 - + Valid Date 有效日期 - - + + Warning 警告 - + Start Time can't be later than End Time 開始時間不能晚於結束時間 - + End Time can't be earlier than Start Time 結束時間不能早於開始時間 - + Plan 時間計畫表 @@ -5138,12 +5014,12 @@ PlayerBackSendThread - + Open file failed 檔案打開失敗 - + Read file failed 檔案讀取失敗 @@ -5202,197 +5078,197 @@ ProgEditorWin - + Save 保存 - + Setting 設定 - + Text 文字 - + Photo 圖片 - + Video 視頻 - + Gif 動畫 - + Clock 數位時鐘 - + Analog Clock 圓形時鐘 - + Environment 環境監測 - + Web 網頁 - + MuliContentWindow 多素材視窗 - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; 該視窗中可以加入多個不同是節目素材,並按照加入列表的先後順序播放 - + Timer 計時器 - + Demo Video 測試視頻 - + Play 播放 - + Stop 停止 - + Publish 發佈 - - - + + + Select File 選擇檔案 - + program 節目清單 - + Add page 添加頁面 - + Copy page 複製頁面 - + Delete page 删除頁面 - - + + Tip Info 提示 - + Are you sure you want to delete this program page? 確定要删除該節目頁嗎? - + Move up 向上移動一個頁面 - + Move down 向下移動一個頁面 - + widget properties 組件内容 - + Page properties 節目内容 - + Do you want to save the modifications? 是否保存修改? - + Create Dir failed 創建目錄失敗 - + Saving... 正在保存… - + Success 成功 - + Convertering 整理數據中 - + Generate preview data 生成預覽數據 - - - + + + Error 錯誤 - + Rename fail when saving - + Remove Recursively fail when saving - + Warning 警告 @@ -5401,129 +5277,129 @@ ProgPanel - + New 新建 - - + + Edit 編輯 - - + + Delete 删除 - - - + + + Import 導入 - - - + + + Export 匯出 - - + + Send 發送 - + Publish 發佈 - + Name 名稱 - - + + Choose Directory 選擇目錄 - + Tip 提示 - + The imported directory is already in the working directory, so there is no need to import it again! 該導入的目錄已經在工作目錄下,無需再次導入! - + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? :節目已存在。是否確實要覆蓋現有節目? - - + + Play 播放 - - + + Stop 停止 - + Resolution 分辯率 - + File Size 文件大小 - + Last Modify 最後修改時間 - + Usb playback U盤更新 - + Program name conflicted 節目名稱重複 - + Warning 警告 - + You will delete the selected solution(s),are you sure? 是否確認删除選中的節目? - - + + Tip Info 提示 @@ -5531,17 +5407,17 @@ ProgPortDlg - + Solution Name 節目名稱 - + Progress 進度 - + Done 完成 @@ -5549,13 +5425,13 @@ QObject - + Setting up the LedOK Express... 初始化LedOK Express… - + Input password 輸入密碼 @@ -5581,46 +5457,46 @@ 密碼錯誤 - - + + ExportButtonTip U盤播放 - + Usb upgrade program U盘更新节目 - + Password 密碼 - - + + Convertering 整理數據中 - - + + Tip 提示 - + No checked USB device 未檢查USB設備 - + please select usb device in list 請在清單中選擇usb設備 - - + + SendButtonTip 發佈 @@ -5713,68 +5589,6 @@ 總數 - - SoftConfigDialog - - - Software Config - 軟件配寘 - - - - Video compress to - 視頻壓縮成 - - - - Video transcoding to - 視頻轉碼成 - - - - Text antialiasing - 文字反鋸齒 - - - - TextAntilaTip - (提示:該選項適合小間距大尺寸的螢幕,選中此項,文字邊緣會有暗影已達到字體邊緣光滑的效果;小尺寸螢幕和單雙色螢幕不建議使用) - - - - GuangYinPin - 光影屏 - - - - Width Split - 超長屏打折 - - - - OK - 確認 - - - - Updater - - Would you like to download the update now? - 您想現在下載更新嗎? - - - Would you like to download the update now? This is a mandatory update, exiting now will close the application - 您想現在下載更新嗎?這是強制更新,現在退出將關閉應用程序 - - - No updates are available for the moment - 暫時沒有可用的更新 - - - Congratulations! You are running the latest version of %1 - 祝賀你!您正在運行最新版本的%1 - - UpgradeApkDialog @@ -5793,12 +5607,12 @@ 陞級 - + Uninstall 卸載 - + check running state 檢測運行狀態 @@ -5808,98 +5622,98 @@ 選擇FPGA檔案 - + Installing 正在安裝 - + Refresh 檢測 - + Cancel 取消 - + Screen ID 螢幕ID - + Remark Name 別名 - + Online 線上 - + Screen IP 螢幕IP - + Security 加密 - + Progress 進度 - + xixunplayer - + cardsystem - + taxiapp - + starter - + connection - + displayer - + FPGA FPGA - + update 更新 - + State 陳述 - - + + All 總數 @@ -5942,7 +5756,7 @@ - + Tip 提示 @@ -5958,93 +5772,98 @@ - + Downloading Online File 正在下載線上檔案 - - + + Error 錯誤 - + Online file is empty 線上檔案為空 - + Uploading - + Upload error 上傳錯誤 - + + Don't power off during this process + 陞級過程中請勿斷電 + + + Install error 安裝錯誤 - + Install success 安裝成功 - + Reminder 提示 - + Reminder: Uninstalling this program may cause the device to offline, cannot be found, lost configs and have a black screen. Please uninstall with caution! 提示:卸載此程式會導致平臺掉線,找不到設備,配寘參數遺失和黑屏問題,請謹慎卸載! - + Do you want to continue? 是否繼續? - + Uninstalling 正在卸載 - + Uninstall error 卸載錯誤 - + Uninstall success 卸載成功 - + Check apk running status 監測APK運行狀態 - + Check error 檢查錯誤 - + Running 正在運行 - + Not running 沒有運行 - + The encrypted control card can be upgraded directly 加密控制卡可以直接陞級 @@ -6052,7 +5871,7 @@ WaitingDlg - + Success 成功