diff --git a/LedOK/AdbWinApi.dll b/LedOK/AdbWinApi.dll new file mode 100644 index 0000000..b5586eb Binary files /dev/null and b/LedOK/AdbWinApi.dll differ diff --git a/LedOK/AdbWinUsbApi.dll b/LedOK/AdbWinUsbApi.dll new file mode 100644 index 0000000..0c9e00b Binary files /dev/null and b/LedOK/AdbWinUsbApi.dll differ diff --git a/LedOK/LedOK Express.pro b/LedOK/LedOK Express.pro index 22f0bec..b96b4df 100644 --- a/LedOK/LedOK Express.pro +++ b/LedOK/LedOK Express.pro @@ -27,7 +27,7 @@ CONFIG += embed_translations # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -VERSION = 2.0.3 +VERSION = 2.0.4 DEFINES += APP_VERSION=\\\"$$VERSION\\\" msvc { contains(QT_ARCH, i386) { @@ -77,6 +77,9 @@ win32 { copy.files += $$files(ffmpeg$$DIR_SUFFIX/bin/*.dll) copy.files += 7z/7z.dll copy.files += 7z/7z.exe + copy.files += adb.exe + copy.files += AdbWinApi.dll + copy.files += AdbWinUsbApi.dll copy.path = $$OUT_PWD copydir.path = $$OUT_PWD @@ -120,6 +123,7 @@ SOURCES += \ base/locolorselector.cpp \ base/loqtitlebar.cpp \ base/loqtreewidget.cpp \ + device/badpointdetectdialog.cpp \ device/progressesdlg.cpp \ gutil/qcore.cpp \ gutil/qwaitingdlg.cpp \ @@ -188,6 +192,7 @@ HEADERS += \ base/locolorselector.h \ base/loqtitlebar.h \ base/loqtreewidget.h \ + device/badpointdetectdialog.h \ device/progressesdlg.h \ gutil/qcore.h \ gutil/qwaitingdlg.h \ diff --git a/LedOK/QXlsx/source/xlsxformat.cpp b/LedOK/QXlsx/source/xlsxformat.cpp index cd71a65..576fd87 100644 --- a/LedOK/QXlsx/source/xlsxformat.cpp +++ b/LedOK/QXlsx/source/xlsxformat.cpp @@ -466,8 +466,9 @@ QFont Format::font() const { QFont font; font.setFamily(fontName()); - if (fontSize() > 0) - font.setPointSize(fontSize()); + auto size = fontSize(); + if(size==0) size = 11; + font.setPointSize(size); font.setBold(fontBold()); font.setItalic(fontItalic()); font.setUnderline(fontUnderline() != FontUnderlineNone); diff --git a/LedOK/adb.exe b/LedOK/adb.exe new file mode 100644 index 0000000..94005f1 Binary files /dev/null and b/LedOK/adb.exe differ diff --git a/LedOK/base/changepasswordform.cpp b/LedOK/base/changepasswordform.cpp index 37ad2e7..631e550 100644 --- a/LedOK/base/changepasswordform.cpp +++ b/LedOK/base/changepasswordform.cpp @@ -15,7 +15,7 @@ ChangePasswordForm::ChangePasswordForm(QWidget *parent) : QDialog(parent) { #endif auto vBox = new QVBoxLayout(this); auto hBox = new QHBoxLayout(); - auto label = new QLabel(tr("Old password")); + auto label = new QLabel(translate("","Old password")); hBox->addWidget(label); fdOld = new QLineEdit(); @@ -25,7 +25,7 @@ ChangePasswordForm::ChangePasswordForm(QWidget *parent) : QDialog(parent) { vBox->addLayout(hBox); hBox = new QHBoxLayout(); - auto label_2 = new QLabel(tr("New password")); + auto label_2 = new QLabel(translate("","New password")); hBox->addWidget(label_2); fdNew = new QLineEdit(); @@ -47,7 +47,7 @@ ChangePasswordForm::ChangePasswordForm(QWidget *parent) : QDialog(parent) { auto btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); connect(btnBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(btnBox, &QDialogButtonBox::accepted, this, [=] { - QString pwdOld = fdOld->text(); + auto pwdOld = fdOld->text(); if(pwdOld.isEmpty()) { QMessageBox::warning(this, translate("","Tip"), tr("Please input old password")); fdOld->setFocus(); @@ -55,21 +55,21 @@ ChangePasswordForm::ChangePasswordForm(QWidget *parent) : QDialog(parent) { } QSettings settings; auto pwdRaw = settings.value("advUiPs"); - QString pwd = pwdRaw.isNull() ? "888" : QString::fromUtf8(QByteArray::fromBase64(pwdRaw.toString().toLatin1())); + auto pwd = pwdRaw.isNull() ? "888" : QString::fromUtf8(QByteArray::fromBase64(pwdRaw.toString().toLatin1())); if(pwd != pwdOld) { QMessageBox::critical(this, translate("","Tip"), tr("Old password is wrong")); fdOld->setFocus(); return; } - QString pwdNew = fdNew->text(); + auto pwdNew = fdNew->text(); if(pwdNew.length() < 3 && ! pwdNew.isEmpty()) { QMessageBox::warning(this, translate("","Tip"), tr("Please enter a password with more than 3 characters")); fdNew->setFocus(); return; } - QString pwdAgn = fdAgn->text(); + auto pwdAgn = fdAgn->text(); if(pwdAgn != pwdNew) { - QMessageBox::warning(this, translate("","Tip"), tr("The new password is not consistent in two times")); + QMessageBox::warning(this, translate("","Tip"), translate("","Two passwords are not same")); fdAgn->setFocus(); return; } diff --git a/LedOK/base/locolorselector.cpp b/LedOK/base/locolorselector.cpp index af69799..66fda4b 100644 --- a/LedOK/base/locolorselector.cpp +++ b/LedOK/base/locolorselector.cpp @@ -12,7 +12,7 @@ LoColorSelector::LoColorSelector(const QString &text, const QColor &color, QWidg init(); } void LoColorSelector::init() { - connect(this, &QPushButton::clicked, this, [this]{ + connect(this, &QPushButton::clicked, this, [=]{ QColorDialog colorDlg(this); colorDlg.setOption(QColorDialog::ShowAlphaChannel); colorDlg.setOption(QColorDialog::DontUseNativeDialog); diff --git a/LedOK/base/locolorselector.h b/LedOK/base/locolorselector.h index 69d77e9..b1a2594 100644 --- a/LedOK/base/locolorselector.h +++ b/LedOK/base/locolorselector.h @@ -6,8 +6,8 @@ class LoColorSelector : public QPushButton { Q_OBJECT public: - explicit LoColorSelector(QWidget *parent = nullptr); - explicit LoColorSelector(const QString &text, const QColor &color = Qt::transparent, QWidget *parent = nullptr); + explicit LoColorSelector(QWidget *parent = 0); + explicit LoColorSelector(const QString &text, const QColor &color = Qt::transparent, QWidget *parent = 0); void init(); void setColor(const QColor &color); diff --git a/LedOK/borders/Frame 6.png b/LedOK/borders/Frame 6.png new file mode 100644 index 0000000..2de1f08 Binary files /dev/null and b/LedOK/borders/Frame 6.png differ diff --git a/LedOK/borders/Ma_5.png b/LedOK/borders/Ma_5.png new file mode 100644 index 0000000..75c1678 Binary files /dev/null and b/LedOK/borders/Ma_5.png differ diff --git a/LedOK/borders/frame 0.png b/LedOK/borders/frame 0.png new file mode 100644 index 0000000..182a649 Binary files /dev/null and b/LedOK/borders/frame 0.png differ diff --git a/LedOK/borders/frame 1.png b/LedOK/borders/frame 1.png new file mode 100644 index 0000000..9fe634a Binary files /dev/null and b/LedOK/borders/frame 1.png differ diff --git a/LedOK/borders/frame 2.png b/LedOK/borders/frame 2.png new file mode 100644 index 0000000..ae7adf1 Binary files /dev/null and b/LedOK/borders/frame 2.png differ diff --git a/LedOK/borders/frame 3.png b/LedOK/borders/frame 3.png new file mode 100644 index 0000000..820f2c7 Binary files /dev/null and b/LedOK/borders/frame 3.png differ diff --git a/LedOK/borders/frame 4.png b/LedOK/borders/frame 4.png new file mode 100644 index 0000000..9f4580d Binary files /dev/null and b/LedOK/borders/frame 4.png differ diff --git a/LedOK/css.css b/LedOK/css.css index 7cd26b8..52db0dd 100644 --- a/LedOK/css.css +++ b/LedOK/css.css @@ -74,8 +74,6 @@ LoColorSelector { border: 1px solid #aaa; border-radius: 4px; background-color: transparent; - padding: 3px 6px; - max-height: 30px; font-size: 14px; } diff --git a/LedOK/device/badpointdetectdialog.cpp b/LedOK/device/badpointdetectdialog.cpp new file mode 100644 index 0000000..9a791ae --- /dev/null +++ b/LedOK/device/badpointdetectdialog.cpp @@ -0,0 +1,310 @@ +#include "badpointdetectdialog.h" +#include "main.h" +#include "gutil/qgui.h" +#include "gutil/qnetwork.h" +#include "gutil/qwaitingdlg.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +BadPointDetectDialog::BadPointDetectDialog(QWidget *parent) : QDialog(parent) { + resize(1280, 720); + setWindowFlag(Qt::WindowMaximizeButtonHint); + + setWindowTitle(tr("Bad Point Detection")); + + auto vBox = new VBox(this); + vBox->setContentsMargins(0, 0, 0, 0); + auto tab = new QTabWidget; + vBox->addWidget(tab); + + auto badPointPanel = new QWidget; + tab->addTab(badPointPanel, tr("Bad Point Detection")); + + vBox = new VBox(badPointPanel); + vBox->setContentsMargins(0, 0, 0, 0); + auto hBox = new HBox(vBox); + hBox->addLabel(tr("Port")); + + auto bnPort1 = new QRadioButton(tr("Port")+"1"); + bnPort1->setChecked(true); + auto bnPort2 = new QRadioButton(tr("Port")+"2"); + hBox->addWidget(bnPort1); + hBox->addWidget(bnPort2); + + auto bnDetect = new QPushButton(tr("Detect")); + hBox->addWidget(bnDetect); + hBox->addSpacing(20); + + auto bnUpload = new QPushButton(tr("Upload Point Table")); + hBox->addWidget(bnUpload); + + auto bnCheck = new QPushButton(tr("Check If Has")); + hBox->addWidget(bnCheck); + + hBox->addStretch(); + + auto lbInfo = vBox->addLabel(); + + hBox = new HBox(vBox); + auto edCoordinates = new QTextEdit; + edCoordinates->setReadOnly(true); + edCoordinates->setMaximumWidth(200); + hBox->addWidget(edCoordinates); + + auto table = new TableWidget; + table->setSelectionMode(QAbstractItemView::NoSelection); + table->setColWidth(20)->setRowHeight(20); + table->setShowGrid(true); + hBox->addWidget(table); + + connect(bnDetect, &QPushButton::clicked, this, [=] { + JObj json; + json.insert("_id", "IsHaveTable"); + json.insert("_type", "IsHaveTable"); + json.insert("port", bnPort2->isChecked() ? 1 : 0); + auto waitingDlg = new WaitingDlg(this, tr("Detect")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + { + Def_CtrlSingleGetReply + if(! json["isHave"].toBool()) { + waitingDlg->close(); + QMessageBox::critical(this, translate("","Error"), "It hasn't a Point Table, please upload one"); + return; + } + } + JObj json; + json.insert("_id", "GetBoxSize"); + json.insert("_type", "GetBoxSize"); + json.insert("port", bnPort2->isChecked() ? 1 : 0); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + auto width = json["width"].toInt(); + auto height = json["height"].toInt(); + table->clear(); + table->setColumnCount(width); + table->setRowCount(height); + edCoordinates->setPlainText(tr("Coordinates")+":"); + lbInfo->clear(); + if(width==0 || height==0) { + waitingDlg->close(); + QMessageBox::critical(this, translate("","Error"), "width==0 or height==0"); + return; + } + { + JObj json; + json.insert("_id", "StartPointCheck"); + json.insert("_type", "StartPointCheck"); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + auto err = errStrWithJson(reply); + if(! err.isEmpty()) { + waitingDlg->close(); + QMessageBox::critical(this, translate("","Error"), err); + return; + } + JObj json; + json.insert("_id", "GetSpotCheckData"); + json.insert("_type", "GetSpotCheckData"); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + waitingDlg->success(); + auto pointCheckData = json["pointCheckData"]; + int rgbCnt = 0, rCnt = 0, gCnt = 0, bCnt = 0; + for(auto &line : pointCheckData) { + auto str = line.toStr(); + auto coors = str.split("-", Qt::SkipEmptyParts); + if(coors.size()<2) continue; + auto bad = new BadPointWgt; + if(coors.size()==2) { + rgbCnt++; + bad->rgb = true; + } else { + if(str.contains("R")) {rCnt++;bad->r = true;} + if(str.contains("G")) {gCnt++;bad->g = true;} + if(str.contains("B")) {bCnt++;bad->b = true;} + } + table->setCellWidget(coors[1].toInt(), coors[0].toInt(), bad); + edCoordinates->append(str); + } + lbInfo->setText(tr("Size")+": "+QString::number(width)+" x "+QString::number(height)+" "+tr("Bad Point")+" "+tr("Total")+": "+QString::number(rgbCnt+rCnt+gCnt+bCnt)+" RGB: "+QString::number(rgbCnt)+" R: "+QString::number(rCnt)+" G: "+QString::number(gCnt)+" B: "+QString::number(bCnt)); + }); + }); + } + }); + }); + }); + + connect(bnUpload, &QPushButton::clicked, this, [=] { + auto file = QFileDialog::getOpenFileName(this, "Open file", gApkHome, tr("Point Table")+" (*.xml)"); + if(file.isEmpty()) return; + QFileInfo info(file); + gApkHome = info.absolutePath(); + QFile qfile(file); + if(! qfile.exists()) return; + if(! qfile.open(QIODevice::ReadOnly)) return; + auto fileData = qfile.readAll(); + qfile.close(); + if(fileData.size() != qfile.size()) { + QMessageBox::information(this, translate("","Tip"), tr("Failed to Read File")); + return; + } + auto nameBytes = file.toUtf8(); + auto Boundary = "----QtLedOK_.oOo._"+QUuid::createUuid().toByteArray(QUuid::WithoutBraces); + QByteArray data; + data.append("--").append(Boundary).append("\r\nContent-Disposition: form-data; name=\"username\"\r\n\r\n10005\r\n"); + data.append("--").append(Boundary).append("\r\nContent-Disposition: form-data; name=\"").append(nameBytes).append("\"; filename=\"").append(nameBytes).append("\"\r\n\r\n").append(fileData).append("\r\n"); + data.append("--").append(Boundary).append("--\r\n"); + auto waitingDlg = new WaitingDlg(this, tr("Uploading")); + waitingDlg->show(); + auto card = gSelCards[0]; + auto reply = NetReq("http://"+card.ip+":2016/upload?type=badPoint_upload").type("multipart/form-data; boundary="+Boundary).post(data); + connect(waitingDlg, &WaitingDlg::rejected, reply, &QNetworkReply::deleteLater); + connect(reply, &QNetworkReply::finished, this, [=] { + auto err = errStrWithData(reply); + if(! err.isEmpty()) { + waitingDlg->close(); + QMessageBox::critical(this, translate("","Error"), err); + return; + } + waitingDlg->success(); + }); + }); + connect(bnCheck, &QPushButton::clicked, this, [=] { + JObj json; + json.insert("_id", "IsHaveTable"); + json.insert("_type", "IsHaveTable"); + json.insert("port", bnPort2->isChecked() ? 1 : 0); + auto waitingDlg = new WaitingDlg(this, tr("Check")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + waitingDlg->close(); + if(json["isHave"].toBool()) QMessageBox::information(this, translate("","Info"), "Yes, it has"); + else QMessageBox::critical(this, translate("","Info"), "No, it hasn't"); + }); + }); + + + auto sensorsPanel = new QWidget; + tab->addTab(sensorsPanel, tr("Sensors")); + + vBox = new VBox(sensorsPanel); + vBox->setContentsMargins(0, 0, 0, 0); + hBox = new HBox(vBox); + + auto bnRelayOn = new QPushButton(tr("Relay On")); + hBox->addWidget(bnRelayOn); + auto bnRelayOff = new QPushButton(tr("Relay Off")); + hBox->addWidget(bnRelayOff); + connect(bnRelayOn, &QPushButton::clicked, this, [=] { + JObj json; + json.insert("_id", "ControllerRecCardRelaySwitch"); + json.insert("_type", "ControllerRecCardRelaySwitch"); + json.insert("isSwitch", true); + auto waitingDlg = new WaitingDlg(this, tr("Get")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + }); + connect(bnRelayOff, &QPushButton::clicked, this, [=] { + JObj json; + json.insert("_id", "ControllerRecCardRelaySwitch"); + json.insert("_type", "ControllerRecCardRelaySwitch"); + json.insert("isSwitch", false); + auto waitingDlg = new WaitingDlg(this, tr("Get")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + }); + + auto bnSensorDataGet = new QPushButton(tr("Get Sensor Data")); + hBox->addWidget(bnSensorDataGet); + + hBox->addStretch(); + + auto edInfo = new QTextEdit; + vBox->addWidget(edInfo); + vBox->addStretch(); + + connect(bnSensorDataGet, &QPushButton::clicked, this, [=] { + JObj json; + json.insert("_id", "GetRecCardInfo"); + json.insert("_type", "GetRecCardInfo"); + auto waitingDlg = new WaitingDlg(this, tr("Get Rece Card Info")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + waitingDlg->success(); + edInfo->clear(); + edInfo->append(tr("Temperature")+": "+json["temperature"].toDouble()); + edInfo->append(tr("Humidity")+": "+json["humidity"].toDouble()); + edInfo->append(tr("Voltage")+": "+json["voltage"].toDouble()); + edInfo->append(tr("Light")+": "+json["light"].toInt()); + edInfo->append(tr("Has Smoke")+": "+json["isSmoke"].toBool()); + edInfo->append(tr("Power")+" 1: "+json["power1"].toBool()); + edInfo->append(tr("Power")+" 2: "+json["power2"].toBool()); + edInfo->append(tr("Power")+" 3: "+json["power3"].toBool()); + edInfo->append(tr("Power")+" 4: "+json["power4"].toBool()); + edInfo->append(tr("Power")+" 5: "+json["power5"].toBool()); + edInfo->append(tr("Door Open")+" 5: "+json["isOpen"].toBool()); + edInfo->append(tr("Relay On")+" 5: "+json["relaySwitch"].toBool()); + }); + }); + + setAttribute(Qt::WA_DeleteOnClose); + setModal(true); + show(); +} + +void BadPointDetectDialog::keyPressEvent(QKeyEvent *event) { + if(event->key() == Qt::Key_F3) { + + } +} +#define Distance 6 +void BadPointWgt::paintEvent(QPaintEvent *) { + QPainter painter(this); + painter.translate(10, 9); + QPen pen; + pen.setCapStyle(Qt::RoundCap); + if(rgb) { + pen.setWidth(18); + pen.setColor(Qt::black); + painter.setPen(pen); + painter.drawPoint(0, 0); + } else { + pen.setWidth(9); + if(r) { + pen.setColor(Qt::red); + painter.setPen(pen); + painter.drawPoint(QPointF(-sin(60*3.14159265/180)*Distance, -sin(30*3.14159265/180)*Distance)); + } + if(g) { + pen.setColor(QColor(0x00cc00)); + painter.setPen(pen); + painter.drawPoint(QPointF(sin(60*3.14159265/180)*Distance, -sin(30*3.14159265/180)*Distance)); + } + if(b) { + pen.setColor(Qt::blue); + painter.setPen(pen); + painter.drawPoint(0, Distance); + } + } +} diff --git a/LedOK/device/badpointdetectdialog.h b/LedOK/device/badpointdetectdialog.h new file mode 100644 index 0000000..edb8780 --- /dev/null +++ b/LedOK/device/badpointdetectdialog.h @@ -0,0 +1,24 @@ +#ifndef BADPOINTDET_H +#define BADPOINTDET_H + +#include + +class BadPointWgt : public QWidget { + Q_OBJECT +public: + explicit BadPointWgt(QWidget *parent = 0) : QWidget(parent){} + + bool rgb = false, r=false, g=false, b=false; +protected: + void paintEvent(QPaintEvent *ev) override; +}; + +class BadPointDetectDialog : public QDialog { + Q_OBJECT +public: + explicit BadPointDetectDialog(QWidget *parent = 0); +protected: + virtual void keyPressEvent(QKeyEvent *ev); +}; + +#endif // BADPOINTDET_H diff --git a/LedOK/device/ctrladvancedpanel.cpp b/LedOK/device/ctrladvancedpanel.cpp index 7fa9608..072b42c 100644 --- a/LedOK/device/ctrladvancedpanel.cpp +++ b/LedOK/device/ctrladvancedpanel.cpp @@ -30,6 +30,7 @@ #include #include #include +#include CtrlAdvancedPanel::CtrlAdvancedPanel() { setFocusPolicy(Qt::StrongFocus); @@ -1299,6 +1300,7 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { grpG12 = new QGroupBox; { auto hBox = new HBox(grpG12); + hBox->setSpacing(2); auto edG12Reso = new QComboBox; edG12Reso->setMinimumWidth(160); @@ -1316,27 +1318,72 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { edG12Reso->addItem("1280x720P50", "1280x720@50.00-1720-1760-1980-725-730-750-5-74250"); edG12Reso->addItem("720x576P50", "720x576@50.00-732-796-864-581-586-625-a-27000"); edG12Reso->addItem("720x480P60", "720x480@59.94-736-798-858-489-495-525-a-27000"); + edG12Reso->addItem("Custom", "Custom"); hBox->addWidget(edG12Reso); + auto cosWidth = new QLineEdit; + cosWidth->setMaximumWidth(40); + hBox->addWidget(cosWidth); + auto cuslb1 = hBox->addLabel("x"); + auto cosHeight = new QLineEdit; + cosHeight->setMaximumWidth(40); + hBox->addWidget(cosHeight); + auto cuslb2 = hBox->addLabel("FPS"); + auto cosFPS = new QLineEdit; + cosFPS->setMaximumWidth(30); + hBox->addWidget(cosFPS); + hBox->addSpacing(2); + + connect(edG12Reso, &QComboBox::currentTextChanged, this, [=](const QString &text) { + auto isShow = text=="Custom"; + cosWidth->setVisible(isShow); + cosHeight->setVisible(isShow); + cosFPS->setVisible(isShow); + cuslb1->setVisible(isShow); + cuslb2->setVisible(isShow); + }); + emit edG12Reso->currentTextChanged(""); + btnSets.push_back(btn = new QPushButton); connect(btn, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - JObj json; - json.insert("_id", "SetScreenSizeTo3568"); - json.insert("_type", "SetScreenSizeTo3568"); - json.insert("screenSize", edG12Reso->currentData().toString()); - if(gSelCards.count() == 1) { - auto waitingDlg = new WaitingDlg(this, translate("","Setting ")+translate("","Screen Size")+" 3568 ..."); - Def_CtrlReqPre - connect(reply, &QNetworkReply::finished, this, [=] { - Def_CtrlSetReqAfter - }); + auto screenSize = edG12Reso->currentData().toString(); + if(screenSize=="Custom") { + JObj json; + json.insert("_id", "CustomHdmiResolution"); + json.insert("_type", "CustomHdmiResolution"); + json.insert("width", cosWidth->text().toInt()); + json.insert("height", cosHeight->text().toInt()); + json.insert("frame", cosFPS->text().toDouble()); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, translate("","Setting ")+translate("","Screen Size")+" 3568 ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + for(auto &card : gSelCards) { + Def_CtrlSetMulti(translate("","Set ")+translate("","Screen Size")+" 3568") + } + } } else { - for(auto &card : gSelCards) { - Def_CtrlSetMulti(translate("","Set ")+translate("","Screen Size")+" 3568") + JObj json; + json.insert("_id", "SetScreenSizeTo3568"); + json.insert("_type", "SetScreenSizeTo3568"); + json.insert("screenSize", screenSize); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, translate("","Setting ")+translate("","Screen Size")+" 3568 ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + for(auto &card : gSelCards) { + Def_CtrlSetMulti(translate("","Set ")+translate("","Screen Size")+" 3568") + } } } }); @@ -2461,6 +2508,150 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { line->setFrameStyle(QFrame::HLine | QFrame::Sunken); vBox->addWidget(line); + hBox = new HBox(vBox); + hBox->addLabel("Launch Launcher:"); + auto edLauLauYes = new QRadioButton("ON"); + auto edLauLauNo = new QRadioButton("OFF"); + hBox->addWidget(edLauLauYes); + hBox->addWidget(edLauLauNo); + btnSets.push_back(btn = new QPushButton); + connect(btn, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + if(! edLauLauYes->isChecked() && ! edLauLauNo->isChecked()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select a value")); + return; + } + JObj json; + json.insert("_id", "SetLauncherStartState"); + json.insert("_type", "SetLauncherStartState"); + json.insert("isStart", edLauLauYes->isChecked()); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("SetLauncherStartState")); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + for(auto &card : gSelCards) { + Def_CtrlSetMulti(tr("SetLauncherStartState")) + } + } + }); + hBox->addWidget(btn); + + btnGets.push_back(btn = new QPushButton); + connect(btn, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + JObj json; + json.insert("_id", "GetLauncherStartState"); + json.insert("_type", "GetLauncherStartState"); + edLauLauYes->setChecked(false); + edLauLauNo->setChecked(false); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("GetLauncherStartState")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + waitingDlg->success(); + (json["isStart"].toBool() ? edLauLauYes : edLauLauNo)->setChecked(true); + }); + } else { + for(auto &card : gSelCards) { + auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + connect(reply, &QNetworkReply::finished, this, [=] { + JValue json; + auto err = errStrWithJson(reply, &json); + if(err.isEmpty()) { + err = (json["isStart"].toBool() ? edLauLauYes : edLauLauNo)->text(); + } + gFdResInfo->append(card.id+" "+tr("GetLauncherStartState")+" "+err); + }); + } + } + }); + hBox->addWidget(btn); + hBox->addSpacing(20); + + + hBox->addLabel("Bypass Mode:"); + auto edBypassYes = new QRadioButton("ON"); + auto edBypassNo = new QRadioButton("OFF"); + hBox->addWidget(edBypassYes); + hBox->addWidget(edBypassNo); + auto btnGrpBypass = new QButtonGroup(hBox); + btnGrpBypass->addButton(edBypassYes, 0); + btnGrpBypass->addButton(edBypassNo, 1); + btnSets.push_back(btn = new QPushButton); + connect(btn, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + if(! edBypassYes->isChecked() && ! edBypassNo->isChecked()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select a value")); + return; + } + JObj json; + json.insert("_id", "SetByPassModel"); + json.insert("_type", "SetByPassModel"); + json.insert("model", edBypassYes->isChecked() ? 1 : 0); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("Set Bypass Mode")); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + for(auto &card : gSelCards) { + Def_CtrlSetMulti(tr("Set Bypass Mode")) + } + } + }); + hBox->addWidget(btn); + + btnGets.push_back(btn = new QPushButton); + connect(btn, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + JObj json; + json.insert("_id", "GetByPassModel"); + json.insert("_type", "GetByPassModel"); + edBypassYes->setChecked(false); + edBypassNo->setChecked(false); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("Get Bypass Mode")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + waitingDlg->success(); + (json["isStart"].toBool() ? edBypassYes : edBypassNo)->setChecked(true); + }); + } else { + for(auto &card : gSelCards) { + auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + connect(reply, &QNetworkReply::finished, this, [=] { + JValue json; + auto err = errStrWithJson(reply, &json); + if(err.isEmpty()) { + err = (json["model"].toInt()==1 ? edBypassYes : edBypassNo)->text(); + } + gFdResInfo->append(card.id+" "+tr("Get Bypass Mode")+" "+err); + }); + } + } + }); + hBox->addWidget(btn); + hBox->addStretch(); + + grpM80 = new QGroupBox; { @@ -2490,7 +2681,7 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "SetSpecialResolution"); json.insert("_type", "SetSpecialResolution"); json.insert("displayResolution", fdM80Resolu->currentText()); //显示分辨率 @@ -2516,7 +2707,7 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "GetSpecialResolution"); json.insert("_type", "GetSpecialResolution"); if(gSelCards.count() == 1) { @@ -2532,8 +2723,8 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { 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); + JValue json; + auto err = errStrWithJson(reply, &json); if(err.isEmpty()) err = tr("totalResolution")+"["+json["totalResolution"].toString()+"], "+tr("strCurDisplayResolution")+"["+json["displayResolution"].toString()+"]"; gFdResInfo->append(cardId+" "+tr("GetSpecialResolution")+" "+err); }); @@ -2549,7 +2740,7 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "CleanDisplayScreenSize"); json.insert("_type", "CleanDisplayScreenSize"); if(gSelCards.count() == 1) { @@ -2885,30 +3076,75 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { hBox->addStretch(); + hBox = new HBox(vBox); + hBox->addLabel("ADB"); + auto bnADBOpen = new QPushButton("Open"); + auto bnADBClose = new QPushButton("Close"); + hBox->addWidget(bnADBOpen); + hBox->addWidget(bnADBClose); - fdIsOpenADB = new QCheckBox; - connect(fdIsOpenADB, &QCheckBox::toggled, this, [this](bool checked) { + connect(bnADBOpen, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "OpenAdb"); json.insert("_type", "OpenAdb"); - json.insert("open", checked); + json.insert("open", true); if(gSelCards.count() == 1) { - auto waitingDlg = new WaitingDlg(this, tr("OpenAdb")+" ..."); + auto waitingDlg = new WaitingDlg(this, "Opening ADB ..."); Def_CtrlReqPre connect(reply, &QNetworkReply::finished, this, [=] { Def_CtrlSetReqAfter }); } else { for(auto &card : gSelCards) { - Def_CtrlSetMulti(tr("OpenAdb")) + Def_CtrlSetMulti("Open ADB") } } }); - vBox->addWidget(fdIsOpenADB); + connect(bnADBClose, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + JObj json; + json.insert("_id", "OpenAdb"); + json.insert("_type", "OpenAdb"); + json.insert("open", false); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, "Closing ADB ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + for(auto &card : gSelCards) { + Def_CtrlSetMulti("Close ADB") + } + } + }); + + auto bnConnect = new QPushButton("Connect"); + auto bnDisconnect = new QPushButton("Disconnect"); + hBox->addWidget(bnConnect); + hBox->addWidget(bnDisconnect); + connect(bnConnect, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + OpenCMD({"/K", "adb", "connect", gSelCards[0].ip}); + }); + connect(bnDisconnect, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + OpenCMD({"/K", "adb", "disconnect", gSelCards[0].ip}); + }); + hBox->addStretch(); hBox = new HBox(vBox); @@ -3193,9 +3429,12 @@ CtrlAdvancedPanel::CtrlAdvancedPanel() { for(auto btn : btnSets) btn->setProperty("ssType", "progManageTool"); for(auto btn : btnGets) btn->setProperty("ssType", "progManageTool"); - +#ifdef leyide + isPassed = true; +#else if(QSettings().value("advUiPs", "888").toString().isEmpty()) isPassed = true; - connect(gDevicePanel, &DevicePanel::sigSelectedDeviceList, this, [this] { +#endif + connect(gDevicePanel, &DevicePanel::sigSelectedDeviceList, this, [=] { if(isVisible()) init(); }); transUi(); @@ -3364,7 +3603,6 @@ void CtrlAdvancedPanel::transUi() { lbBaudModel->setText(tr("Model")); lbUart->setText(tr("Uart")); lbBaud->setText(tr("Baud")); - fdIsOpenADB->setText(tr("Open ADB")); btnSendCustomJson->setText(translate("","Send")); btnCustomJsonGet->setText(translate("","Get")); @@ -3381,7 +3619,7 @@ void CtrlAdvancedPanel::transUi() { lbScreenWidth->setText(tr("Screen Width(pixel)")); fdCompanyId->setPlaceholderText(tr("Compant ID")); - btnWareUpdate->setText(tr("Firmware Management")); + btnWareUpdate->setText(tr("Firmware Manager")); lbWareTip->setText("(APK / FPGA "+tr("update or uninstall")+")"); btnApkCheck->setText(tr("Check Apk")); btnGetLog->setText(tr("Check Log")); diff --git a/LedOK/device/ctrladvancedpanel.h b/LedOK/device/ctrladvancedpanel.h index 562cba7..51f448e 100644 --- a/LedOK/device/ctrladvancedpanel.h +++ b/LedOK/device/ctrladvancedpanel.h @@ -78,7 +78,6 @@ private: QGroupBox *grpBoxHiddenSettings; QPushButton *btnSysUpd, *btnMcuUpd, *btnMcuGet; QLabel *lbRotate, *lbChargingStation, *lbBaudCfg, *lbBaudModel, *lbUart, *lbBaud; - QCheckBox *fdIsOpenADB; QLabel *lbCustomJson; QTextEdit *fdCustomJson; QPushButton *btnSendCustomJson, *btnCustomJsonGet; diff --git a/LedOK/device/ctrlbrightpanel.cpp b/LedOK/device/ctrlbrightpanel.cpp index 9bfa389..0cb0931 100644 --- a/LedOK/device/ctrlbrightpanel.cpp +++ b/LedOK/device/ctrlbrightpanel.cpp @@ -62,7 +62,7 @@ CtrlBrightPanel::CtrlBrightPanel() { fdBrightTip->setWordWrap(true); vBox->addWidget(fdBrightTip); - auto hBox = new QHBoxLayout; + auto hBox = new HBox(vBox); hBox->addStretch(); lbSensi = new QLabel; @@ -82,15 +82,15 @@ CtrlBrightPanel::CtrlBrightPanel() { }); hBox->addWidget(lbSensiValue); - btnSensiSet = new QPushButton; - btnSensiSet->setMinimumSize(60, 30); - btnSensiSet->setProperty("ssType", "progManageTool"); - connect(btnSensiSet, &QPushButton::clicked, this, [this] { + auto bn = new QPushButton; + btnSets.push_back(bn); + bn->setMinimumSize(60, 30); + connect(bn, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "SetBrightnessSensitivity"); json.insert("_type", "SetBrightnessSensitivity"); json.insert("sensitivity", fdSensi->value()); @@ -106,17 +106,16 @@ CtrlBrightPanel::CtrlBrightPanel() { } } }); - hBox->addWidget(btnSensiSet); + hBox->addWidget(bn); - btnSensiGet = new QPushButton; - btnSensiGet->setMinimumSize(60, 30); - btnSensiGet->setProperty("ssType", "progManageTool"); - connect(btnSensiGet, &QPushButton::clicked, this, [this] { + btnGets.push_back(bn = new QPushButton); + bn->setMinimumSize(60, 30); + connect(bn, &QPushButton::clicked, this, [this] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "GetBrightnessSensitivity"); json.insert("_type", "GetBrightnessSensitivity"); if(gSelCards.count() == 1) { @@ -129,9 +128,9 @@ CtrlBrightPanel::CtrlBrightPanel() { }); } else { for(auto &card : gSelCards) { - auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + auto reply = NetReq("http://"+card.ip+":2016/settings").post(json); auto cardId = card.id; - connect(reply, &QNetworkReply::finished, this, [reply, cardId] { + connect(reply, &QNetworkReply::finished, this, [=] { JValue json; auto err = errStrWithJson(reply, &json); if(err.isEmpty()) err = QString::number(json["sensitivity"].toInt()); @@ -140,44 +139,40 @@ CtrlBrightPanel::CtrlBrightPanel() { } } }); - hBox->addWidget(btnSensiGet); + hBox->addWidget(bn); hBox->addStretch(); - vBox->addLayout(hBox); - hBox = new QHBoxLayout; + hBox = new HBox(vBox); hBox->addStretch(); - lbMinBright = new QLabel; + lbMinBright = hBox->addLabel(); lbMinBright->setMinimumWidth(120); lbMinBright->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - hBox->addWidget(lbMinBright); - fdMinBright = new QSlider(Qt::Horizontal); - fdMinBright->setRange(1, 100); - hBox->addWidget(fdMinBright); + edMinBright = new QSlider(Qt::Horizontal); + edMinBright->setRange(1, 100); + hBox->addWidget(edMinBright); - auto lbMinBrightValue = new QLabel(QString::number(fdMinBright->value())+"%"); + auto lbMinBrightValue = hBox->addLabel(QString::number(edMinBright->value())+"%"); lbMinBrightValue->setMinimumWidth(40); lbMinBrightValue->setAlignment(Qt::AlignRight | Qt::AlignVCenter); - connect(fdMinBright, &QSlider::valueChanged, lbSensiValue, [lbMinBrightValue](int value) { + connect(edMinBright, &QSlider::valueChanged, lbSensiValue, [lbMinBrightValue](int value) { lbMinBrightValue->setText(QString::number(value)+"%"); }); - hBox->addWidget(lbMinBrightValue); - btnMinBrightSet = new QPushButton; - btnMinBrightSet->setMinimumSize(60, 30); - btnMinBrightSet->setProperty("ssType", "progManageTool"); - connect(btnMinBrightSet, &QPushButton::clicked, this, [this] { + btnSets.push_back(bn = new QPushButton); + bn->setMinimumSize(60, 30); + connect(bn, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } auto isAdaptToOld = fdAdaptToOld->isChecked(); - QJsonObject json; + JObj json; json.insert("_id", "SetMinBrightness"); json.insert("_type", "SetMinBrightness"); - auto brightPercent = fdMinBright->value(); + auto brightPercent = edMinBright->value(); if(! isAdaptToOld) json.insert("minBrightnessPercentage", brightPercent); if(gSelCards.count() == 1) { if(isAdaptToOld) json.insert("brightness", (brightPercent * gSelCards[0].BrightnessLevel + 50) / 100); @@ -193,17 +188,16 @@ CtrlBrightPanel::CtrlBrightPanel() { } } }); - hBox->addWidget(btnMinBrightSet); + hBox->addWidget(bn); - btnMinBrightGet = new QPushButton; - btnMinBrightGet->setMinimumSize(60, 30); - btnMinBrightGet->setProperty("ssType", "progManageTool"); - connect(btnMinBrightGet, &QPushButton::clicked, this, [this] { + btnGets.push_back(bn = new QPushButton); + bn->setMinimumSize(60, 30); + connect(bn, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "GetMinBrightness"); json.insert("_type", "GetMinBrightness"); if(gSelCards.count() == 1) { @@ -215,11 +209,11 @@ CtrlBrightPanel::CtrlBrightPanel() { waitingDlg->success(); auto value = json["minBrightnessPercentage"].toInt(-1); if(value==-1) value = qRound(json["brightness"].toInt() * 100.0 / brightLevel); - fdMinBright->setValue(value); + edMinBright->setValue(value); }); } else { for(auto &card : gSelCards) { - auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + auto reply = NetReq("http://"+card.ip+":2016/settings").post(json); auto cardId = card.id; auto brightLevel = card.BrightnessLevel; connect(reply, &QNetworkReply::finished, this, [=] { @@ -235,10 +229,99 @@ CtrlBrightPanel::CtrlBrightPanel() { } } }); - hBox->addWidget(btnMinBrightGet); + hBox->addWidget(bn); + + hBox->addStretch(); + + hBox = new HBox(vBox); + hBox->addStretch(); + + lbMaxBright = hBox->addLabel(); + lbMaxBright->setMinimumWidth(120); + lbMaxBright->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + + edMaxBright = new QSlider(Qt::Horizontal); + edMaxBright->setRange(1, 100); + hBox->addWidget(edMaxBright); + + auto lbMaxBrightValue = hBox->addLabel(QString::number(edMaxBright->value())+"%"); + lbMaxBrightValue->setMinimumWidth(40); + lbMaxBrightValue->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + connect(edMaxBright, &QSlider::valueChanged, lbSensiValue, [=](int value) { + lbMaxBrightValue->setText(QString::number(value)+"%"); + }); + + btnSets.push_back(bn = new QPushButton); + bn->setMinimumSize(60, 30); + connect(bn, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + auto isAdaptToOld = fdAdaptToOld->isChecked(); + JObj json; + json.insert("_id", "SetMaxBrightness"); + json.insert("_type", "SetMaxBrightness"); + auto brightPercent = edMaxBright->value(); + if(! isAdaptToOld) json.insert("maxBrightnessPercentage", brightPercent); + if(gSelCards.count() == 1) { + if(isAdaptToOld) json.insert("brightness", (brightPercent * gSelCards[0].BrightnessLevel + 50) / 100); + auto waitingDlg = new WaitingDlg(this, tr("SetMaxBrightness")+" ..."); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + for(auto &card : gSelCards) { + if(isAdaptToOld) json.insert("brightness", (brightPercent * card.BrightnessLevel + 50) / 100); + Def_CtrlSetMulti(tr("SetMaxBrightness")); + } + } + }); + hBox->addWidget(bn); + + btnGets.push_back(bn = new QPushButton); + bn->setMinimumSize(60, 30); + connect(bn, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + JObj json; + json.insert("_id", "GetMaxBrightness"); + json.insert("_type", "GetMaxBrightness"); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("GetMaxBrightness")+" ..."); + Def_CtrlReqPre + auto brightLevel = card.BrightnessLevel; + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSingleGetReply + waitingDlg->success(); + auto value = json["maxBrightnessPercentage"].toInt(-1); + if(value==-1) value = qRound(json["brightness"].toInt() * 100.0 / brightLevel); + edMaxBright->setValue(value); + }); + } else { + for(auto &card : gSelCards) { + auto reply = NetReq("http://"+card.ip+":2016/settings").post(json); + auto cardId = card.id; + auto brightLevel = card.BrightnessLevel; + connect(reply, &QNetworkReply::finished, this, [=] { + JValue json; + auto err = errStrWithJson(reply, &json); + if(err.isEmpty()) { + auto value = json["maxBrightnessPercentage"].toInt(-1); + if(value==-1) value = qRound(json["brightness"].toInt() * 100.0 / brightLevel); + err = QString::number(value)+"%"; + } + gFdResInfo->append(cardId+" "+tr("GetMaxBrightness")+" "+err); + }); + } + } + }); + hBox->addWidget(bn); hBox->addStretch(); - vBox->addLayout(hBox); line = new QFrame; @@ -251,7 +334,7 @@ CtrlBrightPanel::CtrlBrightPanel() { fdSensiTypeTip->setWordWrap(true); vBox->addWidget(fdSensiTypeTip); - hBox = new QHBoxLayout; + hBox = new HBox(vBox); hBox->addStretch(); fdR68 = new QRadioButton("R68/RL3"); @@ -303,9 +386,10 @@ CtrlBrightPanel::CtrlBrightPanel() { return; } } + auto rr = fdRL2->isChecked() ? 2 : 3; QJsonArray values; for(int j=0; j<255; j++) { - auto val = sheet->read(3, j+3).toString(); + auto val = sheet->read(rr, j+3).toString(); if(val.isEmpty()) { QMessageBox::information(this, translate("","Tip"), "Cell is empty at 3, "+QString::number(j+3)); return; @@ -379,10 +463,9 @@ CtrlBrightPanel::CtrlBrightPanel() { hBox->addWidget(btnTableGet); hBox->addStretch(); - vBox->addLayout(hBox); - hBox = new QHBoxLayout; + hBox = new HBox(vBox); hBox->addStretch(); lbCurBright = new QLabel; @@ -421,7 +504,7 @@ CtrlBrightPanel::CtrlBrightPanel() { }); } else { for(auto &card : gSelCards) { - auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + auto reply = NetReq("http://"+card.ip+":2016/settings").post(json); connect(reply, &QNetworkReply::finished, this, [reply, card] { JValue json; auto err = errStrWithJson(reply, &json); @@ -434,7 +517,6 @@ CtrlBrightPanel::CtrlBrightPanel() { hBox->addWidget(btnCurBrightGet); hBox->addStretch(); - vBox->addLayout(hBox); vBox->addStretch(); } { @@ -797,6 +879,9 @@ CtrlBrightPanel::CtrlBrightPanel() { if(checked) stack->setCurrentIndex(idx); }); + for(auto btn : btnSets) btn->setProperty("ssType", "progManageTool"); + for(auto btn : btnGets) btn->setProperty("ssType", "progManageTool"); + connect(gDevicePanel, &DevicePanel::sigSelectedDeviceList, this, [this] { if(isVisible()) init(); }); @@ -835,8 +920,8 @@ void CtrlBrightPanel::init() { json = JObj(); json.insert("_id", "GetBrightnessSensitivity"); json.insert("_type", "GetBrightnessSensitivity"); - reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); - connect(reply, &QNetworkReply::finished, this, [this, reply] { + reply = NetReq("http://"+card.ip+":2016/settings").post(json); + connect(reply, &QNetworkReply::finished, this, [=] { JValue json; auto err = errStrWithJson(reply, &json); if(! err.isEmpty()) return; @@ -850,14 +935,26 @@ void CtrlBrightPanel::init() { json = JObj(); json.insert("_id", "GetMinBrightness"); json.insert("_type", "GetMinBrightness"); - reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); - connect(reply, &QNetworkReply::finished, this, [this, reply, card] { + reply = NetReq("http://"+card.ip+":2016/settings").post(json); + connect(reply, &QNetworkReply::finished, this, [=] { JValue json; auto err = errStrWithJson(reply, &json); if(! err.isEmpty()) return; auto value = json["minBrightnessPercentage"].toInt(-1); if(value==-1) value = qRound(json["brightness"].toInt() * 100.0 / card.BrightnessLevel); - fdMinBright->setValue(value); + edMinBright->setValue(value); + }); + json = JObj(); + json.insert("_id", "GetMaxBrightness"); + json.insert("_type", "GetMaxBrightness"); + reply = NetReq("http://"+card.ip+":2016/settings").post(json); + connect(reply, &QNetworkReply::finished, this, [=] { + JValue json; + auto err = errStrWithJson(reply, &json); + if(! err.isEmpty()) return; + auto value = json["maxBrightnessPercentage"].toInt(-1); + if(value==-1) value = qRound(json["brightness"].toInt() * 100.0 / card.BrightnessLevel); + edMaxBright->setValue(value); }); } @@ -866,6 +963,9 @@ void CtrlBrightPanel::changeEvent(QEvent *event) { if(event->type() == QEvent::LanguageChange) transUi(); } void CtrlBrightPanel::transUi() { + for(auto btn : btnSets) btn->setText(translate("","Set")); + for(auto btn : btnGets) btn->setText(translate("","Get")); + lbTitle->setText(tr("Brightness Config")); radioAuto->setText(tr("Auto")); radioManual->setText(tr("Manual")); @@ -875,15 +975,12 @@ void CtrlBrightPanel::transUi() { fdBrightTip->setText(tr("BrightTip1")); fdSensiTypeTip->setText(tr("BrightTip2")); lbSensi->setText(tr("Sensitivity")); - lbMinBright->setText(tr("Minbrightness")); - btnMinBrightSet->setText(translate("","Set")); - btnSensiSet->setText(translate("","Set")); + lbMinBright->setText(tr("Min Brightness")); + lbMaxBright->setText(tr("Max Brightness")); btnUpload->setText(tr("Upload File")); - btnMinBrightGet->setText(translate("","Readback")); - btnSensiGet->setText(translate("","Readback")); btnTableGet->setText(translate("","Readback")); btnCurBrightGet->setText(translate("","Refresh")); - lbCurBright->setText(tr("Cur Brigntness")+": "); + lbCurBright->setText(tr("Ambient Brigntness")+": "); lbFixedBright->setText(tr("Brightness value")); btnFixedSet->setText(translate("","Set")); diff --git a/LedOK/device/ctrlbrightpanel.h b/LedOK/device/ctrlbrightpanel.h index 22ab62c..7dc6d16 100644 --- a/LedOK/device/ctrlbrightpanel.h +++ b/LedOK/device/ctrlbrightpanel.h @@ -23,21 +23,16 @@ private: bool restoreScheduleJson(JValue &, int); void getScheduleJson(QJsonObject &, int); QLabel *lbTitle; - QRadioButton *radioAuto; - QRadioButton *radioManual; - QRadioButton *radioSchedule; + QRadioButton *radioAuto, *radioManual, *radioSchedule; QCheckBox *fdAdaptToOld; - char mSensi{-1}; - char mTask{-1}; + char mSensi = -1; + char mTask = -1; + std::vector btnSets, btnGets; QLabel *lbSensi; QSlider *fdSensi; - QLabel *lbMinBright; - QSlider *fdMinBright; - QPushButton *btnSensiSet; - QPushButton *btnSensiGet; - QPushButton *btnMinBrightSet; - QPushButton *btnMinBrightGet; + QLabel *lbMinBright, *lbMaxBright; + QSlider *edMinBright, *edMaxBright; QRadioButton *fdR68; QRadioButton *fdRL2; QPushButton *btnUpload; diff --git a/LedOK/device/ctrlhdmipanel.cpp b/LedOK/device/ctrlhdmipanel.cpp index abc9bd8..cdaa029 100644 --- a/LedOK/device/ctrlhdmipanel.cpp +++ b/LedOK/device/ctrlhdmipanel.cpp @@ -59,16 +59,6 @@ CtrlHdmiPanel::CtrlHdmiPanel() { hBox->addSpacing(20); - edAutoSwitch = new QCheckBox; - edAutoSwitch->setChecked(true); - hBox->addWidget(edAutoSwitch); - hBox->addStretch(); - - vBox->addSpacing(20); - - hBox = new HBox(vBox); - hBox->addStretch(); - btnSyncSet = new QPushButton; btnSyncSet->setMinimumSize(60, 30); btnSyncSet->setProperty("ssType", "progManageTool"); @@ -98,36 +88,78 @@ CtrlHdmiPanel::CtrlHdmiPanel() { } } } - if(id) { - json = JObj(); - json.insert("_id", "AutoSyncSwitch"); - json.insert("_type", "AutoSyncSwitch"); - json.insert("isAuto", edAutoSwitch->isChecked()); - if(gSelCards.count() == 1) { - if(gSelCards[0].id.startsWith("g", Qt::CaseInsensitive) - || gSelCards[0].id.startsWith("m8h", Qt::CaseInsensitive) - || gSelCards[0].id.startsWith("m8s", Qt::CaseInsensitive) - || gSelCards[0].id.startsWith("y8h", Qt::CaseInsensitive) - ) { - auto waitingDlg = new WaitingDlg(this, tr("SyncSwitch")); - Def_CtrlReqPre - connect(reply, &QNetworkReply::finished, this, [=] { - Def_CtrlSetReqAfter - }); - } - } else { - for(auto &card : gSelCards) if(card.id.startsWith("g", Qt::CaseInsensitive) - || card.id.startsWith("m8h", Qt::CaseInsensitive) - || card.id.startsWith("m8s", Qt::CaseInsensitive) - || card.id.startsWith("y8h", Qt::CaseInsensitive) - ) { - Def_CtrlSetMulti(tr("SyncSwitch")) - } + // if(id) { + // json = JObj(); + // json.insert("_id", "AutoSyncSwitch"); + // json.insert("_type", "AutoSyncSwitch"); + // json.insert("isAuto", edAutoSwitch->isChecked()); + // if(gSelCards.count() == 1) { + // if(gSelCards[0].id.startsWith("g", Qt::CaseInsensitive) + // || gSelCards[0].id.startsWith("m8h", Qt::CaseInsensitive) + // || gSelCards[0].id.startsWith("m8s", Qt::CaseInsensitive) + // || gSelCards[0].id.startsWith("y8h", Qt::CaseInsensitive) + // ) { + // auto waitingDlg = new WaitingDlg(this, tr("SyncSwitch")); + // Def_CtrlReqPre + // connect(reply, &QNetworkReply::finished, this, [=] { + // Def_CtrlSetReqAfter + // }); + // } + // } else { + // for(auto &card : gSelCards) if(card.id.startsWith("g", Qt::CaseInsensitive) + // || card.id.startsWith("m8h", Qt::CaseInsensitive) + // || card.id.startsWith("m8s", Qt::CaseInsensitive) + // || card.id.startsWith("y8h", Qt::CaseInsensitive) + // ) { + // Def_CtrlSetMulti(tr("SyncSwitch")) + // } + // } + // } + }); + hBox->addWidget(btnSyncSet); + + hBox->addStretch(); + + vBox->addSpacing(20); + + hBox = new HBox(vBox); + hBox->addStretch(); + + edAutoSwitch = new QCheckBox; + edAutoSwitch->setChecked(true); + hBox->addWidget(edAutoSwitch); + + btnAutoSet = new QPushButton; + btnAutoSet->setMinimumSize(60, 30); + btnAutoSet->setProperty("ssType", "progManageTool"); + connect(btnAutoSet, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + JObj json; + json.insert("_id", "AutoSyncSwitch"); + json.insert("_type", "AutoSyncSwitch"); + json.insert("isAuto", edAutoSwitch->isChecked()); + if(gSelCards.count() == 1) { + auto waitingDlg = new WaitingDlg(this, tr("SyncSwitch")); + Def_CtrlReqPre + connect(reply, &QNetworkReply::finished, this, [=] { + Def_CtrlSetReqAfter + }); + } else { + for(auto &card : gSelCards) { + Def_CtrlSetMulti(tr("SyncSwitch")) } } }); - hBox->addWidget(btnSyncSet); - hBox->addSpacing(20); + hBox->addWidget(btnAutoSet); + hBox->addStretch(); + + vBox->addSpacing(20); + + hBox = new HBox(vBox); + hBox->addStretch(); btnSyncGet = new QPushButton; btnSyncGet->setMinimumSize(60, 30); @@ -390,6 +422,7 @@ void CtrlHdmiPanel::transUi() { fdAsync->setText(tr("Async")); btnSyncSet->setText(translate("","Set")); + btnAutoSet->setText(translate("","Set")); btnSyncGet->setText(translate("","Readback")); tableSche->setHeaderText("start", tr("Start Time")); diff --git a/LedOK/device/ctrlhdmipanel.h b/LedOK/device/ctrlhdmipanel.h index c08c541..d0da85c 100644 --- a/LedOK/device/ctrlhdmipanel.h +++ b/LedOK/device/ctrlhdmipanel.h @@ -23,7 +23,7 @@ private: QLabel *lbHdmiCfg; QRadioButton *fdManual, *fdSchedule, *fdAsync, *fdHdmi, *fdHdmi2; QCheckBox *edAutoSwitch; - QPushButton *btnSyncSet, *btnSyncGet; + QPushButton *btnSyncSet, *btnAutoSet, *btnSyncGet; TableWidget *tableSche; QPushButton *btnScheAdd; diff --git a/LedOK/device/ctrlnetworkpanel.cpp b/LedOK/device/ctrlnetworkpanel.cpp index 0b6ae9a..91aed6a 100644 --- a/LedOK/device/ctrlnetworkpanel.cpp +++ b/LedOK/device/ctrlnetworkpanel.cpp @@ -1,7 +1,6 @@ #include "ctrlnetworkpanel.h" #include "gutil/qwaitingdlg.h" #include "main.h" -#include "tools.h" #include "devicepanel.h" #include "gutil/qgui.h" #include "gutil/qnetwork.h" @@ -101,7 +100,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { btnLanSet = new QPushButton; btnLanSet->setMinimumSize(QSize(60, 30)); btnLanSet->setProperty("ssType", "progManageTool"); - connect(btnLanSet, &QPushButton::clicked, this, [this] { + connect(btnLanSet, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; @@ -164,7 +163,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { btnLanGet = new QPushButton; btnLanGet->setMinimumSize(QSize(60, 30)); btnLanGet->setProperty("ssType", "progManageTool"); - connect(btnLanGet, &QPushButton::clicked, this, [this] { + connect(btnLanGet, &QPushButton::clicked, this, [=] { if(gSelCards.isEmpty()) { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; @@ -175,7 +174,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { if(gSelCards.count() == 1) { auto waitingDlg = new WaitingDlg(this, tr("GetEthernet")); Def_CtrlReqPre - connect(reply, &QNetworkReply::finished, this, [this, reply, waitingDlg] { + connect(reply, &QNetworkReply::finished, this, [=] { Def_CtrlSingleGetReply waitingDlg->success(); if(json["dhcp"].toBool()) { @@ -192,9 +191,9 @@ CtrlNetworkPanel::CtrlNetworkPanel() { }); } else { for(auto &card : gSelCards) { - auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + auto reply = NetReq("http://"+card.ip+":2016/settings").post(json); auto cardId = card.id; - connect(reply, &QNetworkReply::finished, this, [reply, cardId] { + connect(reply, &QNetworkReply::finished, this, [=] { JValue json; auto err = errStrWithJson(reply, &json); if(err.isEmpty()) err = json["dhcp"].toBool() ? tr("DHCP IP") : tr("STATIC IP"); @@ -227,7 +226,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { auto vvv = new VBox(hBox); auto hBox = new HBox(vvv); hBox->addStretch(); - hBox->addWidget(fdIsWifi = new QCheckBox); + hBox->addWidget(edIsWifi = new QCheckBox); hBox->addStretch(); hBox = new HBox(vvv); @@ -251,13 +250,13 @@ CtrlNetworkPanel::CtrlNetworkPanel() { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - QJsonObject json; + JObj json; json.insert("_id", "GetWifiList"); json.insert("_type", "GetWifiList"); if(gSelCards.count() == 1) { auto waitingDlg = new WaitingDlg(this, tr("GetWifiList")+" ..."); Def_CtrlReqPre - connect(reply, &QNetworkReply::finished, this, [this, reply, waitingDlg] { + connect(reply, &QNetworkReply::finished, this, [=] { Def_CtrlSingleGetReply waitingDlg->success(); auto wifis = json["wifiList"].toArray(); @@ -294,7 +293,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - auto isWifi = fdIsWifi->isChecked(); + auto isWifi = edIsWifi->isChecked(); JObj json; json.insert("_id", "SetSwitchWiFi"); json.insert("_type", "SetSwitchWiFi"); @@ -313,7 +312,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { auto waitingDlg = new WaitingDlg(this, tr("ConfigurationWiFi")+" ..."); waitingDlg->show(); auto card = gSelCards[0]; - auto isG = card.id.startsWith("g", Qt::CaseInsensitive); + auto isG = card.id.startsWith("g", Qt::CaseInsensitive) || card.id.startsWith("m8h", Qt::CaseInsensitive); if(isWifi) { auto reply = NetReq("http://"+card.ip+":2016/settings").post(isG ? jsonG : json); ConnReply(reply, waitingDlg) [=] { @@ -337,7 +336,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { else waitingDlg->success(); } else { for(auto &card : gSelCards) { - auto isG = card.id.startsWith("g", Qt::CaseInsensitive); + auto isG = card.id.startsWith("g", Qt::CaseInsensitive) || card.id.startsWith("m8h", Qt::CaseInsensitive); if(isWifi) { auto reply = NetReq("http://"+card.ip+":2016/settings").post(isG ? jsonG : json); connect(reply, &QNetworkReply::finished, gFdResInfo, [=] { @@ -371,7 +370,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { auto vvv = new VBox(hBox); auto hBox = new HBox(vvv); hBox->addStretch(); - hBox->addWidget(fdIsAP = new QCheckBox); + hBox->addWidget(edIsHotspot = new QCheckBox); hBox->addStretch(); hBox = new HBox(vvv); @@ -400,10 +399,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { hBox->addStretch(); hBox = new HBox(vvv); - - auto lll = new QLabel; - lll->setMinimumWidth(80); - hBox->addWidget(lll); + hBox->addSpacing(86); auto edIs2_4G = new QRadioButton("2.4G"); edIs2_4G->setChecked(true); @@ -424,7 +420,12 @@ CtrlNetworkPanel::CtrlNetworkPanel() { QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); return; } - auto isAp = fdIsAP->isChecked(); + auto isAp = edIsHotspot->isChecked(); + auto hotspotPswd = edHotspotPswd->text(); + if(isAp && (hotspotPswd.size()<8 || !isStrongPswd(hotspotPswd))) { + QMessageBox::warning(this, translate("","Tip"), translate("","The password must have 8 characters at least and contain numbers, uppercase and lowercase letters")); + return; + } JObj jsonG; jsonG.insert("_id", "ControllerWifiSwitch"); jsonG.insert("_type", "ControllerWifiSwitch"); @@ -435,12 +436,12 @@ CtrlNetworkPanel::CtrlNetworkPanel() { json.insert("_type", "ConfigurationHotSpot"); json.insert("apName", edHotspotName->text()); json.insert("apBand", edIs5G->isChecked() ? 1 : 0); - json.insert("password", edHotspotPswd->text()); + json.insert("password", hotspotPswd); if(gSelCards.count() == 1) { auto waitingDlg = new WaitingDlg(this, tr("Config Hotspot")+" ..."); waitingDlg->show(); auto card = gSelCards[0]; - auto isG = card.id.startsWith("g", Qt::CaseInsensitive); + auto isG = card.id.startsWith("g", Qt::CaseInsensitive) || card.id.startsWith("m8h", Qt::CaseInsensitive); if(isG) { auto reply = NetReq("http://"+card.ip+":2016/settings").post(jsonG); connect(waitingDlg, &WaitingDlg::rejected, reply, &QNetworkReply::deleteLater); @@ -466,7 +467,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { } else waitingDlg->success(); } else { for(auto &card : gSelCards) { - auto isG = card.id.startsWith("g", Qt::CaseInsensitive); + auto isG = card.id.startsWith("g", Qt::CaseInsensitive) || card.id.startsWith("m8h", Qt::CaseInsensitive); if(isG) { auto reply = NetReq("http://"+card.ip+":2016/settings").post(jsonG); connect(reply, &QNetworkReply::finished, gFdResInfo, [=] { @@ -491,7 +492,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { vvv->addStretch(); } hBox->addStretch(); - fdIsWifi->setChecked(true); + edIsWifi->setChecked(true); hBox = new HBox(vBox); hBox->addStretch(); @@ -511,18 +512,18 @@ CtrlNetworkPanel::CtrlNetworkPanel() { jsonG.insert("_id", "GetWifiSwitchState"); jsonG.insert("_type", "GetWifiSwitchState"); if(gSelCards.count() == 1) { - auto waitingDlg = new WaitingDlg(this, tr("Get AP or WiFi")+" ..."); + auto waitingDlg = new WaitingDlg(this, tr("Get Hotspot or WiFi")+" ..."); waitingDlg->show(); auto card = gSelCards[0]; - auto isG = card.id.startsWith("g", Qt::CaseInsensitive); + auto isG = card.id.startsWith("g", Qt::CaseInsensitive) || card.id.startsWith("m8h", Qt::CaseInsensitive); auto reply = NetReq("http://"+card.ip+":2016/settings").post(isG ? jsonG : json); connect(waitingDlg, &WaitingDlg::rejected, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, this, [=] { Def_CtrlSingleGetReply waitingDlg->success(); if(isG) { - fdIsWifi->setChecked(json["wifiEnable"].toBool()); - fdIsAP->setChecked(json["apEnable"].toBool()); + edIsWifi->setChecked(json["wifiEnable"].toBool()); + edIsHotspot->setChecked(json["apEnable"].toBool()); edWifiName->setCurrentText(json["wifiName"].toString()); edHotspotName->setText(json["hotSpotName"].toString()); edIs5G->setChecked(json["apBand"].toBool()); @@ -530,15 +531,15 @@ CtrlNetworkPanel::CtrlNetworkPanel() { edWifiName->setCurrentText(json["wifi"].toString()); auto hotSpots = json["hotSpots"].toString(); edHotspotName->setText(hotSpots); - fdIsWifi->setChecked(hotSpots.isEmpty()); - fdIsAP->setChecked(! hotSpots.isEmpty()); + edIsWifi->setChecked(hotSpots.isEmpty()); + edIsHotspot->setChecked(! hotSpots.isEmpty()); } }); } else { for(auto &card : gSelCards) { auto reply = NetReq("http://"+card.ip+":2016/settings").post(json); auto cardId = card.id; - auto isG = card.id.startsWith("g", Qt::CaseInsensitive); + auto isG = card.id.startsWith("g", Qt::CaseInsensitive) || card.id.startsWith("m8h", Qt::CaseInsensitive); connect(reply, &QNetworkReply::finished, this, [=] { JValue json; auto err = errStrWithJson(reply, &json); @@ -555,7 +556,7 @@ CtrlNetworkPanel::CtrlNetworkPanel() { if(! hotSpots.isEmpty()) err += " "+tr("ApName")+":"+hotSpots; } } - gFdResInfo->append(cardId+" "+tr("Get AP or WiFi")+" "+err); + gFdResInfo->append(cardId+" "+tr("Get Hotspot or WiFi")+" "+err); }); } } @@ -981,8 +982,8 @@ void CtrlNetworkPanel::init() { JObj json; json.insert("_id", "GetEthernet"); json.insert("_type", "GetEthernet"); - auto reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); - connect(reply, &QNetworkReply::finished, this, [this, reply] { + auto reply = NetReq("http://"+card.ip+":2016/settings").post(json); + connect(reply, &QNetworkReply::finished, this, [=] { JValue json; auto err = errStrWithJson(reply, &json); if(! err.isEmpty()) return; @@ -1013,7 +1014,7 @@ void CtrlNetworkPanel::init() { for(JValue &wifi : wifis) edWifiName->addItem(QIcon(":/res/signal-"+QString::number((wifi["signal"].toInt()+19)/20)+".png"), wifi["ssid"].toString()); { JObj json; - auto isG = card.id.startsWith("g", Qt::CaseInsensitive); + auto isG = card.id.startsWith("g", Qt::CaseInsensitive) || card.id.startsWith("m8h", Qt::CaseInsensitive); if(isG) { json.insert("_id", "GetWifiSwitchState"); json.insert("_type", "GetWifiSwitchState"); @@ -1027,8 +1028,8 @@ void CtrlNetworkPanel::init() { auto err = errStrWithJson(reply, &json); if(! err.isEmpty()) return; if(isG) { - fdIsWifi->setChecked(json["wifiEnable"].toBool()); - fdIsAP->setChecked(json["apEnable"].toBool()); + edIsWifi->setChecked(json["wifiEnable"].toBool()); + edIsHotspot->setChecked(json["apEnable"].toBool()); edWifiName->setCurrentText(json["wifiName"].toString()); edHotspotName->setText(json["hotSpotName"].toString()); edIs5G->setChecked(json["apBand"].toBool()); @@ -1036,8 +1037,8 @@ void CtrlNetworkPanel::init() { edWifiName->setCurrentText(json["wifi"].toString()); auto hotspots = json["hotSpots"].toString(); edHotspotName->setText(hotspots); - fdIsWifi->setChecked(hotspots.isEmpty()); - fdIsAP->setChecked(! hotspots.isEmpty()); + edIsWifi->setChecked(hotspots.isEmpty()); + edIsHotspot->setChecked(! hotspots.isEmpty()); } }); } @@ -1046,7 +1047,7 @@ void CtrlNetworkPanel::init() { json = JObj(); json.insert("_id", "GetSwitchSimData"); json.insert("_type", "GetSwitchSimData"); - reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + reply = NetReq("http://"+card.ip+":2016/settings").post(json); connect(reply, &QNetworkReply::finished, this, [=] { JValue json; auto err = errStrWithJson(reply, &json); @@ -1060,7 +1061,7 @@ void CtrlNetworkPanel::init() { json = JObj(); json.insert("_id", "GetAPNList"); json.insert("_type", "GetAPNList"); - reply = NetReq("http://"+card.ip+":2016/settings").timeout(120000).post(json); + reply = NetReq("http://"+card.ip+":2016/settings").post(json); connect(reply, &QNetworkReply::finished, this, [=] { QJsonDocument json; auto err = checkReplyForJson(reply, &json); @@ -1104,9 +1105,9 @@ void CtrlNetworkPanel::changeEvent(QEvent *event) { void CtrlNetworkPanel::transUi() { lbLanCfg->setText(tr("Wire Enther(RJ45) Configuration")); fdSpecifyIp->setText(tr("Specify IP")); - lbHotspotName->setText(tr("AP name")); + lbHotspotName->setText(tr("Hotspot Name")); labelGateway->setText(tr("Gateway")); - lbWifiName->setText(tr("WiFi name")); + lbWifiName->setText(tr("WiFi Name")); labelIpAddress->setText(tr("IP Address")); lbHotspotPswd->setText(tr("Password")); labelDnsAddress->setText(tr("DNS Address")); @@ -1118,12 +1119,12 @@ void CtrlNetworkPanel::transUi() { btnLanSet->setText(translate("","Set")); btnWiFiGet->setText(translate("","Readback")); btnLanGet->setText(translate("","Readback")); - fdIsWifi->setText(tr("Enable WiFi")); - fdIsAP->setText(tr("Enable AP")); + edIsWifi->setText(tr("Enable WiFi")); + edIsHotspot->setText(tr("Enable Hotspot")); lbWifiCfg->setText(tr("WiFi Config")); edHotspotPswd->setPlaceholderText(translate("","Input Password")); edWifiPswd->setPlaceholderText(translate("","Input Password")); - edHotspotName->setPlaceholderText(tr("Input ap name")); + edHotspotName->setPlaceholderText(tr("Input Hotspot Name")); lbCellularConfig->setText(tr("Cellular Config")); lbCheckStatusTip->setText(tr("Through the check status button")); fdEnableCellular->setText(tr("Enable Cellular Data")); diff --git a/LedOK/device/ctrlnetworkpanel.h b/LedOK/device/ctrlnetworkpanel.h index 52b43e6..a23c82e 100644 --- a/LedOK/device/ctrlnetworkpanel.h +++ b/LedOK/device/ctrlnetworkpanel.h @@ -50,7 +50,7 @@ private: QRadioButton *edIs5G; QLabel *lbWifiPswd; - QCheckBox *fdIsWifi, *fdIsAP; + QCheckBox *edIsWifi, *edIsHotspot; QLineEdit *edWifiPswd; QPushButton *btnScan; QPushButton *btnWiFiSet, *btnHotspotSet, *btnWiFiGet; diff --git a/LedOK/device/ctrlpwdpanel.cpp b/LedOK/device/ctrlpwdpanel.cpp index 0921adb..285c5c4 100644 --- a/LedOK/device/ctrlpwdpanel.cpp +++ b/LedOK/device/ctrlpwdpanel.cpp @@ -249,10 +249,10 @@ void CtrlPwdPanel::changeEvent(QEvent *event) { void CtrlPwdPanel::transUi() { lbPwdConfig->setText(tr("Set Password")); lbOldPwd->setText(tr("Original password")); - lbNewPwd->setText(tr("New password")); + lbNewPwd->setText(translate("","New password")); lbPwdAgain->setText(tr("Enter again")); fdOldPwd->setPlaceholderText(tr("original password")); - fdNewPwd->setPlaceholderText(tr("New password")); + fdNewPwd->setPlaceholderText(translate("","New password")); fdPwdAgain->setPlaceholderText(tr("Repeat new password")); btnPwdSet->setText(tr("Set encryption")); btnPwdClear->setText(tr("Cancel encryption")); diff --git a/LedOK/device/ctrltestpanel.cpp b/LedOK/device/ctrltestpanel.cpp index 7d70379..9689c42 100644 --- a/LedOK/device/ctrltestpanel.cpp +++ b/LedOK/device/ctrltestpanel.cpp @@ -1,5 +1,6 @@ #include "ctrltestpanel.h" -#include "tools.h" +#include "badpointdetectdialog.h" +#include "main.h" #include "gutil/qgui.h" #include "gutil/qnetwork.h" #include "gutil/qwaitingdlg.h" @@ -15,14 +16,27 @@ CtrlTestPanel::CtrlTestPanel() { auto vBox = new VBox(this); - labelTestScreen = new QLabel; - labelTestScreen->setAlignment(Qt::AlignCenter); - vBox->addWidget(labelTestScreen); + lbTestScreen = vBox->addLabel(); + lbTestScreen->setAlignment(Qt::AlignCenter); auto hBox = new HBox(vBox); auto vv = new VBox(hBox); + btnBadPoint = new QPushButton; + btnBadPoint->setMinimumSize(100, 30); + btnBadPoint->setProperty("ssType", "progManageTool"); + connect(btnBadPoint, &QPushButton::clicked, this, [=] { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } + new BadPointDetectDialog(this); + }); + vv->addWidget(btnBadPoint); + groupBox = new QGroupBox; + vv->addWidget(groupBox); + auto vvv = new VBox(groupBox); auto hhh = new HBox(vvv); hhh->addStretch(); @@ -85,9 +99,10 @@ CtrlTestPanel::CtrlTestPanel() { pushButtonStartLine->setMaximumSize(QSize(80, 16777215)); vvv->addWidget(pushButtonStartLine, 0, Qt::AlignHCenter); - vv->addWidget(groupBox); groupBox_2 = new QGroupBox; + vv->addWidget(groupBox_2); + vvv = new VBox(groupBox_2); checkBoxShowInfo = new QCheckBox; @@ -142,9 +157,10 @@ CtrlTestPanel::CtrlTestPanel() { pushButtonStartGray->setMaximumSize(QSize(80, 16777215)); vvv->addWidget(pushButtonStartGray, 0, Qt::AlignHCenter); - vv->addWidget(groupBox_2); groupBox_3 = new QGroupBox; + vv->addWidget(groupBox_3); + vvv = new VBox(groupBox_3); checkBoxGradient = new QCheckBox; @@ -172,7 +188,6 @@ CtrlTestPanel::CtrlTestPanel() { vvv->addWidget(pushButtonStartColor, 0, Qt::AlignHCenter); - vv->addWidget(groupBox_3); hhh = new HBox(vv); hhh->addStretch(); @@ -237,13 +252,7 @@ CtrlTestPanel::CtrlTestPanel() { btnAnycastReset->setFixedSize(60, 30); btnAnycastReset->setProperty("ssType", "progManageTool"); connect(btnAnycastReset, &QPushButton::clicked, this, [=] { - if(gSelCards.isEmpty()) { - QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); - return; - } SendAnycastCmd(0); - fdAnycast->setText("- "+tr("Loop Mode")+" -"); - btnAnycast->setEnabled(false); }); gridLayout->addWidget(btnAnycastReset, 3, 2, 1, 1); @@ -252,13 +261,7 @@ CtrlTestPanel::CtrlTestPanel() { btnAnycast->setMinimumHeight(36); btnAnycast->setProperty("ssType", "progManageTool"); connect(btnAnycast, &QPushButton::clicked, this, [=] { - if(gSelCards.isEmpty()) { - QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); - return; - } SendAnycastCmd(fdAnycast->text().toInt()); - fdAnycast->setText(tr("Anycast")+" - "+fdAnycast->text()); - btnAnycast->setEnabled(false); }); vv->addWidget(btnAnycast); vv->addStretch(); @@ -423,7 +426,8 @@ void CtrlTestPanel::changeEvent(QEvent *event) { if(event->type() == QEvent::LanguageChange) transUi(); } void CtrlTestPanel::transUi() { - labelTestScreen->setText(tr("Test Screen")); + lbTestScreen->setText(tr("Test Screen")); + btnBadPoint->setText(tr("Bad Point Detection")); groupBox->setTitle(tr("Line test")); radioButtonRed->setText(tr("Red")); radioButtonGreen->setText(tr("Green")); @@ -464,6 +468,10 @@ void CtrlTestPanel::transUi() { } void CtrlTestPanel::SendAnycastCmd(int progIdx) { + if(gSelCards.isEmpty()) { + QMessageBox::information(this, translate("","Tip"), translate("","Please select screen first")); + return; + } ST_ANSY_PROGRAM_PACKET tempStreadPakcet; tempStreadPakcet.ucCommType = 0x97; tempStreadPakcet.iBaoLiu = 0; @@ -476,9 +484,13 @@ void CtrlTestPanel::SendAnycastCmd(int progIdx) { auto data = QByteArray(reinterpret_cast(&tempStreadPakcet), iLenPacket); auto action = progIdx==0 ? tr("Reset loop mode") : tr("Anycast"); if(gSelCards.count() == 1) { + auto card = gSelCards[0]; + if(card.hasPassword && card.isLocked) { + QMessageBox::warning(this, translate("","Tip"), tr("This screen is encrypted")); + return; + } auto waitingDlg = new WaitingDlg(this, action+" ..."); waitingDlg->show(); - auto card = gSelCards[0]; auto tcp = new TcpSocket; connect(waitingDlg, &WaitingDlg::rejected, tcp, [=] { tcp->abort(); @@ -505,8 +517,12 @@ void CtrlTestPanel::SendAnycastCmd(int progIdx) { tcp->startTimer(10000); } else { for(auto &card : gSelCards) { - auto tcp = new TcpSocket; auto cardId = card.id; + if(card.hasPassword && card.isLocked) { + gFdResInfo->append(cardId+" "+action+" "+tr("This screen is encrypted")); + continue; + } + auto tcp = new TcpSocket; connect(tcp, &QTcpSocket::connected, tcp, [=] { tcp->stopTimer(); tcp->write(data); @@ -527,4 +543,6 @@ void CtrlTestPanel::SendAnycastCmd(int progIdx) { tcp->startTimer(10000); } } + fdAnycast->setText(progIdx==0 ? ("- "+tr("Loop Mode")+" -") : (tr("Anycast")+" - "+fdAnycast->text())); + btnAnycast->setEnabled(false); } diff --git a/LedOK/device/ctrltestpanel.h b/LedOK/device/ctrltestpanel.h index 6983533..9473f48 100644 --- a/LedOK/device/ctrltestpanel.h +++ b/LedOK/device/ctrltestpanel.h @@ -13,15 +13,15 @@ class CtrlTestPanel : public QWidget { Q_OBJECT public: explicit CtrlTestPanel(); +signals: + void sigSend(QJsonObject &,QString); protected: void changeEvent(QEvent *) override; void transUi(); -signals: - void sigSend(QJsonObject &,QString); -private: void SendAnycastCmd(int); - QLabel *labelTestScreen; + QLabel *lbTestScreen; + QPushButton *btnBadPoint; QGroupBox *groupBox; QRadioButton *radioButtonRed; QRadioButton *radioButtonGreen; diff --git a/LedOK/device/upgradeapkdialog.cpp b/LedOK/device/upgradeapkdialog.cpp index 4d86ed2..0158a37 100644 --- a/LedOK/device/upgradeapkdialog.cpp +++ b/LedOK/device/upgradeapkdialog.cpp @@ -36,17 +36,17 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { auto btnSelectFpga = new QPushButton(tr("Select Fpga")); hBox->addWidget(btnSelectFpga); - auto fdFileName = new QLineEdit; - fdFileName->setReadOnly(true); - fdFileName->setMinimumWidth(200); - hBox->addWidget(fdFileName); + auto edFileName = new QLineEdit; + edFileName->setReadOnly(true); + edFileName->setMinimumWidth(200); + hBox->addWidget(edFileName); connect(btnSelectApk, &QPushButton::clicked, this, [=] { auto aaa = QFileDialog::getOpenFileName(this, "Open file", gApkHome, "apk package (*.apk *.zip)"); if(aaa.isEmpty()) return; QFileInfo info(filePath = aaa); gApkHome = info.absolutePath(); - fdFileName->setText(info.fileName()); + edFileName->setText(info.fileName()); fileId = ""; }); connect(btnSelectFpga, &QPushButton::clicked, this, [=] { @@ -54,7 +54,7 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { if(aaa.isEmpty()) return; QFileInfo info(filePath = aaa); gApkHome = info.absolutePath(); - fdFileName->setText(info.fileName()); + edFileName->setText(info.fileName()); fileId = ""; }); connect(btnSelectOnlineApk, &QPushButton::clicked, this, [=] { @@ -103,7 +103,7 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { } connect(table, &TreeWidget::itemDoubleClicked, &dlg, [=, &dlg](QTreeWidgetItem *itm) { auto item = (TreeWidgetItem*) itm; - fdFileName->setText(item->text("name")); + edFileName->setText(item->text("name")); fileId = item->data(0).toString(); filePath = ""; dlg.accept(); @@ -119,7 +119,7 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { QMessageBox::warning(&dlg, "Warning", tr("Please select a file")); return; } - fdFileName->setText(item->text("name")); + edFileName->setText(item->text("name")); fileId = item->data(0).toString(); filePath = ""; dlg.accept(); @@ -132,7 +132,7 @@ UpgradeApkDialog::UpgradeApkDialog(QWidget *parent) : QDialog(parent) { auto btnUpdate = new QPushButton(tr("Upgrade")); connect(btnUpdate, &QPushButton::clicked, this, [=] { - auto fileName = fdFileName->text(); + auto fileName = edFileName->text(); if(fileName.length() < 3) return; int cnt = table->topLevelItemCount(); QList items; diff --git a/LedOK/device/upgradeapkdialog.h b/LedOK/device/upgradeapkdialog.h index 3203c67..5d275c1 100644 --- a/LedOK/device/upgradeapkdialog.h +++ b/LedOK/device/upgradeapkdialog.h @@ -9,7 +9,7 @@ class UpdateApkItem; class UpgradeApkDialog : public QDialog { Q_OBJECT public: - explicit UpgradeApkDialog(QWidget *parent = nullptr); + explicit UpgradeApkDialog(QWidget *parent = 0); void sendProgress(UpdateApkItem *item); QString filePath, fileId; diff --git a/LedOK/gutil/qcore.h b/LedOK/gutil/qcore.h index 86dc3a2..df3ff4e 100644 --- a/LedOK/gutil/qcore.h +++ b/LedOK/gutil/qcore.h @@ -1,7 +1,9 @@ #ifndef QCORE_H #define QCORE_H -#include + #include +#include +#include #include #define ToStr QString::number @@ -42,6 +44,17 @@ inline int wait(int msec, QObject *context = 0, QEventLoop::ProcessEventsFlags f return loop.exec(flags); } +inline void OpenCMD(const QStringList &arguments) { + QProcess process; + process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args) { + args->flags |= CREATE_NEW_CONSOLE; + args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; + }); + process.setProgram("cmd"); + process.setArguments(arguments); + process.startDetached(); +} + template inline QThread *ThreadStart(Func &&f) { QThread* thread = QThread::create(f); diff --git a/LedOK/gutil/qgui.h b/LedOK/gutil/qgui.h index 2348433..481d1e2 100644 --- a/LedOK/gutil/qgui.h +++ b/LedOK/gutil/qgui.h @@ -72,13 +72,26 @@ inline QFont qfont(const QString& family, int pixelSize, bool bold = false, bool if(italic) ft.setItalic(true); return ft; } +inline QColor BrushToColor(const QBrush& brush, const QColor& defColor = QColor()) { + return brush.style()==Qt::NoBrush ? defColor : brush.color(); +} inline void gAppendText(QTextEdit *wgt, const QString& text, const QColor &color) { auto c0 = wgt->textColor(); wgt->setTextColor(color); wgt->append(text); wgt->setTextColor(c0); } - +class EmitCloseWidget : public QWidget { + Q_OBJECT +public: + using QWidget::QWidget; +signals: + void onClose(void *event); +protected: + void closeEvent(QCloseEvent *event) override { + emit onClose(event); + }; +}; class VBox : public QBoxLayout { public: VBox(QWidget *parent=nullptr) : QBoxLayout(TopToBottom, parent) {} @@ -442,6 +455,7 @@ public: horizontalHeader()->setSectionResizeMode(mode); return this; } + using QTableWidget::setRowHeight; auto setRowHeight(int value) { if(verticalHeader()->minimumSectionSize() > value) verticalHeader()->setMinimumSectionSize(value); verticalHeader()->setDefaultSectionSize(value); diff --git a/LedOK/main.cpp b/LedOK/main.cpp index 78afc43..fd3114f 100644 --- a/LedOK/main.cpp +++ b/LedOK/main.cpp @@ -57,11 +57,12 @@ int main(int argc, char *argv[]) { QApplication::setStyle("Fusion"); QApplication app(argc, argv); +#ifndef leyide QSplashScreen splash(QPixmap(":/res/splash.png")); splash.show(); splash.showMessage(QObject::tr("Setting up the LedOK Express..."), Qt::AlignRight | Qt::AlignTop, Qt::white); app.processEvents(); - +#endif QFile file(":/css.css"); if(file.exists() && file.open(QFile::ReadOnly)) { app.setStyleSheet(file.readAll()); @@ -76,8 +77,8 @@ int main(int argc, char *argv[]) { plt.setBrush(QPalette::Inactive, QPalette::HighlightedText, plt.brush(QPalette::Active, QPalette::HighlightedText)); app.setPalette(plt); - QTranslator qtTrans; - if(qtTrans.load(QLocale(), "qt", "_", "translations")) QCoreApplication::installTranslator(&qtTrans); + //QTranslator qtTrans; + //if(qtTrans.load(QLocale(), "qt", "_", "translations")) QCoreApplication::installTranslator(&qtTrans); gFileHome = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); @@ -86,7 +87,9 @@ int main(int argc, char *argv[]) { #endif MainWindow win; win.show(); +#ifndef leyide splash.finish(&win); +#endif return app.exec(); } diff --git a/LedOK/main.h b/LedOK/main.h index b6c0870..bd60a42 100644 --- a/LedOK/main.h +++ b/LedOK/main.h @@ -146,6 +146,14 @@ inline QRect CenterRect(qreal width, qreal height, int maxW, int maxH) { } return QRect((maxW - width) / 2, (maxH - height) / 2, width, height); } +inline bool containsCharInRange(const QString &str, char start, char end) { + for(auto ch : str) if(ch>=start && ch<=end) return true; + return false; +} +inline bool isStrongPswd(const QString &pswd) { + return containsCharInRange(pswd,'0','9') && containsCharInRange(pswd,'A','Z') && containsCharInRange(pswd,'a','z'); +} + QString checkReply(QNetworkReply *, QJsonDocument * = 0); QString errStrWithJson(QNetworkReply *, JValue * = 0, QByteArray * = 0); QString errStrWithJson(QNetworkReply *, QString errField); diff --git a/LedOK/mainwindow.cpp b/LedOK/mainwindow.cpp index ed66525..f0ce5e3 100644 --- a/LedOK/mainwindow.cpp +++ b/LedOK/mainwindow.cpp @@ -4,6 +4,7 @@ #include "devicepanel.h" #include "gutil/qnetwork.h" #include "device/upgradeapkdialog.h" +#include "gutil/qwaitingdlg.h" #include #include #include @@ -19,6 +20,11 @@ #include #include +#include +#include +#include +#include + extern QPoint gPlayPos; QString gApkHome; @@ -75,7 +81,8 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { langGrp = new QActionGroup(menuLang); connect(menuLang, &QMenu::triggered, this, [this](QAction* action) { auto lanName = action->objectName(); - qInfo() << "load translators" << lanName << translator.load("app_"+lanName, ":/i18n"); + qInfo() << "load QT Translator" << lanName << qtTranslator.load("qt_"+lanName, QApplication::applicationDirPath()+"/translations"); + qInfo() << "load APP Translator" << lanName << appTranslator.load("app_"+lanName, ":/i18n"); }); QSettings settings; @@ -181,7 +188,8 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { #endif actLan->setChecked(true); emit menuLang->triggered(actLan); - QCoreApplication::installTranslator(&translator); + QCoreApplication::installTranslator(&qtTranslator); + QCoreApplication::installTranslator(&appTranslator); auto geo = settings.value("MainGeo").toRect(); if(geo.width()>=800 && geo.height()>=500 && geo.x()>=-600 && geo.x()<=1280 && geo.y()>=-200 && geo.y()<=800) setGeometry(geo); @@ -227,12 +235,13 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { auto menu_setting = new QMenu; - actFirmware = new QAction(tr("firmware manager")); + actFirmware = new QAction(tr("Firmware Manager")); connect(actFirmware, &QAction::triggered, this, [this] { new UpgradeApkDialog(this); }); +#ifndef leyide menu_setting->addAction(actFirmware); - +#endif actPreferences = new QAction(tr("Preferences")); connect(actPreferences, &QAction::triggered, this, [this] { QDialog dlg(this); @@ -674,6 +683,117 @@ MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) { } gTick = new Tick(this); + + auto timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, [=] { + JObj json; + json.insert("_id", "GetApInfo"); + json.insert("_type", "GetApInfo"); + auto reply = NetReq("http://192.168.43.1:2016/settings").timeout(8000).post(json); + connect(reply, &QNetworkReply::finished, this, [=] { + JValue json; + auto err = errStrWithJson(reply, &json); + if(! err.isEmpty()) { + qDebug()<<"GetApInfo Error"<stop(); + auto dlg = new QDialog; + dlg->setAttribute(Qt::WA_DeleteOnClose); + dlg->setWindowFlag(Qt::WindowCloseButtonHint, false); + dlg->setWindowFlag(Qt::WindowContextHelpButtonHint, false); + dlg->setModal(true); + dlg->setWindowTitle("Change Hotspot Password"); + dlg->resize(300, 200); + auto vBox = new VBox(dlg); + vBox->addStretch(); + vBox->addLabel(translate("","The Device's Hotspot password is too weak, please change the password.")); + vBox->addStretch(); + vBox->addLabel(translate("","The password must have 8 characters at least and contain numbers, uppercase and lowercase letters")); + vBox->addStretch(); + + auto grid = new Grid(vBox); + grid->addLabel(translate("","Hotspot Name"),0,0); + grid->addLabel(apName, 0,1); + + grid->addLabel(translate("","New password"),1,0); + auto ed = new QLineEdit; + grid->addWidget(ed,1,1); + grid->addLabel(translate("","Confirm password"),2,0); + auto ed2 = new QLineEdit; + grid->addWidget(ed2,2,1); + vBox->addStretch(); + + auto btnBox = new QDialogButtonBox(QDialogButtonBox::Ok); + connect(btnBox, &QDialogButtonBox::accepted, this, [=] { + auto pswd = ed->text(); + if(pswd.size()<8 || !isStrongPswd(pswd)) { + QMessageBox::warning(this, translate("","Tip"), translate("","The password must have 8 characters at least and contain numbers, uppercase and lowercase letters")); + return; + } + if(pswd!=ed2->text()) { + QMessageBox::warning(this, translate("","Tip"), translate("","Two passwords are not same")); + return; + } + JObj json; + json.insert("_id", "ConfigurationHotSpot"); + json.insert("_type", "ConfigurationHotSpot"); + json.insert("apName", apName); + //json.insert("apBand", edIs5G->isChecked() ? 1 : 0); + json.insert("password", pswd); + auto waitingDlg = new WaitingDlg(this, tr("Config Hotspot")+" ..."); + waitingDlg->show(); + auto reply = NetReq("http://192.168.43.1:2016/settings").post(json); + ConnReply(reply, waitingDlg) [=] { + waitingDlg->close(); + auto err = errStrWithJson(reply); + if(! err.isEmpty()) { + QMessageBox::critical(this, translate("","Error"), err); + return; + } + QMessageBox::information(this, translate("","Tip"), translate("","Password changed successfully")); + dlg->accept(); + timer->start(60000); + }); + }); + vBox->addWidget(btnBox); + dlg->show(); + }); + }); + timer->start(20000); + + // DWORD clientVersion = 2; + // PDWORD version = 0; + // HANDLE clientHandle = 0; + // auto ret = WlanOpenHandle(clientVersion, 0, version, &clientHandle); + // if(ret != ERROR_SUCCESS) { + // qDebug() << "Failed to open a client handle."<dwNumberOfItems; i++) { + // auto interfaceInfo = &interfaceList->InterfaceInfo[i]; + // if(interfaceInfo->isState==wlan_interface_state_connected) { + // //WCHAR* ssidName = interfaceInfo->CurrentConnection.wlanAssociationAttributes.dot11Ssid; + // //QString wifiName = QString::fromWCharArray(ssidName); + // //qDebug() << "Current WiFi Name:" << wifiName; + // qDebug() << "Current WiFi Name:" << interfaceInfo->strInterfaceDescription; + // break; // Assuming you only want the first connected interface's SSID. + // } + // } + // } else { + // qDebug() << "Failed to get interface list."; + // } + // WlanCloseHandle(clientHandle, 0); } MainWindow::~MainWindow() { QSettings settings; @@ -711,7 +831,7 @@ void MainWindow::transUi() { act_help->setText(tr("Help")); if(act_about) act_about->setText(tr("About")); if(act_upd) act_upd->setText(tr("Check for updates")); - actFirmware->setText(tr("firmware manager")); + 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 4a488d3..05f0edd 100644 --- a/LedOK/mainwindow.h +++ b/LedOK/mainwindow.h @@ -21,7 +21,7 @@ protected: void transUi(); private: QJsonObject updates; - QTranslator translator; + QTranslator qtTranslator, appTranslator; LoQTitleBar *m_wTitle; QActionGroup *langGrp; QAction *act_lang; diff --git a/LedOK/player/elescroll.cpp b/LedOK/player/elescroll.cpp index a844a1e..0d5a7ee 100644 --- a/LedOK/player/elescroll.cpp +++ b/LedOK/player/elescroll.cpp @@ -3,78 +3,68 @@ #include #include #include +#include -EleScroll::EleScroll(QWidget *parent, QString dirPre, const JValue &json, int w, int h) : QWidget{parent}, w(w), h(h) { - img.load(dirPre + json["id"].toString()); - auto effStr = json["effect"].toString(); - if(effStr.isEmpty() || effStr=="no") return; +EleScroll::EleScroll(QWidget *parent, QList imgs, char direct, double speed) : QWidget{parent}, imgs(imgs), direct(direct) { + auto img0 = imgs[0]; + qDebug().nospace()<<" SrcScroll img cnt "< 60) step = (int) round(scrollSpeed/60); - else if(scrollSpeed < 60) interval = (int) round(60/scrollSpeed); - int idx = effStr.lastIndexOf(' '); - if(idx > -1) { - effect = effStr.at(idx+1).toLatin1(); - if(effect=='l') end = -(img.width()-step); - else if(effect=='r') end = img.width()-step; - else if(effect=='t') end = -(img.height()-step); - else if(effect=='b') end = img.height()-step; - } -} -EleScroll::EleScroll(QWidget *parent, QString imgPath, char effect, double scrollSpeed) : QWidget{parent}, effect(effect) { - img.load(imgPath); - if(effect==0) return; - if(scrollSpeed==0) return; - interval = step = 1; - if(scrollSpeed > 60) step = (int) round(scrollSpeed/60); - else if(scrollSpeed < 60) interval = (int) round(60/scrollSpeed); - if(effect=='l') end = -(img.width()-step); - else if(effect=='r') end = img.width()-step; - else if(effect=='t') end = -(img.height()-step); - else if(effect=='b') end = img.height()-step; + if(speed > 60) step = (int) round(speed/60); + else if(speed < 60) interval = (int) round(60/speed); } void EleScroll::paintEvent(QPaintEvent *e) { - if(img.isNull()) return; + if(imgs.isEmpty()) return; auto rect = e->rect(); QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform); - if(effect=='l') { - int x = cur; + if(direct=='l') { + int ii = 0, x = cur; do { - if(x > rect.left()-img.width() && x < rect.right()+1) painter.drawPixmap(x, 0, img); - x += img.width(); + if(x > rect.left()-imgs[ii].width() && x < rect.right()+1) painter.drawPixmap(x, 0, imgs[ii]); + x += imgs[ii].width(); + if(++ii >= imgs.size()) ii = 0; } while(x < rect.right()+1); - } else if(effect=='r') { - int x = cur + w; + } else if(direct=='r') { + int ii = imgs.size()-1, x = cur + width(); bool con1; do { - x -= img.width(); - con1 = x > rect.left()-img.width(); - if(con1 && x < rect.right()+1) painter.drawPixmap(x, 0, img); + x -= imgs[ii].width(); + con1 = x > rect.left()-imgs[ii].width(); + if(con1 && x < rect.right()+1) painter.drawPixmap(x, 0, imgs[ii]); + if(--ii < 0) ii = imgs.size()-1; } while(con1); - } else if(effect=='t') { - int y = cur; + } else if(direct=='t') { + int ii = 0, y = cur; do { - if(y > rect.top()-img.height() && y < rect.bottom()+1) painter.drawPixmap(0, y, img); - y += img.height(); + if(y > rect.top()-imgs[ii].height() && y < rect.bottom()+1) painter.drawPixmap(0, y, imgs[ii]); + y += imgs[ii].height(); + if(++ii >= imgs.size()) ii = 0; } while(y < rect.bottom()+1); - } else if(effect=='b') { - int y = cur + h; + } else if(direct=='b') { + int ii = imgs.size()-1, y = cur + height(); bool con1; do { - y -= img.height(); - con1 = y > rect.top()-img.height(); - if(con1 && y < rect.bottom()+1) painter.drawPixmap(0, y, img); + y -= imgs[ii].height(); + con1 = y > rect.top()-imgs[ii].height(); + if(con1 && y < rect.bottom()+1) painter.drawPixmap(0, y, imgs[ii]); + if(--ii < 0) ii = imgs.size()-1; } while(con1); - } else painter.drawPixmap(0, 0, img); - if(freshCnt==0 && effect!=0 && interval!=0) connect(PlayWin::self->gl, &QOpenGLWidget::frameSwapped, this, &EleScroll::doFrame, Qt::UniqueConnection); + } else painter.drawPixmap(0, 0, imgs[0]); + if(freshCnt==0 && direct!=0 && interval!=0) connect(PlayWin::self->gl, &QOpenGLWidget::frameSwapped, this, &EleScroll::doFrame, Qt::UniqueConnection); } void EleScroll::doFrame() { @@ -86,10 +76,10 @@ void EleScroll::doFrame() { if(freshCnt < interval) freshCnt++; else { freshCnt = 1; - if(effect=='t' || effect=='l') { + if(direct=='t' || direct=='l') { if(cur <= end) cur -= end; else cur -= step; - } else if(effect=='b' || effect=='r') { + } else if(direct=='b' || direct=='r') { if(cur >= end) cur -= end; else cur += step; } diff --git a/LedOK/player/elescroll.h b/LedOK/player/elescroll.h index aa5cd78..3fe542b 100644 --- a/LedOK/player/elescroll.h +++ b/LedOK/player/elescroll.h @@ -8,12 +8,10 @@ class EleScroll : public QWidget { Q_OBJECT public: explicit EleScroll(QWidget *, QString, const JValue &, int, int); - explicit EleScroll(QWidget *, QString, char effect = 0, double effDur = 0.0); - int w = 0, h = 0; - QPixmap img; - char effect = 0; + explicit EleScroll(QWidget *parent, QList imgs, char direct = 0, double speed = 0.0); + QList imgs; + char direct = 0; int interval = 0, freshCnt = 0, cur = 0, end = 0, step = 1; - bool noUpdate = false; void doFrame(); protected: void paintEvent(QPaintEvent *) override; diff --git a/LedOK/player/playwin.cpp b/LedOK/player/playwin.cpp index 419a7af..cbbb513 100644 --- a/LedOK/player/playwin.cpp +++ b/LedOK/player/playwin.cpp @@ -120,15 +120,36 @@ PlayWin::PlayWin(int x, int y, int width, int height, QString dir, const JValue lb->setScaledContents(true); src.view = lb; } + } else if(src.type=="Scroll") { + auto imgs = source["imgs"]; + if(imgs.empty()) continue; + QList images; + for(auto &img : imgs) images.push_back(QPixmap(dir+"/"+img.toStr())); + auto directStr = source["direct"].toStr(); + src.view = new EleScroll(box, images, directStr.isEmpty() ? 0 : directStr[0].toLatin1(), source["speed"].toInt()); + } else if(src.type=="MultiPng") { + auto imgs = source["arrayPics"]; + if(imgs.empty()) continue; + QList images; + for(auto &img : imgs) images.push_back(QPixmap(dir+"/"+img["id"].toStr())); + auto speed = imgs[0]["scrollSpeed"].toDouble(); + if(speed==0) { + auto scrollDur = imgs[0]["effectSpeed"].toDouble(); + if(scrollDur!=0) speed = 1000 / scrollDur; + } + char direct = 0; + auto directStr = imgs[0]["effect"].toStr(); + if(! directStr.isEmpty() && directStr!="no") { + int idx = directStr.lastIndexOf(' '); + if(idx > -1) direct = directStr[idx+1].toLatin1(); + } + src.view = new EleScroll(box, images, direct, speed); } else if(src.type.startsWith("Environ")) { auto previewImg = source["previewImg"].toStr(); if(! previewImg.isEmpty()) { - if(source["bSingleScroll"].toBool()) src.view = new EleScroll(box, dir+"/"+previewImg, 'l', source["iScrollSpeed"].toDouble()); - else src.view = new EleScroll(box, dir+"/"+previewImg); + if(source["bSingleScroll"].toBool()) src.view = new EleScroll(box, {QPixmap(dir+"/"+previewImg)}, 'l', source["iScrollSpeed"].toDouble()); + else src.view = new EleScroll(box, {QPixmap(dir+"/"+previewImg)}); } - } else if(src.type=="MultiPng" || src.type=="SplitText") { - auto imgs = source["arrayPics"]; - if(! imgs.empty()) src.view = new EleScroll(box, dir+"/", imgs[0], w, h); } else if(src.type=="DigitalClockNew") src.view = new EleDigiClock(dir+"/", source, box); else if(src.type=="AnalogClock") src.view = new EleAnaClock(w, h, dir+"/"+id, source, box); else if(src.type=="Video" || src.type=="Audio") { diff --git a/LedOK/program/eaclock.cpp b/LedOK/program/eaclock.cpp index 8204968..a7a7df5 100644 --- a/LedOK/program/eaclock.cpp +++ b/LedOK/program/eaclock.cpp @@ -569,7 +569,7 @@ bool EAClock::save(const QString &pRoot){ } return true; } -JObj EAClock::attrJson() const { +JObj EAClock::attrJson() { JObj json; json["elementType"] = "AClock"; json["timeZone"] = QString::fromUtf8(m_attr.timeZone.id()); diff --git a/LedOK/program/eaclock.h b/LedOK/program/eaclock.h index 4a1708b..5430404 100644 --- a/LedOK/program/eaclock.h +++ b/LedOK/program/eaclock.h @@ -37,7 +37,7 @@ public: int type() const override { return EBase::AClock; } QWidget* attrWgt() override; bool save(const QString &pRoot) override; - JObj attrJson() const override; + JObj attrJson() override; protected: void timerEvent(QTimerEvent *) override; diff --git a/LedOK/program/ebase.cpp b/LedOK/program/ebase.cpp index d30d5b4..59f6a1b 100644 --- a/LedOK/program/ebase.cpp +++ b/LedOK/program/ebase.cpp @@ -721,7 +721,7 @@ void EBase::addBaseAttrWgt(QBoxLayout *vBox) { hBox->addStretch(); auto borderFd = new QComboBox; borderFd->addItem(tr("None")); - for(int i=0; iaddItem(QIcon(borderImgs[i].img), QString::number(borderImgs[i].img.height()), borderImgs[i].name); + for(auto borderImg : borderImgs) borderFd->addItem(QIcon(borderImg.img), QString::number(borderImg.img.height()), borderImg.name); borderFd->setIconSize(QSize(borderImgMaxWidth, borderImgMaxHeight)); if(bdImgIdx>-1) borderFd->setCurrentIndex(bdImgIdx+1); connect(borderFd, (void(QComboBox::*)(int))&QComboBox::currentIndexChanged, this, [this](int idx){ diff --git a/LedOK/program/ebase.h b/LedOK/program/ebase.h index 881a68e..3c809d9 100644 --- a/LedOK/program/ebase.h +++ b/LedOK/program/ebase.h @@ -26,7 +26,7 @@ public: QRectF boundingRect() const override; void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) override; - virtual JObj attrJson() const = 0; + virtual JObj attrJson() = 0; virtual bool save(const QString &) {return true;} virtual QWidget* attrWgt() = 0; diff --git a/LedOK/program/edclock.cpp b/LedOK/program/edclock.cpp index edbf409..428f71b 100644 --- a/LedOK/program/edclock.cpp +++ b/LedOK/program/edclock.cpp @@ -411,7 +411,7 @@ QWidget* EDClock::attrWgt() { return wgtAttr; } -JObj EDClock::attrJson() const { +JObj EDClock::attrJson() { JObj json; addBaseAttr(json); json["elementType"] = "DClock"; diff --git a/LedOK/program/edclock.h b/LedOK/program/edclock.h index 0bfb697..93e549b 100644 --- a/LedOK/program/edclock.h +++ b/LedOK/program/edclock.h @@ -19,7 +19,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; int type() const override { return EBase::DClock; } QWidget* attrWgt() override; - JObj attrJson() const override; + JObj attrJson() override; QTimeZone timeZone; QFont font = qfont("Arial", 12); diff --git a/LedOK/program/eenviron.cpp b/LedOK/program/eenviron.cpp index 9dbe43d..b4d7db2 100644 --- a/LedOK/program/eenviron.cpp +++ b/LedOK/program/eenviron.cpp @@ -52,7 +52,7 @@ JObj EEnviron::genProg(const JValue &json, const QString &dstDir, const QString Tools::saveImg(dstDir, metric, font, color, values, tr("W"), "W"); Tools::saveImg(dstDir, metric, font, color, values, tr("NW"), "NW"); res["values"] = values; - + auto hideUnits = json["hideUnits"].toBool(); JArray oitems; std::unordered_map unitMap; auto itemMap = genItemMap(); @@ -61,6 +61,7 @@ JObj EEnviron::genProg(const JValue &json, const QString &dstDir, const QString oitems->push_back(JObj{{"name", pair.first}}); auto oitem = oitems->back().toObj(); Tools::saveImg(dstDir, metric, font, color, oitem, pair.second["label"].toString(), "label"); + if(hideUnits) continue; auto unit = itemMap[pair.first].unit; if(unit.isEmpty()) continue; auto &url = unitMap[unit]; @@ -101,6 +102,7 @@ EEnviron::EEnviron(const JObj &json, EBase *multiWin): EBase(multiWin){ textColor = json["textColor"].toStr("#ff000000"); tempCompen = json["tempCompen"].toInt(); useFahrenheit = json["useFahrenheit"].toInt(); + hideUnits = json["hideUnits"].toBool(); title = json["title"].toStr(); isSingleLine = json["isSingleLine"].toBool(); scrollSpeed = json["scrollSpeed"].toInt(); @@ -161,7 +163,8 @@ void EEnviron::calAttr() { if(item.first=="temp") scroll_txt += QString::number(tempCompen); else if(item.first=="windDirection") scroll_txt += "--"; else scroll_txt += "0"; - scroll_txt += item.second.unit + " "; + if(! hideUnits) scroll_txt += item.second.unit; + scroll_txt += " "; } scroll_width = QFontMetrics(font).horizontalAdvance(scroll_txt); } @@ -187,7 +190,7 @@ void EEnviron::drawText(QPainter *painter, QRectF& rect) { if(itemPair.first=="temp") text += QString::number(tempCompen); else if(itemPair.first=="windDirection") text += "--"; else text += "0"; - text += itemPair.second.unit; + if(! hideUnits) text += itemPair.second.unit; painter->drawText(rect, text, opt); rect.translate(0, rect.height()); } @@ -280,7 +283,7 @@ QWidget* EEnviron::attrWgt() { hBox->addWidget(fdIsCelsius); auto fdIsFahrenheit = new QRadioButton("℉"); - connect(fdIsFahrenheit, &QRadioButton::toggled, this, [this](bool checked) { + connect(fdIsFahrenheit, &QRadioButton::toggled, this, [=](bool checked) { useFahrenheit = checked; calAttr(); update(); @@ -307,7 +310,7 @@ QWidget* EEnviron::attrWgt() { hBox = new HBox(vBox); hBox->addStretch(); - hBox->addWidget(new QLabel(tr("Compensation"))); + hBox->addLabel(tr("Compensation")); auto fdCompen = new QSpinBox; fdCompen->setRange(-99, 999); @@ -321,6 +324,17 @@ QWidget* EEnviron::attrWgt() { } } + hBox = new HBox(vBox); + hBox->addStretch(); + auto edHideUnits = new QCheckBox("Hide Units"); + if(hideUnits) edHideUnits->setChecked(true); + connect(edHideUnits, &QRadioButton::toggled, this, [=](bool checked) { + hideUnits = checked; + calAttr(); + update(); + }); + hBox->addWidget(edHideUnits); + auto wgtAlign = new QWidget; vBox->addWidget(wgtAlign); hBox = new HBox(wgtAlign); @@ -329,7 +343,7 @@ QWidget* EEnviron::attrWgt() { auto fdLeft = new QRadioButton(tr("Left")); fdLeft->setChecked(true); - connect(fdLeft, &QRadioButton::toggled, this, [this](bool checked) { + connect(fdLeft, &QRadioButton::toggled, this, [=](bool checked) { if(! checked) return; align = 0; calAttr(); @@ -338,7 +352,7 @@ QWidget* EEnviron::attrWgt() { hBox->addWidget(fdLeft); auto fdCenter = new QRadioButton(tr("Center")); - connect(fdCenter, &QRadioButton::toggled, this, [this](bool checked) { + connect(fdCenter, &QRadioButton::toggled, this, [=](bool checked) { if(! checked) return; align = 1; calAttr(); @@ -347,7 +361,7 @@ QWidget* EEnviron::attrWgt() { hBox->addWidget(fdCenter); auto fdRight = new QRadioButton(tr("Right")); - connect(fdRight, &QRadioButton::toggled, this, [this](bool checked) { + connect(fdRight, &QRadioButton::toggled, this, [=](bool checked) { if(! checked) return; align = 2; calAttr(); @@ -490,7 +504,7 @@ QWidget* EEnviron::attrWgt() { return wgtAttr; } -JObj EEnviron::attrJson() const{ +JObj EEnviron::attrJson() { JObj json; addBaseAttr(json); json["elementType"] = "Temp"; @@ -503,6 +517,7 @@ JObj EEnviron::attrJson() const{ json["items"] = items; json["tempCompen"] = tempCompen; json["useFahrenheit"] = useFahrenheit; + json["hideUnits"] = hideUnits; json["isSingleLine"] = isSingleLine; json["scrollSpeed"] = scrollSpeed; json["align"] = align; diff --git a/LedOK/program/eenviron.h b/LedOK/program/eenviron.h index 082766d..16bc4a8 100644 --- a/LedOK/program/eenviron.h +++ b/LedOK/program/eenviron.h @@ -41,8 +41,7 @@ public: int tempCompen = 0; int align = 0; int scrollSpeed = 30; - bool useFahrenheit = false; - bool isSingleLine = false; + bool useFahrenheit = false, isSingleLine = false, hideUnits = false; static JObj genProg(const JValue &, const QString &, const QString &); @@ -54,7 +53,7 @@ public: int type() const override { return EBase::Environ; } QWidget* attrWgt() override; bool save(const QString &pRoot) override; - JObj attrJson() const override; + JObj attrJson() override; private: void init(); diff --git a/LedOK/program/emultiwin.cpp b/LedOK/program/emultiwin.cpp index b7694cb..c064c93 100644 --- a/LedOK/program/emultiwin.cpp +++ b/LedOK/program/emultiwin.cpp @@ -10,6 +10,7 @@ #include "etimer.h" #include "eenviron.h" #include "eweb.h" +#include "etable.h" #include #include #include @@ -28,13 +29,14 @@ EMultiWin::EMultiWin(const JObj &json, PageListItem *pageItem) : mPageItem(pageI QString type = element["elementType"].toString(); EBase *inner = 0; if(type=="Text") inner = new EText(element.toObj(), this); - else if(type=="Image" || type=="Photo" || type=="Gif") inner = EPhoto::create(element.toObj(), pageItem, this); + else if(type=="Image" || type=="Photo" || type=="Gif") inner = EPhoto::create(element.toObj(), pageItem->mPageDir, this); else if(type=="Video"||type=="Movie") inner = EVideo::create(element.toObj(), pageItem, this); else if(type=="DClock") inner = new EDClock(element.toObj(), this); else if(type=="AClock") inner = new EAClock(element.toObj(), this); else if(type=="Temp") inner = new EEnviron(element.toObj(), this); else if(type=="Web") inner = new EWeb(element.toObj(), this); else if(type=="Timer") inner = new ETimer(element.toObj(), this); + else if(type=="Table") inner = new ETable(element.toObj(), pageItem->mPageDir, this); if(inner==0) continue; inner->setPos(0, 0); inner->setFlag(QGraphicsItem::ItemStacksBehindParent); @@ -66,7 +68,7 @@ bool EMultiWin::save(const QString &pageDir) { return true; } -JObj EMultiWin::attrJson() const{ +JObj EMultiWin::attrJson() { JArray eles; for(auto inner : inners) eles.append(inner->attrJson()); JObj oRoot; diff --git a/LedOK/program/emultiwin.h b/LedOK/program/emultiwin.h index 3af957f..68bdac0 100644 --- a/LedOK/program/emultiwin.h +++ b/LedOK/program/emultiwin.h @@ -15,7 +15,7 @@ public: int type() const override { return EBase::Window; } QWidget* attrWgt() override; bool save(const QString &) override; - JObj attrJson() const override; + JObj attrJson() override; void setCur(EBase *); diff --git a/LedOK/program/ephoto.cpp b/LedOK/program/ephoto.cpp index 4d4cd2b..7151544 100644 --- a/LedOK/program/ephoto.cpp +++ b/LedOK/program/ephoto.cpp @@ -7,15 +7,15 @@ #include #include -EPhoto *EPhoto::create(const JObj &json, PageListItem *pageItem, EBase *multiWin) { +EPhoto *EPhoto::create(const JObj &json, const QString &dir, EBase *multiWin) { auto widget = json["widget"]; auto name = (widget.isNull() ? json["name"] : widget["file"]).toString(); - auto file = pageItem->mPageDir + "/" + name; + auto file = dir + "/" + name; QImageReader reader(file); reader.setAutoTransform(true); auto img = reader.read(); if(img.isNull()) return 0; - auto ins = new EPhoto(reader, img, pageItem->mPageDir, name, json, multiWin); + auto ins = new EPhoto(reader, img, dir, name, json, multiWin); ins->setBaseAttr(json); return ins; } @@ -35,7 +35,7 @@ EPhoto::EPhoto(QImageReader &reader, const QImage &img, const QString &dir, cons speed = json["speed"].toInt(); tailSpacing = json["tailSpacing"].toInt(); } -JObj EPhoto::attrJson() const { +JObj EPhoto::attrJson() { JObj json; addBaseAttr(json); json["elementType"] = frames.empty() ? "Image" : "Gif"; diff --git a/LedOK/program/ephoto.h b/LedOK/program/ephoto.h index f4085e5..37d60af 100644 --- a/LedOK/program/ephoto.h +++ b/LedOK/program/ephoto.h @@ -2,7 +2,6 @@ #define EPHOTO_H #include "ebase.h" -#include "pagelistitem.h" #include "synctimer.h" struct Frame { @@ -13,14 +12,14 @@ struct Frame { class EPhoto : public EBase { Q_OBJECT public: - static QString filters() { return tr("Images (*.png *.jpg *.jpeg *.bmp *.gif)"); } - static EPhoto *create(const JObj &, PageListItem *pageItem, EBase *multiWin = 0); + static QString filters() { return tr("Images")+" (*.png *.jpg *.jpeg *.bmp *.gif)"; } + static EPhoto *create(const JObj &, const QString &dir, EBase *multiWin = 0); explicit EPhoto(QImageReader &reader, const QImage &, const QString &dir, const QString &name, const JObj &json, EBase *multiWin = 0); int type() const override { return EBase::Image; } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - JObj attrJson() const override; + JObj attrJson() override; bool save(const QString &pageDir) override; QWidget* attrWgt() override; diff --git a/LedOK/program/etable.cpp b/LedOK/program/etable.cpp index d247454..1f59b26 100644 --- a/LedOK/program/etable.cpp +++ b/LedOK/program/etable.cpp @@ -4,50 +4,383 @@ #include #include #include -#include "xlsxcellrange.h" -#include "xlsxchart.h" -#include "xlsxchartsheet.h" +#include +#include +#include #include "xlsxdocument.h" -#include "xlsxrichstring.h" +#include "xlsxformat.h" #include "xlsxworkbook.h" -#include "xlsxworksheet.h" -ETable::ETable(EBase *multiWin) : EBase(multiWin) { +ETable::ETable(int row, int col, EBase *multiWin) : EBase(multiWin) { + init(row, col); +} +ETable::ETable(const JObj &json, const QString &dir, EBase *multiWin) : EBase(multiWin) { mType = EBase::Table; - dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, 0); - dlg.resize(600, 600); + setBaseAttr(json); + name = json["name"].toStr(); + direction = json["direction"].toStr(); + speed = json["speed"].toInt(); + img = QPixmap(dir+"/"+name+".png"); + init(); + edGridColor->setColor(json["gridColor"].toString()); + + QXlsx::Document doc(dir+"/"+name+".xlsx"); + auto sheet = doc.currentWorksheet(); + if(doc.isLoadPackage() && sheet) read(sheet); + else { + table->setRowCount(8); + table->setColumnCount(4); + } +} +void ETable::init(int row, int col) { + mType = EBase::Table; + dlg.setWindowModality(Qt::ApplicationModal); + dlg.resize(1024, 800); dlg.setWindowTitle(tr("Table Editor")); auto vBox = new VBox(&dlg); - vBox->setContentsMargins(6, 0, 6, 0); + vBox->setContentsMargins(0, 0, 0, 0); + vBox->setSpacing(4); + + table = row==0 ? new PaintTableWidget : new PaintTableWidget(row, col); + table->ebase = this; auto hBox = new HBox(vBox); - hBox = new HBox(vBox); - table = new TableWidget(8, 3); + auto vv = new VBox(hBox); + auto hh = new HBox(vv); + auto edFontFamily = new QFontComboBox; + edFontFamily->setEditable(false); + edFontFamily->setCurrentFont(QFont("Calibri")); + connect(edFontFamily, &QFontComboBox::currentFontChanged, table, [=](const QFont &f) { + if(isAutoSetting) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + auto ft = item->font(); + ft.setFamily(f.family()); + item->setFont(ft); + } + }); + hh->addWidget(edFontFamily); + + hh = new HBox(vv); + + auto edFontSize = new QSpinBox; + edFontSize->setRange(4, 9999); + edFontSize->setValue(11); + connect(edFontSize, &QSpinBox::valueChanged, table, [=](int value) { + if(isAutoSetting) return; + if(value <= 0) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + auto ft = item->font(); + ft.setPointSize(value); + item->setFont(ft); + } + }); + hh->addWidget(edFontSize); + + auto edFontBold = new QPushButton("B"); + edFontBold->setToolTip(tr("Bold")); + edFontBold->setStyleSheet("QPushButton{background: #ddd; color: #444; font-size: 16px; font-weight: bold;} QPushButton:checked{background: #29c; color: #fff;}"); + edFontBold->setFixedSize(26, 26); + edFontBold->setCheckable(true); + connect(edFontBold, &QPushButton::toggled, this, [=](bool checked) { + if(isAutoSetting) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + auto ft = item->font(); + ft.setBold(checked); + item->setFont(ft); + } + }); + hh->addWidget(edFontBold); + + auto edFontItalic = new QPushButton("I"); + edFontItalic->setToolTip(tr("Italic")); + edFontItalic->setStyleSheet("QPushButton{background: #ddd; color: #444; font-size: 16px; font-weight: bold; font-style: italic;} QPushButton:checked{background: #29c; color: #fff;}"); + edFontItalic->setFixedSize(26, 26); + edFontItalic->setCheckable(true); + connect(edFontItalic, &QPushButton::toggled, this, [=](bool checked) { + if(isAutoSetting) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + auto ft = item->font(); + ft.setItalic(checked); + item->setFont(ft); + } + }); + hh->addWidget(edFontItalic); + + auto edFontUnderline = new QPushButton("U"); + edFontUnderline->setToolTip(tr("Underline")); + edFontUnderline->setStyleSheet("QPushButton{background: #ddd; color: #444; font-size: 16px; font-weight: bold; text-decoration: underline;} QPushButton:checked{background: #29c; color: #fff;}"); + edFontUnderline->setFixedSize(26, 26); + edFontUnderline->setCheckable(true); + connect(edFontUnderline, &QPushButton::toggled, this, [=](bool checked) { + if(isAutoSetting) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + auto ft = item->font(); + ft.setUnderline(checked); + item->setFont(ft); + } + }); + hh->addWidget(edFontUnderline); + + auto edTextColor = new LoColorSelector("T", Qt::white); + edTextColor->setToolTip(tr("Text Color")); + edTextColor->setFixedSize(26, 26); + connect(edTextColor, &LoColorSelector::sColorChanged, this, [=](const QColor &color) { + if(isAutoSetting) return; + if(! color.isValid()) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + item->setForeground(color); + } + }); + hh->addWidget(edTextColor); + + auto edBackColor = new LoColorSelector("B", Qt::transparent); + edBackColor->setToolTip(tr("Back Color")); + edBackColor->setFixedSize(26, 26); + connect(edBackColor, &LoColorSelector::sColorChanged, this, [=](const QColor &color) { + if(isAutoSetting) return; + if(! color.isValid()) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + item->setBackground(color); + } + }); + hh->addWidget(edBackColor); + + edGridColor = new LoColorSelector("G", Qt::white); + edGridColor->setToolTip(tr("Grid Color")); + edGridColor->setFixedSize(26, 26); + connect(edGridColor, &LoColorSelector::sColorChanged, this, [=](const QColor &color) { + if(isAutoSetting) return; + if(! color.isValid()) return; + table->setStyleSheet("QTableWidget { gridline-color: "+color.name()+";}"); + }); + hh->addWidget(edGridColor); + + auto line = new QFrame; + line->setFrameShape(QFrame::VLine); + line->setFrameShadow(QFrame::Sunken); + hBox->addWidget(line, 1); + + vv = new VBox(hBox); + hh = new HBox(vv); + + auto edAlignHL = new QPushButton(QIcon(":/res/program/TextAlignHL.png"), ""); + edAlignHL->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignHL->setFixedSize(26, 26); + edAlignHL->setIconSize(QSize(26, 26)); + edAlignHL->setCheckable(true); + hh->addWidget(edAlignHL); + + auto edAlignHC = new QPushButton(QIcon(":/res/program/TextAlignHC.png"), ""); + edAlignHC->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignHC->setFixedSize(26, 26); + edAlignHC->setIconSize(QSize(26, 26)); + edAlignHC->setCheckable(true); + hh->addWidget(edAlignHC); + + auto edAlignHR = new QPushButton(QIcon(":/res/program/TextAlignHR.png"), ""); + edAlignHR->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignHR->setFixedSize(26, 26); + edAlignHR->setIconSize(QSize(26, 26)); + edAlignHR->setCheckable(true); + hh->addWidget(edAlignHR); + + hh = new HBox(vv); + + auto edAlignVT = new QPushButton(QIcon(":/res/program/TextAlignVT.png"), ""); + edAlignVT->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignVT->setFixedSize(26, 26); + edAlignVT->setIconSize(QSize(26, 26)); + edAlignVT->setCheckable(true); + hh->addWidget(edAlignVT); + + auto edAlignVC = new QPushButton(QIcon(":/res/program/TextAlignVC.png"), ""); + edAlignVC->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignVC->setFixedSize(26, 26); + edAlignVC->setIconSize(QSize(26, 26)); + edAlignVC->setCheckable(true); + hh->addWidget(edAlignVC); + + auto edAlignVB = new QPushButton(QIcon(":/res/program/TextAlignVB.png"), ""); + edAlignVB->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignVB->setFixedSize(26, 26); + edAlignVB->setIconSize(QSize(26, 26)); + edAlignVB->setCheckable(true); + hh->addWidget(edAlignVB); + + auto edAlignH = new QButtonGroup(this); + edAlignH->addButton(edAlignHL, Qt::AlignLeft); + edAlignH->addButton(edAlignHC, Qt::AlignHCenter); + edAlignH->addButton(edAlignHR, Qt::AlignRight); + connect(edAlignH, &QButtonGroup::idClicked, this, [=](int value) { + if(isAutoSetting) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + auto align = item->textAlignment(); + align = (align & Qt::AlignVertical_Mask) | value; + item->setTextAlignment(align); + } + }); + + auto edAlignV = new QButtonGroup(this); + edAlignV->addButton(edAlignVT, Qt::AlignTop); + edAlignV->addButton(edAlignVC, Qt::AlignVCenter); + edAlignV->addButton(edAlignVB, Qt::AlignBottom); + connect(edAlignV, &QButtonGroup::idClicked, this, [=](int value) { + if(isAutoSetting) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + auto item = table->itemValid(r, c); + auto align = item->textAlignment(); + align = (align & Qt::AlignHorizontal_Mask) | value; + item->setTextAlignment(align); + } + }); + line = new QFrame; + line->setFrameShape(QFrame::VLine); + line->setFrameShadow(QFrame::Sunken); + hBox->addWidget(line, 1); + + auto grid = new Grid(hBox); + grid->addLabel(tr("Col Width"), 0, 0, Qt::AlignRight|Qt::AlignVCenter); + grid->addLabel(tr("Row Height"), 1, 0, Qt::AlignRight|Qt::AlignVCenter); + + auto edColWidth = new QSpinBox; + edColWidth->setRange(4, 9999); + edColWidth->setValue(64); + connect(edColWidth, &QSpinBox::valueChanged, table, [=](int value) { + if(isAutoSetting) return; + if(value <= 0) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int c=range.leftColumn(); c<=range.rightColumn(); c++) { + table->setColumnWidth(c, value); + } + }); + grid->addWidget(edColWidth, 0, 1); + + auto edRowHeight = new QSpinBox; + edRowHeight->setRange(4, 9999); + edRowHeight->setValue(18); + connect(edRowHeight, &QSpinBox::valueChanged, table, [=](int value) { + if(isAutoSetting) return; + if(value <= 0) return; + auto ranges = table->selectedRanges(); + for(auto range : ranges) for(int r=range.topRow(); r<=range.bottomRow(); r++) { + table->setRowHeight(r, value); + } + }); + grid->addWidget(edRowHeight, 1, 1); + + line = new QFrame; + line->setFrameShape(QFrame::VLine); + line->setFrameShadow(QFrame::Sunken); + hBox->addWidget(line, 1); + + grid = new Grid(hBox); + auto edInsRow = new QPushButton(tr("Insert Row")); + connect(edInsRow, &QPushButton::clicked, table, [=] { + auto ranges = table->selectedRanges(); + table->insertRow(ranges.isEmpty() ? table->rowCount() : ranges[0].topRow()); + }); + grid->addWidget(edInsRow, 0, 0); + + auto edInsCol = new QPushButton(tr("Insert Col")); + connect(edInsCol, &QPushButton::clicked, table, [=] { + auto ranges = table->selectedRanges(); + table->insertColumn(ranges.isEmpty() ? table->columnCount() : ranges[0].leftColumn()); + }); + grid->addWidget(edInsCol, 0, 1); + + auto edDelRow = new QPushButton(tr("Delete Row")); + connect(edDelRow, &QPushButton::clicked, table, [=] { + auto ranges = table->selectedRanges(); + for(auto range = ranges.end()-1; range>=ranges.begin(); range--) for(auto row = range->bottomRow(); row>=range->topRow(); row--) table->removeRow(row); + }); + grid->addWidget(edDelRow, 1, 0); + + auto edDelCol = new QPushButton(tr("Delete Col")); + connect(edDelCol, &QPushButton::clicked, table, [=] { + auto ranges = table->selectedRanges(); + for(auto range = ranges.end()-1; range>=ranges.begin(); range--) for(auto col = range->rightColumn(); col>=range->leftColumn(); col--) table->removeColumn(col); + }); + grid->addWidget(edDelCol, 1, 1); + + auto edMerge = new QPushButton(tr("Merge")); + connect(edMerge, &QPushButton::clicked, table, [=] { + auto ranges = table->selectedRanges(); + table->clearSelection(); + qDebug()<setSpan(range.topRow(), range.leftColumn(), range.rowCount(), range.columnCount()); + }); + grid->addWidget(edMerge, 0, 2); + + auto edUnmerge = new QPushButton(tr("Unmerge")); + connect(edUnmerge, &QPushButton::clicked, table, [=] { + auto ranges = table->selectedRanges(); + for(auto range : ranges) table->setSpan(range.topRow(), range.leftColumn(), 1, 1); + }); + grid->addWidget(edUnmerge, 1, 2); + + line = new QFrame; + line->setFrameShape(QFrame::VLine); + line->setFrameShadow(QFrame::Sunken); + hBox->addWidget(line, 1); + + auto edClear = new QPushButton(QIcon(":/res/program/Clean.png"), tr("Clear Data")); + hBox->addWidget(edClear); + + hBox->addStretch(); + + connect(table, &QTableWidget::itemSelectionChanged, table, [=] { + auto ranges = table->selectedRanges(); + if(ranges.isEmpty()) return; + auto item = table->item(ranges[0].topRow(), ranges[0].leftColumn()); + isAutoSetting = true; + auto ft = item ? item->font() : table->font(); + edFontFamily->setCurrentFont(QFont(ft.family())); + edFontSize->setValue(ft.pointSize()); + edFontBold->setChecked(ft.bold()); + edFontItalic->setChecked(ft.italic()); + edFontUnderline->setChecked(ft.underline()); + edTextColor->setColor(item ? BrushToColor(item->foreground(), Qt::white) : Qt::white); + edBackColor->setColor(item ? BrushToColor(item->background(), Qt::transparent) : Qt::transparent); + if(item) { + if(item->textAlignment() & Qt::AlignHCenter) edAlignHC->setChecked(true); + else if(item->textAlignment() & Qt::AlignRight) edAlignHR->setChecked(true); + else edAlignHL->setChecked(true); + if(item->textAlignment() & Qt::AlignTop) edAlignVT->setChecked(true); + else if(item->textAlignment() & Qt::AlignBottom) edAlignVB->setChecked(true); + else edAlignVC->setChecked(true); + } else { + edAlignHL->setChecked(true); + edAlignVC->setChecked(true); + } + edColWidth->setValue(table->columnWidth(ranges[0].leftColumn())); + edRowHeight->setValue(table->rowHeight(ranges[0].topRow())); + isAutoSetting = false; + }); + auto pal = table->palette(); pal.setBrush(QPalette::Active, QPalette::WindowText, QBrush({255,255,255,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Disabled, QPalette::WindowText, QBrush({157,157,157,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Inactive, QPalette::WindowText, QBrush({255,255,255,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Active, QPalette::Button, QBrush({60,60,60,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Disabled, QPalette::Button, QBrush({60,60,60,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Inactive, QPalette::Button, QBrush({60,60,60,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Active, QPalette::Light, QBrush({120,120,120,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Disabled, QPalette::Light, QBrush({120,120,120,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Inactive, QPalette::Light, QBrush({120,120,120,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Active, QPalette::Midlight, QBrush({90,90,90,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Disabled, QPalette::Midlight, QBrush({90,90,90,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Inactive, QPalette::Midlight, QBrush({90,90,90,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Active, QPalette::Dark, QBrush({30,30,30,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Disabled, QPalette::Dark, QBrush({30,30,30,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Inactive, QPalette::Dark, QBrush({30,30,30,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Active, QPalette::Mid, QBrush({40,40,40,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Disabled, QPalette::Mid, QBrush({40,40,40,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Inactive, QPalette::Mid, QBrush({40,40,40,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Active, QPalette::Text, QBrush({255,255,255,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Disabled, QPalette::Text, QBrush({157,157,157,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Inactive, QPalette::Text, QBrush({255,255,255,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Active, QPalette::BrightText, QBrush({95,255,165,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Disabled, QPalette::BrightText, QBrush({95,255,165,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Inactive, QPalette::BrightText, QBrush({95,255,165,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Active, QPalette::ButtonText, QBrush({255,255,255,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Disabled, QPalette::ButtonText, QBrush({157,157,157,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Inactive, QPalette::ButtonText, QBrush({255,255,255,255}, Qt::SolidPattern)); @@ -89,59 +422,155 @@ ETable::ETable(EBase *multiWin) : EBase(multiWin) { pal.setBrush(QPalette::Inactive, QPalette::PlaceholderText, QBrush({255,255,255,128}, Qt::SolidPattern)); pal.setBrush(QPalette::Active, QPalette::NColorRoles, QBrush({157,157,157,255}, Qt::SolidPattern)); pal.setBrush(QPalette::Disabled, QPalette::NColorRoles, QBrush({255,255,255,255}, Qt::SolidPattern)); - pal.setBrush(QPalette::Inactive, QPalette::Highlight, pal.brush(QPalette::Active, QPalette::Highlight)); table->setPalette(pal); + auto ft = table->font(); + ft.setFamily("Calibri"); + ft.setPointSize(11); ft.setStyleStrategy(QFont::NoAntialias); table->setFont(ft); - table->setShowGrid(false); - table->setStyleSheet("QTableView::item { border: 1px solid red;}"); + table->viewport()->setFont(ft); + auto item = new QTableWidgetItem; + item->setFont(ft); + table->setItemPrototype(item); + table->setStyleSheet("QTableWidget { gridline-color: #fff;}"); + //table->setStyleSheet("QTableWidget::item { border: 0.5px solid #fff;}"); + table->setRowHeight(20); + table->setColWidth(64); vBox->addWidget(table); - read(); + connect(&dlg, &EmitCloseWidget::onClose, this, &ETable::grabImg); } -ETable::ETable(const JObj &json, EBase *multiWin) : EBase(multiWin) { - mType = EBase::Table; - setBaseAttr(json); - url = json["url"].toString(); - read(); +void PaintTableWidget::paintEvent(QPaintEvent *event) { + TableWidget::paintEvent(event); + if(ebase) { + QPainter painter(viewport()); + painter.setPen(QPen(Qt::green)); + auto rect = ebase->innerRect(); + painter.drawRect(columnViewportPosition(0)-1, rowViewportPosition(0)-1, rect.width(), rect.height()); + } } -int ETable::read() { - QXlsx::Document xlsxDoc("d:/aaa.xlsx"); - if(! xlsxDoc.isLoadPackage()) { - qCritical() << "Failed to load xlsx"; - return -1; - } - auto currentSheet = xlsxDoc.currentWorksheet(); - if(currentSheet == 0) { - qCritical() << "Failed to load Worksheet"; - return -1; - } - int maxRow = -1, maxCol = -1; - auto cells = currentSheet->getFullCells(&maxRow, &maxCol); - for(auto &cell : cells) { - auto value = cell.cell->value(); - auto fmt = cell.cell->format(); - fmt.font(); - qDebug()<cellType()<color.name(QColor::HexArgb); + return obj; } +bool ETable::save(const QString &pageDir) { + if(png.isEmpty()) { + QBuffer buf(&png); + img.save(&buf, "PNG"); + QCryptographicHash cryptoHash(QCryptographicHash::Md5); + cryptoHash.addData(png); + name = QString::fromLatin1(cryptoHash.result().toHex()); + } + QFile file(pageDir+"/"+name+".png"); + if(! file.open(QFile::WriteOnly)) return false; + file.write(png); + file.close(); + QXlsx::Document doc; + for(int r=0; rrowCount(); r++) doc.setRowHeight(r+1, table->rowHeight(r) * 3.0 / 4); + for(int c=0; ccolumnCount(); c++) doc.setColumnWidth(c+1, table->columnWidth(c) / 7.2); + for(int r=0; rrowCount(); r++) for(int c=0; ccolumnCount(); c++) { + auto item = table->item(r, c); + if(item==0) continue; + QXlsx::Format format; + format.setFont(item->font()); + format.setFontColor(BrushToColor(item->foreground())); + format.setPatternBackgroundColor(BrushToColor(item->background())); + if(item->textAlignment() & Qt::AlignLeft) format.setHorizontalAlignment(QXlsx::Format::AlignLeft); + else if(item->textAlignment() & Qt::AlignHCenter) format.setHorizontalAlignment(QXlsx::Format::AlignHCenter); + else if(item->textAlignment() & Qt::AlignRight) format.setHorizontalAlignment(QXlsx::Format::AlignRight); + if(item->textAlignment() & Qt::AlignTop) format.setVerticalAlignment(QXlsx::Format::AlignTop); + else if(item->textAlignment() & Qt::AlignBottom) format.setVerticalAlignment(QXlsx::Format::AlignBottom); + else format.setVerticalAlignment(QXlsx::Format::AlignVCenter); + doc.write(r+1, c+1, item->text(), format); + auto rs = table->rowSpan(r, c); + auto cs = table->columnSpan(r, c); + if(rs>1 || cs>1) doc.mergeCells(QXlsx::CellRange(r+1, c+1, r+rs, c+cs)); + } + doc.saveAs(pageDir+"/"+name+".xlsx"); + return true; +} +int ETable::read(QXlsx::Worksheet *sheet) { + int rowCnt, colCnt; + auto cells = sheet->getFullCells(&rowCnt, &colCnt); + auto dimension = sheet->dimension(); + if(dimension.rowCount() > rowCnt) rowCnt = dimension.rowCount(); + if(dimension.columnCount() > colCnt) colCnt = dimension.columnCount(); + table->setRowCount(rowCnt); + table->setColumnCount(colCnt); + for(int r=0; rsetRowHeight(r, sheet->rowHeight(r+1) * 4 / 3); + for(int c=0; csetColumnWidth(c, sheet->columnWidth(c+1) * 7.2); + for(auto &cell : cells) { + auto fmt = cell.cell->format(); + auto item = new QTableWidgetItem(cell.cell->value().toString()); + auto ft = fmt.font(); + ft.setStyleStrategy(QFont::NoAntialias); + item->setFont(ft); + auto color = fmt.fontColor(); + if(color.isValid()) item->setForeground(color); + color = fmt.patternBackgroundColor(); + if(color.isValid()) item->setBackground(color); + auto ha = fmt.horizontalAlignment(); + auto va = fmt.verticalAlignment(); + auto hAlign = Qt::AlignLeft; + auto vAlign = Qt::AlignVCenter; + if(ha==QXlsx::Format::AlignHCenter) hAlign = Qt::AlignHCenter; + else if(ha==QXlsx::Format::AlignRight) hAlign = Qt::AlignRight; + if(va==QXlsx::Format::AlignTop) vAlign = Qt::AlignTop; + else if(va==QXlsx::Format::AlignBottom) vAlign = Qt::AlignBottom; + item->setTextAlignment(hAlign | vAlign); + table->setItem(cell.row-1, cell.col-1, item); + qDebug()<cellType()<cellType(); + } + auto mergeds = sheet->mergedCells(); + for(auto &merged : mergeds) table->setSpan(merged.firstRow()-1, merged.firstColumn()-1, merged.rowCount(), merged.columnCount()); + return 0; +} +void ETable::grabImg() { + table->ebase = 0; + table->clearSelection(); + int width = 0, height = 0; + for(int r=0; rrowCount(); r++) height += table->rowHeight(r); + for(int c=0; ccolumnCount(); c++) width += table->columnWidth(c); + auto size = dlg.size(); + dlg.resize(width+80, height+200); + img = QPixmap(width+20, height+20); + QPainter painter(&img); + painter.translate(1, 1); + table->viewport()->render(&painter); + painter.translate(-1, -1); + painter.setPen(QPen(edGridColor->color)); + painter.drawLine(0,0, width, 0); + painter.drawLine(0,0, 0, height); + table->ebase = this; + dlg.resize(size); + png.clear(); + update(); +} void ETable::paint(QPainter *painter, const QStyleOptionGraphicsItem *a, QWidget *b) { auto inner = innerRect(); painter->setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform); - painter->drawPixmap(inner.left(), inner.top(), img); + painter->drawPixmap(inner.left(), inner.top(), inner.width(), inner.height(), img, 0, 0, inner.width(), inner.height()); EBase::paint(painter, a, b); } -void ETable::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { - dlg.exec(); - img = table->grab(); - auto twidth = table->width(); - if(twidth != img.width()) { - img = img.scaledToWidth(twidth, Qt::SmoothTransformation); - qDebug()<<"scaledToWidth"<addWidget(line, 1); hBox = new HBox(vBox); - hBox->addSpacing(6); - hBox->addLabel("URL:"); - auto url_fd = new QLineEdit(url); - hBox->addWidget(url_fd); - connect(url_fd, &QLineEdit::textChanged, this, [this](const QString &text) { - url = text; + + auto label = hBox->addLabel(tr("Direction")); + label->setMinimumWidth(80); + label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); + + auto edDirection = new QComboBox; + edDirection->addItem(tr("Static"), ""); + edDirection->addItem(tr("Bottom -> Top"), "top"); + edDirection->addItem(tr("Right -> Left"), "left"); + edDirection->addItem(tr("Top -> Bottom"), "bottom"); + edDirection->addItem(tr("Left -> Right"), "right"); + SetCurData(edDirection, direction); + connect(edDirection, &QComboBox::currentIndexChanged, this, [=] { + direction = edDirection->currentData().toString(); }); + hBox->addWidget(edDirection); - hBox = new HBox(vBox); - auto lb = hBox->addLabel(tr("Refresh every")+":"); - lb->setMinimumWidth(70); - lb->setAlignment(Qt::AlignVCenter|Qt::AlignRight); + label = hBox->addLabel(tr("Speed")); + label->setMinimumWidth(80); + label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); - auto edRefresh = new QSpinBox; - edRefresh->setRange(0, 99999); - edRefresh->setValue(refresh); - connect(edRefresh, &QSpinBox::valueChanged, this, [=](int value) { - refresh = value; + auto edSpeed = new QComboBox; + edSpeed->setEditable(true); + edSpeed->setMinimumWidth(50); + edSpeed->addItem("600"); + edSpeed->addItem("540"); + edSpeed->addItem("480"); + edSpeed->addItem("420"); + edSpeed->addItem("360"); + edSpeed->addItem("300"); + edSpeed->addItem("240"); + edSpeed->addItem("180"); + edSpeed->addItem("120"); + edSpeed->addItem("60"); + edSpeed->addItem("30"); + edSpeed->setMaxVisibleItems(edSpeed->count()); + auto text = QString::number(speed); + if(SetCurText(edSpeed, text)==-1) { + SetCurText(edSpeed, "60"); + edSpeed->setCurrentText(text); + } + connect(edSpeed, &QComboBox::editTextChanged, this, [=](const QString &text) { + bool ok; + auto speed = text.toInt(&ok); + if(ok) this->speed = speed; }); - hBox->addWidget(edRefresh); - hBox->addSpacing(-3); - hBox->addLabel("s"); + hBox->addWidget(edSpeed); + hBox->addLabel("px/s"); hBox->addStretch(); vBox->addStretch(); return wgtAttr; } - -JObj ETable::attrJson() const { - JObj obj; - addBaseAttr(obj); - obj["elementType"] = "Table"; - obj["url"] = url; - obj["zoom"] = zoom; - obj["refreshSec"] = refresh; - obj["offX"] = _x; - obj["offY"] = _y; - obj["scaleX"] = scaleX; - obj["scaleY"] = scaleY; - return obj; -} diff --git a/LedOK/program/etable.h b/LedOK/program/etable.h index f82065f..a5ebfca 100644 --- a/LedOK/program/etable.h +++ b/LedOK/program/etable.h @@ -3,27 +3,42 @@ #include "ebase.h" #include "gutil/qgui.h" -#include +#include "base/locolorselector.h" +#include "xlsxworksheet.h" + +class PaintTableWidget : public TableWidget { + Q_OBJECT +public: + using TableWidget::TableWidget; + EBase *ebase = 0; +protected: + void paintEvent(QPaintEvent *) override; +}; class ETable : public EBase { Q_OBJECT public: - explicit ETable(EBase *multiWin = 0); - explicit ETable(const JObj &json, EBase *multiWin = 0); - - int read(); + explicit ETable(int, int, EBase *multiWin = 0); + explicit ETable(const JObj &json, const QString &dir, EBase *multiWin = 0); + void init(int=0, int=0); + int read(QXlsx::Worksheet *); + void grabImg(); int type() const override {return EBase::Table;} + JObj attrJson() override; + bool save(const QString &) override; void paint(QPainter*, const QStyleOptionGraphicsItem *, QWidget *) override; void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; QWidget* attrWgt() override; - bool save(const QString &) override {return true;}; - JObj attrJson() const override; - QDialog dlg; - TableWidget *table; + EmitCloseWidget dlg; + PaintTableWidget *table = 0; QPixmap img; - QString url; - int zoom = 100, refresh = 0, _x = 0, _y = 0, scaleX = 100, scaleY = 100; + QByteArray png; + LoColorSelector *edGridColor; + QString name; + QString direction; + int speed = 60; + bool isAutoSetting = false; }; #endif // ETABLE_H diff --git a/LedOK/program/etext.cpp b/LedOK/program/etext.cpp index bc85719..2f75746 100644 --- a/LedOK/program/etext.cpp +++ b/LedOK/program/etext.cpp @@ -38,6 +38,7 @@ EText::EText(const JObj &json, EBase *multiWin) : EBase(multiWin) { align = (Qt::Alignment) widget["align"].toInt(); backColor = widget["backColor"].toString("#00000000"); lastFont = widget["lastFont"].toString("黑体"); + letterSpacin = widget["letterSpacin"].toInt(100); auto play = json["play"]; if(play.isNull()) { playMode = json["playMode"].toString(); @@ -93,25 +94,25 @@ QWidget* EText::attrWgt() { auto fdText = new TTextEdit(""); - auto fdFontFamily = new QFontComboBox; - fdFontFamily->setEditable(false); - fdFontFamily->setCurrentFont(QFont(lastFont)); - connect(fdFontFamily, &QFontComboBox::currentFontChanged, fdText, [=](const QFont &f) { + auto edFontFamily = new QFontComboBox; + edFontFamily->setEditable(false); + edFontFamily->setCurrentFont(QFont(lastFont)); + connect(edFontFamily, &QFontComboBox::currentFontChanged, fdText, [=](const QFont &f) { QTextCharFormat fmt; fmt.setFontFamilies({f.family()}); - QTextCursor cursor = fdText->textCursor(); + auto cursor = fdText->textCursor(); if(! cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); cursor.mergeCharFormat(fmt); lastFont = f.family(); }); - hBox->addWidget(fdFontFamily); + hBox->addWidget(edFontFamily); hBox->addStretch(); - auto fdFontSize = new QSpinBox; - fdFontSize->setRange(4, 9999); - fdFontSize->setValue(16); - connect(fdFontSize, &QSpinBox::valueChanged, fdText, [=](int value) { + auto edFontSize = new QSpinBox; + edFontSize->setRange(4, 9999); + edFontSize->setValue(16); + connect(edFontSize, &QSpinBox::valueChanged, fdText, [=](int value) { if(value <= 0) return; QTextCharFormat fmt; fmt.setProperty(QTextFormat::FontPixelSize, value); @@ -119,74 +120,77 @@ QWidget* EText::attrWgt() { if(! cursor.hasSelection()) cursor.select(QTextCursor::WordUnderCursor); cursor.mergeCharFormat(fmt); }); - hBox->addWidget(fdFontSize); + hBox->addWidget(edFontSize); hBox = new HBox(vBox); hBox->setSpacing(3); - auto wTextAlignHL = new QPushButton(QIcon(":/res/program/TextAlignHL.png"), ""); - wTextAlignHL->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); - wTextAlignHL->setFixedSize(30, 30); - wTextAlignHL->setIconSize(QSize(30, 30)); - wTextAlignHL->setCheckable(true); - wTextAlignHL->setChecked(true); - hBox->addWidget(wTextAlignHL); + auto edAlignHL = new QPushButton(QIcon(":/res/program/TextAlignHL.png"), ""); + edAlignHL->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignHL->setFixedSize(26, 26); + edAlignHL->setIconSize(QSize(26, 26)); + edAlignHL->setCheckable(true); + edAlignHL->setChecked(true); + hBox->addWidget(edAlignHL); - auto wTextAlignHC = new QPushButton(QIcon(":/res/program/TextAlignHC.png"), ""); - wTextAlignHC->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); - wTextAlignHC->setFixedSize(30, 30); - wTextAlignHC->setIconSize(QSize(30, 30)); - wTextAlignHC->setCheckable(true); - hBox->addWidget(wTextAlignHC); + auto edAlignHC = new QPushButton(QIcon(":/res/program/TextAlignHC.png"), ""); + edAlignHC->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignHC->setFixedSize(26, 26); + edAlignHC->setIconSize(QSize(26, 26)); + edAlignHC->setCheckable(true); + hBox->addWidget(edAlignHC); - auto wTextAlignHR = new QPushButton(QIcon(":/res/program/TextAlignHR.png"), ""); - wTextAlignHR->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); - wTextAlignHR->setFixedSize(30, 30); - wTextAlignHR->setIconSize(QSize(30, 30)); - wTextAlignHR->setCheckable(true); - hBox->addWidget(wTextAlignHR); + auto edAlignHR = new QPushButton(QIcon(":/res/program/TextAlignHR.png"), ""); + edAlignHR->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignHR->setFixedSize(26, 26); + edAlignHR->setIconSize(QSize(26, 26)); + edAlignHR->setCheckable(true); + hBox->addWidget(edAlignHR); hBox->addStretch(); - auto fdFontBold = new QPushButton("B"); - fdFontBold->setStyleSheet("QPushButton{background: #bbb; color: #888; font-size: 20px; font-weight: bold;} QPushButton:checked{background: #29c; color: #fff;}"); - fdFontBold->setFixedSize(30, 30); - fdFontBold->setCheckable(true); - connect(fdFontBold, &QToolButton::toggled, fdText, [fdText](bool checked) { + auto edFontBold = new QPushButton("B"); + edFontBold->setToolTip(tr("Bold")); + edFontBold->setStyleSheet("QPushButton{background: #ddd; color: #444; font-size: 16px; font-weight: bold;} QPushButton:checked{background: #29c; color: #fff;}"); + edFontBold->setFixedSize(26, 26); + edFontBold->setCheckable(true); + connect(edFontBold, &QToolButton::toggled, fdText, [=](bool checked) { QTextCharFormat fmt; fmt.setFontWeight(checked ? QFont::Bold : QFont::Normal); MergeFmt(fdText, fmt); }); - hBox->addWidget(fdFontBold); + hBox->addWidget(edFontBold); - auto fdFontItalic = new QPushButton("I"); - fdFontItalic->setStyleSheet("QPushButton{background: #bbb; color: #888; font-size: 20px; font-style: italic;} QPushButton:checked{background: #29c; color: #fff;}"); - fdFontItalic->setFixedSize(30, 30); - fdFontItalic->setCheckable(true); - connect(fdFontItalic, &QToolButton::toggled, fdText, [fdText](bool checked) { + auto edFontItalic = new QPushButton("I"); + edFontItalic->setToolTip(tr("Italic")); + edFontItalic->setStyleSheet("QPushButton{background: #ddd; color: #444; font-size: 16px; font-weight: bold; font-style: italic;} QPushButton:checked{background: #29c; color: #fff;}"); + edFontItalic->setFixedSize(26, 26); + edFontItalic->setCheckable(true); + connect(edFontItalic, &QToolButton::toggled, fdText, [=](bool checked) { QTextCharFormat fmt; fmt.setFontItalic(checked); MergeFmt(fdText, fmt); }); - hBox->addWidget(fdFontItalic); + hBox->addWidget(edFontItalic); - auto fdFontUnderline = new QPushButton("U"); - fdFontUnderline->setStyleSheet("QPushButton{background: #bbb; color: #888; font-size: 20px; text-decoration: underline;} QPushButton:checked{background: #29c; color: #fff;}"); - fdFontUnderline->setFixedSize(30, 30); - fdFontUnderline->setCheckable(true); - connect(fdFontUnderline, &QToolButton::toggled, fdText, [fdText](bool checked) { + auto edFontUnderline = new QPushButton("U"); + edFontUnderline->setToolTip(tr("Underline")); + edFontUnderline->setStyleSheet("QPushButton{background: #ddd; color: #444; font-size: 16px; font-weight: bold; text-decoration: underline;} QPushButton:checked{background: #29c; color: #fff;}"); + edFontUnderline->setFixedSize(26, 26); + edFontUnderline->setCheckable(true); + connect(edFontUnderline, &QToolButton::toggled, fdText, [=](bool checked) { QTextCharFormat fmt; fmt.setFontUnderline(checked); MergeFmt(fdText, fmt); }); - hBox->addWidget(fdFontUnderline); + hBox->addWidget(edFontUnderline); hBox->addStretch(); auto fdTextColor = new LoColorSelector("T", Qt::white); fdTextColor->setToolTip(tr("Text Color")); - fdTextColor->setFixedSize(30, 30); - connect(fdTextColor, &LoColorSelector::sColorChanged, fdText, [fdText](const QColor &color) { + fdTextColor->setFixedSize(26, 26); + connect(fdTextColor, &LoColorSelector::sColorChanged, fdText, [=](const QColor &color) { if(! color.isValid()) return; QTextCharFormat fmt; fmt.setForeground(color); @@ -196,8 +200,8 @@ QWidget* EText::attrWgt() { auto fdBackColor = new LoColorSelector("B", backColor); fdBackColor->setToolTip(tr("Back Color")); - fdBackColor->setFixedSize(30, 30); - connect(fdBackColor, &LoColorSelector::sColorChanged, this, [this](const QColor &color) { + fdBackColor->setFixedSize(26, 26); + connect(fdBackColor, &LoColorSelector::sColorChanged, this, [=](const QColor &color) { if(! color.isValid()) return; backColor = color; updImg(); @@ -227,26 +231,26 @@ QWidget* EText::attrWgt() { hBox = new HBox(vBox); hBox->setSpacing(3); - auto wTextAlignVT = new QPushButton(QIcon(":/res/program/TextAlignVT.png"), ""); - wTextAlignVT->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); - wTextAlignVT->setFixedSize(30, 30); - wTextAlignVT->setIconSize(QSize(30, 30)); - wTextAlignVT->setCheckable(true); - hBox->addWidget(wTextAlignVT); + auto edAlignVT = new QPushButton(QIcon(":/res/program/TextAlignVT.png"), ""); + edAlignVT->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignVT->setFixedSize(26, 26); + edAlignVT->setIconSize(QSize(26, 26)); + edAlignVT->setCheckable(true); + hBox->addWidget(edAlignVT); - auto wTextAlignVC = new QPushButton(QIcon(":/res/program/TextAlignVC.png"), ""); - wTextAlignVC->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); - wTextAlignVC->setFixedSize(30, 30); - wTextAlignVC->setIconSize(QSize(30, 30)); - wTextAlignVC->setCheckable(true); - hBox->addWidget(wTextAlignVC); + auto edAlignVC = new QPushButton(QIcon(":/res/program/TextAlignVC.png"), ""); + edAlignVC->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignVC->setFixedSize(26, 26); + edAlignVC->setIconSize(QSize(26, 26)); + edAlignVC->setCheckable(true); + hBox->addWidget(edAlignVC); - auto wTextAlignVB = new QPushButton(QIcon(":/res/program/TextAlignVB.png"), ""); - wTextAlignVB->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); - wTextAlignVB->setFixedSize(30, 30); - wTextAlignVB->setIconSize(QSize(30, 30)); - wTextAlignVB->setCheckable(true); - hBox->addWidget(wTextAlignVB); + auto edAlignVB = new QPushButton(QIcon(":/res/program/TextAlignVB.png"), ""); + edAlignVB->setStyleSheet("QPushButton{border: none; background: #bbb;} QPushButton:checked{background: #29c;}"); + edAlignVB->setFixedSize(26, 26); + edAlignVB->setIconSize(QSize(26, 26)); + edAlignVB->setCheckable(true); + hBox->addWidget(edAlignVB); hBox->addStretch(); @@ -255,11 +259,13 @@ QWidget* EText::attrWgt() { auto edLetterSpacing = new QSpinBox; edLetterSpacing->setMaximum(9999); - edLetterSpacing->setValue(100); + edLetterSpacing->setValue(letterSpacin); connect(edLetterSpacing, &QSpinBox::valueChanged, this, [=](int value) { - QTextCharFormat fmt; - fmt.setFontLetterSpacing(value); - MergeFmt(fdText, fmt); + letterSpacin = value; + updImg(); + // QTextCharFormat fmt; + // fmt.setFontLetterSpacing(value); + // MergeFmt(fdText, fmt); }); hBox->addWidget(edLetterSpacing); @@ -284,9 +290,9 @@ QWidget* EText::attrWgt() { auto fdAlignH = new QButtonGroup(wgtAttr); - fdAlignH->addButton(wTextAlignHL, Qt::AlignLeft); - fdAlignH->addButton(wTextAlignHC, Qt::AlignHCenter); - fdAlignH->addButton(wTextAlignHR, Qt::AlignRight); + fdAlignH->addButton(edAlignHL, Qt::AlignLeft); + fdAlignH->addButton(edAlignHC, Qt::AlignHCenter); + fdAlignH->addButton(edAlignHR, Qt::AlignRight); connect(fdAlignH, &QButtonGroup::idClicked, this, [=](int value) { QTextBlockFormat fmt; fmt.setAlignment((Qt::Alignment) value); @@ -296,18 +302,18 @@ QWidget* EText::attrWgt() { }); auto fdAlignV = new QButtonGroup(wgtAttr); - fdAlignV->addButton(wTextAlignVT, Qt::AlignTop); - fdAlignV->addButton(wTextAlignVC, Qt::AlignVCenter); - fdAlignV->addButton(wTextAlignVB, Qt::AlignBottom); - connect(fdAlignV, &QButtonGroup::idClicked, this, [this](int value) { + fdAlignV->addButton(edAlignVT, Qt::AlignTop); + fdAlignV->addButton(edAlignVC, Qt::AlignVCenter); + fdAlignV->addButton(edAlignVB, Qt::AlignBottom); + connect(fdAlignV, &QButtonGroup::idClicked, this, [=](int value) { align = (Qt::Alignment) value; updImg(); }); auto v_align = align & Qt::AlignVertical_Mask; - if(v_align==Qt::AlignTop) wTextAlignVT->setChecked(true); - if(v_align==Qt::AlignVCenter) wTextAlignVC->setChecked(true); - if(v_align==Qt::AlignBottom) wTextAlignVB->setChecked(true); + if(v_align==Qt::AlignTop) edAlignVT->setChecked(true); + if(v_align==Qt::AlignVCenter) edAlignVC->setChecked(true); + if(v_align==Qt::AlignBottom) edAlignVB->setChecked(true); fdText->setMinimumHeight(160); auto doc = fdText->document(); @@ -332,14 +338,14 @@ QWidget* EText::attrWgt() { auto ft = format.font(); auto families = ft.families(); if(! families.isEmpty()) { - fdFontFamily->blockSignals(true); - fdFontFamily->setCurrentFont(families[0]); - fdFontFamily->blockSignals(false); + edFontFamily->blockSignals(true); + edFontFamily->setCurrentFont(families[0]); + edFontFamily->blockSignals(false); lastFont = families[0]; } - fdFontSize->blockSignals(true); - fdFontSize->setValue(ft.pixelSize()); - fdFontSize->blockSignals(false); + edFontSize->blockSignals(true); + edFontSize->setValue(ft.pixelSize()); + edFontSize->blockSignals(false); auto foreground = format.foreground(); fdTextColor->blockSignals(true); fdTextColor->setColor(foreground.style()==Qt::NoBrush ? Qt::white : foreground.color()); @@ -365,20 +371,20 @@ QWidget* EText::attrWgt() { hBox->addStretch(); auto pageInfoWgt = new QWidget; - auto hhh = new QHBoxLayout(pageInfoWgt); + auto hhh = new HBox(pageInfoWgt); hhh->setContentsMargins(0,0,0,0); - hhh->addWidget(new QLabel(tr("PageCount:"))); + hhh->addLabel(tr("PageCount:")); auto fdPageCnt = new QLabel(QString::number(mImgs.size())); hhh->addWidget(fdPageCnt); hhh->addSpacing(20); - hhh->addWidget(new QLabel(tr("page"))); + hhh->addLabel(tr("page")); - auto fdPageIdx = new QSpinBox(); + auto fdPageIdx = new QSpinBox; fdPageIdx->setRange(1, mImgs.size()); - connect(fdPageIdx, &QSpinBox::valueChanged, this, [this](int idx) { + connect(fdPageIdx, &QSpinBox::valueChanged, this, [=](int idx) { curIdx = idx - 1; update(); }); @@ -414,9 +420,9 @@ QWidget* EText::attrWgt() { hBox->addWidget(btnImport); hBox = new HBox(vBox); - hBox->addWidget(new QLabel(tr("Play Properties"))); + hBox->addLabel(tr("Play Properties")); - line = new QFrame(); + line = new QFrame; line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); hBox->addWidget(line, 1); @@ -557,7 +563,7 @@ bool EText::save(const QString &pageDir) { for(int i=0; i mImgs; - int curIdx{0}; + int curIdx = 0; }; #endif // ETEXT_H diff --git a/LedOK/program/etimer.cpp b/LedOK/program/etimer.cpp index c5afe75..803dcb2 100644 --- a/LedOK/program/etimer.cpp +++ b/LedOK/program/etimer.cpp @@ -280,7 +280,7 @@ QWidget* ETimer::attrWgt() { return wgtAttr; } -JObj ETimer::attrJson() const { +JObj ETimer::attrJson() { JObj obj; addBaseAttr(obj); obj["elementType"] = "Timer"; diff --git a/LedOK/program/etimer.h b/LedOK/program/etimer.h index d6b332a..41bd5a1 100644 --- a/LedOK/program/etimer.h +++ b/LedOK/program/etimer.h @@ -17,7 +17,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; int type() const override { return EBase::Timer; } QWidget* attrWgt() override; - JObj attrJson() const override; + JObj attrJson() override; int secs = 0; diff --git a/LedOK/program/etimer2.cpp b/LedOK/program/etimer2.cpp index a4f8cc2..3849049 100644 --- a/LedOK/program/etimer2.cpp +++ b/LedOK/program/etimer2.cpp @@ -337,7 +337,7 @@ void repLineHeight(QString &html) { end: if(! pre.isEmpty()) html = pre + html.mid(last); } -JObj ETimer2::attrJson() const { +JObj ETimer2::attrJson() { JObj ele{{"elementType", "Timer2"}}; addBaseAttr(ele); ele["isUp"] = isUp; diff --git a/LedOK/program/etimer2.h b/LedOK/program/etimer2.h index a7652cb..00f8d59 100644 --- a/LedOK/program/etimer2.h +++ b/LedOK/program/etimer2.h @@ -15,7 +15,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; int type() const override { return EBase::TimerHtml; } QWidget* attrWgt() override; - JObj attrJson() const override; + JObj attrJson() override; QDateTime targetTime; QString html; diff --git a/LedOK/program/evideo.cpp b/LedOK/program/evideo.cpp index 0d32fe9..a09c8e5 100644 --- a/LedOK/program/evideo.cpp +++ b/LedOK/program/evideo.cpp @@ -50,6 +50,7 @@ EVideo *EVideo::create(const JObj &ele, PageListItem *pageItem, EBase *multiWin) auto ins = new EVideo(dir, name, widget["pathRaw"].toString(), widget["fileRaw"].toString(), img, pageItem, multiWin); ins->setBaseAttr(ele); if(ins->_duration < 4) ins->_duration = dur; + ins->vol = ele["vol"].toInt(100); ins->useSW = ele["useSW"].toBool(); ins->isPreSplit = ele["isPreSplit"].toBool(); auto play = ele["play"]; @@ -139,7 +140,7 @@ QWidget* EVideo::attrWgt() { // wAspectRatioMode->addItem(tr("KeepAspectRatio")); // wAspectRatioMode->addItem(tr("KeepAspectRatioByExpanding")); // wAspectRatioMode->setCurrentIndex(aspectRatioMode); -// connect(wAspectRatioMode, (void(QComboBox::*)(int))&QComboBox::currentIndexChanged, this, [this](int value) { +// connect(wAspectRatioMode, (void(QComboBox::*)(int))&QComboBox::currentIndexChanged, this, [=](int value) { // aspectRatioMode = value; // }); // hBox->addWidget(wAspectRatioMode); @@ -153,6 +154,21 @@ QWidget* EVideo::attrWgt() { line->setFrameShadow(QFrame::Sunken); hBox->addWidget(line, 1); + hBox = new HBox(vBox); + hBox->addSpacing(6); + hBox->addLabel("Vol"); + + auto edVol = new QSlider(Qt::Horizontal); + edVol->setRange(0, 100); + edVol->setValue(vol); + hBox->addWidget(edVol); + auto lbVol = hBox->addLabel(QString::number(vol)); + lbVol->setMinimumWidth(30); + connect(edVol, &QSlider::valueChanged, this, [=](int value) { + vol = value; + lbVol->setText(QString::number(vol)); + }); + hBox = new HBox(vBox); hBox->addSpacing(6); hBox->addLabel(tr("Play Times")); @@ -160,7 +176,7 @@ QWidget* EVideo::attrWgt() { auto edPlayTimes = new QSpinBox; edPlayTimes->setRange(1, 99999); edPlayTimes->setValue(playTimes); - connect(edPlayTimes, &QSpinBox::valueChanged, this, [this](int value) { + connect(edPlayTimes, &QSpinBox::valueChanged, this, [=](int value) { playTimes = value; }); hBox->addWidget(edPlayTimes); @@ -171,7 +187,7 @@ QWidget* EVideo::attrWgt() { auto edUseSW = new QCheckBox(tr("Use SW")); edUseSW->setChecked(useSW); - connect(edUseSW, &QCheckBox::stateChanged, this, [this](int value) { + connect(edUseSW, &QCheckBox::stateChanged, this, [=](int value) { useSW = value==Qt::Checked; }); hBox->addWidget(edUseSW); @@ -214,13 +230,14 @@ bool EVideo::save(const QString &pageDir) { return true; } -JObj EVideo::attrJson() const { +JObj EVideo::attrJson() { JObj obj{ {"elementType", "Video"}, {"path", mDir}, {"file", mName}, {"pathRaw", mRawDir}, {"fileRaw", mRawName}, + {"vol", vol}, {"useSW", useSW}, {"isPreSplit", isPreSplit}, {"playTimes", playTimes} @@ -294,7 +311,7 @@ QString EVideo::transcoding(QWidget *parent, QString rawFile, QString rawName, Q } else err.append(txt); } }); - process.start("ffmpeg", {"-y", "-i", rawFile, "-vcodec", "h264", "-s", QString::number(w)+"x"+QString::number(h), "-profile:v", "main", "-b:v", QString::number(w*h/150)+"k", outFile}); + process.start("ffmpeg", {"-y", "-i", rawFile, "-vcodec", "h264", "-s", QString::number((w>>1)<<1)+"x"+QString::number((h>>1)<<1), "-profile:v", "main", "-b:v", QString::number(w*h/150)+"k", outFile}); msgBox.exec(); if(err.right(32).contains("Conversion failed!")) { QMessageBox::critical(parent, translate("","Error"), err); diff --git a/LedOK/program/evideo.h b/LedOK/program/evideo.h index 2a7d664..7491ec6 100644 --- a/LedOK/program/evideo.h +++ b/LedOK/program/evideo.h @@ -28,7 +28,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; QWidget* attrWgt() override; bool save(const QString &pRoot) override; - JObj attrJson() const override; + JObj attrJson() override; QString mDir; QString mName; @@ -37,7 +37,7 @@ public: QImage mCoverImg; protected: int aspectRatioMode = Qt::IgnoreAspectRatio; - int playTimes = 1; + int vol = 100, playTimes = 1; bool useSW = false, isPreSplit = false; PageListItem *mPageItem; }; diff --git a/LedOK/program/eweb.cpp b/LedOK/program/eweb.cpp index a121621..7802ef5 100644 --- a/LedOK/program/eweb.cpp +++ b/LedOK/program/eweb.cpp @@ -148,7 +148,7 @@ QWidget* EWeb::attrWgt() { return wgtAttr; } -JObj EWeb::attrJson() const { +JObj EWeb::attrJson() { JObj obj; addBaseAttr(obj); obj["elementType"] = "Web"; diff --git a/LedOK/program/eweb.h b/LedOK/program/eweb.h index 46155da..51bff8f 100644 --- a/LedOK/program/eweb.h +++ b/LedOK/program/eweb.h @@ -18,7 +18,7 @@ public: void paint(QPainter*, const QStyleOptionGraphicsItem *, QWidget *) override; QWidget* attrWgt() override; bool save(const QString &) override {return true;}; - JObj attrJson() const override; + JObj attrJson() override; QString url; int zoom = 100, refresh = 0, _x = 0, _y = 0, scaleX = 100, scaleY = 100; diff --git a/LedOK/program/gentmpthread.cpp b/LedOK/program/gentmpthread.cpp index 811ff03..a28a7c2 100644 --- a/LedOK/program/gentmpthread.cpp +++ b/LedOK/program/gentmpthread.cpp @@ -249,6 +249,7 @@ JArray GenTmpThread::genSources(QString type, const JArray &eles) { source["id"] = id; source["md5"] = id; source["name"] = name; + source["vol"] = ele["vol"]; source["useSW"] = ele["useSW"]; source["isPreSplit"] = ele["isPreSplit"]; auto play = ele["play"]; @@ -265,6 +266,21 @@ JArray GenTmpThread::genSources(QString type, const JArray &eles) { source["isUp"] = ele["isUp"]; source["html"] = ele["html"]; source["backColor"] = ele["backColor"]; + } else if(type=="Table") { + auto name = ele["name"].toString(); + auto srcFile = srcPageDir + "/" + name+".png"; + QFileInfo srcInfo(srcFile); + if(! srcInfo.isFile()) continue; + auto geometry = ele["geometry"]; + auto direction = ele["direction"].toStr().toLower(); + auto speed = ele["speed"].toInt(); + auto isScroll = ! direction.isEmpty() && speed > 0; + QFile::copy(srcFile, dstDir+"/"+name); + source["_type"] = "Scroll"; + source["imgs"] = JArray{name}; + source["direct"] = direction; + source["speed"] = isScroll ? speed : 0; + source["timeSpan"] = ele["duration"]; } if(! source.empty()) { if(source["timeSpan"].isNull()) source["timeSpan"] = ele["duration"]; @@ -422,7 +438,7 @@ JObj GenTmpThread::genImage(const JValue &ele) { } else */ auto isScroll = ! direct.isEmpty() && speed > 0; QString md5; - if((isScroll && (img.width() != width || img.height() != height)) || (img.width() > width*2 && img.height() > height*2)) { + if((isScroll && (img.width() != width || img.height() != height)) || (img.width() > width*1.2 && img.height() > height*1.2)) { QBuffer buf; img.scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).save(&buf, "PNG"); QCryptographicHash cryptoHash(QCryptographicHash::Md5); diff --git a/LedOK/program/pagelistitem.cpp b/LedOK/program/pagelistitem.cpp index 92a8063..045cbb5 100644 --- a/LedOK/program/pagelistitem.cpp +++ b/LedOK/program/pagelistitem.cpp @@ -14,6 +14,7 @@ #include "program/etimer2.h" #include "program/evideo.h" #include "program/eweb.h" +#include "program/etable.h" #include #include #include @@ -42,7 +43,7 @@ PageListItem::PageListItem(const JObj &attr, const QString &pageDir) : mAttr(att auto type = ele["elementType"].toStr(); EBase *element = 0; if(type=="Text") element = new EText(ele.toObj()); - else if(type=="Image"||type=="Photo"||type=="Gif") element = EPhoto::create(ele.toObj(), this); + else if(type=="Image"||type=="Photo"||type=="Gif") element = EPhoto::create(ele.toObj(), mPageDir); else if(type=="Video"||type=="Movie") element = EVideo::create(ele.toObj(), this); else if(type=="DClock") element = new EDClock(ele.toObj()); else if(type=="AClock") element = new EAClock(ele.toObj()); @@ -50,6 +51,7 @@ PageListItem::PageListItem(const JObj &attr, const QString &pageDir) : mAttr(att else if(type=="Web") element = new EWeb(ele.toObj()); else if(type=="Timer") element = new ETimer(ele.toObj()); else if(type=="Timer2") element = new ETimer2(ele.toObj()); + else if(type=="Table") element = new ETable(ele.toObj(), mPageDir); else if(type=="Window") element = new EMultiWin(ele.toObj(), this); if(element) mScene->addItem(element); } diff --git a/LedOK/program/progeditorwin.cpp b/LedOK/program/progeditorwin.cpp index 6f9341d..47bebff 100644 --- a/LedOK/program/progeditorwin.cpp +++ b/LedOK/program/progeditorwin.cpp @@ -21,12 +21,16 @@ #include #include #include +#include #include #include #include #include #include +#include "xlsxdocument.h" +#include "xlsxworkbook.h" + ProgItem *gProgItem = 0; ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(parent), mProgItem(progItem) { @@ -48,7 +52,7 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare vBox->setContentsMargins(0, 0, 0, 0); vBox->setSpacing(0); - auto toolBar = new QToolBar(); + auto toolBar = new QToolBar; toolBar->setFloatable(false); toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); toolBar->setIconSize(QSize(46, 40)); @@ -193,13 +197,60 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare action = new QAction(QIcon(":/res/program/Timer.png"), tr("Timer")+" (HTML)"); action->setData(EBase::TimerHtml); menu->addAction(action); + action = new QAction(QIcon(":/res/program/Table.png"), tr("Table")); action->setData(EBase::Table); menu = new QMenu; action->setMenu(menu); toolBar->addAction(action); + connect(action, &QAction::triggered, this, [=] { + menu->popup(QWidget::mapToGlobal(action->associatedWidgets()[1]->geometry().bottomLeft()), action); + }); + action = new QAction(QIcon(":/res/program/Table.png"), tr("New")); + connect(action, &QAction::triggered, this, [=] { + auto scene = mPageEditor->graphicsView->scene(); + if(scene==0) return; + auto table = new ETable(8, 4); + table->setPos({0,0}); + table->setSize(mProgItem->mWidth, mProgItem->mHeight); + table->setZValue(mPageEditor->sortedEles().count()); + scene->addItem(table); + auto sels = scene->selectedItems(); + if(sels.count() == 1) sels.at(0)->setSelected(false); + table->setSelected(true); + table->grabImg(); + }); + menu->addAction(action); + action = new QAction(QIcon(":/res/program/Table.png"), tr("Import")); - action->setData(EBase::Table); + connect(action, &QAction::triggered, this, [=] { + auto file = QFileDialog::getOpenFileName(this, tr("Table"), gFileHome, "Tables (*.xlsx *.xls)"); + if(file.isEmpty()) return; + auto scene = mPageEditor->graphicsView->scene(); + if(scene==0) return; + + QXlsx::Document doc(file); + if(! doc.isLoadPackage()) { + QMessageBox::critical(this, "Table Error", "Failed to load Package\n"+file); + return; + } + auto sheet = doc.currentWorksheet(); + if(sheet == 0) { + QMessageBox::critical(this, "Table Error", "Failed to load Worksheet\n"+file); + return; + } + auto table = new ETable(0, 0); + table->read(sheet); + table->setPos({0,0}); + table->setSize(mProgItem->mWidth, mProgItem->mHeight); + table->setZValue(mPageEditor->sortedEles().count()); + scene->addItem(table); + auto sels = scene->selectedItems(); + if(sels.count() == 1) sels.at(0)->setSelected(false); + table->setSelected(true); + table->grabImg(); + gFileHome = QFileInfo(file).absolutePath(); + }); menu->addAction(action); #ifndef leyide @@ -248,35 +299,35 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare connect(action, &QAction::triggered, this, [this] { if(PlayWin::self) PlayWin::self->close(); else { - if(isProgChanged()) onSave(); - auto waitingDlg = new WaitingDlg(this, tr("Generate preview data")+" ..."); - auto gen = new GenTmpThread(mProgItem, mProgItem->mName, "", ""); - connect(gen, &GenTmpThread::onErr, this, [=](QString err) { - QMessageBox::warning(this, "GenTmpThread Error", err); - }); - connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::close); - gen->start(); - waitingDlg->exec(); - QFile file(mProgItem->mProgDir+"_tmp/program"); - if(! file.open(QIODevice::ReadOnly | QIODevice::Text)) return; - auto value = file.readAll(); - file.close(); - QString jsErr; - auto prog = JFrom(value, &jsErr); - if(! jsErr.isEmpty()) return; - int www = mProgItem->mWidth, hhh = mProgItem->mHeight; - if(mProgItem->maxLen) { - if(mProgItem->isVer) { - hhh = mProgItem->maxLen; - www *= mProgItem->partLens.size(); - } else { - www = mProgItem->maxLen; - hhh *= mProgItem->partLens.size(); - } - } - PlayWin::self = PlayWin::newIns(www, hhh, mProgItem->mProgDir+"_tmp", prog); - } - }); + if(isProgChanged()) onSave(); + auto waitingDlg = new WaitingDlg(this, tr("Generate preview data")+" ..."); + auto gen = new GenTmpThread(mProgItem, mProgItem->mName, "", ""); + connect(gen, &GenTmpThread::onErr, this, [=](QString err) { + QMessageBox::warning(this, "GenTmpThread Error", err); + }); + connect(gen, &QThread::finished, waitingDlg, &WaitingDlg::close); + gen->start(); + waitingDlg->exec(); + QFile file(mProgItem->mProgDir+"_tmp/program"); + if(! file.open(QIODevice::ReadOnly | QIODevice::Text)) return; + auto value = file.readAll(); + file.close(); + QString jsErr; + auto prog = JFrom(value, &jsErr); + if(! jsErr.isEmpty()) return; + int www = mProgItem->mWidth, hhh = mProgItem->mHeight; + if(mProgItem->maxLen) { + if(mProgItem->isVer) { + hhh = mProgItem->maxLen; + www *= mProgItem->partLens.size(); + } else { + www = mProgItem->maxLen; + hhh *= mProgItem->partLens.size(); + } + } + PlayWin::self = PlayWin::newIns(www, hhh, mProgItem->mProgDir+"_tmp", prog); + } + }); toolBar->addAction(action); action = new QAction(QIcon(":/res/program/Send.png"), tr("Publish")); connect(action, &QAction::triggered, this, [this]{ @@ -360,7 +411,6 @@ ProgEditorWin::ProgEditorWin(ProgItem *progItem, QWidget *parent) : QWidget(pare } else if(type==EBase::Timer) element = new ETimer; else if(type==EBase::TimerHtml) element = new ETimer2; else if(type==EBase::Window) element = new EMultiWin(mPageItem); - else if(type==EBase::Table) element = new ETable; if(element) { if(element->mWidth==0) { element->setPos(mNewEleX, mNewEleY); diff --git a/LedOK/res/program/Table.png b/LedOK/res/program/Table.png index 48b85c9..da053c0 100644 Binary files a/LedOK/res/program/Table.png and b/LedOK/res/program/Table.png differ diff --git a/LedOK/res/program/TextAlignHC.png b/LedOK/res/program/TextAlignHC.png index ac50ff3..9da3731 100644 Binary files a/LedOK/res/program/TextAlignHC.png and b/LedOK/res/program/TextAlignHC.png differ diff --git a/LedOK/res/program/TextAlignHL.png b/LedOK/res/program/TextAlignHL.png index 169b582..62b3295 100644 Binary files a/LedOK/res/program/TextAlignHL.png and b/LedOK/res/program/TextAlignHL.png differ diff --git a/LedOK/res/program/TextAlignHR.png b/LedOK/res/program/TextAlignHR.png index 2e66817..4c5b9b1 100644 Binary files a/LedOK/res/program/TextAlignHR.png and b/LedOK/res/program/TextAlignHR.png differ diff --git a/LedOK/res/program/TextAlignVB.png b/LedOK/res/program/TextAlignVB.png index 0de9f98..aeed2d7 100644 Binary files a/LedOK/res/program/TextAlignVB.png and b/LedOK/res/program/TextAlignVB.png differ diff --git a/LedOK/res/program/TextAlignVC.png b/LedOK/res/program/TextAlignVC.png index 8b95526..898c6b9 100644 Binary files a/LedOK/res/program/TextAlignVC.png and b/LedOK/res/program/TextAlignVC.png differ diff --git a/LedOK/res/program/TextAlignVT.png b/LedOK/res/program/TextAlignVT.png index fc0e4db..e92182a 100644 Binary files a/LedOK/res/program/TextAlignVT.png and b/LedOK/res/program/TextAlignVT.png differ diff --git a/LedOK/ts/app_en.ts b/LedOK/ts/app_en.ts index 06fd167..7893c7d 100644 --- a/LedOK/ts/app_en.ts +++ b/LedOK/ts/app_en.ts @@ -4,46 +4,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,111 +61,128 @@ - - - - - - - - + + + + + + + + + Error - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -170,23 +190,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -196,163 +216,170 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + Success - - - - - - - + + + + + + + + Setting - - - - - + + + + + + + Screen Size - - - - - - - - - - + + + + + + + + + + + Set - - + + Getting - - + + Get - - - + + + Unlock - - - - + + + + Uninstall - - - - + + + + Upload - - - - + + + + Install - - + + Wait for - - - - - - - - + + + + + + - - - + + Select File - - - - - - - - - + + + Please select a value + + + + + + + + + + + - - - - - - + + + + + + + Set - - + + @@ -361,64 +388,63 @@ - - + + + Get - - - - - - - - - + + + + + + - - + + + + - - - - + + + Readback - - + + - + Refresh - + Date - + Password - + Lock - + @@ -426,148 +452,176 @@ - - - + + + - + - - + + Clear + + + Old password + + + + + + + + New password + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -584,24 +638,25 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -611,21 +666,30 @@ - + + + + - - - + + + Tip + + + + Two passwords are not same + + @@ -645,42 +709,42 @@ - + Close - - - - - - - - - - - + + + + + + + + + + + Device replied - - - + + + Fail - + - - - - + + + + - + Basic Properties @@ -690,6 +754,176 @@ Getting + + + + + The password must have 8 characters at least and contain numbers, uppercase and lowercase letters + + + + + The Device's Hotspot password is too weak, please change the password. + + + + + Hotspot Name + + + + + Confirm password + + + + + Password changed successfully + + + + + BadPointDetectDialog + + + + Bad Point Detection + + + + + + + Port + + + + + + Detect + + + + + Upload Point Table + + + + + Check If Has + + + + + Coordinates + + + + + Size + + + + + Bad Point + + + + + Total + + + + + Point Table + + + + + Failed to Read File + + + + + Uploading + + + + + Check + + + + + Sensors + + + + + + Relay On + + + + + Relay Off + + + + + + Get + + + + + Get Sensor Data + + + + + Get Rece Card Info + + + + + Temperature + + + + + Humidity + + + + + Voltage + + + + + Light + + + + + Has Smoke + + + + + + + + + Power + + + + + Door Open + + CalendarButton @@ -701,16 +935,6 @@ ChangePasswordForm - - - Old password - - - - - New password - - Repeat again @@ -731,11 +955,6 @@ Please enter a password with more than 3 characters - - - The new password is not consistent in two times - - Password changed successfully @@ -745,775 +964,788 @@ CtrlAdvancedPanel - + Advanced - + Screen Width(pixel) - + Width - - + + Height - + Alias - + Web (Plat 2) Address - + Traffic screen settings - + Setting protocol ... - + Set protocol - + Getting protocol ... - + Get protocol - - + + Port - + Realtime (Plat 4) Address - - Firmware Management + + Firmware Manager - + update or uninstall - + Check Apk - + Uninstall - + Running check - + Restart - + Check Log - + Start LedSet4.0 Start LedSet4.0 (Apk Display2.0 and higher) - - Open ADB - Open ADB debugging function - - - - + - - + + + Clear Program - + Config - + Restore to default - + Taxi top screen configuration - - + + Service:High Out of service:Low - - + + Service:Low Out of service:High - + Bind Taxihub identity certificate - + Rotate - + Min brightness - + Max brightness - + Compant ID: Company ID - + Compant ID Company ID - - + + SetOnlineAddr Set Web server address - - + + ClearRealtimeServer Clear - - - - - - + + + + + + SetRealtimeServer Set realtimer address - - + + RestartAndroid Restart - - + + running - - + + no running - - + + Check Apk Version - - + + UninstallSoftware Uninstall - - + + Check apk running status - - - OpenAdb - Open ADB debugging function - - - - + + AliIotSetting - + Software Version Info - + Package - + Version - - + + Package name is null - + Clearing Program - - + + Timeout - - - - + + + + Failed - + Getting Log - + Setting Timing Reboot - + Set Timing Reboot - + Getting Timing Reboot - + Get Timing Reboot - + totalResolution FPGA total resoltuion - + strCurDisplayResolution Cur display resolution - - + + File not exist - + Getting Player State - - - + + + Get Player State - - + + Player State - - + + Cannot Open File - + Uploading - + Update - - + + Set Display Mode - - + + Get Display Mode - - - - - - - - + + + + + + + + Screen Offset - + Open file Failed - - + + No VehPlayer File - - + + Failed to Read File - + Setting Wallpaper - - + + Set Wallpaper - + System Updating - - + + System Update - + Upload error - + Identity Certificate - - - + + + Lock Card - - - - - - - + + + + + + + Binding certificate - + Upgrading - + Getting MCU Version - - + + MCU Version - + Setting player background - - + + Set player background - + Clearing player background - - - - - - - - + + + + + + + + Clear player background - - - GetScreenRotation - Get Screen Rotation + + + SetLauncherStartState + - - - - Charging Station - - - - - Setting Baud Rate - - - - - Set Baud Rate - - - - - Getting Baud Rate - - - - - Get Baud Rate - - - - - - Text is empty - - - - - - Json Parse Error - - - - - - Json isn't an Object - - - - - Info - - - - - Setting card work mode ... - - - - - Set card work mode - - - - - Getting card work mode ... - - - - - Get card work mode - - - - - Change Password - - - - - Get Receive Card Num - - - - - Player Debug - - - - - - Resolution Config - - - - - Full screen - - - - - Part - - - - - Display Mode - - - - - Screen Position - - - - - - Offset - - - - - - - - - Camera Distance - - - - - Hidden Settings - - - - - Click right button to hide - - - - - Get MCU Version - - - - - Baud Config - - - - - Model - - - - - Uart - - - - - Baud - - - - - Timing Reboot - - - - - Protocol - - - - - Server - - - - - Client - + + + GetLauncherStartState + + Set Bypass Mode + + + + + + Get Bypass Mode + + + + + + GetScreenRotation + Get Screen Rotation + + + + + + Charging Station + + + + + Setting Baud Rate + + + + + Set Baud Rate + + + + + Getting Baud Rate + + + + + Get Baud Rate + + + + + + Text is empty + + + + + + Json Parse Error + + + + + + Json isn't an Object + + + + + Info + + + + + Setting card work mode ... + + + + + Set card work mode + + + + + Getting card work mode ... + + + + + Get card work mode + + + + + Change Password + + + + + Get Receive Card Num + + + + + Player Debug + + + + + + Resolution Config + + + + + Full screen + + + + + Part + + + + + Display Mode + + + + + Screen Position + + + + + + Offset + + + + + + + + + Camera Distance + + + + + Hidden Settings + + + + + Click right button to hide + + + + + Get MCU Version + + + + + Baud Config + + + + + Model + + + + + Uart + + + + + Baud + + + + + 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 - - + + Restore to default relolution - - + + SetHighForBusy Set level for busy - - + + GetStateForBusy Get level of busy - - + + SetCardAlias Set alias - + InputWidthTip Please enter the correct width pixel value - + InputHeightTip Please enter the correct height pixel value - + Password is error @@ -1527,216 +1759,233 @@ Set brightness sensitivity - - + + GetBrightnessSensitivity Get brightness sensitivity - - + + SetMinBrightness Set min brightness value - - + + GetMinBrightness Get min brightness + - + SetMaxBrightness + Set maximum brightness value + + + + + GetMaxBrightness + Get maximum brightness + + + + NeedSelectSensorTypeTip Please select sensor type first - + Open file dialog - + Not found current worksheet - - + + SensorBrightnessTable Set sensor brightness table - + GetSensorBrightnessTable Get sensor bright table - + no sensorBrightnessTable no sensor brightnessTable in controller - + Save file - - + + GetCurrentSensorBrightness Get Current Brightness - - + + SetBrightness Set brightness - + GetBrightness Get brightness - + Brightness Screen Brightness - - + + BrightnessSchedule (*.bjs) - + Import File - + Save File Save file - + + Max Brightness + + + + BrightnessValue Brightness Value - + Start Time - + End Time - - + + SetAutoBrightnessTask Send brightness schedule table - + GetAutoBrightnessTask Get brightness schedule - + Brightness Config - + Auto - + Manual - + Schedule - + Adapt to Old Devices - + BrightTip1 If the maximum brightness is 64, the minimum brightness can be configured as 1% or appropriate value; if the maximum brightness is 255, the minimum brightness must be configured as 36% or above, otherwise the brightness will be low. - + BrightTip2 When uploading the file, please confirm to select the correct sensor type, otherwise it will be invalid! - + Sensitivity - - Minbrightness - Minimum Brightness + + Min Brightness + - + Upload File - - Cur Brigntness + + Ambient Brigntness - + Brightness value - + Default brightness - + Add - + Delete - + Import - + Export - + Apply - + Default brightness tip Tip: within the setting time is the setting brightness, and outside the setting time is the default brightness. For example, set the default brightness to 50%, set the brightness to 80%, and the time range to 8:00-17:00, then the brightness in the time range is 80%, and the default brightness in other times is 50% @@ -1744,150 +1993,150 @@ CtrlHdmiPanel - + HDMI Configuration Video source configuration - + Manual - + Schedule - - - - + + + + SyncSwitch Switch video source from HDMI-IN port + - AnSyncSwitch Switch video source from Async box - + IsSync Readback video source - + Import File - + Save File Save file - - + + Sync Schedule - - + + SetTimingHdmiInTask Set video source form HDMI-IN schedule task - + GetTimingHdmiInTask Get video source form HDMI-IN schedule task - - + + Async - + Auto Switch - + Start Time - + End Time - + SUN - + MON - + TUE - + WED - + THU - + FRI - + SAT - + Add - - + + Apply - + Delete - + Import - + Export - + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period By default, asynchronous content is played, and synchronous hdmi-in port input content is played in a fixed time period @@ -1895,500 +2144,500 @@ CtrlNetworkPanel - + Wire Enther(RJ45) Configuration - + Specify IP - + IP Address - + Gateway - + DNS Address - + WiFi Config - + Enable WiFi - + Cellular Config - + Enable Cellular Data - + Get cellular network status information - + Through the check status button Through the "check status" button, you can automatically match the country code MCC, and then select "operator" to get the corresponding APN information. - + Country ID(mcc): - - + + Carrier Name - + APN(Required) - + Flight Mode - - WiFi name + + WiFi Name - - - + + + Password - + Scan - - Enable AP + + Enable Hotspot - + OFF - + ON - - AP name + + Hotspot Name - + Subnet mask - - Input ap name - Input AP name + + Input Hotspot Name + - - + + SetEthernet Set wire nether - - - - + + + + Attention - + Please input IP address! - + Please input Mask address! - + Please input Gateway address! - + Please input DNS address! - - + + GetEthernet Get wire ethernet - + DHCP IP - + STATIC IP - - - - - + + + + + ConfigurationWiFi Configuration WiFi - - - Get AP or WiFi + + + Get Hotspot or WiFi - + GetWifiList Scan WiFi list - - - + + - + + Config Hotspot - + WifiName - + ApName Ap Name - - + + GetCurrentAPN Get Current Apn - + GetSIMStatus Get SIM Status - - + + SetAPN Set APN - + Status - + 未知 unknown - + 锁定状态,需要用户的PIN码解锁 Lock status, need user's pin code to unlock - + 锁定状态,需要用户的PUK码解锁 In the locked state, the PUK code of the user is required to be unlocked - + 锁定状态,需要网络的PIN码解锁 In the locked state, the PIN code of the user is required to be unlocked - + 就绪 be ready - + no checked sim card - + 国家码: MCC: - + 号码: number: - + 用户: User name: - + 信号: Signal: - + 信号正常 Signal OK - + 不在服务区 Not in service area - + 仅限紧急呼叫 Emergency call only - + 射频已经关闭 RF off - + 网络: Network type: - + 网络类型未知 unKnown - + GPRS网络 GPRS - + EDGE网络 EDGE - + UMTS网络 UMTS - + CDMA网络,IS95A 或 IS95B. CDM - + EVDO网络, revision 0. EVDO,revision 0. - + EVDO网络, revision A. EVDO,revision A. - + 1xRTT网络 1xRTT - + HSDPA网络 HSDPA - + HSUPA网络 HSUPA - + HSPA网络 HSPA - + 漫游: roam: - + Yes - + No - + 数据连接状态: Data connection status: - + 断开 OFF - + 正在连接 connecting - + 已连接 Connected - + 暂停 suspend - + 数据活动休眠状态: Data active sleep state: - + 活动,但无数据发送和接收 Active, but no data sent and received - + 活动,正在接收数据 Activity, receiving data - + 活动,正在发送数据 Activity, sending data - + 活动,正在接收和发送数据 Activity, receiving and sending data - + 休眠状态 Sleep state - + 信号强度: Signal strength: - + Set APN Info - + User - + Type - + Server - + Port - + Proxy - + MMS Port - + MMS Proxy - - + + SetSwitchSimData - - + + ContrFlightMode Set flight mode - - + + GetFlightModeState Readback flight mode state @@ -2583,12 +2832,6 @@ original password - - - - New password - - Repeat new password @@ -2665,151 +2908,162 @@ CtrlTestPanel - + Test Screen - + Line test - - - + + + Red - - - + + + Green - - - + + + Blue - - - + + + White - + Vertical - + Slash Oblique line - + Horizontal - - - Speed - - - - - ms(>10) - - - - - Line Distance + + Bad Point Detection - - - Test + + Speed + ms(>10) + + + + + Line Distance + + + + + + + Test + + + + Gradation test - + Only the gray value is displayed - + GrayValue Gray value - + Color test - + Gradient - + Reset Loop - - - + + + Anycast - + Stop - - - - - - + + + + + + StartTest Start test - - + + StopTest Stop test - + + + This screen is encrypted + + + + Loop Mode - + Reset loop mode @@ -2817,235 +3071,235 @@ CtrlVerifyClockPanel - + Verify Clock Configuration Verify clock configuration - - + + Verify to Computer time - + Cur time of controller - - + + LAN - + screenSwitch Switch Screen + - YES On + - NO Close - + volume Volume - + brightness brightnenss - - + + identificationCode Identification Code - - + + delaySync Time offset - - + + msec - - - - + + + + OtherSyncItem Other sync items - - - - + + + + lastSynchronousTime Last Synchronous Time - + checkNtpTime Synchronization interval - + Lora identity - + (min/time) - + identification code - + Time offset(msec) - + Brightness Screen Brightness - + Volume - + Screen on/off Screen On/Off - - + + Slave - + NTP Server - - + + NTP Server address - + TimeZone Time zone - + Language: - + Enable Synchronous playing - - + + Sync time interval - - + + Master - + Identification Code - - + + SetNtpServer - - + + MasterSwitch Set as master device - - + + SlaveSwitch Set as slave device - + IsMasterSlave Read back the identity of master and slave - - + + GetControllerDate Get date time - - + + SetingSyncMethod Set sync method - - + + SyncTime - - + + GetNtpServer - - + + GetingSyncMethod Geting Sync Method - - + + SetTimezone Set Timezone @@ -3201,13 +3455,13 @@ DevicePanel - + All ALL ALL - + Online Online @@ -3215,24 +3469,24 @@ - + Specify IP Specify IP - - - - + + + + Current Screen - - + + none @@ -3302,112 +3556,112 @@ - + Cancel - + Screen ID - + Alias - + Screenshot - - + + On ON - - + + Off OFF - + Brightness Adj. - + Power Control - + Net Config Network Config - + Time Sync - + Video source Video Source - + Password - + Advanced - + Volume Adj. Volume - + Test - - + + Multi screen operation - - + + selected num Selected number - + More Info - + Screen Brightness - + Power Status - + Security encryption @@ -3425,89 +3679,89 @@ EAClock - + Time Zone - + Custom Dial - + Select - + Select Dail file Select dial file - + Hour Mark Hour Scale - - + + Circular Circle - - + + Rectangle - + Number - + Min Mark Minute Scale - + Color - + Length - + Width - + Hour Hand - + Min Hand - + Sec Hand - + Show - + Text @@ -3515,270 +3769,270 @@ EBase - + Area Area(px) - + X - + Y - + W - + H - + Border - - - - + + + + None - - + + Effect - - + + Rotate - + Opacity - - + + Blink - + Speed - + Slow - + Moderate - + Fast - + Play Time - + Start - - - - + + + + s - + Duration - + Entry - - - - Random - - - - - - Expand horizontal - - - - - - Expand vertical - - - - - - Expand to left - - - - - - Expand to top - - - - - - Expand to right - - - - - - Expand to bottom - - - - - Zoom in - - - - - Zoom in from left-top - - - - - Zoom in from right-top - - - - - Zoom in from right-bottom - - - Zoom in from left-bottom + + Random - Rotate zoom + Expand horizontal - Rotate zoom reverse + Expand vertical - Fade in + + Expand to left - Move to left + Expand to top - Move to top + Expand to right - Move to right + Expand to bottom - - Move to bottom + Zoom in + + + + + Zoom in from left-top + + + + + Zoom in from right-top + + + + + Zoom in from right-bottom + + + + + Zoom in from left-bottom + + + + + + Rotate zoom + + + + + + Rotate zoom reverse + + + + + Fade in + Move to left + + + + + + Move to top + + + + + + Move to right + + + + + + Move to bottom + + + + + Dur - + Exit - + Zoom out - + Zoom out to left-top - + Zoom out to right-top - + Zoom out to right-bottom - + Zoom out to left-bottom - + Fade out - + Breathe - + Freq @@ -3822,83 +4076,83 @@ - + AM - + PM - + Time Zone - + Year - + Month - + Day - + Hour - + Min. - + Sec. - + Weekly Day of Week - + Full Year 4-Digit Year - + 12-Hour - + Date Style Date Format - + Time Style Time format - + Display Style Display style - + Multiline @@ -3991,117 +4245,102 @@ - + Title - + Compensation - + Left - + Center - + Right - + Single scroll - + Speed - + Back Color - - EGif - - - File - - - EMultiWin - + Please add media on the right Please add media on the right. You can add multiple different media. The LED display will play in the order of the list - + Media List - - - + + + Text - - - + + + Photo - - - + + + Video - - - - Gif - - - - - - + + + DClock Clock - - - + + + AClock Analog Clock - - + + Environment - - + + Timer @@ -4109,58 +4348,176 @@ EPhoto - + File - + Image Read Error - + Direction - + Scroll - + No - + Right -> Left From right to left - + Bottom -> Top From bottom to top - + Left -> Right From left to right - + Top -> Bottom Frome top to bottom - + Speed - - Images (*.png *.jpg *.jpeg *.bmp) + + Images + + + + + ETable + + + Table Editor + + + + + Bold + + + + + Italic + + + + + Underline + + + + + Text Color + + + + + Back Color + + + + + Grid Color + + + + + Col Width + + + + + Row Height + + + + + Insert Row + + + + + Insert Col + + + + + Delete Row + + + + + Delete Col + + + + + Merge + + + + + Unmerge + + + + + Clear Data + + + + + Direction + + + + + Static + + + + + Bottom -> Top + From bottom to top + + + + Right -> Left + From right to left + + + + Top -> Bottom + Frome top to bottom + + + + Left -> Right + From left to right + + + + Speed @@ -4172,112 +4529,127 @@ - + + Bold + + + + + Italic + + + + + Underline + + + + Back Color - + Kerning - + Line Height - + PageCount: - + page Page - + Import txt File - + Fail - + Cannot Open File - + Play Properties - + Flip - + Scroll - + Static - + New Format - + Text Color - + Colorful Text - + Tail Spacing - + Direction - + Right -> Left From right to left - + Bottom -> Top From bottom to top - + Left -> Right From left to right - + Top -> Bottom Frome top to bottom - + Speed @@ -4425,33 +4797,43 @@ EVideo - + File - + Play Properties - + Play Times - + Use SW - + + Pre Split + + + + + No Effect + + + + Video Transcoding - - + + Video Transcoding Progress @@ -4515,67 +4897,67 @@ GenTmpThread - + MON - + TUE - + WED - + THU - + FRI - + SAT - + SUN - + AM - + PM - + day Days - + hour Hours - + min Mins - + sec Secs @@ -4583,7 +4965,7 @@ ImgDlg - + Screenshot @@ -4620,171 +5002,176 @@ MainWindow - + Language - + Help - - + + Check for updates - - - firmware manager - Firmware management + + + Firmware Manager + - - - + + + Preferences - - - + + + 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 (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.) - + Ultra-Long Screen Split - + Program Send Batch - + Hide Detect Button - + Show IP in Terminal Control - + Show Alias in Terminal Control - + Show Lora Screen - + Download - + Fail - + Cannot Save File - - - + + + Downloading updates - + + Config Hotspot + + + + Device Terminals - + Program Solutions - + Control Terminal Control - + Lora Screen - + Check card Detect - + 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! @@ -4890,7 +5277,7 @@ - + Clear all medias? @@ -5021,12 +5408,12 @@ PlayWin - + Move to Top Left - + Set Position @@ -5034,12 +5421,12 @@ PlayerBackSendThread - + Open file failed - + Read file failed @@ -5060,57 +5447,57 @@ ProgCreateDlg - + Resolution - + Solution Info - + Solution Name Solution Name - + Width - + Height - + Remarks - + Is Insert - + Ultra-Long Screen Split - + Horizontal - + Vertical - + Lengths of Parts @@ -5118,33 +5505,28 @@ ProgEditorWin - + Save - + Setting - + Text - + Photo - - - Video - - - Gif + Video @@ -5168,123 +5550,139 @@ Web page - + General 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 - + + + Table + + + + + New + + + + + Import + + + + Play - + Stop - + Publish - + program Program - + Add page - + Copy page - + Delete page - + Are you sure you want to delete this program page? - + Move up - + Move down - + Widget Properties - + Program Properties - + Do you want to save the modifications? - + Failed to Create Forder - + Saving... - + Convertering - + Demos - + Open Demo - + Generate preview data - + Failed to Rename Forder - + Failed to Remove Recursively diff --git a/LedOK/ts/app_ja.ts b/LedOK/ts/app_ja.ts index c1fb93e..684053c 100644 --- a/LedOK/ts/app_ja.ts +++ b/LedOK/ts/app_ja.ts @@ -4,46 +4,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,111 +61,128 @@ - - - - - - - - + + + + + + + + + Error エラー - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Info + 情報 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -170,23 +190,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -196,163 +216,170 @@ 先に大きいスクリーンを選んでください - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + Success 成功 - - - - - - - + + + + + + + + Setting セット - - - - - + + + + + + + Screen Size スクリーンサイズ - - - - - - - - - - + + + + + + + + + + + Set セット - - + + Getting 取得 - - + + Get 取得 - - - + + + Unlock ロックを解除する - - - - + + + + Uninstall アンマウント - - - - + + + + Upload アップロード - - - - + + + + Install インストール - - + + Wait for 待機中 - - - - - - - - + + + + + + - - - + + Select File ファイルを選択 - - - - - - - - - + + + Please select a value + + + + + + + + + + + - - - - - - + + + + + + + Set セット - - + + @@ -361,64 +388,63 @@ パスワードを入力 - - + + + Get 得る - - - - - - - - - + + + + + + - - + + + + - - - - + + + Readback 読み戻し - - + + - + Refresh 更新 - + Date 日付 - + Password パスワード - + Lock ロック - + @@ -426,148 +452,176 @@ 送信 - - - + + + - + - - + + Clear クリア + + + Old password + 古いパスワード + + + + + + + New password + 新しいパスワード + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -584,24 +638,25 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -611,21 +666,30 @@ - + + + + - - - + + + Tip 提示 + + + + Two passwords are not same + 新しいパスワードは2回で一貫していません + @@ -645,42 +709,42 @@ - + Close 閉じる - - - - - - - - - - - + + + + + + + + + + + Device replied デバイス応答 - - - + + + Fail 失敗 - + - - - - + + + + - + Basic Properties 基本的な属性 @@ -690,6 +754,180 @@ Getting 取得中 + + + + + The password must have 8 characters at least and contain numbers, uppercase and lowercase letters + + + + + The Device's Hotspot password is too weak, please change the password. + + + + + Hotspot Name + AP名 + + + + Confirm password + + + + + Password changed successfully + パスワードが正常に変更 + + + + BadPointDetectDialog + + + + Bad Point Detection + + + + + + + Port + ポート + + + + + Detect + + + + + Upload Point Table + + + + + Check If Has + + + + + Coordinates + + + + + Size + サイズ + + + + Bad Point + + + + + Total + + + + + Point Table + + + + + Failed to Read File + + + + + Uploading + アップロード中 + + + + Check + + + + + Sensors + + + + + + Relay On + + + + + Relay Off + + + + + + Get + 得る + + + + Get Sensor Data + + + + + Get Rece Card Info + + + + + Temperature + 温度 + + + + Humidity + 湿度 + + + + Voltage + + + + + Light + + + + + Has Smoke + + + + + + + + + Power + 電源 + + + + Door Open + + + + The encrypted control card can be upgraded directly + 暗号化されたコントロールカードを直接アップグレードすることができます + CalendarButton @@ -702,14 +940,12 @@ ChangePasswordForm - Old password - 古いパスワード + 古いパスワード - New password - 新しいパスワード + 新しいパスワード @@ -732,9 +968,8 @@ 3 文字以上のパスワードを入力してください - - The new password is not consistent in two times - 新しいパスワードは2回で一貫していません + Two passwords are not same + 新しいパスワードは2回で一貫していません @@ -745,775 +980,792 @@ CtrlAdvancedPanel - + Advanced 上級パラメータ - + Screen Width(pixel) 画面幅(ピクセル) - + Width - - + + Height 高さ - + Alias 別名 - + Web (Plat 2) Address Web (Plat 2) のアドレス - + Traffic screen settings - + Setting protocol ... - + Set protocol - + Getting protocol ... - + Get protocol - - + + Port ポート - - Firmware Management + + Firmware Manager ファームウェア管理 - + update or uninstall 更新またはアンインストール - + Check Apk APKを検出 - + Uninstall アンマウント - + Running check 運転状態モニタ - + Restart 再起動 - + Check Log ログを見る - + Start LedSet4.0 - - Open ADB - ADBデバッグ機能を開く - - - - + - - + + + Clear Program 番組をクリア - + Config の設定 - + Restore to default 標準の値を復元 - + Taxi top screen configuration タクシートップ画面の設定 - - + + Service:High Out of service:Low 客がいます:高 客がいません:低 - - + + Service:Low Out of service:High 客がいます:低 客がいません:高 - + Bind Taxihub identity certificate テーピング Taxihub ユーザーID証明書 - + Rotate 回転 - + Realtime (Plat 4) Address Realtime (Plat 4) のアドレス - + Min brightness 最低輝度 - + Max brightness 最高輝度 - + Compant ID: 会社ID: - + Compant ID 会社ID - - + + SetOnlineAddr ウェブサーバのアドレスを設定 - - + + ClearRealtimeServer クリア - - - - - - + + + + + + SetRealtimeServer RealTimerアドレスを設定 - - + + RestartAndroid 再起動 - - + + running 実行中 - - + + no running 実行されていません - - + + Check Apk Version チェック APK バージョン - - + + UninstallSoftware アンマウント - - + + Check apk running status APK運転状態監視 - - OpenAdb - ADBデバッグ機能を開く + ADBデバッグ機能を開く - + Identity Certificate 身分証明書 - - - - - - - + + + + + + + Binding certificate 証明書をバインド - - + + AliIotSetting - + Software Version Info - + Package - + Version バージョン - - + + Package name is null パッケージ名は空です - + Clearing Program プログラムクリア - - + + Timeout タイムアウト - - - - + + + + Failed 失敗 - + Getting Log ログを取得中 - + Setting Timing Reboot スケジュール再起動を設定中 - + Set Timing Reboot スケジュール再起動の設定 - + Getting Timing Reboot スケジュール再起動を取得中 - + Get Timing Reboot スケジュール再起動の取得 - + totalResolution トータル解像度 - + strCurDisplayResolution 表示解像度 - - + + File not exist ファイルが存在しません - + Getting Player State プレーヤーの状態を取得しています - - - + + + Get Player State プレーヤーの状態の取得 - - + + Player State プレーヤーの状態 - - + + Cannot Open File ファイルのオープンに失敗しました - + Uploading アップロード中 - + Update 更新 - - + + Set Display Mode - - + + Get Display Mode - - - - - - - - + + + + + + + + Screen Offset - - - + + + Lock Card - + Open file Failed ファイルのオープンに失敗しました - - + + No VehPlayer File - - + + Failed to Read File - + Setting Wallpaper - - + + Set Wallpaper - + System Updating - - + + System Update - + Upload error アップロード エラー - + Upgrading アップグレード中 - + Getting MCU Version - - + + MCU Version - + Setting player background - - + + Set player background - + Clearing player background - - - - - - - - + + + + + + + + Clear player background - - - GetScreenRotation - 画面回転の取得 - - - - - - Charging Station - じゅうでんぐい - - - - Setting Baud Rate + + + SetLauncherStartState - - Set Baud Rate + + + GetLauncherStartState - - - Getting Baud Rate - - - - - Get Baud Rate - - - - - - Text is empty - - - - - - Json Parse Error - - - - - - Json isn't an Object - - - - - Info - 情報 - - - - Setting card work mode ... - - - - - Set card work mode - - - - - Getting card work mode ... - - - - - Get card work mode - - - - - Change Password - パスワード変更 - - - - Get Receive Card Num - 受信カード数の取得 - - - - Player Debug - - - - - - Resolution Config - 解像度設定 - - - - Full screen - フルスクリーン - - - - Part - セクション - - - - Display Mode - 表示モード - - - - Screen Position - - - - - - Offset - - - - - - - - - Camera Distance - - - - - Hidden Settings - - - - - Click right button to hide - - - - - Get MCU Version - - - - - Baud Config - - - - - Model - - - - - Uart - - - - - Baud - - - - - Timing Reboot - スケジュール再起動 - - - - Protocol - プロトコル - - - - Server - サービス - - - - Client - クライアント - + Set Bypass Mode + + + + + + Get Bypass Mode + + + + + + GetScreenRotation + 画面回転の取得 + + + + + + Charging Station + じゅうでんぐい + + + + Setting Baud Rate + + + + + Set Baud Rate + + + + + Getting Baud Rate + + + + + Get Baud Rate + + + + + + Text is empty + + + + + + Json Parse Error + + + + + + Json isn't an Object + + + + + Info + 情報 + + + + Setting card work mode ... + + + + + Set card work mode + + + + + Getting card work mode ... + + + + + Get card work mode + + + + + Change Password + パスワード変更 + + + + Get Receive Card Num + 受信カード数の取得 + + + + Player Debug + + + + + + Resolution Config + 解像度設定 + + + + Full screen + フルスクリーン + + + + Part + セクション + + + + Display Mode + 表示モード + + + + Screen Position + + + + + + Offset + + + + + + + + + Camera Distance + + + + + Hidden Settings + + + + + Click right button to hide + + + + + Get MCU Version + + + + + Baud Config + + + + + Model + + + + + Uart + + + + + Baud + + + + + Timing Reboot + スケジュール再起動 + + + + Protocol + プロトコル + + + + Server + サービス + + + + Client + クライアント + + + + SetScreenRotation 画面の回転を設定する - - + + SetMinBrightness 最小輝度値を設定します - - + + SetMaxBrightness 輝度最大値を設定 - - + + GetMinBrightness 輝度最小値を取得 - - + + GetMaxBrightness 輝度最大値を取得 - - + + Card work mode - - + + SetSpecialResolution 解像度を設定 - - + + GetSpecialResolution 読み込み解像度 - - + + Restore to default relolution デフォルトの解像度を復元 - - + + SetHighForBusy 客レベルの設定 - - + + GetStateForBusy ゲストレベルを取得 - - + + SetCardAlias エイリアスの設定 - + InputWidthTip 正しい幅のピクセル値を入力してください - + InputHeightTip 正しい高さのピクセル値を入力してください - + Password is error パスワード @@ -1527,216 +1779,233 @@ 輝度センサ感度を設定する - - + + GetBrightnessSensitivity 明るさ感を得る - - + + SetMinBrightness 最小輝度値を設定します - - + + GetMinBrightness 輝度最小値を取得 - - + + NeedSelectSensorTypeTip センサータイプを選択してください - + Open file dialog - + Not found current worksheet - - + + SensorBrightnessTable 輝度センサ設定テーブルの設定 - + GetSensorBrightnessTable センサーブライトテーブル - + no sensorBrightnessTable コントロールカードに輝度設定表が見つかりませんでした - + Save file 保存 - - + + GetCurrentSensorBrightness 現在の明るさを取得する - - + + SetBrightness 輝度を設定する - + GetBrightness 輝度値を取得 - + Brightness スクリーン輝度 - + Import File インポートファイル - - + + BrightnessSchedule (*.bjs) - + Save File 保存 - + BrightnessValue 輝度値 - + Start Time 開始時間 - + End Time 終了時間 - - + + SetAutoBrightnessTask 送信タイミング輝度表 - + + + SetMaxBrightness + 輝度最大値を設定 + + + + + GetMaxBrightness + 輝度最大値を取得 + + + GetAutoBrightnessTask 取得タイミング輝度表 - + Brightness Config 輝度の設定 - + Auto 自動 - + Manual 手動 - + Schedule スケジュール - + Adapt to Old Devices 古い設備に適合する - + BrightTip1 最大輝度が64であるならば、最小の明るさは1%または適切な値として構成されることができます;最大の明るさが255であるならば、最小の明るさは36%かそれ以上として構成されなければなりません、さもなければ、明るさは低くなります。 - + BrightTip2 ファイルをアップロードする時、正しいセンサータイプを選択してください。でないと、無効です。 - + Sensitivity 感度 - - Minbrightness + + Min Brightness 最小輝度 - + + Max Brightness + 最大輝度 + + + Upload File ファイルのアップロード - - Cur Brigntness - カールの明るさ + + Ambient Brigntness + 環境明るさ - + Brightness value 輝度値 - + Default brightness 標準の明るさ - + Add 追加 - + Delete 削除 - + Import インポート - + Export 出力 - + Apply 適用 - + Default brightness tip ヒント:この設定時間内は明るさを設定し、設定時間外はデフォルトの明るさとなります。例えば、デフォルトの輝度を50%とし、設定輝度は80%とし、時間範囲は8:00〜17:00とすると、時間範囲は80%となり、他の時間はデフォルトの輝度50%となる。 @@ -1744,150 +2013,150 @@ CtrlHdmiPanel - + HDMI Configuration ビデオソースの設定 - + Manual 手動 - + Schedule スケジュール - - - - + + + + SyncSwitch スイッチのビデオソースをHDMI-IN + - AnSyncSwitch 異ステップモードを切り替え - + IsSync 同じ非同期モードを読み返す - + Import File インポートファイル - + Save File 保存 - - + + Sync Schedule 同期モードタイミングタスク - - + + SetTimingHdmiInTask 同期モードタイミングタスクの設定 - + GetTimingHdmiInTask 同期モードタイミングタスクの取得 - - + + Async アシュリン - + Auto Switch - + Start Time 開始時間 - + End Time 終了時間 - + SUN 日曜日 - + MON 月曜日 - + TUE 火曜日 - + WED 水曜日 - + THU 木曜日 - + FRI 金曜日 - + SAT 土曜日 - + Add 追加 - - + + Apply 適用 - + Delete 削除 - + Import インポート - + Export 出力 - + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period 非同期のコンテンツをデフォルトで再生し、同期のHMI-INポートに入力します @@ -1895,500 +2164,500 @@ CtrlNetworkPanel - + Wire Enther(RJ45) Configuration 有線ネットワークの設定 - + Specify IP 指定IP - + IP Address IPアドレス - + Gateway ゲートウェイ - + DNS Address DNSアドレス - + WiFi Config WiFiの設定 - + Enable WiFi WiFi機能 - + Cellular Config セルラーデータ構成 - + Enable Cellular Data セルラーデータを有効にする - + Get cellular network status information セルラーネットワーク状態情報を取得する - + Through the check status button 「ステータスを取得」ボタンを使用すると、国コードに自動的に一致し、対応するAPN情報を取得するには「事業者」を選択します。 - + Set APN Info APN情報を設定する - + Country ID(mcc): 国号(mcc): - - + + Carrier Name 運営者 - + APN(Required) APN(必ず記入) - + Flight Mode 飛行モード - - WiFi name + + WiFi Name WiFiの名前 - - - + + + Password パスワード - + Scan スキャン - - Enable AP - APエネルギー + + Enable Hotspot + Hotspot エネルギー - + OFF オフ - + ON オン - - AP name + + Hotspot Name AP名 - + Subnet mask サブネットマスク - - Input ap name + + Input Hotspot Name APの名前を入力 - - + + SetEthernet 有線網を設置する - - - - + + + + Attention 注意 - + Please input IP address! IPアドレスを入力してください! - + Please input Mask address! サブネットマスクの住所を入力してください! - + Please input Gateway address! ゲートウェイのアドレスを入力してください! - + Please input DNS address! DNSアドレスを入力してください! - - + + GetEthernet 有線ネットワークの設定を取得 - + DHCP IP DHCP IP - + STATIC IP 静的IP - - - - - + + + + + ConfigurationWiFi WiFiの設定 - - - Get AP or WiFi + + + Get Hotspot or WiFi ホットスポットとWiFiモードの取得 - + GetWifiList スキャンWiFi - - - + + - + + Config Hotspot ホットスポットの設定 - + WifiName Wifiの名前 - + ApName AP名前 - - + + GetCurrentAPN APN情報の取得 - + GetSIMStatus SIM状態を取得 - - + + SetAPN APNの設定 - + Status 状態 - + 未知 不明 - + 锁定状态,需要用户的PIN码解锁 ロック状態は、ユーザのPINコードのロック解除が必要です - + 锁定状态,需要用户的PUK码解锁 ロック状態は、ユーザのPUKコードのアンロックが必要です - + 锁定状态,需要网络的PIN码解锁 ロック状態は、ユーザのPINコードのアンロックが必要です - + 就绪 準備完了 - + no checked sim card simカードが検出されませんでした - + 国家码: 国号: - + 号码: 番号: - + 用户: ユーザ: - + 信号: 信号: - + 信号正常 信号が正常である - + 不在服务区 サービスエリアにはいません - + 仅限紧急呼叫 緊急呼び出しのみ - + 射频已经关闭 無線周波数はすでに閉鎖されました - + 网络: ネットワークタイプ: - + 网络类型未知 不明 - + GPRS网络 GPRS - + EDGE网络 EDGE - + UMTS网络 UMTS - + CDMA网络,IS95A 或 IS95B. CDM - + EVDO网络, revision 0. EVDO,revision 0. - + EVDO网络, revision A. EVDO,revision A. - + 1xRTT网络 1xRTT - + HSDPA网络 HSDPA - + HSUPA网络 HSUPA - + HSPA网络 HSPA - + 漫游: ローミング: - + Yes - + No いいえ - + 数据连接状态: データ接続状態: - + 断开 切断 - + 正在连接 接続中 - + 已连接 接続済み - + 暂停 一時停止 - + 数据活动休眠状态: データアクティビティの休止状態: - + 活动,但无数据发送和接收 アクティブですが、データ送信と受信はありません - + 活动,正在接收数据 アクティブ、データ受信中 - + 活动,正在发送数据 イベント、データ送信中 - + 活动,正在接收和发送数据 イベント、データ受信と送信中 - + 休眠状态 スリープ状態 - + 信号强度: 信号の強度: - + User ユーザー - + Type タイプ - + Server サービス - + Port ポート - + Proxy プロキシ - + MMS Port MMS ポート - + MMS Proxy MMS プロキシ - - + + SetSwitchSimData 4G/5Gスイッチの設定 - - + + ContrFlightMode 飛行モードの設定 - - + + GetFlightModeState 飛行モード状態を取得 @@ -2584,10 +2853,8 @@ 元のパスワード - - New password - 新しいパスワード + 新しいパスワード @@ -2665,151 +2932,162 @@ CtrlTestPanel - + Test Screen テスト画面 - + Line test 線テスト - - - + + + Red - - - + + + Green - - - + + + Blue - - - + + + White - + Vertical 縦線 - + Slash 斜線 - + Horizontal 水平線 - - + + Bad Point Detection + + + + + Speed スピード - + ms(>10) ミリ秒(>10) - + Line Distance 線の間隔 - - - + + + Test テスト - + Gradation test グレースケールテスト - + Only the gray value is displayed 色の値のみを表示 - + GrayValue グレースケール値 - + Color test カラーテスト - + Gradient グラデーション - + Reset ループ - - - + + + Anycast リクエスト - + Stop 停止 - - - - - - + + + + + + StartTest テストを開始します - - + + StopTest テストを中止します - + + + This screen is encrypted + スクリーンは暗号化されています + + + Loop Mode サイクルモード - + Reset loop mode ループを設定 @@ -2817,235 +3095,235 @@ CtrlVerifyClockPanel - + Verify Clock Configuration 検証クロック設定 - - + + Verify to Computer time コンピュータ時刻の確認 - + Cur time of controller ディスプレイの現在の時間 - - + + LAN LAN - + screenSwitch スクリーンの切り替え + - YES 開く + - NO オフ - + volume 音量 - + brightness 明るさ - - + + identificationCode 識別コード - - + + delaySync 時間オフセット - - + + msec ミリ秒 - - - - + + + + OtherSyncItem その他の同期項目 - - - - + + + + lastSynchronousTime 最終同期時間 - + checkNtpTime 同期間隔 - + Lora identity ロラの身分 - + (min/time) (分/回) - + identification code 識別コード - + Time offset(msec) タイム・オフセット( msec ) - + Brightness スクリーン輝度 - + Volume 体積 - + Screen on/off スクリーンスイッチ - - + + Slave から - + NTP Server NTPサーバ - - + + NTP Server address NTPサーバのアドレス - + TimeZone タイムゾーン - + Language: 言語: - + Enable Synchronous playing 画面を同期させる機能 - - + + Sync time interval 同期時間間隔 - - + + Master - + Identification Code 識別コード - - + + SetNtpServer NTPサービスの設定 - - + + MasterSwitch メインデバイスの設定 - - + + SlaveSwitch スレーブデバイスとして設定 - + IsMasterSlave 主従の身分を読み返す - - + + GetControllerDate 日付時間の取得 - - + + SetingSyncMethod set syncメソッド - - + + SyncTime キャリブレーション時間 - - + + GetNtpServer NTPサービス情報を取得する - - + + GetingSyncMethod 同期方式を取得 - - + + SetTimezone タイムゾーンを設定 @@ -3201,37 +3479,37 @@ DevicePanel - + All トータル トータル - + Online オンライン中 - + Specify IP 指定IP 指定IP - - - - + + + + Current Screen 現在のスクリーン - - + + none なし @@ -3301,112 +3579,112 @@ IPアドレスを入力してください! - + Cancel キャンセル - + Screen ID ターミナルID - + Alias 別名 - + Screenshot スクリーンショット - - + + On オン - - + + Off オフ - + Brightness Adj. 輝度設定 - + Power Control 電源コントロール - + Net Config ネット配置 - + Time Sync タイマ配置 - + Video source ビデオソース - + Password ひそかに言う - + Advanced 上級パラメータ - + Volume Adj. 音量調節 - + Test テスト - - + + Multi screen operation マルチスクリーン操作 - - + + selected num 選択された数 - + More Info 詳細 - + Screen Brightness 画面の明るさ - + Power Status 画面切り替えステータス - + Security 暗号化 @@ -3428,89 +3706,89 @@ EAClock - + Time Zone タイムゾーン - + Custom Dial ユーザー定義の文字盤 - + Select 選択 - + Select Dail file 文字盤の画像を選択 - + Hour Mark 時間目盛り - - + + Circular 円形 - - + + Rectangle 矩形 - + Number デジタル - + Min Mark 分目盛り - + Color カラー - + Length 長さ - + Width - + Hour Hand 時針 - + Min Hand 分針 - + Sec Hand 秒針 - + Show 表示 - + Text テキスト @@ -3518,270 +3796,270 @@ EBase - + Area 領域(px) - + X X - + Y Y - + W W - + H H - + Border ボーダー - - - - + + + + None なし - - + + Effect 特効 - - + + Rotate 回転 - + Opacity - - + + Blink きらめき - + Speed スピード - + Slow 遅い - + Moderate - + Fast 速い - + Play Time 再生時間 - + Start スタート - - - - + + + + s - + Duration 期間 - + Entry 入場する - - + + Random ランダム - - + + Expand horizontal 水平展開 - - + + Expand vertical 垂直展開 - - + + Expand to left 左に展開 - - + + Expand to top 上へ展開 - - + + Expand to right 右に展開 - - + + Expand to bottom 下へ展開 - + Zoom in 拡大 - + Zoom in from left-top 左上から拡大 - + Zoom in from right-top 右上から拡大 - + Zoom in from right-bottom 右下から拡大 - + Zoom in from left-bottom 左下から拡大 - - + + Rotate zoom 回転拡大 - - + + Rotate zoom reverse 逆回転拡大 - + Fade in フェードイン - - + + Move to left 左に移動 - - + + Move to top 上へ移動 - - + + Move to right 右に移動 - - + + Move to bottom 下へ移動 - - + + Dur 時間 - + Exit 出場する - + Zoom out 縮小 - + Zoom out to left-top 左上に縮小 - + Zoom out to right-top 右上に縮小 - + Zoom out to right-bottom 右下に縮小 - + Zoom out to left-bottom 左下に縮小 - + Fade out フェードアウト - + Breathe - + Freq @@ -3825,83 +4103,83 @@ - + AM 午前 - + PM 午後 - + Time Zone タイムゾーン - + Year - + Month - + Day - + Hour - + Min. - + Sec. - + Weekly 曜日 - + Full Year 四桁数の年 - + 12-Hour 12時 - + Date Style 日付スタイル - + Time Style タイムスタイル - + Display Style 表示スタイル - + Multiline 複数行表示 @@ -3994,42 +4272,42 @@ - + Title タイトル - + Compensation 補償 - + Left 左に寄る - + Center 中央にある - + Right 右に寄る - + Single scroll 1行スクロール - + Speed スピード - + Back Color 背景色 @@ -4037,74 +4315,70 @@ EGif - File - ファイル + ファイル EMultiWin - + Please add media on the right 右側にメディアを追加してください。複数のメディアに参加できます。LEDディスプレイはリスト順に再生されます - + Media List メディアリスト - - - + + + Text テキスト - - - + + + Photo 写真 - - - + + + Video 動画リスト - - - Gif - アニメーション + アニメーション - - - + + + DClock デジタル時計 - - - + + + AClock アナログ時計 - - + + Environment 環境モニタリング - - + + Timer タイマー @@ -4112,59 +4386,177 @@ EPhoto - + File ファイル - + Image Read Error 画像読み込みエラー - + Direction 方向 - + Scroll スクロール - + No いいえ - + Right -> Left 左へ - + Bottom -> Top 上へ - + Left -> Right 右へ - + Top -> Bottom 下へ - + Speed スピード - - Images (*.png *.jpg *.jpeg *.bmp) - 写真(*.png *.jpg *.jpeg *.bmp) + + Images + 写真 + + + + ETable + + + Table Editor + + + + + Bold + + + + + Italic + + + + + Underline + + + + + Text Color + テキスト色 + + + + Back Color + 背景色 + + + + Grid Color + + + + + Col Width + + + + + Row Height + + + + + Insert Row + + + + + Insert Col + + + + + Delete Row + + + + + Delete Col + + + + + Merge + + + + + Unmerge + + + + + Clear Data + + + + + Direction + 方向 + + + + Static + スタティック + + + + Bottom -> Top + 上へ + + + + Right -> Left + 左へ + + + + Top -> Bottom + 下へ + + + + Left -> Right + 右へ + + + + Speed + スピード @@ -4175,112 +4567,127 @@ 内容を入力してください - + + Bold + + + + + Italic + + + + + Underline + + + + Back Color 背景色 - + Kerning 字の間隔 - + Line Height 行の高さ - + PageCount: 総ページ数: - + page ページ - + Import txt File インポート txt ファイル - + Fail 失敗 - + Cannot Open File ファイルのオープンに失敗しました - + Play Properties 再生方法 - + Flip 次頁 - + Scroll スクロール - + Static スタティック - + New Format - + Text Color テキスト色 - + Colorful Text まばゆい文字 - + Tail Spacing 首尾間隔 - + Direction 方向 - + Right -> Left 左へ - + Bottom -> Top 上へ - + Left -> Right 右へ - + Top -> Bottom 下へ - + Speed スピード @@ -4428,33 +4835,43 @@ EVideo - + File ファイル - + Play Properties 再生方法 - + Play Times 再生回数 - + Use SW - + + Pre Split + + + + + No Effect + + + + Video Transcoding - - + + Video Transcoding Progress ビデオ変換の進歩 @@ -4518,67 +4935,67 @@ GenTmpThread - + MON 月曜日 - + TUE 火曜日 - + WED 水曜日 - + THU 木曜日 - + FRI 金曜日 - + SAT 土曜日 - + SUN 日曜日 - + AM 午前 - + PM 午後 - + day - + hour - + min - + sec @@ -4586,7 +5003,7 @@ ImgDlg - + Screenshot スクリーンショット @@ -4623,171 +5040,176 @@ MainWindow - + Language 言語 - + Help ヘルプ - - + + Check for updates アップデートをチェック - - - firmware manager + + + Firmware Manager ファームウェア管理 - - - + + + Preferences プリファレンス設定 - - - + + + 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 (ヒント:小さい間隔の大きい画面に適しています。このオプションを有効にすると、文字の端に影がフォントのエッジの滑らかさに達します。小さいサイズのスクリーンと単色のスクリーンは使用を推奨しません) - + Ultra-Long Screen Split 超ロングスクリーン分割 - + Program Send Batch - + Hide Detect Button - + Show IP in Terminal Control - + Show Alias in Terminal Control 端末制御に別名を表示 - + Show Lora Screen - + Download ダウンロード - + Fail 失敗 - + Cannot Save File ファイルの保存に失敗しました - - - + + + Downloading updates 更新をダウンロード - + + Config Hotspot + ホットスポットの設定 + + + Device 端末管理 - + Program コンテンツ管理 - + Control ターミナルコントロール - + Lora Screen - + Check card ワンタッチ修復 - + RestoreLedCardIpByUdpTip この操作はLAN内のすべてのコンピュータIPと同じセグメントにないコントロールカードを固定IPに修正します。慎重に操作してください。 @@ -4893,7 +5315,7 @@ 横位置 右詰め - + Clear all medias? @@ -5024,12 +5446,12 @@ PlayWin - + Move to Top Left 左上隅に移動 - + Set Position 設定位置 @@ -5037,12 +5459,12 @@ PlayerBackSendThread - + Open file failed ファイルのオープンに失敗しました - + Read file failed ファイルの読み込みに失敗しました @@ -5063,57 +5485,57 @@ ProgCreateDlg - + Resolution 解像度 - + Solution Info スケジュール情報 - + Solution Name リスト名 - + Width - + Height 高さ - + Remarks 備考 - + Is Insert - + Ultra-Long Screen Split 超ロングスクリーン分割 - + Horizontal 水平 - + Vertical 垂直 - + Lengths of Parts 部分の長さ @@ -5121,34 +5543,33 @@ ProgEditorWin - + Save 保存 - + Setting 設置 - + Text テキスト - + Photo 写真 - + Video ビデオ - Gif - アニメーション + アニメーション @@ -5171,123 +5592,139 @@ ウェブページ - + General Window マルチ素材ウィンドウ - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; このウィンドウには、複数の異なる番組素材を追加して、リストに追加した順に再生することができます - + Timer タイマー - + + + Table + + + + + New + 新規 + + + + Import + インポート + + + Play 再生 - + Stop 停止 - + Publish 転送 - + program 番組リスト - + Add page ページを追加 - + Copy page コピーページ - + Delete page ページを削除 - + Are you sure you want to delete this program page? 本当にこの番組ページを削除しますか? - + Move up 前へ - + Move down 次頁 - + Widget Properties パッケージプロパティ - + Program Properties プログラムのプロパティ - + Do you want to save the modifications? 変更された内容を保存してもよろしいですか? - + Failed to Create Forder ディレクトリの作成に失敗しました - + Saving... 保存中、少々お待ちください... - + Convertering データを整理する - + Demos テスト素材 - + Open Demo テスト素材を開く - + Generate preview data プレビューデータの生成 - + Failed to Rename Forder - + Failed to Remove Recursively diff --git a/LedOK/ts/app_pt.ts b/LedOK/ts/app_pt.ts index 5af8e3a..d51bce5 100644 --- a/LedOK/ts/app_pt.ts +++ b/LedOK/ts/app_pt.ts @@ -4,46 +4,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,111 +61,128 @@ - - - - - - - - + + + + + + + + + Error Erro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Info + Info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -170,23 +190,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -196,163 +216,170 @@ Selecione o display - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + Success Successo - - - - - - - + + + + + + + + Setting - - - - - + + + + + + + Screen Size Tamanho do display - - - - - - - - - - + + + + + + + + + + + Set - - + + Getting Obtendo - - + + Get Obter - - - + + + Unlock Desbloquear - - - - + + + + Uninstall Desinstalar - - - - + + + + Upload Atualizar - - - - + + + + Install Instalar - - + + Wait for Aguarde - - - - - - - - + + + + + + - - - + + Select File Seleccionar o Ficheiro - - - - - - - - - + + + Please select a value + + + + + + + + + + + - - - - - - + + + + + + + Set Definir - - + + @@ -361,64 +388,63 @@ Introduzir a senha - - + + + Get Get - - - - - - - - - + + + + + + - - + + + + - - - - + + + Readback Readback - - + + - + Refresh Refreshar - + Date Data - + Password Senha - + Lock Bloqueio - + @@ -426,148 +452,176 @@ Enviar - - - + + + - + - - + + Clear Limpar + + + Old password + Senha anterior + + + + + + + New password + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -584,24 +638,25 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -611,21 +666,30 @@ - + + + + - - - + + + Tip Dica + + + + Two passwords are not same + + @@ -645,42 +709,42 @@ - + Close Fechar - - - - - - - - - - - + + + + + + + + + + + Device replied Equipamento replicado - - - + + + Fail Falhou - + - - - - + + + + - + Basic Properties Propriedades Básicas @@ -690,6 +754,180 @@ Getting Obtendo info + + + + + The password must have 8 characters at least and contain numbers, uppercase and lowercase letters + + + + + The Device's Hotspot password is too weak, please change the password. + + + + + Hotspot Name + Nome do Hotspot + + + + Confirm password + + + + + Password changed successfully + Senha alterada com sucesso + + + + BadPointDetectDialog + + + + Bad Point Detection + + + + + + + Port + Porta + + + + + Detect + + + + + Upload Point Table + + + + + Check If Has + + + + + Coordinates + + + + + Size + Tamamho + + + + Bad Point + + + + + Total + + + + + Point Table + + + + + Failed to Read File + Não foi possível ler o Ficheiro + + + + Uploading + + + + + Check + + + + + Sensors + + + + + + Relay On + + + + + Relay Off + + + + + + Get + Get + + + + Get Sensor Data + + + + + Get Rece Card Info + + + + + Temperature + Temperatura + + + + Humidity + Umidade + + + + Voltage + + + + + Light + + + + + Has Smoke + + + + + + + + + Power + Funcioando + + + + Door Open + + + + The encrypted control card can be upgraded directly + O upograde pode ser realizado automaticamente + CalendarButton @@ -702,14 +940,12 @@ ChangePasswordForm - Old password - Senha anterior + Senha anterior - New password - Nova Senha + Nova Senha @@ -731,11 +967,6 @@ Please enter a password with more than 3 characters Entre com senha de mais de 3 caracteres - - - The new password is not consistent in two times - - Password changed successfully @@ -745,775 +976,792 @@ CtrlAdvancedPanel - + Advanced Avançado - + Screen Width(pixel) Largura do display(pixel) - + Width Largura - - + + Height Altura - + Alias Apelido - + Web (Plat 2) Address Endereço do Web (Plat 2) - - + + No VehPlayer File - - + + Failed to Read File Não foi possível ler o Ficheiro - + Getting Baud Rate - + Traffic screen settings - + Setting protocol ... - + Set protocol - + Getting protocol ... - + Get protocol - - + + Port - + Model - + Realtime (Plat 4) Address Servidor de Realtime (Plat 4) - + update or uninstall - + Check Apk Conferi Apk - + Uninstall Desinstalar - + Running check Conferir - + Restart Reiniciar - + Check Log Conferir Log - + Start LedSet4.0 Iniciar LedSet4.0 (Apk Display2.0 and higher) - - Open ADB - Abri ADB debug - - - - + - - + + + Clear Program Limpar Programa - + Config Config - + Restore to default Restaurar padrão - + Taxi top screen configuration Taxi top screen configuration - - + + Service:High Out of service:Low Service:Altura fora do pardão:Diminuir - - + + Service:Low Out of service:High Service:Altura fora do padrão:Aumentar - + Bind Taxihub identity certificate Certificado de identidade do Taxihub Bind - + Rotate Rotacionar - + Min brightness Brilho minimo - + Max brightness Brilho Maximo - + Compant ID: ID da empresa - + Compant ID ID da empresa - - + + SetOnlineAddr Config o webserver - - + + ClearRealtimeServer Limpar - - - - - - + + + + + + SetRealtimeServer Config o server de realtimer - - + + RestartAndroid Reiniciar - - + + running Rodar - - + + no running não rodar - - + + Check Apk Version Checar a versão da APK - - + + UninstallSoftware Desistalar - - + + Check apk running status Checar status do APK - - OpenAdb - Abrir o debug + Abrir o debug - + Identity Certificate Certificado de identidade - - - - - - - + + + + + + + Binding certificate Certificado vinculativo - - + + AliIotSetting - + Software Version Info - + Package - + Version - - + + Package name is null - + Clearing Program - - + + Timeout Tempo esgotado - - - - + + + + Failed Falhou - + Getting Log Obtendo log - + Getting Player State - - + + Player State - - - + + + Get Player State - + Setting Timing Reboot Config tempo de reiniciar - + Set Timing Reboot Config tempo de reiniciar - + Getting Timing Reboot Config tempo de reiniciar - + Get Timing Reboot Obtendo tempo de reinicialização - - + + Get Display Mode - - - - - - - - + + + + + + + + Screen Offset Display Offset - + totalResolution Resolução total de FPGA - + strCurDisplayResolution Resolução do display - - + + File not exist Arquivo não encontrado - - + + Cannot Open File Não pode abrir arquivo - + Uploading Atualizando - + Update Atualizar - - + + Set Display Mode Config Display - - - + + + Lock Card - + Open file Failed Falaha em abrir - + Setting Wallpaper Config plano fundo - - + + Set Wallpaper Config plano fundo - + System Updating Atualizando - - + + System Update Sistema atualizado - + Upload error Erro ao atualizar - + Upgrading Actualização - + Getting MCU Version Obtendo versão - - + + MCU Version Verão de MCU - + Setting player background Config plano de fundo - - + + Set player background Config plano de fundo - + Clearing player background Apagar plano de fundo - - - - - - - - + + + + + + + + Clear player background Apagar plano de fundo - - - GetScreenRotation - Rotação do display - - - - - - Charging Station - - - - - Setting Baud Rate - Config Baud Rate - - - - Set Baud Rate - Config Baud Rate - - - - Get Baud Rate - Config Baud Rate - - - - - Text is empty - Testo em branco - - - - - Json Parse Error - Erro Json - - - - - Json isn't an Object - - - - - Info - Info - - - - Setting card work mode ... - - - - - Set card work mode - - - - - Getting card work mode ... - - - - - Get card work mode - - - - - Change Password - Troque a senha - - - - Get Receive Card Num - Obter o número de cartões receptores - - - - Player Debug + + + SetLauncherStartState - - - Resolution Config - Config de resolução - - - - Full screen - Full screen - - - - Part - Parte - - - - Display Mode - Modo do display - - - - Screen Position - Posição da tela - - - - - Offset - Offset - - - - - - - - Camera Distance + + + GetLauncherStartState - - - Hidden Settings - Esconder Config - - - - Click right button to hide - Clique com o botão direito para esconder - - - - Get MCU Version - Versão de MCU - - - - Baud Config - Config Baudrate - - - - Uart - Uart - - - - Baud - Baud - - - - Firmware Management - - - - - Timing Reboot - Reiniciando - - - - Protocol - Protocolo - - - - Server - Servidor - - - - Client - Cliente - + Set Bypass Mode + + + + + + Get Bypass Mode + + + + + + GetScreenRotation + Rotação do display + + + + + + Charging Station + + + + + Setting Baud Rate + Config Baud Rate + + + + Set Baud Rate + Config Baud Rate + + + + Get Baud Rate + Config Baud Rate + + + + + Text is empty + Testo em branco + + + + + Json Parse Error + Erro Json + + + + + Json isn't an Object + + + + + Info + Info + + + + Setting card work mode ... + + + + + Set card work mode + + + + + Getting card work mode ... + + + + + Get card work mode + + + + + Change Password + Troque a senha + + + + Get Receive Card Num + Obter o número de cartões receptores + + + + Player Debug + + + + + + Resolution Config + Config de resolução + + + + Full screen + Full screen + + + + Part + Parte + + + + Display Mode + Modo do display + + + + Screen Position + Posição da tela + + + + + Offset + Offset + + + + + + + + Camera Distance + + + + + Hidden Settings + Esconder Config + + + + Click right button to hide + Clique com o botão direito para esconder + + + + Get MCU Version + Versão de MCU + + + + Baud Config + Config Baudrate + + + + Uart + Uart + + + + Baud + Baud + + + + Firmware Manager + + + + + Timing Reboot + Reiniciando + + + + Protocol + Protocolo + + + + Server + Servidor + + + + Client + Cliente + + + + SetScreenRotation Config a rotação do display - - + + SetMinBrightness Config brilho minimo - - + + SetMaxBrightness Config brilho maximo - - + + GetMinBrightness Obter bilho - - + + GetMaxBrightness Obter brilho - - + + Card work mode - - + + SetSpecialResolution Config resolução especial - - + + GetSpecialResolution Ler resolução especial - - + + Restore to default relolution Restaurar resolução - - + + SetHighForBusy Set level for busy - - + + GetStateForBusy Get level of busy - - + + SetCardAlias Config apelido - + InputWidthTip Entre com a correta largura - + InputHeightTip Entre com a correta altura - + Password is error Senha esta errada @@ -1527,216 +1775,233 @@ Selecione a sensibilidade do sensor - - + + GetBrightnessSensitivity Obter a sensibilidade do sensor - - + + SetMinBrightness Config brilho minimo - - + + GetMinBrightness Obter brilho minimo - - + + NeedSelectSensorTypeTip Selecione o tipo de sensor - + Open file dialog Abrir arquivo - + Not found current worksheet - - + + SensorBrightnessTable Config tabela do sensor - + GetSensorBrightnessTable Obter tabela do sensor - + no sensorBrightnessTable Não existe tabela - + Save file Salvar arquivo - - + + GetCurrentSensorBrightness Obter brilho atual - - + + SetBrightness Config brilho - + GetBrightness Obter brilho - + Brightness Brilho do display - - + + BrightnessSchedule (*.bjs) Agendamento brilho - + Import File - + Save File Salvar arquivo - + BrightnessValue Valor do brilho - + Start Time Hora de Inicio - + End Time Hora final - - + + SetAutoBrightnessTask Enviar tabela de brilho - + + + SetMaxBrightness + Config brilho maximo + + + + + GetMaxBrightness + Obter brilho + + + GetAutoBrightnessTask Obter tabela de brilho - + Brightness Config Config de brilho - + Auto Auto - + Manual Manual - + Schedule Agendado - + Adapt to Old Devices - + BrightTip1 Se o brilho maximo for 64, o brilho minimo pode ser config em 1% ou valor desejado; se o maximo for 255, o brilho minimo deve se 36%, abaixo disso será muito fraco. - + BrightTip2 Quando atualizar veja se escolheu o tipo correto , caso contrario será invalido! - + Sensitivity Sensibilidade - - Minbrightness + + Min Brightness Brilho minimo - + + Max Brightness + Brilho maximo + + + Upload File Atualizar arquivo - - Cur Brigntness - Brilho atual + + Ambient Brigntness + Brilho Ambiente - + Brightness value Valor do brilho - + Default brightness Brilho padrão - + Add Add - + Delete Deletar - + Import Importar - + Export Exportar - + Apply Aplicar - + Default brightness tip Tip: @@ -1744,150 +2009,150 @@ CtrlHdmiPanel - + HDMI Configuration Config de video - + Manual Manual - + Schedule Agendado - - - - + + + + SyncSwitch Altere a entrada para porta HDMI-IN + - AnSyncSwitch Altere a entrada para Async - + IsSync Ler tipo de entrada - + Save File Salvar arquivo - - + + Sync Schedule Sinc agendamento - - + + SetTimingHdmiInTask Config entrada HDMI-IN - + GetTimingHdmiInTask Obter agendamento de entrada de video - - + + Async Async - + Import File - + Auto Switch - + Start Time Hora de inicio - + End Time Hora final - + SUN Dom - + MON Seg - + TUE Ter - + WED Qua - + THU Qui - + FRI Sex - + SAT Sab - + Add Adicionar - - + + Apply Aplicar - + Delete Deletar - + Import Importar - + Export Exportar - + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period Por padrão, o conteudo asynchronous é aplicadop, e o conteudo synchronous pela porta hdmi-in é aplicado quando fixado o periodo @@ -1895,500 +2160,500 @@ CtrlNetworkPanel - + Wire Enther(RJ45) Configuration Wire Enther(RJ45) Configuração - + Specify IP IP - + IP Address Endereço IP - + Gateway Gateway - + WiFi Config Config WiFi - + Enable WiFi Modo WiFi - + Cellular Config Config Celular - + Enable Cellular Data Habilitar celular - + Get cellular network status information Obter informação da rede - + Through the check status button Atraves do botão de status, voce pode escolher automaticamente o codigo MCC do pais;selecione para obtera correta informação de APN . - + Country ID(mcc): ID do país(mcc): - - + + Carrier Name Operadora - + APN(Required) APN(requerida) - + Flight Mode Modo avião - - WiFi name + + WiFi Name Nome WiFi - - - + + + Password Senha - + Scan Escanear - - Enable AP + + Enable Hotspot - + OFF Desligar - + ON Ligar - - AP name - Nome do AP + + Hotspot Name + Nome do Hotspot - + Subnet mask Mascara subnet - - Input ap name - Entre com nome do AP + + Input Hotspot Name + Entre com nome do Hotspot - - + + SetEthernet Config rede - - - - + + + + Attention Atenção - + Please input IP address! Entre com o endereço de IP - + Please input Mask address! Endereço da mascara - + Please input Gateway address! Endereço de Gateway - + Please input DNS address! Endereço DNS - - + + GetEthernet Obter Ethernet - + DHCP IP IP DHCP - + STATIC IP IP estático - - - - - + + + + + ConfigurationWiFi Configuração WiFi - - - Get AP or WiFi - Obter AP ou WiFi + + + Get Hotspot or WiFi + Obter Hotspot ou WiFi - + GetWifiList Escanear lista WiFi - - - + + - + + Config Hotspot Config do Hotspot - + WifiName Nome Wifi - + ApName Nome Ap - - + + GetCurrentAPN Obter APN atual - + GetSIMStatus Obter estatus do SIM - - + + SetAPN Config APN - + Status Estatus - + 未知 Desconhecido - + 锁定状态,需要用户的PIN码解锁 Travar; necessita de pin para alterar - + 锁定状态,需要用户的PUK码解锁 Travado, necessário PUK para destravar - + 锁定状态,需要网络的PIN码解锁 Travado, necessário PUK para destravar - + 就绪 Lendo - + no checked sim card SIM card não checado - + 国家码: MCC: - + 号码: numero: - + 用户: Nome de usuário: - + 信号: Sinal: - + 信号正常 Sinal OK - + 不在服务区 Fora da area de serviço - + 仅限紧急呼叫 Apenas chamadas de emergencia - + 射频已经关闭 RF desligado - + 网络: Tipo de network: - + 网络类型未知 desconhecido - + GPRS网络 GPRS - + EDGE网络 EDGE - + UMTS网络 UMTS - + CDMA网络,IS95A 或 IS95B. CDM - + EVDO网络, revision 0. EVDO,revision 0. - + EVDO网络, revision A. EVDO,revision A. - + 1xRTT网络 1xRTT - + HSDPA网络 HSDPA - + HSUPA网络 HSUPA - + HSPA网络 HSPA - + 漫游: roam: - + Yes Sim - + No Não - + 数据连接状态: Status: - + 断开 Desligado - + 正在连接 conectando - + 已连接 Conectado - + 暂停 Suspenso - + 数据活动休眠状态: Dados ativo, estado suspenso : - + 活动,但无数据发送和接收 Ativo, mas sen enviar / receber dados - + 活动,正在接收数据 Ativo, recebendo dados - + 活动,正在发送数据 Ativo enviando ddos - + 活动,正在接收和发送数据 Ativo, enviando e recebendo dados - + 休眠状态 Modo suspenso - + 信号强度: Nível de sinal: - + DNS Address Endereço DNS - + Set APN Info Config APN - + User Usuario - + Type Tipo - + Server Server - + Port Porta - + Proxy Proxy - + MMS Port Porta - + MMS Proxy Proxy - - + + SetSwitchSimData Selec SIM - - + + ContrFlightMode Selec modo avião - - + + GetFlightModeState Ler estado modo avião @@ -2584,10 +2849,8 @@ Senha original - - New password - Nova senha + Nova senha @@ -2665,151 +2928,162 @@ CtrlTestPanel - + Test Screen Teste o display - + Line test Teste de linha - - - + + + Red Vermelho - - - + + + Green Verde - - - + + + Blue Azul - - - + + + White Branco - + Vertical Vertical - + Slash Linha diagonal - + Horizontal Horizontal - - + + Bad Point Detection + + + + + Speed Velocidade - + ms(>10) - + Line Distance Distancia entre linhas - - - + + + Test Teste - + Gradation test Teste de graduação - + Only the gray value is displayed Apenas graduação de cinza - + GrayValue Valor de cinza - + Color test Teste de cores - + Gradient Gradiente - + Reset Loop - - - + + + Anycast Anycast - + Stop Parar - - - - - - + + + + + + StartTest Inicie teste - - + + StopTest Parar teste - + + + This screen is encrypted + Este display esta encriptado + + + Loop Mode Mode loop - + Reset loop mode Mode de loop reset @@ -2817,235 +3091,235 @@ CtrlVerifyClockPanel - + Verify Clock Configuration Verificar config de hora - - + + Verify to Computer time Verificar hora do PC - + Cur time of controller Hora atual do display - - + + LAN LAN - + screenSwitch Switch Screen + - YES Ligado + - NO Fechado - + volume Volume - + brightness Brilho - - + + identificationCode Codigo ID - - + + delaySync Hora - - + + msec miliseg - - - - + + + + OtherSyncItem Outro sinc itens - - - - + + + + lastSynchronousTime Ultima atualização de hora - + checkNtpTime Intervalo de atualização - + Lora identity Lora ID - + (min/time) (min/hora) - + identification code Codigo ID - + Time offset(msec) Hora (miliseg) - + Brightness Brilho do display - + Volume Volume - + Screen on/off Liga/Desliga - - + + Slave Escravo - + NTP Server Servidor NTP - - + + NTP Server address Endereço server NTP - + TimeZone Fuso horário - + Language: Idioma: - + Enable Synchronous playing Habilitar sincronização de video - - + + Sync time interval Sincronizar intervalo de tempo - - + + Master Master - + Identification Code Codigo ID - - + + SetNtpServer Config server NTP - - + + MasterSwitch Selecionar como prioritario - - + + SlaveSwitch Selecionar como escravo - + IsMasterSlave Ler identificação - - + + GetControllerDate Obter data hora - - + + SetingSyncMethod Selecionar modo Sinc - - + + SyncTime Sinc hora - - + + GetNtpServer Obter server NTP - - + + GetingSyncMethod Lendo metodo de Sinc - - + + SetTimezone Config fuso horario @@ -3201,13 +3475,13 @@ DevicePanel - + All ALL Todos - + Online Online Online @@ -3215,24 +3489,24 @@ - + Specify IP Specify IP Definir IP - - - - + + + + Current Screen Display atual - - + + none none @@ -3302,112 +3576,112 @@ Entre com endereço IP! - + Cancel Cancelar - + Screen ID ID do display - + Screenshot Capturar tela - - + + On Ligado - - + + Off Desligado - + Brightness Adj. Brilho Adj. - + Power Control Controle de energia - + Net Config Config de rede - + Time Sync Hora Sinc - + Video source Entrada video - + Password Senha - + Advanced Avançado - + Volume Adj. Volume - + Test Teste - - + + Multi screen operation Operação de multi display - - + + selected num Selecionar numero - + More Info Mais Info - + Alias Apelido - + Screen Brightness Brilho do display - + Power Status Estatus de funcionam - + Security encriptação @@ -3429,89 +3703,89 @@ EAClock - + Time Zone Fuso horário - + Custom Dial Customizar - + Select Selecionar - + Select Dail file Selecionar dial - + Hour Mark Escala de hora - - + + Circular Circulo - - + + Rectangle Retangulo - + Number Numero - + Min Mark Escala de minuto - + Color Cores - + Length Comprimento - + Width Largura - + Hour Hand Ponteiro hora - + Min Hand Ponteiro min - + Sec Hand Ponteiro seg - + Show Apresentar - + Text Texto @@ -3519,270 +3793,270 @@ EBase - + Area Area(px) - + X X - + Y Y - + W L - + H A - + Border Borda - - - - + + + + None None - - + + Effect Efeito - - + + Rotate Rotacionar - + Opacity - - + + Blink Piscar - + Speed Velocidade - + Slow Devagar - + Moderate Moderado - + Fast Rapido - + Play Time - + Start - - - - + + + + s s - + Duration Duração - + Entry - - - - Random - - - - - - Expand horizontal - - - - - - Expand vertical - - - - - - Expand to left - - - - - - Expand to top - - - - - - Expand to right - - - - - - Expand to bottom - - - - - Zoom in - - - - - Zoom in from left-top - - - - - Zoom in from right-top - - - - - Zoom in from right-bottom - - - Zoom in from left-bottom + + Random - Rotate zoom + Expand horizontal - Rotate zoom reverse + Expand vertical - Fade in + + Expand to left - Move to left + Expand to top - Move to top + Expand to right - Move to right + Expand to bottom - - Move to bottom - Mover para baixo + Zoom in + + + + + Zoom in from left-top + + + + + Zoom in from right-top + + + + + Zoom in from right-bottom + + + + + Zoom in from left-bottom + + + + + + Rotate zoom + + + + + + Rotate zoom reverse + + + + + Fade in + + Move to left + + + + + + Move to top + + + + + + Move to right + + + + + + Move to bottom + Mover para baixo + + + + Dur - + Exit - + Zoom out - + Zoom out to left-top - + Zoom out to right-top - + Zoom out to right-bottom - + Zoom out to left-bottom - + Fade out - + Breathe - + Freq @@ -3826,83 +4100,83 @@ - + AM AM - + PM PM - + Time Zone Fuso - + Year YAno - + Month Mês - + Day Dia - + Hour Hora - + Min. Min. - + Sec. Seg. - + Weekly Dia da semana - + Full Year 4-Digitos Ano - + 12-Hour 12-Houras - + Date Style Formato data - + Time Style Formato hora - + Display Style Estilo display - + Multiline Multilinha @@ -3995,42 +4269,42 @@ - + Title Titulo - + Compensation Compensação - + Left Esquerda - + Center Centro - + Right Direita - + Single scroll Rolar simples - + Speed Velocidade - + Back Color Cor fundo @@ -4038,74 +4312,70 @@ EGif - File - Arquivo + Arquivo EMultiWin - + Please add media on the right Você pode adicionar varios tipos de midia. O display irá tocar de acordo com a playlist - + Media List Lista de midias - - - + + + Text Texto - - - + + + Photo Foto - - - + + + Video Video - - - Gif - Gif + Gif - - - + + + DClock Relogio - - - + + + AClock Rel. analogico - - + + Environment Ambiente - - + + Timer Timer @@ -4113,59 +4383,177 @@ EPhoto - + File Arquivo - + Image Read Error Erro ao ler iamgem - + Direction Direção - + Scroll Rodar - + No - + Right -> Left Da direita para esquerda - + Bottom -> Top de baixo para cima - + Left -> Right Da esquerda para direita - + Top -> Bottom De cima para baixo - + Speed Velocidade - - Images (*.png *.jpg *.jpeg *.bmp) - Imagens(*.png *.jpg *.jpeg *.bmp) + + Images + Imagens + + + + ETable + + + Table Editor + + + + + Bold + + + + + Italic + + + + + Underline + + + + + Text Color + Cor do texto + + + + Back Color + + + + + Grid Color + + + + + Col Width + + + + + Row Height + + + + + Insert Row + + + + + Insert Col + + + + + Delete Row + + + + + Delete Col + + + + + Merge + + + + + Unmerge + + + + + Clear Data + + + + + Direction + Direção + + + + Static + Estático + + + + Bottom -> Top + de baixo para cima + + + + Right -> Left + Da direita para esquerda + + + + Top -> Bottom + De cima para baixo + + + + Left -> Right + Da esquerda para direita + + + + Speed + Velocidade @@ -4176,112 +4564,127 @@ Entre com o texto - + + Bold + + + + + Italic + + + + + Underline + + + + Back Color Cor de fundo - + Kerning Kerning - + Line Height Altura da Linha - + PageCount: Paginas: - + page Pagina - + Import txt File Importar arquivo - + Fail Falhou - + Cannot Open File Não pode abrir - + Play Properties Propriedades - + Flip Virar - + Scroll Rodar - + Static Estático - + New Format - + Text Color Cor do texto - + Colorful Text Texto colorido - + Tail Spacing Espaçado - + Direction Direção - + Right -> Left Da direita para esquerda - + Bottom -> Top de baixo para cima - + Left -> Right Da esquerda para direita - + Top -> Bottom De cima para baixo - + Speed Velocidade @@ -4429,33 +4832,43 @@ EVideo - + File Arquivo - + Play Properties - + Play Times Repetições - + Use SW - + + Pre Split + + + + + No Effect + + + + Video Transcoding Transcodificação de video - - + + Video Transcoding Progress Processando @@ -4519,67 +4932,67 @@ GenTmpThread - + MON Seg - + TUE Ter - + WED Qua - + THU Qui - + FRI Sex - + SAT Sab - + SUN Dom - + AM AM - + PM PM - + day Dias - + hour Horas - + min Mins - + sec Segs @@ -4587,7 +5000,7 @@ ImgDlg - + Screenshot Captura da tela @@ -4624,171 +5037,176 @@ MainWindow - + Language Idioma - + Help Ajuda - - + + Check for updates Checar atualizações - - - firmware manager + + + Firmware Manager Gerenciador Firmware - - - + + + Preferences Preferencias - - - + + + About Sobre - - + + Setting Config - + Software Update Atualização deSoftware - + CurVersion Versão atual - + Latest Version Ultima versão - + Update Log Atualização de 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 (Info:Não indicado para pequenos displays - + Ultra-Long Screen Split Dividir o Ecrã Ultralongo - + Program Send Batch - + Hide Detect Button - + Show IP in Terminal Control - + Show Alias in Terminal Control Mostrar os aliases no controlo do terminal - + Show Lora Screen - + Download - + Fail Falhou - + Cannot Save File Não pode salvar - - - + + + Downloading updates Atualizando - + + Config Hotspot + Config do Hotspot + + + Device Painéis - + Program Editor - + Control Config - + Lora Screen Display LORA - + Check card Detectar - + RestoreLedCardIpByUdpTip Esta operação irá fixar todos os painéis na LAN que não estão na mesma faixa de IP do seu PC. Atenção! @@ -4894,7 +5312,7 @@ Alinhar pela direita - + Clear all medias? Apagar todas as midias? @@ -5025,12 +5443,12 @@ PlayWin - + Move to Top Left Mover superior esquerdo - + Set Position Config posição @@ -5038,12 +5456,12 @@ PlayerBackSendThread - + Open file failed Abrir aqrquivo - + Read file failed Ler arquivo @@ -5064,57 +5482,57 @@ ProgCreateDlg - + Resolution Resolução - + Solution Info - + Solution Name Nome - + Width Largura - + Height Altura - + Remarks Observações - + Is Insert - + Ultra-Long Screen Split Dividir o Ecrã Ultralongo - + Horizontal - + Vertical - + Lengths of Parts Comprimento das peças @@ -5122,34 +5540,33 @@ ProgEditorWin - + Save Salvar - + Setting Configuração - + Text Texto - + Photo Foto - + Video Video - Gif - Gif + Gif @@ -5172,123 +5589,139 @@ Web page - + General Window - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; Nesta janela, podem ser adicionados varios tipos de midia, sendo apresentados de acordo com a ordem da lista - + Timer Timer - + + + Table + + + + + New + Novo + + + + Import + Importar + + + Play Tocar - + Stop Parar - + Publish Publicar - + program Programa - + Add page Adicionar pag - + Copy page Copiar pag - + Delete page Deletar pag - + Are you sure you want to delete this program page? Você quer deletar esta pagina? - + Move up Mover para cima - + Move down Mover para baixo - + Widget Properties Propriedade - + Program Properties Propriedades do programa - + Do you want to save the modifications? Você quer salvar esta modificação? - + Failed to Create Forder Criação falhou - + Saving... Salvando... - + Convertering Convertendo - + Demos - + Open Demo - + Generate preview data Gerar dados de visualização - + Failed to Rename Forder - + Failed to Remove Recursively diff --git a/LedOK/ts/app_zh_CN.ts b/LedOK/ts/app_zh_CN.ts index 82f32e0..7a38c09 100644 --- a/LedOK/ts/app_zh_CN.ts +++ b/LedOK/ts/app_zh_CN.ts @@ -4,46 +4,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,111 +61,128 @@ - - - - - - - - + + + + + + + + + Error 错误 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Info + 信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -170,23 +190,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -196,163 +216,170 @@ 请先选择大屏幕 - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + Success 成功 - - - - - - - + + + + + + + + Setting 正在设置 - - - - - + + + + + + + Screen Size 屏幕像素 - - - - - - - - - - + + + + + + + + + + + Set 设置 - - + + Getting 正在获取 - - + + Get 获取 - - - + + + Unlock 解锁 - - - - + + + + Uninstall 卸载 - - - - + + + + Upload 上传 - - - - + + + + Install 安装 - - + + Wait for 等待 - - - - - - - - + + + + + + - - - + + Select File 选择文件 - - - - - - - - - + + + Please select a value + 请选一个值 + + + + + + + + + + - - - - - - + + + + + + + Set 设置 - - + + @@ -361,64 +388,63 @@ 输入密码 - - + + + Get 获取 - - - - - - - - - + + + + + + - - + + + + - - - - + + + Readback 回读 - - + + - + Refresh 刷新 - + Date 日期 - + Password 密码 - + Lock 加锁 - + @@ -426,148 +452,176 @@ 发送 - - - + + + - + - - + + Clear 清空 + + + Old password + 旧密码 + + + + + + + New password + 新密码 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -584,24 +638,25 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -611,21 +666,30 @@ - + + + + - - - + + + Tip 提示 + + + + Two passwords are not same + 两次密码不一致 + @@ -645,42 +709,42 @@ - + Close 关闭 - - - - - - - - - - - + + + + + + + + + + + Device replied 设备回复 - - - + + + Fail 失败 - + - - - - + + + + - + Basic Properties 基本属性 @@ -690,6 +754,176 @@ Getting 正在获取 + + + + + The password must have 8 characters at least and contain numbers, uppercase and lowercase letters + 密码必须不少于8位,并且包含数字,大写字母和小写字母 + + + + The Device's Hotspot password is too weak, please change the password. + 设备热点密码太弱,请更改密码 + + + + Hotspot Name + 热点名称 + + + + Confirm password + 确认密码 + + + + Password changed successfully + 密码更改成功 + + + + BadPointDetectDialog + + + + Bad Point Detection + 坏点检测 + + + + + + Port + 端口 + + + + + Detect + 检测 + + + + Upload Point Table + 上传走点表 + + + + Check If Has + 检查是否有 + + + + Coordinates + 坐标 + + + + Size + 大小 + + + + Bad Point + 坏点 + + + + Total + 总数 + + + + Point Table + 走点表 + + + + Failed to Read File + 文件读取失败 + + + + Uploading + 正在上传 + + + + Check + 检查 + + + + Sensors + 传感器 + + + + + Relay On + 打开继电器 + + + + Relay Off + 关闭继电器 + + + + + Get + 获取 + + + + Get Sensor Data + 获取传感器数据 + + + + Get Rece Card Info + 获取接收卡信息 + + + + Temperature + 温度 + + + + Humidity + 湿度 + + + + Voltage + 电压 + + + + Light + + + + + Has Smoke + + + + + + + + + Power + 电源 + + + + Door Open + + CalendarButton @@ -701,16 +935,6 @@ ChangePasswordForm - - - Old password - 旧密码 - - - - New password - 新密码 - Repeat again @@ -732,9 +956,8 @@ 请输入超过 3 个字符的密码 - - The new password is not consistent in two times - 新密码两次不一致 + Two passwords are not same + 两次密码不一致 @@ -745,775 +968,788 @@ CtrlAdvancedPanel - + Advanced 高级设置 - + Screen Width(pixel) 屏幕宽(像素) - + Width - - + + Height - + Alias 别名 - + Web (Plat 2) Address Web (2平台) 地址 - + Traffic screen settings 交通屏设置 - + Setting protocol ... 正在设置协议 ... - + Set protocol 设置协议 - + Getting protocol ... 正在回读协议 ... - + Get protocol 回读协议 - - + + Port 端口 - + Realtime (Plat 4) Address Realtime (4平台) 地址 - - Firmware Management + + Firmware Manager 固件管理 - + update or uninstall 更新或卸载 - + Check Apk 检查Apk - + Uninstall 卸载 - + Running check 运行状态监测 - + Restart 重启 - + Check Log 查看日志 - + Start LedSet4.0 使用 LedSet4.0 配置LED模组(Apk Display2.0以上版本) - - Open ADB - 打开ADB调试功能 - - - - + - - + + + Clear Program 清除节目 - + Config 配置 - + Restore to default 恢复默认值 - + Taxi top screen configuration 车顶有无客电平配置 - - + + Service:High Out of service:Low 有客:高电平 无客:低电平 - - + + Service:Low Out of service:High 有客:低电平 无客:高电平 - + Bind Taxihub identity certificate 绑定Taxihub用户身份凭证 - + Rotate 旋转 - + Min brightness 最低亮度 - + Max brightness 最高亮度 - + Compant ID: 公司ID: - + Compant ID 公司ID - - + + SetOnlineAddr 设置web服务器地址 - - + + ClearRealtimeServer 清除 - - - - - - + + + + + + SetRealtimeServer 设置RealTimer地址 - - + + RestartAndroid 重启 - - + + running 正在运行 - - + + no running 没有运行 - - + + Check Apk Version 查询已安装apk版本 - - + + UninstallSoftware 卸载 - - + + Check apk running status 监测APK运行状态 - - - OpenAdb - 打开ADB调试功能 - - - + Identity Certificate 身份凭证 - - - - - - - + + + + + + + Binding certificate 绑定证书 - - + + AliIotSetting - + Software Version Info 软件版本信息 - + Package 包名 - + Version 版本 - - + + Package name is null 包名为空 - + Clearing Program 正在清除节目 - - + + Timeout 超时 - - - - + + + + Failed 失败 - + Getting Log 正在获取日志 - + Setting Timing Reboot 正在设置定时重启 - + Set Timing Reboot 设置定时重启 - + Getting Timing Reboot 正在获取定时重启 - + Get Timing Reboot 获取定时重启 - + totalResolution 包括行场数的分辨率 - + strCurDisplayResolution 当前显示屏分辨率 - - + + File not exist 文件不存在 - + Getting Player State 正在获取播放器状态 - - - + + + Get Player State 获取播放器状态 - - + + Player State 播放器状态 - - + + Cannot Open File 文件打开失败 - + Uploading 正在上传 - + Update 更新 - - + + Set Display Mode 设置显示模式 - - + + Get Display Mode 获取显示模式 - - - - - - - - + + + + + + + + Screen Offset 屏幕偏移 - - - + + + Lock Card 锁卡 - + Open file Failed 文件打开失败 - - + + No VehPlayer File - + 没有 VehPlayer 文件 - - + + Failed to Read File 文件读取失败 - + Setting Wallpaper 正在设置系统桌面背景 - - + + Set Wallpaper 设置系统桌面背景 - + System Updating 系统升级中 - - + + System Update 系统升级 - + Upload error 上传错误 - + Upgrading 升级中 - + Getting MCU Version 正在获取单片机版本 - - + + MCU Version 单片机版本 - + Setting player background 正在设置播放器背景 - - + + Set player background 设置播放器背景 - + Clearing player background 正在清除播放器背景 - - - - - - - - + + + + + + + + Clear player background 清除播放器背景 - - - GetScreenRotation - 获取屏幕旋转 + + + SetLauncherStartState + - - - - Charging Station - 充电桩 - - - - Setting Baud Rate - 正在设置波特率 - - - - Set Baud Rate - 设置波特率 - - - - Getting Baud Rate - 正在获取波特率 - - - - Get Baud Rate - 获取波特率 - - - - - Text is empty - 文本为空 - - - - - Json Parse Error - - - - - - Json isn't an Object - - - - - Info - 信息 - - - - Setting card work mode ... - 正在设置控制卡工作模式 ... - - - - Set card work mode - 设置控制卡工作模式 - - - - Getting card work mode ... - 正在回读控制卡工作模式 ... - - - - Get card work mode - 回读控制卡工作模式 - - - - Change Password - 修改密码 - - - - Get Receive Card Num - 获取接收卡数量 - - - - Player Debug - 播放器查问题 - - - - - Resolution Config - 分辨率配置 - - - - Full screen - 全屏 - - - - Part - 局部 - - - - Display Mode - 显示模式 - - - - Screen Position - 屏幕位置 - - - - - Offset - 偏移 - - - - - - - - Camera Distance - 摄像头距离 - - - - Hidden Settings - 隐藏的设置 - - - - Click right button to hide - 点击右键隐藏 - - - - Get MCU Version - 获取单片机版本 - - - - Baud Config - 波特率配置 - - - - Model - 设备型号 - - - - Uart - 串口节点 - - - - Baud - 波特率 - - - - Timing Reboot - 定时重启 - - - - Protocol - 协议 - - - - Server - 服务端 - - - - Client - 客户端 + + + GetLauncherStartState + + Set Bypass Mode + + + + + + Get Bypass Mode + + + + + + GetScreenRotation + 获取屏幕旋转 + + + + + + Charging Station + 充电桩 + + + + Setting Baud Rate + 正在设置波特率 + + + + Set Baud Rate + 设置波特率 + + + + Getting Baud Rate + 正在获取波特率 + + + + Get Baud Rate + 获取波特率 + + + + + Text is empty + 文本为空 + + + + + Json Parse Error + + + + + + Json isn't an Object + + + + + Info + 信息 + + + + Setting card work mode ... + 正在设置控制卡工作模式 ... + + + + Set card work mode + 设置控制卡工作模式 + + + + Getting card work mode ... + 正在回读控制卡工作模式 ... + + + + Get card work mode + 回读控制卡工作模式 + + + + Change Password + 修改密码 + + + + Get Receive Card Num + 获取接收卡数量 + + + + Player Debug + 播放器查问题 + + + + + Resolution Config + 分辨率配置 + + + + Full screen + 全屏 + + + + Part + 局部 + + + + Display Mode + 显示模式 + + + + Screen Position + 屏幕位置 + + + + + Offset + 偏移 + + + + + + + + Camera Distance + 摄像头距离 + + + + Hidden Settings + 隐藏的设置 + + + + Click right button to hide + 点击右键隐藏 + + + + Get MCU Version + 获取单片机版本 + + + + Baud Config + 波特率配置 + + + + Model + 设备型号 + + + + Uart + 串口节点 + + + + Baud + 波特率 + + + + Timing Reboot + 定时重启 + + + + Protocol + 协议 + + + + Server + 服务端 + + + + Client + 客户端 + + + + SetScreenRotation 设置屏幕旋转 - - + + SetMinBrightness 设置最小的亮度值 - - + + SetMaxBrightness 设置亮度最大值 - - + + GetMinBrightness 获取亮度最小值 - - + + GetMaxBrightness 获取亮度最大值 - - + + Card work mode 控制卡工作模式 - - + + SetSpecialResolution 设置分辨率 - - + + GetSpecialResolution 读取分辨率 - - + + Restore to default relolution 恢复默认分辨率 - - + + SetHighForBusy 设置有无客电平 - - + + GetStateForBusy 获取有无客电平 - - + + SetCardAlias 设置别名 - + InputWidthTip 请输入正确的宽度像素值 - + InputHeightTip 请输入正确的高度像素值 - + Password is error 密码错误 @@ -1527,216 +1763,233 @@ 设置亮度传感器灵敏度 - - + + GetBrightnessSensitivity 获取亮度传感器灵敏度 - - + + SetMinBrightness 设置最小的亮度值 - - + + GetMinBrightness 获取亮度最小值 - - + + NeedSelectSensorTypeTip 请先选择传感器类型 - + Open file dialog 打开文件 - + Not found current worksheet 没找到当前工作表 - - + + SensorBrightnessTable 设置亮度传感器配置表 - + GetSensorBrightnessTable 获取传感器亮度配置表 - + no sensorBrightnessTable 控制卡没有发现亮度配置表 - + Save file 保存 - - + + GetCurrentSensorBrightness 获取当前亮度 - - + + SetBrightness 设置亮度 - + GetBrightness 获取亮度值 - + Brightness 屏体亮度 - + Import File 导入文件 - - + + BrightnessSchedule (*.bjs) - + Save File 保存文件 - + BrightnessValue 亮度值 - + Start Time 开始时间 - + End Time 结束时间 - - + + SetAutoBrightnessTask 发送定时亮度表 - + + + SetMaxBrightness + 设置亮度最大值 + + + + + GetMaxBrightness + 获取亮度最大值 + + + GetAutoBrightnessTask 获取定时亮度表 - + Brightness Config 亮度配置 - + Auto 自动 - + Manual 手动 - + Schedule 定时 - + Adapt to Old Devices 适配旧设备 - + BrightTip1 如果最大亮度为64,则最小亮度可以配置为1%或适当的值;如果最大亮度为255,则最小亮度必须配置为36%或更高,否则亮度将很低。 - + BrightTip2 上传文件时,请确认选择正确的传感器类型,否则无效! - + Sensitivity 灵敏度 - - Minbrightness - 最小亮度值 + + Min Brightness + 最小亮度 - + + Max Brightness + 最大亮度 + + + Upload File 上传配置文件 - - Cur Brigntness - 当前亮度 + + Ambient Brigntness + 环境亮度 - + Brightness value 亮度值 - + Default brightness 默认亮度 - + Add 添加 - + Delete 删除 - + Import 导入 - + Export 导出 - + Apply 应用 - + Default brightness tip 提示:时间范围内为设定亮度,时间范围外为默认亮度。例如默认亮度为50%,设定亮度为80%,时间范围是8:00-17:00,则时间范围内亮度为80%,其他时间为默认亮度50% @@ -1744,150 +1997,150 @@ CtrlHdmiPanel - + HDMI Configuration 画面输入源配置 - + Manual 手动 - + Schedule 定时 - - - - + + + + SyncSwitch 切换同步模式 + - AnSyncSwitch 切换异步模式 - + IsSync 回读同异步模式 - + Import File 导入文件 - + Save File 保存文件 - - + + Sync Schedule 同步定时任务 - - + + SetTimingHdmiInTask 设置同步模式定时任务 - + GetTimingHdmiInTask 获取同步模式定时任务 - - + + Async 异步 - + Auto Switch 自动识别 - + Start Time 开始时间 - + End Time 结束时间 - + SUN 星期日 - + MON 星期一 - + TUE 星期二 - + WED 星期三 - + THU 星期四 - + FRI 星期五 - + SAT 星期六 - + Add 添加 - - + + Apply 应用 - + Delete 删除 - + Import 导入 - + Export 导出 - + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period 默认播放异步内容,定时时间段内播放同步HDMI-IN端口输入内容 @@ -1895,500 +2148,500 @@ CtrlNetworkPanel - + Wire Enther(RJ45) Configuration 有线网配置 - + Specify IP 指定IP - + IP Address IP地址 - + Gateway 网关 - + DNS Address DNS地址 - + WiFi Config WiFi配置 - + Enable WiFi 开启WiFi - + Cellular Config 蜂窝数据配置 - + Enable Cellular Data 开启蜂窝数据 - + Get cellular network status information 获取蜂窝网络状态信息 - + Through the check status button 通过“获取状态”按钮可以自动匹配国家码,然后选择“运营商”可获取到相应的APN信息。 - + Set APN Info 设置APN信息 - + Country ID(mcc): 国家码(mcc): - - + + Carrier Name 运营商 - + APN(Required) APN(必填) - + Flight Mode 飞行模式 - - WiFi name + + WiFi Name WiFi名称 - - - + + + Password 密码 - + Scan 扫描 - - Enable AP + + Enable Hotspot 开启热点 - + OFF - + ON - - AP name + + Hotspot Name 热点名称 - + Subnet mask 子网掩码 - - Input ap name + + Input Hotspot Name 输入AP名称 - - + + SetEthernet 设置有线网 - - - - + + + + Attention 注意 - + Please input IP address! 请输入IP地址! - + Please input Mask address! 请输入子网掩码地址! - + Please input Gateway address! 请输入网关地址! - + Please input DNS address! 请输入DNS地址! - - + + GetEthernet 获取有线网配置 - + DHCP IP 动态DHCP IP - + STATIC IP 静态IP - - - - - + + + + + ConfigurationWiFi 配置WiFi - - - Get AP or WiFi + + + Get Hotspot or WiFi 获取热点和WiFi模式 - + GetWifiList 扫描WiFi - - - + + - + + Config Hotspot 配置热点 - + WifiName Wifi名称 - + ApName 热点名称 - - + + GetCurrentAPN 获取APN信息 - + GetSIMStatus 获取SIM状态 - - + + SetAPN 设置APN - + Status 状态 - + 未知 未知 - + 锁定状态,需要用户的PIN码解锁 锁定状态,需要用户的PIN码解锁 - + 锁定状态,需要用户的PUK码解锁 锁定状态,需要用户的PUK码解锁 - + 锁定状态,需要网络的PIN码解锁 锁定状态,需要网络的PIN码解锁 - + 就绪 就绪 - + no checked sim card 检测不到sim卡 - + 国家码: 国家码: - + 号码: 号码: - + 用户: 用户: - + 信号: 信号: - + 信号正常 信号正常 - + 不在服务区 不在服务区 - + 仅限紧急呼叫 仅限紧急呼叫 - + 射频已经关闭 射频已经关闭 - + 网络: 网络: - + 网络类型未知 未知 - + GPRS网络 GPRS - + EDGE网络 EDGE - + UMTS网络 UMTS - + CDMA网络,IS95A 或 IS95B. CDM - + EVDO网络, revision 0. EVDO,revision 0. - + EVDO网络, revision A. EVDO,revision A. - + 1xRTT网络 1xRTT - + HSDPA网络 HSDPA - + HSUPA网络 HSUPA - + HSPA网络 HSPA - + 漫游: 漫游: - + Yes - + No - + 数据连接状态: 数据连接状态: - + 断开 断开 - + 正在连接 正在连接 - + 已连接 已连接 - + 暂停 暂停 - + 数据活动休眠状态: 数据活动休眠状态: - + 活动,但无数据发送和接收 活动,但无数据发送和接收 - + 活动,正在接收数据 活动,正在接收数据 - + 活动,正在发送数据 活动,正在发送数据 - + 活动,正在接收和发送数据 活动,正在接收和发送数据 - + 休眠状态 休眠状态 - + 信号强度: - + User 用户 - + Type 类型 - + Server 服务端 - + Port 端口 - + Proxy 代理 - + MMS Port 彩信端口 - + MMS Proxy 彩信代理 - - + + SetSwitchSimData 设置4G/5G开关 - - + + ContrFlightMode 配置飞行模式 - - + + GetFlightModeState 获取飞行模式状态 @@ -2584,10 +2837,8 @@ 原始密码 - - New password - 新密码 + 新密码 @@ -2665,151 +2916,162 @@ CtrlTestPanel - + Test Screen 测试屏幕 - + Line test 线条测试 - - - + + + Red - - - + + + Green 绿 - - - + + + Blue - - - + + + White - + Vertical 竖线 - + Slash 斜线 - + Horizontal 横线 - - + + Bad Point Detection + 坏点检测 + + + + Speed 速度 - + ms(>10) 毫秒(>10) - + Line Distance 线距 - - - + + + Test 测试 - + Gradation test 灰度测试 - + Only the gray value is displayed 只显示颜色值 - + GrayValue 灰度值 - + Color test 颜色测试 - + Gradient 渐变 - + Reset 循环 - - - + + + Anycast 点播 - + Stop 停止 - - - - - - + + + + + + StartTest 开始测试 - - + + StopTest 停止测试 - + + + This screen is encrypted + 屏幕已加密 + + + Loop Mode 循环模式 - + Reset loop mode 设置循环 @@ -2817,235 +3079,235 @@ CtrlVerifyClockPanel - + Verify Clock Configuration 校准时间 - - + + Verify to Computer time 校准到计算机时间 - + Cur time of controller LED显示屏设备当前时间 - - + + LAN 局域网 - + screenSwitch 开关屏 + - YES + - NO - + volume 音量 - + brightness 亮度 - - + + identificationCode 识别码 - - + + delaySync 时间偏移 - - + + msec 毫秒 - - - - + + + + OtherSyncItem 其他同步项 - - - - + + + + lastSynchronousTime 上次同步时间 - + checkNtpTime 同步间隔 - + Lora identity Lora身份 - + (min/time) (分钟/次) - + identification code 同步识别码 - + Time offset(msec) 时间偏移(毫秒) - + Brightness 屏体亮度 - + Volume 音量 - + Screen on/off 屏幕开关 - - + + Slave - + NTP Server NTP服务器 - - + + NTP Server address NTP服务器地址 - + TimeZone 时区 - + Language: 语言: - + Enable Synchronous playing 使能同步画面功能 - - + + Sync time interval 同步时间间隔 - - + + Master - + Identification Code 识别码 - - + + SetNtpServer 设置NTP服务 - - + + MasterSwitch 设置为主设备 - - + + SlaveSwitch 设置为从设备 - + IsMasterSlave 回读主从身份 - - + + GetControllerDate 获取日期时间 - - + + SetingSyncMethod 设置同步方法 - - + + SyncTime 校准时间 - - + + GetNtpServer 获取NTP服务信息 - - + + GetingSyncMethod 获取同步方式 - - + + SetTimezone 设置时区 @@ -3201,37 +3463,37 @@ DevicePanel - + All 总数 总数 - + Online 在线 在线 - - - - + + + + Current Screen 当前屏幕 - - + + none - + Specify IP 指定IP 指定IP @@ -3302,112 +3564,112 @@ 请输入IP地址! - + Cancel 取消 - + Screen ID 屏幕ID - + Alias 别名 - + Screenshot 回读画面 - - + + On - - + + Off - + Brightness Adj. 亮度调节 - + Power Control 电源控制 - + Net Config 网络配置 - + Time Sync 对时管理 - + Video source 同异步配置 - + Password 设置密码 - + Advanced 高级设置 - + Volume Adj. 音量调节 - + Test 测试 - - + + Multi screen operation 多屏操作 - - + + selected num 选中数目 - + More Info 更多信息 - + Screen Brightness 屏幕亮度 - + Power Status 屏幕开关状态 - + Security 加密 @@ -3425,89 +3687,89 @@ EAClock - + Time Zone 时区 - + Custom Dial 自定义表盘 - + Select 选择 - + Select Dail file 选择表盘图片 - + Hour Mark 时标 - - + + Circular 圆形 - - + + Rectangle 矩形 - + Number 数字 - + Min Mark 分标 - + Color 颜色 - + Length - + Width - + Hour Hand 时针 - + Min Hand 分针 - + Sec Hand 秒针 - + Show 显示 - + Text 文本 @@ -3515,270 +3777,270 @@ EBase - + Area 区域(px) - + X - + Y - + W - + H - + Border 边框 - - - - + + + + None - - + + Effect 特效 - - + + Rotate 旋转 - + Opacity 不透明度 - - + + Blink 闪烁 - + Speed 速度 - + Slow - + Moderate - + Fast - + Play Time 播放时间 - + Start 开始 - - - - + + + + s - + Duration 时长 - + Entry 入场 - - + + Random 随机 - - + + Expand horizontal 水平展开 - - + + Expand vertical 垂直展开 - - + + Expand to left 向左展开 - - + + Expand to top 向上展开 - - + + Expand to right 向右展开 - - + + Expand to bottom 向下展开 - + Zoom in 放大 - + Zoom in from left-top 从左上角放大 - + Zoom in from right-top 从右上角放大 - + Zoom in from right-bottom 从右下角放大 - + Zoom in from left-bottom 从左下角放大 - - + + Rotate zoom 旋转放大 - - + + Rotate zoom reverse 反向旋转放大 - + Fade in 淡入 - - + + Move to left 向左移动 - - + + Move to top 向上移动 - - + + Move to right 向右移动 - - + + Move to bottom 向下移动 - - + + Dur 时长 - + Exit 出场 - + Zoom out 缩小 - + Zoom out to left-top 向左上角缩小 - + Zoom out to right-top 向右上角缩小 - + Zoom out to right-bottom 向右下角缩小 - + Zoom out to left-bottom 向左下角缩小 - + Fade out 淡出 - + Breathe 呼吸 - + Freq 频率 @@ -3822,83 +4084,83 @@ - + AM 上午 - + PM 下午 - + Time Zone 时区 - + Year - + Month - + Day - + Hour - + Min. - + Sec. - + Weekly 星期 - + Full Year 四位年 - + 12-Hour 12小时制 - + Date Style 日期风格 - + Time Style 时间风格 - + Display Style 显示风格 - + Multiline 多行显示 @@ -3991,117 +4253,102 @@ 西北 - + Title 标题 - + Compensation 补偿 - + Left 靠左 - + Center 居中 - + Right 靠右 - + Single scroll 单行滚动 - + Speed 速度 - + Back Color 背景色 - - EGif - - - File - 文件 - - EMultiWin - + Please add media on the right 请在右边添加媒体,可以加入多个不同媒体,LED显示屏将按列表先后顺序播放 - + Media List 媒体列表 - - - + + + Text 文本 - - - + + + Photo 图片 - - - + + + Video 视频 - - - - Gif - 动画 - - - - - + + + DClock 数字时钟 - - - + + + AClock 模拟时钟 - - + + Environment 环境监测 - - + + Timer 计时器 @@ -4109,59 +4356,177 @@ EPhoto - + File 文件 - + Image Read Error 图片读取错误 - + Direction 方向 - + Scroll 滚动 - + No - + Right -> Left 向左 - + Bottom -> Top 向上 - + Left -> Right 向右 - + Top -> Bottom 向下 - + Speed 速度 - - Images (*.png *.jpg *.jpeg *.bmp) - 图片(*.png *.jpg *.jpeg *.bmp) + + Images + 图片 + + + + ETable + + + Table Editor + 表格编辑器 + + + + Bold + 加粗 + + + + Italic + 斜体 + + + + Underline + 下划线 + + + + Text Color + 文字颜色 + + + + Back Color + 背景色 + + + + Grid Color + 网格颜色 + + + + Col Width + 列宽 + + + + Row Height + 行高 + + + + Insert Row + 插入行 + + + + Insert Col + 插入列 + + + + Delete Row + 删除行 + + + + Delete Col + 删除列 + + + + Merge + 合并 + + + + Unmerge + 拆分 + + + + Clear Data + 清除数据 + + + + Direction + 方向 + + + + Static + 静态 + + + + Bottom -> Top + 向上 + + + + Right -> Left + 向左 + + + + Top -> Bottom + 向下 + + + + Left -> Right + 向右 + + + + Speed + 速度 @@ -4172,112 +4537,127 @@ 请输入内容 - + + Bold + 加粗 + + + + Italic + 斜体 + + + + Underline + 下划线 + + + Back Color 背景色 - + Kerning 字距 - + Line Height 行高 - + PageCount: 总页数: - + page - + Import txt File 导入 txt 文件 - + Fail 失败 - + Cannot Open File 文件打开失败 - + Play Properties 播放方式 - + Flip 翻页 - + Scroll 滚动 - + Static 静态 - + New Format 新格式 - + Text Color 文字颜色 - + Colorful Text 炫彩文字 - + Tail Spacing 首尾间隔 - + Direction 方向 - + Right -> Left 向左 - + Bottom -> Top 向上 - + Left -> Right 向右 - + Top -> Bottom 向下 - + Speed 速度 @@ -4425,33 +4805,43 @@ EVideo - + File 文件 - + Play Properties 播放方式 - + Play Times 播放次数 - + Use SW 使用软解码 - + + Pre Split + 打折预处理 + + + + No Effect + 无效果 + + + Video Transcoding 视频转码 - - + + Video Transcoding Progress 视频转码进度 @@ -4515,67 +4905,67 @@ GenTmpThread - + MON 星期一 - + TUE 星期二 - + WED 星期三 - + THU 星期四 - + FRI 星期五 - + SAT 星期六 - + SUN 星期日 - + AM 上午 - + PM 下午 - + day - + hour - + min - + sec @@ -4583,7 +4973,7 @@ ImgDlg - + Screenshot 屏幕截图 @@ -4620,171 +5010,176 @@ MainWindow - + Language 语言 - + Help 帮助 - - + + Check for updates 检查更新 - - - firmware manager + + + Firmware Manager 固件管理 - - - + + + Preferences 偏好设置 - - - + + + 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 (提示:该选项适合小间距大尺寸的屏幕,选中此项,文字边缘会有暗影已达到字体边缘光滑的效果;小尺寸屏幕和单双色屏幕不建议使用) - + Ultra-Long Screen Split 超长屏打折 - + Program Send Batch 同时发送节目数量 - + Hide Detect Button 隐藏一键找卡 - + Show IP in Terminal Control 在终端控制显示IP - + Show Alias in Terminal Control 在终端控制显示别名 - + Show Lora Screen 显示光影屏 - + Download 下载 - + Fail 失败 - + Cannot Save File 保存文件失败 - - - + + + Downloading updates 正在下载更新 - + + Config Hotspot + 配置热点 + + + Device 设备管理 - + Program 节目管理 - + Control 终端控制 - + Lora Screen 光影屏 - + Check card 一键找卡 - + RestoreLedCardIpByUdpTip 该操作会把局域网内的所有与计算机IP不在同一网段的控制卡修复成固定IP,请谨慎操作! @@ -4890,7 +5285,7 @@ 水平靠右 - + Clear all medias? 清除所有媒体? @@ -5021,12 +5416,12 @@ PlayWin - + Move to Top Left 移动到左上角 - + Set Position 设置位置 @@ -5034,12 +5429,12 @@ PlayerBackSendThread - + Open file failed 文件读取失败 - + Read file failed 文件读取失败 @@ -5060,57 +5455,57 @@ ProgCreateDlg - + Resolution 分辨率 - + Solution Info 节目信息 - + Solution Name 节目名称 - + Width - + Height - + Remarks 备注 - + Is Insert 插播节目 - + Ultra-Long Screen Split 超长屏打折 - + Horizontal 水平 - + Vertical 垂直 - + Lengths of Parts 每段长度 @@ -5118,35 +5513,30 @@ ProgEditorWin - + Save 保存 - + Setting 设置 - + Text 文本 - + Photo 图片 - + Video 视频 - - - Gif - 动画 - Clock @@ -5168,123 +5558,139 @@ 网页 - + General Window 多素材窗口 - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; 该窗口中可以加入多个不同是节目素材,并按照加入列表的先后顺序播放 - + Timer 计时器 - + + + Table + 表格 + + + + New + 新建 + + + + Import + 导入 + + + Play 播放 - + Stop 停止 - + Publish 发布 - + program 节目列表 - + Add page 添加页面 - + Copy page 复制页面 - + Delete page 删除页面 - + Are you sure you want to delete this program page? 确定要删除该节目页吗? - + Move up 向上移动一个页面 - + Move down 向下移动一个页面 - + Widget Properties 组件属性 - + Program Properties 节目属性 - + Do you want to save the modifications? 是否保存修改? - + Failed to Create Forder 创建目录失败 - + Saving... 正在保存... - + Convertering 整理数据中 - + Demos 测试素材 - + Open Demo 打开测试素材 - + Generate preview data 生成预览数据 - + Failed to Rename Forder 重命名文件夹失败 - + Failed to Remove Recursively diff --git a/LedOK/ts/app_zh_TW.ts b/LedOK/ts/app_zh_TW.ts index 04ebd04..0d95c20 100644 --- a/LedOK/ts/app_zh_TW.ts +++ b/LedOK/ts/app_zh_TW.ts @@ -4,46 +4,49 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58,111 +61,128 @@ - - - - - - - - + + + + + + + + + Error 錯誤 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + Info + 資訊 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -170,23 +190,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -196,163 +216,170 @@ 請先選擇大螢幕 - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + Success 成功 - - - - - - - + + + + + + + + Setting 正在設定 - - - - - + + + + + + + Screen Size 螢幕點數 - - - - - - - - - - + + + + + + + + + + + Set 設定 - - + + Getting 正在獲取 - - + + Get 獲取 - - - + + + Unlock 解鎖 - - - - + + + + Uninstall 卸載 - - - - + + + + Upload 上傳 - - - - + + + + Install 安裝 - - + + Wait for 等待 - - - - - - - - + + + + + + - - - + + Select File 選擇檔案 - - - - - - - - - + + + Please select a value + + + + + + + + + + + - - - - - - + + + + + + + Set 設定 - - + + @@ -361,64 +388,63 @@ 輸入密碼 - - + + + Get 讀取 - - - - - - - - - + + + + + + - - + + + + - - - - + + + Readback 回讀 - - + + - + Refresh 檢測 - + Date 日期 - + Password 密碼 - + Lock 加鎖 - + @@ -426,148 +452,176 @@ 發送 - - - + + + - + - - + + Clear 清空 + + + Old password + 舊密碼 + + + + + + + New password + 新密碼 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -584,24 +638,25 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -611,21 +666,30 @@ - + + + + - - - + + + Tip 提示 + + + + Two passwords are not same + 密碼兩次不一致 + @@ -645,42 +709,42 @@ - + Close 關閉 - - - - - - - - - - - + + + + + + + + + + + Device replied 設備回復 - - - + + + Fail 失敗 - + - - - - + + + + - + Basic Properties 基本屬性 @@ -690,6 +754,180 @@ Getting 正在獲取 + + + + + The password must have 8 characters at least and contain numbers, uppercase and lowercase letters + + + + + The Device's Hotspot password is too weak, please change the password. + + + + + Hotspot Name + 熱點名稱 + + + + Confirm password + + + + + Password changed successfully + 密碼更改成功 + + + + BadPointDetectDialog + + + + Bad Point Detection + + + + + + + Port + + + + + + Detect + + + + + Upload Point Table + + + + + Check If Has + + + + + Coordinates + + + + + Size + 大小 + + + + Bad Point + + + + + Total + + + + + Point Table + + + + + Failed to Read File + 檔案讀取失敗 + + + + Uploading + 正在上傳 + + + + Check + + + + + Sensors + + + + + + Relay On + + + + + Relay Off + + + + + + Get + 讀取 + + + + Get Sensor Data + + + + + Get Rece Card Info + + + + + Temperature + 溫度 + + + + Humidity + 濕度 + + + + Voltage + + + + + Light + + + + + Has Smoke + + + + + + + + + Power + 電源 + + + + Door Open + + + + The encrypted control card can be upgraded directly + 加密控制卡可以直接陞級 + CalendarButton @@ -702,14 +940,12 @@ ChangePasswordForm - Old password - 舊密碼 + 舊密碼 - New password - 新密碼 + 新密碼 @@ -732,9 +968,8 @@ 請輸入超過 3 個字元的密碼 - - The new password is not consistent in two times - 新密碼兩次不一致 + Two passwords are not same + 密碼兩次不一致 @@ -745,775 +980,792 @@ CtrlAdvancedPanel - + Advanced 高級設定 - + Screen Width(pixel) 螢幕寬(點數) - + Width - - + + Height - + Alias 別名 - + Web (Plat 2) Address Web (2平臺) 地址 - + Traffic screen settings 交通屏設定 - + Setting protocol ... 正在設定協定 - + Set protocol 設定協定 - + Getting protocol ... 正在回讀協定 ... - + Get protocol 回讀協定 - - + + Port - + Realtime (Plat 4) Address Realtime (4平臺) 地址 - - Firmware Management + + Firmware Manager 固件管理 - + update or uninstall 更新或卸載 - + Check Apk 檢查Apk - + Uninstall 卸載 - + Running check 運行狀態監測 - + Restart 重啓 - + Check Log 查看日誌 - + Start LedSet4.0 - - Open ADB - 打開ADB調試功能 - - - - + - - + + + Clear Program 清除節目 - + Config 配寘 - + Restore to default 恢復預設值 - + Taxi top screen configuration 車頂有無客電平配寘 - - + + Service:High Out of service:Low 有客:高電平無客:低電平 - - + + Service:Low Out of service:High 有客:低電平 無客:高電平 - + Bind Taxihub identity certificate 綁定Taxihub用戶身份憑證 - + Rotate 旋轉 - + Min brightness 最低亮度 - + Max brightness 最高亮度 - + Compant ID: 公司ID: - + Compant ID 公司ID - - + + SetOnlineAddr 設定web伺服器地址 - - + + ClearRealtimeServer 清除 - - - - - - + + + + + + SetRealtimeServer 設定RealTimer地址 - - + + RestartAndroid 重啓 - - + + running 正在運行 - - + + no running 沒有運行 - - + + Check Apk Version 査詢已安裝apk版本 - - + + UninstallSoftware 卸載 - - + + Check apk running status 監測APK運行狀態 - - OpenAdb - 打開ADB調試功能 + 打開ADB調試功能 - + Identity Certificate 身份憑證 - - - - - - - + + + + + + + Binding certificate 綁定證書 - - + + AliIotSetting - + Software Version Info 軟體版本資訊 - + Package 包名 - + Version 版本 - - + + Package name is null 包名為空 - + Clearing Program 正在清除節目 - - + + Timeout 超時 - - - - + + + + Failed 失敗 - + Getting Log 讀取日誌 - + Setting Timing Reboot 正在設定定時重啓 - + Set Timing Reboot 設定定時重啓 - + Getting Timing Reboot 正在獲取定時重啓 - + Get Timing Reboot 獲取定時重啓 - + totalResolution 行数を含む解像度 - + strCurDisplayResolution 當前顯示分辯率 - - + + File not exist 檔案不存在 - + Getting Player State 正在獲取播放機狀態 - - - + + + Get Player State 獲取播放機狀態 - - + + Player State 播放機狀態 - - + + Cannot Open File 檔案打開失敗 - + Uploading 正在上傳 - + Update 更新 - - + + Set Display Mode 設定顯示模式 - - + + Get Display Mode 獲取顯示模式 - - - - - - - - + + + + + + + + Screen Offset 螢幕偏移 - - - + + + Lock Card 鎖卡 - + Open file Failed 檔案打開失敗 - - + + No VehPlayer File - - + + Failed to Read File 檔案讀取失敗 - + Setting Wallpaper 正在設定系統桌面背景 - - + + Set Wallpaper 設定系統桌面背景 - + System Updating 系統升級中 - - + + System Update 系統升級 - + Upload error 上傳錯誤 - + Upgrading 陞級中 - + Getting MCU Version 正在獲取單片機版本 - - + + MCU Version 單片機版本 - + Setting player background 正在設定播放機背景 - - + + Set player background 設定播放機背景 - + Clearing player background 正在清除播放機背景 - - - - - - - - + + + + + + + + Clear player background 清除播放機背景 - - - GetScreenRotation - 獲取荧幕旋轉 - - - - - - Charging Station - 充電樁 - - - - Setting Baud Rate - 正在設定串列傳輸速率 - - - - Set Baud Rate - 設定串列傳輸速率 - - - - Getting Baud Rate - 正在讀取串列傳輸速率 - - - - Get Baud Rate - 讀取串列傳輸速率 - - - - - Text is empty - - - - - - Json Parse Error - - - - - - Json isn't an Object - - - - - Info - 資訊 - - - - Setting card work mode ... - 正在設定控制卡工作模式 ... - - - - Set card work mode - 設定控制卡工作模式 - - - - Getting card work mode ... - 正在回讀控制卡工作模式 ... - - - - Get card work mode - 回讀控制卡工作模式 - - - - Change Password - 修改密碼 - - - - Get Receive Card Num - 獲取接收卡數量 - - - - Player Debug + + + SetLauncherStartState - - - Resolution Config - 分辯率配寘 - - - - Full screen - 全屏 - - - - Part - 局部 - - - - Display Mode - 顯示模式 - - - - Screen Position - 螢幕位置 - - - - - Offset - 偏移 - - - - - - - - Camera Distance - 監視器距離 - - - - Hidden Settings - 隱藏的設定 - - - - Click right button to hide - 點擊右鍵隱藏 - - - - Get MCU Version - 獲取單片機版本 - - - - Baud Config - 串列傳輸速率配寘 - - - - Model - 設備型號 - - - - Uart - 串口節點 - - - - Baud - 串列傳輸速率 - - - - Timing Reboot - 定時重啓 - - - - Protocol - 協定 - - - - Server - 服務端 - - - - Client - 用戶端 + + + GetLauncherStartState + + Set Bypass Mode + + + + + + Get Bypass Mode + + + + + + GetScreenRotation + 獲取荧幕旋轉 + + + + + + Charging Station + 充電樁 + + + + Setting Baud Rate + 正在設定串列傳輸速率 + + + + Set Baud Rate + 設定串列傳輸速率 + + + + Getting Baud Rate + 正在讀取串列傳輸速率 + + + + Get Baud Rate + 讀取串列傳輸速率 + + + + + Text is empty + + + + + + Json Parse Error + + + + + + Json isn't an Object + + + + + Info + 資訊 + + + + Setting card work mode ... + 正在設定控制卡工作模式 ... + + + + Set card work mode + 設定控制卡工作模式 + + + + Getting card work mode ... + 正在回讀控制卡工作模式 ... + + + + Get card work mode + 回讀控制卡工作模式 + + + + Change Password + 修改密碼 + + + + Get Receive Card Num + 獲取接收卡數量 + + + + Player Debug + + + + + + Resolution Config + 分辯率配寘 + + + + Full screen + 全屏 + + + + Part + 局部 + + + + Display Mode + 顯示模式 + + + + Screen Position + 螢幕位置 + + + + + Offset + 偏移 + + + + + + + + Camera Distance + 監視器距離 + + + + Hidden Settings + 隱藏的設定 + + + + Click right button to hide + 點擊右鍵隱藏 + + + + Get MCU Version + 獲取單片機版本 + + + + Baud Config + 串列傳輸速率配寘 + + + + Model + 設備型號 + + + + Uart + 串口節點 + + + + Baud + 串列傳輸速率 + + + + Timing Reboot + 定時重啓 + + + + Protocol + 協定 + + + + Server + 服務端 + + + + Client + 用戶端 + + + + SetScreenRotation 設定螢幕旋轉 - - + + SetMinBrightness 設定最小的亮度值 - - + + SetMaxBrightness 設定亮度最大值 - - + + GetMinBrightness 獲取亮度最小值 - - + + GetMaxBrightness 獲取亮度最大值 - - + + Card work mode 控制卡工作模式 - - + + SetSpecialResolution 設定分辯率 - - + + GetSpecialResolution 讀取分辯率 - - + + Restore to default relolution 恢復默認分辯率 - - + + SetHighForBusy 設定有無客電平 - - + + GetStateForBusy 獲取有無客電平 - - + + SetCardAlias 設定別名 - + InputWidthTip 請輸入正確的寬度點數值 - + InputHeightTip 請輸入正確的高度點數值 - + Password is error 密碼錯誤 @@ -1527,100 +1779,100 @@ 設定亮度感測器靈敏度 - - + + GetBrightnessSensitivity 獲取亮度感測器靈敏度 - - + + SetMinBrightness 設定最小的亮度值 - - + + GetMinBrightness 獲取亮度最小值 - - + + NeedSelectSensorTypeTip 請先選擇感測器類型 - + Open file dialog 打開文件 - + Not found current worksheet 沒找到當前工作表 - - + + SensorBrightnessTable 設定亮度感測器配寘錶 - + GetSensorBrightnessTable 獲取感測器亮度配寘錶 - + no sensorBrightnessTable 控制卡沒有發現亮度配寘錶 - + Save file 保存 - - + + GetCurrentSensorBrightness 獲取當前亮度 - - + + SetBrightness 設定亮度 - + GetBrightness 獲取亮度值 - + Brightness 屏体亮度 - + Import File 導入檔案 - - + + BrightnessSchedule (*.bjs) - + Save File 保存 - + BrightnessValue 亮度值 @@ -1630,118 +1882,135 @@ 開始時間 - + Start Time 開始時間 - + End Time 結束時間 - - + + SetAutoBrightnessTask 發送定時亮度錶 - + + + SetMaxBrightness + 設定亮度最大值 + + + + + GetMaxBrightness + 獲取亮度最大值 + + + GetAutoBrightnessTask 獲取定時亮度錶 - + Brightness Config 亮度配寘 - + Auto 自動 - + Manual 手動 - + Schedule 定時 - + Adapt to Old Devices 適配舊設備 - + BrightTip1 如果最大亮度為64,則最小亮度可以配寘為1%或適當的值;如果最大亮度為255,則最小亮度必須配寘為36%或更高,否則亮度將很低。 - + BrightTip2 上傳文件時,請確認選擇正確的感測器類型,否則無效! - + Sensitivity 靈敏度 - - Minbrightness - 最小亮度值 + + Min Brightness + 最小亮度 - + + Max Brightness + 最大亮度 + + + Upload File 上傳設定檔 - - Cur Brigntness - 當前亮度 + + Ambient Brigntness + 環境亮度 - + Brightness value 亮度值 - + Default brightness 默認亮度 - + Add 添加 - + Delete 删除 - + Import 導入 - + Export 匯出 - + Apply 應用 - + Default brightness tip 提示:時間範圍內為設定亮度,時間範圍外為默認亮度。例如默認亮度為50%,設定亮度為80%,時間範圍是8:00-17:00,則時間範圍內亮度為80%,其他時間為默認亮度50% @@ -1749,150 +2018,150 @@ CtrlHdmiPanel - + HDMI Configuration 畫面輸入源配寘 - + Manual 手動 - + Schedule 定時 - - - - + + + + SyncSwitch 切換同步模式 + - AnSyncSwitch 切換異步模式 - + IsSync 回讀同非同步模式 - + Import File 導入檔案 - + Save File 保存 - - + + Sync Schedule 同步定時任務 - - + + SetTimingHdmiInTask 設定同步模式定時任務 - + GetTimingHdmiInTask 獲取同步模式定時任務 - - + + Async BOX - + Auto Switch - + Start Time 開始時間 - + End Time 結束時間 - + SUN 星期日 - + MON 星期一 - + TUE 星期二 - + WED 星期三 - + THU 星期四 - + FRI 星期五 - + SAT 星期六 - + Add 添加 - - + + Apply 應用 - + Delete 删除 - + Import 導入 - + Export 匯出 - + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period 默認播放非同步內容,定時時間段內播放同步HDMI-IN埠輸入內容 @@ -1900,500 +2169,500 @@ CtrlNetworkPanel - + Wire Enther(RJ45) Configuration 有線網配寘 - + Specify IP 指定IP - + IP Address IP地址 - + Gateway 閘道 - + DNS Address DNS地址 - + WiFi Config WiFi配寘 - + Enable WiFi 开啟WiFi - + Cellular Config 蜂窩數據配寘 - + Enable Cellular Data 啟用蜂窩數據 - + Get cellular network status information 獲取蜂窩網絡狀態資訊 - + Through the check status button 通過“獲取狀態”按鈕可以自動匹配國家碼,然後選擇“運營商”可獲取到相應的APN資訊。 - + Set APN Info 設定APN資訊 - + Country ID(mcc): 国家码(mcc):國家碼(mcc): - - + + Carrier Name 運營商 - + APN(Required) APN(必填) - + Flight Mode 飛行模式 - - WiFi name + + WiFi Name WiFi名稱 - - - + + + Password 密碼 - + Scan 掃描 - - Enable AP + + Enable Hotspot 开啟熱點 - + OFF - + ON - - AP name + + Hotspot Name 熱點名稱 - + Subnet mask 子網路遮罩 - - Input ap name + + Input Hotspot Name 輸入AP名稱 - - + + SetEthernet 設定有線網 - - - - + + + + Attention 注意 - + Please input IP address! 請輸入IP地址! - + Please input Mask address! 請輸入子網路遮罩地址! - + Please input Gateway address! 請輸入閘道地址! - + Please input DNS address! 請輸入DNS地址! - - + + GetEthernet 獲取有線網配寘 - + DHCP IP 動態DHCP IP - + STATIC IP 靜態IP - - - - - + + + + + ConfigurationWiFi 配寘WiFi - - - Get AP or WiFi + + + Get Hotspot or WiFi 獲取熱點和WiFi模式 - + GetWifiList 掃描WiFi - - - + + - + + Config Hotspot 配寘熱點 - + WifiName Wifi名稱 - + ApName 熱點名稱 - - + + GetCurrentAPN 獲取APN資訊 - + GetSIMStatus 獲取SIM狀態 - - + + SetAPN 設定APN - + Status 狀態 - + 未知 未知 - + 锁定状态,需要用户的PIN码解锁 鎖定狀態,需要用戶的PIN碼解鎖 - + 锁定状态,需要用户的PUK码解锁 鎖定狀態,需要用戶的PUK碼解鎖 - + 锁定状态,需要网络的PIN码解锁 鎖定狀態,需要網絡的PIN碼解鎖 - + 就绪 就緒 - + no checked sim card 檢測不到sim卡 - + 国家码: 國家碼: - + 号码: 號碼: - + 用户: 用戶: - + 信号: 信号: - + 信号正常 訊號正常 - + 不在服务区 不在服務區 - + 仅限紧急呼叫 僅限緊急呼叫 - + 射频已经关闭 射頻已經關閉 - + 网络: 網絡: - + 网络类型未知 未知 - + GPRS网络 GPRS - + EDGE网络 EDGE - + UMTS网络 UMTS - + CDMA网络,IS95A 或 IS95B. CDM - + EVDO网络, revision 0. EVDO,revision 0. - + EVDO网络, revision A. EVDO,revision A. - + 1xRTT网络 1xRTT - + HSDPA网络 HSDPA - + HSUPA网络 HSUPA - + HSPA网络 HSPA - + 漫游: 漫遊: - + Yes - + No - + 数据连接状态: 數據連接狀態: - + 断开 斷開 - + 正在连接 正在連接 - + 已连接 已連接 - + 暂停 暫停 - + 数据活动休眠状态: 數據活動休眠狀態: - + 活动,但无数据发送和接收 活動,但無數據發送和接收 - + 活动,正在接收数据 活動,正在接收數據 - + 活动,正在发送数据 活動,正在發送數據 - + 活动,正在接收和发送数据 活動,正在接收和發送數據 - + 休眠状态 休眠狀態 - + 信号强度: 信號強度: - + User 用戶 - + Type 型態 - + Server 服務端 - + Port - + Proxy 代理 - + MMS Port 彩信埠 - + MMS Proxy 彩信代理 - - + + SetSwitchSimData 設定4G/5G開關 - - + + ContrFlightMode 配寘飛行模式 - - + + GetFlightModeState 獲取飛行模式狀態 @@ -2589,10 +2858,8 @@ 原始密碼 - - New password - 新密碼 + 新密碼 @@ -2670,151 +2937,162 @@ CtrlTestPanel - + Test Screen 測試螢幕 - + Line test 線條測試 - - - + + + Red - - - + + + Green - - - + + + Blue - - - + + + White - + Vertical 豎線 - + Slash 斜線 - + Horizontal 橫線 - - + + Bad Point Detection + + + + + Speed 速度 - + ms(>10) 毫秒(>10) - + Line Distance 線距 - - - + + + Test 測試 - + Gradation test 灰度測試 - + Only the gray value is displayed 只顯示顏色值 - + GrayValue 灰度值 - + Color test 顏色測試 - + Gradient 漸變 - + Reset 迴圈 - - - + + + Anycast 點播 - + Stop 停止 - - - - - - + + + + + + StartTest 開始測試 - - + + StopTest 停止測試 - + + + This screen is encrypted + 螢幕已加密 + + + Loop Mode 迴圈模式 - + Reset loop mode 設定迴圈 @@ -2822,235 +3100,235 @@ CtrlVerifyClockPanel - + Verify Clock Configuration 校準時間 - - + + Verify to Computer time 校準到電腦時間 - + Cur time of controller 顯示幕設備當前時間 - - + + LAN 局域網 - + screenSwitch 開關屏 + - YES + - NO - + volume 音量 - + brightness 亮度 - - + + identificationCode 識別碼 - - + + delaySync 時間偏移 - - + + msec 毫秒 - - - - + + + + OtherSyncItem 其他同步項 - - - - + + + + lastSynchronousTime 上次同步時間 - + checkNtpTime 同步間隔 - + Lora identity Lora身份 - + (min/time) (分鐘/次) - + identification code 同步识别码 - + Time offset(msec) 時間偏移(毫秒) - + Brightness 屏体亮度 - + Volume 音量 - + Screen on/off 螢幕開關 - - + + Slave - + NTP Server NTP服務器 - - + + NTP Server address NTP服務器地址 - + TimeZone 時區 - + Language: 語言: - + Enable Synchronous playing 使能同步画面功能 - - + + Sync time interval 同步時間間隔 - - + + Master - + Identification Code 識別碼 - - + + SetNtpServer 設定NTP服務 - - + + MasterSwitch 設定為主設備 - - + + SlaveSwitch 設定為從設備 - + IsMasterSlave 回讀主從身份 - - + + GetControllerDate 獲取日期時間 - - + + SetingSyncMethod 設定同步方法 - - + + SyncTime 校準時間 - - + + GetNtpServer 獲取NTP服務資訊 - - + + GetingSyncMethod 獲取同步方式 - - + + SetTimezone 設定時區 @@ -3206,12 +3484,12 @@ DevicePanel - + All 總數 - + Online 在线 線上 @@ -3219,24 +3497,24 @@ - + Specify IP 指定IP 指定IP - - - - + + + + Current Screen - 当前屏幕 + 當前屏幕 - - + + none @@ -3306,112 +3584,112 @@ 請輸入IP地址! - + Cancel 取消 - + Screen ID 螢幕ID - + Alias 別名 - + Screenshot 回讀畫面 - - + + On - - + + Off - + Brightness Adj. 亮度調節 - + Power Control 電源控制 - + Net Config 網絡配寘 - + Time Sync 對時管理 - + Video source 同異步配寘 - + Password 設寘密碼 - + Advanced 高級設定 - + Volume Adj. 音量調節 - + Test 測試 - - + + Multi screen operation 多屏操作 - - + + selected num 選中數目 - + More Info 更多資訊 - + Screen Brightness 螢幕亮度 - + Power Status 螢幕開關狀態 - + Security 加密 @@ -3429,89 +3707,89 @@ EAClock - + Time Zone 時區 - + Custom Dial 自定義錶盤 - + Select 選擇 - + Select Dail file 選擇錶盤圖片 - + Hour Mark 時標 - - + + Circular 圓形 - - + + Rectangle 矩形 - + Number 數位 - + Min Mark 分標 - + Color 顏色 - + Length - + Width - + Hour Hand 時針 - + Min Hand 分針 - + Sec Hand 分針 - + Show 顯示 - + Text 文字 @@ -3519,270 +3797,270 @@ EBase - + Area 區域(px) - + X - + Y - + W - + H - + Border 邊框 - - - - + + + + None - - + + Effect 特效 - - + + Rotate 旋轉 - + Opacity 不透明度 - - + + Blink 閃爍 - + Speed 速度 - + Slow - + Moderate - + Fast - + Play Time 播放時間 - + Start 開始 - - - - + + + + s - + Duration 時長 - + Entry 入場 - - + + Random 隨機 - - + + Expand horizontal 水平展開 - - + + Expand vertical 垂直展開 - - + + Expand to left 向左展開 - - + + Expand to top 向上展開 - - + + Expand to right 向右展開 - - + + Expand to bottom 向下展開 - + Zoom in 放大 - + Zoom in from left-top 從左上角放大 - + Zoom in from right-top 從右上角放大 - + Zoom in from right-bottom 從右下角放大 - + Zoom in from left-bottom 從左下角放大 - - + + Rotate zoom 旋轉放大 - - + + Rotate zoom reverse 反向旋轉放大 - + Fade in 淡入 - - + + Move to left 向左移動 - - + + Move to top 向上移動 - - + + Move to right 向右移動 - - + + Move to bottom 向下移動 - - + + Dur 時長 - + Exit 出場 - + Zoom out 縮小 - + Zoom out to left-top 向左上角縮小 - + Zoom out to right-top 向右上角縮小 - + Zoom out to right-bottom 向右下角縮小 - + Zoom out to left-bottom 向左下角縮小 - + Fade out 淡出 - + Breathe 呼吸 - + Freq 頻率 @@ -3826,83 +4104,83 @@ - + AM 上午 - + PM 下午 - + Time Zone 時區 - + Year - + Month - + Day - + Hour - + Min. - + Sec. - + Weekly 星期 - + Full Year 四位年 - + 12-Hour 12小時制 - + Date Style 日期風格 - + Time Style 時間風格 - + Display Style 顯示風格 - + Multiline 多行顯示 @@ -3995,42 +4273,42 @@ 西北 - + Title 標題 - + Compensation 補償 - + Left 靠左 - + Center 居中 - + Right 靠右 - + Single scroll 單行滾動 - + Speed 速度 - + Back Color 背景色 @@ -4038,74 +4316,70 @@ EGif - File - 檔案 + 檔案 EMultiWin - + Please add media on the right 請在右邊添加媒體,可以加入多個不同媒體,LED顯示幕將按清單先後順序播放 - + Media List 媒體清單 - - - + + + Text 文字 - - - + + + Photo 圖片 - - - + + + Video 視頻 - - - Gif - 動畫 + 動畫 - - - + + + DClock 數位時鐘 - - - + + + AClock 圓形時鐘 - - + + Environment 環境監測 - - + + Timer 計時器 @@ -4113,59 +4387,177 @@ EPhoto - + File 檔案 - + Image Read Error 圖片讀取錯誤 - + Direction 方向 - + Scroll 滾動 - + No - + Right -> Left 向左 - + Bottom -> Top 向上 - + Left -> Right 向右 - + Top -> Bottom 向下 - + Speed 速度 - - Images (*.png *.jpg *.jpeg *.bmp) - 圖片(*.png *.jpg *.jpeg *.bmp) + + Images + 圖片 + + + + ETable + + + Table Editor + + + + + Bold + + + + + Italic + + + + + Underline + + + + + Text Color + 文字顏色 + + + + Back Color + 背景色 + + + + Grid Color + + + + + Col Width + + + + + Row Height + + + + + Insert Row + + + + + Insert Col + + + + + Delete Row + + + + + Delete Col + + + + + Merge + + + + + Unmerge + + + + + Clear Data + + + + + Direction + 方向 + + + + Static + 靜態 + + + + Bottom -> Top + 向上 + + + + Right -> Left + 向左 + + + + Top -> Bottom + 向下 + + + + Left -> Right + 向右 + + + + Speed + 速度 @@ -4176,112 +4568,127 @@ 請輸入內容 - + + Bold + + + + + Italic + + + + + Underline + + + + Back Color 背景色 - + Kerning 字距 - + Line Height 行高 - + PageCount: 總頁數: - + page - + Import txt File 導入 txt 檔案 - + Fail 失敗 - + Cannot Open File 檔案打開失敗 - + Play Properties 播放管道 - + Flip 翻頁 - + Scroll 滾動 - + Static 靜態 - + New Format - + Text Color 文字顏色 - + Colorful Text 炫彩文字 - + Tail Spacing 首尾間隔 - + Direction 方向 - + Right -> Left 向左 - + Bottom -> Top 向上 - + Left -> Right 向右 - + Top -> Bottom 向下 - + Speed 速度 @@ -4429,33 +4836,43 @@ EVideo - + File 檔案 - + Play Properties 播放管道 - + Play Times 播放次數 - + Use SW 使用軟解碼 - + + Pre Split + + + + + No Effect + + + + Video Transcoding - - + + Video Transcoding Progress 視頻轉碼進度 @@ -4519,67 +4936,67 @@ GenTmpThread - + MON 星期一 - + TUE 星期二 - + WED 星期三 - + THU 星期四 - + FRI 星期五 - + SAT 星期六 - + SUN 星期日 - + AM 上午 - + PM 下午 - + day - + hour - + min - + sec @@ -4587,7 +5004,7 @@ ImgDlg - + Screenshot 螢幕截圖 @@ -4624,171 +5041,176 @@ MainWindow - + Language 語言 - + Help 幫助 - - + + Check for updates 檢查更新 - - - firmware manager + + + Firmware Manager 固件管理 - - - + + + Preferences 偏好設定 - - - + + + 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 (提示:該選項適合小間距大尺寸的螢幕,選中此項,文字邊緣會有暗影已達到字體邊緣光滑的效果;小尺寸螢幕和單雙色螢幕不建議使用) - + Ultra-Long Screen Split 超長屏打折 - + Program Send Batch 同時發送節目數量 - + Hide Detect Button 隱藏一鍵找卡 - + Show IP in Terminal Control 在終端控制顯示IP - + Show Alias in Terminal Control 在終端控制顯示別名 - + Show Lora Screen 顯示光影屏 - + Download 下載 - + Fail 失敗 - + Cannot Save File 保存檔案失敗 - - - + + + Downloading updates 下載更新 - + + Config Hotspot + 配寘熱點 + + + Device 設備管理 - + Program 節目管理 - + Control 終端控制 - + Lora Screen 光影屏 - + Check card 一鍵找卡 - + RestoreLedCardIpByUdpTip 該操作會把局域網內的所有與電腦IP不在同一網段的控制卡修復成固定IP,請謹慎操作! @@ -4894,7 +5316,7 @@ 水准靠右 - + Clear all medias? 清除所有媒體? @@ -5025,12 +5447,12 @@ PlayWin - + Move to Top Left 移動到左上角 - + Set Position 設定位置 @@ -5038,12 +5460,12 @@ PlayerBackSendThread - + Open file failed 檔案打開失敗 - + Read file failed 檔案讀取失敗 @@ -5064,57 +5486,57 @@ ProgCreateDlg - + Resolution 分辯率 - + Solution Info 節目資訊 - + Solution Name 節目名稱 - + Width - + Height - + Remarks 備註 - + Is Insert - + Ultra-Long Screen Split 超長屏打折 - + Horizontal 水平 - + Vertical 垂直 - + Lengths of Parts 每段長度 @@ -5122,34 +5544,33 @@ ProgEditorWin - + Save 保存 - + Setting 設定 - + Text 文字 - + Photo 圖片 - + Video 視頻 - Gif - 動畫 + 動畫 @@ -5172,123 +5593,139 @@ 網頁 - + General Window 多素材視窗 - + In this window, a plurality of different program materials can be added and played according to the order of joining the list; 該視窗中可以加入多個不同是節目素材,並按照加入列表的先後順序播放 - + Timer 計時器 - + + + Table + + + + + New + 新建 + + + + Import + 導入 + + + Play 播放 - + Stop 停止 - + Publish 發佈 - + program 節目清單 - + Add page 添加頁面 - + Copy page 複製頁面 - + Delete page 删除頁面 - + Are you sure you want to delete this program page? 確定要删除該節目頁嗎? - + Move up 向上移動一個頁面 - + Move down 向下移動一個頁面 - + Widget Properties 組件内容 - + Program Properties 節目内容 - + Do you want to save the modifications? 是否保存修改? - + Failed to Create Forder 創建目錄失敗 - + Saving... 正在保存… - + Convertering 整理數據中 - + Demos 測試素材 - + Open Demo 打開測試素材 - + Generate preview data 生成預覽數據 - + Failed to Rename Forder - + Failed to Remove Recursively