From 13ad4ec75f8e10ad684aa10063bbdb6086216b6a Mon Sep 17 00:00:00 2001 From: Gangphon Date: Tue, 1 Aug 2023 11:42:41 +0800 Subject: [PATCH] ledok --- LedOK/LedOK.pro | 13 +- LedOK/base/customprogressindicator.cpp | 137 -- LedOK/base/customprogressindicator.h | 116 -- LedOK/base/loemptydialog.cpp | 78 - LedOK/base/loemptydialog.h | 37 - LedOK/base/softconfigdialog.cpp | 54 - LedOK/base/softconfigdialog.h | 15 - LedOK/base/waitingdlg.cpp | 137 +- LedOK/base/waitingdlg.h | 28 +- LedOK/basewin.h | 4 +- LedOK/{res => }/borders/M1_0.bmp | Bin LedOK/{res => }/borders/M1_1.bmp | Bin LedOK/{res => }/borders/M1_2.bmp | Bin LedOK/{res => }/borders/M1_3.bmp | Bin LedOK/{res => }/borders/M1_4.bmp | Bin LedOK/{res => }/borders/M1_5.bmp | Bin LedOK/{res => }/borders/M1_6.bmp | Bin LedOK/{res => }/borders/M1_7.bmp | Bin LedOK/{res => }/borders/M1_8.bmp | Bin LedOK/{res => }/borders/M2_0.bmp | Bin LedOK/{res => }/borders/M2_1.bmp | Bin LedOK/{res => }/borders/M2_2.bmp | Bin LedOK/{res => }/borders/M2_3.bmp | Bin LedOK/{res => }/borders/M2_5.bmp | Bin LedOK/{res => }/borders/M2_6.bmp | Bin LedOK/{res => }/borders/M2_7.bmp | Bin LedOK/{res => }/borders/M2_8.bmp | Bin LedOK/{res => }/borders/M3_0.bmp | Bin LedOK/{res => }/borders/M3_1.bmp | Bin LedOK/{res => }/borders/M3_2.bmp | Bin LedOK/{res => }/borders/M3_3.bmp | Bin LedOK/{res => }/borders/M3_4.bmp | Bin LedOK/{res => }/borders/M3_5.bmp | Bin LedOK/{res => }/borders/M3_6.bmp | Bin LedOK/{res => }/borders/M3_7.bmp | Bin LedOK/{res => }/borders/M3_8.bmp | Bin LedOK/{res => }/borders/M4_0.bmp | Bin LedOK/{res => }/borders/M4_1.bmp | Bin LedOK/{res => }/borders/M4_2.bmp | Bin LedOK/{res => }/borders/M4_3.bmp | Bin LedOK/{res => }/borders/M4_4.bmp | Bin LedOK/{res => }/borders/M4_5.bmp | Bin LedOK/{res => }/borders/M4_6.bmp | Bin LedOK/{res => }/borders/M4_7.bmp | Bin LedOK/{res => }/borders/M4_8.bmp | Bin LedOK/{res => }/borders/M5_0.bmp | Bin LedOK/{res => }/borders/M5_1.bmp | Bin LedOK/{res => }/borders/M5_2.bmp | Bin LedOK/{res => }/borders/M5_3.bmp | Bin LedOK/{res => }/borders/M5_4.bmp | Bin LedOK/{res => }/borders/M5_5.bmp | Bin LedOK/{res => }/borders/M5_6.bmp | Bin LedOK/{res => }/borders/M5_7.bmp | Bin LedOK/{res => }/borders/M5_8.bmp | Bin LedOK/{res => }/borders/M6_0.bmp | Bin LedOK/{res => }/borders/M6_1.bmp | Bin LedOK/{res => }/borders/M6_2.bmp | Bin LedOK/{res => }/borders/M6_3.bmp | Bin LedOK/{res => }/borders/M6_4.bmp | Bin LedOK/{res => }/borders/M6_5.bmp | Bin LedOK/{res => }/borders/M6_6.bmp | Bin LedOK/{res => }/borders/M6_7.bmp | Bin LedOK/{res => }/borders/M6_8.bmp | Bin LedOK/{res => }/borders/M6_9.bmp | Bin LedOK/{res => }/borders/M7_0.bmp | Bin LedOK/{res => }/borders/M7_1.bmp | Bin LedOK/{res => }/borders/M7_2.bmp | Bin LedOK/{res => }/borders/M7_3.bmp | Bin LedOK/{res => }/borders/M7_4.bmp | Bin LedOK/{res => }/borders/M7_5.bmp | Bin LedOK/{res => }/borders/M7_6.bmp | Bin LedOK/{res => }/borders/M7_7.bmp | Bin LedOK/{res => }/borders/M7_8.bmp | Bin LedOK/{res => }/borders/M8_0.bmp | Bin LedOK/{res => }/borders/M8_1.bmp | Bin LedOK/{res => }/borders/M8_2.bmp | Bin LedOK/{res => }/borders/M8_3.bmp | Bin LedOK/{res => }/borders/M8_4.bmp | Bin LedOK/{res => }/borders/M8_5.bmp | Bin LedOK/{res => }/borders/M8_6.bmp | Bin LedOK/{res => }/borders/M8_7.bmp | Bin LedOK/{res => }/borders/M8_8.bmp | Bin LedOK/{res => }/borders/M9_0.bmp | Bin LedOK/css.css | 5 +- LedOK/device/ctrladvancedpanel.cpp | 517 +++-- LedOK/device/ctrladvancedpanel.h | 8 +- LedOK/device/ctrlbrightpanel.cpp | 2 +- LedOK/device/ctrlbrightpanel.h | 2 +- LedOK/device/ctrlnetworkpanel.cpp | 2 +- LedOK/device/ctrlnetworkpanel.h | 2 +- LedOK/device/ctrlpwdpanel.cpp | 2 +- LedOK/device/ctrlpwdpanel.h | 2 +- LedOK/device/ctrltestpanel.cpp | 2 +- LedOK/device/ctrltestpanel.h | 2 +- LedOK/device/ctrlverifyclockpanel.cpp | 2 +- LedOK/device/ctrlverifyclockpanel.h | 2 +- LedOK/device/upgradeapkdialog.cpp | 7 +- LedOK/device/wupgradeapkitem.cpp | 8 +- LedOK/devicectrlpanel.cpp | 144 -- LedOK/devicectrlpanel.h | 34 - LedOK/deviceitem.cpp | 19 +- LedOK/devicepanel.cpp | 155 +- LedOK/devicepanel.h | 14 +- LedOK/globaldefine.cpp | 3 +- LedOK/globaldefine.h | 3 +- LedOK/gutil/qgui.h | 12 + LedOK/main.cpp | 9 +- LedOK/mainwindow.cpp | 217 ++- LedOK/mainwindow.h | 17 +- LedOK/player/playwin.cpp | 2 +- LedOK/progpanel.cpp | 19 +- LedOK/progpanel.h | 6 +- LedOK/program/eaclock.cpp | 6 +- LedOK/program/ebase.cpp | 12 +- LedOK/program/ephoto.cpp | 14 +- LedOK/program/evideo.cpp | 24 +- LedOK/program/gentmpthread.cpp | 94 +- LedOK/program/gentmpthread.h | 1 - LedOK/program/progeditorwin.cpp | 15 +- LedOK/program/progitem.cpp | 7 +- LedOK/program/videosplitthread.cpp | 9 +- LedOK/program/wprogrampublishitem.cpp | 10 +- LedOK/res.qrc | 101 +- LedOK/res/AppSetting.png | Bin 921 -> 709 bytes LedOK/res/AppSettingTip.png | Bin 3691 -> 3436 bytes LedOK/res/{device => }/DeviceNum_All.png | Bin LedOK/res/{device => }/FlashArrow.png | Bin LedOK/res/{device => }/Lock.png | Bin LedOK/res/Logo.icns | Bin 142538 -> 0 bytes LedOK/res/Lora.png | Bin 7704 -> 0 bytes LedOK/res/{device => }/O_Offline.png | Bin LedOK/res/{device => }/O_Online.png | Bin LedOK/res/{device => }/UnLock.png | Bin LedOK/res/Warning.png | Bin 690 -> 0 bytes LedOK/res/apk.png | Bin 8953 -> 0 bytes LedOK/res/backup/AdvanceManager_s.png | Bin 2054 -> 0 bytes LedOK/res/backup/AdvanceManager_u.png | Bin 2146 -> 0 bytes LedOK/res/backup/Checked11.png | Bin 473 -> 0 bytes LedOK/res/backup/DeviceManager_s.png | Bin 1775 -> 0 bytes LedOK/res/backup/DeviceManager_u.png | Bin 1936 -> 0 bytes LedOK/res/backup/DeviceSetting_s.png | Bin 2669 -> 0 bytes LedOK/res/backup/DeviceSetting_u.png | Bin 2697 -> 0 bytes LedOK/res/backup/ProgramManager_s.png | Bin 1289 -> 0 bytes LedOK/res/backup/ProgramManager_u.png | Bin 1224 -> 0 bytes LedOK/res/backup/Warning.png | Bin 602 -> 0 bytes LedOK/res/{device => }/bnDetail.png | Bin LedOK/res/device/Add.png | Bin 215 -> 0 bytes LedOK/res/device/DeviceNum_Offline.png | Bin 1490 -> 0 bytes LedOK/res/device/DeviceNum_Online.png | Bin 1520 -> 0 bytes LedOK/res/device/DeviceNum_Unlogin.png | Bin 1562 -> 0 bytes LedOK/res/device/Equal.png | Bin 118 -> 0 bytes LedOK/res/device/O_Unlogin.png | Bin 332 -> 0 bytes LedOK/res/{device => }/deviceReadbackPic.png | Bin LedOK/res/ledset.png | Bin 3973 -> 0 bytes LedOK/res/success - 副本.png | Bin 30344 -> 0 bytes LedOK/res/success.png | Bin 15750 -> 0 bytes LedOK/res/tip.png | Bin 12377 -> 0 bytes LedOK/tools.h | 5 - LedOK/translations/app_en.ts | 1633 ++++++++-------- LedOK/translations/app_ja.ts | 1771 ++++++++---------- LedOK/translations/app_zh_CN.ts | 1771 ++++++++---------- LedOK/translations/app_zh_TW.ts | 1771 ++++++++---------- 162 files changed, 4066 insertions(+), 5016 deletions(-) delete mode 100644 LedOK/base/customprogressindicator.cpp delete mode 100644 LedOK/base/customprogressindicator.h delete mode 100644 LedOK/base/loemptydialog.cpp delete mode 100644 LedOK/base/loemptydialog.h delete mode 100644 LedOK/base/softconfigdialog.cpp delete mode 100644 LedOK/base/softconfigdialog.h rename LedOK/{res => }/borders/M1_0.bmp (100%) rename LedOK/{res => }/borders/M1_1.bmp (100%) rename LedOK/{res => }/borders/M1_2.bmp (100%) rename LedOK/{res => }/borders/M1_3.bmp (100%) rename LedOK/{res => }/borders/M1_4.bmp (100%) rename LedOK/{res => }/borders/M1_5.bmp (100%) rename LedOK/{res => }/borders/M1_6.bmp (100%) rename LedOK/{res => }/borders/M1_7.bmp (100%) rename LedOK/{res => }/borders/M1_8.bmp (100%) rename LedOK/{res => }/borders/M2_0.bmp (100%) rename LedOK/{res => }/borders/M2_1.bmp (100%) rename LedOK/{res => }/borders/M2_2.bmp (100%) rename LedOK/{res => }/borders/M2_3.bmp (100%) rename LedOK/{res => }/borders/M2_5.bmp (100%) rename LedOK/{res => }/borders/M2_6.bmp (100%) rename LedOK/{res => }/borders/M2_7.bmp (100%) rename LedOK/{res => }/borders/M2_8.bmp (100%) rename LedOK/{res => }/borders/M3_0.bmp (100%) rename LedOK/{res => }/borders/M3_1.bmp (100%) rename LedOK/{res => }/borders/M3_2.bmp (100%) rename LedOK/{res => }/borders/M3_3.bmp (100%) rename LedOK/{res => }/borders/M3_4.bmp (100%) rename LedOK/{res => }/borders/M3_5.bmp (100%) rename LedOK/{res => }/borders/M3_6.bmp (100%) rename LedOK/{res => }/borders/M3_7.bmp (100%) rename LedOK/{res => }/borders/M3_8.bmp (100%) rename LedOK/{res => }/borders/M4_0.bmp (100%) rename LedOK/{res => }/borders/M4_1.bmp (100%) rename LedOK/{res => }/borders/M4_2.bmp (100%) rename LedOK/{res => }/borders/M4_3.bmp (100%) rename LedOK/{res => }/borders/M4_4.bmp (100%) rename LedOK/{res => }/borders/M4_5.bmp (100%) rename LedOK/{res => }/borders/M4_6.bmp (100%) rename LedOK/{res => }/borders/M4_7.bmp (100%) rename LedOK/{res => }/borders/M4_8.bmp (100%) rename LedOK/{res => }/borders/M5_0.bmp (100%) rename LedOK/{res => }/borders/M5_1.bmp (100%) rename LedOK/{res => }/borders/M5_2.bmp (100%) rename LedOK/{res => }/borders/M5_3.bmp (100%) rename LedOK/{res => }/borders/M5_4.bmp (100%) rename LedOK/{res => }/borders/M5_5.bmp (100%) rename LedOK/{res => }/borders/M5_6.bmp (100%) rename LedOK/{res => }/borders/M5_7.bmp (100%) rename LedOK/{res => }/borders/M5_8.bmp (100%) rename LedOK/{res => }/borders/M6_0.bmp (100%) rename LedOK/{res => }/borders/M6_1.bmp (100%) rename LedOK/{res => }/borders/M6_2.bmp (100%) rename LedOK/{res => }/borders/M6_3.bmp (100%) rename LedOK/{res => }/borders/M6_4.bmp (100%) rename LedOK/{res => }/borders/M6_5.bmp (100%) rename LedOK/{res => }/borders/M6_6.bmp (100%) rename LedOK/{res => }/borders/M6_7.bmp (100%) rename LedOK/{res => }/borders/M6_8.bmp (100%) rename LedOK/{res => }/borders/M6_9.bmp (100%) rename LedOK/{res => }/borders/M7_0.bmp (100%) rename LedOK/{res => }/borders/M7_1.bmp (100%) rename LedOK/{res => }/borders/M7_2.bmp (100%) rename LedOK/{res => }/borders/M7_3.bmp (100%) rename LedOK/{res => }/borders/M7_4.bmp (100%) rename LedOK/{res => }/borders/M7_5.bmp (100%) rename LedOK/{res => }/borders/M7_6.bmp (100%) rename LedOK/{res => }/borders/M7_7.bmp (100%) rename LedOK/{res => }/borders/M7_8.bmp (100%) rename LedOK/{res => }/borders/M8_0.bmp (100%) rename LedOK/{res => }/borders/M8_1.bmp (100%) rename LedOK/{res => }/borders/M8_2.bmp (100%) rename LedOK/{res => }/borders/M8_3.bmp (100%) rename LedOK/{res => }/borders/M8_4.bmp (100%) rename LedOK/{res => }/borders/M8_5.bmp (100%) rename LedOK/{res => }/borders/M8_6.bmp (100%) rename LedOK/{res => }/borders/M8_7.bmp (100%) rename LedOK/{res => }/borders/M8_8.bmp (100%) rename LedOK/{res => }/borders/M9_0.bmp (100%) delete mode 100644 LedOK/devicectrlpanel.cpp delete mode 100644 LedOK/devicectrlpanel.h rename LedOK/res/{device => }/DeviceNum_All.png (100%) rename LedOK/res/{device => }/FlashArrow.png (100%) rename LedOK/res/{device => }/Lock.png (100%) delete mode 100644 LedOK/res/Logo.icns delete mode 100644 LedOK/res/Lora.png rename LedOK/res/{device => }/O_Offline.png (100%) rename LedOK/res/{device => }/O_Online.png (100%) rename LedOK/res/{device => }/UnLock.png (100%) delete mode 100644 LedOK/res/Warning.png delete mode 100644 LedOK/res/apk.png delete mode 100644 LedOK/res/backup/AdvanceManager_s.png delete mode 100644 LedOK/res/backup/AdvanceManager_u.png delete mode 100644 LedOK/res/backup/Checked11.png delete mode 100644 LedOK/res/backup/DeviceManager_s.png delete mode 100644 LedOK/res/backup/DeviceManager_u.png delete mode 100644 LedOK/res/backup/DeviceSetting_s.png delete mode 100644 LedOK/res/backup/DeviceSetting_u.png delete mode 100644 LedOK/res/backup/ProgramManager_s.png delete mode 100644 LedOK/res/backup/ProgramManager_u.png delete mode 100644 LedOK/res/backup/Warning.png rename LedOK/res/{device => }/bnDetail.png (100%) delete mode 100644 LedOK/res/device/Add.png delete mode 100644 LedOK/res/device/DeviceNum_Offline.png delete mode 100644 LedOK/res/device/DeviceNum_Online.png delete mode 100644 LedOK/res/device/DeviceNum_Unlogin.png delete mode 100644 LedOK/res/device/Equal.png delete mode 100644 LedOK/res/device/O_Unlogin.png rename LedOK/res/{device => }/deviceReadbackPic.png (100%) delete mode 100644 LedOK/res/ledset.png delete mode 100644 LedOK/res/success - 副本.png delete mode 100644 LedOK/res/success.png delete mode 100644 LedOK/res/tip.png 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 72a51232c34d2d5db79c6c71e420b2545a7916fd..92277e86d4691b738a2236c90a171057a067c87a 100644 GIT binary patch delta 686 zcmV;f0#W^$2gL=DBYyzlX+uL$b5ch_000=3V_;xB%>V>U4h#&rc_l?b?oJ93kx>c^ zNFXt}xPSpSU}RwUb`3-_FkIFREMa5CqZS+BECN~xq(1<$NIIC!$O2*~LD&)?c6mub z36QM=VkZ|Af!IJ7Gw>9J1UUoQK0vlYIubhxiJg*KoD5{=0Dsx>2*2geXJD}S!oa{h z5h0c|je%i%I|GBn9fX+5LIwu@RtAP`ml0y0{lWfa6gyOsT2TTL@zZx?C`c?y1WPl6 z0yHg+f#K6~1_s_p1_t2^3=CY+5O;t9YcVjONem}K003p7HhUkG$I$=)010qNS#tmY z9fkk^9fkp2qJI;C0004sNklIp>U-O+=cCQc5Nw)u&V* zW9+Lg4u7?DL`uns$eeRE=6Xm7BEm2Xefcji48w(p;GC?%dG8H)@a)_w zGutCU1Aph7jpNwa3s0}-7yrf8dk-SQnR7&hZQB~>7^CH!!OV?aL`+qiZFe(EDOGY$ z(_|q8>lW}xb}j}0uq?~dS$gm5mXFIgbYjc0RD0!N;nSIm>$+Cn?fZVt*Tr0q&Z>$} zuU-*}4n-Uak>3#qX70qHldpAM>%IO>zH-jUIVU58@LaxLwS<$vzB`VW`1BX>4Q{t7 U#y~QLUjP6A07*qoM6N<$g5aYlIRF3v delta 899 zcmV-}1AP3&1(^qsBYy*6NklNO=H=K+d7z43gn=`{W z+8565d>_tv&gc7_5EfLs-ChzxXmz{Y9$>faTect8bqmd0`y<<@fD4k2r<69%7i~37vmQ7G+_inj_C;XQ_6^%(Ip^g$=jFD? zY~KJTtMC+X7k@a`G|l=DLMwz2dVtNqSzy}sVM(1*$_`1dH%+rG2 zI8uAgN!k)Z=m{Z&R?c}fFab-EOxh#@Jg=_%kq(b6!0+dXl!-K3DxYGBPq!>WDoudQH=;DWz-&c2=Jc*T*;u zYC zi?4+NyEUaWRFN11?#~O@8Q{HAN`EQk#Zt=l{|nf;ntiEi`r8%oxi7%>X#E0O^}Bea Z{sY_@ik11&g!lje002ovPDHLkV1i{fvgiN+ diff --git a/LedOK/res/AppSettingTip.png b/LedOK/res/AppSettingTip.png index f791c3a493ab9f8cdc9d1ceb442318d2397d62bf..9da9d4d6242f1005fe485d3d8173c4b4b3874fcc 100644 GIT binary patch delta 3414 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

sl>D=cmW!uwcT=)v(u;En|v+Ah~(sAU_o> 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 V5h#vd`e(iY%JLd=l`@uL{{d%;ybu5Y 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 10788d90ccb822068ca026ebaffd0e1868792f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmV;j0!{siP)goSGq!L4mfXLWEVVsX`q`P@K zIYACii%%P|5Mq;rw=eHyv$}%94ZJGzX1J#P+ObrC?(9Tfmxo71d3aQmC-T|`Cf<*8g}G_`;fu@fqX+y` zgjrdi$1g8iAd(#X+u2AN153Jb`u6i95oKR>=k)rY=2_3PA%vA$955cwiE6!>-P&95W|?YPi%T zm^&4TNQ7CT*WU}+`Of7U(_Srl$?*GRfQU#;c&4Sl6RcD?-bQR9YI;B~##Uu0hG7N~ zo%>z7`pY^~aF(h@Tl7LpM7QqpXq$7RBRXG}4j|Sp6rIXF#F#0ar6QtM8JwgM(JH7K zQXwX6Wwt@S?jB&E)=AUq;kJRK4}yFB!hA6^k%StEkOA0$Z8i0m8E_p{MV@eAAuZzRy3Nyt@2o>iv;(T})2MYAL<< z{6l%?>HG58>rd@{P$Avxc3h>m1;mUvQAl^*0e6-9heYO>$u*{OjcN6B(tq!}k$**g Y0jqgY*_}XOKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z7$!+XK~#9!SvLdB&p+|F*?yJrY z%ksYdf%y~TQ!oBi0I+mh-oNwRZ6?O2$tw3HNw|g#u{~L}4&=&qP}b;7W$PZqhJDoP z51_Jm(b#nbRa;7uLYp0~)aC_Cq_qcH+uGOabf%>?+xW}>VF28`HSwag$NKK%)Fd}< z+(OonMt<#a1fm^e%QjQdyqk*Foz&_NQ)fAf%Ib;I;z51y36xfMQel{ZuyXr$psOR*eIh zwcn6fww}bY^;|7oLwxB<;)?9JTC|x$@!1ZArub}Ur+)e1;P5NY9l+Go=EP64VeUy2ki zq>9#&RJo40;#FKNT~BiPMv^MNBBk7(qlFVhZetD_u^S$R2@sEBW$0RA}8OYjB~i`ylEb zPpm_7XS1nq$#Vm6_|)eViq0cxyo_-$lhJz;rXEX}e4t|Fo)FvJQo2U7Fxpa4o5GN` zUZ7m%ji||!N~J$yO&Ah&D%#FsbS5SJ{XIOG`2)Xw{J$9;oj|V6Be`@Zf*N}&w62sl zx*}?KrM~w#*4vlqn+alcruKkd-?jAl064RlJmGnytwFT*#&B&qkKvhOZ1;+=-793` zfr810b=-KYX8Jc8Zah{n{ohp#->qWkyJC7KvuN*+qrnnJZSy$_A8Iw+rxBhkK^bYle$7FnhbnG7(s1)}12-P4 zn0j2t*i1D;-<4q=OQNYalp@(N^2A3mbj$eX{{=ITCg~hMgMK`K>oW-qKTe_N&Si`f zA#{$OLvQF7UMI=zbPMGe6dkf&2u@y;{caOS$n# z!;MF3rXH!7dZb|Feks$b$zXIN!88wg(=vDp zS?3wr+st-z3gA-Ip5NzId7%Uyij#sp}qeq{nJ?t-p%}10r*)U_XM*r?iMmKBV_V{lF0{3CLUGOGbx}z=7Qd= zX7Ktn8p9Q2T?Y|$?5DiZmGTA`3Y6c{+0ngx&H%)u`dU+qjy?&2|GOFRr(w*7%h0`S z#_o%`@u-2x$2Ig$=95$HMu$O-rK_JxwGS2AeN<@OC{#F;Bil-SQ}Nk30}z+yXHLvJ zjK&a8dtW?#H*>Jv&t_;Q`nonbyh~@gd6#BnQ!gfE8 z;Rm_s1`;va5*dDw^B2vCp?f)u+!HeXn%m;RBVhDl9>e!@ z8MvFx;7mHU2ie$uCS+{CSV=M%zF)w#+u5X*?O||m2$3R|RN)4aD%TTTyqwEftLf|Q zUoa;C%Ec*3Cj%E#rtqP*<0SggAoOEFblnW4`&KyJx5Lqo2BYpfPD76$+P({Dx-X!! zMWP#u#bnE%Yb=?8JJ}4~n=PT&?_^;bNoMf7pHHR(cLfYT$fHv2OMO#0jm>q$7Of(x zU+N73{jr)BUIoulV4j6`7=PM~{2fbD)Z=8-fyM=#NHL-30sG5RQndP67` zl2|NOBf+W5iOgL|RNg8=GL~U7bC93Pqs| zjr0HnoptRBsHzR=tl!FjYnab4yXIpWts+j zsqa0E_PRF>{U=cM9;RjJ6phzT(q=nD<26sT*S*kQ_e9<6LCcUgox_22PbM>T?`akJ zaVQLYm&x#h91Nq8MTdlUO$2MnjgBc0RHelev7<&AF^&&WEN*6UCzk6-Kg(7il*-v zDys*|UN>6%VzA8={K?8-7>=i~I+%Mix4D@79-)Gzgl2w3K;kk+Mn_+ov!}u?K5vjE zJVtHvMRcQqblsdye%d~N)P09(?Ds{}e~5;DZvbSL-PD?$k#y}v(zTBolQT6YXN3B# z)R=ZqXWfUYcR#JygRwox`q7%=SqMDHK|c~fkuZik-`(U=%KL<5envprVj^?w7#W$I zI{@Dve2x5?6NsBnqaO{#G98IwJQ#JiAKHOq)b}2z#=HlS!4a8dAJxWP&rH{toT)YM zrP}C-VKfqeYU2)SyPS}jj$jxMVd#Duwwati0?=_iigIZ-?qa*cw z#{iI+cT;89fx_xaL(gd}(;@WSiNQ9L`z$XEKg^-EFOurIWTtLR;GeLFpp1{Xl=1} zwb2o=X%`~H4n&5XlA4e&?SAI>0Qw`Tu1jTV+Qzwr z1q5Y$Oknzl#O6B8Edb98>q##?N_C4j%D%lQd-tNSxFgY@puYDYbv-V~tWHl%IZ~zn zmTKcJ#HL+O%zK$U(wBEz>->9_x=FE%-%ww%W_^`x>)1!J5F z!gfCkjVTO8V<8h$HvFRJ6OgimvvF^eQsOoJ&>_gc*d%aNaK$U*mk01zjTakAi!Y~$! zaWVw`STLO*;FmQ~sY;s4cJA%~ghTOWF z8uL!73=RnOTak4gq;=pD=E*R0W0&X{xj@@c0F{kLFm$OHuyx~k`4uiEE#_48e6or| zYv&X|dTxk3La>2yl@ImT_EV+*mfEgeR5b0UzV8@K174_my=WTnrg^}dhJGJZ))Pq0 z2N0WfBeCp3-m@EtX+JeOH!2(5sMNY4YCS}aaWD0K2dMA%MrHLxVfI4P=S9o)K(gyL z(x#WuKcvMs`VG#K-pt-QLu9`=Bs;qU=73w0kdN(@w-DC*;;$)EM_t(dbIKb{}Q+ z$B}m(pw7AvVWS5si#MslEofV7F?KcK9r+sm2_NDU^#+xagzPy5P%X`j^b7lfGQ}wr zea=s^xdUaI11POWQ1^JFw0NQD@<3&oHLmPBiPGXpo!R3_#c)T_eGEm9E6QFsWS0F@ z8+RfyZKp=JpR$I%h)lCpLeb-bxal0pm7D17lG0(4;}tQFb8#Qw6)}%;;T%2^170xo z%AGv}ms74hg}mn}fNhjF97NjXMxFU2b!HEg7Ecsr4`ikzNDar48jmA2x+6CqN7=U@ zW$&!{x*pdjOXR)CtS*#lohWPCji}v)YMnFUE=Lr`vqWUAz}O=}-7LcQ%Io+ie28E4 zJQS+h19J*sz}Bm9rb^k!WwU+Rwt_T+o?8gCr>`RrmyR9 zL2h-S&gz1y&yCuyy;O93gUGNQq0WJ_w#}5aZK1MrE0vvFDR19GdHWVhS~gLs`-TFQ z1BL2s)O0yg(fJMKZQBsFxN|;!5!Y>IYSqbjN4$aGmG|(8SV%{QarvAA0A6tQSwwF2 zF>1S=5b7MLHhoK>(h*s=GqUdeNV@h>+vSW<_bnA2-%#HE%PMW%Oz9ISW$l~EQ*5P3 zYfoj{PD)xgA=2-ns_6))uDnP8^=>L9$#_TpJ?G=!$2;OJbUMS*IS1f&Y9VRG$B8XJnypluwo_x;Lyc(CdR7c{7ELn<#DBOjg|n@>H|HN?PoxY~N04 z{bAgL=P^1uL}pPa-jVb1i(16Vu!Zzkhu)oY0DDfnO=8{wYD`X)w%SwLYEQa&Hm*gw z-ITW4&zf!BOmUO_v$mvp)@*UJJ%x>%C~4kIk#-YBT6+o_Hd5Sdk3jM@d77^&ZnCGa zaU){$P73N=ICyRz6JvKsFFb=!$h4h^^s^&f+OnCH zs*RMkZla=fCxwk0e`N0acGhT-)}G>~*?vL8rYHSP6lph+A=!XHx{-p04HPtdjYzkP zT=`B8oqLO^@fl(=cjFti5Z}mm@r(GF@rfHR&N%@8h^>TP-9crWBSqSclr-CuBHTow z_RAlQ=u?AFRoJ+Re9eYuDr~g>$?-;#M9axl*;CN)HF@fUHF6HXt@Tl2W!EXRp_|ee-t&C)?o@ z`3~NZZ*eKcfzh$?xd-4MzUTJ=314z0$DY#GuPJWcNL+~>S*kS@X*WMJlvBTU*4R^{ zny<*IUq`;?t7ppn!Evs74ber*5y;n(r(RFCY7N!Kom?&2j*Iu3%-s1M=VCv{H|kwH z!e1pQ#`*Vi`hvt$Wfcc#&d07KIMJTik`-jgR&z0NDVd7ZbIPWUWWJOMfgO$ zNkD|_%yR)yTAe63c6J%z8D9~a{smzfD+su1N2+usd73Yunalf$$*0PxU;C_ms%+I7 z@*36=l>RY^)nAaSUQ3qJjvBKQ!O3embow2>yYm}PUHK5tu(vsR`4xg9+{c~^fWoS{ z{NoqjMC4) z-{!{T1Kclth}Y%$c!a;omE`9HpiW)x?RIJ*0asUZK7I)SDT_HB{XX&KUy!F+_eaLE zl&k+p{~7>UDmz5&d%2Xjl%r=pV`}_99-(jI75*0PVZSEkYLN1|0I-djmpB}Fl?(C9 zIUTcz^YI_x75+9+1)r1Guq>cGBPra zd*DKRqu${}_}`J7?ce%b01Vo!@2+zAPaHn;1t){w$1mzVyu&`=%+)t3Y5npSjsKFK zUX!a?OK|35q6$AHSG|@@#j0ljJT891z_m$^2fo3{&;=X~dWnpj*!<@L0C*wfvVZH2 zg9~u>dW+-dKjB2+haB`111ZBO) zA^$fhZQDS$$_{a-3+LlM=4{wTdb)>j4_ttE#5)`d{%@pY1!$fdfFax9D{^VQOIlVm zNBlOj&-+dG`@Ms!&$~Dsewz!a?~+}=noPxN1a+&(R;_+E_0yy)5!9_BOSzg1`D`nw zTScyBEg?DY+h;MWMvSjOoq9}y6>2W@i$M*?2O zCt?u?Fa2lAt8y3|9DKz#Y0g0rRj1n*Qo%omo zr#`_m=yMKuEvK|)3k7O>a+Dj$R;?nl{tI%|YY51Chocu?dj{ZK%reeIe@u9?0}8c- zV}bMV41bG57k-VnrjowC{`t>+2K-bLQ)9nUs_L8)6R!%QV`7V{gtas`bs!R#aWUAN zJ;y&pp!l4!rtOq!_9BpM#_#e=bVmSLPY8=L^Wj` z4gNJ=;fpwY;dQEnH6DXQgRlI%1Movl-WYkQP9b%PPe{m)jg8B%sxGIs*+{J-i}<`f z#8rMwZ26~nUHXck_-zDV-HLzgN_@jV!!!I%E+wqtbo2+rXC0-yq6GKgdAOc^nX1~n z;KZb4!E;T5e+~?(OyZK1lqiUbiYqHC6`@kJP$e$H*Z%;n-k;%q;S>C$HxQDzjiC7L zTu$ANZ}>-C%{)!Hun3nk|CNlwa~&xu$*Ip}=jgvZjHJ{nS7OVALJOk9yr zC_<^!kXw|D?|B!t9b8C!N-(N=C8-&Sg5lxem;R~%{7_>PBQHti5|`xUq}0f$sLF~8 zp|@OCk3uOWD=RZnXV5MExA>m_Fq@op`p)H5BB4i0YD$tsCUJT0yT|`p^nV5b$P%!9 TUBNX;00000NkvXXu0mjfiKm$u diff --git a/LedOK/res/backup/AdvanceManager_s.png b/LedOK/res/backup/AdvanceManager_s.png deleted file mode 100644 index ef3804f4ea47eb796b5771a751ccaafbe3008212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2054 zcmV+h2>JJkP)701VROT3Rc*Cn*2s?s`bNQDF z<-nEx$_L*Y?QibA=P~+^VI)T5ksD1MzDH^PmZ@Vu1>`3)r0xBn?L80~zTb%U-;h{l zHuWtBvcCgl?*)?mbJmqh+TIVE_nF896#ud>Y~OAePL+`{8jtvc$lm~p#{lI`MRHCN zUzj75vx>Oi7a3TQcvwM-Jp{zZ6!K)wHD#4dDwGLDG7cy&_%+{aG_=)t(4Br0rBR`r zP$;vC#93H;DxhO)48t&tu21My`= z;sEj$K>mX-GO)q`1++XpE3gC!3^*j|;o!`_HStApD9JP^O(o!E0=ajOBy zBkpd?G?4rb!uE$V7H&Pf%tUDfH%L?%c(giz@+Cm|2aucrRX<%s*=IOZ9dSlO_7}Up#B9~K9)VLHq>7a32>B)Kzz^u z;@48(_EUAC{<@4+bC3F1(29McWN-_O#!kPfZOcu+F1Q(qug;!U8{!l=@dZFWkOD`U z2C~}%k)cne2Z-$81|+9J+g~Y15cARS9qz_>g-F=;nJCRkaFkIqGL#>W|oK3knV>(~86`_0mc|Kz=V-)w%z^n?0vQ zCFnUIep$5)-BmDfx2lo9nHYZpw7mzAqk!BBD31YgheE#OJ)rX@+K0S3t=_!ii{w$z z9QHTI?n^dFIlyy9_2$@}3kNsNzxPE3Rv26Qg9)jYp_@S4O^Wy(5B${n_UD~SQ3iO6 zjG8!nj~o1=)vlbXT5DkC{NN;0isWh4GIUdB$~bhRsbzCo9v>?=?0n!r@*hRa}}+mFv}OV{<^ko^W`vEWm^>zxa|8=YTw?JC&r7ocR7 zX+ZmVGcvR~XvJGuk9sbRbbl|eykD5Mw1mNJA-&tX!8y>?nm_oW+tL!Gvk$7bdLGOh zyrN3h#X!H-{at5E=Yho>^~z~d@;&0e?b@DKfUDTHv{*rH$?y1L)7X-}mTEp$6tIPfA>ZsR@QbY3aK3y4DQcu{KgVyj}i zv;TuvD)_=jU9R7wzF=_E9A0d2E4Bdn$135$BRQ#b?CxxEUu0kf5Fg7wooU&;*mPEW zaQm^8rIb$vEnb)HoiX*`=M?g2{sqi@cCTo(+8?pkmd(;ha#Fb)lJ3tL&oOt*^RgBQ z-0BH{=3NS1OX$*2A;7mDUS?{0GmsoFy=~j|-~grhb0|Ke=J<1D(%qQ&OyR%{qsj>N z*MXJ?l#cHJl1EGEiP;0lj{`{$kX-h5^ehnX1C-sVx%O@#-kY+rmqc^@DTgXXXiJ>oA7*;U3I@Z38NVSAM#KIuK2 zNg&>9faVUb9GwN^5wQ5Pb)o*c?0e!54c=DU!u4iT-||x4Bfq zirr!oKdea3cqjG@kTe;9vBy>FW!*Fo{}tR%m|7v_Tx<;@?=;cg4w`oX#!KgD%yu?n z{4*KOMoI(EjOwl4n&%Yqc(TYrJ`uEr))`*q^-`*`5y$&}qY^)-a=omH7?ZMeo}Vv| zd;Z*n0r(w-^0VO9!J7@Ep{>RrvDcc!e^ewBkbM7Kp+X+bD4=+e>CmGJEv-yj@_-0cPf$raC7#hN)w<=D3o6Xw)Neb_}yk?XtmP(XRmC|T!VZ` kxu25#3AFufBQ0?M7lj;!?nP3J&;S4c07*qoM6N<$f`=ywga7~l diff --git a/LedOK/res/backup/AdvanceManager_u.png b/LedOK/res/backup/AdvanceManager_u.png deleted file mode 100644 index 22adcb7d68f0a48cdad130dccc8b7911e3d6ec83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2146 zcmV-o2%YzdP)#qEH)8!EQT@d;nVE?2I)1S2) zeaLbUSq=i}As{`5ESKX49B!oaM~pGX3=UQ`x$b4a`Yezf$jm9X1M6!@x*xl=z;Do_ zz;Z6;yM!b^$1cCXSdyK{dInhsf#d{`vjGXzTx6Yo8d-k~6u~3u>o)XXHbC+suwDYz zD?svMb65I~?D$XY*;50d)C1{>Lg3SFts=GH{QZ{Xku^>h55;iCoT~^lvx?#sjgkp5tellNxNd$6TtCb)C}T!G-uRVTyrXOQIY$a)+|UI;ep{QP0o=|W(A zE#~ZpPKLARsWsj?hodVvuhAL4jckE)vylASC?QAS&CV~$AD0WR{g!0+5IC|9 z0PCJ4`FpbyM1FDu)}u+5&rL@X3%2dJJzkh9V}@4zi3~Wh^cD>sl`=hzEWJ6UVt6^b zh^$AZrEHPxgHX3+!m%Xa*N#i?8uH6a4L*PzwR%}?Uq7;(&vbS1-*oy?SgrRqqwG%^6K(ZHE&&FB(Z6J9DNH)d)cT?}`fFwkg z)+S1?aPc9j5O|@i-rSYGV>IvqAo&q?`32})9lG6h=yun^)~z=K`(|W)D;{^G$@vEo zS!2rK4ePegPP9sGHqdZz?FD{nsWGO?I9F|)t2V||HFl&HjRGzguuH!S>$l#VQ!;{J zh9%!HRL5ESlH~8r|Ekkr1y=mOmVGkm{6iSZ=fU|eK$w0ILa9fRH%0`vv3fL&yYvJZ^r+-Zo$Xn*CqJ>>xx%Uj7Kj`uQ2)dT~h)+!K^+N;Bl)v zU|BoS?XH_z@CnuNsRF;6Sb+6!P0l}%eM?(v@CkHonPaKu97|U^cf(|EU<&lw7m;K~ zWBcY?%_O&fse1JRWc_KA^GmEt%^UJAxedrah9m{=+=>Su`Tz%QC|{b)_AeFqWn}3C z(&vHnIS6GhkUj@2zX6iJ0PBU)f=A`YlK#TF)ZMF{d(U)%XHH(1ktD}+?%PWXp7CRr zWPQ-C^Amga)QtVq>jyl3x4fKm>4#UfZJBEZ2gi*6Yk8{=chY_c<%hOQJ{APQjAFry zE@$OWZln4YAbsAt)V$)rC)mK0r<{%3-<-gTS5C`15olm}6K6eE0Yih;M14+A^K>vQt#yF6^(oFK9Vu42nuc%{bA!s>g zN!AzBrHv1~LXV}O>R?Z3FmIK6vLs8-V0M*=5_T(fe4>XH}ic zK>7}5X?UXFC1riOLfXO~YG#M<UNU|4LE?{(tzb~NF z$5%U@lgNvcpndav>vZ9&wk>nZsc#!g=avVa6XOl*w$HXMHP42=38PEML1aA+tj)%T zzUyjo&;cNM)spPAq3;}0F0yta`whUp4Z5TQ%cf`?u53&?`DnJXF&F%5R=2F3KoSDU zPokzKE@vbMtxK&mmi%&Lc_FK_83dAZW!I_}p=Av^q8yWGm0DzZ0%M{6usY7#57}I- zZ(%6u`nD~%m_#B`W63WEl3xPr3AlRyT%j(#*$ou1)C0+}G3K2|l3p8nhpzkmW=M%K zI9L^Qbl-{WHz4cpJvrjQ{`u diff --git a/LedOK/res/backup/Checked11.png b/LedOK/res/backup/Checked11.png deleted file mode 100644 index 733251d3ee83d65bed840d408a9bb825755ff06a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 473 zcmV;~0Ve*5P)yj#a01tG4gU|`1r z`w>&V!wk}%f`LuoaRFPxr5vjS(cc9)jz=)*7dMk=UTdF+D4VnhxDM0?U-BY}A!3k~~y+&;>S_(Z|Z7*7Nwd0j*WB&`p``ZXMCm=p! zqyIy-rEgUtlv`Y#E^sHHJPyeFfaF;~cI!zS{+X5c?o#fFFI~1=#T9E`JOd=ttxyE+ zGcfW8d-u^BlB{Jrr5^xtNfW=PNiJyO_ZQH4P5c@lZ&gne(^WY6aPEaDGeB|<&_4vo z17P@IQ$*6QiH~TKiy=Vtk5|@St;NbIEAM|#Bfp_hW|rs?Gl2YWa7vG;Eq$vL5Px*} zYsxgBf5<}qy5*GCHdEOixm%;03R_Rc(*^FVWwUl1TLUNu0Oe9cE{`&!iT{*E@5^D! zkxYZ}`|Y05g%|n~N4lqUizXS5OlBhO1YNby+34L4C==n25PS^8Q$TzUNNU9As+-fN zVUOUqtsc2E0gew^PHAn^;hdo^9htO7nMgZBAvi#}50KAUK6E6nmlKzTeV6vW`F0kBTMT$avi3Z``Q)UgP-g@bqy3*zmE zLwR>a;pW^Dc`FzRxxjJ+#1Gpjjk_iB2srYSoGCq&HQwe~vyk_11r(0_?&;(c$_j@9aQNQ1<>X&B@^fIg7mWY& zS!v`wHp&Z{crt3a4Eh^aHi#!>1>M2dVp#$5B~9|ajwP*fL8E+7{d>(C^wry~k?veGHsAVs%>yel{>E6^^fap^d7T~U$BWERXbjRx{tf% zRL&IFS?GNqjK8yP<%{H5K-sGe|2WeBU=`_<11i1>}A6$OV+Wmcu_%+ly8`sGJ#D2gcu|k@o=lznHHi-k|mY z`p?)V_)cXx)m*OVXjV{(EeWTA!vc~|HSvhjRKVgC4-l}!m0=B5*mqz)sy*r5Cyewhl%*eW` z)oLy>f@zKN!Q$L~v8r=$MtQ4c2j|S5_&HLOoCgZ_1NwWLx0(2RHS#Yt%IWaCcoH1G zw>5C&eKnpP%gILu{#b5>7N4v(4UVI5l`|vXXm)3kMc!RNEHSul|AB_vqjEdtCdm8OE7wgW!^z6Qp`5OBKPP7a`7dCk zACL!=axLeA}Y`6bSrK6V< zxRjPe{uq!4qxF7k_iJmw`2F!V#MZYu>PmuKOz$doDxhF_&7>%&ZS-yr`Q;PEw2l5Y zAbGdp-)&GpJY^w2t+owjm)izBqfw4$x`)>>7G|_0mHqOT4=i(!)2~H^>bt5pa>I- RefIzW002ovPDHLkV1iKeaRdMW diff --git a/LedOK/res/backup/DeviceManager_u.png b/LedOK/res/backup/DeviceManager_u.png deleted file mode 100644 index 54311da63c3193114ccbade022319748725d841d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1936 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 bb(Q)*I*Y3;H;7u100000NkvXXu0mjfrRep# diff --git a/LedOK/res/backup/DeviceSetting_u.png b/LedOK/res/backup/DeviceSetting_u.png deleted file mode 100644 index 0f9cbbd70d43b3aa0bb67d6ab19e9300935c0f96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2697 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 MPgg&ebxsLQ03hX42LJ#7 diff --git a/LedOK/res/device/DeviceNum_Offline.png b/LedOK/res/device/DeviceNum_Offline.png deleted file mode 100644 index 868a89170f446626664f024b27e19133bfe90128..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 zcmV;@1ugoCP)K~3br5E4Hg43L-@rO_xc24Wx^OM*yp zi@WU1oN0>@eIQMYN>Ra>)R?ALv+Uk8u%JK`s*pAsffmq0+v`KO+ohH5Qtr0?lYg?w z-JLtXIWuR@%raI;FX0@}sntTeF94=DMl@|Gg#l?JSM+>Dr57{i1q$|QD&m+~Bs3iX zV|xIp7mV#GiII8%sT-P(?+nJe7WzvOJ5$avT`!FNOBm}-hr!sh5p&`Z=J^z$Gmc#?ojsz|bF{(wnLp+p9u}_R3Hq z;^R+U*$GB=0~~jp-_mZvLVh08JnI zmI{kdM5Pylp$;&1Fx!Vqfb_a>IxC86!Se!KrPlz`uemgc)CZa3A%A+f{$&dEzQ7xTurF*4RH}@&+y{qKJdhzkIt2Sp z-B*y_M>&pDA*F0kO7$zHyh+@zlzPW;oQdhUHlA7qhR%(FxQA=@c7^l45@1oUY{bzr zHX#jq0TzwsKQCJGc)U(2MMVINw~fc+b;W}`(>kjrmRuUq>9riw>mt%VRl6^Bf3BE| zohb*MTFnhT%`v@>>+};GlkUc(PR*g<5Vc6>|H?QB9ohDg+Mqa=W(=eJ=?gAWj%Qp%H3HWU>RuH9FKu@}JDelYeouIWV< z`?8!d#%h|5hXL*3?6I|9pv_EHwd>^f`!*ew0(A1(xaeh8zAizXt&lj z*_Eu-o5dJop+u$oiWBZ zCabx2cVx@?izU0PHnwNIK61GP5vk8*ld8t{Dvrq&wc1@D(X;`YO7j=Oa{c|w38nw` z5v0Glx%u|xeJNFv5@jY-lA>{@Al sUMbaaR2}S07*qoM6N<$g2LCnCIA2c diff --git a/LedOK/res/device/DeviceNum_Online.png b/LedOK/res/device/DeviceNum_Online.png deleted file mode 100644 index d1229043b4bb05a87d41ed3daa1947ab5f624dbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1520 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 M07*qoM6N<$g01uK!~g&Q diff --git a/LedOK/res/device/Equal.png b/LedOK/res/device/Equal.png deleted file mode 100644 index 14ac320e8ce28ab26d39a8863c24dda396a1e6c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&P!3HGl@7M4HDO*n$#}JK)$rEN)ew=;gO!t0` zBljgz(qeb%8o$0|%k?prt@Gt`(Ie{dAxl`ieeBmCFz8{tdZ;67qubgN76voUSEd3Y S-5-DkF?hQAxvXn9Na diff --git a/LedOK/res/device/O_Unlogin.png b/LedOK/res/device/O_Unlogin.png deleted file mode 100644 index 8f04097c9feb07f54620124b164601cfe3c8d5aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 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�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 Ef=zNHF8}}l diff --git a/LedOK/res/tip.png b/LedOK/res/tip.png deleted file mode 100644 index 40b3cd8ae919c2f7eb74a67dd80173265bccbbc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12377 zcmV-fFs9FmP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C zC5A~vK~#9!?45VCT~~eQKf9cBZhu`}vSiC0V-t!o4#5VDF~yY7ClEqlCSfKk7(xa@ z5+E5eVHSisKoVjcLg*a=m}VO=27{Z7En^$?^4`K}#^x$VxgZ^W-gTX^sJt(7%esaw*V{?F%LI1k8)8UiRFQjRi0h^Gmsw+WxtQ1()X zy|@|K)myv;r2!3*Fp)X1J%9u8-HQnrOUFiZG6C(EkEj7gyuSi1=rE&$nOrcLgW} zD-Mf4bArk%wo3o&#LV#X7rb>TwV^(?Vv?{86(z1B~ z_JePhp7PmtnC>Jg?+6XVq8naF05Mt$0ckn*Iba%x!-6s(stdI50_5gyBPcq$(6c)z zy>`qeuPw{W=T@re4_W+;2LH$bM7pf0M2aK2;C|otp1LXgPR9g6K0yZnLFxR90*Z`C z(w$YE-ceM3(?slVJFS>aOh_~%lY84&ZYY^=v{&!l+0Zd4e?~Q~T*TJppBpY`#lE4a zCz}~?qE64eoZ*AQlO}w0PK+sw3c74>e}EjZSmI#dr9aGSFRi%r=0MH-Rgv_&1tkxE zK#HUop?8ZKc;5~?@aj|*=4HVmN| zB1uc6cNWv;*G$^}LZMjPyv{V)h9<)hV^IjA6b^+);gu#9or{s~Z~_S$QJP%3sQmlN zqA>_eX#Dq9sP^}w)GMR)C8MhHirAK(k}7+;ldvnpx{F3RL}_-&vdc!Z(k*Lb;;qYd z>mvo_VnHpGXeTcqkz|DEwcCRgpBWGOFGdtdydMzxZHIJ&Vlwj{E$)Mrkewaph?OG2 z&=!k3>Wf9?@&b!jP70*gm0a_>igc(Nx!4D#zuM+1mnS;PsYPbh>X?o$M)#{V|1ibO zRmE)hRTbjv+vsDUeI7-7qDo3f*=O8u*W5B54qcqT%mVdPS&)zt9ahWOyPs3sbM`7- ze{+o5nPAD3L5|6~JMc3*G?}tw7((T4Jj+f#bA7t!G5yKdca?Xb!mj;8F7H&vnCe-3 zgIj;yK1y#a5o7R2RTI-kUITF|{Fl+~vu$w+Sh@cKva|@IO4a zwD+Pxnr}&zxhKIMHxM3dI5Z6jFiLJ8NX9QeB^$o@W@+U%x9r+qt95TkF+j2(d(y0Qqc^QihtJ<=XWmpW{4B=e z>ZoYBhjXYDtIc{7#GXR^HMst$Z|+%o|%+z_7yYyXo@6uHRW>n(t^zh(n`z_;{BU(81DH!Q@$L?0M%W zTds_f`Uujc77>sRE~r(0V>jHgCozA}XR?R%h8nOPGAZQqKkx3tY4EDzlxb^Nf^-d)qJB}wln&}g4=?Vd*I7IW%#6RK9hCJX#c0U;S{ z^W$gvoD(xrx70>8M^u@ z%-nuzQEoF@VU#+omAGUINt_UfCse-nvux#0$6aj@o6duwLW;!cOG?{cvpk!4$8cgm zsfQ(19GqGNtqrl)+b%YHo_kq&^rLv&Rp$kQjHx8zYtyT4$V_;i@hOQHQs)nOETRyj z)S*?|076Ol+EoAdXTs&@qm%B&5a0ty5;n+=-(Az^zHz6DFv{^r98Mq>jRXbG&{MC! zsgcmAo$|-IZ!80yK)J8_=}CR#vpc)iRxHyKvCn1jQYj?s%831swEI&5WfHzRUU~1$ zjlsvGQ|3H?KA>hZPS3WySmNe4>JmPpsN!I9B}381QfrUAUQccR%Unp>IhiuYo#-4Obd&RSI)!##qu`3<8?AE09_E)TN?;P&rpd4ymEWqmC z;(_-tbiPl$X(So=W^>h-F=5vgqChlw#f9b3f9RLyKUa!H9zW!WjG`JSW;&02Kr(?q z!()~e=${^Y*{-&^c|;AJg~YiDU;^&&tKV@^XYZy{!uTuG&K^?jKPZI=5GXL(>mPK6 zuB-b>FTt!vrNA35E{}fg1^w}xHrEZSOPUQ8jZ#nv6xky%nkDtQ*vz`@2cVvMCR0r! zy8g7%@Dsn?(!ZRv{Tm?xm61uv)uVl1{{5akJsH_db_kdTH z_dIMiuTlAcayEAVvwNmq(ZP~=XlI`3#N)ltOg%HPqnUa#0sRQ!UqzGq8p{Sktr0Jr z)fY0^akRZbD>Z##IQkM?+Fk1cCZ#1+ZfcbOJjhzKlJtPbA_~cz?59Zxg9XD_+tyQ%g{+szyZC(pRu3CG2W@^ut)Lq#jCvaLI~j z?mb<_;zc;8KV&-b3=|AThn#QH+u9Rj|9C@v*?%MGTJy$pj~jg3Illgt6`{MO;mtwk z!UC+Q6&C$7w3@hC=Q~s757kxwI#fEZUnKCXfr*d2aCPzaow23tg%#y_&gey0-&Y_q z8ZSa4cC0E}ZXIpW@eeN`W+$zgfi_UF`39L22$X{E{(ddgbI#UOM?8O^{zrSW@X7ba z1Lx#kjEoKiu1}VK>7{npdhwdutV4Y?WT`42m%iN%J|FlBy=U;jiCLn}k-ocSxtlYf z22BV1)W8eQWcaH`3P#$M6_2WUjL}SXGEnM4-6Eo(s^RIS@fUB4i+3axEM%ZF_PCx? zeo~+Q{SBt^uMO-0A+Z3v7pO!=DO$~xZ%y_76H$3S{z+N1Yw+a4-Ya(1b$Zw2)L}Ua z*Oe86VNBfz2VEUY98<^W+y!%x11cg!3QjFUD#E@clK7N@9+lpGmK}fhCcpM=`RjU+ zfcwngyMJ%J{bZ?FkX9-O2Bf**gGhVEQ&!#GE<6siz}n63n& z(Df=tMqyCwYQtnKoUBTi0%kJUP=iaC8@w140U;<=UKB<0$DS|Tkpy-FBie^h5PKNycs2%YlBVZt_o*YMWTkSO;tYx3{hO@%+Ez5MG2gt) zXh%aA?ULk$eOdD5Ocqm#1t@fbn|h7ohUwC4IPxl%8>E6ha$2~X)y{x*stTA4a(LHi;?U!}w=mnnXozrp97Ye5r+w5v6_B7(7EY%bh;+a!y@yA=Fb|oqU9GQf~ zQT396aPrP^w;v$JXOvXRgez^#LCEF+83^Kieb(R9$V|S4d=wuv^}^1kaC+JEf)$Q$ zk6M%n#p6UF)0tvp$?@!!jz|T>J{Ramn^OC%rqW10zhykV5}O;8h%hD5(^vGCK2%fT zVnFsbVn%(&uO+y0QLwDm4EmYxj7-&O5g^APT10?Q=doQIt!8@?ksU)p-<=NH4w4L3 zMUF^mMiX<)Sf*2kLfZKEl1#s|MgM7#f)ci-#b@vBG}c>{Zd>fj^59Igq3(+p&1EE! zQ%WhB{_MT&nD#La%U249f{bzTOh|RX)E(V1>s#mzH5)21MG@{8JNC+Vg^V+!&bMxJ z>QD0ca!*4F=B9n})D^06^&&t<8Y%5U`RN@SF~9j_DEY>|<)QzcR%PsQP)|Du8>}#> z>NNeqHU5-bS)-djT3?d1se{^NO)EqaJQ~;~syne^Vj^%TsidYndhrm=6;3OB=B@#NB zVpn312}?Y<;i-tcBJ!R8K-FG7`?htlLlaVX4Dic2K)$~_J$Edy%duTGN^6wsFw<&( z^Il_Vo`A5bKnG}Xl;dd0x^&s3fubG(Oi-5Hk;cp9e6&+FmB z=#1Ne=O4;bKWpzaond)3L@Q4*R1`Qdn`NOETxx!!;tWyUs7EnW%f*XFYN6~jtKy8kX$dDwkDf@;^hB1Sti?v?F4&tAR2Km<;iLY!y^k)HJhoS6PBTLDB-pr+ zE;LUYaFnYBHt*$zC4B9Mm#-B@+a9OPN#W)<2v(DPt3!KtLOIV&6&h|{qFI2xVsvV| z-PHj#kYu!Ll{;*IEqA?~;4%BOF(78?_RwfyIdP~?D4SZeu#_TkuFo_e#>&AvY=hXVWH&dzO9`s93c0j%$E5J!QX7n_SeEk@p-%#ntz zjN5?=4#uv^MR!t$N@^hXNOF+%lmp^3Fx@O5uLz9iMT4znW#jKoPC{6eR{YEE@`Jfg zrv7Zr)JaL;LxJO~mmg?XVI=xh-nlZo7gmSuCxP#GTG z!)fP4?H@P%$wMJk;}}sjwsgwCg9B3T8Q{{&Fs;Oqib95?dJiiB&FCf-8rj~&d|Z0c)FLo5^6n#zOtjN2WY}};QE7nW4lf}+`VUl zku0Jo$|KfKIE9D+QfXVa5u>_#l%`0$m_jNlyBCqm=d>-aXa|+`YX>aJaoR0>Fu4&a zq2q)*$3t+_7$uxOapyJ9-cY{gv+-#RxAJm;Yl;b%yLoEo0rz(bl*kCw z(u`F>QMSTFnzALeY$!OQK$H0sx4JCQ7S*E!J@*z$L6+XXpW5qg!6#tCZtl4-ha63*!u^0i$#L6fT9)H5UZN3H674G+|@RZ_b4gHmaKfL^Cl0x zMuGG6>+I%5fSeJw?%A&Trzf56nJv?rNJyVbvA z-amb6FUTcmIUitGY;M3lP_9^nb}HQGEN7P;VW9HRRdsw9SV;@9k1iwApz^&ZEh*>q zWOptCWUye{J!yRVB;}{feO(3Yip}pV&nB;#^1*Qx>{>hq_-Ut?DQ7t|Oqky9ocsFE zdpqz3pm*W_|0O$j8$DcAr1RB98jcd`-twD{=22DX4?S(s$L+O@f`WL)I>o1=W<4W@ zlF3@lcKeP+fb46usrm3b(D#&uO7oVac-esWBxJ{}>YGLoZ3wI(6E&}lEEsiD`2_Il zgZUMKuMGRbAFPCH78zy6voj58Ogq+_HdY*+E;~Qgaao~qbX0imZeKVx=R*10_R+a6 zZpTxL04W5THMFnYl*a!X9n96R9jClzBnzKVk@n58*kk&@RtZK4fzkM&!b~O#m z466F~d&2$lLq=Pkg6iD1On2@dm1yI9nbd%ppyws4bar!_@R<3Av=W?$wpTP%NKI)X zQVy~U{)WT2^q(HcRw*gRv@WtsTYkIJp%4Z~lqGdI7J5+$GM?!E>;l zCKEyLCHu>aLyYGi?1Mmg>Y3r@dVweQIYKh(+0owt5};;;ty%QsJ-+f=%vMSAhIP^O z&q~_ex+@MA1JYNtloj+Q$>uqA3<2et^!D^d%EqEf?~nb_6@o@X>V<$m(^2Y8ITuJBag-Z~VNP&9JXWo6#TA>od=`f^bra|J>btPav| z`z&2xr*{GIUeQv9)uw$zNwr%oDVFl+22biEwz|q&F0D+xc3SjNv)Z+SlJX44ihGhG z;yqP$$U=ZUM{uhLrKqZQ>_{UrQ{nArf(-)NnH-gpgaXt8&Gv~ppWj-39!BPbIb@Vv z`^VF%CXxLB3A$2$$fVoPFf;#tds2GcT&k27e%!3R#x%#S0$)EGd+e(FxUmjtWQvk< zqGw@0^hFsWf)gGxC;~X^+1Ao8N_1(}d?J)(P)*#w z&Ni=WNq|~V!`lM%mcp*#67U4w`RHAf$?H9X3IRQ~)N_We~;g%63%DulAm z*pZdFhbrrI17(){>bD=}?UrMzZEAY{=~X z2O?ZlZGHIMfg*JuF6vTZ0k)2}=G-bZlG|2g!56pNH7}aW716?;XvJTw%bNe}g&oOZ zt{V}-YDJ(S6U9CX#I{IPgaBcw!J+->)YL@Kd(9HnUVslQ)y1L}^n|b@3)s{tb8)pp zUqO*|YnvQ?UcRE&q-<{YzGO@fK54#qPe7E8Z9Co8Kh}~e?QC&ms0G+jPv$OCP>vxz z_2%s?dr{s9#et-BR7r1@-j|#rlkdq?a99thG;}G1QB4myN_a#%Q`AiT5Po~g}d)uq5!fJ+W?+WS}N&Q(V$-y-d4NyrcOIfiJn zx;R_SK`j}O9+mJ5*YmRBv|7bvbE&F4G=#QuTFNO_6Bl3DafgOTQW?dF@_ zw=Mh<)-c->s;#O+zsv@{{AAO3s;H23iLUIq(oJ0%@=!CsMZc?)Lw%jys!umtHs4`J)vw^RaC$ zbG&}*x3rM1uT>4qk^foSldh4`-1~=-$d&HlUXy4rz`d+R8y(a#7?jZ0;7mso}E-MijkIMZ%5I}prGL-4P85= zmsTmo9g~hB9kV>lwVzakR+`u26%j(KF(?Wo{4A;b$xnU%3-XKt$)`Duxx705%7UhI z+i>%s9)Wy6WbnX(Z!mD%Ca1>VcJ0in_Y&wF5S0@9a`5xG?_Xb2n|NN+1Ss;*q09@t zh5Ywwpx9P-jKqdwsL|r^4?{p^r>!?ov@;6^_H`V!z;OCNk;HkdR_tq~1d@RYmi?@= z>Vqf)s;lOD!@1GuSI&uApPS5zB<|qWoCX*yhX*{OLXk@b-G_T^qmEk;>|j#v^~`3uVoAx$XSt~N!hELx!gEApoXEMICGvU6v&>snpg!-gb!C0F2z1rOrIu1_hDX^>@ zvASBIph5YR8#{ylc{c=_YusdzGa{z?qbcqjHgp~gp%GFbrXTK$_1iP@JQ@M9T-JB^V~n3a@Sag z3wniZX7F!!%CbM4leJ1iW;o04`Rebk@_*A%gG;hyEWoe!Og=ad70csF_4n`gW0!Bq zmOqog<+1Iz!C0^R<* z3R25}nb~t$W%Bo$Qo~w}T0#*}J?lC+*a4um#smePUK)FGznUCD78D=UDZ_EG@+-CO zXDTYJ?XwQ06p!RC?IK{6qTeJ`di(x(SNXIrG!mF|9{PZaj`{s%6E9uYTW(Gz!eldH zrkx)2SVSRbujp9<4^=!W@Qr1YlTZEo9r~x4?dh3o=AsiQ_11QH^}~CnMz1g~xnC>$ zNQQ*6bZDr7KOQcx{s@5qpX6La0%*rvxqR>I&#CF3Y-{CvOMZ#|Q=Rifedt3goQdc$ z?(Qe39Tx{W&ijVUJ!8zIs&2e`--=uI`RKp&>GTmtC9`|~HJx#1+WW3+lhq%=biqJ@ zw?r1sHQWBswCf+8@&Vp2C^9AwaxA0}w?r3+^Pau2<}v-|t|yj9Uh{#SgI7CK1T#x= zDQQrx{YVO*Iy>7|>!I<{Zp+h0#E5WMpK`xm_NDuSl`kZ73)EW!sprLm`#yN)pt^c* zTqgCN&>o(nNFT{6X^Z8wqWi=v`u4o8&&K3E{$^b{F>R;0Rh{yY5!?SEE52I5ofOR@ zkCZADP*NElb;0-BD}Hv5tau?NW4;7?h(&mI-|+jNSZ)1jwNmEPzKF~@0t0pl#}NaP zcZ(55Qo}h_|M6G$@BM8R*P9S6;E^d9&DL<;|F}c1+SK&=;u$+8%f+blBxe z|LazD%5B>jx)9PlxheMzL!5Ay-}%xDYn`i_-qJ`toy_OTjj*KShyhs$%#05SeR|`C zvgJubYUVfiXufx>I8Z5LRM+2a*8XIdRNos)LPYkk07U@>$pAV17wNKVf03Vib^Xv+lF$-^S7!1wxA$2a;%)D=l9D%GoW(7#RXb`1FWnui_{?+p%Tc$r$L|i7UprxYzuQ*fbF4TUNQOQE zm4`wcB~mPIaA#J0+YSadkA=(su4PICNY?ER(RHD#h``5O;J5$TxoYIaF}B|7`m2r_ zbsp`N7ORjx;%{t7cAXQ4y>HrUdjFzHDc4A5sljJ>WoX#iW%udgWo6Rs)^&bR5cerd zc70hXX?MXn+VVyrSR7$4Nz41B_=+aw7mb<1T8k>dmJ9 zrcbAv+A1RB=vU)DCgya4A;nHC*NwNGs;2+r_H5bz9W^}{c;=%+RJZlGFr=H~XX(9fHd*@FdX;Tfpe2>S)V0A3j;scxL~)s0)J{r6D$y@5`Cv=?=|cY2d3 zKb&G(USw3`y-|Wv^R*R?0;7DNLYzYtQ_M1ls*2KUMpVy*EutsS=;*ALgjKYe*9KY8 zLKf9+rRwO@&AN^oA2>5?zJFDijo+7ra}4^JDHO+AbxbhC7?h;fJlYIj6DfJs&pZ9E ztlOTa=K|6%c)>0}3NivRrB)(^mre^WC39#iOw)rGncmrRI-hA6necKaiWv|YOZ4E^ zW#hTcs&Ugk3dZf4a+jVM!OmJypnTVk*iW3QywPwao4MyyTmQ%NqQ+-`-U)}B1hmAX z@W)(bKQ11?T=_L*D3+=ACs(B-pDdf{-`hpst7cU3vW^6~{i0^6MY@!;5Zc*doC-8O zP18p+5m4!q>AJO>PSK<{FInLo*`f+B*#no0>Ndzkp-Aa-Q=0}<>*Hb8_*lv4RB277 zj<4(IxVdC!1#|~Pq7q24PxSXXLSq!g`Yi#-e zHz8RN79#t92y;Qp9_v$<>Gq9PlJ7K9`OzAg{!zz7bd)7QlS#_)9w*F4p0hHG6K-B+ zIyaZHX-rmFA<8~$N>?uK=;(?Jy)sp^?XkNPtRyeiqV)pfbH7zTn-rtEr4oc(F&9rk zC5 zKYDL$FN}lo*;?y!I@p1_Gpb4v359?5%q55J-Ra|%wb@&5(@s$RLisWidgetType()) 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 成功