From b2642a7a6f5be4738c51f8572c615f2b2f477920 Mon Sep 17 00:00:00 2001 From: gangphon Date: Tue, 4 Jan 2022 18:11:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=20lekok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LedOK/.gitignore | 38 + LedOK/BrightnessTable.xlsx | Bin 0 -> 16384 bytes LedOK/Btb | Bin 0 -> 44065 bytes LedOK/ColorDialog/BasicColorArea.cpp | 244 + LedOK/ColorDialog/BasicColorArea.h | 25 + LedOK/ColorDialog/BasicColorItem.cpp | 90 + LedOK/ColorDialog/BasicColorItem.h | 35 + LedOK/ColorDialog/ColorDialog.cpp | 703 + LedOK/ColorDialog/ColorDialog.h | 58 + LedOK/ColorDialog/ColorDialog.ui | 934 ++ LedOK/ColorDialog/CustomColorArea.cpp | 113 + LedOK/ColorDialog/CustomColorArea.h | 31 + LedOK/ColorDialog/HColorArea.cpp | 77 + LedOK/ColorDialog/HColorArea.h | 41 + LedOK/ColorDialog/PreviewColorArea.cpp | 55 + LedOK/ColorDialog/PreviewColorArea.h | 38 + LedOK/ColorDialog/SVColorArea.cpp | 132 + LedOK/ColorDialog/SVColorArea.h | 51 + .../data/images/button/button-h.png | Bin 0 -> 141 bytes .../data/images/button/button-n.png | Bin 0 -> 143 bytes .../data/images/button/button-s.png | Bin 0 -> 141 bytes LedOK/ColorDialog/data/images/mainui/bg.png | Bin 0 -> 4813 bytes .../data/images/mainui/close-H.png | Bin 0 -> 1108 bytes .../ColorDialog/data/images/mainui/close.png | Bin 0 -> 1097 bytes LedOK/ColorDialog/data/images/mainui/main.png | Bin 0 -> 37848 bytes .../ColorDialog/data/images/mainui/max-H.png | Bin 0 -> 1047 bytes LedOK/ColorDialog/data/images/mainui/max.png | Bin 0 -> 1078 bytes .../ColorDialog/data/images/mainui/min-H.png | Bin 0 -> 2841 bytes LedOK/ColorDialog/data/images/mainui/min.png | Bin 0 -> 2851 bytes .../ColorDialog/data/images/mainui/title.png | Bin 0 -> 4685 bytes LedOK/ColorDialog/data/ui.png | Bin 0 -> 66679 bytes LedOK/JQLibrary/JQLibrary.pri | 216 + LedOK/JQLibrary/include/JQDeclare | 1 + LedOK/JQLibrary/include/JQHttpServer.h | 282 + LedOK/JQLibrary/include/JQNet.h | 198 + LedOK/JQLibrary/include/jqdeclare.hpp | 119 + LedOK/JQLibrary/src/JQHttpServer.cpp | 1256 ++ LedOK/JQLibrary/src/JQNet.cpp | 669 + LedOK/LICENSE | 674 + LedOK/Languages/enUS.qm | Bin 0 -> 129161 bytes LedOK/Languages/enUS.ts | 9615 +++++++++++++ LedOK/Languages/jaJP.qm | Bin 0 -> 110226 bytes LedOK/Languages/jaJP.ts | 9605 +++++++++++++ LedOK/Languages/widgets.qm | Bin 0 -> 494 bytes LedOK/Languages/widgets.ts | 1192 ++ LedOK/Languages/widgets_cn.qm | Bin 0 -> 494 bytes LedOK/Languages/widgets_cn.ts | 1192 ++ LedOK/Languages/widgets_th.qm | Bin 0 -> 494 bytes LedOK/Languages/widgets_th.ts | 1192 ++ LedOK/Languages/zhCN.qm | Bin 0 -> 102778 bytes LedOK/Languages/zhCN.ts | 9610 +++++++++++++ LedOK/Languages/zhTH.qm | Bin 0 -> 102840 bytes LedOK/Languages/zhTH.ts | 9596 +++++++++++++ LedOK/LedOK.pro | 493 + LedOK/LedOK111.pro | 471 + LedOK/LoQClass/extendedgroupbox.cpp | 64 + LedOK/LoQClass/extendedgroupbox.h | 32 + LedOK/LoQClass/locolorselector.cpp | 63 + LedOK/LoQClass/locolorselector.h | 32 + LedOK/LoQClass/lodateselector.cpp | 27 + LedOK/LoQClass/lodateselector.h | 22 + LedOK/LoQClass/loglwindow.cpp | 19 + LedOK/LoQClass/loglwindow.h | 28 + LedOK/LoQClass/loqdialog.cpp | 65 + LedOK/LoQClass/loqdialog.h | 29 + LedOK/LoQClass/loqgraphicsobject.cpp | 578 + LedOK/LoQClass/loqgraphicsobject.h | 117 + LedOK/LoQClass/loqgraphicsvideoitem.cpp | 24 + LedOK/LoQClass/loqgraphicsvideoitem.h | 23 + LedOK/LoQClass/loqgraphicsview.cpp | 38 + LedOK/LoQClass/loqgraphicsview.h | 12 + LedOK/LoQClass/loqheaderviewcheckbox.cpp | 41 + LedOK/LoQClass/loqheaderviewcheckbox.h | 27 + LedOK/LoQClass/loqlineedit.cpp | 11 + LedOK/LoQClass/loqlineedit.h | 19 + LedOK/LoQClass/loqmacro.h | 14 + LedOK/LoQClass/loqmainwindow.cpp | 172 + LedOK/LoQClass/loqmainwindow.h | 53 + LedOK/LoQClass/loqpushbutton.cpp | 27 + LedOK/LoQClass/loqpushbutton.h | 28 + LedOK/LoQClass/loqtitlebar.cpp | 80 + LedOK/LoQClass/loqtitlebar.h | 34 + LedOK/LoQClass/loqtreewidget.cpp | 119 + LedOK/LoQClass/loqtreewidget.h | 39 + LedOK/LoQClass/loqvideosurface.cpp | 57 + LedOK/LoQClass/loqvideosurface.h | 21 + LedOK/LoQClass/loqwindowtitlebar.cpp | 56 + LedOK/LoQClass/loqwindowtitlebar.h | 27 + LedOK/LoQClass/qexcel.cpp | 335 + LedOK/LoQClass/qexcel.h | 82 + LedOK/LoQClass/readexcel.cpp | 169 + LedOK/LoQClass/readexcel.h | 78 + LedOK/LoUIClass/aboutdlg.cpp | 18 + LedOK/LoUIClass/aboutdlg.h | 22 + LedOK/LoUIClass/aboutdlg.ui | 202 + LedOK/LoUIClass/changepasswordform.cpp | 144 + LedOK/LoUIClass/changepasswordform.h | 26 + LedOK/LoUIClass/changepasswordform.ui | 135 + LedOK/LoUIClass/customprogressindicator.cpp | 186 + LedOK/LoUIClass/customprogressindicator.h | 118 + LedOK/LoUIClass/loemptydialog.cpp | 97 + LedOK/LoUIClass/loemptydialog.h | 44 + LedOK/LoUIClass/loemptydialog.ui | 122 + LedOK/LoUIClass/louimsgboxok.h | 36 + LedOK/LoUIClass/louimsgboxok.ui | 204 + LedOK/LoUIClass/louimsgboxokcancel.cpp | 37 + LedOK/LoUIClass/louimsgboxokcancel.h | 24 + LedOK/LoUIClass/louimsgboxokcancel.ui | 200 + LedOK/LoUIClass/pixbmpshowdialog.cpp | 40 + LedOK/LoUIClass/pixbmpshowdialog.h | 30 + LedOK/LoUIClass/pixbmpshowdialog.ui | 91 + LedOK/LoUIClass/qiplineedit.cpp | 343 + LedOK/LoUIClass/qiplineedit.h | 41 + LedOK/LoUIClass/softconfigdialog.cpp | 102 + LedOK/LoUIClass/softconfigdialog.h | 25 + LedOK/LoUIClass/softconfigdialog.ui | 168 + LedOK/LoUIClass/switchcontrol.cpp | 484 + LedOK/LoUIClass/switchcontrol.h | 230 + LedOK/LoUIClass/taesclass.cpp | 472 + LedOK/LoUIClass/taesclass.h | 129 + LedOK/LoUIClass/updateledset3dialog.cpp | 91 + LedOK/LoUIClass/updateledset3dialog.h | 30 + LedOK/LoUIClass/updateledset3dialog.ui | 207 + LedOK/LoUIClass/updaterdialog.cpp | 85 + LedOK/LoUIClass/updaterdialog.h | 28 + LedOK/LoUIClass/updaterdialog.ui | 209 + LedOK/LoUIClass/updaterfirmwaredialog.cpp | 119 + LedOK/LoUIClass/updaterfirmwaredialog.h | 29 + LedOK/LoUIClass/updaterfirmwaredialog.ui | 207 + LedOK/LoUIClass/x_checkboxdelegate.cpp | 116 + LedOK/LoUIClass/x_checkboxdelegate.h | 73 + LedOK/LoUIClass/x_spinboxdelegate.cpp | 79 + LedOK/LoUIClass/x_spinboxdelegate.h | 79 + LedOK/LoUIClass/x_timeeditdelegate.cpp | 62 + LedOK/LoUIClass/x_timeeditdelegate.h | 75 + LedOK/LoUIClass/x_uimsgboxok.cpp | 115 + LedOK/LoUIClass/x_uimsgboxok.h | 29 + LedOK/LoUIClass/x_uimsgboxok.ui | 246 + LedOK/LoUIClass/x_uimsgboxokcancel.cpp | 48 + LedOK/LoUIClass/x_uimsgboxokcancel.h | 23 + LedOK/LoUIClass/x_uimsgboxokcancel.ui | 246 + LedOK/LoUIClass/x_uimsgboxonlyclosebtn.cpp | 27 + LedOK/LoUIClass/x_uimsgboxonlyclosebtn.h | 23 + LedOK/LoUIClass/x_uimsgboxonlyclosebtn.ui | 135 + LedOK/LoUIClass/x_uimsgboxyesnocancel.cpp | 57 + LedOK/LoUIClass/x_uimsgboxyesnocancel.h | 28 + LedOK/LoUIClass/x_uimsgboxyesnocancel.ui | 250 + LedOK/QSimpleUpdater/.gitattributes | 1 + LedOK/QSimpleUpdater/.gitignore | 19 + LedOK/QSimpleUpdater/.travis.yml | 19 + LedOK/QSimpleUpdater/COPYING.md | 27 + LedOK/QSimpleUpdater/QSimpleUpdater.pri | 47 + LedOK/QSimpleUpdater/QSimpleUpdater.pro | 31 + LedOK/QSimpleUpdater/README.md | 75 + LedOK/QSimpleUpdater/doc/config/doxyfile | 2479 ++++ LedOK/QSimpleUpdater/doc/config/icon.png | Bin 0 -> 12307 bytes LedOK/QSimpleUpdater/doc/config/startpage.md | 66 + LedOK/QSimpleUpdater/doc/documentation.html | 9 + .../output/html/_downloader_8h_source.html | 102 + .../html/_q_simple_updater_8h_source.html | 102 + .../doc/output/html/_updater_8h_source.html | 102 + .../doc/output/html/annotated.html | 106 + .../doc/output/html/arrowdown.png | Bin 0 -> 246 bytes .../doc/output/html/arrowright.png | Bin 0 -> 229 bytes LedOK/QSimpleUpdater/doc/output/html/bc_s.png | Bin 0 -> 676 bytes LedOK/QSimpleUpdater/doc/output/html/bdwn.png | Bin 0 -> 147 bytes .../output/html/class_downloader-members.html | 122 + .../doc/output/html/class_downloader.html | 517 + .../doc/output/html/class_downloader.png | Bin 0 -> 427 bytes .../html/class_q_simple_updater-members.html | 126 + .../output/html/class_q_simple_updater.html | 787 ++ .../output/html/class_q_simple_updater.png | Bin 0 -> 488 bytes .../output/html/class_updater-members.html | 144 + .../doc/output/html/class_updater.html | 820 ++ .../doc/output/html/class_updater.png | Bin 0 -> 375 bytes .../doc/output/html/classes.html | 110 + .../QSimpleUpdater/doc/output/html/closed.png | Bin 0 -> 132 bytes .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 104 + .../dir_d44c64559bbebec7f509842c48db8b23.html | 104 + LedOK/QSimpleUpdater/doc/output/html/doc.png | Bin 0 -> 746 bytes .../doc/output/html/doxygen.css | 1475 ++ .../doc/output/html/doxygen.png | Bin 0 -> 3779 bytes .../doc/output/html/dynsections.js | 97 + .../QSimpleUpdater/doc/output/html/files.html | 103 + .../doc/output/html/folderclosed.png | Bin 0 -> 616 bytes .../doc/output/html/folderopen.png | Bin 0 -> 597 bytes .../doc/output/html/functions.html | 313 + .../doc/output/html/functions_func.html | 313 + .../doc/output/html/hierarchy.html | 108 + LedOK/QSimpleUpdater/doc/output/html/icon.png | Bin 0 -> 12307 bytes .../QSimpleUpdater/doc/output/html/index.html | 111 + .../QSimpleUpdater/doc/output/html/jquery.js | 68 + .../QSimpleUpdater/doc/output/html/nav_f.png | Bin 0 -> 153 bytes .../QSimpleUpdater/doc/output/html/nav_g.png | Bin 0 -> 95 bytes .../QSimpleUpdater/doc/output/html/nav_h.png | Bin 0 -> 98 bytes LedOK/QSimpleUpdater/doc/output/html/open.png | Bin 0 -> 123 bytes .../doc/output/html/search/all_0.html | 26 + .../doc/output/html/search/all_0.js | 9 + .../doc/output/html/search/all_1.html | 26 + .../doc/output/html/search/all_1.js | 6 + .../doc/output/html/search/all_2.html | 26 + .../doc/output/html/search/all_2.js | 15 + .../doc/output/html/search/all_3.html | 26 + .../doc/output/html/search/all_3.js | 5 + .../doc/output/html/search/all_4.html | 26 + .../doc/output/html/search/all_4.js | 4 + .../doc/output/html/search/all_5.html | 26 + .../doc/output/html/search/all_5.js | 5 + .../doc/output/html/search/all_6.html | 26 + .../doc/output/html/search/all_6.js | 5 + .../doc/output/html/search/all_7.html | 26 + .../doc/output/html/search/all_7.js | 6 + .../doc/output/html/search/all_8.html | 26 + .../doc/output/html/search/all_8.js | 4 + .../doc/output/html/search/all_9.html | 26 + .../doc/output/html/search/all_9.js | 4 + .../doc/output/html/search/all_a.html | 26 + .../doc/output/html/search/all_a.js | 4 + .../doc/output/html/search/all_b.html | 26 + .../doc/output/html/search/all_b.js | 13 + .../doc/output/html/search/all_c.html | 26 + .../doc/output/html/search/all_c.js | 9 + .../doc/output/html/search/classes_0.html | 26 + .../doc/output/html/search/classes_0.js | 4 + .../doc/output/html/search/classes_1.html | 26 + .../doc/output/html/search/classes_1.js | 4 + .../doc/output/html/search/classes_2.html | 26 + .../doc/output/html/search/classes_2.js | 4 + .../doc/output/html/search/close.png | Bin 0 -> 273 bytes .../doc/output/html/search/functions_0.html | 26 + .../doc/output/html/search/functions_0.js | 9 + .../doc/output/html/search/functions_1.html | 26 + .../doc/output/html/search/functions_1.js | 5 + .../doc/output/html/search/functions_2.html | 26 + .../doc/output/html/search/functions_2.js | 15 + .../doc/output/html/search/functions_3.html | 26 + .../doc/output/html/search/functions_3.js | 4 + .../doc/output/html/search/functions_4.html | 26 + .../doc/output/html/search/functions_4.js | 4 + .../doc/output/html/search/functions_5.html | 26 + .../doc/output/html/search/functions_5.js | 5 + .../doc/output/html/search/functions_6.html | 26 + .../doc/output/html/search/functions_6.js | 5 + .../doc/output/html/search/functions_7.html | 26 + .../doc/output/html/search/functions_7.js | 6 + .../doc/output/html/search/functions_8.html | 26 + .../doc/output/html/search/functions_8.js | 4 + .../doc/output/html/search/functions_9.html | 26 + .../doc/output/html/search/functions_9.js | 4 + .../doc/output/html/search/functions_a.html | 26 + .../doc/output/html/search/functions_a.js | 13 + .../doc/output/html/search/functions_b.html | 26 + .../doc/output/html/search/functions_b.js | 8 + .../doc/output/html/search/mag_sel.png | Bin 0 -> 563 bytes .../doc/output/html/search/nomatches.html | 12 + .../doc/output/html/search/pages_0.html | 26 + .../doc/output/html/search/pages_0.js | 4 + .../doc/output/html/search/search.css | 271 + .../doc/output/html/search/search.js | 791 ++ .../doc/output/html/search/search_l.png | Bin 0 -> 604 bytes .../doc/output/html/search/search_m.png | Bin 0 -> 158 bytes .../doc/output/html/search/search_r.png | Bin 0 -> 612 bytes .../doc/output/html/search/searchdata.js | 24 + .../doc/output/html/splitbar.png | Bin 0 -> 314 bytes .../doc/output/html/sync_off.png | Bin 0 -> 853 bytes .../doc/output/html/sync_on.png | Bin 0 -> 845 bytes .../QSimpleUpdater/doc/output/html/tab_a.png | Bin 0 -> 142 bytes .../QSimpleUpdater/doc/output/html/tab_b.png | Bin 0 -> 169 bytes .../QSimpleUpdater/doc/output/html/tab_h.png | Bin 0 -> 177 bytes .../QSimpleUpdater/doc/output/html/tab_s.png | Bin 0 -> 184 bytes LedOK/QSimpleUpdater/doc/output/html/tabs.css | 60 + .../etc/resources/qsimpleupdater.qrc | 5 + LedOK/QSimpleUpdater/etc/resources/update.png | Bin 0 -> 13803 bytes .../etc/screenshots/download-complete.png | Bin 0 -> 49234 bytes .../etc/screenshots/downloading.png | Bin 0 -> 52544 bytes .../etc/screenshots/tutorial.png | Bin 0 -> 95069 bytes .../etc/scripts/format-code.bat | 20 + .../QSimpleUpdater/etc/scripts/format-code.sh | 2 + LedOK/QSimpleUpdater/include/QSimpleUpdater.h | 119 + LedOK/QSimpleUpdater/src/Downloader.cpp | 483 + LedOK/QSimpleUpdater/src/Downloader.h | 101 + LedOK/QSimpleUpdater/src/Downloader.ui | 214 + LedOK/QSimpleUpdater/src/QSimpleUpdater.cpp | 433 + LedOK/QSimpleUpdater/src/Updater.cpp | 635 + LedOK/QSimpleUpdater/src/Updater.h | 156 + LedOK/QSimpleUpdater/tests/Test_Downloader.h | 34 + .../tests/Test_QSimpleUpdater.h | 34 + LedOK/QSimpleUpdater/tests/Test_Updater.h | 34 + LedOK/QSimpleUpdater/tests/Tests.pro | 36 + LedOK/QSimpleUpdater/tests/main.cpp | 41 + LedOK/QSimpleUpdater/tutorial/COPYING | 13 + .../tutorial/definitions/README.md | 12 + .../tutorial/definitions/updates.json | 39 + .../tutorial/download/YesItWorks.jpg | Bin 0 -> 60819 bytes LedOK/QSimpleUpdater/tutorial/src/Window.cpp | 137 + LedOK/QSimpleUpdater/tutorial/src/Window.h | 40 + LedOK/QSimpleUpdater/tutorial/src/Window.ui | 222 + LedOK/QSimpleUpdater/tutorial/src/main.cpp | 21 + LedOK/QSimpleUpdater/tutorial/tutorial.pro | 18 + LedOK/Xanadu Express.manifest | 10 + LedOK/backup/mprogrammanager.cpp | 415 + LedOK/backup/mprogrammanager.h | 73 + LedOK/ccrashstack.cpp | 410 + LedOK/ccrashstack.h | 24 + LedOK/communication/hpptclient.cpp | 334 + LedOK/communication/hpptclient.h | 64 + LedOK/communication/network.cpp | 901 ++ LedOK/communication/network.h | 86 + LedOK/communication/taserialthread.cpp | 149 + LedOK/communication/taserialthread.h | 36 + LedOK/ffmpeg-4.2.2-win32-dev/LICENSE.txt | 674 + LedOK/ffmpeg-4.2.2-win32-dev/README.txt | 107 + LedOK/ffmpeg-4.2.2-win32-dev/examples/README | 23 + .../examples/avio_dir_cmd.c | 178 + .../examples/avio_reading.c | 134 + .../examples/decode_audio.c | 184 + .../examples/decode_video.c | 186 + .../examples/demuxing_decoding.c | 390 + .../examples/encode_audio.c | 238 + .../examples/encode_video.c | 197 + .../examples/extract_mvs.c | 178 + .../examples/filter_audio.c | 363 + .../examples/filtering_audio.c | 292 + .../examples/filtering_video.c | 291 + .../examples/http_multiclient.c | 156 + .../examples/hw_decode.c | 252 + .../examples/metadata.c | 60 + .../ffmpeg-4.2.2-win32-dev/examples/muxing.c | 667 + .../ffmpeg-4.2.2-win32-dev/examples/qsvdec.c | 271 + .../examples/remuxing.c | 191 + .../examples/resampling_audio.c | 214 + .../examples/scaling_video.c | 140 + .../examples/transcode_aac.c | 885 ++ .../examples/transcoding.c | 620 + .../examples/vaapi_encode.c | 224 + .../examples/vaapi_transcode.c | 306 + .../include/libavcodec/ac3_parser.h | 36 + .../include/libavcodec/adts_parser.h | 37 + .../include/libavcodec/avcodec.h | 6228 +++++++++ .../include/libavcodec/avdct.h | 84 + .../include/libavcodec/avfft.h | 118 + .../include/libavcodec/d3d11va.h | 112 + .../include/libavcodec/dirac.h | 131 + .../include/libavcodec/dv_profile.h | 83 + .../include/libavcodec/dxva2.h | 93 + .../include/libavcodec/jni.h | 46 + .../include/libavcodec/mediacodec.h | 101 + .../include/libavcodec/qsv.h | 107 + .../include/libavcodec/vaapi.h | 86 + .../include/libavcodec/vdpau.h | 176 + .../include/libavcodec/version.h | 140 + .../include/libavcodec/videotoolbox.h | 127 + .../include/libavcodec/vorbis_parser.h | 74 + .../include/libavcodec/xvmc.h | 170 + .../include/libavdevice/avdevice.h | 514 + .../include/libavdevice/version.h | 50 + .../include/libavfilter/avfilter.h | 1168 ++ .../include/libavfilter/buffersink.h | 165 + .../include/libavfilter/buffersrc.h | 209 + .../include/libavfilter/version.h | 66 + .../include/libavformat/avformat.h | 3092 +++++ .../include/libavformat/avio.h | 861 ++ .../include/libavformat/version.h | 114 + .../include/libavutil/adler32.h | 60 + .../include/libavutil/aes.h | 65 + .../include/libavutil/aes_ctr.h | 88 + .../include/libavutil/attributes.h | 167 + .../include/libavutil/audio_fifo.h | 187 + .../include/libavutil/avassert.h | 75 + .../include/libavutil/avconfig.h | 6 + .../include/libavutil/avstring.h | 413 + .../include/libavutil/avutil.h | 365 + .../include/libavutil/base64.h | 72 + .../include/libavutil/blowfish.h | 82 + .../include/libavutil/bprint.h | 219 + .../include/libavutil/bswap.h | 109 + .../include/libavutil/buffer.h | 291 + .../include/libavutil/camellia.h | 70 + .../include/libavutil/cast5.h | 80 + .../include/libavutil/channel_layout.h | 232 + .../include/libavutil/common.h | 560 + .../include/libavutil/cpu.h | 130 + .../include/libavutil/crc.h | 100 + .../include/libavutil/des.h | 77 + .../include/libavutil/dict.h | 200 + .../include/libavutil/display.h | 114 + .../include/libavutil/downmix_info.h | 115 + .../include/libavutil/encryption_info.h | 205 + .../include/libavutil/error.h | 126 + .../include/libavutil/eval.h | 113 + .../include/libavutil/ffversion.h | 5 + .../include/libavutil/fifo.h | 179 + .../include/libavutil/file.h | 71 + .../include/libavutil/frame.h | 971 ++ .../include/libavutil/hash.h | 269 + .../include/libavutil/hdr_dynamic_metadata.h | 343 + .../include/libavutil/hmac.h | 100 + .../include/libavutil/hwcontext.h | 584 + .../include/libavutil/hwcontext_cuda.h | 52 + .../include/libavutil/hwcontext_d3d11va.h | 169 + .../include/libavutil/hwcontext_drm.h | 169 + .../include/libavutil/hwcontext_dxva2.h | 75 + .../include/libavutil/hwcontext_mediacodec.h | 36 + .../include/libavutil/hwcontext_qsv.h | 53 + .../include/libavutil/hwcontext_vaapi.h | 117 + .../include/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + .../include/libavutil/imgutils.h | 277 + .../include/libavutil/intfloat.h | 77 + .../include/libavutil/intreadwrite.h | 644 + .../include/libavutil/lfg.h | 80 + .../include/libavutil/log.h | 362 + .../include/libavutil/lzo.h | 66 + .../include/libavutil/macros.h | 50 + .../libavutil/mastering_display_metadata.h | 128 + .../include/libavutil/mathematics.h | 242 + .../include/libavutil/md5.h | 98 + .../include/libavutil/mem.h | 700 + .../include/libavutil/motion_vector.h | 57 + .../include/libavutil/murmur3.h | 120 + .../include/libavutil/opt.h | 865 ++ .../include/libavutil/parseutils.h | 193 + .../include/libavutil/pixdesc.h | 440 + .../include/libavutil/pixelutils.h | 52 + .../include/libavutil/pixfmt.h | 552 + .../include/libavutil/random_seed.h | 43 + .../include/libavutil/rational.h | 214 + .../include/libavutil/rc4.h | 66 + .../include/libavutil/replaygain.h | 50 + .../include/libavutil/ripemd.h | 87 + .../include/libavutil/samplefmt.h | 272 + .../include/libavutil/sha.h | 95 + .../include/libavutil/sha512.h | 97 + .../include/libavutil/spherical.h | 232 + .../include/libavutil/stereo3d.h | 233 + .../include/libavutil/tea.h | 71 + .../include/libavutil/threadmessage.h | 115 + .../include/libavutil/time.h | 56 + .../include/libavutil/timecode.h | 140 + .../include/libavutil/timestamp.h | 78 + .../include/libavutil/tree.h | 138 + .../include/libavutil/twofish.h | 70 + .../include/libavutil/tx.h | 81 + .../include/libavutil/version.h | 139 + .../include/libavutil/xtea.h | 94 + .../include/libpostproc/postprocess.h | 107 + .../include/libpostproc/version.h | 45 + .../include/libswresample/swresample.h | 579 + .../include/libswresample/version.h | 45 + .../include/libswscale/swscale.h | 336 + .../include/libswscale/version.h | 53 + .../ffmpeg-4.2.2-win32-dev/lib/avcodec-58.def | 238 + .../lib/avdevice-58.def | 19 + .../ffmpeg-4.2.2-win32-dev/lib/avfilter-7.def | 71 + .../lib/avformat-58.def | 175 + .../ffmpeg-4.2.2-win32-dev/lib/avutil-56.def | 536 + .../lib/postproc-55.def | 11 + .../lib/swresample-3.def | 24 + .../ffmpeg-4.2.2-win32-dev/lib/swscale-5.def | 35 + LedOK/globaldefine.cpp | 218 + LedOK/globaldefine.h | 345 + LedOK/icons.qrc | 138 + LedOK/images.qrc | 5 + LedOK/importbninprogramdlg.cpp | 14 + LedOK/importbninprogramdlg.h | 22 + LedOK/importbninprogramdlg.ui | 68 + LedOK/importprogramdlg.ui | 80 + LedOK/include/JlCompress.h | 197 + LedOK/include/ioapi.h | 207 + LedOK/include/minizip_crypt.h | 135 + LedOK/include/quaadler32.h | 54 + LedOK/include/quachecksum32.h | 78 + LedOK/include/quacrc32.h | 50 + LedOK/include/quagzipfile.h | 108 + LedOK/include/quaziodevice.h | 102 + LedOK/include/quazip.h | 571 + LedOK/include/quazip_global.h | 59 + LedOK/include/quazipdir.h | 223 + LedOK/include/quazipfile.h | 456 + LedOK/include/quazipfileinfo.h | 178 + LedOK/include/quazipnewinfo.h | 207 + LedOK/include/unzip.h | 458 + LedOK/include/vlc/deprecated.h | 489 + LedOK/include/vlc/libvlc.h | 580 + LedOK/include/vlc/libvlc_dialog.h | 241 + LedOK/include/vlc/libvlc_events.h | 296 + LedOK/include/vlc/libvlc_media.h | 893 ++ LedOK/include/vlc/libvlc_media_discoverer.h | 188 + LedOK/include/vlc/libvlc_media_library.h | 96 + LedOK/include/vlc/libvlc_media_list.h | 202 + LedOK/include/vlc/libvlc_media_list_player.h | 239 + LedOK/include/vlc/libvlc_media_player.h | 2091 +++ .../include/vlc/libvlc_renderer_discoverer.h | 255 + LedOK/include/vlc/libvlc_version.h | 55 + LedOK/include/vlc/libvlc_vlm.h | 342 + LedOK/include/vlc/plugins/vlc_about.h | 1525 +++ LedOK/include/vlc/plugins/vlc_access.h | 81 + LedOK/include/vlc/plugins/vlc_actions.h | 275 + LedOK/include/vlc/plugins/vlc_addons.h | 227 + LedOK/include/vlc/plugins/vlc_aout.h | 409 + LedOK/include/vlc/plugins/vlc_aout_volume.h | 59 + LedOK/include/vlc/plugins/vlc_arrays.h | 627 + LedOK/include/vlc/plugins/vlc_atomic.h | 224 + LedOK/include/vlc/plugins/vlc_avcodec.h | 34 + LedOK/include/vlc/plugins/vlc_bits.h | 269 + LedOK/include/vlc/plugins/vlc_block.h | 626 + LedOK/include/vlc/plugins/vlc_block_helper.h | 369 + LedOK/include/vlc/plugins/vlc_boxes.h | 165 + LedOK/include/vlc/plugins/vlc_charset.h | 291 + LedOK/include/vlc/plugins/vlc_codec.h | 422 + LedOK/include/vlc/plugins/vlc_common.h | 1049 ++ LedOK/include/vlc/plugins/vlc_config.h | 114 + LedOK/include/vlc/plugins/vlc_config_cat.h | 271 + LedOK/include/vlc/plugins/vlc_configuration.h | 237 + LedOK/include/vlc/plugins/vlc_cpu.h | 192 + LedOK/include/vlc/plugins/vlc_demux.h | 525 + LedOK/include/vlc/plugins/vlc_dialog.h | 483 + LedOK/include/vlc/plugins/vlc_epg.h | 120 + LedOK/include/vlc/plugins/vlc_es.h | 668 + LedOK/include/vlc/plugins/vlc_es_out.h | 183 + LedOK/include/vlc/plugins/vlc_events.h | 209 + LedOK/include/vlc/plugins/vlc_filter.h | 470 + LedOK/include/vlc/plugins/vlc_fingerprinter.h | 91 + LedOK/include/vlc/plugins/vlc_fourcc.h | 686 + LedOK/include/vlc/plugins/vlc_fs.h | 294 + LedOK/include/vlc/plugins/vlc_gcrypt.h | 47 + LedOK/include/vlc/plugins/vlc_http.h | 97 + LedOK/include/vlc/plugins/vlc_httpd.h | 152 + LedOK/include/vlc/plugins/vlc_image.h | 81 + LedOK/include/vlc/plugins/vlc_inhibit.h | 54 + LedOK/include/vlc/plugins/vlc_input.h | 703 + LedOK/include/vlc/plugins/vlc_input_item.h | 483 + LedOK/include/vlc/plugins/vlc_interface.h | 332 + LedOK/include/vlc/plugins/vlc_interrupt.h | 238 + LedOK/include/vlc/plugins/vlc_keystore.h | 317 + LedOK/include/vlc/plugins/vlc_main.h | 38 + LedOK/include/vlc/plugins/vlc_md5.h | 59 + LedOK/include/vlc/plugins/vlc_media_library.h | 127 + LedOK/include/vlc/plugins/vlc_memstream.h | 76 + LedOK/include/vlc/plugins/vlc_messages.h | 108 + LedOK/include/vlc/plugins/vlc_meta.h | 165 + LedOK/include/vlc/plugins/vlc_meta_fetcher.h | 38 + LedOK/include/vlc/plugins/vlc_mime.h | 31 + LedOK/include/vlc/plugins/vlc_modules.h | 85 + LedOK/include/vlc/plugins/vlc_mouse.h | 148 + LedOK/include/vlc/plugins/vlc_mtime.h | 78 + LedOK/include/vlc/plugins/vlc_network.h | 299 + LedOK/include/vlc/plugins/vlc_objects.h | 75 + LedOK/include/vlc/plugins/vlc_opengl.h | 121 + LedOK/include/vlc/plugins/vlc_picture.h | 259 + LedOK/include/vlc/plugins/vlc_picture_fifo.h | 89 + LedOK/include/vlc/plugins/vlc_picture_pool.h | 189 + LedOK/include/vlc/plugins/vlc_playlist.h | 443 + LedOK/include/vlc/plugins/vlc_plugin.h | 557 + LedOK/include/vlc/plugins/vlc_probe.h | 69 + LedOK/include/vlc/plugins/vlc_rand.h | 37 + .../vlc/plugins/vlc_renderer_discovery.h | 219 + .../vlc/plugins/vlc_services_discovery.h | 234 + LedOK/include/vlc/plugins/vlc_sout.h | 311 + LedOK/include/vlc/plugins/vlc_spu.h | 105 + LedOK/include/vlc/plugins/vlc_stream.h | 498 + .../vlc/plugins/vlc_stream_extractor.h | 170 + LedOK/include/vlc/plugins/vlc_strings.h | 159 + LedOK/include/vlc/plugins/vlc_subpicture.h | 237 + LedOK/include/vlc/plugins/vlc_text_style.h | 404 + LedOK/include/vlc/plugins/vlc_threads.h | 1083 ++ .../vlc/plugins/vlc_timestamp_helper.h | 101 + LedOK/include/vlc/plugins/vlc_tls.h | 352 + LedOK/include/vlc/plugins/vlc_url.h | 210 + LedOK/include/vlc/plugins/vlc_variables.h | 671 + .../include/vlc/plugins/vlc_video_splitter.h | 158 + LedOK/include/vlc/plugins/vlc_viewpoint.h | 68 + LedOK/include/vlc/plugins/vlc_vlm.h | 368 + LedOK/include/vlc/plugins/vlc_vout.h | 166 + LedOK/include/vlc/plugins/vlc_vout_display.h | 481 + LedOK/include/vlc/plugins/vlc_vout_osd.h | 102 + LedOK/include/vlc/plugins/vlc_vout_window.h | 373 + LedOK/include/vlc/plugins/vlc_xlib.h | 57 + LedOK/include/vlc/plugins/vlc_xml.h | 121 + LedOK/include/vlc/vlc.h | 57 + LedOK/include/zconf.h | 511 + LedOK/include/zip.h | 390 + LedOK/include/zlib.h | 1768 +++ LedOK/jsondecoderloop.cpp | 50 + LedOK/jsondecoderloop.h | 14 + LedOK/languages.qrc | 11 + LedOK/lib/pkgconfig/libvlc.pc | 11 + LedOK/lib/pkgconfig/vlc-plugin.pc | 24 + LedOK/loappconfig.cpp | 54 + LedOK/loappconfig.h | 60 + LedOK/loapptools.cpp | 236 + LedOK/loapptools.h | 48 + LedOK/main.cpp | 132 + LedOK/main.rc | 11 + LedOK/mainwindow.cpp | 632 + LedOK/mainwindow.h | 75 + LedOK/mainwindow.ui | 59 + LedOK/mdevicemanager - 副本.ui | 613 + LedOK/mdevicemanager.cpp | 512 + LedOK/mdevicemanager.h | 72 + LedOK/mdevicemanager.ui | 613 + LedOK/mdevicesetting.cpp | 156 + LedOK/mdevicesetting.h | 43 + LedOK/mdevicesetting.ui | 22 + LedOK/mguangyingpinwidget.cpp | 910 ++ LedOK/mguangyingpinwidget.h | 95 + LedOK/mguangyingpinwidget.ui | 1533 +++ LedOK/mprogrammanager.cpp | 434 + LedOK/mprogrammanager.h | 81 + LedOK/mprogrammanager.ui | 220 + LedOK/mprogrammanagera.cpp | 252 + LedOK/mprogrammanagera.h | 65 + LedOK/mprogrammanagera.ui | 214 + LedOK/mtabwidget.cpp | 172 + LedOK/mtabwidget.h | 50 + LedOK/mtitlebar.cpp | 239 + LedOK/mtitlebar.h | 53 + LedOK/oescreenshot/oeamplifier.cpp | 153 + LedOK/oescreenshot/oeamplifier.h | 93 + LedOK/oescreenshot/oecommonhelper.cpp | 141 + LedOK/oescreenshot/oecommonhelper.h | 128 + LedOK/oescreenshot/oemodelview.cpp | 86 + LedOK/oescreenshot/oemodelview.h | 61 + LedOK/oescreenshot/oescreenshot.cpp | 768 ++ LedOK/oescreenshot/oescreenshot.h | 508 + LedOK/plugins/access/libbluray-j2se-1.0.2.jar | Bin 0 -> 808610 bytes LedOK/publishform.cpp | 14 + LedOK/publishform.h | 22 + LedOK/publishform.ui | 172 + LedOK/qss.qrc | 14 + LedOK/qss/00_Common.css | 241 + LedOK/qss/01_Global.css | 55 + LedOK/qss/10_MainWindow.css | 52 + LedOK/qss/11_MainWindowTab.css | 68 + LedOK/qss/20_DeviceManager.css | 41 + LedOK/qss/21_DeviceSetting.css | 43 + LedOK/qss/30_ProgramManager.css | 58 + LedOK/qss/31_EditProgram.css | 34 + LedOK/qss/32_PageAttr.css | 58 + LedOK/qss/33_EWindow.css | 19 + LedOK/qss1/00_Common.css | 240 + LedOK/qss1/01_Global.css | 54 + LedOK/qss1/10_MainWindow.css | 51 + LedOK/qss1/11_MainWindowTab.css | 67 + LedOK/qss1/20_DeviceManager.css | 41 + LedOK/qss1/21_DeviceSetting.css | 43 + LedOK/qss1/30_ProgramManager.css | 58 + LedOK/qss1/31_EditProgram.css | 44 + LedOK/qss1/32_PageAttr.css | 58 + LedOK/qss1/33_EWindow.css | 18 + LedOK/res/128_128 - 副本.png | Bin 0 -> 6983 bytes LedOK/res/128_128.png | Bin 0 -> 6983 bytes LedOK/res/AdvParam.png | Bin 0 -> 7923 bytes LedOK/res/AdvanceManager_s.png | Bin 0 -> 4023 bytes LedOK/res/AdvanceManager_u.png | Bin 0 -> 3872 bytes LedOK/res/AppSetting.png | Bin 0 -> 921 bytes LedOK/res/AppSettingTip.png | Bin 0 -> 3691 bytes LedOK/res/ArrowDropDown.png | Bin 0 -> 239 bytes LedOK/res/ArrowDropUp.png | Bin 0 -> 234 bytes LedOK/res/CheckBoxChecked - 副本 - 副本.png | Bin 0 -> 617 bytes LedOK/res/CheckBoxChecked.png | Bin 0 -> 479 bytes LedOK/res/CheckBoxChecked24.png | Bin 0 -> 698 bytes LedOK/res/CheckBoxUnchecked - 副本 - 副本.png | Bin 0 -> 177 bytes LedOK/res/CheckBoxUnchecked.png | Bin 0 -> 241 bytes LedOK/res/CheckBoxUnchecked24.png | Bin 0 -> 280 bytes LedOK/res/DeviceManager/Add.png | Bin 0 -> 215 bytes LedOK/res/DeviceManager/DeviceNum_All.png | Bin 0 -> 1283 bytes LedOK/res/DeviceManager/DeviceNum_Offline.png | Bin 0 -> 1490 bytes LedOK/res/DeviceManager/DeviceNum_Online.png | Bin 0 -> 1520 bytes LedOK/res/DeviceManager/DeviceNum_Unlogin.png | Bin 0 -> 1562 bytes LedOK/res/DeviceManager/Equal.png | Bin 0 -> 118 bytes LedOK/res/DeviceManager/FlashArea_s.png | Bin 0 -> 2005 bytes LedOK/res/DeviceManager/FlashArea_u.png | Bin 0 -> 1763 bytes LedOK/res/DeviceManager/FlashArrow.png | Bin 0 -> 159 bytes LedOK/res/DeviceManager/FlashArrow_s.png | Bin 0 -> 3250 bytes LedOK/res/DeviceManager/FlashArrow_u.png | Bin 0 -> 3252 bytes LedOK/res/DeviceManager/Lock - 副本.png | Bin 0 -> 30357 bytes LedOK/res/DeviceManager/Lock.png | Bin 0 -> 4231 bytes LedOK/res/DeviceManager/O_Offline.png | Bin 0 -> 292 bytes LedOK/res/DeviceManager/O_Online.png | Bin 0 -> 316 bytes LedOK/res/DeviceManager/O_Unlogin.png | Bin 0 -> 332 bytes LedOK/res/DeviceManager/Transparent.png | Bin 0 -> 2821 bytes LedOK/res/DeviceManager/UnLock - 副本.png | Bin 0 -> 24287 bytes LedOK/res/DeviceManager/UnLock.png | Bin 0 -> 4473 bytes LedOK/res/DeviceManager/bnDetail.png | Bin 0 -> 3311 bytes LedOK/res/DeviceManager/deviceReadbackPic.png | Bin 0 -> 4461 bytes LedOK/res/DeviceManager/图层 4(1).png | Bin 0 -> 627 bytes LedOK/res/DeviceManager/图层 4.png | Bin 0 -> 973 bytes LedOK/res/DeviceManager/图层 5 拷贝.png | Bin 0 -> 206 bytes LedOK/res/DeviceManager/图层 5.png | Bin 0 -> 203 bytes LedOK/res/DeviceManager/矩形 20.png | Bin 0 -> 114 bytes LedOK/res/DeviceManager_s.png | Bin 0 -> 3697 bytes LedOK/res/DeviceManager_u.png | Bin 0 -> 3674 bytes LedOK/res/DeviceSetting_s.png | Bin 0 -> 4055 bytes LedOK/res/DeviceSetting_u.png | Bin 0 -> 4160 bytes LedOK/res/GuangYingPin_s.png | Bin 0 -> 4023 bytes LedOK/res/GuangYingPin_u.png | Bin 0 -> 3872 bytes LedOK/res/Hdmi.png | Bin 0 -> 5685 bytes LedOK/res/Logo - 副本.ico | Bin 0 -> 67646 bytes LedOK/res/Logo - 副本.png | Bin 0 -> 5244 bytes LedOK/res/Logo.icns | Bin 0 -> 142538 bytes LedOK/res/Logo.ico | Bin 0 -> 67646 bytes LedOK/res/Logo.png | Bin 0 -> 5244 bytes LedOK/res/Logo1.png | Bin 0 -> 5668 bytes LedOK/res/Logo2.png | Bin 0 -> 5152 bytes LedOK/res/Logo3.ico | Bin 0 -> 67646 bytes LedOK/res/Logo3.png | Bin 0 -> 5873 bytes LedOK/res/Logo44.ico | Bin 0 -> 67646 bytes LedOK/res/Lora.png | Bin 0 -> 7704 bytes LedOK/res/Lora.psd | Bin 0 -> 50845 bytes .../res/ProgramManager/EditProgram/AClock.png | Bin 0 -> 1156 bytes .../EditProgram/AClock/AClock/Aclock1.png | Bin 0 -> 121264 bytes .../EditProgram/AClock/AClock/Aclock10.png | Bin 0 -> 71759 bytes .../EditProgram/AClock/AClock/Aclock2.png | Bin 0 -> 323913 bytes .../EditProgram/AClock/AClock/Aclock3.png | Bin 0 -> 84814 bytes .../EditProgram/AClock/AClock/Aclock4.png | Bin 0 -> 114215 bytes .../EditProgram/AClock/AClock/Aclock5.png | Bin 0 -> 104043 bytes .../EditProgram/AClock/AClock/Aclock6.png | Bin 0 -> 89846 bytes .../EditProgram/AClock/AClock/Aclock7.png | Bin 0 -> 215941 bytes .../EditProgram/AClock/AClock/Aclock9.png | Bin 0 -> 92283 bytes .../EditProgram/AClock/AClock/lang_zh-cn.xml | 459 + .../AClock/AClock/language_zh-cn.xml | 907 ++ .../EditProgram/AClock/Aclock1.jpg | Bin 0 -> 30634 bytes .../EditProgram/AClock/Aclock10.jpg | Bin 0 -> 24229 bytes .../EditProgram/AClock/Aclock2.jpg | Bin 0 -> 50104 bytes .../EditProgram/AClock/Aclock3.jpg | Bin 0 -> 26021 bytes .../EditProgram/AClock/Aclock4.jpg | Bin 0 -> 182501 bytes .../EditProgram/AClock/Aclock5.jpg | Bin 0 -> 80020 bytes .../EditProgram/AClock/Aclock6.jpg | Bin 0 -> 45110 bytes .../EditProgram/AClock/Aclock7.jpg | Bin 0 -> 36848 bytes .../EditProgram/AClock/Aclock8.jpg | Bin 0 -> 17762 bytes LedOK/res/ProgramManager/EditProgram/Add.png | Bin 0 -> 103 bytes .../ProgramManager/EditProgram/AddPlan.png | Bin 0 -> 760 bytes .../EditProgram/ArrayBottom.png | Bin 0 -> 109 bytes .../EditProgram/ArrayHCenter.png | Bin 0 -> 119 bytes .../ProgramManager/EditProgram/ArrayLeft.png | Bin 0 -> 114 bytes .../ProgramManager/EditProgram/ArrayRight.png | Bin 0 -> 116 bytes .../ProgramManager/EditProgram/ArrayTop.png | Bin 0 -> 105 bytes .../EditProgram/ArrayVCenter.png | Bin 0 -> 117 bytes .../res/ProgramManager/EditProgram/Audio.png | Bin 0 -> 4232 bytes .../res/ProgramManager/EditProgram/Audio.psd | Bin 0 -> 33144 bytes .../res/ProgramManager/EditProgram/Clean.png | Bin 0 -> 1016 bytes .../ProgramManager/EditProgram/CleanPlan.png | Bin 0 -> 777 bytes .../ProgramManager/EditProgram/ColorText.png | Bin 0 -> 1679 bytes LedOK/res/ProgramManager/EditProgram/Copy.png | Bin 0 -> 113 bytes LedOK/res/ProgramManager/EditProgram/Cut.png | Bin 0 -> 127 bytes .../res/ProgramManager/EditProgram/DClock.png | Bin 0 -> 448 bytes .../ProgramManager/EditProgram/DateSelect.png | Bin 0 -> 2266 bytes .../EditProgram/DateSelect_e.png | Bin 0 -> 1234 bytes .../EditProgram/DateSelect_enable.png | Bin 0 -> 1774 bytes .../res/ProgramManager/EditProgram/Delete.png | Bin 0 -> 311 bytes .../EditProgram/DocAlignHC_s.png | Bin 0 -> 143 bytes .../EditProgram/DocAlignHC_u.png | Bin 0 -> 148 bytes .../EditProgram/DocAlignHL_s.png | Bin 0 -> 140 bytes .../EditProgram/DocAlignHL_u.png | Bin 0 -> 144 bytes .../EditProgram/DocAlignHR_s.png | Bin 0 -> 141 bytes .../EditProgram/DocAlignHR_u.png | Bin 0 -> 142 bytes .../EditProgram/DocAlignVB_s.png | Bin 0 -> 137 bytes .../EditProgram/DocAlignVB_u.png | Bin 0 -> 140 bytes .../EditProgram/DocAlignVC_s.png | Bin 0 -> 137 bytes .../EditProgram/DocAlignVC_u.png | Bin 0 -> 141 bytes .../EditProgram/DocAlignVT_s.png | Bin 0 -> 136 bytes .../EditProgram/DocAlignVT_u.png | Bin 0 -> 140 bytes .../ProgramManager/EditProgram/FontBold_s.png | Bin 0 -> 407 bytes .../ProgramManager/EditProgram/FontBold_u.png | Bin 0 -> 369 bytes .../EditProgram/FontItalics_s.png | Bin 0 -> 340 bytes .../EditProgram/FontItalics_u.png | Bin 0 -> 315 bytes .../EditProgram/FontUnderline_s.png | Bin 0 -> 333 bytes .../EditProgram/FontUnderline_u.png | Bin 0 -> 305 bytes LedOK/res/ProgramManager/EditProgram/Gif.png | Bin 0 -> 887 bytes .../res/ProgramManager/EditProgram/GoDown.png | Bin 0 -> 344 bytes LedOK/res/ProgramManager/EditProgram/GoUp.png | Bin 0 -> 362 bytes .../EditProgram/LayerBottom.png | Bin 0 -> 119 bytes .../ProgramManager/EditProgram/LayerDown.png | Bin 0 -> 106 bytes .../ProgramManager/EditProgram/LayerTop.png | Bin 0 -> 113 bytes .../ProgramManager/EditProgram/LayerUp.png | Bin 0 -> 104 bytes .../res/ProgramManager/EditProgram/Movie.png | Bin 0 -> 494 bytes .../res/ProgramManager/EditProgram/Office.png | Bin 0 -> 1017 bytes .../res/ProgramManager/EditProgram/Photo.png | Bin 0 -> 716 bytes .../EditProgram/RadioChecked.png | Bin 0 -> 820 bytes .../EditProgram/RadioUnchecked.png | Bin 0 -> 616 bytes LedOK/res/ProgramManager/EditProgram/Rss.png | Bin 0 -> 840 bytes LedOK/res/ProgramManager/EditProgram/Save.png | Bin 0 -> 401 bytes .../res/ProgramManager/EditProgram/SaveAs.png | Bin 0 -> 420 bytes .../ProgramManager/EditProgram/ScaleDown.png | Bin 0 -> 514 bytes .../ProgramManager/EditProgram/ScaleOrg.png | Bin 0 -> 308 bytes .../ProgramManager/EditProgram/ScaleUp.png | Bin 0 -> 522 bytes LedOK/res/ProgramManager/EditProgram/Send.png | Bin 0 -> 1318 bytes .../ProgramManager/EditProgram/Setting.png | Bin 0 -> 2607 bytes LedOK/res/ProgramManager/EditProgram/Temp.png | Bin 0 -> 1314 bytes LedOK/res/ProgramManager/EditProgram/Text.png | Bin 0 -> 403 bytes .../ProgramManager/EditProgram/TileFull.png | Bin 0 -> 122 bytes .../res/ProgramManager/EditProgram/TileH.png | Bin 0 -> 252 bytes .../res/ProgramManager/EditProgram/TileV.png | Bin 0 -> 393 bytes .../res/ProgramManager/EditProgram/Timer.png | Bin 0 -> 1463 bytes .../ProgramManager/EditProgram/Weather.png | Bin 0 -> 1347 bytes .../res/ProgramManager/EditProgram/Window.png | Bin 0 -> 423 bytes .../res/ProgramManager/EditProgram/check.png | Bin 0 -> 880 bytes .../EditProgram/preview - 副本.png | Bin 0 -> 1613 bytes .../ProgramManager/EditProgram/preview.png | Bin 0 -> 2904 bytes .../EditProgram/previewStop.png | Bin 0 -> 3515 bytes .../ProgramManager/EditProgram/uncheck.png | Bin 0 -> 189 bytes LedOK/res/ProgramManager/EditProgram/勾.png | Bin 0 -> 491 bytes .../ProgramManager/EditProgram/图层 11.png | Bin 0 -> 385 bytes .../ProgramManager/EditProgram/圆角矩形 3.png | Bin 0 -> 177 bytes .../EditProgram/圆角矩形 30.png | Bin 0 -> 1124 bytes .../ProgramManager/EditProgram/矩形 17.png | Bin 0 -> 89 bytes .../ProgramManager/EditProgram/矩形 18.png | Bin 0 -> 75 bytes .../EditProgram/矩形 51 拷贝.png | Bin 0 -> 407 bytes .../ProgramManager/EditProgram/矩形 57.png | Bin 0 -> 114 bytes .../res/ProgramManager/EditProgram/组 37.png | Bin 0 -> 109 bytes .../res/ProgramManager/EditProgram/组 41.png | Bin 0 -> 809 bytes .../ProgramManager/EditProgram/组 57(1).png | Bin 0 -> 182 bytes LedOK/res/ProgramManager/bnExport_s.png | Bin 0 -> 756 bytes LedOK/res/ProgramManager/bnExport_u.png | Bin 0 -> 1142 bytes LedOK/res/ProgramManager/bnSearch.png | Bin 0 -> 1050 bytes LedOK/res/ProgramManager/bnSend_s.png | Bin 0 -> 874 bytes LedOK/res/ProgramManager/bnSend_u.png | Bin 0 -> 1380 bytes LedOK/res/ProgramManager_s.png | Bin 0 -> 3690 bytes LedOK/res/ProgramManager_u.png | Bin 0 -> 3571 bytes LedOK/res/RadioChecked.png | Bin 0 -> 343 bytes LedOK/res/Warning.png | Bin 0 -> 690 bytes LedOK/res/WndClose.png | Bin 0 -> 385 bytes LedOK/res/WndMaximize.png | Bin 0 -> 89 bytes LedOK/res/WndMinimize.png | Bin 0 -> 75 bytes LedOK/res/apk.png | Bin 0 -> 8953 bytes LedOK/res/backup/AdvanceManager_s.png | Bin 0 -> 2054 bytes LedOK/res/backup/AdvanceManager_u.png | Bin 0 -> 2146 bytes LedOK/res/backup/Checked11.png | Bin 0 -> 473 bytes LedOK/res/backup/DeviceManager_s.png | Bin 0 -> 1775 bytes LedOK/res/backup/DeviceManager_u.png | Bin 0 -> 1936 bytes LedOK/res/backup/DeviceSetting_s.png | Bin 0 -> 2669 bytes LedOK/res/backup/DeviceSetting_u.png | Bin 0 -> 2697 bytes LedOK/res/backup/ProgramManager_s.png | Bin 0 -> 1289 bytes LedOK/res/backup/ProgramManager_u.png | Bin 0 -> 1224 bytes LedOK/res/backup/Warning.png | Bin 0 -> 602 bytes LedOK/res/bnBrightnessAdjustMent_s.png | Bin 0 -> 8285 bytes LedOK/res/bnBrightnessAdjustMent_u.png | Bin 0 -> 1486 bytes LedOK/res/bnNetConfig_s.png | Bin 0 -> 5442 bytes LedOK/res/bnNetConfig_u.png | Bin 0 -> 5442 bytes LedOK/res/bnPowerControl_s.png | Bin 0 -> 9201 bytes LedOK/res/bnPowerControl_u.png | Bin 0 -> 9201 bytes LedOK/res/bnVerifyClock_s.png | Bin 0 -> 4720 bytes LedOK/res/bnVerifyClock_u.png | Bin 0 -> 4720 bytes LedOK/res/encrypt.png | Bin 0 -> 5663 bytes LedOK/res/ledset.png | Bin 0 -> 3973 bytes LedOK/res/loop.png | Bin 0 -> 20108 bytes LedOK/res/next.png | Bin 0 -> 10665 bytes LedOK/res/next.psd | Bin 0 -> 114811 bytes LedOK/res/previous.png | Bin 0 -> 13283 bytes LedOK/res/reddot.png | Bin 0 -> 2879 bytes LedOK/res/splash.png | Bin 0 -> 96145 bytes LedOK/res/success - 副本.png | Bin 0 -> 30344 bytes LedOK/res/success.png | Bin 0 -> 15750 bytes LedOK/res/test.png | Bin 0 -> 5811 bytes LedOK/res/test1.png | Bin 0 -> 7977 bytes LedOK/res/tip.png | Bin 0 -> 12377 bytes LedOK/res/true.jpg | Bin 0 -> 47901 bytes LedOK/res/volume.png | Bin 0 -> 6206 bytes LedOK/res/废弃/128Logo.png | Bin 0 -> 17726 bytes LedOK/res/废弃/128x128logo.png | Bin 0 -> 9690 bytes LedOK/res/废弃/AdvParam.psd | Bin 0 -> 52643 bytes LedOK/res/废弃/Logo2 (2).ico | Bin 0 -> 67646 bytes LedOK/res/废弃/Logo2.ico | Bin 0 -> 67646 bytes LedOK/res/废弃/Logo2.png | Bin 0 -> 3405 bytes LedOK/res/废弃/未标题-1.psd | Bin 0 -> 108554 bytes LedOK/res/资源 6@10x.png | Bin 0 -> 41929 bytes LedOK/sdl/include/SDL.h | 136 + LedOK/sdl/include/SDL_assert.h | 291 + LedOK/sdl/include/SDL_atomic.h | 295 + LedOK/sdl/include/SDL_audio.h | 859 ++ LedOK/sdl/include/SDL_bits.h | 121 + LedOK/sdl/include/SDL_blendmode.h | 123 + LedOK/sdl/include/SDL_clipboard.h | 71 + LedOK/sdl/include/SDL_config.h | 260 + LedOK/sdl/include/SDL_cpuinfo.h | 275 + LedOK/sdl/include/SDL_egl.h | 1676 +++ LedOK/sdl/include/SDL_endian.h | 263 + LedOK/sdl/include/SDL_error.h | 76 + LedOK/sdl/include/SDL_events.h | 792 ++ LedOK/sdl/include/SDL_filesystem.h | 136 + LedOK/sdl/include/SDL_gamecontroller.h | 420 + LedOK/sdl/include/SDL_gesture.h | 87 + LedOK/sdl/include/SDL_haptic.h | 1238 ++ LedOK/sdl/include/SDL_hints.h | 1364 ++ LedOK/sdl/include/SDL_joystick.h | 418 + LedOK/sdl/include/SDL_keyboard.h | 217 + LedOK/sdl/include/SDL_keycode.h | 349 + LedOK/sdl/include/SDL_loadso.h | 81 + LedOK/sdl/include/SDL_log.h | 211 + LedOK/sdl/include/SDL_main.h | 180 + LedOK/sdl/include/SDL_messagebox.h | 146 + LedOK/sdl/include/SDL_metal.h | 91 + LedOK/sdl/include/SDL_mouse.h | 302 + LedOK/sdl/include/SDL_mutex.h | 251 + LedOK/sdl/include/SDL_name.h | 33 + LedOK/sdl/include/SDL_opengl.h | 2183 +++ LedOK/sdl/include/SDL_opengl_glext.h | 11180 ++++++++++++++++ LedOK/sdl/include/SDL_opengles.h | 39 + LedOK/sdl/include/SDL_opengles2.h | 52 + LedOK/sdl/include/SDL_opengles2_gl2.h | 621 + LedOK/sdl/include/SDL_opengles2_gl2ext.h | 2050 +++ LedOK/sdl/include/SDL_opengles2_gl2platform.h | 30 + LedOK/sdl/include/SDL_opengles2_khrplatform.h | 282 + LedOK/sdl/include/SDL_pixels.h | 473 + LedOK/sdl/include/SDL_platform.h | 198 + LedOK/sdl/include/SDL_power.h | 75 + LedOK/sdl/include/SDL_quit.h | 58 + LedOK/sdl/include/SDL_rect.h | 174 + LedOK/sdl/include/SDL_render.h | 1158 ++ LedOK/sdl/include/SDL_revision.h | 2 + LedOK/sdl/include/SDL_rwops.h | 291 + LedOK/sdl/include/SDL_scancode.h | 413 + LedOK/sdl/include/SDL_sensor.h | 251 + LedOK/sdl/include/SDL_shape.h | 144 + LedOK/sdl/include/SDL_stdinc.h | 617 + LedOK/sdl/include/SDL_surface.h | 554 + LedOK/sdl/include/SDL_system.h | 316 + LedOK/sdl/include/SDL_syswm.h | 331 + LedOK/sdl/include/SDL_test.h | 69 + LedOK/sdl/include/SDL_test_assert.h | 105 + LedOK/sdl/include/SDL_test_common.h | 218 + LedOK/sdl/include/SDL_test_compare.h | 69 + LedOK/sdl/include/SDL_test_crc32.h | 124 + LedOK/sdl/include/SDL_test_font.h | 81 + LedOK/sdl/include/SDL_test_fuzzer.h | 384 + LedOK/sdl/include/SDL_test_harness.h | 134 + LedOK/sdl/include/SDL_test_images.h | 78 + LedOK/sdl/include/SDL_test_log.h | 67 + LedOK/sdl/include/SDL_test_md5.h | 129 + LedOK/sdl/include/SDL_test_memory.h | 63 + LedOK/sdl/include/SDL_test_random.h | 115 + LedOK/sdl/include/SDL_thread.h | 361 + LedOK/sdl/include/SDL_timer.h | 115 + LedOK/sdl/include/SDL_touch.h | 102 + LedOK/sdl/include/SDL_types.h | 29 + LedOK/sdl/include/SDL_version.h | 162 + LedOK/sdl/include/SDL_video.h | 1275 ++ LedOK/sdl/include/SDL_vulkan.h | 278 + LedOK/sdl/include/begin_code.h | 170 + LedOK/sdl/include/close_code.h | 40 + LedOK/switchcontrol.cpp | 155 + LedOK/switchcontrol.h | 68 + LedOK/tipdialog.cpp | 481 + LedOK/tipdialog.h | 40 + LedOK/tipdialog.ui | 213 + .../wDevicesManager/controladvparamwidget.cpp | 1935 +++ LedOK/wDevicesManager/controladvparamwidget.h | 108 + .../wDevicesManager/controladvparamwidget.ui | 1123 ++ .../controlbrightnessautowidget.cpp | 494 + .../controlbrightnessautowidget.h | 58 + .../controlbrightnessautowidget.ui | 595 + .../controlbrightnessmanualwidget.cpp | 231 + .../controlbrightnessmanualwidget.h | 47 + .../controlbrightnessmanualwidget.ui | 162 + .../controlbrightnessschedule.cpp | 433 + .../controlbrightnessschedule.h | 62 + .../controlbrightnessschedule.ui | 300 + .../controlbrightnessscheduleedit.cpp | 31 + .../controlbrightnessscheduleedit.h | 29 + .../controlbrightnessscheduleedit.ui | 217 + .../controlbrightnesswidget.cpp | 88 + .../wDevicesManager/controlbrightnesswidget.h | 44 + .../controlbrightnesswidget.ui | 168 + .../wDevicesManager/controlencryptwidget.cpp | 312 + LedOK/wDevicesManager/controlencryptwidget.h | 47 + LedOK/wDevicesManager/controlencryptwidget.ui | 336 + LedOK/wDevicesManager/controlhdmimanual.cpp | 210 + LedOK/wDevicesManager/controlhdmimanual.h | 47 + LedOK/wDevicesManager/controlhdmimanual.ui | 143 + LedOK/wDevicesManager/controlhdmischedule.cpp | 556 + LedOK/wDevicesManager/controlhdmischedule.h | 76 + LedOK/wDevicesManager/controlhdmischedule.ui | 214 + LedOK/wDevicesManager/controlhdmiwidget.cpp | 47 + LedOK/wDevicesManager/controlhdmiwidget.h | 35 + LedOK/wDevicesManager/controlhdmiwidget.ui | 157 + .../controlnetconfigwidget.cpp | 1325 ++ .../wDevicesManager/controlnetconfigwidget.h | 105 + .../wDevicesManager/controlnetconfigwidget.ui | 1344 ++ LedOK/wDevicesManager/controlpowermanual.cpp | 221 + LedOK/wDevicesManager/controlpowermanual.h | 48 + LedOK/wDevicesManager/controlpowermanual.ui | 162 + .../wDevicesManager/controlpowerschedule.cpp | 614 + LedOK/wDevicesManager/controlpowerschedule.h | 77 + LedOK/wDevicesManager/controlpowerschedule.ui | 255 + LedOK/wDevicesManager/controlpowerwidget.cpp | 61 + LedOK/wDevicesManager/controlpowerwidget.h | 36 + LedOK/wDevicesManager/controlpowerwidget.ui | 145 + LedOK/wDevicesManager/controltestwidget.cpp | 573 + LedOK/wDevicesManager/controltestwidget.h | 67 + LedOK/wDevicesManager/controltestwidget.ui | 1016 ++ .../controlverifyclockwidget.cpp | 1074 ++ .../controlverifyclockwidget.h | 62 + .../controlverifyclockwidget.ui | 864 ++ LedOK/wDevicesManager/controlvolumemanual.cpp | 183 + LedOK/wDevicesManager/controlvolumemanual.h | 48 + LedOK/wDevicesManager/controlvolumemanual.ui | 123 + .../wDevicesManager/controlvolumeschedule.cpp | 560 + LedOK/wDevicesManager/controlvolumeschedule.h | 60 + .../wDevicesManager/controlvolumeschedule.ui | 254 + LedOK/wDevicesManager/controlvolumewidget.cpp | 61 + LedOK/wDevicesManager/controlvolumewidget.h | 34 + LedOK/wDevicesManager/controlvolumewidget.ui | 154 + .../wDevicesManager/devicescontrollwidget.cpp | 191 + LedOK/wDevicesManager/devicescontrollwidget.h | 52 + .../wDevicesManager/devicescontrollwidget.ui | 162 + LedOK/wDevicesManager/inputpassworddialog.cpp | 63 + LedOK/wDevicesManager/inputpassworddialog.h | 27 + LedOK/wDevicesManager/inputpassworddialog.ui | 144 + LedOK/wDevicesManager/ledcard.cpp | 62 + LedOK/wDevicesManager/ledcard.h | 60 + LedOK/wDevicesManager/specialdlg.cpp | 82 + LedOK/wDevicesManager/specialdlg.h | 40 + LedOK/wDevicesManager/specialdlg.ui | 287 + LedOK/wDevicesManager/subspecifyip.cpp | 18 + LedOK/wDevicesManager/subspecifyip.h | 22 + LedOK/wDevicesManager/subspecifyip.ui | 90 + LedOK/wDevicesManager/subspecifyiprange.cpp | 14 + LedOK/wDevicesManager/subspecifyiprange.h | 22 + LedOK/wDevicesManager/subspecifyiprange.ui | 112 + LedOK/wDevicesManager/threadupgradeapk.cpp | 183 + LedOK/wDevicesManager/threadupgradeapk.h | 51 + LedOK/wDevicesManager/upgradeapkdialog.cpp | 621 + LedOK/wDevicesManager/upgradeapkdialog.h | 49 + LedOK/wDevicesManager/upgradeapkdialog.ui | 474 + LedOK/wDevicesManager/wdevicesitem.cpp | 1193 ++ LedOK/wDevicesManager/wdevicesitem.h | 109 + LedOK/wDevicesManager/wupgradeapkitem.cpp | 582 + LedOK/wDevicesManager/wupgradeapkitem.h | 105 + LedOK/wProgramManager/mconverter.cpp | 1533 +++ LedOK/wProgramManager/mconverter.h | 93 + LedOK/wProgramManager/sendprogramdialog.cpp | 240 + LedOK/wProgramManager/sendprogramdialog.h | 37 + LedOK/wProgramManager/sendprogramdialog.ui | 252 + .../threadexportprogrampro.cpp | 168 + .../wProgramManager/threadexportprogrampro.h | 32 + LedOK/wProgramManager/threadsendpro.cpp | 526 + LedOK/wProgramManager/threadsendpro.h | 61 + LedOK/wProgramManager/usbdetectdialog.cpp | 163 + LedOK/wProgramManager/usbdetectdialog.h | 31 + LedOK/wProgramManager/usbdetectdialog.ui | 160 + LedOK/wProgramManager/usbdiskfuncdialog.cpp | 38 + LedOK/wProgramManager/usbdiskfuncdialog.h | 27 + LedOK/wProgramManager/usbdiskfuncdialog.ui | 311 + .../include/VLCQtCore/AbstractVideoFrame.h | 81 + .../include/VLCQtCore/AbstractVideoStream.h | 108 + .../include/VLCQtCore/Audio.h | 165 + .../include/VLCQtCore/Common.h | 53 + .../include/VLCQtCore/Config.h | 35 + .../include/VLCQtCore/Enums.h | 368 + .../include/VLCQtCore/Equalizer.h | 141 + .../include/VLCQtCore/Error.h | 61 + .../include/VLCQtCore/Instance.h | 167 + .../include/VLCQtCore/Media.h | 358 + .../include/VLCQtCore/MediaList.h | 164 + .../include/VLCQtCore/MediaListPlayer.h | 178 + .../include/VLCQtCore/MediaPlayer.h | 372 + .../include/VLCQtCore/MetaManager.h | 225 + .../include/VLCQtCore/ModuleDescription.h | 112 + .../include/VLCQtCore/SharedExportCore.h | 30 + .../include/VLCQtCore/Stats.h | 50 + .../include/VLCQtCore/TrackModel.h | 137 + .../include/VLCQtCore/Video.h | 258 + .../include/VLCQtCore/VideoDelegate.h | 64 + .../include/VLCQtCore/VideoFrame.h | 60 + .../include/VLCQtCore/VideoMemoryStream.h | 135 + .../include/VLCQtCore/VideoStream.h | 112 + .../include/VLCQtCore/YUVVideoFrame.h | 58 + .../include/VLCQtQml/Qml.h | 46 + .../include/VLCQtQml/QmlPlayer.h | 552 + .../include/VLCQtQml/QmlSource.h | 90 + .../include/VLCQtQml/QmlVideoObject.h | 153 + .../include/VLCQtQml/QmlVideoOutput.h | 191 + .../include/VLCQtQml/QmlVideoPlayer.h | 621 + .../include/VLCQtQml/SharedExportQml.h | 30 + .../include/VLCQtWidgets/ControlAudio.h | 109 + .../include/VLCQtWidgets/ControlVideo.h | 128 + .../VLCQtWidgets/SharedExportWidgets.h | 30 + .../include/VLCQtWidgets/WidgetSeek.h | 148 + .../include/VLCQtWidgets/WidgetSeekProgress.h | 98 + .../include/VLCQtWidgets/WidgetVideo.h | 260 + .../include/VLCQtWidgets/WidgetVolumeSlider.h | 161 + .../lib/cmake/VLCQt/VLCQtConfig.cmake | 42 + .../lib/cmake/VLCQt/VLCQtConfigVersion.cmake | 31 + .../lib/cmake/VLCQtCore/VLCQtCoreConfig.cmake | 8 + .../VLCQtCore/VLCQtCoreConfigVersion.cmake | 31 + .../VLCQtCore/VLCQtCoreTargets-debug.cmake | 19 + .../VLCQtCore/VLCQtCoreTargets-release.cmake | 19 + .../cmake/VLCQtCore/VLCQtCoreTargets.cmake | 88 + .../lib/cmake/VLCQtQml/VLCQtQmlConfig.cmake | 16 + .../VLCQtQml/VLCQtQmlConfigVersion.cmake | 31 + .../VLCQtQml/VLCQtQmlTargets-debug.cmake | 19 + .../VLCQtQml/VLCQtQmlTargets-release.cmake | 19 + .../lib/cmake/VLCQtQml/VLCQtQmlTargets.cmake | 88 + .../VLCQtWidgets/VLCQtWidgetsConfig.cmake | 15 + .../VLCQtWidgetsConfigVersion.cmake | 31 + .../VLCQtWidgetsTargets-debug.cmake | 19 + .../VLCQtWidgetsTargets-release.cmake | 19 + .../VLCQtWidgets/VLCQtWidgetsTargets.cmake | 88 + .../lib/pkgconfig/libVLCQtCore.pc | 10 + .../lib/pkgconfig/libVLCQtQml.pc | 10 + .../lib/pkgconfig/libVLCQtWidgets.pc | 10 + .../lib/simple-player - 快捷方式.lnk | Bin 0 -> 1450 bytes .../wEditProgram/wElement/backup/etext.cpp | 278 + .../wEditProgram/wElement/backup/etext.h | 105 + .../wEditProgram/wElement/client.h | 1969 +++ .../wEditProgram/wElement/eaclock.cpp | 463 + .../wEditProgram/wElement/eaclock.h | 86 + .../wEditProgram/wElement/eaclockattr.cpp | 176 + .../wEditProgram/wElement/eaclockattr.h | 32 + .../wEditProgram/wElement/eaclockattr.ui | 1026 ++ .../wEditProgram/wElement/eattr.cpp | 8 + .../wEditProgram/wElement/eattr.h | 20 + .../wEditProgram/wElement/eaudio.cpp | 162 + .../wEditProgram/wElement/eaudio.h | 52 + .../wEditProgram/wElement/eaudioattr.cpp | 189 + .../wEditProgram/wElement/eaudioattr.h | 44 + .../wEditProgram/wElement/eaudioattr.ui | 234 + .../wEditProgram/wElement/edclock.cpp | 425 + .../wEditProgram/wElement/edclock.h | 71 + .../wEditProgram/wElement/edclockattr.cpp | 93 + .../wEditProgram/wElement/edclockattr.h | 30 + .../wEditProgram/wElement/edclockattr.ui | 598 + .../wEditProgram/wElement/egif.cpp | 235 + .../wEditProgram/wElement/egif.h | 61 + .../wEditProgram/wElement/egifattr.cpp | 40 + .../wEditProgram/wElement/egifattr.h | 30 + .../wEditProgram/wElement/egifattr.ui | 193 + .../wEditProgram/wElement/emovie.cpp | 774 ++ .../wEditProgram/wElement/emovie.h | 94 + .../wEditProgram/wElement/emovieattr.cpp | 406 + .../wEditProgram/wElement/emovieattr.h | 48 + .../wEditProgram/wElement/emovieattr.ui | 229 + .../wEditProgram/wElement/eobject.cpp | 139 + .../wEditProgram/wElement/eobject.h | 94 + .../wEditProgram/wElement/eobjectattr.cpp | 109 + .../wEditProgram/wElement/eobjectattr.h | 48 + .../wEditProgram/wElement/eobjectattr.ui | 205 + .../wEditProgram/wElement/ephoto.cpp | 512 + .../wEditProgram/wElement/ephoto.h | 74 + .../wEditProgram/wElement/ephotoattr.cpp | 116 + .../wEditProgram/wElement/ephotoattr.h | 30 + .../wEditProgram/wElement/ephotoattr.ui | 309 + .../wEditProgram/wElement/erichedit.h | 74 + .../wEditProgram/wElement/etemp.cpp | 811 ++ .../wEditProgram/wElement/etemp.h | 87 + .../wEditProgram/wElement/etempattr.cpp | 167 + .../wEditProgram/wElement/etempattr.h | 33 + .../wEditProgram/wElement/etempattr.ui | 893 ++ .../wEditProgram/wElement/etext.cpp | 1385 ++ .../wEditProgram/wElement/etext.h | 189 + .../wEditProgram/wElement/etextattr.cpp | 240 + .../wEditProgram/wElement/etextattr.h | 76 + .../wEditProgram/wElement/etextattr.ui | 1036 ++ .../wEditProgram/wElement/etextflipattr.cpp | 157 + .../wEditProgram/wElement/etextflipattr.h | 44 + .../wEditProgram/wElement/etextflipattr.ui | 210 + .../wEditProgram/wElement/etextinput.cpp | 21 + .../wEditProgram/wElement/etextinput.h | 28 + .../wEditProgram/wElement/etextinput.ui | 146 + .../wEditProgram/wElement/etextscrollattr.cpp | 41 + .../wEditProgram/wElement/etextscrollattr.h | 40 + .../wEditProgram/wElement/etextscrollattr.ui | 233 + .../wEditProgram/wElement/etextstaticattr.cpp | 26 + .../wEditProgram/wElement/etextstaticattr.h | 37 + .../wEditProgram/wElement/etextstaticattr.ui | 76 + .../wEditProgram/wElement/etimer.cpp | 177 + .../wEditProgram/wElement/etimer.h | 59 + .../wEditProgram/wElement/etimerattr.cpp | 88 + .../wEditProgram/wElement/etimerattr.h | 31 + .../wEditProgram/wElement/etimerattr.ui | 504 + .../wEditProgram/wElement/eweather.cpp | 220 + .../wEditProgram/wElement/eweather.h | 64 + .../wEditProgram/wElement/eweatherattr.cpp | 190 + .../wEditProgram/wElement/eweatherattr.h | 2610 ++++ .../wEditProgram/wElement/eweatherattr.ui | 792 ++ .../wEditProgram/wElement/ewindow.cpp | 221 + .../wEditProgram/wElement/ewindow.h | 51 + .../wEditProgram/wElement/ewindowattr.cpp | 437 + .../wEditProgram/wElement/ewindowattr.h | 44 + .../wEditProgram/wElement/ewindowattr.ui | 234 + .../wElement/fyxcircleprogress.cpp | 103 + .../wEditProgram/wElement/fyxcircleprogress.h | 50 + .../wEditProgram/wElement/globaldata.cpp | 14 + .../wEditProgram/wElement/globaldata.h | 17 + .../wEditProgram/wElement/glyuvwidget.cpp | 344 + .../wEditProgram/wElement/glyuvwidget.h | 38 + .../wEditProgram/wElement/imagecutwidget.cpp | 786 ++ .../wEditProgram/wElement/imagecutwidget.h | 468 + .../wEditProgram/wElement/imagecutwidget.ui | 19 + .../wElement/mpv/include/client.h | 1969 +++ .../wEditProgram/wElement/mpvplayer.cpp | 126 + .../wEditProgram/wElement/mpvplayer.h | 36 + .../wEditProgram/wElement/qffwidget.cpp | 69 + .../wEditProgram/wElement/qffwidget.h | 45 + .../wEditProgram/wElement/qffwidget.ui | 28 + .../wEditProgram/wElement/videodec.cpp | 84 + .../wEditProgram/wElement/videodec.h | 52 + .../wEditProgram/wElement/videoplayer.cpp | 1395 ++ .../wEditProgram/wElement/videoplayer.h | 153 + .../wEditProgram/wattrview.cpp | 74 + .../wProgramManager/wEditProgram/wattrview.h | 41 + .../wProgramManager/wEditProgram/wattrview.ui | 157 + .../wEditProgram/wdrawingboard.cpp | 1133 ++ .../wEditProgram/wdrawingboard.h | 92 + .../wEditProgram/wmaintoolbar.cpp | 155 + .../wEditProgram/wmaintoolbar.h | 32 + .../wEditProgram/wpageattr.cpp | 135 + .../wProgramManager/wEditProgram/wpageattr.h | 39 + .../wProgramManager/wEditProgram/wpageattr.ui | 271 + .../wEditProgram/wpageitem.cpp | 405 + .../wProgramManager/wEditProgram/wpageitem.h | 68 + .../wEditProgram/wpageitemwidget.cpp | 33 + .../wEditProgram/wpageitemwidget.h | 32 + .../wEditProgram/wpageitemwidget.ui | 106 + .../wEditProgram/wpagelist.cpp | 375 + .../wProgramManager/wEditProgram/wpagelist.h | 67 + .../wEditProgram/wplanitem.cpp | 124 + .../wProgramManager/wEditProgram/wplanitem.h | 45 + .../wProgramManager/wEditProgram/wplanitem.ui | 351 + .../wEditProgram/wplanlist.cpp | 70 + .../wProgramManager/wEditProgram/wplanlist.h | 25 + LedOK/wProgramManager/weditprogram.cpp | 435 + LedOK/wProgramManager/weditprogram.h | 78 + LedOK/wProgramManager/weditprogram.ui | 40 + LedOK/wProgramManager/wexportprogramitem.cpp | 73 + LedOK/wProgramManager/wexportprogramitem.h | 24 + LedOK/wProgramManager/wnewprogram.cpp | 40 + LedOK/wProgramManager/wnewprogram.h | 30 + LedOK/wProgramManager/wnewprogram.ui | 415 + LedOK/wProgramManager/wprogramitem.cpp | 261 + LedOK/wProgramManager/wprogramitem.h | 103 + LedOK/wProgramManager/wprogrampublishitem.cpp | 320 + LedOK/wProgramManager/wprogrampublishitem.h | 77 + LedOK/wProgramManagerA/wprogramitema.cpp | 17 + LedOK/wProgramManagerA/wprogramitema.h | 60 + LedOK/x_uimsgonlyclosebtn.cpp | 14 + LedOK/x_uimsgonlyclosebtn.h | 22 + LedOK/x_uimsgonlyclosebtn.ui | 19 + LedOK/~$BrightnessTable.xlsx | Bin 0 -> 165 bytes SDL2/bin/sdl2-config | 60 + SDL2/include/SDL.h | 136 + SDL2/include/SDL2/SDL.h | 221 + SDL2/include/SDL2/SDL_assert.h | 318 + SDL2/include/SDL2/SDL_atomic.h | 379 + SDL2/include/SDL2/SDL_audio.h | 1185 ++ SDL2/include/SDL2/SDL_bits.h | 126 + SDL2/include/SDL2/SDL_blendmode.h | 200 + SDL2/include/SDL2/SDL_clipboard.h | 89 + SDL2/include/SDL2/SDL_config.h | 299 + SDL2/include/SDL2/SDL_cpuinfo.h | 524 + SDL2/include/SDL2/SDL_egl.h | 1676 +++ SDL2/include/SDL2/SDL_endian.h | 316 + SDL2/include/SDL2/SDL_error.h | 155 + SDL2/include/SDL2/SDL_events.h | 1098 ++ SDL2/include/SDL2/SDL_filesystem.h | 145 + SDL2/include/SDL2/SDL_gamecontroller.h | 870 ++ SDL2/include/SDL2/SDL_gesture.h | 117 + SDL2/include/SDL2/SDL_haptic.h | 1320 ++ SDL2/include/SDL2/SDL_hints.h | 1840 +++ SDL2/include/SDL2/SDL_joystick.h | 821 ++ SDL2/include/SDL2/SDL_keyboard.h | 294 + SDL2/include/SDL2/SDL_keycode.h | 351 + SDL2/include/SDL2/SDL_loadso.h | 109 + SDL2/include/SDL2/SDL_locale.h | 101 + SDL2/include/SDL2/SDL_log.h | 376 + SDL2/include/SDL2/SDL_main.h | 186 + SDL2/include/SDL2/SDL_messagebox.h | 191 + SDL2/include/SDL2/SDL_metal.h | 104 + SDL2/include/SDL2/SDL_misc.h | 79 + SDL2/include/SDL2/SDL_mouse.h | 432 + SDL2/include/SDL2/SDL_mutex.h | 435 + SDL2/include/SDL2/SDL_name.h | 33 + SDL2/include/SDL2/SDL_opengl.h | 2183 +++ SDL2/include/SDL2/SDL_opengl_glext.h | 11180 ++++++++++++++++ SDL2/include/SDL2/SDL_opengles.h | 39 + SDL2/include/SDL2/SDL_opengles2.h | 52 + SDL2/include/SDL2/SDL_opengles2_gl2.h | 621 + SDL2/include/SDL2/SDL_opengles2_gl2ext.h | 2050 +++ SDL2/include/SDL2/SDL_opengles2_gl2platform.h | 30 + SDL2/include/SDL2/SDL_opengles2_khrplatform.h | 282 + SDL2/include/SDL2/SDL_pixels.h | 613 + SDL2/include/SDL2/SDL_platform.h | 233 + SDL2/include/SDL2/SDL_power.h | 86 + SDL2/include/SDL2/SDL_quit.h | 58 + SDL2/include/SDL2/SDL_rect.h | 218 + SDL2/include/SDL2/SDL_render.h | 1625 +++ SDL2/include/SDL2/SDL_revision.h | 2 + SDL2/include/SDL2/SDL_rwops.h | 412 + SDL2/include/SDL2/SDL_scancode.h | 413 + SDL2/include/SDL2/SDL_sensor.h | 271 + SDL2/include/SDL2/SDL_shape.h | 147 + SDL2/include/SDL2/SDL_stdinc.h | 694 + SDL2/include/SDL2/SDL_surface.h | 887 ++ SDL2/include/SDL2/SDL_system.h | 475 + SDL2/include/SDL2/SDL_syswm.h | 378 + SDL2/include/SDL2/SDL_test.h | 69 + SDL2/include/SDL2/SDL_test_assert.h | 105 + SDL2/include/SDL2/SDL_test_common.h | 230 + SDL2/include/SDL2/SDL_test_compare.h | 69 + SDL2/include/SDL2/SDL_test_crc32.h | 124 + SDL2/include/SDL2/SDL_test_font.h | 81 + SDL2/include/SDL2/SDL_test_fuzzer.h | 386 + SDL2/include/SDL2/SDL_test_harness.h | 134 + SDL2/include/SDL2/SDL_test_images.h | 78 + SDL2/include/SDL2/SDL_test_log.h | 67 + SDL2/include/SDL2/SDL_test_md5.h | 129 + SDL2/include/SDL2/SDL_test_memory.h | 63 + SDL2/include/SDL2/SDL_test_random.h | 115 + SDL2/include/SDL2/SDL_thread.h | 454 + SDL2/include/SDL2/SDL_timer.h | 172 + SDL2/include/SDL2/SDL_touch.h | 138 + SDL2/include/SDL2/SDL_types.h | 29 + SDL2/include/SDL2/SDL_version.h | 172 + SDL2/include/SDL2/SDL_video.h | 1901 +++ SDL2/include/SDL2/SDL_vulkan.h | 213 + SDL2/include/SDL2/begin_code.h | 166 + SDL2/include/SDL2/close_code.h | 40 + SDL2/include/SDL_assert.h | 291 + SDL2/include/SDL_atomic.h | 295 + SDL2/include/SDL_audio.h | 859 ++ SDL2/include/SDL_bits.h | 121 + SDL2/include/SDL_blendmode.h | 123 + SDL2/include/SDL_clipboard.h | 71 + SDL2/include/SDL_config.h | 260 + SDL2/include/SDL_cpuinfo.h | 275 + SDL2/include/SDL_egl.h | 1676 +++ SDL2/include/SDL_endian.h | 263 + SDL2/include/SDL_error.h | 76 + SDL2/include/SDL_events.h | 792 ++ SDL2/include/SDL_filesystem.h | 136 + SDL2/include/SDL_gamecontroller.h | 420 + SDL2/include/SDL_gesture.h | 87 + SDL2/include/SDL_haptic.h | 1238 ++ SDL2/include/SDL_hints.h | 1364 ++ SDL2/include/SDL_joystick.h | 418 + SDL2/include/SDL_keyboard.h | 217 + SDL2/include/SDL_keycode.h | 349 + SDL2/include/SDL_loadso.h | 81 + SDL2/include/SDL_locale.h | 101 + SDL2/include/SDL_log.h | 211 + SDL2/include/SDL_main.h | 180 + SDL2/include/SDL_messagebox.h | 146 + SDL2/include/SDL_metal.h | 91 + SDL2/include/SDL_misc.h | 79 + SDL2/include/SDL_mouse.h | 302 + SDL2/include/SDL_mutex.h | 251 + SDL2/include/SDL_name.h | 33 + SDL2/include/SDL_opengl.h | 2183 +++ SDL2/include/SDL_opengl_glext.h | 11180 ++++++++++++++++ SDL2/include/SDL_opengles.h | 39 + SDL2/include/SDL_opengles2.h | 52 + SDL2/include/SDL_opengles2_gl2.h | 621 + SDL2/include/SDL_opengles2_gl2ext.h | 2050 +++ SDL2/include/SDL_opengles2_gl2platform.h | 30 + SDL2/include/SDL_opengles2_khrplatform.h | 282 + SDL2/include/SDL_pixels.h | 473 + SDL2/include/SDL_platform.h | 198 + SDL2/include/SDL_power.h | 75 + SDL2/include/SDL_quit.h | 58 + SDL2/include/SDL_rect.h | 174 + SDL2/include/SDL_render.h | 1158 ++ SDL2/include/SDL_revision.h | 2 + SDL2/include/SDL_rwops.h | 291 + SDL2/include/SDL_scancode.h | 413 + SDL2/include/SDL_sensor.h | 251 + SDL2/include/SDL_shape.h | 144 + SDL2/include/SDL_stdinc.h | 617 + SDL2/include/SDL_surface.h | 554 + SDL2/include/SDL_system.h | 316 + SDL2/include/SDL_syswm.h | 331 + SDL2/include/SDL_test.h | 69 + SDL2/include/SDL_test_assert.h | 105 + SDL2/include/SDL_test_common.h | 218 + SDL2/include/SDL_test_compare.h | 69 + SDL2/include/SDL_test_crc32.h | 124 + SDL2/include/SDL_test_font.h | 81 + SDL2/include/SDL_test_fuzzer.h | 384 + SDL2/include/SDL_test_harness.h | 134 + SDL2/include/SDL_test_images.h | 78 + SDL2/include/SDL_test_log.h | 67 + SDL2/include/SDL_test_md5.h | 129 + SDL2/include/SDL_test_memory.h | 63 + SDL2/include/SDL_test_random.h | 115 + SDL2/include/SDL_thread.h | 361 + SDL2/include/SDL_timer.h | 115 + SDL2/include/SDL_touch.h | 102 + SDL2/include/SDL_types.h | 29 + SDL2/include/SDL_version.h | 162 + SDL2/include/SDL_video.h | 1275 ++ SDL2/include/SDL_vulkan.h | 278 + SDL2/include/begin_code.h | 170 + SDL2/include/close_code.h | 40 + SDL2/lib/cmake/SDL2/sdl2-config-version.cmake | 11 + SDL2/lib/cmake/SDL2/sdl2-config.cmake | 81 + SDL2/lib/pkgconfig/sdl2.pc | 15 + SDL2/share/aclocal/sdl2.m4 | 214 + ffmpeg/bin/ffmpeg | Bin 0 -> 251080 bytes ffmpeg/bin/ffmpeg.exe | Bin 0 -> 293888 bytes ffmpeg/bin/ffplay | Bin 0 -> 127664 bytes ffmpeg/bin/ffplay.exe | Bin 0 -> 147968 bytes ffmpeg/bin/ffprobe | Bin 0 -> 143488 bytes ffmpeg/bin/ffprobe.exe | Bin 0 -> 166400 bytes ffmpeg/include/libavcodec/ac3_parser.h | 36 + ffmpeg/include/libavcodec/adts_parser.h | 37 + ffmpeg/include/libavcodec/avcodec.h | 6228 +++++++++ ffmpeg/include/libavcodec/avdct.h | 84 + ffmpeg/include/libavcodec/avfft.h | 118 + ffmpeg/include/libavcodec/d3d11va.h | 112 + ffmpeg/include/libavcodec/dirac.h | 131 + ffmpeg/include/libavcodec/dv_profile.h | 83 + ffmpeg/include/libavcodec/dxva2.h | 93 + ffmpeg/include/libavcodec/jni.h | 46 + ffmpeg/include/libavcodec/mediacodec.h | 101 + ffmpeg/include/libavcodec/qsv.h | 107 + ffmpeg/include/libavcodec/vaapi.h | 86 + ffmpeg/include/libavcodec/vdpau.h | 176 + ffmpeg/include/libavcodec/version.h | 140 + ffmpeg/include/libavcodec/videotoolbox.h | 127 + ffmpeg/include/libavcodec/vorbis_parser.h | 74 + ffmpeg/include/libavcodec/xvmc.h | 170 + ffmpeg/include/libavdevice/avdevice.h | 514 + ffmpeg/include/libavdevice/version.h | 50 + ffmpeg/include/libavfilter/avfilter.h | 1168 ++ ffmpeg/include/libavfilter/buffersink.h | 165 + ffmpeg/include/libavfilter/buffersrc.h | 209 + ffmpeg/include/libavfilter/version.h | 66 + ffmpeg/include/libavformat/avformat.h | 3092 +++++ ffmpeg/include/libavformat/avio.h | 861 ++ ffmpeg/include/libavformat/version.h | 114 + ffmpeg/include/libavutil/adler32.h | 60 + ffmpeg/include/libavutil/aes.h | 65 + ffmpeg/include/libavutil/aes_ctr.h | 88 + ffmpeg/include/libavutil/attributes.h | 167 + ffmpeg/include/libavutil/audio_fifo.h | 187 + ffmpeg/include/libavutil/avassert.h | 75 + ffmpeg/include/libavutil/avconfig.h | 6 + ffmpeg/include/libavutil/avstring.h | 413 + ffmpeg/include/libavutil/avutil.h | 365 + ffmpeg/include/libavutil/base64.h | 72 + ffmpeg/include/libavutil/blowfish.h | 82 + ffmpeg/include/libavutil/bprint.h | 219 + ffmpeg/include/libavutil/bswap.h | 109 + ffmpeg/include/libavutil/buffer.h | 291 + ffmpeg/include/libavutil/camellia.h | 70 + ffmpeg/include/libavutil/cast5.h | 80 + ffmpeg/include/libavutil/channel_layout.h | 232 + ffmpeg/include/libavutil/common.h | 560 + ffmpeg/include/libavutil/cpu.h | 130 + ffmpeg/include/libavutil/crc.h | 100 + ffmpeg/include/libavutil/des.h | 77 + ffmpeg/include/libavutil/dict.h | 200 + ffmpeg/include/libavutil/display.h | 114 + ffmpeg/include/libavutil/downmix_info.h | 115 + ffmpeg/include/libavutil/encryption_info.h | 205 + ffmpeg/include/libavutil/error.h | 126 + ffmpeg/include/libavutil/eval.h | 113 + ffmpeg/include/libavutil/ffversion.h | 5 + ffmpeg/include/libavutil/fifo.h | 179 + ffmpeg/include/libavutil/file.h | 71 + ffmpeg/include/libavutil/frame.h | 971 ++ ffmpeg/include/libavutil/hash.h | 269 + .../include/libavutil/hdr_dynamic_metadata.h | 343 + ffmpeg/include/libavutil/hmac.h | 100 + ffmpeg/include/libavutil/hwcontext.h | 584 + ffmpeg/include/libavutil/hwcontext_cuda.h | 52 + ffmpeg/include/libavutil/hwcontext_d3d11va.h | 169 + ffmpeg/include/libavutil/hwcontext_drm.h | 169 + ffmpeg/include/libavutil/hwcontext_dxva2.h | 75 + .../include/libavutil/hwcontext_mediacodec.h | 36 + ffmpeg/include/libavutil/hwcontext_qsv.h | 53 + ffmpeg/include/libavutil/hwcontext_vaapi.h | 117 + ffmpeg/include/libavutil/hwcontext_vdpau.h | 44 + .../libavutil/hwcontext_videotoolbox.h | 54 + ffmpeg/include/libavutil/imgutils.h | 277 + ffmpeg/include/libavutil/intfloat.h | 77 + ffmpeg/include/libavutil/intreadwrite.h | 644 + ffmpeg/include/libavutil/lfg.h | 80 + ffmpeg/include/libavutil/log.h | 362 + ffmpeg/include/libavutil/lzo.h | 66 + ffmpeg/include/libavutil/macros.h | 50 + .../libavutil/mastering_display_metadata.h | 128 + ffmpeg/include/libavutil/mathematics.h | 242 + ffmpeg/include/libavutil/md5.h | 98 + ffmpeg/include/libavutil/mem.h | 700 + ffmpeg/include/libavutil/motion_vector.h | 57 + ffmpeg/include/libavutil/murmur3.h | 120 + ffmpeg/include/libavutil/opt.h | 865 ++ ffmpeg/include/libavutil/parseutils.h | 193 + ffmpeg/include/libavutil/pixdesc.h | 440 + ffmpeg/include/libavutil/pixelutils.h | 52 + ffmpeg/include/libavutil/pixfmt.h | 552 + ffmpeg/include/libavutil/random_seed.h | 43 + ffmpeg/include/libavutil/rational.h | 214 + ffmpeg/include/libavutil/rc4.h | 66 + ffmpeg/include/libavutil/replaygain.h | 50 + ffmpeg/include/libavutil/ripemd.h | 87 + ffmpeg/include/libavutil/samplefmt.h | 272 + ffmpeg/include/libavutil/sha.h | 95 + ffmpeg/include/libavutil/sha512.h | 97 + ffmpeg/include/libavutil/spherical.h | 232 + ffmpeg/include/libavutil/stereo3d.h | 233 + ffmpeg/include/libavutil/tea.h | 71 + ffmpeg/include/libavutil/threadmessage.h | 115 + ffmpeg/include/libavutil/time.h | 56 + ffmpeg/include/libavutil/timecode.h | 140 + ffmpeg/include/libavutil/timestamp.h | 78 + ffmpeg/include/libavutil/tree.h | 138 + ffmpeg/include/libavutil/twofish.h | 70 + ffmpeg/include/libavutil/tx.h | 81 + ffmpeg/include/libavutil/version.h | 139 + ffmpeg/include/libavutil/xtea.h | 94 + ffmpeg/include/libpostproc/postprocess.h | 107 + ffmpeg/include/libpostproc/version.h | 45 + ffmpeg/include/libswresample/swresample.h | 579 + ffmpeg/include/libswresample/version.h | 45 + ffmpeg/include/libswscale/swscale.h | 336 + ffmpeg/include/libswscale/version.h | 53 + ffmpeg/lib/avcodec-58.def | 238 + ffmpeg/lib/avcodec.lib | Bin 0 -> 184554 bytes ffmpeg/lib/avdevice-58.def | 19 + ffmpeg/lib/avdevice.lib | Bin 0 -> 15798 bytes ffmpeg/lib/avfilter-7.def | 71 + ffmpeg/lib/avfilter.lib | Bin 0 -> 56298 bytes ffmpeg/lib/avformat-58.def | 175 + ffmpeg/lib/avformat.lib | Bin 0 -> 134282 bytes ffmpeg/lib/avutil-56.def | 536 + ffmpeg/lib/avutil.lib | Bin 0 -> 405534 bytes ffmpeg/lib/ffmpeg.exe | Bin 0 -> 293888 bytes ffmpeg/lib/ffplay.exe | Bin 0 -> 147968 bytes ffmpeg/lib/ffprobe.exe | Bin 0 -> 166400 bytes ffmpeg/lib/postproc-55.def | 11 + ffmpeg/lib/postproc.lib | Bin 0 -> 9034 bytes ffmpeg/lib/swresample-3.def | 24 + ffmpeg/lib/swresample.lib | Bin 0 -> 18766 bytes ffmpeg/lib/swscale-5.def | 35 + ffmpeg/lib/swscale.lib | Bin 0 -> 27064 bytes 1537 files changed, 376216 insertions(+) create mode 100644 LedOK/.gitignore create mode 100644 LedOK/BrightnessTable.xlsx create mode 100644 LedOK/Btb create mode 100644 LedOK/ColorDialog/BasicColorArea.cpp create mode 100644 LedOK/ColorDialog/BasicColorArea.h create mode 100644 LedOK/ColorDialog/BasicColorItem.cpp create mode 100644 LedOK/ColorDialog/BasicColorItem.h create mode 100644 LedOK/ColorDialog/ColorDialog.cpp create mode 100644 LedOK/ColorDialog/ColorDialog.h create mode 100644 LedOK/ColorDialog/ColorDialog.ui create mode 100644 LedOK/ColorDialog/CustomColorArea.cpp create mode 100644 LedOK/ColorDialog/CustomColorArea.h create mode 100644 LedOK/ColorDialog/HColorArea.cpp create mode 100644 LedOK/ColorDialog/HColorArea.h create mode 100644 LedOK/ColorDialog/PreviewColorArea.cpp create mode 100644 LedOK/ColorDialog/PreviewColorArea.h create mode 100644 LedOK/ColorDialog/SVColorArea.cpp create mode 100644 LedOK/ColorDialog/SVColorArea.h create mode 100644 LedOK/ColorDialog/data/images/button/button-h.png create mode 100644 LedOK/ColorDialog/data/images/button/button-n.png create mode 100644 LedOK/ColorDialog/data/images/button/button-s.png create mode 100644 LedOK/ColorDialog/data/images/mainui/bg.png create mode 100644 LedOK/ColorDialog/data/images/mainui/close-H.png create mode 100644 LedOK/ColorDialog/data/images/mainui/close.png create mode 100644 LedOK/ColorDialog/data/images/mainui/main.png create mode 100644 LedOK/ColorDialog/data/images/mainui/max-H.png create mode 100644 LedOK/ColorDialog/data/images/mainui/max.png create mode 100644 LedOK/ColorDialog/data/images/mainui/min-H.png create mode 100644 LedOK/ColorDialog/data/images/mainui/min.png create mode 100644 LedOK/ColorDialog/data/images/mainui/title.png create mode 100644 LedOK/ColorDialog/data/ui.png create mode 100644 LedOK/JQLibrary/JQLibrary.pri create mode 100644 LedOK/JQLibrary/include/JQDeclare create mode 100644 LedOK/JQLibrary/include/JQHttpServer.h create mode 100644 LedOK/JQLibrary/include/JQNet.h create mode 100644 LedOK/JQLibrary/include/jqdeclare.hpp create mode 100644 LedOK/JQLibrary/src/JQHttpServer.cpp create mode 100644 LedOK/JQLibrary/src/JQNet.cpp create mode 100644 LedOK/LICENSE create mode 100644 LedOK/Languages/enUS.qm create mode 100644 LedOK/Languages/enUS.ts create mode 100644 LedOK/Languages/jaJP.qm create mode 100644 LedOK/Languages/jaJP.ts create mode 100644 LedOK/Languages/widgets.qm create mode 100644 LedOK/Languages/widgets.ts create mode 100644 LedOK/Languages/widgets_cn.qm create mode 100644 LedOK/Languages/widgets_cn.ts create mode 100644 LedOK/Languages/widgets_th.qm create mode 100644 LedOK/Languages/widgets_th.ts create mode 100644 LedOK/Languages/zhCN.qm create mode 100644 LedOK/Languages/zhCN.ts create mode 100644 LedOK/Languages/zhTH.qm create mode 100644 LedOK/Languages/zhTH.ts create mode 100644 LedOK/LedOK.pro create mode 100644 LedOK/LedOK111.pro create mode 100644 LedOK/LoQClass/extendedgroupbox.cpp create mode 100644 LedOK/LoQClass/extendedgroupbox.h create mode 100644 LedOK/LoQClass/locolorselector.cpp create mode 100644 LedOK/LoQClass/locolorselector.h create mode 100644 LedOK/LoQClass/lodateselector.cpp create mode 100644 LedOK/LoQClass/lodateselector.h create mode 100644 LedOK/LoQClass/loglwindow.cpp create mode 100644 LedOK/LoQClass/loglwindow.h create mode 100644 LedOK/LoQClass/loqdialog.cpp create mode 100644 LedOK/LoQClass/loqdialog.h create mode 100644 LedOK/LoQClass/loqgraphicsobject.cpp create mode 100644 LedOK/LoQClass/loqgraphicsobject.h create mode 100644 LedOK/LoQClass/loqgraphicsvideoitem.cpp create mode 100644 LedOK/LoQClass/loqgraphicsvideoitem.h create mode 100644 LedOK/LoQClass/loqgraphicsview.cpp create mode 100644 LedOK/LoQClass/loqgraphicsview.h create mode 100644 LedOK/LoQClass/loqheaderviewcheckbox.cpp create mode 100644 LedOK/LoQClass/loqheaderviewcheckbox.h create mode 100644 LedOK/LoQClass/loqlineedit.cpp create mode 100644 LedOK/LoQClass/loqlineedit.h create mode 100644 LedOK/LoQClass/loqmacro.h create mode 100644 LedOK/LoQClass/loqmainwindow.cpp create mode 100644 LedOK/LoQClass/loqmainwindow.h create mode 100644 LedOK/LoQClass/loqpushbutton.cpp create mode 100644 LedOK/LoQClass/loqpushbutton.h create mode 100644 LedOK/LoQClass/loqtitlebar.cpp create mode 100644 LedOK/LoQClass/loqtitlebar.h create mode 100644 LedOK/LoQClass/loqtreewidget.cpp create mode 100644 LedOK/LoQClass/loqtreewidget.h create mode 100644 LedOK/LoQClass/loqvideosurface.cpp create mode 100644 LedOK/LoQClass/loqvideosurface.h create mode 100644 LedOK/LoQClass/loqwindowtitlebar.cpp create mode 100644 LedOK/LoQClass/loqwindowtitlebar.h create mode 100644 LedOK/LoQClass/qexcel.cpp create mode 100644 LedOK/LoQClass/qexcel.h create mode 100644 LedOK/LoQClass/readexcel.cpp create mode 100644 LedOK/LoQClass/readexcel.h create mode 100644 LedOK/LoUIClass/aboutdlg.cpp create mode 100644 LedOK/LoUIClass/aboutdlg.h create mode 100644 LedOK/LoUIClass/aboutdlg.ui create mode 100644 LedOK/LoUIClass/changepasswordform.cpp create mode 100644 LedOK/LoUIClass/changepasswordform.h create mode 100644 LedOK/LoUIClass/changepasswordform.ui create mode 100644 LedOK/LoUIClass/customprogressindicator.cpp create mode 100644 LedOK/LoUIClass/customprogressindicator.h create mode 100644 LedOK/LoUIClass/loemptydialog.cpp create mode 100644 LedOK/LoUIClass/loemptydialog.h create mode 100644 LedOK/LoUIClass/loemptydialog.ui create mode 100644 LedOK/LoUIClass/louimsgboxok.h create mode 100644 LedOK/LoUIClass/louimsgboxok.ui create mode 100644 LedOK/LoUIClass/louimsgboxokcancel.cpp create mode 100644 LedOK/LoUIClass/louimsgboxokcancel.h create mode 100644 LedOK/LoUIClass/louimsgboxokcancel.ui create mode 100644 LedOK/LoUIClass/pixbmpshowdialog.cpp create mode 100644 LedOK/LoUIClass/pixbmpshowdialog.h create mode 100644 LedOK/LoUIClass/pixbmpshowdialog.ui create mode 100644 LedOK/LoUIClass/qiplineedit.cpp create mode 100644 LedOK/LoUIClass/qiplineedit.h create mode 100644 LedOK/LoUIClass/softconfigdialog.cpp create mode 100644 LedOK/LoUIClass/softconfigdialog.h create mode 100644 LedOK/LoUIClass/softconfigdialog.ui create mode 100644 LedOK/LoUIClass/switchcontrol.cpp create mode 100644 LedOK/LoUIClass/switchcontrol.h create mode 100644 LedOK/LoUIClass/taesclass.cpp create mode 100644 LedOK/LoUIClass/taesclass.h create mode 100644 LedOK/LoUIClass/updateledset3dialog.cpp create mode 100644 LedOK/LoUIClass/updateledset3dialog.h create mode 100644 LedOK/LoUIClass/updateledset3dialog.ui create mode 100644 LedOK/LoUIClass/updaterdialog.cpp create mode 100644 LedOK/LoUIClass/updaterdialog.h create mode 100644 LedOK/LoUIClass/updaterdialog.ui create mode 100644 LedOK/LoUIClass/updaterfirmwaredialog.cpp create mode 100644 LedOK/LoUIClass/updaterfirmwaredialog.h create mode 100644 LedOK/LoUIClass/updaterfirmwaredialog.ui create mode 100644 LedOK/LoUIClass/x_checkboxdelegate.cpp create mode 100644 LedOK/LoUIClass/x_checkboxdelegate.h create mode 100644 LedOK/LoUIClass/x_spinboxdelegate.cpp create mode 100644 LedOK/LoUIClass/x_spinboxdelegate.h create mode 100644 LedOK/LoUIClass/x_timeeditdelegate.cpp create mode 100644 LedOK/LoUIClass/x_timeeditdelegate.h create mode 100644 LedOK/LoUIClass/x_uimsgboxok.cpp create mode 100644 LedOK/LoUIClass/x_uimsgboxok.h create mode 100644 LedOK/LoUIClass/x_uimsgboxok.ui create mode 100644 LedOK/LoUIClass/x_uimsgboxokcancel.cpp create mode 100644 LedOK/LoUIClass/x_uimsgboxokcancel.h create mode 100644 LedOK/LoUIClass/x_uimsgboxokcancel.ui create mode 100644 LedOK/LoUIClass/x_uimsgboxonlyclosebtn.cpp create mode 100644 LedOK/LoUIClass/x_uimsgboxonlyclosebtn.h create mode 100644 LedOK/LoUIClass/x_uimsgboxonlyclosebtn.ui create mode 100644 LedOK/LoUIClass/x_uimsgboxyesnocancel.cpp create mode 100644 LedOK/LoUIClass/x_uimsgboxyesnocancel.h create mode 100644 LedOK/LoUIClass/x_uimsgboxyesnocancel.ui create mode 100644 LedOK/QSimpleUpdater/.gitattributes create mode 100644 LedOK/QSimpleUpdater/.gitignore create mode 100644 LedOK/QSimpleUpdater/.travis.yml create mode 100644 LedOK/QSimpleUpdater/COPYING.md create mode 100644 LedOK/QSimpleUpdater/QSimpleUpdater.pri create mode 100644 LedOK/QSimpleUpdater/QSimpleUpdater.pro create mode 100644 LedOK/QSimpleUpdater/README.md create mode 100644 LedOK/QSimpleUpdater/doc/config/doxyfile create mode 100644 LedOK/QSimpleUpdater/doc/config/icon.png create mode 100644 LedOK/QSimpleUpdater/doc/config/startpage.md create mode 100644 LedOK/QSimpleUpdater/doc/documentation.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/_downloader_8h_source.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/_q_simple_updater_8h_source.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/_updater_8h_source.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/annotated.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/arrowdown.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/arrowright.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/bc_s.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/bdwn.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_downloader-members.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_downloader.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_downloader.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater-members.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_updater-members.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_updater.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/class_updater.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/classes.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/closed.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/dir_d44c64559bbebec7f509842c48db8b23.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/doc.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/doxygen.css create mode 100644 LedOK/QSimpleUpdater/doc/output/html/doxygen.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/dynsections.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/files.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/folderclosed.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/folderopen.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/functions.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/functions_func.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/hierarchy.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/icon.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/index.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/jquery.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/nav_f.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/nav_g.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/nav_h.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/open.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_0.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_0.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_1.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_1.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_2.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_2.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_3.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_3.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_4.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_4.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_5.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_5.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_6.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_6.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_7.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_7.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_8.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_8.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_9.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_9.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_a.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_a.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_b.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_b.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_c.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/all_c.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/classes_0.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/classes_0.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/classes_1.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/classes_1.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/classes_2.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/classes_2.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/close.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_0.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_0.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_1.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_1.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_2.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_2.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_3.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_3.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_4.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_4.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_5.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_5.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_6.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_6.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_7.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_7.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_8.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_8.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_9.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_9.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_a.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_a.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_b.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/functions_b.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/mag_sel.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/nomatches.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/pages_0.html create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/pages_0.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/search.css create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/search.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/search_l.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/search_m.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/search_r.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/search/searchdata.js create mode 100644 LedOK/QSimpleUpdater/doc/output/html/splitbar.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/sync_off.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/sync_on.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/tab_a.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/tab_b.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/tab_h.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/tab_s.png create mode 100644 LedOK/QSimpleUpdater/doc/output/html/tabs.css create mode 100644 LedOK/QSimpleUpdater/etc/resources/qsimpleupdater.qrc create mode 100644 LedOK/QSimpleUpdater/etc/resources/update.png create mode 100644 LedOK/QSimpleUpdater/etc/screenshots/download-complete.png create mode 100644 LedOK/QSimpleUpdater/etc/screenshots/downloading.png create mode 100644 LedOK/QSimpleUpdater/etc/screenshots/tutorial.png create mode 100644 LedOK/QSimpleUpdater/etc/scripts/format-code.bat create mode 100644 LedOK/QSimpleUpdater/etc/scripts/format-code.sh create mode 100644 LedOK/QSimpleUpdater/include/QSimpleUpdater.h create mode 100644 LedOK/QSimpleUpdater/src/Downloader.cpp create mode 100644 LedOK/QSimpleUpdater/src/Downloader.h create mode 100644 LedOK/QSimpleUpdater/src/Downloader.ui create mode 100644 LedOK/QSimpleUpdater/src/QSimpleUpdater.cpp create mode 100644 LedOK/QSimpleUpdater/src/Updater.cpp create mode 100644 LedOK/QSimpleUpdater/src/Updater.h create mode 100644 LedOK/QSimpleUpdater/tests/Test_Downloader.h create mode 100644 LedOK/QSimpleUpdater/tests/Test_QSimpleUpdater.h create mode 100644 LedOK/QSimpleUpdater/tests/Test_Updater.h create mode 100644 LedOK/QSimpleUpdater/tests/Tests.pro create mode 100644 LedOK/QSimpleUpdater/tests/main.cpp create mode 100644 LedOK/QSimpleUpdater/tutorial/COPYING create mode 100644 LedOK/QSimpleUpdater/tutorial/definitions/README.md create mode 100644 LedOK/QSimpleUpdater/tutorial/definitions/updates.json create mode 100644 LedOK/QSimpleUpdater/tutorial/download/YesItWorks.jpg create mode 100644 LedOK/QSimpleUpdater/tutorial/src/Window.cpp create mode 100644 LedOK/QSimpleUpdater/tutorial/src/Window.h create mode 100644 LedOK/QSimpleUpdater/tutorial/src/Window.ui create mode 100644 LedOK/QSimpleUpdater/tutorial/src/main.cpp create mode 100644 LedOK/QSimpleUpdater/tutorial/tutorial.pro create mode 100644 LedOK/Xanadu Express.manifest create mode 100644 LedOK/backup/mprogrammanager.cpp create mode 100644 LedOK/backup/mprogrammanager.h create mode 100644 LedOK/ccrashstack.cpp create mode 100644 LedOK/ccrashstack.h create mode 100644 LedOK/communication/hpptclient.cpp create mode 100644 LedOK/communication/hpptclient.h create mode 100644 LedOK/communication/network.cpp create mode 100644 LedOK/communication/network.h create mode 100644 LedOK/communication/taserialthread.cpp create mode 100644 LedOK/communication/taserialthread.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/LICENSE.txt create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/README.txt create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/README create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/avio_dir_cmd.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/avio_reading.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/decode_audio.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/decode_video.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/demuxing_decoding.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/encode_audio.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/encode_video.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/extract_mvs.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/filter_audio.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/filtering_audio.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/filtering_video.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/http_multiclient.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/hw_decode.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/metadata.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/muxing.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/qsvdec.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/remuxing.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/resampling_audio.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/scaling_video.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/transcode_aac.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/transcoding.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/vaapi_encode.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/examples/vaapi_transcode.c create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/ac3_parser.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/adts_parser.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/avcodec.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/avdct.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/avfft.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/d3d11va.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/dirac.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/dv_profile.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/dxva2.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/jni.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/mediacodec.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/qsv.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/vaapi.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/vdpau.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/videotoolbox.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/vorbis_parser.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavcodec/xvmc.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavdevice/avdevice.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavdevice/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavfilter/avfilter.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavfilter/buffersink.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavfilter/buffersrc.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavfilter/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavformat/avformat.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavformat/avio.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavformat/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/adler32.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/aes.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/aes_ctr.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/attributes.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/audio_fifo.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/avassert.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/avconfig.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/avstring.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/avutil.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/base64.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/blowfish.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/bprint.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/bswap.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/buffer.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/camellia.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/cast5.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/channel_layout.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/common.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/cpu.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/crc.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/des.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/dict.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/display.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/downmix_info.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/encryption_info.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/error.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/eval.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/ffversion.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/fifo.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/file.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/frame.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hash.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hdr_dynamic_metadata.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hmac.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_cuda.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_d3d11va.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_drm.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_dxva2.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_mediacodec.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_qsv.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_vaapi.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_vdpau.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/hwcontext_videotoolbox.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/imgutils.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/intfloat.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/intreadwrite.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/lfg.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/log.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/lzo.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/macros.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/mastering_display_metadata.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/mathematics.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/md5.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/mem.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/motion_vector.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/murmur3.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/opt.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/parseutils.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/pixdesc.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/pixelutils.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/pixfmt.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/random_seed.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/rational.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/rc4.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/replaygain.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/ripemd.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/samplefmt.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/sha.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/sha512.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/spherical.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/stereo3d.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/tea.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/threadmessage.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/time.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/timecode.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/timestamp.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/tree.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/twofish.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/tx.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libavutil/xtea.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libpostproc/postprocess.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libpostproc/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libswresample/swresample.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libswresample/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libswscale/swscale.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/include/libswscale/version.h create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/avcodec-58.def create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/avdevice-58.def create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/avfilter-7.def create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/avformat-58.def create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/avutil-56.def create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/postproc-55.def create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/swresample-3.def create mode 100644 LedOK/ffmpeg-4.2.2-win32-dev/lib/swscale-5.def create mode 100644 LedOK/globaldefine.cpp create mode 100644 LedOK/globaldefine.h create mode 100644 LedOK/icons.qrc create mode 100644 LedOK/images.qrc create mode 100644 LedOK/importbninprogramdlg.cpp create mode 100644 LedOK/importbninprogramdlg.h create mode 100644 LedOK/importbninprogramdlg.ui create mode 100644 LedOK/importprogramdlg.ui create mode 100644 LedOK/include/JlCompress.h create mode 100644 LedOK/include/ioapi.h create mode 100644 LedOK/include/minizip_crypt.h create mode 100644 LedOK/include/quaadler32.h create mode 100644 LedOK/include/quachecksum32.h create mode 100644 LedOK/include/quacrc32.h create mode 100644 LedOK/include/quagzipfile.h create mode 100644 LedOK/include/quaziodevice.h create mode 100644 LedOK/include/quazip.h create mode 100644 LedOK/include/quazip_global.h create mode 100644 LedOK/include/quazipdir.h create mode 100644 LedOK/include/quazipfile.h create mode 100644 LedOK/include/quazipfileinfo.h create mode 100644 LedOK/include/quazipnewinfo.h create mode 100644 LedOK/include/unzip.h create mode 100644 LedOK/include/vlc/deprecated.h create mode 100644 LedOK/include/vlc/libvlc.h create mode 100644 LedOK/include/vlc/libvlc_dialog.h create mode 100644 LedOK/include/vlc/libvlc_events.h create mode 100644 LedOK/include/vlc/libvlc_media.h create mode 100644 LedOK/include/vlc/libvlc_media_discoverer.h create mode 100644 LedOK/include/vlc/libvlc_media_library.h create mode 100644 LedOK/include/vlc/libvlc_media_list.h create mode 100644 LedOK/include/vlc/libvlc_media_list_player.h create mode 100644 LedOK/include/vlc/libvlc_media_player.h create mode 100644 LedOK/include/vlc/libvlc_renderer_discoverer.h create mode 100644 LedOK/include/vlc/libvlc_version.h create mode 100644 LedOK/include/vlc/libvlc_vlm.h create mode 100644 LedOK/include/vlc/plugins/vlc_about.h create mode 100644 LedOK/include/vlc/plugins/vlc_access.h create mode 100644 LedOK/include/vlc/plugins/vlc_actions.h create mode 100644 LedOK/include/vlc/plugins/vlc_addons.h create mode 100644 LedOK/include/vlc/plugins/vlc_aout.h create mode 100644 LedOK/include/vlc/plugins/vlc_aout_volume.h create mode 100644 LedOK/include/vlc/plugins/vlc_arrays.h create mode 100644 LedOK/include/vlc/plugins/vlc_atomic.h create mode 100644 LedOK/include/vlc/plugins/vlc_avcodec.h create mode 100644 LedOK/include/vlc/plugins/vlc_bits.h create mode 100644 LedOK/include/vlc/plugins/vlc_block.h create mode 100644 LedOK/include/vlc/plugins/vlc_block_helper.h create mode 100644 LedOK/include/vlc/plugins/vlc_boxes.h create mode 100644 LedOK/include/vlc/plugins/vlc_charset.h create mode 100644 LedOK/include/vlc/plugins/vlc_codec.h create mode 100644 LedOK/include/vlc/plugins/vlc_common.h create mode 100644 LedOK/include/vlc/plugins/vlc_config.h create mode 100644 LedOK/include/vlc/plugins/vlc_config_cat.h create mode 100644 LedOK/include/vlc/plugins/vlc_configuration.h create mode 100644 LedOK/include/vlc/plugins/vlc_cpu.h create mode 100644 LedOK/include/vlc/plugins/vlc_demux.h create mode 100644 LedOK/include/vlc/plugins/vlc_dialog.h create mode 100644 LedOK/include/vlc/plugins/vlc_epg.h create mode 100644 LedOK/include/vlc/plugins/vlc_es.h create mode 100644 LedOK/include/vlc/plugins/vlc_es_out.h create mode 100644 LedOK/include/vlc/plugins/vlc_events.h create mode 100644 LedOK/include/vlc/plugins/vlc_filter.h create mode 100644 LedOK/include/vlc/plugins/vlc_fingerprinter.h create mode 100644 LedOK/include/vlc/plugins/vlc_fourcc.h create mode 100644 LedOK/include/vlc/plugins/vlc_fs.h create mode 100644 LedOK/include/vlc/plugins/vlc_gcrypt.h create mode 100644 LedOK/include/vlc/plugins/vlc_http.h create mode 100644 LedOK/include/vlc/plugins/vlc_httpd.h create mode 100644 LedOK/include/vlc/plugins/vlc_image.h create mode 100644 LedOK/include/vlc/plugins/vlc_inhibit.h create mode 100644 LedOK/include/vlc/plugins/vlc_input.h create mode 100644 LedOK/include/vlc/plugins/vlc_input_item.h create mode 100644 LedOK/include/vlc/plugins/vlc_interface.h create mode 100644 LedOK/include/vlc/plugins/vlc_interrupt.h create mode 100644 LedOK/include/vlc/plugins/vlc_keystore.h create mode 100644 LedOK/include/vlc/plugins/vlc_main.h create mode 100644 LedOK/include/vlc/plugins/vlc_md5.h create mode 100644 LedOK/include/vlc/plugins/vlc_media_library.h create mode 100644 LedOK/include/vlc/plugins/vlc_memstream.h create mode 100644 LedOK/include/vlc/plugins/vlc_messages.h create mode 100644 LedOK/include/vlc/plugins/vlc_meta.h create mode 100644 LedOK/include/vlc/plugins/vlc_meta_fetcher.h create mode 100644 LedOK/include/vlc/plugins/vlc_mime.h create mode 100644 LedOK/include/vlc/plugins/vlc_modules.h create mode 100644 LedOK/include/vlc/plugins/vlc_mouse.h create mode 100644 LedOK/include/vlc/plugins/vlc_mtime.h create mode 100644 LedOK/include/vlc/plugins/vlc_network.h create mode 100644 LedOK/include/vlc/plugins/vlc_objects.h create mode 100644 LedOK/include/vlc/plugins/vlc_opengl.h create mode 100644 LedOK/include/vlc/plugins/vlc_picture.h create mode 100644 LedOK/include/vlc/plugins/vlc_picture_fifo.h create mode 100644 LedOK/include/vlc/plugins/vlc_picture_pool.h create mode 100644 LedOK/include/vlc/plugins/vlc_playlist.h create mode 100644 LedOK/include/vlc/plugins/vlc_plugin.h create mode 100644 LedOK/include/vlc/plugins/vlc_probe.h create mode 100644 LedOK/include/vlc/plugins/vlc_rand.h create mode 100644 LedOK/include/vlc/plugins/vlc_renderer_discovery.h create mode 100644 LedOK/include/vlc/plugins/vlc_services_discovery.h create mode 100644 LedOK/include/vlc/plugins/vlc_sout.h create mode 100644 LedOK/include/vlc/plugins/vlc_spu.h create mode 100644 LedOK/include/vlc/plugins/vlc_stream.h create mode 100644 LedOK/include/vlc/plugins/vlc_stream_extractor.h create mode 100644 LedOK/include/vlc/plugins/vlc_strings.h create mode 100644 LedOK/include/vlc/plugins/vlc_subpicture.h create mode 100644 LedOK/include/vlc/plugins/vlc_text_style.h create mode 100644 LedOK/include/vlc/plugins/vlc_threads.h create mode 100644 LedOK/include/vlc/plugins/vlc_timestamp_helper.h create mode 100644 LedOK/include/vlc/plugins/vlc_tls.h create mode 100644 LedOK/include/vlc/plugins/vlc_url.h create mode 100644 LedOK/include/vlc/plugins/vlc_variables.h create mode 100644 LedOK/include/vlc/plugins/vlc_video_splitter.h create mode 100644 LedOK/include/vlc/plugins/vlc_viewpoint.h create mode 100644 LedOK/include/vlc/plugins/vlc_vlm.h create mode 100644 LedOK/include/vlc/plugins/vlc_vout.h create mode 100644 LedOK/include/vlc/plugins/vlc_vout_display.h create mode 100644 LedOK/include/vlc/plugins/vlc_vout_osd.h create mode 100644 LedOK/include/vlc/plugins/vlc_vout_window.h create mode 100644 LedOK/include/vlc/plugins/vlc_xlib.h create mode 100644 LedOK/include/vlc/plugins/vlc_xml.h create mode 100644 LedOK/include/vlc/vlc.h create mode 100644 LedOK/include/zconf.h create mode 100644 LedOK/include/zip.h create mode 100644 LedOK/include/zlib.h create mode 100644 LedOK/jsondecoderloop.cpp create mode 100644 LedOK/jsondecoderloop.h create mode 100644 LedOK/languages.qrc create mode 100644 LedOK/lib/pkgconfig/libvlc.pc create mode 100644 LedOK/lib/pkgconfig/vlc-plugin.pc create mode 100644 LedOK/loappconfig.cpp create mode 100644 LedOK/loappconfig.h create mode 100644 LedOK/loapptools.cpp create mode 100644 LedOK/loapptools.h create mode 100644 LedOK/main.cpp create mode 100644 LedOK/main.rc create mode 100644 LedOK/mainwindow.cpp create mode 100644 LedOK/mainwindow.h create mode 100644 LedOK/mainwindow.ui create mode 100644 LedOK/mdevicemanager - 副本.ui create mode 100644 LedOK/mdevicemanager.cpp create mode 100644 LedOK/mdevicemanager.h create mode 100644 LedOK/mdevicemanager.ui create mode 100644 LedOK/mdevicesetting.cpp create mode 100644 LedOK/mdevicesetting.h create mode 100644 LedOK/mdevicesetting.ui create mode 100644 LedOK/mguangyingpinwidget.cpp create mode 100644 LedOK/mguangyingpinwidget.h create mode 100644 LedOK/mguangyingpinwidget.ui create mode 100644 LedOK/mprogrammanager.cpp create mode 100644 LedOK/mprogrammanager.h create mode 100644 LedOK/mprogrammanager.ui create mode 100644 LedOK/mprogrammanagera.cpp create mode 100644 LedOK/mprogrammanagera.h create mode 100644 LedOK/mprogrammanagera.ui create mode 100644 LedOK/mtabwidget.cpp create mode 100644 LedOK/mtabwidget.h create mode 100644 LedOK/mtitlebar.cpp create mode 100644 LedOK/mtitlebar.h create mode 100644 LedOK/oescreenshot/oeamplifier.cpp create mode 100644 LedOK/oescreenshot/oeamplifier.h create mode 100644 LedOK/oescreenshot/oecommonhelper.cpp create mode 100644 LedOK/oescreenshot/oecommonhelper.h create mode 100644 LedOK/oescreenshot/oemodelview.cpp create mode 100644 LedOK/oescreenshot/oemodelview.h create mode 100644 LedOK/oescreenshot/oescreenshot.cpp create mode 100644 LedOK/oescreenshot/oescreenshot.h create mode 100644 LedOK/plugins/access/libbluray-j2se-1.0.2.jar create mode 100644 LedOK/publishform.cpp create mode 100644 LedOK/publishform.h create mode 100644 LedOK/publishform.ui create mode 100644 LedOK/qss.qrc create mode 100644 LedOK/qss/00_Common.css create mode 100644 LedOK/qss/01_Global.css create mode 100644 LedOK/qss/10_MainWindow.css create mode 100644 LedOK/qss/11_MainWindowTab.css create mode 100644 LedOK/qss/20_DeviceManager.css create mode 100644 LedOK/qss/21_DeviceSetting.css create mode 100644 LedOK/qss/30_ProgramManager.css create mode 100644 LedOK/qss/31_EditProgram.css create mode 100644 LedOK/qss/32_PageAttr.css create mode 100644 LedOK/qss/33_EWindow.css create mode 100644 LedOK/qss1/00_Common.css create mode 100644 LedOK/qss1/01_Global.css create mode 100644 LedOK/qss1/10_MainWindow.css create mode 100644 LedOK/qss1/11_MainWindowTab.css create mode 100644 LedOK/qss1/20_DeviceManager.css create mode 100644 LedOK/qss1/21_DeviceSetting.css create mode 100644 LedOK/qss1/30_ProgramManager.css create mode 100644 LedOK/qss1/31_EditProgram.css create mode 100644 LedOK/qss1/32_PageAttr.css create mode 100644 LedOK/qss1/33_EWindow.css create mode 100644 LedOK/res/128_128 - 副本.png create mode 100644 LedOK/res/128_128.png create mode 100644 LedOK/res/AdvParam.png create mode 100644 LedOK/res/AdvanceManager_s.png create mode 100644 LedOK/res/AdvanceManager_u.png create mode 100644 LedOK/res/AppSetting.png create mode 100644 LedOK/res/AppSettingTip.png create mode 100644 LedOK/res/ArrowDropDown.png create mode 100644 LedOK/res/ArrowDropUp.png create mode 100644 LedOK/res/CheckBoxChecked - 副本 - 副本.png create mode 100644 LedOK/res/CheckBoxChecked.png create mode 100644 LedOK/res/CheckBoxChecked24.png create mode 100644 LedOK/res/CheckBoxUnchecked - 副本 - 副本.png create mode 100644 LedOK/res/CheckBoxUnchecked.png create mode 100644 LedOK/res/CheckBoxUnchecked24.png create mode 100644 LedOK/res/DeviceManager/Add.png create mode 100644 LedOK/res/DeviceManager/DeviceNum_All.png create mode 100644 LedOK/res/DeviceManager/DeviceNum_Offline.png create mode 100644 LedOK/res/DeviceManager/DeviceNum_Online.png create mode 100644 LedOK/res/DeviceManager/DeviceNum_Unlogin.png create mode 100644 LedOK/res/DeviceManager/Equal.png create mode 100644 LedOK/res/DeviceManager/FlashArea_s.png create mode 100644 LedOK/res/DeviceManager/FlashArea_u.png create mode 100644 LedOK/res/DeviceManager/FlashArrow.png create mode 100644 LedOK/res/DeviceManager/FlashArrow_s.png create mode 100644 LedOK/res/DeviceManager/FlashArrow_u.png create mode 100644 LedOK/res/DeviceManager/Lock - 副本.png create mode 100644 LedOK/res/DeviceManager/Lock.png create mode 100644 LedOK/res/DeviceManager/O_Offline.png create mode 100644 LedOK/res/DeviceManager/O_Online.png create mode 100644 LedOK/res/DeviceManager/O_Unlogin.png create mode 100644 LedOK/res/DeviceManager/Transparent.png create mode 100644 LedOK/res/DeviceManager/UnLock - 副本.png create mode 100644 LedOK/res/DeviceManager/UnLock.png create mode 100644 LedOK/res/DeviceManager/bnDetail.png create mode 100644 LedOK/res/DeviceManager/deviceReadbackPic.png create mode 100644 LedOK/res/DeviceManager/图层 4(1).png create mode 100644 LedOK/res/DeviceManager/图层 4.png create mode 100644 LedOK/res/DeviceManager/图层 5 拷贝.png create mode 100644 LedOK/res/DeviceManager/图层 5.png create mode 100644 LedOK/res/DeviceManager/矩形 20.png create mode 100644 LedOK/res/DeviceManager_s.png create mode 100644 LedOK/res/DeviceManager_u.png create mode 100644 LedOK/res/DeviceSetting_s.png create mode 100644 LedOK/res/DeviceSetting_u.png create mode 100644 LedOK/res/GuangYingPin_s.png create mode 100644 LedOK/res/GuangYingPin_u.png create mode 100644 LedOK/res/Hdmi.png create mode 100644 LedOK/res/Logo - 副本.ico create mode 100644 LedOK/res/Logo - 副本.png create mode 100644 LedOK/res/Logo.icns create mode 100644 LedOK/res/Logo.ico create mode 100644 LedOK/res/Logo.png create mode 100644 LedOK/res/Logo1.png create mode 100644 LedOK/res/Logo2.png create mode 100644 LedOK/res/Logo3.ico create mode 100644 LedOK/res/Logo3.png create mode 100644 LedOK/res/Logo44.ico create mode 100644 LedOK/res/Lora.png create mode 100644 LedOK/res/Lora.psd create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock1.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock10.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock2.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock3.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock4.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock5.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock6.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock7.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/Aclock9.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/lang_zh-cn.xml create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/AClock/language_zh-cn.xml create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock1.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock10.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock2.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock3.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock4.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock5.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock6.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock7.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/AClock/Aclock8.jpg create mode 100644 LedOK/res/ProgramManager/EditProgram/Add.png create mode 100644 LedOK/res/ProgramManager/EditProgram/AddPlan.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ArrayBottom.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ArrayHCenter.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ArrayLeft.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ArrayRight.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ArrayTop.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ArrayVCenter.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Audio.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Audio.psd create mode 100644 LedOK/res/ProgramManager/EditProgram/Clean.png create mode 100644 LedOK/res/ProgramManager/EditProgram/CleanPlan.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ColorText.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Copy.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Cut.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DClock.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DateSelect.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DateSelect_e.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DateSelect_enable.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Delete.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignHC_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignHC_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignHL_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignHL_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignHR_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignHR_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignVB_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignVB_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignVC_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignVC_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignVT_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/DocAlignVT_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/FontBold_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/FontBold_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/FontItalics_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/FontItalics_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/FontUnderline_s.png create mode 100644 LedOK/res/ProgramManager/EditProgram/FontUnderline_u.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Gif.png create mode 100644 LedOK/res/ProgramManager/EditProgram/GoDown.png create mode 100644 LedOK/res/ProgramManager/EditProgram/GoUp.png create mode 100644 LedOK/res/ProgramManager/EditProgram/LayerBottom.png create mode 100644 LedOK/res/ProgramManager/EditProgram/LayerDown.png create mode 100644 LedOK/res/ProgramManager/EditProgram/LayerTop.png create mode 100644 LedOK/res/ProgramManager/EditProgram/LayerUp.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Movie.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Office.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Photo.png create mode 100644 LedOK/res/ProgramManager/EditProgram/RadioChecked.png create mode 100644 LedOK/res/ProgramManager/EditProgram/RadioUnchecked.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Rss.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Save.png create mode 100644 LedOK/res/ProgramManager/EditProgram/SaveAs.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ScaleDown.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ScaleOrg.png create mode 100644 LedOK/res/ProgramManager/EditProgram/ScaleUp.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Send.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Setting.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Temp.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Text.png create mode 100644 LedOK/res/ProgramManager/EditProgram/TileFull.png create mode 100644 LedOK/res/ProgramManager/EditProgram/TileH.png create mode 100644 LedOK/res/ProgramManager/EditProgram/TileV.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Timer.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Weather.png create mode 100644 LedOK/res/ProgramManager/EditProgram/Window.png create mode 100644 LedOK/res/ProgramManager/EditProgram/check.png create mode 100644 LedOK/res/ProgramManager/EditProgram/preview - 副本.png create mode 100644 LedOK/res/ProgramManager/EditProgram/preview.png create mode 100644 LedOK/res/ProgramManager/EditProgram/previewStop.png create mode 100644 LedOK/res/ProgramManager/EditProgram/uncheck.png create mode 100644 LedOK/res/ProgramManager/EditProgram/勾.png create mode 100644 LedOK/res/ProgramManager/EditProgram/图层 11.png create mode 100644 LedOK/res/ProgramManager/EditProgram/圆角矩形 3.png create mode 100644 LedOK/res/ProgramManager/EditProgram/圆角矩形 30.png create mode 100644 LedOK/res/ProgramManager/EditProgram/矩形 17.png create mode 100644 LedOK/res/ProgramManager/EditProgram/矩形 18.png create mode 100644 LedOK/res/ProgramManager/EditProgram/矩形 51 拷贝.png create mode 100644 LedOK/res/ProgramManager/EditProgram/矩形 57.png create mode 100644 LedOK/res/ProgramManager/EditProgram/组 37.png create mode 100644 LedOK/res/ProgramManager/EditProgram/组 41.png create mode 100644 LedOK/res/ProgramManager/EditProgram/组 57(1).png create mode 100644 LedOK/res/ProgramManager/bnExport_s.png create mode 100644 LedOK/res/ProgramManager/bnExport_u.png create mode 100644 LedOK/res/ProgramManager/bnSearch.png create mode 100644 LedOK/res/ProgramManager/bnSend_s.png create mode 100644 LedOK/res/ProgramManager/bnSend_u.png create mode 100644 LedOK/res/ProgramManager_s.png create mode 100644 LedOK/res/ProgramManager_u.png create mode 100644 LedOK/res/RadioChecked.png create mode 100644 LedOK/res/Warning.png create mode 100644 LedOK/res/WndClose.png create mode 100644 LedOK/res/WndMaximize.png create mode 100644 LedOK/res/WndMinimize.png create mode 100644 LedOK/res/apk.png create mode 100644 LedOK/res/backup/AdvanceManager_s.png create mode 100644 LedOK/res/backup/AdvanceManager_u.png create mode 100644 LedOK/res/backup/Checked11.png create mode 100644 LedOK/res/backup/DeviceManager_s.png create mode 100644 LedOK/res/backup/DeviceManager_u.png create mode 100644 LedOK/res/backup/DeviceSetting_s.png create mode 100644 LedOK/res/backup/DeviceSetting_u.png create mode 100644 LedOK/res/backup/ProgramManager_s.png create mode 100644 LedOK/res/backup/ProgramManager_u.png create mode 100644 LedOK/res/backup/Warning.png create mode 100644 LedOK/res/bnBrightnessAdjustMent_s.png create mode 100644 LedOK/res/bnBrightnessAdjustMent_u.png create mode 100644 LedOK/res/bnNetConfig_s.png create mode 100644 LedOK/res/bnNetConfig_u.png create mode 100644 LedOK/res/bnPowerControl_s.png create mode 100644 LedOK/res/bnPowerControl_u.png create mode 100644 LedOK/res/bnVerifyClock_s.png create mode 100644 LedOK/res/bnVerifyClock_u.png create mode 100644 LedOK/res/encrypt.png create mode 100644 LedOK/res/ledset.png create mode 100644 LedOK/res/loop.png create mode 100644 LedOK/res/next.png create mode 100644 LedOK/res/next.psd create mode 100644 LedOK/res/previous.png create mode 100644 LedOK/res/reddot.png create mode 100644 LedOK/res/splash.png create mode 100644 LedOK/res/success - 副本.png create mode 100644 LedOK/res/success.png create mode 100644 LedOK/res/test.png create mode 100644 LedOK/res/test1.png create mode 100644 LedOK/res/tip.png create mode 100644 LedOK/res/true.jpg create mode 100644 LedOK/res/volume.png create mode 100644 LedOK/res/废弃/128Logo.png create mode 100644 LedOK/res/废弃/128x128logo.png create mode 100644 LedOK/res/废弃/AdvParam.psd create mode 100644 LedOK/res/废弃/Logo2 (2).ico create mode 100644 LedOK/res/废弃/Logo2.ico create mode 100644 LedOK/res/废弃/Logo2.png create mode 100644 LedOK/res/废弃/未标题-1.psd create mode 100644 LedOK/res/资源 6@10x.png create mode 100644 LedOK/sdl/include/SDL.h create mode 100644 LedOK/sdl/include/SDL_assert.h create mode 100644 LedOK/sdl/include/SDL_atomic.h create mode 100644 LedOK/sdl/include/SDL_audio.h create mode 100644 LedOK/sdl/include/SDL_bits.h create mode 100644 LedOK/sdl/include/SDL_blendmode.h create mode 100644 LedOK/sdl/include/SDL_clipboard.h create mode 100644 LedOK/sdl/include/SDL_config.h create mode 100644 LedOK/sdl/include/SDL_cpuinfo.h create mode 100644 LedOK/sdl/include/SDL_egl.h create mode 100644 LedOK/sdl/include/SDL_endian.h create mode 100644 LedOK/sdl/include/SDL_error.h create mode 100644 LedOK/sdl/include/SDL_events.h create mode 100644 LedOK/sdl/include/SDL_filesystem.h create mode 100644 LedOK/sdl/include/SDL_gamecontroller.h create mode 100644 LedOK/sdl/include/SDL_gesture.h create mode 100644 LedOK/sdl/include/SDL_haptic.h create mode 100644 LedOK/sdl/include/SDL_hints.h create mode 100644 LedOK/sdl/include/SDL_joystick.h create mode 100644 LedOK/sdl/include/SDL_keyboard.h create mode 100644 LedOK/sdl/include/SDL_keycode.h create mode 100644 LedOK/sdl/include/SDL_loadso.h create mode 100644 LedOK/sdl/include/SDL_log.h create mode 100644 LedOK/sdl/include/SDL_main.h create mode 100644 LedOK/sdl/include/SDL_messagebox.h create mode 100644 LedOK/sdl/include/SDL_metal.h create mode 100644 LedOK/sdl/include/SDL_mouse.h create mode 100644 LedOK/sdl/include/SDL_mutex.h create mode 100644 LedOK/sdl/include/SDL_name.h create mode 100644 LedOK/sdl/include/SDL_opengl.h create mode 100644 LedOK/sdl/include/SDL_opengl_glext.h create mode 100644 LedOK/sdl/include/SDL_opengles.h create mode 100644 LedOK/sdl/include/SDL_opengles2.h create mode 100644 LedOK/sdl/include/SDL_opengles2_gl2.h create mode 100644 LedOK/sdl/include/SDL_opengles2_gl2ext.h create mode 100644 LedOK/sdl/include/SDL_opengles2_gl2platform.h create mode 100644 LedOK/sdl/include/SDL_opengles2_khrplatform.h create mode 100644 LedOK/sdl/include/SDL_pixels.h create mode 100644 LedOK/sdl/include/SDL_platform.h create mode 100644 LedOK/sdl/include/SDL_power.h create mode 100644 LedOK/sdl/include/SDL_quit.h create mode 100644 LedOK/sdl/include/SDL_rect.h create mode 100644 LedOK/sdl/include/SDL_render.h create mode 100644 LedOK/sdl/include/SDL_revision.h create mode 100644 LedOK/sdl/include/SDL_rwops.h create mode 100644 LedOK/sdl/include/SDL_scancode.h create mode 100644 LedOK/sdl/include/SDL_sensor.h create mode 100644 LedOK/sdl/include/SDL_shape.h create mode 100644 LedOK/sdl/include/SDL_stdinc.h create mode 100644 LedOK/sdl/include/SDL_surface.h create mode 100644 LedOK/sdl/include/SDL_system.h create mode 100644 LedOK/sdl/include/SDL_syswm.h create mode 100644 LedOK/sdl/include/SDL_test.h create mode 100644 LedOK/sdl/include/SDL_test_assert.h create mode 100644 LedOK/sdl/include/SDL_test_common.h create mode 100644 LedOK/sdl/include/SDL_test_compare.h create mode 100644 LedOK/sdl/include/SDL_test_crc32.h create mode 100644 LedOK/sdl/include/SDL_test_font.h create mode 100644 LedOK/sdl/include/SDL_test_fuzzer.h create mode 100644 LedOK/sdl/include/SDL_test_harness.h create mode 100644 LedOK/sdl/include/SDL_test_images.h create mode 100644 LedOK/sdl/include/SDL_test_log.h create mode 100644 LedOK/sdl/include/SDL_test_md5.h create mode 100644 LedOK/sdl/include/SDL_test_memory.h create mode 100644 LedOK/sdl/include/SDL_test_random.h create mode 100644 LedOK/sdl/include/SDL_thread.h create mode 100644 LedOK/sdl/include/SDL_timer.h create mode 100644 LedOK/sdl/include/SDL_touch.h create mode 100644 LedOK/sdl/include/SDL_types.h create mode 100644 LedOK/sdl/include/SDL_version.h create mode 100644 LedOK/sdl/include/SDL_video.h create mode 100644 LedOK/sdl/include/SDL_vulkan.h create mode 100644 LedOK/sdl/include/begin_code.h create mode 100644 LedOK/sdl/include/close_code.h create mode 100644 LedOK/switchcontrol.cpp create mode 100644 LedOK/switchcontrol.h create mode 100644 LedOK/tipdialog.cpp create mode 100644 LedOK/tipdialog.h create mode 100644 LedOK/tipdialog.ui create mode 100644 LedOK/wDevicesManager/controladvparamwidget.cpp create mode 100644 LedOK/wDevicesManager/controladvparamwidget.h create mode 100644 LedOK/wDevicesManager/controladvparamwidget.ui create mode 100644 LedOK/wDevicesManager/controlbrightnessautowidget.cpp create mode 100644 LedOK/wDevicesManager/controlbrightnessautowidget.h create mode 100644 LedOK/wDevicesManager/controlbrightnessautowidget.ui create mode 100644 LedOK/wDevicesManager/controlbrightnessmanualwidget.cpp create mode 100644 LedOK/wDevicesManager/controlbrightnessmanualwidget.h create mode 100644 LedOK/wDevicesManager/controlbrightnessmanualwidget.ui create mode 100644 LedOK/wDevicesManager/controlbrightnessschedule.cpp create mode 100644 LedOK/wDevicesManager/controlbrightnessschedule.h create mode 100644 LedOK/wDevicesManager/controlbrightnessschedule.ui create mode 100644 LedOK/wDevicesManager/controlbrightnessscheduleedit.cpp create mode 100644 LedOK/wDevicesManager/controlbrightnessscheduleedit.h create mode 100644 LedOK/wDevicesManager/controlbrightnessscheduleedit.ui create mode 100644 LedOK/wDevicesManager/controlbrightnesswidget.cpp create mode 100644 LedOK/wDevicesManager/controlbrightnesswidget.h create mode 100644 LedOK/wDevicesManager/controlbrightnesswidget.ui create mode 100644 LedOK/wDevicesManager/controlencryptwidget.cpp create mode 100644 LedOK/wDevicesManager/controlencryptwidget.h create mode 100644 LedOK/wDevicesManager/controlencryptwidget.ui create mode 100644 LedOK/wDevicesManager/controlhdmimanual.cpp create mode 100644 LedOK/wDevicesManager/controlhdmimanual.h create mode 100644 LedOK/wDevicesManager/controlhdmimanual.ui create mode 100644 LedOK/wDevicesManager/controlhdmischedule.cpp create mode 100644 LedOK/wDevicesManager/controlhdmischedule.h create mode 100644 LedOK/wDevicesManager/controlhdmischedule.ui create mode 100644 LedOK/wDevicesManager/controlhdmiwidget.cpp create mode 100644 LedOK/wDevicesManager/controlhdmiwidget.h create mode 100644 LedOK/wDevicesManager/controlhdmiwidget.ui create mode 100644 LedOK/wDevicesManager/controlnetconfigwidget.cpp create mode 100644 LedOK/wDevicesManager/controlnetconfigwidget.h create mode 100644 LedOK/wDevicesManager/controlnetconfigwidget.ui create mode 100644 LedOK/wDevicesManager/controlpowermanual.cpp create mode 100644 LedOK/wDevicesManager/controlpowermanual.h create mode 100644 LedOK/wDevicesManager/controlpowermanual.ui create mode 100644 LedOK/wDevicesManager/controlpowerschedule.cpp create mode 100644 LedOK/wDevicesManager/controlpowerschedule.h create mode 100644 LedOK/wDevicesManager/controlpowerschedule.ui create mode 100644 LedOK/wDevicesManager/controlpowerwidget.cpp create mode 100644 LedOK/wDevicesManager/controlpowerwidget.h create mode 100644 LedOK/wDevicesManager/controlpowerwidget.ui create mode 100644 LedOK/wDevicesManager/controltestwidget.cpp create mode 100644 LedOK/wDevicesManager/controltestwidget.h create mode 100644 LedOK/wDevicesManager/controltestwidget.ui create mode 100644 LedOK/wDevicesManager/controlverifyclockwidget.cpp create mode 100644 LedOK/wDevicesManager/controlverifyclockwidget.h create mode 100644 LedOK/wDevicesManager/controlverifyclockwidget.ui create mode 100644 LedOK/wDevicesManager/controlvolumemanual.cpp create mode 100644 LedOK/wDevicesManager/controlvolumemanual.h create mode 100644 LedOK/wDevicesManager/controlvolumemanual.ui create mode 100644 LedOK/wDevicesManager/controlvolumeschedule.cpp create mode 100644 LedOK/wDevicesManager/controlvolumeschedule.h create mode 100644 LedOK/wDevicesManager/controlvolumeschedule.ui create mode 100644 LedOK/wDevicesManager/controlvolumewidget.cpp create mode 100644 LedOK/wDevicesManager/controlvolumewidget.h create mode 100644 LedOK/wDevicesManager/controlvolumewidget.ui create mode 100644 LedOK/wDevicesManager/devicescontrollwidget.cpp create mode 100644 LedOK/wDevicesManager/devicescontrollwidget.h create mode 100644 LedOK/wDevicesManager/devicescontrollwidget.ui create mode 100644 LedOK/wDevicesManager/inputpassworddialog.cpp create mode 100644 LedOK/wDevicesManager/inputpassworddialog.h create mode 100644 LedOK/wDevicesManager/inputpassworddialog.ui create mode 100644 LedOK/wDevicesManager/ledcard.cpp create mode 100644 LedOK/wDevicesManager/ledcard.h create mode 100644 LedOK/wDevicesManager/specialdlg.cpp create mode 100644 LedOK/wDevicesManager/specialdlg.h create mode 100644 LedOK/wDevicesManager/specialdlg.ui create mode 100644 LedOK/wDevicesManager/subspecifyip.cpp create mode 100644 LedOK/wDevicesManager/subspecifyip.h create mode 100644 LedOK/wDevicesManager/subspecifyip.ui create mode 100644 LedOK/wDevicesManager/subspecifyiprange.cpp create mode 100644 LedOK/wDevicesManager/subspecifyiprange.h create mode 100644 LedOK/wDevicesManager/subspecifyiprange.ui create mode 100644 LedOK/wDevicesManager/threadupgradeapk.cpp create mode 100644 LedOK/wDevicesManager/threadupgradeapk.h create mode 100644 LedOK/wDevicesManager/upgradeapkdialog.cpp create mode 100644 LedOK/wDevicesManager/upgradeapkdialog.h create mode 100644 LedOK/wDevicesManager/upgradeapkdialog.ui create mode 100644 LedOK/wDevicesManager/wdevicesitem.cpp create mode 100644 LedOK/wDevicesManager/wdevicesitem.h create mode 100644 LedOK/wDevicesManager/wupgradeapkitem.cpp create mode 100644 LedOK/wDevicesManager/wupgradeapkitem.h create mode 100644 LedOK/wProgramManager/mconverter.cpp create mode 100644 LedOK/wProgramManager/mconverter.h create mode 100644 LedOK/wProgramManager/sendprogramdialog.cpp create mode 100644 LedOK/wProgramManager/sendprogramdialog.h create mode 100644 LedOK/wProgramManager/sendprogramdialog.ui create mode 100644 LedOK/wProgramManager/threadexportprogrampro.cpp create mode 100644 LedOK/wProgramManager/threadexportprogrampro.h create mode 100644 LedOK/wProgramManager/threadsendpro.cpp create mode 100644 LedOK/wProgramManager/threadsendpro.h create mode 100644 LedOK/wProgramManager/usbdetectdialog.cpp create mode 100644 LedOK/wProgramManager/usbdetectdialog.h create mode 100644 LedOK/wProgramManager/usbdetectdialog.ui create mode 100644 LedOK/wProgramManager/usbdiskfuncdialog.cpp create mode 100644 LedOK/wProgramManager/usbdiskfuncdialog.h create mode 100644 LedOK/wProgramManager/usbdiskfuncdialog.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/AbstractVideoFrame.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/AbstractVideoStream.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Audio.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Common.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Config.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Enums.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Equalizer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Error.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Instance.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Media.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/MediaList.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/MediaListPlayer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/MediaPlayer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/MetaManager.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/ModuleDescription.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/SharedExportCore.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Stats.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/TrackModel.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/Video.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/VideoDelegate.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/VideoFrame.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/VideoMemoryStream.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/VideoStream.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtCore/YUVVideoFrame.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtQml/Qml.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtQml/QmlPlayer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtQml/QmlSource.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtQml/QmlVideoObject.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtQml/QmlVideoOutput.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtQml/QmlVideoPlayer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtQml/SharedExportQml.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtWidgets/ControlAudio.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtWidgets/ControlVideo.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtWidgets/SharedExportWidgets.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtWidgets/WidgetSeek.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtWidgets/WidgetSeekProgress.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtWidgets/WidgetVideo.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/include/VLCQtWidgets/WidgetVolumeSlider.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQt/VLCQtConfig.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQt/VLCQtConfigVersion.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtCore/VLCQtCoreConfig.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtCore/VLCQtCoreConfigVersion.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtCore/VLCQtCoreTargets-debug.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtCore/VLCQtCoreTargets-release.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtCore/VLCQtCoreTargets.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtQml/VLCQtQmlConfig.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtQml/VLCQtQmlConfigVersion.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtQml/VLCQtQmlTargets-debug.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtQml/VLCQtQmlTargets-release.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtQml/VLCQtQmlTargets.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtWidgets/VLCQtWidgetsConfig.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtWidgets/VLCQtWidgetsConfigVersion.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtWidgets/VLCQtWidgetsTargets-debug.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtWidgets/VLCQtWidgetsTargets-release.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/cmake/VLCQtWidgets/VLCQtWidgetsTargets.cmake create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/pkgconfig/libVLCQtCore.pc create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/pkgconfig/libVLCQtQml.pc create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/pkgconfig/libVLCQtWidgets.pc create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/VLC-Qt_1.1.0_win32_mingw/lib/simple-player - 快捷方式.lnk create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/backup/etext.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/backup/etext.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/client.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaclock.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaclock.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaclockattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaclockattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaclockattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaudio.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaudio.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaudioattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaudioattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eaudioattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/edclock.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/edclock.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/edclockattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/edclockattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/edclockattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/egif.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/egif.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/egifattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/egifattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/egifattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/emovie.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/emovie.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/emovieattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/emovieattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/emovieattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eobject.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eobject.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eobjectattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eobjectattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eobjectattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ephoto.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ephoto.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ephotoattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ephotoattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ephotoattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/erichedit.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etemp.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etemp.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etempattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etempattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etempattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etext.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etext.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextflipattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextflipattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextflipattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextinput.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextinput.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextinput.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextscrollattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextscrollattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextscrollattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextstaticattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextstaticattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etextstaticattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etimer.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etimer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etimerattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etimerattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/etimerattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eweather.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eweather.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eweatherattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eweatherattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/eweatherattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ewindow.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ewindow.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ewindowattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ewindowattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/ewindowattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/fyxcircleprogress.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/fyxcircleprogress.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/globaldata.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/globaldata.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/glyuvwidget.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/glyuvwidget.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/imagecutwidget.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/imagecutwidget.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/imagecutwidget.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/mpv/include/client.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/mpvplayer.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/mpvplayer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/qffwidget.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/qffwidget.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/qffwidget.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/videodec.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/videodec.h create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/videoplayer.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wElement/videoplayer.h create mode 100644 LedOK/wProgramManager/wEditProgram/wattrview.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wattrview.h create mode 100644 LedOK/wProgramManager/wEditProgram/wattrview.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wdrawingboard.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wdrawingboard.h create mode 100644 LedOK/wProgramManager/wEditProgram/wmaintoolbar.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wmaintoolbar.h create mode 100644 LedOK/wProgramManager/wEditProgram/wpageattr.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wpageattr.h create mode 100644 LedOK/wProgramManager/wEditProgram/wpageattr.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wpageitem.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wpageitem.h create mode 100644 LedOK/wProgramManager/wEditProgram/wpageitemwidget.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wpageitemwidget.h create mode 100644 LedOK/wProgramManager/wEditProgram/wpageitemwidget.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wpagelist.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wpagelist.h create mode 100644 LedOK/wProgramManager/wEditProgram/wplanitem.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wplanitem.h create mode 100644 LedOK/wProgramManager/wEditProgram/wplanitem.ui create mode 100644 LedOK/wProgramManager/wEditProgram/wplanlist.cpp create mode 100644 LedOK/wProgramManager/wEditProgram/wplanlist.h create mode 100644 LedOK/wProgramManager/weditprogram.cpp create mode 100644 LedOK/wProgramManager/weditprogram.h create mode 100644 LedOK/wProgramManager/weditprogram.ui create mode 100644 LedOK/wProgramManager/wexportprogramitem.cpp create mode 100644 LedOK/wProgramManager/wexportprogramitem.h create mode 100644 LedOK/wProgramManager/wnewprogram.cpp create mode 100644 LedOK/wProgramManager/wnewprogram.h create mode 100644 LedOK/wProgramManager/wnewprogram.ui create mode 100644 LedOK/wProgramManager/wprogramitem.cpp create mode 100644 LedOK/wProgramManager/wprogramitem.h create mode 100644 LedOK/wProgramManager/wprogrampublishitem.cpp create mode 100644 LedOK/wProgramManager/wprogrampublishitem.h create mode 100644 LedOK/wProgramManagerA/wprogramitema.cpp create mode 100644 LedOK/wProgramManagerA/wprogramitema.h create mode 100644 LedOK/x_uimsgonlyclosebtn.cpp create mode 100644 LedOK/x_uimsgonlyclosebtn.h create mode 100644 LedOK/x_uimsgonlyclosebtn.ui create mode 100644 LedOK/~$BrightnessTable.xlsx create mode 100644 SDL2/bin/sdl2-config create mode 100644 SDL2/include/SDL.h create mode 100644 SDL2/include/SDL2/SDL.h create mode 100644 SDL2/include/SDL2/SDL_assert.h create mode 100644 SDL2/include/SDL2/SDL_atomic.h create mode 100644 SDL2/include/SDL2/SDL_audio.h create mode 100644 SDL2/include/SDL2/SDL_bits.h create mode 100644 SDL2/include/SDL2/SDL_blendmode.h create mode 100644 SDL2/include/SDL2/SDL_clipboard.h create mode 100644 SDL2/include/SDL2/SDL_config.h create mode 100644 SDL2/include/SDL2/SDL_cpuinfo.h create mode 100644 SDL2/include/SDL2/SDL_egl.h create mode 100644 SDL2/include/SDL2/SDL_endian.h create mode 100644 SDL2/include/SDL2/SDL_error.h create mode 100644 SDL2/include/SDL2/SDL_events.h create mode 100644 SDL2/include/SDL2/SDL_filesystem.h create mode 100644 SDL2/include/SDL2/SDL_gamecontroller.h create mode 100644 SDL2/include/SDL2/SDL_gesture.h create mode 100644 SDL2/include/SDL2/SDL_haptic.h create mode 100644 SDL2/include/SDL2/SDL_hints.h create mode 100644 SDL2/include/SDL2/SDL_joystick.h create mode 100644 SDL2/include/SDL2/SDL_keyboard.h create mode 100644 SDL2/include/SDL2/SDL_keycode.h create mode 100644 SDL2/include/SDL2/SDL_loadso.h create mode 100644 SDL2/include/SDL2/SDL_locale.h create mode 100644 SDL2/include/SDL2/SDL_log.h create mode 100644 SDL2/include/SDL2/SDL_main.h create mode 100644 SDL2/include/SDL2/SDL_messagebox.h create mode 100644 SDL2/include/SDL2/SDL_metal.h create mode 100644 SDL2/include/SDL2/SDL_misc.h create mode 100644 SDL2/include/SDL2/SDL_mouse.h create mode 100644 SDL2/include/SDL2/SDL_mutex.h create mode 100644 SDL2/include/SDL2/SDL_name.h create mode 100644 SDL2/include/SDL2/SDL_opengl.h create mode 100644 SDL2/include/SDL2/SDL_opengl_glext.h create mode 100644 SDL2/include/SDL2/SDL_opengles.h create mode 100644 SDL2/include/SDL2/SDL_opengles2.h create mode 100644 SDL2/include/SDL2/SDL_opengles2_gl2.h create mode 100644 SDL2/include/SDL2/SDL_opengles2_gl2ext.h create mode 100644 SDL2/include/SDL2/SDL_opengles2_gl2platform.h create mode 100644 SDL2/include/SDL2/SDL_opengles2_khrplatform.h create mode 100644 SDL2/include/SDL2/SDL_pixels.h create mode 100644 SDL2/include/SDL2/SDL_platform.h create mode 100644 SDL2/include/SDL2/SDL_power.h create mode 100644 SDL2/include/SDL2/SDL_quit.h create mode 100644 SDL2/include/SDL2/SDL_rect.h create mode 100644 SDL2/include/SDL2/SDL_render.h create mode 100644 SDL2/include/SDL2/SDL_revision.h create mode 100644 SDL2/include/SDL2/SDL_rwops.h create mode 100644 SDL2/include/SDL2/SDL_scancode.h create mode 100644 SDL2/include/SDL2/SDL_sensor.h create mode 100644 SDL2/include/SDL2/SDL_shape.h create mode 100644 SDL2/include/SDL2/SDL_stdinc.h create mode 100644 SDL2/include/SDL2/SDL_surface.h create mode 100644 SDL2/include/SDL2/SDL_system.h create mode 100644 SDL2/include/SDL2/SDL_syswm.h create mode 100644 SDL2/include/SDL2/SDL_test.h create mode 100644 SDL2/include/SDL2/SDL_test_assert.h create mode 100644 SDL2/include/SDL2/SDL_test_common.h create mode 100644 SDL2/include/SDL2/SDL_test_compare.h create mode 100644 SDL2/include/SDL2/SDL_test_crc32.h create mode 100644 SDL2/include/SDL2/SDL_test_font.h create mode 100644 SDL2/include/SDL2/SDL_test_fuzzer.h create mode 100644 SDL2/include/SDL2/SDL_test_harness.h create mode 100644 SDL2/include/SDL2/SDL_test_images.h create mode 100644 SDL2/include/SDL2/SDL_test_log.h create mode 100644 SDL2/include/SDL2/SDL_test_md5.h create mode 100644 SDL2/include/SDL2/SDL_test_memory.h create mode 100644 SDL2/include/SDL2/SDL_test_random.h create mode 100644 SDL2/include/SDL2/SDL_thread.h create mode 100644 SDL2/include/SDL2/SDL_timer.h create mode 100644 SDL2/include/SDL2/SDL_touch.h create mode 100644 SDL2/include/SDL2/SDL_types.h create mode 100644 SDL2/include/SDL2/SDL_version.h create mode 100644 SDL2/include/SDL2/SDL_video.h create mode 100644 SDL2/include/SDL2/SDL_vulkan.h create mode 100644 SDL2/include/SDL2/begin_code.h create mode 100644 SDL2/include/SDL2/close_code.h create mode 100644 SDL2/include/SDL_assert.h create mode 100644 SDL2/include/SDL_atomic.h create mode 100644 SDL2/include/SDL_audio.h create mode 100644 SDL2/include/SDL_bits.h create mode 100644 SDL2/include/SDL_blendmode.h create mode 100644 SDL2/include/SDL_clipboard.h create mode 100644 SDL2/include/SDL_config.h create mode 100644 SDL2/include/SDL_cpuinfo.h create mode 100644 SDL2/include/SDL_egl.h create mode 100644 SDL2/include/SDL_endian.h create mode 100644 SDL2/include/SDL_error.h create mode 100644 SDL2/include/SDL_events.h create mode 100644 SDL2/include/SDL_filesystem.h create mode 100644 SDL2/include/SDL_gamecontroller.h create mode 100644 SDL2/include/SDL_gesture.h create mode 100644 SDL2/include/SDL_haptic.h create mode 100644 SDL2/include/SDL_hints.h create mode 100644 SDL2/include/SDL_joystick.h create mode 100644 SDL2/include/SDL_keyboard.h create mode 100644 SDL2/include/SDL_keycode.h create mode 100644 SDL2/include/SDL_loadso.h create mode 100644 SDL2/include/SDL_locale.h create mode 100644 SDL2/include/SDL_log.h create mode 100644 SDL2/include/SDL_main.h create mode 100644 SDL2/include/SDL_messagebox.h create mode 100644 SDL2/include/SDL_metal.h create mode 100644 SDL2/include/SDL_misc.h create mode 100644 SDL2/include/SDL_mouse.h create mode 100644 SDL2/include/SDL_mutex.h create mode 100644 SDL2/include/SDL_name.h create mode 100644 SDL2/include/SDL_opengl.h create mode 100644 SDL2/include/SDL_opengl_glext.h create mode 100644 SDL2/include/SDL_opengles.h create mode 100644 SDL2/include/SDL_opengles2.h create mode 100644 SDL2/include/SDL_opengles2_gl2.h create mode 100644 SDL2/include/SDL_opengles2_gl2ext.h create mode 100644 SDL2/include/SDL_opengles2_gl2platform.h create mode 100644 SDL2/include/SDL_opengles2_khrplatform.h create mode 100644 SDL2/include/SDL_pixels.h create mode 100644 SDL2/include/SDL_platform.h create mode 100644 SDL2/include/SDL_power.h create mode 100644 SDL2/include/SDL_quit.h create mode 100644 SDL2/include/SDL_rect.h create mode 100644 SDL2/include/SDL_render.h create mode 100644 SDL2/include/SDL_revision.h create mode 100644 SDL2/include/SDL_rwops.h create mode 100644 SDL2/include/SDL_scancode.h create mode 100644 SDL2/include/SDL_sensor.h create mode 100644 SDL2/include/SDL_shape.h create mode 100644 SDL2/include/SDL_stdinc.h create mode 100644 SDL2/include/SDL_surface.h create mode 100644 SDL2/include/SDL_system.h create mode 100644 SDL2/include/SDL_syswm.h create mode 100644 SDL2/include/SDL_test.h create mode 100644 SDL2/include/SDL_test_assert.h create mode 100644 SDL2/include/SDL_test_common.h create mode 100644 SDL2/include/SDL_test_compare.h create mode 100644 SDL2/include/SDL_test_crc32.h create mode 100644 SDL2/include/SDL_test_font.h create mode 100644 SDL2/include/SDL_test_fuzzer.h create mode 100644 SDL2/include/SDL_test_harness.h create mode 100644 SDL2/include/SDL_test_images.h create mode 100644 SDL2/include/SDL_test_log.h create mode 100644 SDL2/include/SDL_test_md5.h create mode 100644 SDL2/include/SDL_test_memory.h create mode 100644 SDL2/include/SDL_test_random.h create mode 100644 SDL2/include/SDL_thread.h create mode 100644 SDL2/include/SDL_timer.h create mode 100644 SDL2/include/SDL_touch.h create mode 100644 SDL2/include/SDL_types.h create mode 100644 SDL2/include/SDL_version.h create mode 100644 SDL2/include/SDL_video.h create mode 100644 SDL2/include/SDL_vulkan.h create mode 100644 SDL2/include/begin_code.h create mode 100644 SDL2/include/close_code.h create mode 100644 SDL2/lib/cmake/SDL2/sdl2-config-version.cmake create mode 100644 SDL2/lib/cmake/SDL2/sdl2-config.cmake create mode 100644 SDL2/lib/pkgconfig/sdl2.pc create mode 100644 SDL2/share/aclocal/sdl2.m4 create mode 100644 ffmpeg/bin/ffmpeg create mode 100644 ffmpeg/bin/ffmpeg.exe create mode 100644 ffmpeg/bin/ffplay create mode 100644 ffmpeg/bin/ffplay.exe create mode 100644 ffmpeg/bin/ffprobe create mode 100644 ffmpeg/bin/ffprobe.exe create mode 100644 ffmpeg/include/libavcodec/ac3_parser.h create mode 100644 ffmpeg/include/libavcodec/adts_parser.h create mode 100644 ffmpeg/include/libavcodec/avcodec.h create mode 100644 ffmpeg/include/libavcodec/avdct.h create mode 100644 ffmpeg/include/libavcodec/avfft.h create mode 100644 ffmpeg/include/libavcodec/d3d11va.h create mode 100644 ffmpeg/include/libavcodec/dirac.h create mode 100644 ffmpeg/include/libavcodec/dv_profile.h create mode 100644 ffmpeg/include/libavcodec/dxva2.h create mode 100644 ffmpeg/include/libavcodec/jni.h create mode 100644 ffmpeg/include/libavcodec/mediacodec.h create mode 100644 ffmpeg/include/libavcodec/qsv.h create mode 100644 ffmpeg/include/libavcodec/vaapi.h create mode 100644 ffmpeg/include/libavcodec/vdpau.h create mode 100644 ffmpeg/include/libavcodec/version.h create mode 100644 ffmpeg/include/libavcodec/videotoolbox.h create mode 100644 ffmpeg/include/libavcodec/vorbis_parser.h create mode 100644 ffmpeg/include/libavcodec/xvmc.h create mode 100644 ffmpeg/include/libavdevice/avdevice.h create mode 100644 ffmpeg/include/libavdevice/version.h create mode 100644 ffmpeg/include/libavfilter/avfilter.h create mode 100644 ffmpeg/include/libavfilter/buffersink.h create mode 100644 ffmpeg/include/libavfilter/buffersrc.h create mode 100644 ffmpeg/include/libavfilter/version.h create mode 100644 ffmpeg/include/libavformat/avformat.h create mode 100644 ffmpeg/include/libavformat/avio.h create mode 100644 ffmpeg/include/libavformat/version.h create mode 100644 ffmpeg/include/libavutil/adler32.h create mode 100644 ffmpeg/include/libavutil/aes.h create mode 100644 ffmpeg/include/libavutil/aes_ctr.h create mode 100644 ffmpeg/include/libavutil/attributes.h create mode 100644 ffmpeg/include/libavutil/audio_fifo.h create mode 100644 ffmpeg/include/libavutil/avassert.h create mode 100644 ffmpeg/include/libavutil/avconfig.h create mode 100644 ffmpeg/include/libavutil/avstring.h create mode 100644 ffmpeg/include/libavutil/avutil.h create mode 100644 ffmpeg/include/libavutil/base64.h create mode 100644 ffmpeg/include/libavutil/blowfish.h create mode 100644 ffmpeg/include/libavutil/bprint.h create mode 100644 ffmpeg/include/libavutil/bswap.h create mode 100644 ffmpeg/include/libavutil/buffer.h create mode 100644 ffmpeg/include/libavutil/camellia.h create mode 100644 ffmpeg/include/libavutil/cast5.h create mode 100644 ffmpeg/include/libavutil/channel_layout.h create mode 100644 ffmpeg/include/libavutil/common.h create mode 100644 ffmpeg/include/libavutil/cpu.h create mode 100644 ffmpeg/include/libavutil/crc.h create mode 100644 ffmpeg/include/libavutil/des.h create mode 100644 ffmpeg/include/libavutil/dict.h create mode 100644 ffmpeg/include/libavutil/display.h create mode 100644 ffmpeg/include/libavutil/downmix_info.h create mode 100644 ffmpeg/include/libavutil/encryption_info.h create mode 100644 ffmpeg/include/libavutil/error.h create mode 100644 ffmpeg/include/libavutil/eval.h create mode 100644 ffmpeg/include/libavutil/ffversion.h create mode 100644 ffmpeg/include/libavutil/fifo.h create mode 100644 ffmpeg/include/libavutil/file.h create mode 100644 ffmpeg/include/libavutil/frame.h create mode 100644 ffmpeg/include/libavutil/hash.h create mode 100644 ffmpeg/include/libavutil/hdr_dynamic_metadata.h create mode 100644 ffmpeg/include/libavutil/hmac.h create mode 100644 ffmpeg/include/libavutil/hwcontext.h create mode 100644 ffmpeg/include/libavutil/hwcontext_cuda.h create mode 100644 ffmpeg/include/libavutil/hwcontext_d3d11va.h create mode 100644 ffmpeg/include/libavutil/hwcontext_drm.h create mode 100644 ffmpeg/include/libavutil/hwcontext_dxva2.h create mode 100644 ffmpeg/include/libavutil/hwcontext_mediacodec.h create mode 100644 ffmpeg/include/libavutil/hwcontext_qsv.h create mode 100644 ffmpeg/include/libavutil/hwcontext_vaapi.h create mode 100644 ffmpeg/include/libavutil/hwcontext_vdpau.h create mode 100644 ffmpeg/include/libavutil/hwcontext_videotoolbox.h create mode 100644 ffmpeg/include/libavutil/imgutils.h create mode 100644 ffmpeg/include/libavutil/intfloat.h create mode 100644 ffmpeg/include/libavutil/intreadwrite.h create mode 100644 ffmpeg/include/libavutil/lfg.h create mode 100644 ffmpeg/include/libavutil/log.h create mode 100644 ffmpeg/include/libavutil/lzo.h create mode 100644 ffmpeg/include/libavutil/macros.h create mode 100644 ffmpeg/include/libavutil/mastering_display_metadata.h create mode 100644 ffmpeg/include/libavutil/mathematics.h create mode 100644 ffmpeg/include/libavutil/md5.h create mode 100644 ffmpeg/include/libavutil/mem.h create mode 100644 ffmpeg/include/libavutil/motion_vector.h create mode 100644 ffmpeg/include/libavutil/murmur3.h create mode 100644 ffmpeg/include/libavutil/opt.h create mode 100644 ffmpeg/include/libavutil/parseutils.h create mode 100644 ffmpeg/include/libavutil/pixdesc.h create mode 100644 ffmpeg/include/libavutil/pixelutils.h create mode 100644 ffmpeg/include/libavutil/pixfmt.h create mode 100644 ffmpeg/include/libavutil/random_seed.h create mode 100644 ffmpeg/include/libavutil/rational.h create mode 100644 ffmpeg/include/libavutil/rc4.h create mode 100644 ffmpeg/include/libavutil/replaygain.h create mode 100644 ffmpeg/include/libavutil/ripemd.h create mode 100644 ffmpeg/include/libavutil/samplefmt.h create mode 100644 ffmpeg/include/libavutil/sha.h create mode 100644 ffmpeg/include/libavutil/sha512.h create mode 100644 ffmpeg/include/libavutil/spherical.h create mode 100644 ffmpeg/include/libavutil/stereo3d.h create mode 100644 ffmpeg/include/libavutil/tea.h create mode 100644 ffmpeg/include/libavutil/threadmessage.h create mode 100644 ffmpeg/include/libavutil/time.h create mode 100644 ffmpeg/include/libavutil/timecode.h create mode 100644 ffmpeg/include/libavutil/timestamp.h create mode 100644 ffmpeg/include/libavutil/tree.h create mode 100644 ffmpeg/include/libavutil/twofish.h create mode 100644 ffmpeg/include/libavutil/tx.h create mode 100644 ffmpeg/include/libavutil/version.h create mode 100644 ffmpeg/include/libavutil/xtea.h create mode 100644 ffmpeg/include/libpostproc/postprocess.h create mode 100644 ffmpeg/include/libpostproc/version.h create mode 100644 ffmpeg/include/libswresample/swresample.h create mode 100644 ffmpeg/include/libswresample/version.h create mode 100644 ffmpeg/include/libswscale/swscale.h create mode 100644 ffmpeg/include/libswscale/version.h create mode 100644 ffmpeg/lib/avcodec-58.def create mode 100644 ffmpeg/lib/avcodec.lib create mode 100644 ffmpeg/lib/avdevice-58.def create mode 100644 ffmpeg/lib/avdevice.lib create mode 100644 ffmpeg/lib/avfilter-7.def create mode 100644 ffmpeg/lib/avfilter.lib create mode 100644 ffmpeg/lib/avformat-58.def create mode 100644 ffmpeg/lib/avformat.lib create mode 100644 ffmpeg/lib/avutil-56.def create mode 100644 ffmpeg/lib/avutil.lib create mode 100644 ffmpeg/lib/ffmpeg.exe create mode 100644 ffmpeg/lib/ffplay.exe create mode 100644 ffmpeg/lib/ffprobe.exe create mode 100644 ffmpeg/lib/postproc-55.def create mode 100644 ffmpeg/lib/postproc.lib create mode 100644 ffmpeg/lib/swresample-3.def create mode 100644 ffmpeg/lib/swresample.lib create mode 100644 ffmpeg/lib/swscale-5.def create mode 100644 ffmpeg/lib/swscale.lib diff --git a/LedOK/.gitignore b/LedOK/.gitignore new file mode 100644 index 0000000..174dcf5 --- /dev/null +++ b/LedOK/.gitignore @@ -0,0 +1,38 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +.DS_Store + +# Custom +*.pro.user +*.pro.user.* +*.rar diff --git a/LedOK/BrightnessTable.xlsx b/LedOK/BrightnessTable.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2f980b4dbc12ca3dc25269f6ce9f606101446d7d GIT binary patch literal 16384 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�iOS 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 H;L`sA>meNN literal 0 HcmV?d00001 diff --git a/LedOK/Btb b/LedOK/Btb new file mode 100644 index 0000000000000000000000000000000000000000..c0ab555b82250acf47be3811b5127108aafbd8e6 GIT binary patch literal 44065 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 +#include +#include "BasicColorArea.h" + +BasicColorArea::BasicColorArea(QWidget *parent) + : QWidget(parent) +{ + //initColorItems(); +} + +BasicColorArea::~BasicColorArea() +{ + +} + +void BasicColorArea::initColorItems(bool bAlpha) +{ + BasicColorItem *pItem11 = new BasicColorItem(QColor(0, 0, 0,255)); + BasicColorItem *pItem12 = new BasicColorItem(QColor(51, 51, 51,255)); + BasicColorItem *pItem13 = new BasicColorItem(QColor(102, 102, 102,255)); + BasicColorItem *pItem14 = new BasicColorItem(QColor(153, 153, 153,255)); + BasicColorItem *pItem15 = new BasicColorItem(QColor(204, 204, 204,255)); + BasicColorItem *pItem16 = new BasicColorItem(QColor(221, 221, 221,255)); + BasicColorItem *pItem17 = new BasicColorItem(QColor(238, 238, 238,255)); + BasicColorItem *pItem18 = new BasicColorItem(QColor(255, 255, 255,255)); + QHBoxLayout *pLayout1 = new QHBoxLayout; + pLayout1->setMargin(0); + pLayout1->setSpacing(2); + pLayout1->addWidget(pItem11); + pLayout1->addWidget(pItem12); + pLayout1->addWidget(pItem13); + pLayout1->addWidget(pItem14); + pLayout1->addWidget(pItem15); + pLayout1->addWidget(pItem16); + pLayout1->addWidget(pItem17); + pLayout1->addWidget(pItem18); + +// BasicColorItem *pItem21 = new BasicColorItem(QColor(207, 42, 39,255)); +// BasicColorItem *pItem22 = new BasicColorItem(QColor(255, 153, 0,255)); +// BasicColorItem *pItem23 = new BasicColorItem(QColor(255, 255, 0,255)); +// BasicColorItem *pItem24 = new BasicColorItem(QColor(0, 158, 15,255)); +// BasicColorItem *pItem25 = new BasicColorItem(QColor(0, 255, 255,255)); +// BasicColorItem *pItem26 = new BasicColorItem(QColor(43, 120, 228,255)); +// BasicColorItem *pItem27 = new BasicColorItem(QColor(153, 0, 255,255)); +// BasicColorItem *pItem28 = new BasicColorItem(QColor(255, 0, 255,255)); + BasicColorItem *pItem21 = new BasicColorItem(QColor(255, 0, 0,255)); + BasicColorItem *pItem22 = new BasicColorItem(QColor(0, 255, 0,255)); + BasicColorItem *pItem23 = new BasicColorItem(QColor(0, 0, 255,255)); + BasicColorItem *pItem24 = new BasicColorItem(QColor(255, 255, 0,255)); + BasicColorItem *pItem25 = new BasicColorItem(QColor(0, 255, 255,255)); + BasicColorItem *pItem26 = new BasicColorItem(QColor(255, 0, 255,255)); + BasicColorItem *pItem27 = new BasicColorItem(QColor(255, 128, 255,255)); + BasicColorItem *pItem28 = new BasicColorItem(QColor(128, 0, 128,255)); + + QHBoxLayout *pLayout2 = new QHBoxLayout; + pLayout2->setMargin(0); + pLayout2->setSpacing(2); + pLayout2->addWidget(pItem21); + pLayout2->addWidget(pItem22); + pLayout2->addWidget(pItem23); + pLayout2->addWidget(pItem24); + pLayout2->addWidget(pItem25); + pLayout2->addWidget(pItem26); + pLayout2->addWidget(pItem27); + pLayout2->addWidget(pItem28); + + BasicColorItem *pItem31 = new BasicColorItem(QColor(234, 153, 153,255)); + BasicColorItem *pItem32 = new BasicColorItem(QColor(249, 203, 156,255)); + BasicColorItem *pItem33 = new BasicColorItem(QColor(255, 229, 153,255)); + BasicColorItem *pItem34 = new BasicColorItem(QColor(182, 215, 168,255)); + BasicColorItem *pItem35 = new BasicColorItem(QColor(162, 196, 201,255)); + BasicColorItem *pItem36 = new BasicColorItem(QColor(159, 197, 248,255)); + BasicColorItem *pItem37 = new BasicColorItem(QColor(180, 167, 214,255)); + BasicColorItem *pItem38 = new BasicColorItem(QColor(213, 166, 189,255)); + QHBoxLayout *pLayout3 = new QHBoxLayout; + pLayout3->setMargin(0); + pLayout3->setSpacing(2); + pLayout3->addWidget(pItem31); + pLayout3->addWidget(pItem32); + pLayout3->addWidget(pItem33); + pLayout3->addWidget(pItem34); + pLayout3->addWidget(pItem35); + pLayout3->addWidget(pItem36); + pLayout3->addWidget(pItem37); + pLayout3->addWidget(pItem38); + + BasicColorItem *pItem41 = new BasicColorItem(QColor(224, 102, 102,255)); + BasicColorItem *pItem42 = new BasicColorItem(QColor(246, 178, 107,255)); + BasicColorItem *pItem43 = new BasicColorItem(QColor(255, 217, 102,255)); + BasicColorItem *pItem44 = new BasicColorItem(QColor(147, 196, 125,255)); + BasicColorItem *pItem45 = new BasicColorItem(QColor(118, 165, 175,255)); + BasicColorItem *pItem46 = new BasicColorItem(QColor(111, 168, 220,255)); + BasicColorItem *pItem47 = new BasicColorItem(QColor(142, 124, 195,255)); + BasicColorItem *pItem48 = new BasicColorItem(QColor(194, 123, 160,255)); + QHBoxLayout *pLayout4 = new QHBoxLayout; + pLayout4->setMargin(0); + pLayout4->setSpacing(2); + pLayout4->addWidget(pItem41); + pLayout4->addWidget(pItem42); + pLayout4->addWidget(pItem43); + pLayout4->addWidget(pItem44); + pLayout4->addWidget(pItem45); + pLayout4->addWidget(pItem46); + pLayout4->addWidget(pItem47); + pLayout4->addWidget(pItem48); + + BasicColorItem *pItem51 = new BasicColorItem(QColor(204, 0, 0,255)); + BasicColorItem *pItem52 = new BasicColorItem(QColor(230, 145, 56,255)); + BasicColorItem *pItem53 = new BasicColorItem(QColor(241, 194, 50,255)); + BasicColorItem *pItem54 = new BasicColorItem(QColor(106, 168, 79,255)); + BasicColorItem *pItem55 = new BasicColorItem(QColor(69, 129, 142,255)); + BasicColorItem *pItem56 = new BasicColorItem(QColor(89, 126, 170,255)); + BasicColorItem *pItem57 = new BasicColorItem(QColor(103, 78, 167,255)); + BasicColorItem *pItem58 = new BasicColorItem(QColor(166, 77, 121,255)); + QHBoxLayout *pLayout5 = new QHBoxLayout; + pLayout5->setMargin(0); + pLayout5->setSpacing(2); + pLayout5->addWidget(pItem51); + pLayout5->addWidget(pItem52); + pLayout5->addWidget(pItem53); + pLayout5->addWidget(pItem54); + pLayout5->addWidget(pItem55); + pLayout5->addWidget(pItem56); + pLayout5->addWidget(pItem57); + pLayout5->addWidget(pItem58); + + BasicColorItem *pItem61 = new BasicColorItem(QColor(153, 0, 0,255)); + BasicColorItem *pItem62 = new BasicColorItem(QColor(180, 95, 6,255)); + BasicColorItem *pItem63 = new BasicColorItem(QColor(119, 144, 0,255)); + BasicColorItem *pItem64 = new BasicColorItem(QColor(56, 118, 29,255)); + BasicColorItem *pItem65 = new BasicColorItem(QColor(19, 79, 92,255)); + BasicColorItem *pItem66 = new BasicColorItem(QColor(8, 83, 148,255)); + BasicColorItem *pItem67 = new BasicColorItem(QColor(52, 28, 117,255)); + BasicColorItem *pItem68 = new BasicColorItem(QColor(116, 27, 71,255)); + QHBoxLayout *pLayout6 = new QHBoxLayout; + pLayout6->setMargin(0); + pLayout6->setSpacing(2); + pLayout6->addWidget(pItem61); + pLayout6->addWidget(pItem62); + pLayout6->addWidget(pItem63); + pLayout6->addWidget(pItem64); + pLayout6->addWidget(pItem65); + pLayout6->addWidget(pItem66); + pLayout6->addWidget(pItem67); + pLayout6->addWidget(pItem68); + + BasicColorItem *pItem71 = new BasicColorItem(QColor(102, 0, 0,255)); + BasicColorItem *pItem72 = new BasicColorItem(QColor(120, 63, 4,255)); + BasicColorItem *pItem73 = new BasicColorItem(QColor(127, 96, 0,255)); + BasicColorItem *pItem74 = new BasicColorItem(QColor(39, 78, 19,255)); + BasicColorItem *pItem75 = new BasicColorItem(QColor(12, 52, 61,255)); + BasicColorItem *pItem76 = new BasicColorItem(QColor(7, 55, 99,255)); + BasicColorItem *pItem77 = new BasicColorItem(QColor(32, 18, 77,255)); + QColor qLast=Qt::transparent; + if(bAlpha==false) + qLast=QColor(71, 17, 48,255); + + BasicColorItem *pItem78 = new BasicColorItem(qLast); + QHBoxLayout *pLayout7 = new QHBoxLayout; + pLayout7->setMargin(0); + pLayout7->setSpacing(2); + pLayout7->addWidget(pItem71); + pLayout7->addWidget(pItem72); + pLayout7->addWidget(pItem73); + pLayout7->addWidget(pItem74); + pLayout7->addWidget(pItem75); + pLayout7->addWidget(pItem76); + pLayout7->addWidget(pItem77); + pLayout7->addWidget(pItem78); + + QVBoxLayout *pVLayout = new QVBoxLayout(this); + pVLayout->setMargin(0); + pVLayout->setSpacing(2); + pVLayout->addLayout(pLayout1); + pVLayout->addLayout(pLayout2); + pVLayout->addLayout(pLayout3); + pVLayout->addLayout(pLayout4); + pVLayout->addLayout(pLayout5); + pVLayout->addLayout(pLayout6); + pVLayout->addLayout(pLayout7); + + connect(pItem11, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem12, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem13, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem14, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem15, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem16, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem17, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem18, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + + connect(pItem21, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem22, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem23, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem24, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem25, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem26, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem27, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem28, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + + connect(pItem31, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem32, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem33, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem34, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem35, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem36, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem37, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem38, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + + connect(pItem41, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem42, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem43, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem44, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem45, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem46, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem47, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem48, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + + connect(pItem51, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem52, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem53, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem54, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem55, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem56, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem57, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem58, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + + connect(pItem61, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem62, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem63, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem64, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem65, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem66, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem67, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem68, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + + connect(pItem71, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem72, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem73, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem74, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem75, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem76, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem77, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem78, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); +} diff --git a/LedOK/ColorDialog/BasicColorArea.h b/LedOK/ColorDialog/BasicColorArea.h new file mode 100644 index 0000000..73c75ba --- /dev/null +++ b/LedOK/ColorDialog/BasicColorArea.h @@ -0,0 +1,25 @@ +// 基本颜色区域 + +#ifndef BASICCOLORAREA_H +#define BASICCOLORAREA_H + +#include +#include "BasicColorItem.h" + +class BasicColorArea : public QWidget +{ + Q_OBJECT + +public: + BasicColorArea(QWidget *parent); + ~BasicColorArea(); + void initColorItems(bool bAlpha); + +signals: + void colorItemSelcSignal(const QColor &); + +private: + +}; + +#endif // BASICCOLORAREA_H diff --git a/LedOK/ColorDialog/BasicColorItem.cpp b/LedOK/ColorDialog/BasicColorItem.cpp new file mode 100644 index 0000000..52d0d9b --- /dev/null +++ b/LedOK/ColorDialog/BasicColorItem.cpp @@ -0,0 +1,90 @@ +#include +#include "BasicColorItem.h" + +#define ITEM_EDGE_LENGTH 25 + +BasicColorItem::BasicColorItem(const QColor &c, QWidget *parent) + : QLabel(parent) + , m_bMouseIn(false) +{ + setFixedSize(ITEM_EDGE_LENGTH, ITEM_EDGE_LENGTH); + setColor(c); +} + +BasicColorItem::~BasicColorItem() +{ + +} + +QColor BasicColorItem::getColor() +{ + return m_color; +} + +void BasicColorItem::paintEvent(QPaintEvent *ev) +{ + QLabel::paintEvent(ev); + if (m_bMouseIn) + { + QPainter painter(this); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.setPen(QPen(Qt::white, 3)); + painter.drawRect(1, 1, ITEM_EDGE_LENGTH - 3, ITEM_EDGE_LENGTH - 3); + } +} + +void BasicColorItem::mousePressEvent(QMouseEvent *) +{ + emit itemClickedSignal(m_color); +} + +void BasicColorItem::enterEvent(QEvent *) +{ + m_bMouseIn = true; + update(); +} + +void BasicColorItem::leaveEvent(QEvent *) +{ + m_bMouseIn = false; + update(); +} + +void BasicColorItem::setColor(const QColor &c) +{ + if(c==Qt::transparent) + { + QImage itemImg = QImage(ITEM_EDGE_LENGTH, ITEM_EDGE_LENGTH, QImage::Format_RGB32); + QPainter painter(&itemImg); + painter.setRenderHint(QPainter::Antialiasing); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.drawImage(0, 0, itemImg); + QPen pen; + painter.setBrush(Qt::white); + painter.drawRect(0, 0, width(), height()); + + //pen.setStyle(Qt::DashLine); + pen.setColor(Qt::red); // 设置画笔为黄色 + painter.setPen(pen); + painter.drawLine(0,0,width()-1,height()-1); + painter.end(); + this->setPixmap(QPixmap::fromImage(itemImg)); + update(); + } + else { + QImage itemImg = QImage(ITEM_EDGE_LENGTH, ITEM_EDGE_LENGTH, QImage::Format_ARGB32); + QPainter painter(&itemImg); + painter.setRenderHint(QPainter::Antialiasing); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.drawImage(0, 0, itemImg); + painter.setPen(Qt::NoPen); + painter.setBrush(c); + painter.drawRect(0, 0, width(), height()); + painter.end(); + this->setPixmap(QPixmap::fromImage(itemImg)); + update(); + } + + m_color = c; + +} diff --git a/LedOK/ColorDialog/BasicColorItem.h b/LedOK/ColorDialog/BasicColorItem.h new file mode 100644 index 0000000..257b4da --- /dev/null +++ b/LedOK/ColorDialog/BasicColorItem.h @@ -0,0 +1,35 @@ +// 基本颜色项 + +#ifndef BASICCOLORITEM_H +#define BASICCOLORITEM_H + +#include + +class BasicColorItem : public QLabel +{ + Q_OBJECT + +public: + BasicColorItem(const QColor &, QWidget *parent = 0); + ~BasicColorItem(); + QColor getColor(); + void setColor(const QColor &); + +protected: + void paintEvent(QPaintEvent *); + void mousePressEvent(QMouseEvent *ev); + void enterEvent(QEvent *); + void leaveEvent(QEvent *); + +signals: + void itemClickedSignal(const QColor &); + +private: + bool m_bMouseIn; + QColor m_color; + +private: + +}; + +#endif // BASICCOLORITEM_H diff --git a/LedOK/ColorDialog/ColorDialog.cpp b/LedOK/ColorDialog/ColorDialog.cpp new file mode 100644 index 0000000..f27efaf --- /dev/null +++ b/LedOK/ColorDialog/ColorDialog.cpp @@ -0,0 +1,703 @@ +#include +#include "ColorDialog.h" +#include "ui_ColorDialog.h" + +class ColorDialog::ColorSetting +{ +public: + Ui::ColorDialog ui; + int m_iHue; + int m_iSaturation; + int m_iBrightness; + bool m_bPressed; + QPoint m_ptPress; + +public: + ColorSetting() + : m_iHue(0) + , m_iSaturation(0) + , m_iBrightness(0) + , m_bPressed(false) + { + } + ~ColorSetting() + { + + } + +private: + +}; + +ColorDialog::ColorDialog(QColor cr,bool bAlpha,QWidget *parent) + : QWidget(parent) + , m_pSetting(new ColorSetting) + , m_bNotEdit(false) +{ + m_pSetting->ui.setupUi(this); + m_pSetting->ui.basicColorWgt->initColorItems(bAlpha); + m_pSetting->ui.hLabel->setVisible(false); + m_pSetting->ui.hSpinBox->setVisible(false); + m_pSetting->ui.sLabel->setVisible(false); + m_pSetting->ui.sSpinBox->setVisible(false); + m_pSetting->ui.vLabel->setVisible(false); + m_pSetting->ui.vSpinBox->setVisible(false); + setAttribute(Qt::WA_DeleteOnClose); + + //标题 + m_pTitleLbl = new QLabel(this); + m_pTitleLbl->setText(tr("Select color")); + m_pTitleLbl->setStyleSheet("background-color:rgba(206,206,206,255);color:rgba(0,0,0,255);"); + //m_pTitleLbl->setFixedSize(190, 34); +// m_pTitleLbl->setStyleSheet("background-color:rgba(216,216,0,255);"); +// m_pTitleLbl->setStyleSheet("color:rgba(0,0,0,255);"); + m_pSetting->ui.topWgt->setStyleSheet("background-color:rgba(206,206,206,255);"); + //关闭按钮 + m_pCloseBtn = new QPushButton(this); + m_pCloseBtn->setFixedSize(22, 34); + m_pCloseBtn->setObjectName("m_pCloseBtn"); + m_pCloseBtn->setVisible(false); + + m_buttonRole = Yes; + setWindowFlags(Qt::FramelessWindowHint | Qt::Window); + setWindowModality(Qt::WindowModal); + //setAttribute(Qt::WA_TranslucentBackground); + this->installEventFilter(this); + + QRegExp rx("(\\d?[a-f]?){0,6}"); + m_pSetting->ui.colorEdit->setValidator(new QRegExpValidator(rx, this)); + m_pSetting->ui.colorEdit->setText("00000000"); + + this->setFocusPolicy(Qt::ClickFocus); + + initSignalAndSlotConn(); + + + setStyleSheet("QSpinBox::arrow{background-color:#8d8d8d;}"); + + m_pSetting->ui.okBtn->setProperty("ssType", "progManageTool"); + m_pSetting->ui.okBtn->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + m_pSetting->ui.cancelBtn->setProperty("ssType", "progManageTool"); + m_pSetting->ui.cancelBtn->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + m_pSetting->ui.addCustomColorBtn->setProperty("ssType", "progManageTool"); + m_pSetting->ui.addCustomColorBtn->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + + if(bAlpha==false) + { + m_pSetting->ui.aSpinBox->setVisible(false); + m_pSetting->ui.label_2->setVisible(false); + m_pSetting->ui.line->setVisible(false); + // m_pSetting->ui.line_2->setVisible(false); + cr.setAlpha(255); + } + m_pSetting->ui.previewWgt->setCurColor(cr); + colorItemSelcSlot(cr); +} + +ColorDialog::~ColorDialog() +{ + delete m_pSetting; +} + +ColorDialog::ButtonRole ColorDialog::showDialog() +{ + show(); + QEventLoop evtLoop; + m_pEvtLoop = &evtLoop; + evtLoop.exec(); + + m_pEvtLoop = NULL; + hide(); + return m_buttonRole; +} + +void ColorDialog::setCurColor(const QColor &c) +{ + colorItemSelcSlot(c); +} + +QColor ColorDialog::getColor() +{ + QColor color; + color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); + return color; +} + +QRgb ColorDialog::getRgb() +{ + QColor color; + color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); + return color.rgb(); +} +QColor ColorDialog::getRgba() +{ + + return m_pSetting->ui.previewWgt->getNewColor(); +} +bool ColorDialog::eventFilter(QObject *obj, QEvent *ev) +{ + switch (ev->type()) + { + case QEvent::MouseButtonPress: + { + QMouseEvent *e = dynamic_cast(ev); + if (e->pos().y() > 29) + { + return false; + } + if (e->buttons() & Qt::LeftButton) + { + m_pSetting->m_bPressed = true; + m_pSetting->m_ptPress = e->globalPos() - this->frameGeometry().topLeft(); + } + } + break; + case QEvent::MouseButtonRelease: + { + m_pSetting->m_bPressed = false; + } + break; + case QEvent::MouseMove: + { + QMouseEvent *e = dynamic_cast(ev); + if (m_pSetting->m_bPressed) + { + move(this->mapToGlobal(e->pos() - m_pSetting->m_ptPress)); + } + } + break; + case QEvent::Resize: + { + m_pTitleLbl->move(8, 0); + m_pCloseBtn->move(width() - 24, -8); + } + break; + default: + break; + } + return QWidget::eventFilter(obj, ev); +} + +void ColorDialog::show() +{ + QWidget::show(); +} + +void ColorDialog::initSignalAndSlotConn() +{ + connect(m_pSetting->ui.hColorWgt, SIGNAL(hueChangedSignal(int)), m_pSetting->ui.svColorWgt, SLOT(hueChangedSlot(int))); + connect(m_pSetting->ui.svColorWgt, SIGNAL(svChangedSignal(int, int, int)), m_pSetting->ui.previewWgt, SLOT(svChangedSlot(int, int, int))); + //选中色预览窗 + connect(m_pSetting->ui.previewWgt, SIGNAL(svChangedSignal(int, int, int)), this, SLOT(updateEditData(int, int, int))); + connect(m_pSetting->ui.basicColorWgt, SIGNAL(colorItemSelcSignal(const QColor &)), this, SLOT(colorItemSelcSlot(const QColor &))); + connect(m_pSetting->ui.customColorWgt, SIGNAL(colorItemSelcSignal(const QColor &)), this, SLOT(colorItemSelcSlot(const QColor &))); + connect(m_pSetting->ui.colorEdit, SIGNAL(textEdited(const QString &)), this, SLOT(editChangedSlot(const QString &))); + connect(m_pSetting->ui.colorEdit, SIGNAL(editingFinished()), this, SLOT(editFinishedSlot())); + + connect(m_pSetting->ui.addCustomColorBtn, SIGNAL(clicked()), this, SLOT(addCustomColorSlot())); + connect(m_pSetting->ui.okBtn, SIGNAL(clicked()), this, SLOT(okBtnClickedSlot())); + connect(m_pSetting->ui.cancelBtn, SIGNAL(clicked()), this, SLOT(cancelBtnClickedSlot())); + connect(m_pCloseBtn, SIGNAL(clicked()), this, SLOT(cancelBtnClickedSlot())); + +// connect(m_pSetting->ui.hSpinBox, SIGNAL(valueChanged(int)), this, SLOT(hValueChangedSlot(int))); +// connect(m_pSetting->ui.sSpinBox, SIGNAL(valueChanged(int)), this, SLOT(sValueChangedSlot(int))); +// connect(m_pSetting->ui.vSpinBox, SIGNAL(valueChanged(int)), this, SLOT(vValueChangedSlot(int))); + connect(m_pSetting->ui.rSpinBox, SIGNAL(valueChanged(int)), this, SLOT(rValueChangedSlot(int))); + connect(m_pSetting->ui.gSpinBox, SIGNAL(valueChanged(int)), this, SLOT(gValueChangedSlot(int))); + connect(m_pSetting->ui.bSpinBox, SIGNAL(valueChanged(int)), this, SLOT(bValueChangedSlot(int))); + connect(m_pSetting->ui.aSpinBox, SIGNAL(valueChanged(int)), this, SLOT(aValueChangedSlot(int))); +} + +void ColorDialog::updateRGBColor(const QColor &color) +{ + m_pSetting->ui.previewWgt->setNewColor(color); + m_pSetting->ui.rSpinBox->setValue(color.red()); + m_pSetting->ui.gSpinBox->setValue(color.green()); + m_pSetting->ui.bSpinBox->setValue(color.blue()); + m_pSetting->ui.aSpinBox->setValue(color.alpha()); + + QString strR = QString::number(color.red(), 16); + QString strG = QString::number(color.green(), 16); + QString strB = QString::number(color.blue(), 16); + QString strA = QString::number(color.alpha(), 16); + if(strR.length()==1) + strR.prepend("0"); + if(strG.length()==1) + strG.prepend("0"); + if(strB.length()==1) + strB.prepend("0"); + if(strA.length()==1) + strA.prepend("0"); + + QString strRgb = strR+strG+strB+strA; + m_pSetting->ui.colorEdit->setText(strRgb); + +} + + +void ColorDialog::colorItemSelcSlot(const QColor &c) +{ + if(c==Qt::transparent) + { + m_bNotEdit = true; + + m_pSetting->ui.hColorWgt->setHue(c.hue()); + m_pSetting->ui.svColorWgt->setColor(c); + m_pSetting->ui.aSpinBox->setValue(0); + m_bNotEdit = false; + } + else { + m_bNotEdit = true; + + m_pSetting->ui.hColorWgt->setHue(c.hue()); + m_pSetting->ui.svColorWgt->setColor(c); + m_pSetting->ui.aSpinBox->setValue(c.alpha()); + m_bNotEdit = false; + } + +} + +void ColorDialog::addCustomColorSlot() +{ + QColor color(m_pSetting->ui.rSpinBox->value(),m_pSetting->ui.gSpinBox->value(),m_pSetting->ui.bSpinBox->value(),m_pSetting->ui.aSpinBox->value()); +// color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); +// color.setH(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); + // color.setRgba(m_pSetting->ui.aSpinBox->value(),m_pSetting->ui.aSpinBox->value(),m_pSetting->ui.aSpinBox->value(),m_pSetting->ui.aSpinBox->value())); + m_pSetting->ui.customColorWgt->setGivenColor(m_pSetting->ui.previewWgt->getNewColor()); +} + +void ColorDialog::okBtnClickedSlot() +{ + QColor color; + color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); + m_pSetting->ui.previewWgt->setCurColor(color); + + m_buttonRole = Yes; + if (m_pEvtLoop != NULL) + { + m_pEvtLoop->exit(); + } +} + +void ColorDialog::cancelBtnClickedSlot() +{ + m_buttonRole = No; + if (m_pEvtLoop != NULL) + { + m_pEvtLoop->exit(); + } +} + +void ColorDialog::editChangedSlot(const QString &strColor) +{ + m_bNotEdit = true; + + int r, g, b; + int a=255; + switch (strColor.length()) + { + case 0: + { + r = g = b = 0; + } + break; + case 1: + case 2: + { + r = g = 0; + bool ok; + b = strColor.toInt(&ok, 16); + } + break; + case 3: + { + QString strR = QString("%1%2").arg(strColor.left(1), strColor.left(1)); + QString strG = QString("%1%2").arg(strColor.mid(1, 1), strColor.mid(1, 1)); + QString strB = QString("%1%2").arg(strColor.right(1), strColor.right(1)); + bool ok; + r = strR.toInt(&ok, 16); + g = strG.toInt(&ok, 16); + b = strB.toInt(&ok, 16); + } + break; + case 4: + { + r = 0; + QString strG = QString("%1").arg(strColor.left(2)); + QString strB = QString("%1").arg(strColor.right(2)); + bool ok; + g = strG.toInt(&ok, 16); + b = strB.toInt(&ok, 16); + } + break; + case 5: + { + QString strR = QString("%1").arg(strColor.left(1)); + QString strG = QString("%1").arg(strColor.mid(1, 2)); + QString strB = QString("%1").arg(strColor.right(2)); + bool ok; + r = strR.toInt(&ok, 16); + g = strG.toInt(&ok, 16); + b = strB.toInt(&ok, 16); + } + break; + case 6: + { + QString strR = QString("%1").arg(strColor.left(2)); + QString strG = QString("%1").arg(strColor.mid(2, 2)); + QString strB = QString("%1").arg(strColor.right(2)); + bool ok; + r = strR.toInt(&ok, 16); + g = strG.toInt(&ok, 16); + b = strB.toInt(&ok, 16); + + } + break; + case 8: + { + QString strR = QString("%1").arg(strColor.left(2)); + QString strG = QString("%1").arg(strColor.mid(2, 2)); + QString strB = QString("%1").arg(strColor.mid(2,2)); + QString strA = QString("%1").arg(strColor.right(2)); + bool ok; + r = strR.toInt(&ok, 16); + g = strG.toInt(&ok, 16); + b = strB.toInt(&ok, 16); + a = strA.toInt(&ok, 16); + } + break; + default: + break; + } + + QColor color; + color.setRgb(r, g, b , a); + int h, s, v; + h = m_pSetting->m_iHue = color.hue(); + s = m_pSetting->m_iSaturation = color.saturation(); + v = m_pSetting->m_iBrightness = color.value(); + m_pSetting->ui.hColorWgt->setHue(h); + m_pSetting->ui.svColorWgt->setHsv(h, s, v); + m_pSetting->ui.previewWgt->setNewColor(color); + + m_pSetting->ui.hSpinBox->setValue(h); + m_pSetting->ui.sSpinBox->setValue(s); + m_pSetting->ui.vSpinBox->setValue(v); + m_pSetting->ui.rSpinBox->setValue(r); + m_pSetting->ui.gSpinBox->setValue(g); + m_pSetting->ui.bSpinBox->setValue(b); + m_pSetting->ui.aSpinBox->setValue(a); + + m_bNotEdit = false; +} + +void ColorDialog::editFinishedSlot() +{ + QString strColor = m_pSetting->ui.colorEdit->text(); + switch (strColor.length()) + { + case 0: + { + m_pSetting->ui.colorEdit->setText("000000ff"); + } + break; + case 1: + { + m_pSetting->ui.colorEdit->setText(strColor.prepend("00000")); + } + break; + case 2: + { + m_pSetting->ui.colorEdit->setText(strColor.prepend("0000")); + } + break; + case 3: + { + QString strR = QString("%1%2").arg(strColor.left(1), strColor.left(1)); + QString strG = QString("%1%2").arg(strColor.mid(1, 1), strColor.mid(1, 1)); + QString strB = QString("%1%2").arg(strColor.right(1), strColor.right(1)); + m_pSetting->ui.colorEdit->setText(strR.append(strG).append(strB)); + } + break; + case 4: + { + QString strG = QString("%1").arg(strColor.left(2)); + QString strB = QString("%1").arg(strColor.right(2)); + m_pSetting->ui.colorEdit->setText(strG.append(strB).prepend("00")); + } + break; + case 5: + { + QString strR = QString("%1").arg(strColor.left(1)); + QString strG = QString("%1").arg(strColor.mid(1, 2)); + QString strB = QString("%1").arg(strColor.right(2)); + m_pSetting->ui.colorEdit->setText(strR.append(strG).append(strB).prepend("0")); + } + break; + case 6: + { + return; + } + break; + default: + break; + } +} + +void ColorDialog::hValueChangedSlot(int h) +{ + if (m_bNotEdit) + { + return; + } + m_bNotEdit = true; + + m_pSetting->m_iHue = h; + m_pSetting->ui.hColorWgt->setHue(h); + QColor color; + color.setHsv(h, m_pSetting->m_iSaturation, m_pSetting->m_iBrightness); + m_pSetting->ui.svColorWgt->setHue(h); + updateRGBColor(color); + + m_bNotEdit = false; +} + +void ColorDialog::sValueChangedSlot(int s) +{ + if (m_bNotEdit) + { + return; + } + m_bNotEdit = true; + + m_pSetting->m_iSaturation = s; + QColor color; + color.setHsv(m_pSetting->m_iHue, s, m_pSetting->m_iBrightness); + m_pSetting->ui.svColorWgt->setSaturation(s); + updateRGBColor(color); + + m_bNotEdit = false; +} + +void ColorDialog::vValueChangedSlot(int v) +{ + if (m_bNotEdit) + { + return; + } + m_bNotEdit = true; + + m_pSetting->m_iBrightness = v; + QColor color; + color.setHsv(m_pSetting->m_iHue, m_pSetting->m_iSaturation, v); + m_pSetting->ui.svColorWgt->setBrightness(v); + updateRGBColor(color); + + m_bNotEdit = false; +} + +void ColorDialog::rValueChangedSlot(int r) +{ + if (m_bNotEdit) + { + return; + } + m_bNotEdit = true; + + int iGreen = m_pSetting->ui.gSpinBox->value(); + int iBlue = m_pSetting->ui.bSpinBox->value(); + int ialpha = m_pSetting->ui.aSpinBox->value(); + QColor color; + color.setRgb(r, iGreen, iBlue,ialpha); + int h = m_pSetting->m_iHue = color.hue(); + int s = m_pSetting->m_iSaturation = color.saturation(); + int v = m_pSetting->m_iBrightness = color.value(); + + m_pSetting->ui.hColorWgt->setHue(h); + m_pSetting->ui.svColorWgt->setHsv(h, s, v); + m_pSetting->ui.previewWgt->setNewColor(color); + + m_pSetting->ui.hSpinBox->setValue(h); + m_pSetting->ui.sSpinBox->setValue(s); + m_pSetting->ui.vSpinBox->setValue(v); + + + QString strR = QString::number(r, 16); + QString strG = QString::number(iGreen, 16); + QString strB = QString::number(iBlue, 16); + QString strA = QString::number(ialpha, 16); + + if(strR.length()==1) + strR.prepend("0"); + if(strG.length()==1) + strG.prepend("0"); + if(strB.length()==1) + strB.prepend("0"); + if(strA.length()==1) + strA.prepend("0"); + + QString strRgb = strR+strG+strB+strA; +// QString("%1%2%3%4").arg(QString("%1").arg(strR.size() == 1 ? strR.prepend("0") : strR), +// QString("%1").arg(strG.size() == 1 ? strG.prepend("0") : strG), +// QString("%1").arg(strB.size() == 1 ? strB.prepend("0") : strB), +// QString("%1").arg(strA.size() == 1 ? strB.prepend("0") : strA) ); + m_pSetting->ui.colorEdit->setText(strRgb); + + m_bNotEdit = false; +} + +void ColorDialog::gValueChangedSlot(int g) +{ + if (m_bNotEdit) + { + return; + } + m_bNotEdit = true; + + int iRed = m_pSetting->ui.rSpinBox->value(); + int iBlue = m_pSetting->ui.bSpinBox->value(); + int ialpha = m_pSetting->ui.aSpinBox->value(); + QColor color; + color.setRgb(iRed, g, iBlue,ialpha); + int h = m_pSetting->m_iHue = color.hue(); + int s = m_pSetting->m_iSaturation = color.saturation(); + int v = m_pSetting->m_iBrightness = color.value(); + + m_pSetting->ui.hColorWgt->setHue(h); + m_pSetting->ui.svColorWgt->setHsv(h, s, v); + m_pSetting->ui.previewWgt->setNewColor(color); + + m_pSetting->ui.hSpinBox->setValue(h); + m_pSetting->ui.sSpinBox->setValue(s); + m_pSetting->ui.vSpinBox->setValue(v); + + QString strR = QString::number(iRed, 16); + QString strG = QString::number(g, 16); + QString strB = QString::number(iBlue, 16); + QString strA = QString::number(ialpha, 16); + + if(strR.length()==1) + strR.prepend("0"); + if(strG.length()==1) + strG.prepend("0"); + if(strB.length()==1) + strB.prepend("0"); + if(strA.length()==1) + strA.prepend("0"); + QString strRgb = strR+strG+strB+strA; + m_pSetting->ui.colorEdit->setText(strRgb); + + m_bNotEdit = false; +} + +void ColorDialog::bValueChangedSlot(int b) +{ + if (m_bNotEdit) + { + return; + } + m_bNotEdit = true; + + int iRed = m_pSetting->ui.rSpinBox->value(); + int iGreen = m_pSetting->ui.gSpinBox->value(); + int ialpha = m_pSetting->ui.aSpinBox->value(); + QColor color; + color.setRgb(iRed, iGreen, b,ialpha); + int h = m_pSetting->m_iHue = color.hue(); + int s = m_pSetting->m_iSaturation = color.saturation(); + int v = m_pSetting->m_iBrightness = color.value(); + + m_pSetting->ui.hColorWgt->setHue(h); + m_pSetting->ui.svColorWgt->setHsv(h, s, v); + m_pSetting->ui.previewWgt->setNewColor(color); + + m_pSetting->ui.hSpinBox->setValue(h); + m_pSetting->ui.sSpinBox->setValue(s); + m_pSetting->ui.vSpinBox->setValue(v); + + QString strR = QString::number(iRed, 16); + QString strG = QString::number(iGreen, 16); + QString strB = QString::number(b, 16); + QString strA = QString::number(ialpha, 16); + + if(strR.length()==1) + strR.prepend("0"); + if(strG.length()==1) + strG.prepend("0"); + if(strB.length()==1) + strB.prepend("0"); + if(strA.length()==1) + strA.prepend("0"); + QString strRgb = strR+strG+strB+strA; + m_pSetting->ui.colorEdit->setText(strRgb); + + m_bNotEdit = false; +} +void ColorDialog::aValueChangedSlot(int a) +{ + int iRed = m_pSetting->ui.rSpinBox->value(); + int iGreen = m_pSetting->ui.gSpinBox->value(); + int iBlue = m_pSetting->ui.bSpinBox->value(); + QColor color; + color.setRgb(iRed, iGreen, iBlue,a); + m_pSetting->ui.previewWgt->setNewColor(color); + QString strR = QString::number(iRed, 16); + QString strG = QString::number(iGreen, 16); + QString strB = QString::number(iBlue, 16); + QString strA = QString::number(a, 16); + + if(strR.length()==1) + strR.prepend("0"); + if(strG.length()==1) + strG.prepend("0"); + if(strB.length()==1) + strB.prepend("0"); + if(strA.length()==1) + strA.prepend("0"); + QString strRgb = strR+strG+strB+strA; + m_pSetting->ui.colorEdit->setText(strRgb); + + m_bNotEdit = false; + +} + +void ColorDialog::updateEditData(int h, int s, int v) +{ + m_bNotEdit = true; + + m_pSetting->m_iHue = h; + m_pSetting->m_iSaturation = s; + m_pSetting->m_iBrightness = v; + QColor color; + color.setHsv(h, s, v); + m_pSetting->ui.hSpinBox->setValue(h); + m_pSetting->ui.sSpinBox->setValue(s); + m_pSetting->ui.vSpinBox->setValue(v); + m_pSetting->ui.rSpinBox->setValue(color.red()); + m_pSetting->ui.gSpinBox->setValue(color.green()); + m_pSetting->ui.bSpinBox->setValue(color.blue()); + + + QString strR = QString::number(color.red(), 16); + QString strG = QString::number(color.green(), 16); + QString strB = QString::number(color.blue(), 16); + QString strA = QString::number(m_pSetting->ui.aSpinBox->value(), 16); + if(strR.length()==1) + strR.prepend("0"); + if(strG.length()==1) + strG.prepend("0"); + if(strB.length()==1) + strB.prepend("0"); + if(strA.length()==1) + strA.prepend("0"); + QString strRgb = strR+strG+strB+strA; + m_pSetting->ui.colorEdit->setText(strRgb); + +// QString strRgb = QString("%1%2%3%4").arg(QString("%1").arg(strR.size() == 1 ? strR.prepend("0") : strR), +// QString("%1").arg(strG.size() == 1 ? strG.prepend("0") : strG), +// QString("%1").arg(strB.size() == 1 ? strB.prepend("0") : strB), +// QString("%1").arg(strA.size() == 1 ? strB.prepend("0") : strA) ); +// m_pSetting->ui.colorEdit->setText(strRgb); + + m_bNotEdit = false; +} diff --git a/LedOK/ColorDialog/ColorDialog.h b/LedOK/ColorDialog/ColorDialog.h new file mode 100644 index 0000000..0ef5b17 --- /dev/null +++ b/LedOK/ColorDialog/ColorDialog.h @@ -0,0 +1,58 @@ +#ifndef COLORDIALOG_H +#define COLORDIALOG_H + +#include +#include +#include +#include + +class ColorDialog : public QWidget +{ + Q_OBJECT + +public: + enum ButtonRole{Yes, No}; + ColorDialog(QColor cr,bool bAlpha,QWidget *parent = nullptr); + ~ColorDialog(); + ButtonRole showDialog(); + void setCurColor(const QColor &); + QColor getColor(); + QRgb getRgb(); + QColor getRgba(); + ButtonRole m_buttonRole; + +protected: + bool eventFilter(QObject *, QEvent *); + void show(); + +private: + void initSignalAndSlotConn(); + void updateRGBColor(const QColor &); + +private slots: + void colorItemSelcSlot(const QColor &); + void addCustomColorSlot(); + void okBtnClickedSlot(); + void cancelBtnClickedSlot(); + void editChangedSlot(const QString &); + void editFinishedSlot(); + + void hValueChangedSlot(int); + void sValueChangedSlot(int); + void vValueChangedSlot(int); + void rValueChangedSlot(int); + void gValueChangedSlot(int); + void bValueChangedSlot(int); + void aValueChangedSlot(int); + void updateEditData(int, int, int); + +private: + class ColorSetting; + ColorSetting * const m_pSetting; + QLabel *m_pTitleLbl; + QPushButton *m_pCloseBtn; + QEventLoop *m_pEvtLoop; + bool m_bNotEdit; +}; + +#endif // COLORDIALOG_H diff --git a/LedOK/ColorDialog/ColorDialog.ui b/LedOK/ColorDialog/ColorDialog.ui new file mode 100644 index 0000000..e7bb46f --- /dev/null +++ b/LedOK/ColorDialog/ColorDialog.ui @@ -0,0 +1,934 @@ + + + ColorDialog + + + + 0 + 0 + 752 + 415 + + + + ColorDialog + + + /*主界面样式表*/ +QWidget +{ + border:none; + color:white; + font-family:微软雅黑; + font-size:14px; + outline:0px; + background:transparent; +} + +#topWgt +{ + border-width:4 4 4 4; +} + +/* +主体背景 +*/ +#mainWgt +{ + border-width:4 4 4 4; +} +QLineEdit +{ + background:#25272b; + border:1px solid #276d94; + padding-left:5px; +} + +QGroupBox +{ + border:2px solid #276d94; + margin-top:10px; +} +QGroupBox::title +{ + left:10px; + bottom:10px; +} + +/*1-按钮开始*/ +QPushButton +{ + background:#b82525; + border-radius:3px; + padding-top:-2px; +} +QPushButton:hover +{ + background:#d4352d; +} +QPushButton:pressed +{ + background:#ab2922; +} +/*1-按钮结束*/ + +QSpinBox +{ + border:1px solid #276d94; + background-color:#25272b; + min-height: 26px; + min-width: 70px; +} +QSpinBox::up-arrow +{ + border-left:8px solid #25272b; + border-right:8px solid #25272b; + border-bottom:8px solid #276d94; + width:0px; + height: 0px; +} +QSpinBox::up-arrow:pressed +{ + border-bottom:9px solid #81c3d7; +} +QSpinBox::up-button +{ + margin-right:4px; + min-width: 16px; + min-height: 13px; + background-color:#25272b; +} +QSpinBox::down-arrow +{ + border-left:8px solid #25272b; + border-right:8px solid #25272b; + border-top:8px solid #276d94; + width:0px; + height: 0px; +} +QSpinBox::down-arrow:pressed +{ + border-top:9px solid #81c3d7; +} +QSpinBox::down-button +{ + margin-right:4px; + min-width:16px; + min-height:13px; + background-color:#25272b; +} + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 35 + + + + + 16777215 + 35 + + + + background-color: rgb(216, 216, 216); + + + + + 250 + 0 + 66 + 26 + + + + + 66 + 26 + + + + + 66 + 26 + + + + Tone(H): + + + false + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 330 + 0 + 66 + 26 + + + + + 66 + 26 + + + + + 66 + 26 + + + + Saturation(S): + + + false + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 400 + 0 + 66 + 26 + + + + + 66 + 26 + + + + + 66 + 26 + + + + Brightness(V): + + + false + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 480 + 0 + 72 + 28 + + + + + 72 + 28 + + + + + 70 + 26 + + + + + + + true + + + + + + 360 + + + + + + 560 + 0 + 72 + 28 + + + + + 72 + 28 + + + + + 70 + 26 + + + + true + + + 255 + + + + + + 630 + 0 + 72 + 28 + + + + + 72 + 28 + + + + + 70 + 26 + + + + true + + + 255 + + + + + + + + background-color: rgb(216, 216, 216); +color: rgb(0, 0, 0); + + + + + 12 + 5 + 228 + 216 + + + + Basic color + + + + 5 + + + 10 + + + 5 + + + 1 + + + + + + 214 + 191 + + + + + 214 + 191 + + + + + + + + + + 12 + 232 + 228 + 81 + + + + Custom color + + + + 5 + + + 10 + + + 5 + + + 5 + + + + + + 214 + 52 + + + + + 214 + 52 + + + + + + + + + + 17 + 327 + 220 + 30 + + + + + 12 + + + + + 2 + + + + + + 12 + 26 + + + + + 12 + 26 + + + + # + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 72 + 26 + + + + + 72 + 26 + + + + + + + + + + + 0 + 26 + + + + + 16777215 + 26 + + + + Add to custom + + + + + + + + + 253 + 7 + 491 + 272 + + + + + 9 + + + + + + 256 + 256 + + + + + 256 + 256 + + + + + + + + + 34 + 270 + + + + + 34 + 270 + + + + + + + + + + 12 + + + + + + 72 + 28 + + + + + 70 + 26 + + + + true + + + 255 + + + + + + + + 66 + 26 + + + + + 66 + 26 + + + + Blue(B): + + + false + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 66 + 26 + + + + + 66 + 26 + + + + Green(G): + + + false + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 72 + 28 + + + + + 70 + 26 + + + + true + + + 255 + + + + + + + + 72 + 28 + + + + + 70 + 26 + + + + true + + + 255 + + + + + + + + 66 + 26 + + + + + 66 + 26 + + + + Red(R): + + + false + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + 16777215 + 2 + + + + border-top: 1px solid gray; + + + Qt::Horizontal + + + + + + + + + transparency: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 72 + 28 + + + + + 70 + 26 + + + + true + + + 255 + + + + + + + + + + + + + 266 + 290 + 260 + 70 + + + + + + + + 40 + 40 + + + + + 40 + 40 + + + + Cur color + + + Qt::AlignCenter + + + true + + + + + + + + 166 + 68 + + + + + 166 + 68 + + + + + + + + + 40 + 40 + + + + + 40 + 40 + + + + New color + + + Qt::AlignCenter + + + true + + + + + + + + + 590 + 320 + 138 + 28 + + + + + 12 + + + + + + 62 + 26 + + + + + 62 + 26 + + + + Ok + + + false + + + + + + + + 62 + 26 + + + + + 62 + 26 + + + + Cancel + + + + + + + + + + + + + BasicColorArea + QWidget +
ColorDialog\basiccolorarea.h
+ 1 +
+ + CustomColorArea + QWidget +
ColorDialog\customcolorarea.h
+ 1 +
+ + SVColorArea + QWidget +
ColorDialog\svcolorarea.h
+ 1 +
+ + HColorArea + QWidget +
ColorDialog\hcolorarea.h
+ 1 +
+ + PreviewColorArea + QWidget +
ColorDialog\previewcolorarea.h
+ 1 +
+
+ + +
diff --git a/LedOK/ColorDialog/CustomColorArea.cpp b/LedOK/ColorDialog/CustomColorArea.cpp new file mode 100644 index 0000000..ba68783 --- /dev/null +++ b/LedOK/ColorDialog/CustomColorArea.cpp @@ -0,0 +1,113 @@ +#include +#include +#include "CustomColorArea.h" + +CustomColorArea::CustomColorArea(QWidget *parent) + : QWidget(parent) + , m_iCurIndex(0) +{ + initColorItems(); +} + +CustomColorArea::~CustomColorArea() +{ + +} + +void CustomColorArea::setGivenColor(const QColor &c) +{ + int iIndex = m_iCurIndex % 16; + BasicColorItem *pCurItem = m_mapIndexToItem[iIndex]; + pCurItem->setColor(c); + m_iCurIndex++; +} + +void CustomColorArea::initColorItems() +{ + BasicColorItem *pItem11 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem12 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem13 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem14 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem15 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem16 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem17 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem18 = new BasicColorItem(QColor(255, 255, 255, 255)); + QHBoxLayout *pLayout1 = new QHBoxLayout; + pLayout1->setMargin(0); + pLayout1->setSpacing(2); + pLayout1->addWidget(pItem11); + pLayout1->addWidget(pItem12); + pLayout1->addWidget(pItem13); + pLayout1->addWidget(pItem14); + pLayout1->addWidget(pItem15); + pLayout1->addWidget(pItem16); + pLayout1->addWidget(pItem17); + pLayout1->addWidget(pItem18); + + BasicColorItem *pItem21 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem22 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem23 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem24 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem25 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem26 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem27 = new BasicColorItem(QColor(255, 255, 255, 255)); + BasicColorItem *pItem28 = new BasicColorItem(QColor(255, 255, 255, 255)); + QHBoxLayout *pLayout2 = new QHBoxLayout; + pLayout2->setMargin(0); + pLayout2->setSpacing(2); + pLayout2->addWidget(pItem21); + pLayout2->addWidget(pItem22); + pLayout2->addWidget(pItem23); + pLayout2->addWidget(pItem24); + pLayout2->addWidget(pItem25); + pLayout2->addWidget(pItem26); + pLayout2->addWidget(pItem27); + pLayout2->addWidget(pItem28); + + QVBoxLayout *pVLayout = new QVBoxLayout(this); + pVLayout->setMargin(0); + pVLayout->setSpacing(2); + pVLayout->addLayout(pLayout1); + pVLayout->addLayout(pLayout2); + + m_mapIndexToItem.insert(0, pItem11); + m_mapIndexToItem.insert(1, pItem21); + m_mapIndexToItem.insert(2, pItem12); + m_mapIndexToItem.insert(3, pItem22); + m_mapIndexToItem.insert(4, pItem13); + m_mapIndexToItem.insert(5, pItem23); + m_mapIndexToItem.insert(6, pItem14); + m_mapIndexToItem.insert(7, pItem24); + m_mapIndexToItem.insert(8, pItem15); + m_mapIndexToItem.insert(9, pItem25); + m_mapIndexToItem.insert(10, pItem16); + m_mapIndexToItem.insert(11, pItem26); + m_mapIndexToItem.insert(12, pItem17); + m_mapIndexToItem.insert(13, pItem27); + m_mapIndexToItem.insert(14, pItem18); + m_mapIndexToItem.insert(15, pItem28); + + connect(pItem11, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem12, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem13, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem14, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem15, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem16, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem17, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem18, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + + connect(pItem21, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem22, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem23, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem24, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem25, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem26, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem27, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); + connect(pItem28, SIGNAL(itemClickedSignal(const QColor &)), this, SIGNAL(colorItemSelcSignal(const QColor &))); +} + +void CustomColorArea::setGivenItemColor(int iIndex, const QColor &c) +{ + BasicColorItem *pCurItem = m_mapIndexToItem[iIndex]; + pCurItem->setColor(c); +} diff --git a/LedOK/ColorDialog/CustomColorArea.h b/LedOK/ColorDialog/CustomColorArea.h new file mode 100644 index 0000000..310a02c --- /dev/null +++ b/LedOK/ColorDialog/CustomColorArea.h @@ -0,0 +1,31 @@ +// 自定义颜色区域 + +#ifndef CUSTOMCOLORAREA_H +#define CUSTOMCOLORAREA_H + +#include +#include +#include "BasicColorItem.h" + +class CustomColorArea : public QWidget +{ + Q_OBJECT + +public: + CustomColorArea(QWidget *parent); + ~CustomColorArea(); + void setGivenColor(const QColor &); + +private: + void initColorItems(); + void setGivenItemColor(int iIndex, const QColor &); + +signals: + void colorItemSelcSignal(const QColor &); + +private: + QMap m_mapIndexToItem; + int m_iCurIndex; +}; + +#endif // CUSTOMCOLORAREA_H diff --git a/LedOK/ColorDialog/HColorArea.cpp b/LedOK/ColorDialog/HColorArea.cpp new file mode 100644 index 0000000..78eacc0 --- /dev/null +++ b/LedOK/ColorDialog/HColorArea.cpp @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include +#include "HColorArea.h" + +HColorArea::HColorArea(QWidget *parent) + : QWidget(parent) + , m_hue(0.0) + , m_iHue(0) +{ + createHuePixmap(); +} + +HColorArea::~HColorArea() +{ + +} + +void HColorArea::setHue(int h) +{ + m_hue = (double)h / 360; + m_iHue = h; + update(); +} + +void HColorArea::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + painter.drawPixmap(0, 0, m_huePixmap); + + int iHeight = m_iColorHeight - m_hue * m_iColorHeight; + QPolygonF triangle; + triangle.append(QPointF(m_iColorWidth, iHeight + topMargin)); + triangle.append(QPointF(width(), iHeight)); + triangle.append(QPointF(width(), iHeight + 2 * topMargin - 1)); + painter.setPen(Qt::NoPen); + painter.setBrush(Qt::white); + painter.drawPolygon(triangle); +} + +void HColorArea::mousePressEvent(QMouseEvent *ev) +{ + double tempValue = 1 - (double)(ev->pos().y() - topMargin) / m_iColorHeight; + m_hue = qBound(0.0, tempValue, 1.0); + update(); + m_iHue = m_hue * 360; + emit hueChangedSignal(m_iHue); +} + +void HColorArea::mouseMoveEvent(QMouseEvent *ev) +{ + double tempValue = 1 - (double)(ev->pos().y() - topMargin) / m_iColorHeight; + m_hue = qBound(0.0, tempValue, 1.0); + update(); + m_iHue = m_hue * 360; + emit hueChangedSignal(m_iHue); +} + +void HColorArea::createHuePixmap() +{ + m_huePixmap = QPixmap(34, 270); + m_huePixmap.fill(Qt::transparent); + QPainter painter(&m_huePixmap); + painter.setRenderHint(QPainter::Antialiasing); + QLinearGradient hueGradient(0, m_iColorHeight, 0, 0); + for (double i = 0; i < 1.0; i += 1.0 / 16) + { + hueGradient.setColorAt(i, QColor::fromHsvF(i, 1, 1, 1)); + } + hueGradient.setColorAt(1, QColor::fromHsvF(0, 1, 1, 1)); + painter.setPen(Qt::NoPen); + painter.setBrush(QBrush(hueGradient)); + painter.drawRect(0, topMargin, m_iColorWidth, m_iColorHeight); +} diff --git a/LedOK/ColorDialog/HColorArea.h b/LedOK/ColorDialog/HColorArea.h new file mode 100644 index 0000000..81171c8 --- /dev/null +++ b/LedOK/ColorDialog/HColorArea.h @@ -0,0 +1,41 @@ +/* +功能:界面中的色调区域 +*/ + +#ifndef HCOLORAREA_H +#define HCOLORAREA_H + +#include + +class HColorArea : public QWidget +{ + Q_OBJECT + + +public: + HColorArea(QWidget *parent); + ~HColorArea(); + void setHue(int); + +protected: + void paintEvent(QPaintEvent *); + void mousePressEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + +private: + void createHuePixmap(); //创建pixmap + +signals: + void hueChangedSignal(int); //色调值改变发出信号 + +private: + QPixmap m_huePixmap; + double m_hue; + int m_iHue; + const int m_iColorHeight=256; //颜色区域的高度 + const int m_iColorWidth=25; //颜色区域的宽度 + const int topMargin = 7; + const int rightMargin = 9; +}; + +#endif // HCOLORAREA_H diff --git a/LedOK/ColorDialog/PreviewColorArea.cpp b/LedOK/ColorDialog/PreviewColorArea.cpp new file mode 100644 index 0000000..b835485 --- /dev/null +++ b/LedOK/ColorDialog/PreviewColorArea.cpp @@ -0,0 +1,55 @@ +#include +#include "PreviewColorArea.h" + +PreviewColorArea::PreviewColorArea(QWidget *parent) + : QWidget(parent) + , m_curColor(Qt::black) + , m_newColor(Qt::black) +{ + +} + +PreviewColorArea::~PreviewColorArea() +{ + +} + +void PreviewColorArea::setCurColor(const QColor &c) +{ + m_curColor = c; + repaint(); +} + +void PreviewColorArea::setNewColor(const QColor &c) +{ + m_newColor = c; + update(); +} + +void PreviewColorArea::paintEvent(QPaintEvent *) +{ + QStylePainter painter(this); + paint(painter, geometry()); +} + +void PreviewColorArea::resizeEvent(QResizeEvent *) +{ + update(); +} + +void PreviewColorArea::paint(QPainter &painter, QRect rect) const +{ + int iMiddleWidth = rect.width() / 2; + int iHeight = rect.height(); + painter.fillRect(0, 0, iMiddleWidth, iHeight, m_curColor); + painter.fillRect(iMiddleWidth, 0, iMiddleWidth, iHeight, m_newColor); + painter.setPen(QPen(Qt::black, 1)); + painter.drawRect(0, 0, width() - 1, height() - 1); +} + +void PreviewColorArea::svChangedSlot(int h, int s, int v) +{ + m_newColor.setHsv(h, s, v); + update(); + emit svChangedSignal(h, s, v); +} diff --git a/LedOK/ColorDialog/PreviewColorArea.h b/LedOK/ColorDialog/PreviewColorArea.h new file mode 100644 index 0000000..c85c8fa --- /dev/null +++ b/LedOK/ColorDialog/PreviewColorArea.h @@ -0,0 +1,38 @@ +// 颜色预览区域 + + +#ifndef PREVIEWCOLORAREA_H +#define PREVIEWCOLORAREA_H + +#include + +class PreviewColorArea : public QWidget +{ + Q_OBJECT + +public: + PreviewColorArea(QWidget *parent); + ~PreviewColorArea(); + + void setCurColor(const QColor &); + void setNewColor(const QColor &); + QColor getNewColor(){ return m_newColor;} +protected: + void paintEvent(QPaintEvent *); + void resizeEvent(QResizeEvent *); + +private: + void paint(QPainter &painter, QRect) const; + +public slots: + void svChangedSlot(int, int, int); + +signals: + void svChangedSignal(int, int, int); + +private: + QColor m_curColor; + QColor m_newColor; +}; + +#endif // PREVIEWCOLORAREA_H diff --git a/LedOK/ColorDialog/SVColorArea.cpp b/LedOK/ColorDialog/SVColorArea.cpp new file mode 100644 index 0000000..dcbec69 --- /dev/null +++ b/LedOK/ColorDialog/SVColorArea.cpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include "SVColorArea.h" + +SVColorArea::SVColorArea(QWidget *parent) + : QWidget(parent) + , m_iHue(0) + , m_iSaturation(0) + , m_iBrightness(0) + , m_iAreaWidth(256) +{ + createSVPixmap(); + createVPixmap(); + updateSVPixmap(); +} + +SVColorArea::~SVColorArea() +{ + +} + +void SVColorArea::setHue(int h) +{ + m_iHue = h; + updateSVPixmap(); + update(); +} + +void SVColorArea::setSaturation(int s) +{ + m_iSaturation = s; + update(); +} + +void SVColorArea::setBrightness(int v) +{ + m_iBrightness = v; + update(); +} + +void SVColorArea::setHsv(int h, int s, int v) +{ + m_iHue = h; + m_iSaturation = s; + m_iBrightness = v; + updateSVPixmap(); + update(); +} + +void SVColorArea::setColor(const QColor &c) +{ + m_iHue = c.hue(); + m_iSaturation = c.saturation(); + m_iBrightness = c.value(); + updateSVPixmap(); + emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness); + update(); +} + +void SVColorArea::paintEvent(QPaintEvent *) +{ + //画正方形的颜色区域 + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + painter.drawPixmap(0, 0, m_svPixmap); + painter.drawPixmap(0, 0, m_vPixmap); + + //画颜色选取点的圆圈(亮度>128为黑色;<128为白色) + painter.setPen(QPen(m_iBrightness > 128 ? Qt::black : Qt::white, 2)); + QPointF selecPos = QPointF(m_iSaturation, 255 - m_iBrightness); + painter.drawEllipse(selecPos, 6, 6); +} + +void SVColorArea::mousePressEvent(QMouseEvent *ev) +{ + m_iSaturation = qBound(0, ev->x(), 255); + m_iBrightness = qBound(0, 255 - ev->y(), 255); + emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness); + update(); +} + +void SVColorArea::mouseMoveEvent(QMouseEvent *ev) +{ + m_iSaturation = qBound(0, ev->x(), 255); + m_iBrightness = qBound(0, 255 - ev->y(), 255); + emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness); + update(); +} + +void SVColorArea::createVPixmap() +{ + m_vPixmap = QPixmap(m_iAreaWidth, m_iAreaWidth); + m_vPixmap.fill(Qt::transparent); + QPainter painter(&m_vPixmap); + painter.setRenderHint(QPainter::Antialiasing); + painter.setCompositionMode(QPainter::CompositionMode_Source); + QLinearGradient vGradient(0, 0, 0, m_iAreaWidth); + vGradient.setColorAt(0, QColor(0, 0, 0, 0)); + vGradient.setColorAt(1, QColor(0, 0, 0, 255)); + painter.setPen(Qt::NoPen); + painter.setBrush(QBrush(vGradient)); + painter.drawRect(0, 0, m_iAreaWidth, m_iAreaWidth); +} + +void SVColorArea::createSVPixmap() +{ + m_svPixmap = QPixmap(m_iAreaWidth, m_iAreaWidth); + m_svPixmap.fill(Qt::transparent); +} + +void SVColorArea::updateSVPixmap() +{ + QColor newColor; + newColor.setHsv(m_iHue, 255, 255); + QPainter painter(&m_svPixmap); + painter.setRenderHint(QPainter::Antialiasing); + QLinearGradient svGradient(0, 0, m_iAreaWidth, 0); + svGradient.setColorAt(1, newColor); + svGradient.setColorAt(0, QColor("#ffffff")); + painter.setPen(Qt::NoPen); + painter.setBrush(QBrush(svGradient)); + painter.drawRect(0, 0, m_iAreaWidth, m_iAreaWidth); +} + +void SVColorArea::hueChangedSlot(int h) +{ + m_iHue = h; + updateSVPixmap(); + emit svChangedSignal(m_iHue, m_iSaturation, m_iBrightness); + update(); +} diff --git a/LedOK/ColorDialog/SVColorArea.h b/LedOK/ColorDialog/SVColorArea.h new file mode 100644 index 0000000..2cac258 --- /dev/null +++ b/LedOK/ColorDialog/SVColorArea.h @@ -0,0 +1,51 @@ + +/* +功能:界面中的饱和度(S)与亮度(V)区域 + 大小256 * 256 +*/ + +#ifndef SVCOLORAREA_H +#define SVCOLORAREA_H + +#include + +class SVColorArea : public QWidget +{ + Q_OBJECT + +public: + SVColorArea(QWidget *parent); + ~SVColorArea(); + void setHue(int); + void setSaturation(int); + void setBrightness(int); + void setHsv(int, int, int); + void setColor(const QColor &); + +protected: + void paintEvent(QPaintEvent *); //paint事件 + void mousePressEvent(QMouseEvent *); //鼠标按下事件 + void mouseMoveEvent(QMouseEvent *); //鼠标移动事件 + +private: + void drawSVPixmap(); + void createVPixmap(); //创建亮度渐变的pixmap + void createSVPixmap(); //创建正方形区域的pixmap + void updateSVPixmap(); //更新正方形区域的pixmap + +public slots: + void hueChangedSlot(int); + +signals: + void svChangedSignal(int, int, int); + +private: + int m_iHue; + int m_iSaturation; + int m_iBrightness; + const int m_iAreaWidth; //正方形区域的宽度 + QPixmap m_svPixmap; //正方形区域的pixmap + QPixmap m_vPixmap; //亮度渐变的pixmap +}; + +#endif // SVCOLORAREA_H diff --git a/LedOK/ColorDialog/data/images/button/button-h.png b/LedOK/ColorDialog/data/images/button/button-h.png new file mode 100644 index 0000000000000000000000000000000000000000..77d18816983bb279ab73cbd5610eb26259416d7e GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-F#0(^FuP-|Yq<8{+LR>$G`NGk!x~LaGapsaB zzu^9NY?h6WO@LfoPZ!6KinzBIHi|MZurOcDNi$jc_srqNQ_noum2IDt$GKSFqBeO) fz2Dv|!F$E|4kcYFk9?I5)X3oJ>gTe~DWM4f%RMn6 literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/button/button-n.png b/LedOK/ColorDialog/data/images/button/button-n.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0b58efb052b6ff000eb15b10ba4c6c7903ca2a GIT binary patch literal 143 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 GC-FZ${?e8J literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/mainui/close-H.png b/LedOK/ColorDialog/data/images/mainui/close-H.png new file mode 100644 index 0000000000000000000000000000000000000000..912c9f9e7a4c25e8db25d03a239c2dc8b279f1e9 GIT binary patch literal 1108 zcmaJ=TWkzb7#=ANRYDq`9S zeX2I8iaQ}9DlQScNHv~RTvDXP0}mcZNC@#FK}dv1I8)v7U`=M`T=IS2|DXT=&Ys4G z_4A6B6;Tv5FIp$Y$+(z&^z1_N-@2`$mkgy?O5!Gz#u?dyR8U1J2%@^&3gb{#yLU`L zKSdSLS|W*)u?>QPbVhbCOjb7uo1*-+SyNUzAOLY#;9NI9;Elr9|_ILB50a6Ngsjumv1L>8f??SyK?LOPf{ zvY_S9h0Ciq#Z~j?!sq3(BpKFe>|c$}Z4vi4(`nn1#kBFELELT;TX*%3?Il-YJSqkg z+2^SrKY!L1xTunX{kJdOIbV2ing2%d=1ot}?0L1X|0ZrqB!b?0NgA5-roA&643=J8 zzVgu;f6@2Rucuecl0zpyT^?&69yxN&yP<4tSZ?R(`7=LCw}(bI9_Zt)z6Qnh#WR&9 zFBWtTr0QG53q@bRu33vF4)0!(9xq&|ls{=XS;<5)F6({C(Jg}(KXUf&V9Bx1!`i^N z`}dx`Jbvim)$1pgE?JmZuT>1p^*lZ|zN+%ws|Pah-5fcUe#@`xok2B=k5gki?hZNk NJSsJaS3=wSegQX~ZQ}p{ literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/mainui/close.png b/LedOK/ColorDialog/data/images/mainui/close.png new file mode 100644 index 0000000000000000000000000000000000000000..e48406809a4eec36fbf165e9245a15fb9d795375 GIT binary patch literal 1097 zcmaJ=TSyd97#=etM1?4#B5NFrT4;B6R%h0oT+Q8?)vd;sb*ZJBjWb6bbmmMm$9A;~ zl@!=RQ4dKy8uiwNB1od!LqS1A2^C3H5Z%qf!pMlum}@<>4Ks5teBbx~=l{Rc6RWQ+ z%%7J}5JX|LPKe`iHvXvT)9`;oqiZ)F<{~kP8elU@$rd1LRM-T_s4lmFIFQxOt+zoX zLF7_eB8igHYF>f5M|Lotv~FTHK~z?!O<8FJh-?Banh~UiFJGfbO$}1(Sjj7yVbH48 zby=XHt3IK0wJ8CWs;(j{(>xZ?0g}nI-fq}@I!KM{@_6oS(-b)lL2W_mcT!0yMuwpU zNY+#4R=f;Da-4@LXE}~pM*6&rkM`o1b2H^U%ke%xIq^_9nx!`LaUn7h3$KDyD?%nu z)2UR-lPdE-tA%C)fqbu86=SUsLAw>2WVnGNm#)(c6{c+0I9`(Ys9_`7P(V}&Qdq&GX)0e{!9+s- zKuBa*Kf{P@MY#|Og_($7s0fvbjF{mHQ0dTtfihh64>z2Z>sUcIaby8l+BTp@EU1&? zN9MKcxdgK6O>ouhxzuFk(l{B~Y3yH(&TL`#IMYen;>D!#fq~s_VOx(J;LqbLaV09$ zB+^el9KE04?JW?cg+GdJ9vBOY?+3WgXP1wda`&xUA-OJhC-YXb`rSuHuilw)>dvgZ zjo0&b(B`x1ck{P=AA59K9~yr7u!v0+ua^dT`XBdgul#av^kd`Tg5rH`m(~_;?(IpI zXfumyhZeiel}vpNk@|H0{s>!igN=R7%PBbd;9KveoVyoe?406N$CvEMX_EQ}OB3da zJ-ZGKzdHQ<#iCEg*05E6*Q?rt9lg&JKe-Ft)l&+HeQ)|k#Fdv;IF~yr)(dAsTlW3} DhC*-t literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/mainui/main.png b/LedOK/ColorDialog/data/images/mainui/main.png new file mode 100644 index 0000000000000000000000000000000000000000..894516efce1303e999f8c239edd6cf61d1e649c6 GIT binary patch literal 37848 zcmV)DK*7I>P)YX zAs8AT7#klM8y^`QAsZed93CSW8Xg-SBO4tf8XO`Q8Xg%NAr~1Q8yz7W9wZzeBo`SS z93LYcA0!_UE8{zLhT7A5zakDl}P_U7n&U%EUj zdi0f}D@S>i$RWqO+!rU`B`=bnb+Z3w5@TEjF<5kH@mbW&Kh;sw}A%{VjlP1WwU?;`LAV~pl=jGp+s*EERJkl(K=W~3H z%NuYoILchYZ)th1^Zx$+$@xLLzAotN`I(%e5BzF>zwX{*{EqznW%w+N&lx}61AUV9 z|85Zoh|CWFJi==kV}aE_%P%TD%cegkejf63ZnOAhkfzs; zzCIvr`u5}eK(cUb9=>XSLF);)VUvl48Qf$qg%51= z!;;wJoy&P=tpNtvOI>P-ANZs0{_ZmU_p^YJLd&`?vV55klWP_>lwQ$E6%gTUZA0xj*u78*Vw@ zeE#`@!$W?c!E|?rsSUM743WeC{Fn6o_hI_XpL1B`K1}B|AI`WX-L;>c>uTc~JG@L^ zuP`ow23`01h~IF=Z}2E@LnLGgqJYsVT$IxbfN%q-Q7#IDa0*N?_WZJAsoGG?mc{~e zuP*;E5*kH_@#|xa$M^9SeJZcjXVuU7zWQP8y@~Xo?WpwKZY1!-5BXQ-P(37hnfR?T zkV3i?ytn)$+xncWUJvB;{JN7}js5>AQkB|V;TPoOM`+D4Ab&y*-X~9&d}j{&ZiZcdM?` zVvnWS-qnX=$M*aV+^F)f3ag}0SKgMMB?3UCfhp#NHoStEnMmU?kE6_x+BsM=+x5Uc z;HXtfF=&w;speqpkDg3VB>-n{u`{G9n@Z%m5n)ITEmVyr>%Z;DcW%#_Y7?Z~dnJfFEkxpYrSMQNnN>=e+QX z-rPfi`O^RhC&1sNeFIqb{4A(ss;}oKAskZ*!VmKK-LLbzKJ}Jt@aymTS?i(KegoKL zzBL+bqN?t@xa_F)$R%15y>m4=8U1~JE#Uxoq44Yd^^L_@^=pe}KQ(XBjfeWq`3;eI zB_A8o-Z0BLDL0xv^KKc zn-_o5rLOfQrgxE_>RO?uSHl=a0<_E_$QVa(9mpF|Z$Q_EiB^5Bzv7o>0x+{b=|G5I zM6Y~J-z9$YAMyhT&!VLBm?q{2CZHz#(Bxu>@F^mqxD32MoDazDz@H&3tw+yC<+c7S zyOZygCkD>L@(xJ1^7>{l^xjtSTyv7&irSMlfl*H*&$)77>3>lpfi@+Zv7--M-|%J4 ztND{9obhr_K%K-=m`~+t#&7BCpSL=DVSVB`cwi_Yp$w+v9~9hj!HbU~ z&bhlg;^!r84O}&vPP5m*9AEqSKL|?QW_I~ukwjn1uX(R^-+_ZM)%O%oOKaEFX-vq( z^rCjPFa?+q`h1)V`xxid4HTnijWZ5mL%sqxGPF9=cbVUOjo-5i=|g_N17G_QK&VQ= zgP%;PVaT3QzTUI5PvY(#-z=e>N7b+4XUTi52ZP>eq+>Z@+f;fpe}kXf;@9^aDedxe zTm1C1{!o`ZYdx?OWmCD!H`gTXh<*-CBNG_5_|2*f0Y6kvT3`gS0GN*PHT=%?o%4J4 zfxhOxAF80JdVwi4YcMEvkO!G_fAB<&UF-$?{Oz3I)`xD~U7y_b3&?rv@%?!hEUuTo zV2PXjyccPE&zt(?+Ru0gV{MZxV$Y|90FZ?w^Fz44i@iN7TPZa#ty7wpA-DLz()__oX|W?T`B*w$=?CV7S~Wu} z*oeOJ=pON#5b@{1uMM*+m2Wnc%mFqN0QdZMtbDWMt@#~Y_?0JKBBomAmjbPqI!E$Q z^%7t14Jg7NAEG8}j~Mj1jjNOIR?YE;VZwd&yQr`5>(fpB=lrZs?Fojukgh;0H+gV_ z+XYQjU|i)As}>;mlVYGHqWqS6$NXxGRHB-Q0ML`Asho^=h%EiNmOu>w+78Y7Q_uqH^%2GO-R zFm;8cl8_!|28t`$k+*ZVZ_$6|ZFv)y^8+A-`sq-!K?H^3TUz?-7c< z&Dl5U!WT1dP4zn$WHayILEb1rJotf;@k7LKJ@c78(8j@lx1FAUlON>m@oTfM5Bw0l z@gn>N;fMMsAAMjO7Kac9N8~bYJU@^D>?8sCK0kksk6wjes`z0hyT}g-Q3hS@6MotZ z=}_=^ji`+lVHcX&NBJE;d&7;dn3&iOVvh?X34qFcEY*b|VzzE(HP(*OHk-bAY^F_U zD~(3+H;G69X3m%WZB@P*Uw_08Gq3WC5gkYN_OKuDdA!6PM*6Tdp18`)FGC#;xt?DU zm})aoZaeFJmlKD^Z|B<2Uq}>vJ{E_aKWO8h&wQa|?iyTPRltSbM%yuKz;C~gmg_#_ zmx6u2kL{ftT5|ofxprhK)<^&#AL3?W<`N!N9~PRW(O`1QK=zAB^v|>SzQphPjlS#p z0PtP;1ymE%vKQtD79p{X0CU*VUhiX0(1$GiocEXcX>xnt&s+BIJhSeW-*A;50PgW4 zd@nx{UcTg}2RWE|i^9UsW^}j3FJitcw?2FcSX&{K(n@S-V8w1`ZHx&+>;b0Po;PSt zF;_aXI^m@)uN}r4nW1m+o4>DboDTI_@%#NFc}ns@KH^2E>r)C~2y#AWtT6^c<@YOl zyX)tAesI_Gi*J^!SsKN~-~L_a#=>ys59A8JQvC`+)ko&2?ny9kMNb99H~jijQLd7A zf;Nu%N%P>lu(yOn0t2kH*)|aiNT^VLi$0mvg(#EbT5Ig)$#eo^2tnWV+x+JFGC$2; z?R#f^;1~5u&nL7}6Z1>?JjS?PN>Q6iXj(_GHb1>>&$4?S{ug~xqzk}zur0dm56Z&FZyv2DeCmDcd-BKpT z4~veUO}Q#;GOSb4HI+&?3gHP9uk%B`#qS)S@zc+|eGU_OVuu0z=;ZhmV1z+pXZoj=#Hz(-_3q@{{CsPW7Suo!$4VHi1mhnVaI#{5f(*`oNABAh>_;MHK4{V3||R zkE3hXDFjxW@;NfUI>N6^=V>A?GRB16@EaF?AqG0E>KaKC{yzPwF9#F2X~Zx#uSEVc z4dGROCzpNC;_nA{T;L~@EqY%bWnN1^C#^@CZ~1W-epV9Q-6_8s;ca-uYR%6TeqB!Z zDFTsD0nuTn2HXVA9>1KKoqb7;_=%7Memnh#SAHYPP&f6K89o?lBD4_Krq+5_C}u-~ z!c^6m#sqLv;l|)93?u&HHGc2^7k)_L7wln-X-pHX(S9&LxiJ;^!bJ2B596n^FSo^g zhP=g(^Z{7jiSj#(@#{}D6d9x#wgZ2r&vO2l{=#^(37k@qwi)gcm;Z6%pc-3ww3W>$3E;OBJ9kx zod4RZ2=uML=3f883;;WcteR;}(>A{tfl2xg@ROc5=|!6AgEb~6{fo58;>d9625D_~ zp^R4guJU{5>USwuFZ_^(A948dA><5y3DM8Sfs4-xPtEx)%^&4A>OC^#btQqnKMxt- zU+V(^zooAb+ShmUZCGFbTMnG8dwyx<57eA;gN??)miG`jeE}4HsD6d7)zK264q)RH zU|B`W7_ebU?l((sfgu{$y7S?|+b(pc?g%v?2*z$}6UJ7sQ(Ulq9_}K$j zne&1P762!mPd(U^Fz)Rf_}#%z{Glzjl%|8r0Lio{KIJF9M{SQ@*YzztT`v6k@MP?h zq^VY_5BwH(rcYv5d2#nqQ+vy5)*0tD=5=S}wf&%%{zA24&qS+bEomqtV#(%L>DBP9lPE~ zmiGL_9~%Cq#izOZz2t{?bRG#50OmAG~G0218sO0g| z;`_N&yWimVn^rW$rl#gc=!l=(^ndZj&j)pf6@pc+_`M8rIsz~B$CYj=c}%+{4Zp41 zE}g#X{Py)Z*YT?bmR8`hg$Aw;SK`(cO$C_*K6> zOFgRe-X}?mZVw!IG!(%OFMk3MZcw zo-955`Fyv$P^>WtOVgXXlO97!Jm6Q1`PQ463LOXygx|ANKkj|UQTfRn zvveL<1XuJu*q<`Bobr2PfXl-Myt<~({KfClV9t@T@0pN<_2*Vdk$rv-(k@^ zoP2wJgzvLdKV-lMAEE}}nyZ{7b8q=2;4iP<_Lavp^PoS2(CL%v*YW$#eLrhQ{g?6+ zyp_Pg66d*CNvn9JcHLhn@~~_G%EO;3aQl(iIETReCi~zP#H{m0mZFM70&v6z^p!r9 z`Pl{^&}mXOJAUR5!s)C-DS-p+r)Yz>l|F^1{EqaEy0Sb=7qSzzuE;^$s^7~4>o7|F z3s&>C`4L$>uH?Lv|6`BG5^_ly6m6Jmes23Pu@@W6Q_8b-uek*x%S$mu7 zws0D+W`_an&c=w$%a4-8ZGI^Y@qe_PZEvGG6NaB}yILKH0Xto%q8zFJ|39929~&DW zt7q?|Kq#b@xHR^R$Kxb8VcSX)qgUfc=8lkKU&DjAh#1~mXRoY`ORlug0E^V5BtuX5 z34L@Q;fL>5-=$Ke3cUXGblCNK-1DV`%W)xD15=p4Q1}d=^GH?yK7LnvF?`eK zkW{txbNXEO20Q9U+etNW_@uRC88l^riudzUCC9Ci^fOvB!1#@iqVQ=4zcdWoO(JuK zR_w!|h^*hL_`y9p zlefXEmHkuE@at1|gyR;A)#69dJ-KjI{Cp6iuZn?llXq?VuJOazbIcw5$RK`6wB!Y) z#b?+a;5UUXe*LLN4S#Koe9#zll)_6@IBoCaCsK>km)WEJoiUmz(2SBti=QJ%{3SMh zG|86B4v6hD`WQ<%!UIVaMXA+_xx{agYspdFlq-qDG!9oH>ysrv!F`MGbEPhOuKW&u zE#2;Vkho=CVn51b_z7rl;TPV)Pxx~Qeu42D+c;YV9{`YU@)uc2A&Wg|OkpGv%97;Wu0sQ?Z)PPd9$y!Q{~f zA8+^GE9>VDRZAG}qMzxN>~8yhh|B}!_|=jYSO#^+A!L-{r{#q-!G*-lDgYRZ1A^gYe>MIGWdCsmCf zR~b5CkBCF`L|$8$a~BZeKoDMJL=U0gt}0}qG<1resux_Pv&9|CU&f!<;x{%vFd99} zG^RP1E^{{)e)FFAtDd)6O){Yy1zZF_lE+q-7C*X1ulz&&#M<9QFBkBg;0JHmiC!`5 zbE~^OUts)19r}P^W=5ZI3_pljP&wRW+QRYj>3 zW8(xWH4T2%vC>z^WMdHd$c9|td&0>@;3ld~l=qw{e(T1cBy^ax@r}+LaQ#QtFTbso zvS|$X?GQiW4`1^%WOBbc1iA4O_3@jY@8ak5x%`tqQ^qe@x2emX1+Alf?ObHGKP-lL(YaBZ6Ig#IV`NO!D|*_NTuA$M56!HhQb2 z7qVJQ2L_tr@*aFV5HlR$+4j<4!wXD!!K3Dt~us= z1S0K!t`(GpzGM8zpBQ8zg%Qm*DwzUv^mP10e-A(T1M#ecp|1RRXGHB zk{peu44UHC`VxjwRMF947n|X8H1r@=_|+3PggOu(CG~ZXpFmD~;vk72L-47TzZFad zVJP?^x2O1dGfd8h))?pB<^Hx6U8-vr_)nNamBE%v{C=bN!B_+~^Dbv;oc8)K(`VKX z-beV^vV10H4&R{hNV?W-2$HF8U&s=(*W%Zz-#efr2CVhk|B0h4O zePRNEOqstmjEoeKurYnLMO{`+X3>c9rv1KaZDvD~l<#e*6=VDV#cy?8d)V%Jd`vum z#nvy!Mv3As4SgR9pEtg*&yY--Go754p_D@R9L8hey%cf5a93gdiV)jS^!E+FrGwu+ zm7Zp9&hrs&6cz2B3V0fm6Xz%`;(Egcfo_B|!>}lSYi3w>e+8{0SwLcm8nS#BzcrWq zr6tAo8X^9S=b!K5XWYGoAFUX}_)TLUKjCkNmk2`8wb=7`O(D4=nSKUQQBk$^n_bNr zjJo(L-*(O6Dw9i*4tctazyXpS>(|WxQ7zcsGI_Sln`jOXz%Kv*A(G8oIh6|d3vALB z4%3COXP+J*jnxzC7S_AvF_ie>rf22EjGr{;KODce$98YxH?h3(PIUZQ{yYmVZ{N@_J zvxe62X`t)j*YMVy2$DjG6aFd_K990`J#v>Y>B<5uam=d`9+m{}*r~rQup@^OSH6Xx zjMvG~af(--#df3dT?;iQ$x=Ibu(^ldOKRG~5ANqsR0!t1gP5%49VAm1OAZizC>`*v zhgYLW@vGpwjbCVT^g^?|1eOrDWvG*Q+3?Ck*e0-&#v?2^fg~%IULhg({k&kS=gWrcOl&bW(VzjN|_xhZ% z^x>}%erXOqh~S$l{1W5WT0a}my@1cfxR(UB_qC0$f^w!3(6g%!iCkn3y5Q#;m_VLa zi;l0Oi)ffaT0%@=|0gyENgCX3g%j`tl(-xh*w*;@KypgkS)7K!V(M@MeLhhiKS!|2 zCxG``BEJ9k&p${XC)>}{m{A@4*!n@|kC&MS{C@okSXkU^1~Gkes$^}i;a69zzky$p zuAg0%A{*BJZHiyla`gdo>v+cM@h|EkOKz%l-5rYfr5J`K^J6P=NMlG*mI?IES|$;4 zB*A1u5hN{s2i-c3QFf56aNXqd&mTX430K|t7P(Wf6(*g(cO=%8@N>Nczg95?^g5nj zU%b{dN$XXW-|>t!e$lPpNGj0_HyhqDBn$Jwu@rhbF_fwFFY>jj!LHlLurb! z?bW5pkpo-;ka6O~r%fCisVf;%y%LqTy_+mbdMSA6T^C6Jiy2^x1KYVV-KCt0MS0e{(rE1zisdxG8Ek?Vd{t zy=!%Pc7LPd*H==WZsT`>UJIQ!OO9U}1`4k$e!Bc65{Tw?lu|#dn382AwsgT~bws6b z&?XKCdBIfq$M6Hxgdm26z``vZZd8CJYQlbo-?YMeg$BF}zk~!33WKNkZ6Ml{-b2sv zcp5!h)X=qIQZp zZNLvBr5OjnAHIaNTI)9=Crl82#0KKG65<49KHyLO!ME}I+2Z#v;5Sb(yLxS}kNLXo zvl+H-`~niEQsW z+?J#O0Om9zfN*P~ZgJk07~qW9zyF9k7aqB7901?-4BH4YjyATY@Byk0(EtCB$EQg> zW+#)~Zn-nI{0Oj3zVacFlvLm*QjK`Dbc0-$$5Ke8tQvc00)LT+fMEx z9~$4#|Mm9t(V~a3=jel>6puUh#`pnd0dow{+=DsC89T=B{%1JG<+nzk!;ds_rz&l1 zOJ<*`?!07m&5CJ1#7|@+_T-Y%U#(dIr7P$2%61972|0;|K+dGuR9niO_A93seyWx> zBh+arc~zXy#EPB94_?7|?eHs#Un9v=_nY)BPX0w`h!0~@wd_*kOCnWhhM&*k3l(%S z@c02o{{@w|adypy1?zy{pBP=deMfx8g|@--NAtKnexfPm!bP;7COX+=v%(CZ$M2`o zr&d?A`IR?_#c456REzW#uHVo-?`;F3)Ko)eaW~6*^zHFnYy9?jD3zx6I8b2(iM?g6 z@nbag?L3h3dm``|e(fTjmm0qf;0u4jd2;|(m5%r5dD~&=E~UA^kGC80hY;U4+A%5K z-j0BlI2_OM<0THJI}Z4hd(o8mC(>u39^=RJ!r7{7P2J&)v-P6XnUoCFlr=S5rwY57FNaV3Nr>e0EyqwdjFL!O)oaYw*)`TjGrv zE{nML1=u_yih#wZ;!f=NP4f(AevHI1r$zAl0B`+dV?*Dp_>G+$j~~q!OTN{(L&iOJ zJ>T>SF*r7D|~LE<`kGs*ohOEUU&KFyLO6S@4_bxH=fw z2oq)i+&sZhK`e#v`4p8nH~Dfu8}mcJR&9g0zP9Pb{!ZDsva0-2*O4|1d^Vt^LH&q{x@~Lj+6a>;;Lci@>GPFYDB}uL2wg93=V{ zbAS&g1e6&;z~OS5mhzdhdh+1Q_@!Eg#+L$)uGHi03Vegac2DqQ#RshZykqzqZUJ4% zaNOZ*5(lC?G)S|9_yoWGH}K0&{1YZ*toz=>uMUS|-LEgzZh_Z+dmnl*`V{As`BHxq zAO?TZXOsD46*VjI;JXE__H6hu60GExod)9ThLoO{!9SBG?D>+ z5G3?s^gYO2_YA9rIzZPEvA8c6rd$PpFuG=~t?r|fZTAw!+KK4-q~}AC3a6WY6E3iW%V!zb3{^bOS@&#jLN?6uG_1_hR_%S9yI#1-BMF z&TE;)aMLv~x0DHu?L<)sXgpL*Fj#+G`>mr8cSVtPn9li|KxX(3@jHJFKUIDk(`Pcq z@AA>uRdO|uOpM6@KkeLT+OMb2dS@Vh&n4U9Wi6L?CiGqSl`Kak?;(DH@jDLR7?5<7 z(|x75w)L%pnDPL>jEqcTeOKUDan^=dXOG_zcj1mt1RtJf2}o9kfh;iNH=z```9gq! zqzzX#2KY@RAI48r-%!pmen+hLBC!jWUi-;e3yWZ+_*Dc}U4fohTVv~?;5$kj(<){V zZ`EbBQKfGL=&$0HR+D&8a=q!Z6a%YzE+(0Omjpx9OpG5YUujE(P9RBE{G>mYSl>zU zL)Zx3LKlnD1~+B2Onie*FRo3Z2)Y91PSP2_3 zt8C+-@=$&8I)38MrT6h8Gz>*^#`-D$6gtspqvo&ay-h2rc4xP~S?V1aeN2CbA68Wy zcwo6W3O__@%X}%n^Qv<@GP1?^QT(y8C&(6%Ct8TQb#eI3HGY=p-@)es9ugiS3rSbr`ECouT_05R(>^Cce3RMV=-2_g+iWi+z{8|$3XSo zoL|iJwKMQ~`;y7IJrKt4aX?gw_ZDxaL%M@ltw`qVseTv=?@ z6TTRKAQKAVCQ)UApOJ4JhE# zt=K)sZzL6cVty@iWTUg6DRW+A=W{;Z&sdXmhh++U!*hwW8h?(!JjO4K@T=`XB6TKa z^UTRsDSg6A%RK*+!jU||(-lZz=%4`T4y-KuiufV2lX!YFhPybm>H|TtFgwmnexL?RO{Qr z+^Su&v~A;?mvh8(^5uw*%aq6Xg)Qt3KO9*7I!R`bMg1{{hrEyKqK+bDNui~%T)#)|yv8YEQ`~CV|e+I(I_f_>a z!kkaWPaD1PuD4?8^E=vaJ*f)@d5VS~PN-_isEY8S22kyz+?iAzUJpQ&K1Hnn zfgHO$lDSrKs$20IM?HSMj8PJ67f`-^d*WWH)f2%xR`UjjATa`PDD=??*bCvb_E`7r z_8m~8?e8!AHtwpnkwbU{JaYWa3GJw51U!S^)Ue_AGJk0dZ00gwhR!y!BCBWk84P9- zq;y>GF@C9J5`#RCv|mYrA7#@M&G>MUgug0b7_BcE!G%G%LV{^5vkqFgRz0fBDo*p! znE9(cy$|7M82)1ZNMq3t^+ZCj8jww(gAYN7-XxNzmX~U^DLs|o+ccdiZa4T++CA81 zb?o7*uKPIZwW(x2l#hzxM_&^Rj!0bGvA5nSZ#2aCSxLtQoj#>uP>pB)1^W=!3TSGVI$7=C_wHZ>_Ib_<9^&J zYK+}N?f;2ugVy|%eu~loCX#&)`b)le((f8oHuZ$s_c6a$LU6H7z4J2 zKE(aDrxQ>U6C0z@w?~}9ihCyf(nbS`@4^pVE(;M6BoYta zFAIN$pX1LSNjB0)eLqrh1ez*3G14s6P-K~&;+H~l)2TB9=|o|Z-@Am+~YT` z1OCq6#m~Z8Hqv!iK}h!M?m2${VeJ>P|N9QfP4QA!B8 zM5k2F#1AvM{6Xi5Ob*MT>hRkQKg37(P}ST4m0X6gIWVDCpQ5|6kglV+qcOiNf8}-j z*2?Dg`g8U#&N3c@+|dVu+Rx*ca@Z9=KFSU!p~Vj{OXByDix(o{cihf8Z}WDt1Dz<| zBL=l+8~l)qB)t`NC&xp#x({`uHs2r*`J0LXYK-2EUxj z9?k|oKG*6mp=(IsaZ}$t$2*R51pG`=E?W?=)eiKFO)04J^?jb9+2|AOHMUYQLpK zl-~A^=~Miu(^VGyV%3W zRfPywar@s-Uh$RQQGy~b`10YO#&2wUeNGQfy-=|S-X`no6E~DJm6mv5Q}?g*7H`a7 z(ms_hyMGo-d|YN1aZHGw8s9Aw9fTizcO>de68RE~76S7EKK%sD3JQUg-ww#dJDJ^x zG^el^Ji%A3Z?;K(Nkxt5_8p=I;|@nfy~%mGGi6tI(};ziTz!sh^iZ^jTjdK~Kg3Vv z9oxG*;d=5+h2iiZiuYGfzO2HIh{GL~pWb^VAxXvV zbzjfl%A}?%0sZeKZziq#6u&<}1iyZZea25PYio4mBkv?_KxpY&G^%pfdHm~13xi@` zZSMlY-JPT4$LNL&b;@D-lCZ<@I}AURE1R~#j}?#rcxtYx#l8>!1E{=wwF=!ULSCLv zoYeEvFRQ=#^BlelKO_$Y@$1F9MmquGWT0nqjOA4?9nKYg&t+6=t}VkAK;8aSYC#ac z^K0=_G5oAHWfz^+T3%hh+|}J<{7fFOo`JkJ(CgG*0%v$6&qem(FScH|^& zIF|pDcQ!n3>Pi?^5`TE!nu_e3g1U*Mx;8))}t@-m*2mCr;$z#Jz;ZE zA#Gxj60%uoazWwH$YC#X(?00u&(lvl^cU#5x|7psMs}l)_NWt4Y>|oMyxOG3iCJ2C zGb!gDX1!uZ;Att@vt64WZAX~O5LoNtvPLwNDZt=SC%gRtQNtV4J>NU(mUSnMF7(b= zdUryie!)I(M0VuJNgRd*%bJJDSydZp?%s(z4iyp`tD zxqNu@@=vRrqBZS8<#_1xj0Ka%cC&f}(yY9$T*mje60WGjLJcHB09 z)Vy-kOh4WvEfV|d=z8%^E_WYN00}cOdqmuY4mEgu^;tiomSOsX#7%WJNq>Pq_^ibW z6FT-f2f5@KEWz54Is=kj0Z3-FsIP|{l{2i<$X3mOJN&U^mAf@acB zt4P+eOsrn|+4v!RA`CS$d8MX|RDvJs_tx)9kaf52a^l%*_?U@FrY?-`sO3Wd`EKw%5k7(1rTR7p< z6u+NQZ-XDv_b&JmRqA7PuGmdo?pFNFXakP%nnc%%ABt=qvWLo1G4ptkRUnlK3(tP{ zIqP@5oj|Hvhv4lC_}Ly>=$$0GvE5VuYiW=O_%nu2CljXkV*S>g@AcMzmW1#D zx_kGu^RTzm+6vf z2^l|wD#Y>;cM(}B2lq*a9tSsu9=BGK7iD+1y>+iV`wjY3tec~aOYv{Ce@!f7z^8L0 z5HFQJIvr1f-)Tx&0_pGK$MAhUevlXw>hz#ttVR0ZGku2n%gSNxr+kpqtI*`gBo~jt zZ;PM=nz)Zl(aGAvi|TfUUP=-3%VW2X`*!?PR$ng#?VrHmuY0tDOyH$yi8roRj+YTX zyMkYh`a1kjUyfg&vXw>*Dw80e$lX@kR}@U23}FtxT)(dp{K{k*)dUs{F~YVVuMg~Z z+wp4wB7I?i?#?FhIqNsLxbT^}@w#ave2#|EI$E-i_L8>Z;@+6z$7B$GwW7qIufp$d z3Wl|o>>#9p6DH*goq^A==>cBZo5Al;1jzNT7w|Kv5b-PZUcgx?4HO7JL+j4tE(--N z%xrbOb>k2_HO+|M3(gnfo}){x$n~V$$)^S9z=O2$vS~Y*ET0%Zi%cZ^w4wD$5c)UZ zHw^P`*9RPkC*@3z2mC}Hk_NdNg5oETO>^2yUaMQguS`{SO{A}sISRiqgdf_z-61;T z98IrAz8ZRT*9L}x3#<>JzkNI(`5p&-I&mrAm)D^2aEc%S+30&n=T<9QwOZ6FiOgSY z>O}*eWJXLeGN(7f@AcFP6N;&rnW_2^)Wc4t_mlq}^9ez1-^_+b!i|`D#4m@n<)_L+ zCGk~hMsOj`;mG*ycS*|b;jnq(rM`CHgWxyV+x_`H-$u55BoQ2;BNt2`qR(k3)YNWo zp!kFr1wU-V?LRVoR=H3D1wWnF?~PyZ5Q--RW)8n$9zUZgE}j#Rd*l)N0gqk_;NwU` z=w%*6Qea;!-zJNG6YSc}C3}Bpy6}0wU@e2@4@l+WKfbIBIffx0H zq3?^qIpWb5;1DwAxM?~2RSUU;Lpp8!QP&IfS%Qs; zivTJv?~0$#zy)If$54O|crNDEZ^sXcil1z}!2t~PZZOV42`=CTitqzdNhn+fIv2nS z1t+YF?_I#JD33ur{rcRqpZxQbY=hFG zRFV|IRjM_U!b6ml4mElycvF4tJ~9zmM;Q1sB2FhYPeGq?mTvaR2e*S?zI_H&na>LA`>%pguW#X?zlqUGuh{Pi! zIw&voTi_Q$bh=6oqGtea52p0RfVb(Q7!1rk=oyc9rkaPZ2LcP_4UNX@!yw;8zMWhn zct-IfVg=-a@SCq?KC*i2)-RWP!GY-AWxeivPan0tT3$2q9IA6p2iPmYm!0nh{CcS< zMjuESU(RVb(mU;(CJxvGV%gNSZ9n0s%G5pbXx{`shVc0>Ha(ER}DzeOYMu1~G|DSffEN~~%s z0!QDl{RgHHQ0L}COD{@a=I@yCzijEM z)*x|E8FIg?5?%`fufOjXOqc=C1xox06a3Hx@}kQ!Dszu}CV+=&6`@iS;ckq2U}BZNJ7^{{pvdJv3s#*t2Z z&NT|`S6aUu=5lmP@uexY$+Spoc`)G3OK&?v#r(N`B;ZZ2gZP?EU&X+KAC^g(i8mxr z4wA-}WsK%}R9o;1#qO{<*Q0B=`wIl$B7FF1gUY+>R_oVtt=LK0Umt5aE0$rvPkz5q zDMtj4wmvFemf_Pv7@10$H>fwjPYj)hKUIGi$L$ei?{SkPdxwl`%P4+?%&V+qlgKzW z*%1-4_sq(6ZOI&;#rmV)%M__?l3-KE@8o2tRG@ivL`tuk|pA zXq{)sVDcKrxQ+0Jv?BFOPBeI`7|@aWWMz{MGk3^|r~mKiDmzcG!;nEg>z7kwwVG!3 z=RfK!Wi31Z&_hZBkBovwuhN zb<^jC*zL~PLaiKnWGQ*#m60crO!`n+S@(32D7oaF^(6iM8SRik%b}ex_5cqk6!0(_ z?uz&B(?w!S(CEN%8&NmSrm}u9#mAiO$5Y~ug*=em!(E$kWj`Ekv;y_VpE72k=hEI6 zCH5zMqkgT<+_`DnLHLXClRL}u_`wFV`!Ag))T;LzLTRT5SdQe01j-u@W(<#o9w7_rCu?emRx~WVuITKLo$C%D%gcJ7-#*ez#|jz@HBb zF9#=Mn?gZD$UG1cBSrnO=sAlCpR9p|l=`nYjNN~TJ)bF>X3^C9et2-gFM7%nME*gb zWaqPfLFd+px4n#j{U$g~qXK?&IoVQWFKFzBCu^R3P zUy%z0wg8b}>56JHmy75OM%g-EPd|TJ11wo^KGCY@rK;sRx|TcK#kptVy)HF*CT}Ia zdGSaQz+tg#VI%aE8Gpun7+CZ8tfQ!bbiB7}!P^))U9ozbV!g;IFBpu_t772pmE<5I z9v3evXUbOxD@kMfj+C)@T>Be#C70>)Vl-@Yq2C-vpJ25o8(V%)eFy7^)Q>Zwvk1pG zaUp%#0gVFQ0#WGVyaw{;t)~Ci*^-h4#I+SMn{hvWTVR-M1c^GNr-{G= zgvU83_7X~#iG0UzWz=M7L5Bv!>pGG9Gjd@WrPu2FB7rbmUfCWKnjQxanMrQ9|m(;MiIQ-3^@oBmi&-M_n&DTlIKEqITO&HOz*AOmef zOtAJkcJB#YtgG;IRyfR?%FBUIP3L=RT&fMFI|*_DPh}}go%$lZg4Om-`SA05twIOA zX1rjT;lo+NI1e1owBhE4oBIGjIIxpQBJd;cSws%V;Q5#ZPk*))OS4_=7f1?x&tXDv+_DDry8TJ@W1|g8ElfYVE?GSl ziHFP?5x7j?TRHX`a6w}#ORhsV1!58TBT;#S1uHhbMc4~lEm0R=dMeOlGGH*SSD!72 z&b5wd75}UEJH_iw!b3ha_2w%XoSdj0GVysbkD|*G%dIW#hF`neb_hB+Ma;GIusb|I zvP^4TlgbUNvc2x>+T?|)rwiY57XJ1-OG+x+x2?k|1uhXV%3>GLbeQbVFU)>E(?&0{ zw?DxqFh-U)zv7=JYIij$?v}wK+KUwkW)*xbeGo|h`W($(Mu1XcbqW4#d}2lEh5x*j z^ld#_H7_49czEf@?b*KFHhgdS-aeeHNVXUi za6e>)B$G;_d%y6PBRbgrGS>ebEJ!KZ&ymlA*vkVDnE@iy1#<3(LV1_$&tY-br8dPg3- zZ9QTeZ^^AiC2l{{QFuDS14?53w4?0%{5u@MjkdB~!AMnJu`CRq2bpdD!$!sq->l{| zXy5+haNRdxGjeeF$Li49c5cXjx1fe^IvDObZiS6@t=E9q>@*8wtA`h8-J8+T6{rA)vMTt~5tf zmi2?@K0l1{{!;DjA5=c;x#3+>tYxHd@69tki{$y|J=}taZhl`yt_~X6dBKt#J#8 zf4AKL-6SfLY4DlFv)Lc}L94IHatOYlcadv2>cdliT4zO;T3L?;Of9VYjj3LvgV>fE zaSGZFRXe#^&Xe_=3iug%32{Ip^bet@X9rQOSWh0nKelfEP$PyX(o9g(#KQXX2Dp2! zCu{=|DeGzOzpDNXh&zfOa{+R2lg!ecs>7Vwmx^kSh>pOoxoh7{XrY!$y6|Gt-r+yIUq6bWspfta-Mz-f{ez~27>`|fsR zhk)9&v<13f+B(6$FwMt_38{ex(6wdiB>7(C9M16<&zYgAJc6$HC|sR5NRN@@MysK` z_an+HrdC0BD?>NQt1^3c^bjLb`7T)7cTPqYTYJw-K?P9{0&DFggRdnP$z-%b9(;> z{LRT51!&FkRS}_vqe75B2Df9F{*)R@P#D2qO)9aiKE{S#ZSN0==jr?F71>3`ald2+ zlA;GZLNkQ46BCu`4_Xq%<`B?q>`DwBfut65L-n~1+5JX90EKNM+)6b|zx=W7@Dd+V zCq$S#(zLA}*kBVYDBX<(+Zr+mlur68{ANthL7q^2Lg1%QvuNZajl{}7M~x*^b0~PdB+i$`X}YolcwkcJh0WJKbYGR?1A|A`Ew+s#Y&luJepIS>WejrH zN1$Q9%Xv5$w;e!`{CdUG<5Bjg|NSz8Igld|u@dz%8`OzFQ?2JVfg%0%0|xUI$_21n z{s6ErS@u#88HRRSt1N~7mjC+dj`aY%J~hxC`zDrLBlxg?l+egyYS(TxY)i*abS-eW zt>SAqBcAfX1(OW<`BKt|P0i3iiCmY-!isqH5it;atFQvNfbLtlw}TIj;8TFp&Rdya z@?bLpXXP%0-pxPgA0~eSYx3cEWIGhf?n4Mg9f%qUUST4awcO^UzVc!?=eZ*PuG$2* zCNHHvFCV*jofQ}>AMy0(YVY2Ys*@(Ywb_b{WkTP+P1n{U{e&w9_PM8v!Q^(U>5g)y zNt^9AALk;bFf^p1m+~!XUd_^g{uE!mDpE?9j4B`_>hlKA$y%;DE_rgAo6<^MdOamz zC{%H|KJ%K(V}lTae4gp=Db`5>8><7Gb?MY|j?ay|7)Wy4%#*DzwL?`FGKPb$Yhz>> z^m(~@!4_|Ks8oV#bLWg0bQ!X%ebP+LP26ldB!S}}{-vdx_Y{pS?VM|U^^Go`aTufV zCJGThL~}k;X1FvZI(b<9YxhURTy2mJKbKVdQ&GW#fpWbZV{&ZR~pa%An@Xj@I13n0u#IyS}w#6RP zwmZdr?s6z~ZaNFfXA}Mi?-Xc6KZ>LiA?gsdk>X#-5C& zyr@MC>3s^z!1uucZe~=6?4!6;`S+BUJ%+Epuw=(^-TRwJDM5G8i$w?tUwn->ZLd4K z);CbdTPyVt0GijxFSkemFOtnB0$$IFJskKWeY>LvUbTvLL??X=W~}f^I1k8>lOB%v z&b2eYqcfHDQzn7wy+}HK& zfQ<2rY*6-TC7~RAlKXG1!1V^bx3wdlWj z&V%d^HYz$} zXEEgA%g;YhnJ&cJI(>=m&#mu@JO2y@=(o=HVl6I(&4KH=Lh)XoZ&Q*po!yP%%bwVJh{;ZRJFCQQ@dvsW!$N?Oi8lH;o}Ij=8V|KcE}sV=8wsDzQ@f3{S1M&}(Q zABy#~kDAn>cc(B^HyZ~w8&ZrH+<$j|slCzsfV2OtF{xMUHMx&gw-(t_CV?54$0_ZP zC>PuWf|T#Yf04LFl@%OWvkObg>zhj9ppbOzqhIdvTL*aKDQ@U~=6-f%p{9zg(PzR|r`P06%nE zjWYtvyt8SsG<8Et{WDSrmj?v$uzVn8jaUR{(P77R`Q4vH$R}^6Y+}=;;U3J65;^SGUxJC78)4kAu?i97`t~tPVXDJV^?eriIolvR?S5xmnG9w+E;j1li1B2sx^(*2GqB-1&PR3Z8kwZqJf_KzrGG?3CDUuzrMEMB*ura99^nV z`i#^`mS`SWx^aYIsLtI!wA}-wf}HANGK6%YTox}0rQ{5uERy9@jPB4ckr^AsXFmE2 z??QXgR1Bl05cSJb-4LcSHt;Pe5VCX^?!x!8Ig-F?ig0_x8~=|+_LO{D0bG|-4YQZ{ zL+~oh$>zQ`i<6}DN6dfJ+y!z z8~$S)(K81F5D+=q4y>F+Q?<)Nk3la=;x-enbjih6>mPXWm+SIZ+dYCy+3<$pJ8oLn zKvG36t98TKw+wt_84-35%{@ha$N@ug*?7f=t;89^e{k>-DLr8xc+J5XQ=f(AW%*}W zwGv5k?Q%Km13yES+wT0n{;zhuc81BPE}qPLHHPUxb?YUYuP-FAJ*afUh>h6=%Z|f> zh|(57u3nR6vt_-{8yNOQrMn?;GE;m9nK%JMILf_c?~dK@*9+lircfusvv~boK{DFr z{5%VaR6`LUO-e{Vf{r8d#P1mfSMSQOvIwONkS6hT7ZX_`DPkXD@pXWzfT^lX&w{Ut z=J~qoC;Gp>Vx#5Djnv*!a-8G#qI0U{*GdQCq@C$?m}(+_6fshBjx;JTkdsV%|3?|I zT&*UaGzpTI6B@vV)&c|wgn}Ca^XMIe`biDY-(aqf7)<&3K;?W^Uljhxa1AJx=9SC^ zU^n-j?>CYdUA3UyW)f6zLKBNDLPs3b#jKBy8NBc+ z9gtW7-F{zkzqvk-u;-3g&7!=hfIgFQ%Aw}+5{4N z@C;x|97ZIq%PF#JK#ecO{ok2CsmpnV;B08Gr>AoI^=G7x<2GXD_sm+C)ooK*;+2_l zh=B&nU-YRUExRB82ddX>vf5oj2jk%*&SP6V%}gC7#KlM^vpwB3)W z!l}hxO_62x6+f1Aj2Lb}pD*dLH|{)*!G3rD4G#9`?>D|U-(j?sHxuvgixQwNb3*8Z zq#LaJUUuD19VERyGl6`_Xzu}IuH>;9B&{LZoQZ;ssw)Y7e_PXfoCq!Xye^xAW#f2n z9|bz0vV;=F-q`V$ISgsn5hb?gEBzX=v+v(YYR`wyVghq5z_)ft5g>bWRTck1dAkrm z9smnqJ4o6j^6BJk0eUK65jOebOMLuWx-&nIj-LRX+tuBZI3GGHgr7yxIf?4asVe!h zL7!r1d;Jmhky7}#nve?c2(!wE$FbDA&KiFj+6XH_Ptu_kaapCEm@aVOA7o9@btxC2 z{jHs|4?jj_)DCLR{ht2rZzC7<=0jdDY*#Q2^(Su!9jNNWZE+@5=CZIj_wJ@`sf0(R)6) zvT3K6MNfJf@uun9(!8th(V*S-^CM;3XrN%^jXK@SDc>|HQ(v7NjVY)oHQxaa_?M^V zPd4uK|MqVB2wzntohfoI09HAZ?{Gt+S~6dK2}o81^a4>9XRNE6vqi#G&qdcQ+Ln7y z-FnDWu~?w~8#&@uJMjK_ z;fr^pk4~*eHB>tP*0#9sdDHCkftBAdZf0`wgbuImfz-rx2b8`JATiYxVE9FY+zSws ziAxohp~H&ovb7vJj1q9Tdh7OB#6eO!w++F6P`7mGg5H-Z{33%(?d!!C5$*AUzZ+MiUp%La2$PT!5eqruu{nHUkp`e-cv(LU8kJaO{$ z-S+vNP_OU>93`;E-XV}(<()MSh1CjKRawfLhsZP}jP)44( z9Gzam_@?u?vduUA(=55y?@xVsfTUx2gM?JDTAFyU=8_m^=*D878f(1UK6N z*pcy-P=AqIn|zIE*Ne0Ks*hO9UN7q(ZHdZlo<%5*m=3mcn+Ya1aKfYH%9A31Jy5A8 z>92m?0r#-pZ&g1{AEJ>Rqgauaxy$)9!(ddVb-6!EQR)J5Fr=*N^4PGmfGK#C2oW)0 zx&9-2As%(hqSXbXV0bm>Z)>hU`}7ypp$_+;&vEZR+b0#)8W%B(Sdl{WIHb2Cyz{jj zk>8K+0{i*kz_S#Utd(E;Ld0(uyqG8clJP3Fm!hoy2=^{L2^#iZc#wFXkLr!%$%V`Y z$mYE%xIC*$8`Ma9IZsu#6qeK6UhHQTh`1jag9vWRr*<5t6ZUO!J|mJZRkHF&jqYRn z;AX|lsm4Ma9NMfQ8Z&cm9eKc)TpimB&*BDtTsl~}yc>45o#|Z3XlKIc{!1Ed4;6jf zBP;CVnCbMk*gN#@BcoyvB#=^SRbw81xwC2k{gzDx;+7t6DjN;+UVLIs#TpW8D^rXY zQ&l-+4Vm9Yf_k?&07iW`eVt1Pz$#Yp_m%anSlPs~hFV`^bF7I#M!I*wsCO@N%AI0|{BN!4iZMGXC;4FXEerIZ?uM%C zNDLY%U*-+3j!6ifxHp=sYubSqE73w+? z#I6-1TbgbmglGH+C2-j~@0J#e#?<8lo>IP+J?4CC+kF^ZSjmPG4!m~21l#WYI;UxA&WIk|?;YkyCs@qOt{b}Kj@Eh6-Mpv@egbL5N zti2?3{}wSd;pCh2p?7%6rxktl8S*q+S_Knnb#)73K=uQ3-ar)5?#ANO0J_QK!*myB z5)}n2K|Obtze`G{EG7BlKI8bbu6y}w;AjdSgnF-2FrUZoZYjZi95W6!9=8NcWqzu| zgAl!knc(&hMOh;sQn)!qQ)B3*`!9l&XPpALp4^wZ5vcW}`)H%*SjbdmTIS;_f#nEc z)n{^v1sjn3ZA8Q=E~N7LpyDgtkA{4^2|NYRPx0fD?Wq*V)jzx{F1rUGz%Kp0dVb7T z6y}AH-4B3Y;3N<{fOTlaqaM74p>>pczr72V61(Nkle=AjftM|zh;C3XXwSPl z=mgf`^zdP_>RMHFz!6>-#IhVksoM(DX)_{zWFTqM!B{P?3M)B zD1p_NP|TRC_DN$t%~={Uw;&liN(Rqd3P|r)|9~O&_$MP}-=G)@r7Z=Te(UqFFxLb!GdbkCE!6hVv4^@q9nj-l56gq*NQ=)H{E8ob^ItAWgYf zAot1qe@KcGq0i(#S>@6HvdJelSPp$ zDxIgzJ6OgBZ_)xJ)TTHWPyrYqt05`zS|-N1qjb}U6%`4SifnwFM3)%47fmm_g=!e^ zk%!sqoPRS6`W?`I!T-AA%NaHNO}?Ney2+Zbw1EI^e55*Ev+uRn%aiaAb6fP*fj!QQ z|F}z&Rf$}+{w=z$7+5{t7=xzs4bR`Qz|EG&fjI9i{S&7)vLU*LbHRhK;&;#ki&N{( zIWoqiCPpGwC5<0*JVMhD>vh_y{c$pV+fLgM?XXg{b+>EI89nWV0Y69jgjYMIu$ z%P1(uH)+GCWFOpl9vOW`o@@8gd#RT}>lT{WP)iIfB+vMLf7wm1qRvep|BSm-GYR|= zS!}ixJ+St2(bV&8Ryb><_!8NrssK)D=~W__bzrbUh&A_mMg0Dv^tvdPfc>d*T7|5| zZpwmFAcL=9KZU|$Xh+wiJ60m#M2y$hrhAw?C&V@#>pkp!-e+fXN3*WOdbQp3lu;hT zgjEF?Dg^cPP#rB*b!OmHaYaF!@{ycbtc)67)%fLl{=9gOb7t9aH<$E*KEF)K5b{XF<1}*r64YV ziFyA<(yhffpN%BMq|>SH6K=|};Yu%)OeZ=@ezGlM%Bi=4%vXVC5-mj%j&zowlR>Pp zI4;E!)lA^-Jc5)9oM?~vrrB|sZO6O>SZn^aQW6CkJ}!6%M(=G+p{e$9eZD^yW0_7h z7RFj(@9OwYXT`bt~2E!O7-+SfDYf!!-T+*1heABI!T^nQell8?l zJvYfg_?-vYur&Bk!Rd9`+k)pN0co{s1xE!)<|nu=N|tt>J9*?h?l zT%twM6Sr$7+8er|!Xoil-MJl)i9ELZ98IBhGPcb+X>m!Jf@O!$I&J$S`l7I!JkCek zqr5FS0M_%OqnY9m^gl<3DK<<0gS@nq-mhQ%i2U$n2hOZ7pU@s99l{HCHAOAQ(&T|MaCvwV4&j3Bjjt}x)hwMmP$BgeN2Kt> zdLjD|w$m5UMa&zjgQr6nTt5!qwu4c5g3`-A!`>>U;rtT7olNj&9WfjQeSEUyn zz~M(uw<3_=h*=>qw5aM;O(yhqBgDqx{Ni3LqunNY*)`AX+6_!U0c8L5T5 zI#3SE`}{NS%Vqv|Y8jw!tAGP`H{8<}#&-CABJ3NHaTGQ?@!mE}a)uPa7uJIzoOBo^ zSNl(J;6|L%@7q?B*LNA@=PMd^<`}0SHA_s7%{sq$hdy<_``iW)sVQmPYGK4Sq6w%xh z!XHWrCj*(@i1-0MTi|LG*y}I%a=O6&+c|~4D;M!TYVkl?AP{iPb2}y zvZv-j^K^vd{1AtlqxFu5i89&@2TIXne>aQmTT%L1LdLoED$Zq{=&R&{#9>{ps%$`N zhTJg=c)v3c{##8PMmR3^qf_`&Q$Y0a%AvX}-pQe#yHqW7_qakHoW7%JRv9DD z*DCg(JYB-go>7winJhWPqj~wkh$k3 zV!DEn1$iCSj1RE09#=`}V^LYPd4pNw?e+UH@Ea$1U}sB@-=Rlq3_>#oRv$-0^0L2g zd&=*9eu7>giH*DUFjrKmrzzR}(eH4GcdT-kHR_`h zCDVt@mjbseytL#VoXot*jq0!WUFVX6keYZPT z4LVhGuA(G^yfJK-gVgu06$|{a4>L^d{tW-0KLZ4Y|y<6UmDC zC9O&l2DmULx~OS7iq<}cmC4rB|LjMY(;aGR$`lvEf-&dOn`*;Rc1ToLEZ!JYHpWR% z>f4C(RPkJzkQRD$99H#U1zvXcItE387eP9<&2aOE9sPvd<;uc}{E*eM^?|>6VQd33 z2Z%ud)2X2Rjcfs6f1ttwcWo(Tsq5;V63>3jcPHks={qrktQo_k}q6(IftnG1D4EgrH6 zds}#8KRdJ13E#)Zg$Hj@$FOW^{TP&4h`z2jDy%sG30plp1WuhVu~@sv&KRJ*{D);0 zXuAklKVnMI7qLN+2>G{Ts7V9cCh2{Tv(TtP zQBen>vneTGB{dx14Yzgt@uBeR2f{RRUVX;pl76F3WVJT3kSOxZ!g)F0E`1zGVQ34*dFqUq*UcjoI)!I#PSw-os z_DT|djsawOVE8ZM^b7jx{)jLT@{ibiFpU~HB(hxH>*c!9`0(aM^&Kp9n}cTaJCCvh z$)$7h2xoh#F>9o42z=n#<74DgzT&@CsS?6KN>d9uH$GKT*x5w?!zY@+;W#U&gr9vQ z1d`G{u{(U_iNQ&0ccrip)oKGHL+yTS{em$3#HP~*Ln{{GSP@bniFSEy&F#r=g|tJU z3&QRSLLh~``fZJt`qVu$HCVF!!^#K*l~*+_XxQ-f9=QDX}F**ttS!2~)7X@-m0!&Dfm#e+6Q?TgA^-6StUfxFA92qX7Mbobuk7 zZ#0CTHD(M~6+g6LToEG|ivc`6S`)*^h)kOu$~^Rx!gVY1m!IV~>+ehtg{D7QWrfIp z#%m*?4-Lg>9dllH8t-{>X3b_p+L1Bp2%c{E90M-VRUeB7hw6nE89Dn7jt0-6d%jpE zqEg3U2w2>zpf&TQ!BkNTRwn!vC8wB4e_bz&(tOO@J@zaEjGLdzOnBqFQr6+C|9-oi zC|&hhL-Vp>ustL6lzYl&34oV;0_%p1?davfluSkH;OUP;7CiVkOJ!s}Yx5_pg;yIX z1uJydS39Tj86_Dpsm1AG)3w1=5rY@THX{b&pP%#wYtg%^jip#3dpPt6P|#8Yk-Kk~m5g7V8~ z-6GY)P(SZ2>6wAoHsxv)!Mj6l5X5i75Nwl10s$Ege~I@@m68(R?ma)`LaQU&72$*u zz5e=Zw5T^LNh#m`jIzkGr_!~=y0kdi$w$;v{zHeAe0ch(d&C_(!EM{A&0#81#_S%n z2yH!2h@!ZYvnv9cl0XV8-$M@@ z>2E%aI&z%%tA#z=Fo+JOLIfz@TM^(`1qXRwtk`+ucCAqsS{+?LZzN6^X*SyvTHsCN4@-i>$HBSn6no-kyO^V z!&bxi_uc7(^xgbKe3!K91~O`7C&s-POG}$ngWl} zm;7-E+0c|v#fnEDGHkuMuJR}87ey~`#zC;*($@1&viCK|i*5X5q<@BV_)U1tMPVY% zc0=3w19pCgu0ujJu5T(vO2SWSdv??&4IYTt2HZ(nGGkZ%yR@JGVCJThR@fBp4$`Jo zte&5yn%RHB33wBp5t(thqH?N2NUj8FVzVHVF^69HkIuaVKAEnZyFbI&$r(3nWAi86 zmwY9sWX%VWv{iUTq4@Gcr9Lsizv|;lpw#Oarb_`qQby;qWipM0Kv>}_UBy>VpT8H` zb;Yz*M|W%)H2amK#r-JNRE4)OXmra_DuiC z_)zky2i3a^PQ9^F6bb}Qolf=P8JN2M8N#{Ljq96?hUz&7X4P!8a&JCEspTW(&+R0E zB&M=}Z5coN6JjQjYMVujoz)X`U^ zdbg*c!a@*@8696PuQYh zIYze&uj4ifB#ttuuYOguV^5TNy>PG7Z#?wF%ir_l67e-8J+ZXp#~PxhdOjlLVe}t4 zJIRa)a#M2-;)#*7T^3h%3MI1LauKDfU9qHv*LlHbE`&(f6a|fJcZGY7(?mS&S)CFeB(ci_$?G3jR(%oB+j4_` zpV=@V%gEtq$u(ih(u0DV-6q%yAfw(cFAP2Dc1o8#Q|GyFSo7sNkBd(Npl!?>B!BQ9 zbACEapw@&3?4WNjS9D-&C> zjKLe}vm=Qiu(mY__O4D~#nd&-VWVr=KO@W}egK!1B7ms8t zgx*VwAeYpydtQLbv$2g00{&dTBh7h);~ODWkmxg8v7sk%P4xm1T9K%)v5Py249QSk zmVtuXjn6zEgc?`euD>)GZ1!v?uE(8Zfs)~qtbk#XV2k$N-LS3L-nIHu{^uXEWB#y^ z*F9uxkG5P>gyY3|0F90d)X2M`reBX%*9jK{$}yDmS~s1w?nri5yuAO?8Xm}w^@ep? z5aD`xPy|x=-))%L|JMJL8BV`fQDubR*YAqf!=Za)F1@J#to^(*_hbRzxv{(Ab!-M|+N1}zyea)(M$yp_-KQuHt#Gt4JsfrjhI=#!9@Y_j z%_#44{5|G=c$*AITnbb7Pt(;^#dQ%dyo^GN7#SwK!gDYVK~a99lUwGAO>EfzRldO# zwz~^`C-$@LG{%1qrsFLcKhrKm^=HZemRI9LST9#2%8v;j$W}Gv+K(j+XGs+@P zmlb8blU%6~pG^|qYV$pt$9%It4wDvl&#wbbq2F!#mUE6F2qQIZA?V&p!RB+D8%B)o z)i-ht5QnSaf&dwUC|tUOkDga=c-(7R2{t98{2;YVr@(uS?jicE^9h}Uw^;e_31Py` z!_Iv=jN98qCxgMshfx`yE*#4q=W03qlvjD(eMqypyt~9hW3U43c)UX053r3!UF?Ak z^b`Wpri`moG)UVseFdGRsPH5OsURTJ%5XJot!V!GZmH6-7p8pp^bU7+^W=c;-trW8 z0&QF??pR$c;=Tc3S0-~diM!$G<#3I@0$J{6p-IYmG3_tUMf#;ylbGS{jzO?vgP~F~ z3b(@R**$&zuEU_kdV1%!itpjI?N0V8id*x&vEKy7N*Hd}blM#AD>Ycv8+;q|eotbfk;;$-rS%IrMn zeq6P@nrk5=3q-Z1sLhws9+V0Hq@o8Tjb((Vf2;Dvz|xex{_JaNtzukfy0y4}4u652 zbDJBAM~N2G1O7`(;cuChI~kDpJw|Y9k#zmmvxs@6wW2kd(A%{QiJulF;f2EZGD!O z%1c|Ce>S-uq9fJe=y8^|i4)ecd*Ly-X|*&I_svL=dCo!Ve9783w7ddh|5*ht8<-oa z_sF3gpzL_MRSz@?-_lr)So)R2zq6yEn4h}`0+19~MCFC{)y(t~Bi;-mj+M7ZyWPlk zI$4+N@Z(#m$C||xK>R1>W$k7Y@H(s=Y?qDNew?a1XQ&!ysS^Dwo7NGJ{PIDuyp{B@ z*a6ASwfK_SNpQJCsMQ}K=R17;D}z4`Ct1NO8@j$KWp~IQRmwGK$q#Eq2IsKDR=M|Lnwci}X<1yIm&wpmTjRZ9v1ebwu_) zzjD3CMssGFd?)O&tWY50(@zezuxH_8@Z0BKi?6-NP`v^^x+~_`UL&4O|88XbS_-jK zenKf%EE%a+Gs>7Ru!J7&w!MJf5;4FdNWk!4Z@0=NiDiKk^{P#d|K1_N_>Vm0uycO z>vtdMqOij1zWw?u;Y+I+khtvzB_O#8-*dJP;}?F!l$6W%3RsXX%;t_Ig|yB#EOOu7 z^=CJa<)nZbc~kYXZmB;-4-!ZF%OIBEXs*Zz}%nt7KeUi*j~ z9vU{oHJSkFuHbBh#e_+68193(E|9#M{-`|Spwu_Rx9`sUe&xM?ywo4Y2V z-AN1h>Y zpK!mtfg$D9XX~{)q{0O?cKi(Q8{Ha=ryXxo0GI<;k7(3*s$=nL(YvDx(kdxbCmot+ z@bs<|{5QNDcBV{Wz!=4@gr8x2X8*l@xx&_rT*XBrnWSMnVNH9a>hZBGCwctBU*}3A za89X?*3p%O^pcKBUy%p?`me~(6LcBbtKa0lk{p+8B|IMvH^FPgg&%wM(YS9tA6P_6 zKNf78#F8eGp14A;)_>xkjg#1hh0=0Xjc=3r6-6lD+cs(!IQnFln`7rde0Tbh8Iest zO>tm)|Hb^vZAB-qoEV<34xC5Ol3Kn&EB>%pi;;0yv_Zi3hF`b$rtF8e*#b_RP>R$U z-dslGNgeOWU-(aC)LoO`#(c>*=ImJomqFFP7rRJ< zSMZH_b!7bVC_$lU%}n7f{+D-tN@OmUC;!2@x-Af_8@_?RIZ1_+?87|+83ZC0oOaNW zPgA6+w?TR&*2tJQBb?6i`*3g@P1~}+Jp}f zA-+hB`;~wQ&Cs~e1$+1f)UfyINF$#NKIgKeJ=R5zQz43VQf}=XImBP^Y}HpgIRiwE zay>9ySGrXtnhh4{a>SPfS=6aD`>JA%Rl?)?VszmA;x**>zVBsGMTaA4-D(+vFSezT zQSt&c9GpA|H%kRMa4cSZHr0Ds{`Hy-@QJpj;eLLkEAlo&Ds8K*_&6Ztx{dAK(L-G7 zFMAgZfqOU!T-<@q~S?b!+Wcf0y+ZN>7Eb+k<Av8FUL5j)7<4QH3Q2#$06Xfiul#1Y({VbV{DpvRf!~lY1{QPf#91sUW zaavOVQ@mDqamCv6bEab8^FsKQFMoV2`2Gs~L`yLpU!tQOuEzSXlt}hRT&M2lu9`?E z5Yk-8Mz*drHQSdZi2c!3>UX*`=4V4tFl?7Atd$tP+$5=zXh4FJAZqXhq9LM7X0*Qp z`tIX5HFZC_D?J^4)is3b&*K+)JsW@^0z6q)=~LLD*1V$y8Ech99tgQNugtlW#K|X5 zF0M?n_Dg)08#i2a&Q+RPZh*2de`4gUZi?B%n>(jPMO869^y0z?#j8)5_n_*lg8 zu+MqfHcep)__~Lmb)z%-r}6WrAu`y5K7gNr=Q`|tkttQ42aXI5BOsW3p1|*|v=Dxb zQYQLp=5iu@guj=wS6NqS#}Xu467!Qb2CgPM(cExqvghI0w_BRk=LozcU!cWVLXbZU z$1PQ{TW$mHxu4CMEDF(g-s6#2yq)X4dKwIhbV-^4+D3AAB}jW zd0E9zu0Z_k%2%gZ@f-OQ$Q7R#RRhB_5g|ZtmenQ^o~A#{JR~ zyFoLbKjMB6PrF~X#p}P4^5Ee4#^vjx?1@qII!K;pC?zR=Z`B#H9`cqF5COO%v$!*< zArU^RZY_}9!^fXaf6Czbkm^WZuy#JNy~(lKspSFdYWA@^bxogqbVWPYe4_AzapRo* zEf%9tI*7j`s@tN_K@JI=rR@8*R}6Gau03HSncCx=R^T@Lm^={vYTvYM+SIR+)Ygf7 zRe-_8WFcILl6>GhXlQ|lfRFKuQSl4s@pFad<{N;DDA(ez8s_Kk{X&TJI>rwa1lci! z^B~R}rD&#)NH2Lqsn_e31i#rUFEwzs!Tla!p6&6V}v zHuxPwI4AsF&!lAZjrdt5@BqK5Dn0hHP}@(GO7>J7e{U&(>M)u-co2&EFz9dwzZm3* zxsKP}?;!;|!w(U?sK>@7zrpy1vU3a^EaFA}*blNa#3dP2AOHzH5J@haJIUoEe)F6V zl=;=;M_cz_KiI?10qp#*%{K;D6w_+mavastRA8t_yqUiGJf`)8KVyk z@s>Uxe4Apjz;{|j@MHe8Sj(+Hl9)?P^y5Bw4 zJ~irL3_ku<_e1)wh2AclS?|;W8_J!mShW<*F=^|!l#F1LF6{E>!5Fp-XUL*uJ8Ce$ zfxZA>OVOWlzW^i)y~S?%Y?*O(!K!8Kmu4fFF5OaPXW3v7zA$)(|s zwU{cXX4e`ImN5*;tm1bJ;8#mq+6=o%=?g8(RprI!4*9##!AFHbxeno55I`5ZV4S=? zCLpEf@pJyZgZoX-$8-8eCn&&W`*SHqxt#c01AdNRHW_{6`dKxIVz@Pa+IqApD3t+@ z?5f9lMq=~6^1jsx9n9BctaNnd59bB>7Y?mW5g}0nuZx$_dC}2!7qZ! zQ(yRf>hL2WeU3Z{i65qn?eU*%G*N6K9~n2)(8`$MLY^T(ujZu3>hKnd9NlP z5Y#e(^Ai8uDXNpg=ziZDKY6MVVi&t_>UrBA!+Sp;!8yjyGtZ^7 zyR=4LIqn9C2B*hQdy5Kt5OG6Ug+T}Qe=puA9~79gZt_upKj410v%l5=Bbog}Pj>9lvG!2fjj{S8!uk zLb1?V8OP$ zHy(|Gite-^=DZmAKeF^Z7=x2>*zm=AV+76-xs*_z+#wy zvpfWqAY*=!?ylQ)6t3!U<2?M5@$ym`erES@PT$+{$|bf(!(dkYs9fc313wyn35xkK zUL)-O79kV@WP(MZjYc^M)4%r+ED}sPn`hy7IRn3buF{m@W8C_UAlJ-yeBB6*oT5_5zv4^Q(AWGq(;A?Iv;Jlgd^*37&TWkr8=+0f6{Uycr7}5}_Pq zYhEAIWv>son13^Pxx5@d9;nXB0h--rw@53tTFvZ@NV?LyjHJZXN`Qz!q&K3~dL77o zGJM+n*lg>I^jFuRU;nQ9FA~?`{hs^V@NA?|fBtd+YLhjS} z9TW9DeJiwnz&O4TKN}Q6NCKX5Q3MpE-$ZPig4k>i@$9jPt8lVlT1CS*#qaVW>$j9X zkKYnnbGBkuVjV1DbxaFi5Q7dXT|OWFFJzP>gdu-L`R)(r0Hjc8}&yAiG+IV-`N z(04KK^h{g%1Nd2}-Pq@xlt!Zg1G#KF1c@2=fWzyi4$J(ehtB`YpY z;fd2XC9~%%p;|P}rla+ViTT~J-?ZP(Jw4h>e;s}#i~kA@pw%VtYx2TDx+aN43=I6PmK^uR_*r44Z-Vf0HDEuEU+Nxt%8%mLboS(fy3t^( zH0(k$F0hqVM^V56dJ0CS>OPF00l46oub4P91$s4^WsxGSfH%Xh!?x$ouEyW<_$6@` zZ*t%0@fg2_;7J>;TRB-|Cm-$Z*%*t2K!FELi2xvI3i=!Y;t~9$U6($0#czV@S~zN$ zzUc+{@j3i%pt|g16iT@?7ClPAUwoLu-}u$Ec2x;G^7$@(-1KSuDw{;?DvW~P#c!VN z89r!87j9GvQVI5IS-EX0Gzz<_E)nk_3aA?WEC>pPFg{?^Q3)0Z?&FugB;^i%+*v$& zP7(^|Z(8xgx#sT{MW-*j-1ccQ{;tnxSic6JDw{H)Y*oBOeICCvg*|>0QiHx$odmno zjTwBw;`?48Cc(&4x?TbRqYHi~UCV;sQEu>G;3lrg|4VQW;HqRO^j& z7SEIv7q*U{TWvO5h{9RAv5=dV;cq4p+k(s3KZCpB1IoJzc6kwgslacNb_LR(WJFkbfdx7dEMR;KkSVk`e30ly5N*jsJ*FHMsPFb!(o6_5FPH}!i>j$ls+!|fRm}*AgfLbZM$<2gi z-UfY*J&En{iwlD9&tH(#OTFfhrFu2qezyCyh?isq?Gi}2&Eu9*!*3ZR*7`>HIVR}9 zQ3=DZs#d08NO1q`mTm5{b zJ*iHd)&NgueZBPqxoOp~aO}3wIMmqmyt2ScN)&HiCE{4q1&}`{;-DPQJgzIS&*0a| zNc>m_e_9XS%+$^M>a7l^jav1M@Uuy*?dHs4#!t-_c9|KpnzGo%?4;Sl0c?WTtK#hC zv!535vf{Vs@?rd><2OK?+|1QctZa1;h0kfprYGVjMi{IphxnnO1BO0rFz~bnJ4&i5 zg-XD8-LtM3WNFPqQdkCYC6-CNAU^@W;uoiHM_{=e%vE+l2<2eWWLGH-ztjds=Swp2 ztK-lg_YFppq@S2aYCYHTA%dI)SkW|5RSLjCzbawygxyn(gZJ~BVFl;do)rHOnK(}V z@Cd;2NzM3a;>TnBNRGN{RT3^fYx(f`v7K`uh~_SeQvp>1rDG?8c}F5+jwBqTFn~fZ z@Irw>HyKu=@GpJGZ+srV%5B1LGyK@fj^CiqPpdfQ&sq=J0Y9!eh)?$TG4Z3a05a&K zlD*PYK%!k@Lo|mu!D=M{-ZwToB8~!5Jlgms##NF)3-cN37ZK7(_CWQ@N9Om-3ohl?p>%#@-X3ec z$9_|_yzQ|A**sGz%2|-Xxx$q!LX+p`iK8MU_k2Fc5kc}QppGkn6f>?h`e5U=Piuc) zUufC+9sm4&Rem|{=UDmGT~K$D^q@) z$j?ell3>Cjzi+f=%9(UP%tP7BvVLg3?)>Uof8L|=TOy}9;dqP=apyO&zZHmfy0B)JRR%_eNkAlr1*GQbYYKFG$FB(Eu>zg*7uutT-uy-WCxBcIDv~(hVWcF@5KjYD$@slLB$LZ*$ww<4YsLGHj#WZ8R*0%F= zkR*(SS@H|>+jf3-68GW>#-o6E5E2Ic2iwliaT1R&J2ujsA8H^3h&s)`?cFg7fItjI z!P4CS#1_F10UIG!J5zXqhs#33UY{Vp=Y9JZ*;>pH)6U)w@|%_A7BS^O&36Iv>t%@Q z`Z5yQiB(2clHY25`1{rH-`FtnI~4Lmejq>O2l7LHAV1^>@O2l7LHa08+OlJ2-B)4~7%002ovPDHLkV1hRK9ZCQI literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/mainui/max-H.png b/LedOK/ColorDialog/data/images/mainui/max-H.png new file mode 100644 index 0000000000000000000000000000000000000000..d9843212c8b8815cd2162b62730fa509a5a962e7 GIT binary patch literal 1047 zcmaJ=&rj1(9Iv9p5Qq^C0vDTdP!hMUgBI4TEMwhZ;>fa1!D!;T_Q5K&uWKKy;6*Ve z8Za3A2QVJsWIX5vV~`jQnwS`l#DfPlMvcFs2MuPvj%|2wHf`Vcy?j2O@6UHVKG@e# z*IGvqL_@S+OyIQ%f7HHO{6BlX{SsbUPZl|Cb6)Wl;p@`L#nR8ywzUB$6|a`w~(aEASwzJR&cAT!h0C5m*LpnFvE5+ zOqlIvyG5}xh)pK!3w4LeToK9>8qiUhtL$(?Rk_Y6Xa@Ey0#ls?O2mX3SxlK%tHSI>2b`;*y2rP@PUq}-Na+vboHWzuf%Lr45sYO%vPZg zsBsYoYi>MVUb|B}-|D~cWqIw%%XAaEy!h%~VSW8gePd(e9(L9KI&*tz>6Y|+<G-?C u#>R>CuR}+lz4)Ym^v&n)KZsgacI~bw4x9nc^SRAO&Q*6t(Jf>%ud literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/mainui/max.png b/LedOK/ColorDialog/data/images/mainui/max.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7400e3cff0ec415788a4dffaa85e5696e52c9d GIT binary patch literal 1078 zcmaJ=T};zZ7%d^0O2m+ufIwnu@j()|wi_#3voT@aWXi}gmO$bUbnOKyw70ew*I`VE z4;qaqyb(0|Kum}a`euxh2<`==MoiQP{~m}wi!nx`M!X#x_~2~X-k+RvzVCkDxfc?h z2P-S;DhPt8jI|3%JXYh6+UmgnBfX7dc&J5@9@GWQqj^)MJz z+D8r0HQJeyMu#N7Oodv=fW>106(Etc)M3r!tss@xo3W*t)S{SvH%R_6p*6^RLT62 zd8KqNTuHqGS1z4Pb4f0ZlcDX#{?+K>7Iu$4-LNfQY#1MC*zE?k_4Lue4tynU#e~+B z^(OsmZ7o#pBzBgM&(AK*IIh$MPOQu>em{TqWPI}Ngt_PGQf~g*d2j9I eyPTpi2gb^XDc$G{HEvt7Z*nZsDco-BJNpN|!Dcc5 literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/mainui/min-H.png b/LedOK/ColorDialog/data/images/mainui/min-H.png new file mode 100644 index 0000000000000000000000000000000000000000..2d190d575bd343350a2197c26b2b73a83f329ca3 GIT binary patch literal 2841 zcmV+!3+D8RP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z07gkfK~#9!V*LOAKLafQ69bLFsKKKKj~YB`@TkF~29Fv%SPf=D=G?val;lQ+vXV3- rHgU$$2Fs|yqXy#!00000|NjF3-+c-{joDiL00000NkvXXu0mjf%lKwx literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/images/mainui/min.png b/LedOK/ColorDialog/data/images/mainui/min.png new file mode 100644 index 0000000000000000000000000000000000000000..a2374b34b00cd98ad50951b628032ecd53ff85c4 GIT binary patch literal 2851 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 literal 0 HcmV?d00001 diff --git a/LedOK/ColorDialog/data/ui.png b/LedOK/ColorDialog/data/ui.png new file mode 100644 index 0000000000000000000000000000000000000000..9f89faae764759ef8140bbe054558b107be4b7df GIT binary patch literal 66679 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%0AmQJJMiFw6OP6%^zscsms%>x;yIlISmMu-$ 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 literal 0 HcmV?d00001 diff --git a/LedOK/JQLibrary/JQLibrary.pri b/LedOK/JQLibrary/JQLibrary.pri new file mode 100644 index 0000000..88a62f2 --- /dev/null +++ b/LedOK/JQLibrary/JQLibrary.pri @@ -0,0 +1,216 @@ +# +# This file is part of JQLibrary +# +# Copyright: Jason +# +# Contact email: 188080501@qq.com +# +# GNU Lesser General Public License Usage +# Alternatively, this file may be used under the terms of the GNU Lesser +# General Public License version 2.1 or version 3 as published by the Free +# Software Foundation and appearing in the file LICENSE.LGPLv21 and +# LICENSE.LGPLv3 included in the packaging of this file. Please review the +# following information to ensure the GNU Lesser General Public License +# requirements will be met: https://www.gnu.org/licenses/lgpl.html and +# http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +# + +QT *= core gui + +CONFIG *= c++11 + +INCLUDEPATH *= \ + $$PWD/include/ + +exists( $$PWD/src/JQBarcode.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQBarcode.h + + SOURCES *= $$PWD/src/JQBarcode.cpp + } +} + +contains( QT, bluetooth ) : exists( $$PWD/src/JQBluetooth.cpp ) { + + mac | ios { + DEFINES += JQBLUETOOTH_UUIDMODE + } + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQBluetooth.h + + SOURCES *= $$PWD/src/JQBluetooth.cpp + } +} + +exists( $$PWD/src/JQChecksum.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQChecksum.h + + SOURCES *= $$PWD/src/JQChecksum.cpp + } +} + +exists( $$PWD/src/JQExcel.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQExcel.h + + SOURCES *= $$PWD/src/JQExcel.cpp + } +} + +exists( $$PWD/src/JQFile.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQFile.h + + SOURCES *= $$PWD/src/JQFile.cpp + } +} + +unix | linux | mingw { + + exists( $$PWD/src/JQFilePack.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQFilePack.h + + SOURCES *= $$PWD/src/JQFilePack.cpp + } + } +} + +exists( $$PWD/src/JQFoundation.cpp ) { + + DEFINES += JQFOUNDATION_LIB + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQFoundation.h + + HEADERS *= $$PWD/include/jqdeclare.hpp + + SOURCES *= $$PWD/src/JQFoundation.cpp + } +} + +exists( $$PWD/src/jqgpio.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/jqgpio.h + + SOURCES *= $$PWD/src/jqgpio.cpp + } +} + +contains( QT, network ) : contains( QT, concurrent ) : exists( $$PWD/src/JQHttpServer.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQHttpServer.h + + SOURCES *= $$PWD/src/JQHttpServer.cpp + } +} + +ios : exists( $$PWD/src/JQiOS.cpp ) { + + LIBS *= -framework Foundation -framework UIKit + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQiOS.h + + OBJECTIVE_SOURCES *= $$PWD/src/JQiOS.mm + } +} + +exists( $$PWD/src/JQLanguage.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQLanguage.h + + SOURCES *= $$PWD/src/JQLanguage.cpp + } +} + +contains( QT, network ) : exists( $$PWD/src/JQNet.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQNet.h + + SOURCES *= $$PWD/src/JQNet.cpp + } +} + +contains( QT, serialport ) : exists( $$PWD/src/JQSerialPort.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQSerialPort.h + + SOURCES *= $$PWD/src/JQSerialPort.cpp + } +} + +exists( $$PWD/src/JQSettings.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQSettings.h + + SOURCES *= $$PWD/src/JQSettings.cpp + } +} + +exists( $$PWD/src/JQSms.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQSms.h + + SOURCES *= $$PWD/src/JQSms.cpp + } +} + +contains( QT, network ) : exists( $$PWD/src/JQSystemFlag.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQSystemFlag.h + + SOURCES *= $$PWD/src/JQSystemFlag.cpp + } +} + +exists( $$PWD/src/jqthread.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/jqthread.h + + SOURCES *= $$PWD/src/jqthread.cpp + } +} + +contains( QT, webenginewidgets ) : exists( $$PWD/src/JQWebEngine.cpp ) { + + !contains( DEFINES, JQLIBRARY_EXPORT_ENABLE ) | contains( DEFINES, JQLIBRARY_EXPORT_MODE ) { + + HEADERS *= $$PWD/include/JQWebEngine.h + + SOURCES *= $$PWD/src/JQWebEngine.cpp + } +} diff --git a/LedOK/JQLibrary/include/JQDeclare b/LedOK/JQLibrary/include/JQDeclare new file mode 100644 index 0000000..a037dee --- /dev/null +++ b/LedOK/JQLibrary/include/JQDeclare @@ -0,0 +1 @@ +#include "jqdeclare.hpp" diff --git a/LedOK/JQLibrary/include/JQHttpServer.h b/LedOK/JQLibrary/include/JQHttpServer.h new file mode 100644 index 0000000..a858287 --- /dev/null +++ b/LedOK/JQLibrary/include/JQHttpServer.h @@ -0,0 +1,282 @@ +/* + This file is part of JQLibrary + + Copyright: Jason + + Contact email: 188080501@qq.com + + GNU Lesser General Public License Usage + Alternatively, this file may be used under the terms of the GNU Lesser + General Public License version 2.1 or version 3 as published by the Free + Software Foundation and appearing in the file LICENSE.LGPLv21 and + LICENSE.LGPLv3 included in the packaging of this file. Please review the + following information to ensure the GNU Lesser General Public License + requirements will be met: https://www.gnu.org/licenses/lgpl.html and + http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +*/ + +#ifndef JQHTTPSERVER_H_ +#define JQHTTPSERVER_H_ + +#ifndef QT_NETWORK_LIB +# error("Please add network in pro file") +#endif + +#ifndef QT_CONCURRENT_LIB +# error("Please add concurrent in pro file") +#endif + +// C++ lib import +#include + +// Qt lib import +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// JQLibrary lib import +#include + +class QIODevice; +class QThreadPool; +class QHostAddress; +class QTimer; +class QImage; +class QTcpServer; +class QLocalServer; +class QSslCertificate; +class QSslKey; +class QSslConfiguration; + +namespace JQHttpServer +{ + +class JQLIBRARY_EXPORT Session: public QObject +{ + Q_OBJECT + Q_DISABLE_COPY( Session ) + +public: + Session( const QPointer< QIODevice > &tcpSocket ); + + ~Session(); + + inline void setHandleAcceptedCallback(const std::function< void(const QPointer< Session > &) > &callback) { handleAcceptedCallback_ = callback; } + + QString requestSource() const; + + QString requestMethod() const; + + QString requestUrl() const; + + QString requestCrlf() const; + + QMap< QString, QString > requestHeader() const; + + QByteArray requestBody() const; + + QString requestUrlPath() const; + + QStringList requestUrlPathSplitToList() const; + + QMap< QString, QString > requestUrlQuery() const; + +public slots: + void replyText(const QString &replyData, const int &httpStatusCode = 200); + + void replyRedirects(const QUrl &targetUrl, const int &httpStatusCode = 200); + + void replyJsonObject(const QJsonObject &jsonObject, const int &httpStatusCode = 200); + + void replyJsonArray(const QJsonArray &jsonArray, const int &httpStatusCode = 200); + + void replyFile(const QString &filePath, const int &httpStatusCode = 200); + + void replyFile(const QString &fileName, const QByteArray &fileData, const int &httpStatusCode = 200); + + void replyImage(const QImage &image, const int &httpStatusCode = 200); + + void replyImage(const QString &imageFilePath, const int &httpStatusCode = 200); + + void replyBytes(const QByteArray &bytes, const int &httpStatusCode = 200); + + void replyOptions(); + +private: + void inspectionBufferSetup1(); + + void inspectionBufferSetup2(); + +private: + QPointer< QIODevice > ioDevice_; + std::function< void(const QPointer< Session > &) > handleAcceptedCallback_; + QSharedPointer< QTimer > timerForClose_; + + QByteArray buffer_; + + QString requestSource_; + QString requestMethod_; + QString requestUrl_; + QString requestCrlf_; + + QMap< QString, QString > requestHeader_; + bool headerAcceptedFinish_ = false; + qint64 contentLength_ = -1; + bool alreadyReply_ = false; + + QByteArray requestBody_; + + qint64 waitWrittenByteCount_ = 0; + QSharedPointer< QIODevice > ioDeviceForReply_; +}; + +class JQLIBRARY_EXPORT AbstractManage: public QObject +{ + Q_OBJECT + Q_DISABLE_COPY( AbstractManage ) + +public: + AbstractManage(const int &handleMaxThreadCount); + + virtual ~AbstractManage(); + + inline void setHttpAcceptedCallback(const std::function< void(const QPointer< Session > &session) > &httpAcceptedCallback) { httpAcceptedCallback_ = httpAcceptedCallback; } + + inline QSharedPointer< QThreadPool > handleThreadPool() { return handleThreadPool_; } + + inline QSharedPointer< QThreadPool > serverThreadPool() { return serverThreadPool_; } + + virtual bool isRunning() = 0; + +protected Q_SLOTS: + bool begin(); + + void close(); + +protected: + virtual bool onStart() = 0; + + virtual void onFinish() = 0; + + bool startServerThread(); + + void stopHandleThread(); + + void stopServerThread(); + + void newSession(const QPointer< Session > &session); + + void handleAccepted(const QPointer< Session > &session); + +signals: + void readyToClose(); + +protected: + QSharedPointer< QThreadPool > serverThreadPool_; + QSharedPointer< QThreadPool > handleThreadPool_; + + QMutex mutex_; + + std::function< void(const QPointer< Session > &session) > httpAcceptedCallback_; + + QSet< Session * > availableSessions_; +}; + +class JQLIBRARY_EXPORT TcpServerManage: public AbstractManage +{ + Q_OBJECT + Q_DISABLE_COPY( TcpServerManage ) + +public: + TcpServerManage(const int &handleMaxThreadCount = 2); + + ~TcpServerManage(); + + bool listen(const QHostAddress &address, const quint16 &port); + +private: + bool isRunning(); + + bool onStart(); + + void onFinish(); + +private: + QPointer< QTcpServer > tcpServer_; + + QHostAddress listenAddress_ = QHostAddress::Any; + quint16 listenPort_ = 0; +}; + +#ifndef QT_NO_SSL +class SslServerHelper; + +class JQLIBRARY_EXPORT SslServerManage: public AbstractManage +{ + Q_OBJECT + Q_DISABLE_COPY( SslServerManage ) + +public: + SslServerManage(const int &handleMaxThreadCount = 2); + + ~SslServerManage(); + + bool listen( + const QHostAddress &address, + const quint16 &port, + const QString &crtFilePath, + const QString &keyFilePath, + const QList< QPair< QString, bool > > &caFileList = { } // [ { filePath, isPem } ] + ); + +private: + bool isRunning(); + + bool onStart(); + + void onFinish(); + +private: + QPointer< SslServerHelper > tcpServer_; + + QHostAddress listenAddress_ = QHostAddress::Any; + quint16 listenPort_ = 0; + + QSharedPointer< QSslConfiguration > sslConfiguration_; +}; +#endif + +class JQLIBRARY_EXPORT LocalServerManage: public AbstractManage +{ + Q_OBJECT + Q_DISABLE_COPY( LocalServerManage ) + +public: + LocalServerManage(const int &handleMaxThreadCount); + + ~LocalServerManage(); + + bool listen(const QString &name); + +private: + bool isRunning(); + + bool onStart(); + + void onFinish(); + +private: + QPointer< QLocalServer > localServer_; + + QString listenName_; +}; + +} + +#endif//JQHTTPSERVER_H_ diff --git a/LedOK/JQLibrary/include/JQNet.h b/LedOK/JQLibrary/include/JQNet.h new file mode 100644 index 0000000..8063f65 --- /dev/null +++ b/LedOK/JQLibrary/include/JQNet.h @@ -0,0 +1,198 @@ +/* + This file is part of JQLibrary + + Copyright: Jason + + Contact email: 188080501@qq.com + + GNU Lesser General Public License Usage + Alternatively, this file may be used under the terms of the GNU Lesser + General Public License version 2.1 or version 3 as published by the Free + Software Foundation and appearing in the file LICENSE.LGPLv21 and + LICENSE.LGPLv3 included in the packaging of this file. Please review the + following information to ensure the GNU Lesser General Public License + requirements will be met: https://www.gnu.org/licenses/lgpl.html and + http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +*/ + +#ifndef JQLIBRARY_INCLUDE_JQNET_H_ +#define JQLIBRARY_INCLUDE_JQNET_H_ + +#ifndef QT_NETWORK_LIB +# error("Please add network in pro file") +#endif + +// C++ lib import +#include + +// Qt lib import +#include +#include +#include +#include +#include +#include + +// JQLibrary lib import +#include + +namespace JQNet +{ + +QNetworkAddressEntry getNetworkAddressEntry(); + +QPair< QNetworkAddressEntry, QNetworkInterface > getNetworkAddressEntryWithNetworkInterface(const bool &ridVm = true); + +QString getHostName(); + +bool tcpReachable(const QString &hostName, const quint16 &port, const int &timeout = 5000); + +#ifdef JQFOUNDATION_LIB +bool pingIp(const QHostAddress &hostAddress); +#endif + +class JQLIBRARY_EXPORT HTTP +{ + Q_DISABLE_COPY( HTTP ) + +public: + HTTP() = default; + + ~HTTP() = default; + +public: + inline QNetworkAccessManager &manage() { return manage_; } + + + bool get( + const QNetworkRequest &request, + QByteArray &target, + const int &timeout = 30 * 1000 + ); + + void get( + const QNetworkRequest &request, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) > &onFinished, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &code, const QByteArray &data) > &onError, + const int &timeout = 30 * 1000 + ); + + bool deleteResource( + const QNetworkRequest &request, + QByteArray &target, + const int &timeout = 30 * 1000 + ); + + void deleteResource( + const QNetworkRequest &request, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) > &onFinished, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &code, const QByteArray &data) > &onError, + const int &timeout = 30 * 1000 + ); + + bool post( + const QNetworkRequest &request, + const QByteArray &body, + QList< QNetworkReply::RawHeaderPair > &targetRawHeaderPairs, + QByteArray &target, + const int &timeout = 30 * 1000 + ); + + bool post( + const QNetworkRequest &request, + const QSharedPointer< QHttpMultiPart > &multiPart, + QByteArray &target, + const int &timeout = 30 * 1000 + ); + + void post( + const QNetworkRequest &request, + const QByteArray &body, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) > &onFinished, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &code, const QByteArray &data) > &onError, + const int &timeout = 30 * 1000 + ); + + bool put( + const QNetworkRequest &request, + const QByteArray &body, + QByteArray &target, + const int &timeout = 30 * 1000 + ); + + bool put( + const QNetworkRequest &request, + const QSharedPointer< QHttpMultiPart > &multiPart, + QByteArray &target, + const int &timeout = 30 * 1000 + ); + + void put( + const QNetworkRequest &request, + const QByteArray &body, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) > &onFinished, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &code, const QByteArray &data) > &onError, + const int &timeout = 30 * 1000 + ); + +#if !( defined Q_OS_LINUX ) && ( QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) ) + bool patch( + const QNetworkRequest &request, + const QByteArray &body, + QByteArray &target, + const int &timeout = 30 * 1000 + ); + + void patch( + const QNetworkRequest &request, + const QByteArray &body, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) > &onFinished, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &code, const QByteArray &data) > &onError, + const int &timeout = 30 * 1000 + ); +#endif + + + static QPair< bool, QByteArray > get(const QString &url, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > get(const QNetworkRequest &request, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > deleteResource(const QString &url, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > deleteResource(const QNetworkRequest &request, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > post(const QString &url, const QByteArray &body, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > post(const QNetworkRequest &request, const QByteArray &body, const int &timeout = 30 * 1000); + + static QPair< bool, QPair< QList< QNetworkReply::RawHeaderPair >, QByteArray > > post2(const QNetworkRequest &request, const QByteArray &body, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > post(const QNetworkRequest &request, const QSharedPointer< QHttpMultiPart > &multiPart, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > put(const QString &url, const QByteArray &body, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > put(const QNetworkRequest &request, const QByteArray &body, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > put(const QNetworkRequest &request, const QSharedPointer< QHttpMultiPart > &multiPart, const int &timeout = 30 * 1000); + +#if !( defined Q_OS_LINUX ) && ( QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) ) + static QPair< bool, QByteArray > patch(const QString &url, const QByteArray &body, const int &timeout = 30 * 1000); + + static QPair< bool, QByteArray > patch(const QNetworkRequest &request, const QByteArray &body, const int &timeout = 30 * 1000); +#endif + +private: + void handle( + QNetworkReply *reply, const int &timeout, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) > &onFinished, + const std::function< void(const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &code, const QByteArray &data) > &onError, + const std::function< void() > &onTimeout + ); + +private: + QNetworkAccessManager manage_; +}; + +} + +#endif//JQLIBRARY_INCLUDE_JQNET_H_ diff --git a/LedOK/JQLibrary/include/jqdeclare.hpp b/LedOK/JQLibrary/include/jqdeclare.hpp new file mode 100644 index 0000000..5b1b6a9 --- /dev/null +++ b/LedOK/JQLibrary/include/jqdeclare.hpp @@ -0,0 +1,119 @@ +/* + This file is part of JQLibrary + + Copyright: Jason + + Contact email: 188080501@qq.com + + GNU Lesser General Public License Usage + Alternatively, this file may be used under the terms of the GNU Lesser + General Public License version 2.1 or version 3 as published by the Free + Software Foundation and appearing in the file LICENSE.LGPLv21 and + LICENSE.LGPLv3 included in the packaging of this file. Please review the + following information to ensure the GNU Lesser General Public License + requirements will be met: https://www.gnu.org/licenses/lgpl.html and + http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +*/ + +#ifndef JQLIBRARY_INCLUDE_JQDECLARE_HPP_ +#define JQLIBRARY_INCLUDE_JQDECLARE_HPP_ + +// Macro define +#define JQPROPERTYDECLARE(Type, name, setName, ...) \ + private: \ + Type name ## _ __VA_ARGS__; \ + public: \ + inline const Type &name() const { return name ## _; } \ + inline void setName(const Type &name) { name ## _ = name; } \ + private: + +#define JQPROPERTYDECLAREWITHSLOT(Type, name, setName, ...) \ + private: \ + Type name ## _ __VA_ARGS__; \ + public Q_SLOTS: \ + Type name() const { return name ## _; } \ + void setName(const Type &name) { name ## _ = name; } \ + private: + +#define JQPTRPROPERTYDECLARE(Type, name, setName, ...) \ + private: \ + Type *name ## _ __VA_ARGS__; \ + public: \ + inline const Type *name() const \ + { return name ## _; } \ + inline void setName(const Type &name) \ + { if ( name ## _ ) { delete name ## _; } \ + name ## _ = new Type( name ); } \ + private: + +#define JQ_READ_AND_SET_PROPERTY( Type, name, setName ) \ + public: \ + inline const Type &name() const { return name ## _; } \ + inline void setName(const Type &name) { name ## _ = name; } \ + private: + +#define JQ_STATIC_READ_AND_SET_PROPERTY( Type, name, setName ) \ + public: \ + static inline const Type &name() { return name ## _; } \ + static inline void setName(const Type &name) { name ## _ = name; } \ + private: + +#define JQ_STATIC_SET_PROPERTY( Type, name, setName ) \ + public: \ + static inline void setName(const Type &name) { name ## _ = name; } \ + private: + +#define RUNONOUTRANGEHELPER2( x, y ) x ## y +#define RUNONOUTRANGEHELPER( x, y ) RUNONOUTRANGEHELPER2( x, y ) +#define RUNONOUTRANGE( ... ) \ + auto RUNONOUTRANGEHELPER( runOnOutRangeCallback, __LINE__ ) = __VA_ARGS__; \ + QSharedPointer< int > RUNONOUTRANGEHELPER( runOnOutRange, __LINE__ )( \ + new int, \ + [ RUNONOUTRANGEHELPER( runOnOutRangeCallback, __LINE__ ) ](int *data) \ + { \ + RUNONOUTRANGEHELPER( runOnOutRangeCallback, __LINE__ )(); \ + delete data; \ + } ); \ + if ( RUNONOUTRANGEHELPER( runOnOutRange, __LINE__ ).data() == nullptr ) { exit( -1 ); } + +#define RUNONOUTRANGETIMER( message ) \ + const auto &&runOnOutRangeTimerTime = QDateTime::currentMSecsSinceEpoch(); \ + RUNONOUTRANGE( [ = ]() \ + { \ + qDebug() << message << ( QDateTime::currentMSecsSinceEpoch() - runOnOutRangeTimerTime ); \ + } ) + +#define JQCONST( property ) \ + static_cast< const decltype( property ) >( property ) + +#define JQTICKCOUNTERMESSAGE( message ) \ + { \ + static JQTickCounter tickCounter; \ + tickCounter.tick(); \ + qDebug() << message << tickCounter.tickPerSecond(); \ + } + +#define JQBUILDDATETIMESTRING \ + ( QDateTime( \ + QLocale( QLocale::English ).toDate( QString( __DATE__ ).replace( " ", " 0" ), "MMM dd yyyy"), \ + QTime::fromString( __TIME__, "hh:mm:ss" ) \ + ).toString( "yyyy-MM-dd hh:mm:ss" ).toLatin1().data() ) + +#define JQONLYONCE \ + if ( [](){ static auto flag = true; if ( flag ) { flag = false; return true; } return false; }() ) + +#define JQOSKIPFIRST \ + if ( [](){ static auto flag = true; if ( flag ) { flag = false; return false; } return true; }() ) + +// Export +#ifdef JQLIBRARY_EXPORT_ENABLE +# ifdef JQLIBRARY_EXPORT_MODE +# define JQLIBRARY_EXPORT Q_DECL_EXPORT +# else +# define JQLIBRARY_EXPORT Q_DECL_IMPORT +# endif +#else +# define JQLIBRARY_EXPORT +#endif + +#endif//JQLIBRARY_INCLUDE_JQDECLARE_HPP_ diff --git a/LedOK/JQLibrary/src/JQHttpServer.cpp b/LedOK/JQLibrary/src/JQHttpServer.cpp new file mode 100644 index 0000000..a68b740 --- /dev/null +++ b/LedOK/JQLibrary/src/JQHttpServer.cpp @@ -0,0 +1,1256 @@ +/* + This file is part of JQLibrary + + Copyright: Jason + + Contact email: 188080501@qq.com + + GNU Lesser General Public License Usage + Alternatively, this file may be used under the terms of the GNU Lesser + General Public License version 2.1 or version 3 as published by the Free + Software Foundation and appearing in the file LICENSE.LGPLv21 and + LICENSE.LGPLv3 included in the packaging of this file. Please review the + following information to ensure the GNU Lesser General Public License + requirements will be met: https://www.gnu.org/licenses/lgpl.html and + http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +*/ + +#include "JQHttpServer.h" + +// Qt lib import +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef QT_NO_SSL +# include +# include +# include +# include +#endif + +#define JQHTTPSERVER_SESSION_PROTECTION( functionName, ... ) \ + auto this_ = this; \ + if ( !this_ || ( contentLength_ < -1 ) || ( waitWrittenByteCount_ < -1 ) ) \ + { \ + qDebug() << QStringLiteral( "JQHttpServer::Session::" ) + functionName + ": current session this is null"; \ + return __VA_ARGS__; \ + } + +static QString replyTextFormat( + "HTTP/1.1 %1 OK\r\n" + "Content-Type: %2\r\n" + "Content-Length: %3\r\n" + "Access-Control-Allow-Origin: *\r\n" + "Access-Control-Allow-Headers: Content-Type,X-Requested-With\r\n" + "\r\n" + "%4" + ); + +static QString replyRedirectsFormat( + "HTTP/1.1 %1 OK\r\n" + "Content-Type: %2\r\n" + "Content-Length: %3\r\n" + "Access-Control-Allow-Origin: *\r\n" + "Access-Control-Allow-Headers: Content-Type,X-Requested-With\r\n" + "\r\n" + "%4" + ); + +static QString replyFileFormat( + "HTTP/1.1 %1 OK\r\n" + "Content-Disposition: attachment;filename=%2\r\n" + "Content-Length: %3\r\n" + "Access-Control-Allow-Origin: *\r\n" + "Access-Control-Allow-Headers: Content-Type,X-Requested-With\r\n" + "\r\n" + ); + +static QString replyImageFormat( + "HTTP/1.1 %1\r\n" + "Content-Type: image\r\n" + "Content-Length: %2\r\n" + "Access-Control-Allow-Origin: *\r\n" + "Access-Control-Allow-Headers: Content-Type,X-Requested-With\r\n" + "\r\n" + ); + +static QString replyBytesFormat( + "HTTP/1.1 %1 OK\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Length: %2\r\n" + "Access-Control-Allow-Origin: *\r\n" + "Access-Control-Allow-Headers: Content-Type,X-Requested-With\r\n" + "\r\n" + ); + +static QString replyOptionsFormat( + "HTTP/1.1 200 OK\r\n" + "Allow: OPTIONS, GET, POST, PUT, HEAD\r\n" + "Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, HEAD\r\n" + "Content-Length: 0\r\n" + "Access-Control-Allow-Origin: *\r\n" + "Access-Control-Allow-Headers: Content-Type,X-Requested-With\r\n" + "\r\n" + ); + +// Session +JQHttpServer::Session::Session(const QPointer &tcpSocket): + ioDevice_( tcpSocket ), + timerForClose_( new QTimer ) +{ + timerForClose_->setInterval( 30 * 1000 ); + + if ( qobject_cast< QAbstractSocket * >( tcpSocket ) ) + { + requestSource_ = ( qobject_cast< QAbstractSocket * >( tcpSocket ) )->peerAddress().toString().replace( "::ffff:", "" ); + } + + connect( ioDevice_.data(), &QIODevice::readyRead, [ this ]() + { + if ( this->timerForClose_->isActive() ) + { + timerForClose_->stop(); + } + + const auto &&data = this->ioDevice_->readAll(); +// qDebug() << data; + + this->buffer_.append( data ); + + this->inspectionBufferSetup1(); + + timerForClose_->start(); + } ); + + connect( ioDevice_.data(), &QIODevice::bytesWritten, [ this ](const qint64 &bytes) + { + this->waitWrittenByteCount_ -= bytes; + + if ( this->waitWrittenByteCount_ == 0 ) + { + this->deleteLater(); + return; + } + + if ( !ioDeviceForReply_.isNull() ) + { + if ( ioDeviceForReply_->atEnd() ) + { + ioDeviceForReply_->deleteLater(); + ioDeviceForReply_.clear(); + } + else + { + ioDevice_->write( ioDeviceForReply_->read( 512 * 1024 ) ); + } + } + + if ( this->timerForClose_->isActive() ) + { + timerForClose_->stop(); + } + + timerForClose_->start(); + } ); + + connect( timerForClose_.data(), &QTimer::timeout, this, &QObject::deleteLater ); +} + +JQHttpServer::Session::~Session() +{ + if ( !ioDevice_.isNull() ) + { + delete ioDevice_.data(); + } +} + +QString JQHttpServer::Session::requestSource() const +{ + JQHTTPSERVER_SESSION_PROTECTION( "requestSource", { } ) + + return requestSource_; +} + +QString JQHttpServer::Session::requestMethod() const +{ + JQHTTPSERVER_SESSION_PROTECTION( "requestMethod", { } ) + + return requestMethod_; +} + +QString JQHttpServer::Session::requestUrl() const +{ + JQHTTPSERVER_SESSION_PROTECTION( "requestUrl", { } ) + + return requestUrl_; +} + +QString JQHttpServer::Session::requestCrlf() const +{ + JQHTTPSERVER_SESSION_PROTECTION( "requestCrlf", { } ) + + return requestCrlf_; +} + +QMap< QString, QString > JQHttpServer::Session::requestHeader() const +{ + JQHTTPSERVER_SESSION_PROTECTION( "requestHeader", { } ) + + return requestHeader_; +} + +QByteArray JQHttpServer::Session::requestBody() const +{ + JQHTTPSERVER_SESSION_PROTECTION( "requestBody", { } ) + + return requestBody_; +} + +QString JQHttpServer::Session::requestUrlPath() const +{ + JQHTTPSERVER_SESSION_PROTECTION( "requestUrlPath", { } ) + + QString result; + const auto indexForQueryStart = requestUrl_.indexOf( "?" ); + + if ( indexForQueryStart >= 0 ) + { + result = requestUrl_.mid( 0, indexForQueryStart ); + } + else + { + result = requestUrl_; + } + + if ( result.startsWith( "//" ) ) + { + result = result.mid( 1 ); + } + + if ( result.endsWith( "/" ) ) + { + result = result.mid( 0, result.size() - 1 ); + } + + result.replace( "%5B", "[" ); + result.replace( "%5D", "]" ); + result.replace( "%7B", "{" ); + result.replace( "%7D", "}" ); + result.replace( "%5E", "^" ); + + return result; +} + +QStringList JQHttpServer::Session::requestUrlPathSplitToList() const +{ + auto list = this->requestUrlPath().split( "/" ); + + while ( !list.isEmpty() && list.first().isEmpty() ) + { + list.pop_front(); + } + + while ( !list.isEmpty() && list.last().isEmpty() ) + { + list.pop_back(); + } + + return list; +} + +QMap< QString, QString > JQHttpServer::Session::requestUrlQuery() const +{ + const auto indexForQueryStart = requestUrl_.indexOf( "?" ); + if ( indexForQueryStart < 0 ) { return { }; } + + QMap< QString, QString > result; + + auto lines = QUrl::fromEncoded( requestUrl_.mid( indexForQueryStart + 1 ).toUtf8() ).toString().split( "&" ); + + for ( const auto &line_: lines ) + { + auto line = line_; + line.replace( "%5B", "[" ); + line.replace( "%5D", "]" ); + line.replace( "%7B", "{" ); + line.replace( "%7D", "}" ); + line.replace( "%5E", "^" ); + + auto indexOf = line.indexOf( "=" ); + if ( indexOf > 0 ) + { + result[ line.mid( 0, indexOf ) ] = line.mid( indexOf + 1 ); + } + } + + return result; +} + +void JQHttpServer::Session::replyText(const QString &replyData, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyText" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyText: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyText", Qt::QueuedConnection, Q_ARG( QString, replyData ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyText: error1"; + this->deleteLater(); + return; + } + + const auto &&data = replyTextFormat.arg( + QString::number( httpStatusCode ), + "text;charset=UTF-8", + QString::number( replyData.toUtf8().size() ), + replyData + ).toUtf8(); + + waitWrittenByteCount_ = data.size(); + ioDevice_->write( data ); +} + +void JQHttpServer::Session::replyRedirects(const QUrl &targetUrl, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyRedirects" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyRedirects: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyRedirects", Qt::QueuedConnection, Q_ARG( QUrl, targetUrl ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyRedirects: error1"; + this->deleteLater(); + return; + } + + const auto &&buffer = QString( "\n\n" ).arg( targetUrl.toString() ); + + const auto &&data = replyRedirectsFormat.arg( + QString::number( httpStatusCode ), + "text;charset=UTF-8", + QString::number( buffer.toUtf8().size() ), + buffer + ).toUtf8(); + + waitWrittenByteCount_ = data.size(); + ioDevice_->write( data ); +} + +void JQHttpServer::Session::replyJsonObject(const QJsonObject &jsonObject, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyJsonObject" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyJsonObject: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyJsonObject", Qt::QueuedConnection, Q_ARG( QJsonObject, jsonObject ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyJsonObject: error1"; + this->deleteLater(); + return; + } + + const auto &&data = QJsonDocument( jsonObject ).toJson( QJsonDocument::Compact ); + const auto &&data2 = replyTextFormat.arg( + QString::number( httpStatusCode ), + "application/json;charset=UTF-8", + QString::number( data.size() ), + QString( data ) + ).toUtf8(); + + waitWrittenByteCount_ = data2.size(); + ioDevice_->write( data2 ); +} + +void JQHttpServer::Session::replyJsonArray(const QJsonArray &jsonArray, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyJsonArray" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyJsonArray: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyJsonArray", Qt::QueuedConnection, Q_ARG( QJsonArray, jsonArray ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyJsonArray: error1"; + this->deleteLater(); + return; + } + + const auto &&data = QJsonDocument( jsonArray ).toJson( QJsonDocument::Compact ); + const auto &&data2 = replyTextFormat.arg( + QString::number( httpStatusCode ), + "application/json;charset=UTF-8", + QString::number( data.size() ), + QString( data ) + ).toUtf8(); + + waitWrittenByteCount_ = data2.size(); + ioDevice_->write( data2 ); +} + +void JQHttpServer::Session::replyFile(const QString &filePath, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyFile" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyFile: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyFile", Qt::QueuedConnection, Q_ARG( QString, filePath ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyFile: error1"; + this->deleteLater(); + return; + } + + ioDeviceForReply_.reset( new QFile( filePath ) ); + QPointer< QFile > file = ( qobject_cast< QFile * >( ioDeviceForReply_.data() ) ); + + if ( !file->open( QIODevice::ReadOnly ) ) + { + qDebug() << "JQHttpServer::Session::replyFile: open file error:" << filePath; + ioDeviceForReply_.clear(); + this->deleteLater(); + return; + } + + const auto &&data = replyFileFormat.arg( + QString::number( httpStatusCode ), + QFileInfo( filePath ).fileName(), + QString::number( file->size() ) + ).toUtf8(); + + waitWrittenByteCount_ = data.size() + file->size(); + ioDevice_->write( data ); +} + +void JQHttpServer::Session::replyFile(const QString &fileName, const QByteArray &fileData, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyFile" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyFile: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyFile", Qt::QueuedConnection, Q_ARG( QString, fileName ), Q_ARG( QByteArray, fileData ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyFile: error1"; + this->deleteLater(); + return; + } + + auto buffer = new QBuffer; + buffer->setData( fileData ); + + if ( !buffer->open( QIODevice::ReadWrite ) ) + { + qDebug() << "JQHttpServer::Session::replyFile: open buffer error"; + delete buffer; + this->deleteLater(); + return; + } + + ioDeviceForReply_.reset( buffer ); + ioDeviceForReply_->seek( 0 ); + + const auto &&data = replyFileFormat.arg( + QString::number( httpStatusCode ), + fileName, + QString::number( fileData.size() ) + ).toUtf8(); + + waitWrittenByteCount_ = data.size() + fileData.size(); + ioDevice_->write( data ); +} + +void JQHttpServer::Session::replyImage(const QImage &image, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyImage" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyImage: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyImage", Qt::QueuedConnection, Q_ARG( QImage, image ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyImage: error1"; + this->deleteLater(); + return; + } + + auto buffer = new QBuffer; + + if ( !buffer->open( QIODevice::ReadWrite ) ) + { + qDebug() << "JQHttpServer::Session::replyImage: open buffer error"; + delete buffer; + this->deleteLater(); + return; + } + + if ( !image.save( buffer, "PNG" ) ) + { + qDebug() << "JQHttpServer::Session::replyImage: save image to buffer error"; + delete buffer; + this->deleteLater(); + return; + } + + ioDeviceForReply_.reset( buffer ); + ioDeviceForReply_->seek( 0 ); + + const auto &&data = replyImageFormat.arg( + QString::number( httpStatusCode ), + QString::number( buffer->buffer().size() ) + ).toUtf8(); + + waitWrittenByteCount_ = data.size() + buffer->buffer().size(); + ioDevice_->write( data ); +} + +void JQHttpServer::Session::replyImage(const QString &imageFilePath, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyImage" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyImage: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyImage", Qt::QueuedConnection, Q_ARG( QString, imageFilePath ), Q_ARG( int, httpStatusCode ) ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyImage: error1"; + this->deleteLater(); + return; + } + + + auto buffer = new QFile( imageFilePath ); + + if ( !buffer->open( QIODevice::ReadWrite ) ) + { + qDebug() << "JQHttpServer::Session::replyImage: open buffer error"; + delete buffer; + this->deleteLater(); + return; + } + + ioDeviceForReply_.reset( buffer ); + ioDeviceForReply_->seek( 0 ); + + const auto &&data = replyImageFormat.arg( + QString::number( httpStatusCode ), + QString::number( buffer->size() ) + ).toUtf8(); + + waitWrittenByteCount_ = data.size() + buffer->size(); + ioDevice_->write( data ); +} + +void JQHttpServer::Session::replyBytes(const QByteArray &bytes, const int &httpStatusCode) +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyBytes" ) + + if (QThread::currentThread() != this->thread()) + { + QMetaObject::invokeMethod(this, "replyBytes", Qt::QueuedConnection, Q_ARG(QByteArray, bytes), Q_ARG(int, httpStatusCode)); + return; + } + + if (alreadyReply_) + { + qDebug() << "JQHttpServer::Session::replyBytes: already reply"; + return; + } + alreadyReply_ = true; + + if (ioDevice_.isNull()) + { + qDebug() << "JQHttpServer::Session::replyBytes: error1"; + this->deleteLater(); + return; + } + + auto buffer = new QBuffer; + buffer->setData(bytes); + + if ( !buffer->open( QIODevice::ReadWrite ) ) + { + qDebug() << "JQHttpServer::Session::replyBytes: open buffer error"; + delete buffer; + this->deleteLater(); + return; + } + + ioDeviceForReply_.reset(buffer); + ioDeviceForReply_->seek(0); + + const auto &&data = replyBytesFormat.arg( + QString::number(httpStatusCode), + QString::number(buffer->buffer().size()) + ).toUtf8(); + + waitWrittenByteCount_ = data.size() + buffer->buffer().size(); + ioDevice_->write(data); +} + +void JQHttpServer::Session::replyOptions() +{ + JQHTTPSERVER_SESSION_PROTECTION( "replyOptions" ) + + if ( alreadyReply_ ) + { + qDebug() << "JQHttpServer::Session::replyOptions: already reply"; + return; + } + + if ( QThread::currentThread() != this->thread() ) + { + QMetaObject::invokeMethod( this, "replyOptions", Qt::QueuedConnection ); + return; + } + + alreadyReply_ = true; + + if ( ioDevice_.isNull() ) + { + qDebug() << "JQHttpServer::Session::replyOptions: error1"; + this->deleteLater(); + return; + } + + const auto &&data2 = replyOptionsFormat.toUtf8(); + + waitWrittenByteCount_ = data2.size(); + ioDevice_->write( data2 ); +} + +void JQHttpServer::Session::inspectionBufferSetup1() +{ + if ( !headerAcceptedFinish_ ) + { + forever + { + static QByteArray splitFlag( "\r\n" ); + + auto splitFlagIndex = buffer_.indexOf( splitFlag ); + + // 没有获取到分割标记,意味着数据不全 + if ( splitFlagIndex == -1 ) + { + // 没有获取到 method 但是缓冲区内已经有了数据,这可能是一个无效的连接 + if ( requestMethod_.isEmpty() && ( buffer_.size() > 4 ) ) + { + qDebug() << "JQHttpServer::Session::inspectionBuffer: error0"; + this->deleteLater(); + return; + } + + return; + } + + // 如果未获取到 method 并且已经定位到了分割标记符,那么直接放弃这个连接 + if ( requestMethod_.isEmpty() && ( splitFlagIndex == 0 ) ) + { + qDebug() << "JQHttpServer::Session::inspectionBuffer: error1"; + this->deleteLater(); + return; + } + + // 如果没有获取到 method 则先尝试分析 method + if ( requestMethod_.isEmpty() ) + { + auto requestLineDatas = buffer_.mid( 0, splitFlagIndex ).split( ' ' ); + buffer_.remove( 0, splitFlagIndex + 2 ); + + if ( requestLineDatas.size() != 3 ) + { + qDebug() << "JQHttpServer::Session::inspectionBuffer: error2"; + this->deleteLater(); + return; + } + + requestMethod_ = requestLineDatas.at( 0 ); + requestUrl_ = requestLineDatas.at( 1 ); + requestCrlf_ = requestLineDatas.at( 2 ); + + if ( ( requestMethod_ != "GET" ) && + ( requestMethod_ != "OPTIONS" ) && + ( requestMethod_ != "POST" ) && + ( requestMethod_ != "PUT" ) ) + { + qDebug() << "JQHttpServer::Session::inspectionBuffer: error3:" << requestMethod_; + this->deleteLater(); + return; + } + } + else if ( splitFlagIndex == 0 ) + { + buffer_.remove( 0, 2 ); + +// qDebug() << buffer_; + headerAcceptedFinish_ = true; + + if ( ( requestMethod_.toUpper() == "GET" ) || + ( requestMethod_.toUpper() == "OPTIONS" ) || + ( ( requestMethod_.toUpper() == "POST" ) && ( ( contentLength_ > 0 ) ? ( !buffer_.isEmpty() ) : ( true ) ) ) || + ( ( requestMethod_.toUpper() == "PUT" ) && ( ( contentLength_ > 0 ) ? ( !buffer_.isEmpty() ) : ( true ) ) ) ) + { + this->inspectionBufferSetup2(); + } + } + else + { + auto index = buffer_.indexOf( ':' ); + + if ( index <= 0 ) + { + qDebug() << "JQHttpServer::Session::inspectionBuffer: error4"; + this->deleteLater(); + return; + } + + auto headerData = buffer_.mid( 0, splitFlagIndex ); + buffer_.remove( 0, splitFlagIndex + 2 ); + + const auto &&key = headerData.mid( 0, index ); + auto value = headerData.mid( index + 1 ); + + if ( value.startsWith( ' ' ) ) + { + value.remove( 0, 1 ); + } + + requestHeader_[ key ] = value; + + if ( key.toLower() == "content-length" ) + { + contentLength_ = value.toLongLong(); + } + } + } + } + else + { + this->inspectionBufferSetup2(); + } +} + +void JQHttpServer::Session::inspectionBufferSetup2() +{ + requestBody_ += buffer_; + buffer_.clear(); + +// qDebug() << requestBody_.size() << contentLength_; + + if ( !handleAcceptedCallback_ ) + { + qDebug() << "JQHttpServer::Session::inspectionBuffer: error4"; + this->deleteLater(); + return; + } + + if ( ( contentLength_ != -1 ) && ( requestBody_.size() != contentLength_ ) ) + { + return; + } + + handleAcceptedCallback_( this ); +} + +// AbstractManage +JQHttpServer::AbstractManage::AbstractManage(const int &handleMaxThreadCount) +{ + handleThreadPool_.reset( new QThreadPool ); + serverThreadPool_.reset( new QThreadPool ); + + handleThreadPool_->setMaxThreadCount( handleMaxThreadCount ); + serverThreadPool_->setMaxThreadCount( 1 ); +} + +JQHttpServer::AbstractManage::~AbstractManage() +{ + this->stopHandleThread(); +} + +bool JQHttpServer::AbstractManage::begin() +{ + if ( QThread::currentThread() != this->thread() ) + { + qDebug() << "JQHttpServer::Manage::listen: error: listen from other thread"; + return false; + } + + if ( this->isRunning() ) + { + qDebug() << "JQHttpServer::Manage::close: error: already running"; + return false; + } + + return this->startServerThread(); +} + +void JQHttpServer::AbstractManage::close() +{ + if ( !this->isRunning() ) + { + qDebug() << "JQHttpServer::Manage::close: error: not running"; + return; + } + + emit readyToClose(); + + if ( serverThreadPool_->activeThreadCount() ) + { + this->stopServerThread(); + } +} + +bool JQHttpServer::AbstractManage::startServerThread() +{ + QSemaphore semaphore; + + QtConcurrent::run( serverThreadPool_.data(), [ &semaphore, this ]() + { + QEventLoop eventLoop; + QObject::connect( this, &AbstractManage::readyToClose, &eventLoop, &QEventLoop::quit ); + + if ( !this->onStart() ) + { + semaphore.release( 1 ); + } + + semaphore.release( 1 ); + + eventLoop.exec(); + + this->onFinish(); + } ); + + semaphore.acquire( 1 ); + + return this->isRunning(); +} + +void JQHttpServer::AbstractManage::stopHandleThread() +{ + handleThreadPool_->waitForDone(); +} + +void JQHttpServer::AbstractManage::stopServerThread() +{ + serverThreadPool_->waitForDone(); +} + +void JQHttpServer::AbstractManage::newSession(const QPointer< Session > &session) +{ + session->setHandleAcceptedCallback( [ this ](const QPointer< JQHttpServer::Session > &session){ this->handleAccepted( session ); } ); + + auto session_ = session.data(); + connect( session.data(), &QObject::destroyed, [ this, session_ ]() + { + this->mutex_.lock(); + this->availableSessions_.remove( session_ ); + this->mutex_.unlock(); + } ); + availableSessions_.insert( session.data() ); +} + +void JQHttpServer::AbstractManage::handleAccepted(const QPointer &session) +{ + QtConcurrent::run( handleThreadPool_.data(), [ this, session ]() + { + if ( !this->httpAcceptedCallback_ ) + { + qDebug() << "JQHttpServer::Manage::handleAccepted: error, httpAcceptedCallback_ is nullptr"; + return; + } + + this->httpAcceptedCallback_( session ); + } ); +} + +// TcpServerManage +JQHttpServer::TcpServerManage::TcpServerManage(const int &handleMaxThreadCount): + AbstractManage( handleMaxThreadCount ) +{ } + +JQHttpServer::TcpServerManage::~TcpServerManage() +{ + if ( this->isRunning() ) + { + this->close(); + } +} + +bool JQHttpServer::TcpServerManage::listen(const QHostAddress &address, const quint16 &port) +{ + listenAddress_ = address; + listenPort_ = port; + + return this->begin(); +} + +bool JQHttpServer::TcpServerManage::isRunning() +{ + return !tcpServer_.isNull(); +} + +bool JQHttpServer::TcpServerManage::onStart() +{ + mutex_.lock(); + + tcpServer_ = new QTcpServer; + + mutex_.unlock(); + + QObject::connect( tcpServer_.data(), &QTcpServer::newConnection, [ this ]() + { + auto socket = this->tcpServer_->nextPendingConnection(); + + this->newSession( new Session( socket ) ); + } ); + + if ( !tcpServer_->listen( listenAddress_, listenPort_ ) ) + { + mutex_.lock(); + + delete tcpServer_.data(); + tcpServer_.clear(); + + mutex_.unlock(); + + return false; + } + + return true; +} + +void JQHttpServer::TcpServerManage::onFinish() +{ + this->mutex_.lock(); + + tcpServer_->close(); + delete tcpServer_.data(); + tcpServer_.clear(); + + this->mutex_.unlock(); +} + +// SslServerManage +#ifndef QT_NO_SSL +namespace JQHttpServer +{ + +class SslServerHelper: public QTcpServer +{ + void incomingConnection(qintptr socketDescriptor) final + { + onIncomingConnectionCallback_( socketDescriptor ); + } + +public: + std::function< void(qintptr socketDescriptor) > onIncomingConnectionCallback_; +}; + +} + +JQHttpServer::SslServerManage::SslServerManage(const int &handleMaxThreadCount): + AbstractManage( handleMaxThreadCount ) +{ } + +JQHttpServer::SslServerManage::~SslServerManage() +{ + if ( this->isRunning() ) + { + this->close(); + } +} + +bool JQHttpServer::SslServerManage::listen( + const QHostAddress &address, + const quint16 &port, + const QString &crtFilePath, + const QString &keyFilePath, + const QList< QPair< QString, bool > > &caFileList + ) +{ + listenAddress_ = address; + listenPort_ = port; + + QFile fileForCrt( crtFilePath ); + if ( !fileForCrt.open( QIODevice::ReadOnly ) ) + { + qDebug() << "SslServerManage::listen: error: can not open file:" << crtFilePath; + return false; + } + + QFile fileForKey( keyFilePath ); + if ( !fileForKey.open( QIODevice::ReadOnly ) ) + { + qDebug() << "SslServerManage::listen: error: can not open file:" << keyFilePath; + return false; + } + + QSslCertificate sslCertificate( fileForCrt.readAll(), QSsl::Pem ); + QSslKey sslKey( fileForKey.readAll(), QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey ); + + QList< QSslCertificate > caCertificates; + for ( const auto &caFile: caFileList ) + { + QFile fileForCa( caFile.first ); + if ( !fileForCa.open( QIODevice::ReadOnly ) ) + { + qDebug() << "SslServerManage::listen: error: can not open file:" << caFile.first; + return false; + } + + caCertificates.push_back( QSslCertificate( fileForCa.readAll(), ( caFile.second ) ? ( QSsl::Pem ) : ( QSsl::Der ) ) ); + } + + sslConfiguration_.reset( new QSslConfiguration ); + sslConfiguration_->setPeerVerifyMode( QSslSocket::VerifyNone ); + sslConfiguration_->setLocalCertificate( sslCertificate ); + sslConfiguration_->setPrivateKey( sslKey ); + sslConfiguration_->setProtocol( QSsl::TlsV1_2 ); + sslConfiguration_->setCaCertificates( caCertificates ); + +#ifndef QT_NO_DEBUG + qDebug() << "sslCertificate:" << sslCertificate; + qDebug() << "sslKey:" << sslKey; + qDebug() << "caCertificates:" << caCertificates; +#endif + + return this->begin(); +} + +bool JQHttpServer::SslServerManage::isRunning() +{ + return !tcpServer_.isNull(); +} + +bool JQHttpServer::SslServerManage::onStart() +{ + mutex_.lock(); + + tcpServer_ = new SslServerHelper; + + mutex_.unlock(); + + tcpServer_->onIncomingConnectionCallback_ = [ this ](qintptr socketDescriptor) + { + auto sslSocket = new QSslSocket; + + sslSocket->setSslConfiguration( *sslConfiguration_ ); + + QObject::connect( sslSocket, &QSslSocket::encrypted, [ this, sslSocket ]() + { +// qDebug() << "SslServerManage::encrypted"; + this->newSession( new Session( sslSocket ) ); + } ); +// QObject::connect( sslSocket, &QSslSocket::modeChanged, [ this, sslSocket ](QSslSocket::SslMode mode) +// { +// qDebug() << "modeChanged" << mode; +// } ); +// QObject::connect( sslSocket, (void(QSslSocket::*)(QAbstractSocket::SocketError))&QSslSocket::error, [ sslSocket ](QAbstractSocket::SocketError e) +// { +// qDebug() << e << sslSocket->errorString(); +// } ); +// QObject::connect( sslSocket, (void(QSslSocket::*)(const QList &))&QSslSocket::sslErrors, [ sslSocket ](const QList &e) +// { +// qDebug() << e; +// } ); + + sslSocket->setSocketDescriptor( socketDescriptor ); + sslSocket->startServerEncryption(); + }; + + if ( !tcpServer_->listen( listenAddress_, listenPort_ ) ) + { + mutex_.lock(); + + delete tcpServer_.data(); + tcpServer_.clear(); + + mutex_.unlock(); + + return false; + } + + return true; +} + +void JQHttpServer::SslServerManage::onFinish() +{ + this->mutex_.lock(); + + tcpServer_->close(); + delete tcpServer_.data(); + tcpServer_.clear(); + + this->mutex_.unlock(); +} +#endif + +// LocalServerManage +JQHttpServer::LocalServerManage::LocalServerManage(const int &handleMaxThreadCount): + AbstractManage( handleMaxThreadCount ) +{ } + +JQHttpServer::LocalServerManage::~LocalServerManage() +{ + if ( this->isRunning() ) + { + this->close(); + } +} + +bool JQHttpServer::LocalServerManage::listen(const QString &name) +{ + listenName_ = name; + + return this->begin(); +} + +bool JQHttpServer::LocalServerManage::isRunning() +{ + return !localServer_.isNull(); +} + +bool JQHttpServer::LocalServerManage::onStart() +{ + mutex_.lock(); + + localServer_ = new QLocalServer; + + mutex_.unlock(); + + QObject::connect( localServer_.data(), &QLocalServer::newConnection, [ this ]() + { + this->newSession( new Session( this->localServer_->nextPendingConnection() ) ); + } ); + + if ( !localServer_->listen( listenName_ ) ) + { + mutex_.lock(); + + delete localServer_.data(); + localServer_.clear(); + + mutex_.unlock(); + + return false; + } + + return true; +} + +void JQHttpServer::LocalServerManage::onFinish() +{ + this->mutex_.lock(); + + localServer_->close(); + delete localServer_.data(); + localServer_.clear(); + + this->mutex_.unlock(); +} diff --git a/LedOK/JQLibrary/src/JQNet.cpp b/LedOK/JQLibrary/src/JQNet.cpp new file mode 100644 index 0000000..c7e8451 --- /dev/null +++ b/LedOK/JQLibrary/src/JQNet.cpp @@ -0,0 +1,669 @@ +/* + This file is part of JQLibrary + + Copyright: Jason + + Contact email: 188080501@qq.com + + GNU Lesser General Public License Usage + Alternatively, this file may be used under the terms of the GNU Lesser + General Public License version 2.1 or version 3 as published by the Free + Software Foundation and appearing in the file LICENSE.LGPLv21 and + LICENSE.LGPLv3 included in the packaging of this file. Please review the + following information to ensure the GNU Lesser General Public License + requirements will be met: https://www.gnu.org/licenses/lgpl.html and + http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +*/ + +#include "JQNet.h" + +// Qt lib import +#include +#include +#include +#include +#include + +// JQLibrary lib import +#ifdef JQFOUNDATION_LIB +# include "JQFoundation.h" +#endif + +QNetworkAddressEntry JQNet::getNetworkAddressEntry() +{ + return getNetworkAddressEntryWithNetworkInterface().first; +} + +QPair< QNetworkAddressEntry, QNetworkInterface > JQNet::getNetworkAddressEntryWithNetworkInterface(const bool &ridVm) +{ + for ( const auto &interface: static_cast< const QList< QNetworkInterface > >( QNetworkInterface::allInterfaces() ) ) + { + if ( interface.flags() != ( QNetworkInterface::IsUp | + QNetworkInterface::IsRunning | + QNetworkInterface::CanBroadcast | + QNetworkInterface::CanMulticast ) ) { continue; } + + if ( ridVm && interface.humanReadableName().startsWith( "vm" ) ) { continue; } + + for ( const auto &entry: static_cast< QList >( interface.addressEntries() ) ) + { + if ( entry.ip().toIPv4Address() ) + { + return { entry, interface }; + } + } + } + + return { }; +} + +QString JQNet::getHostName() +{ +#if ( defined Q_OS_MAC ) + return QHostInfo::localHostName().replace( ".local", "" ); +#else + return QHostInfo::localHostName(); +#endif +} + +bool JQNet::tcpReachable(const QString &hostName, const quint16 &port, const int &timeout) +{ + QTcpSocket socket; + + socket.connectToHost( hostName, port ); + socket.waitForConnected( timeout ); + + return socket.state() == QAbstractSocket::ConnectedState; +} + +#ifdef JQFOUNDATION_LIB +bool JQNet::pingIp(const QHostAddress &hostAddress) +{ +// qDebug() << "NetworkManage::pingIp:" << hostAddress.toString(); + + QPair< int, QByteArray > pingResult = { -1, { } }; + +#ifdef Q_OS_MAC + pingResult = JQFoundation::startProcessAndReadOutput( "ping", { "-c1", "-W300", hostAddress.toString() } ); +#endif + +#ifdef Q_OS_WIN + pingResult = JQFoundation::startProcessAndReadOutput( "ping", { "-n", "1", "-w", "300", hostAddress.toString() } ); +#endif + + return ( pingResult.first == 0 ) && ( pingResult.second.size() > 20 ) && ( pingResult.second.count( hostAddress.toString().toUtf8() ) > 1 ); +} +#endif + +// HTTP +bool JQNet::HTTP::get( + const QNetworkRequest &request, + QByteArray &target, const int &timeout + ) +{ + target.clear(); + + QEventLoop eventLoop; + auto reply = manage_.get( request ); + bool failFlag = false; + + this->handle( + reply, + timeout, + [ & ](const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) + { + target = data; + eventLoop.exit( 1 ); + }, + [ & ](const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &, const QByteArray &data) + { + target = data; + eventLoop.exit( 0 ); + }, + [ & ]() + { + failFlag = true; + eventLoop.exit( 0 ); + } + ); + + return eventLoop.exec() && !failFlag; +} + +void JQNet::HTTP::get( + const QNetworkRequest &request, + const std::function &, const QByteArray &)> &onFinished, + const std::function &, const QNetworkReply::NetworkError &, const QByteArray &)> &onError, + const int &timeout + ) +{ + auto reply = manage_.get( request ); + + this->handle( + reply, + timeout, + onFinished, + onError, + [ onError ]() + { + onError( { }, QNetworkReply::TimeoutError, { } ); + } + ); +} + +bool JQNet::HTTP::deleteResource( + const QNetworkRequest &request, + QByteArray &target, + const int &timeout + ) +{ + target.clear(); + + QEventLoop eventLoop; + auto reply = manage_.deleteResource( request ); + bool failFlag = false; + + this->handle( + reply, + timeout, + [ & ](const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) + { + target = data; + eventLoop.exit( 1 ); + }, + [ & ](const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &, const QByteArray &data) + { + target = data; + eventLoop.exit( 0 ); + }, + [ & ]() + { + failFlag = true; + eventLoop.exit( 0 ); + } + ); + + return eventLoop.exec() && !failFlag; +} + +void JQNet::HTTP::deleteResource( + const QNetworkRequest &request, + const std::function &, const QByteArray &)> &onFinished, + const std::function &, const QNetworkReply::NetworkError &, const QByteArray &)> &onError, + const int &timeout + ) +{ + auto reply = manage_.deleteResource( request ); + + this->handle( + reply, + timeout, + onFinished, + onError, + [ onError ]() + { + onError( { }, QNetworkReply::TimeoutError, { } ); + } + ); +} + +bool JQNet::HTTP::post( + const QNetworkRequest &request, + const QByteArray &body, + QList< QNetworkReply::RawHeaderPair > &targetRawHeaderPairs, + QByteArray &target, + const int &timeout + ) +{ + target.clear(); + + QEventLoop eventLoop; + auto reply = manage_.post( request, body ); + bool failFlag = false; + + this->handle( + reply, + timeout, + [ &targetRawHeaderPairs, &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &rawHeaderPairs, const QByteArray &data) + { + targetRawHeaderPairs = rawHeaderPairs; + target = data; + eventLoop.exit( true ); + }, + [ &targetRawHeaderPairs, &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &rawHeaderPairs, const QNetworkReply::NetworkError &, const QByteArray &data) + { + targetRawHeaderPairs = rawHeaderPairs; + target = data; + eventLoop.exit( false ); + }, + [ &failFlag, &eventLoop ]() + { + failFlag = true; + eventLoop.exit( false ); + } + ); + + return eventLoop.exec() && !failFlag; +} + +bool JQNet::HTTP::post( + const QNetworkRequest &request, + const QSharedPointer< QHttpMultiPart > &multiPart, + QByteArray &target, + const int &timeout + ) +{ + target.clear(); + + QEventLoop eventLoop; + auto reply = manage_.post( request, multiPart.data() ); + bool failFlag = false; + + this->handle( + reply, + timeout, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) + { + target = data; + eventLoop.exit( true ); + }, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &, const QByteArray &data) + { + target = data; + eventLoop.exit( false ); + }, + [ &failFlag, &eventLoop ]() + { + failFlag = true; + eventLoop.exit( false ); + } + ); + + return eventLoop.exec() && !failFlag; +} + +void JQNet::HTTP::post( + const QNetworkRequest &request, + const QByteArray &body, + const std::function &, const QByteArray &)> &onFinished, + const std::function &, const QNetworkReply::NetworkError &, const QByteArray &)> &onError, + const int &timeout + ) +{ + auto reply = manage_.post( request, body ); + + this->handle( + reply, + timeout, + onFinished, + onError, + [ onError ]() + { + onError( { }, QNetworkReply::TimeoutError, { } ); + } + ); +} + +bool JQNet::HTTP::put( + const QNetworkRequest &request, + const QByteArray &body, + QByteArray &target, + const int &timeout + ) +{ + target.clear(); + + QEventLoop eventLoop; + auto reply = manage_.put( request, body ); + bool failFlag = false; + + this->handle( + reply, + timeout, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) + { + target = data; + eventLoop.exit( true ); + }, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &, const QByteArray &data) + { + target = data; + eventLoop.exit( false ); + }, + [ &failFlag, &eventLoop ]() + { + failFlag = true; + eventLoop.exit( false ); + } + ); + + return eventLoop.exec() && !failFlag; +} + +bool JQNet::HTTP::put( + const QNetworkRequest &request, + const QSharedPointer< QHttpMultiPart > &multiPart, + QByteArray &target, + const int &timeout + ) +{ + target.clear(); + + QEventLoop eventLoop; + auto reply = manage_.put( request, multiPart.data() ); + bool failFlag = false; + + this->handle( + reply, + timeout, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) + { + target = data; + eventLoop.exit( true ); + }, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError & /*e*/, const QByteArray &data) + { + target = data; + eventLoop.exit( false ); + }, + [ &failFlag, &eventLoop ]() + { + failFlag = true; + eventLoop.exit( false ); + } + ); + + return eventLoop.exec() && !failFlag; +} + +void JQNet::HTTP::put( + const QNetworkRequest &request, + const QByteArray &body, + const std::function &, const QByteArray &)> &onFinished, + const std::function &, const QNetworkReply::NetworkError &, const QByteArray &)> &onError, + const int &timeout + ) +{ + auto reply = manage_.put( request, body ); + + this->handle( + reply, + timeout, + onFinished, + onError, + [ onError ]() + { + onError( { }, QNetworkReply::TimeoutError, { } ); + } + ); +} + +#if !( defined Q_OS_LINUX ) && ( QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) ) +bool JQNet::HTTP::patch( + const QNetworkRequest &request, + const QByteArray &body, + QByteArray &target, + const int &timeout + ) +{ + target.clear(); + + QEventLoop eventLoop; + auto reply = manage_.sendCustomRequest( request, "PATCH", body ); + bool failFlag = false; + + this->handle( + reply, + timeout, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QByteArray &data) + { + target = data; + eventLoop.exit( true ); + }, + [ &target, &eventLoop ](const QList< QNetworkReply::RawHeaderPair > &, const QNetworkReply::NetworkError &, const QByteArray &data) + { + target = data; + eventLoop.exit( false ); + }, + [ &failFlag, &eventLoop ]() + { + failFlag = true; + eventLoop.exit( false ); + } + ); + + return eventLoop.exec() && !failFlag; +} + +void JQNet::HTTP::patch( + const QNetworkRequest &request, + const QByteArray &body, + const std::function &, const QByteArray &)> &onFinished, + const std::function &, const QNetworkReply::NetworkError &, const QByteArray &)> &onError, + const int &timeout + ) +{ + auto reply = manage_.sendCustomRequest( request, "PATCH", body ); + + this->handle( + reply, + timeout, + onFinished, + onError, + [ onError ]() + { + onError( { }, QNetworkReply::TimeoutError, { } ); + } + ); +} +#endif + +QPair< bool, QByteArray > JQNet::HTTP::get(const QString &url, const int &timeout) +{ + QNetworkRequest networkRequest( ( QUrl( url ) ) ); + QByteArray buf; + + const auto &&flag = HTTP().get( networkRequest, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::get(const QNetworkRequest &request, const int &timeout) +{ + QByteArray buf; + HTTP http; + + const auto &&flag = http.get( request, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::deleteResource(const QString &url, const int &timeout) +{ + QNetworkRequest networkRequest( ( QUrl( url ) ) ); + QByteArray buf; + + const auto &&flag = HTTP().deleteResource( networkRequest, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::deleteResource(const QNetworkRequest &request, const int &timeout) +{ + QByteArray buf; + HTTP http; + + const auto &&flag = http.deleteResource( request, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::post(const QString &url, const QByteArray &body, const int &timeout) +{ + QNetworkRequest networkRequest( ( QUrl( url ) ) ); + QList< QNetworkReply::RawHeaderPair > rawHeaderPairs; + QByteArray buf; + + networkRequest.setRawHeader( "Content-Type", "application/x-www-form-urlencoded" ); + + const auto &&flag = HTTP().post( networkRequest, body, rawHeaderPairs, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::post(const QNetworkRequest &request, const QByteArray &body, const int &timeout) +{ + QByteArray buf; + QList< QNetworkReply::RawHeaderPair > rawHeaderPairs; + HTTP http; + + const auto &&flag = http.post( request, body, rawHeaderPairs, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QPair< QList< QNetworkReply::RawHeaderPair >, QByteArray > > JQNet::HTTP::post2(const QNetworkRequest &request, const QByteArray &body, const int &timeout) +{ + QByteArray buf; + QList< QNetworkReply::RawHeaderPair > rawHeaderPairs; + HTTP http; + + const auto &&flag = http.post( request, body, rawHeaderPairs, buf, timeout ); + + return { flag, { rawHeaderPairs, buf } }; +} + +QPair< bool, QByteArray > JQNet::HTTP::post(const QNetworkRequest &request, const QSharedPointer &multiPart, const int &timeout) +{ + QByteArray buf; + HTTP http; + + const auto &&flag = http.post( request, multiPart, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::put(const QString &url, const QByteArray &body, const int &timeout) +{ + QNetworkRequest networkRequest( ( QUrl( url ) ) ); + QByteArray buf; + + networkRequest.setRawHeader( "Content-Type", "application/x-www-form-urlencoded" ); + + const auto &&flag = HTTP().put( networkRequest, body, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::put(const QNetworkRequest &request, const QByteArray &body, const int &timeout) +{ + QByteArray buf; + HTTP http; + + const auto &&flag = http.put( request, body, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::put(const QNetworkRequest &request, const QSharedPointer< QHttpMultiPart > &multiPart, const int &timeout) +{ + QByteArray buf; + HTTP http; + + const auto &&flag = http.put( request, multiPart, buf, timeout ); + + return { flag, buf }; +} + +#if !( defined Q_OS_LINUX ) && ( QT_VERSION >= QT_VERSION_CHECK( 5, 9, 0 ) ) +QPair< bool, QByteArray > JQNet::HTTP::patch(const QString &url, const QByteArray &body, const int &timeout) +{ + QNetworkRequest networkRequest( ( QUrl( url ) ) ); + QByteArray buf; + + networkRequest.setRawHeader( "Content-Type", "application/x-www-form-urlencoded" ); + + const auto &&flag = HTTP().patch( networkRequest, body, buf, timeout ); + + return { flag, buf }; +} + +QPair< bool, QByteArray > JQNet::HTTP::patch(const QNetworkRequest &request, const QByteArray &body, const int &timeout) +{ + QByteArray buf; + HTTP http; + + const auto &&flag = http.patch( request, body, buf, timeout ); + + return { flag, buf }; +} +#endif + +void JQNet::HTTP::handle( + QNetworkReply *reply, const int &timeout, + const std::function &, const QByteArray &)> &onFinished, + const std::function &, const QNetworkReply::NetworkError &, const QByteArray &data)> &onError, + const std::function &onTimeout + ) +{ + QSharedPointer< bool > isCalled( new bool( false ) ); + + QTimer *timer = nullptr; + if ( timeout ) + { + timer = new QTimer; + timer->setSingleShot(true); + + QObject::connect( timer, &QTimer::timeout, [ timer, onTimeout, isCalled ]() + { + if ( *isCalled ) { return; } + *isCalled = true; + + onTimeout(); + timer->deleteLater(); + } ); + timer->start( timeout ); + } + + QObject::connect( reply, &QNetworkReply::finished, [ reply, timer, onFinished, isCalled ]() + { + if ( *isCalled ) { return; } + *isCalled = true; + + if ( timer ) + { + timer->deleteLater(); + } + + const auto &&acceptedData = reply->readAll(); + const auto &rawHeaderPairs = reply->rawHeaderPairs(); + + onFinished( rawHeaderPairs, acceptedData ); + } ); + +#ifndef QT_NO_SSL + if ( reply->url().toString().toLower().startsWith( "https" ) ) + { + QObject::connect( reply, static_cast< void( QNetworkReply::* )( const QList< QSslError > & ) >( &QNetworkReply::sslErrors ), [ reply ](const QList< QSslError > &errors) + { + qDebug() << "HTTP::handle: ignoreSslErrors:" << errors; + reply->ignoreSslErrors(); + } ); + } +#endif + + QObject::connect( reply, static_cast< void( QNetworkReply::* )( QNetworkReply::NetworkError ) >( &QNetworkReply::error ), [ reply, timer, onError, isCalled ](const QNetworkReply::NetworkError &code) + { + if ( *isCalled ) { return; } + *isCalled = true; + + if ( timer ) + { + timer->deleteLater(); + } + const auto &&acceptedData = reply->readAll(); + const auto &rawHeaderPairs = reply->rawHeaderPairs(); + + onError( rawHeaderPairs, code, acceptedData ); + } ); +} diff --git a/LedOK/LICENSE b/LedOK/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LedOK/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LedOK/Languages/enUS.qm b/LedOK/Languages/enUS.qm new file mode 100644 index 0000000000000000000000000000000000000000..405e76bfe03ce30ec9c64332b55323bc70334daf GIT binary patch literal 129161 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 Db;PpH literal 0 HcmV?d00001 diff --git a/LedOK/Languages/enUS.ts b/LedOK/Languages/enUS.ts new file mode 100644 index 0000000..41a0b5b --- /dev/null +++ b/LedOK/Languages/enUS.ts @@ -0,0 +1,9615 @@ + + + + + AboutDlg + + + Dialog + Dialog + + + + About + About + + + + X + X + + + + LedOK Express + LedOK Express + + + + V20200429 + + + + + <a href="https://www.ledok.cn/">www.ledok.cn + + + + + ChangePasswordForm + + + Form + Form + + + + Old password + Old password + + + + New password + New password + + + + Repeat again + Repeat again + + + + OK + Ok + + + + Cancel + Cancel + + + + + + + + + + Tip + Tip + + + + Please input old password + Please input old password + + + + Old password is wrong + Old password is wrong + + + + + Please enter a password with more than 6 characters + Please enter a password with more than 6 characters + + + + The new password is not consistent in two times + + + + + Please enter a new password + Please enter a new password + + + + Password changed successfully + Password changed successfully + + + + ColorDialog + + + ColorDialog + + + + + Tone(H): + + + + + Saturation(S): + + + + + Brightness(V): + + + + + 度 + + + + + Basic color + Basic color + + + + Custom color + Custom color + + + + # + + + + + Add to custom + Add to custom + + + + Blue(B): + Blue(B): + + + + Green(G): + Green(G): + + + + Red(R): + Red(R): + + + + transparency: + transparency: + + + + Cur color + Cur color + + + + New color + New color + + + + Ok + Ok + + + + Cancel + Cancel + + + + Select color + Select color + + + + ControlAdvParamWidget + + + Form + Form + + + + + Advanced parameters + Advanced parameters + + + + + LED Screen Width(pixel): + LED Screen Width(pixel): + + + + + Width + Width + + + + + Height(pixel): + Height(pixel): + + + + + Height + Height + + + + + + + + + + + + + + + Set + Set + + + + + Alias + Alias + + + + + Web Server Address: + Web Server Address: + + + + www.m2mled.net + + + + + www.ledaips.com + + + + + https://www.taxihub.cn:2340 + + + + + https://www.ledaips.com:2340 + + + + + https://www.36taxi.com:2340 + + + + + www.tlzxled.com + + + + + Company ID: + Company ID: + + + + Input Company ID + Input Company ID + + + + + Realtimer Server Address: + Realtimer Server Address: + + + + + Input Realtimer Server Address + Input Realtimer Server Address + + + + + Clear + Clear + + + + + + Apk upgrade + Apk upgrade + + + + + Check Apk + Check Apk + + + + + Uninstall + Uninstall + + + + + Running check + Running check + + + + FPAG Upgrade + FPGA Upgrade + + + + + FPGA version check + FPGA version check + + + + + Sync FPGA version + Sync FPGA version + + + + + Restart led controller system + Restart led controller system + + + + + Check Log + Check Log + + + + Open ADB + Open ADB debugging function + + + + Post custom json + Post custom json + + + + + Clear Program + Clear Program + + + + + M80 configuration + M80 configuration + + + + + Refresh + Refresh + + + + + Restore to default + Restore to default + + + + + Taxi top screen configuration + Taxi top screen configuration + + + + + Service:High Out of service:Low + Service:High Out of service:Low + + + + + Service:Low Out of service:High + Service:Low Out of service:High + + + + + Start LedSet3.0 configure LED module + Start LedSet3.0 configure LED module(used by manufacturer's professionals) + + + + Bind *.ic Certificate + Bind taxihub web *.ic Certificate + + + + Binding *.ic account indentity voucher + Binding *.ic account indentity voucher + + + + + Rotate + Rotate + + + + + 0 degrees + 0 degrees + + + + + 90 degrees + 90 degrees + + + + + 180 degrees + 180 degrees + + + + + 270 degrees + 270 degrees + + + + + Min brightness + Min brightness + + + + 1 + 1 + + + + + (min:1) + (min:1) + + + + + + + + + Readback + Readback + + + + + + + + Send + Send + + + + + Max brightness + Max brightness + + + + 255 + 255 + + + + + (max:255) + (max:255) + + + + SetScreenSize + Set Screen Size + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Success + Success + + + + Compant ID: + Company ID + + + + FPGA Upgrade + FPGA Upgrade + + + + Compant ID + Company ID + + + Input password + Input password + + + + InputWebServerAddressTip + Please enter web server address + + + + InputCompanyIdTip + Please enter company ID + + + + Do you want to modify webserveraddress and companyId? + Are you sure you want to configure the server address and company ID? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + failed + failed + + + + SetOnlineAddr + Set Web server address + + + + ClearRealtimeServer + Clear + + + + InputRealTimeAddressTip + Please enter the realtimer address + + + + SetRealtimeServer + Set realtimer address + + + + + + + + + + Tip Info + Tip Info + + + Do you want to save the modifications? + Do you want to save the modifications? + + + + + + + + + Can not find LedSet3.0.exe,down you need download and install it + Can not find LedSet3.0.exe,down you need download and install it + + + + RestartAndroid + Restart + + + + FPGA Version + FPGA Version + + + + running + running + + + + no running + no running + + + + version + version + + + + CheckSoftVersions + Check apk version + + + + UninstallSoftware + Uninstall + + + + IsSoftwareRunning + Check apk running status + + + + apk package (*.rpd) + + + + + CheckHardwareVersions + Check FPGA version + + + + + + SynchronousHardwareVersion + Sync FPGA version + + + + Check Screen untile fpga update finished + Watch the progress of screen upgrade until the upgrade is finished + + + + OpenAdb + Open ADB debugging function + + + + indentity voucher (*.ic) + indentity voucher (*.ic) + + + + + InvokeTaxiAppFunction + Binding certificate + + + + Json format is error! + + + + + + AliIotSetting + + + + SetTaxiServer + Set Taxi Server + + + DelPrograms + Clear program + + + + apk package (*.apk *.zip) + + + + + + UpgradeSoftware + Upgrade firmware + + + + This screen is encrypted,Please decrypt and upgrade APK! + This screen is encrypted,Please decrypt and upgrade APK! + + + + + + + SetScreenRotation + Set screen rotation + + + + SetMinBrightness + Set min brightness value + + + + SetMaxBrightness + Set maximum brightness value + + + + GetMinBrightness + Get min brightness + + + + GetMaxBrightness + Get maximum brightness + + + + SetSpecialResolution + Set Special Resolution + + + + GetSpecialResolution + Get Special Resolution + + + + CleanDisplayScreenSize + Restore to default relolution + + + + SetHighForBusy + Set level for busy + + + + GetStateForBusy + Get level of busy + + + + install start... + Start installation... + + + + InputAliasTip + Please input alias + + + + SetCardAlias + Set alias + + + + Clear program successed! + Clear program successed! + + + + Clear program failed! + Clear program failed! + + + + Clear program timeout! + Clear program timeout! + + + + Uploadding + Uploading + + + + + + + + + + + + + + + + + + + + + Tip + Tip + + + + NoSelectedController + Please select screen first + + + + InputWidthTip + Please enter the correct width pixel value + + + + InputHeightTip + Please enter the correct height pixel value + + + Can not find LedSet3.0.exe,please install it first! + Can not find LedSet3.0.exe,please install it first! + + + + Password is error + Password is error + + + GetScreenSize + Get Screen Size + + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + wDevicesItem OnProHttpResponse json error! + + + + ControlBrightnessAutoWidget + + + Form + Form + + + + + Sensitivity + Sensitivity + + + + Minimum Brightness + Minimum Brightness + + + + (1~100) + + + + + (1~255) + + + + + + + + Set + Set + + + + + Cur brigntness:0 + Cur brigntness:0 + + + + + Refresh + Refresh + + + + + + + + + Readback + Readback + + + + R60 + + + + + RL1 + + + + + Upload file + Upload file + + + + When uploading files, you can only select the card of the same sensor; otherwise it will fail! + When uploading the file, please confirm to select the correct sensor type, otherwise it will be invalid! + + + + 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 80 or above, otherwise the brightness will be low. + 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 80 or above, otherwise the brightness will be low. + + + + BrightnessTip1 + 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 80 or above, otherwise the brightness will be low. + + + + BrightnessTip2 + When uploading the file, please confirm to select the correct sensor type, otherwise it will be invalid! + + + + Minbrightness + Minimum Brightness + + + + Upload + Upload file + + + + ReadbackTable + Readback + + + + + + + + + + Tip + Tip + + + + NoSelectedController + Please select screen first + + + + MinBrightnessInputTip + Please input the correct brightness value + + + + SetMinBrightness + Set min brightness value + + + + SensitivityInputTip + Please input the correct sensitivity value + + + + SetBrightnessSensitivity + Set brightness sensitivity + + + + + NeedSelectSensorTypeTip + Please select sensor type first + + + + SensorBrightnessTable + Set sensor brightness table + + + + GetMinBrightness + Get min brightness + + + + GetBrightnessSensitivity + Get brightness sensitivity + + + + GetSensorBrightnessTable + Get sensor bright table + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Cur brightness + Cur brightness + + + + Save file + Save file + + + + no sensorBrightnessTable + no sensor brightnessTable in controller + + + + GetCurrentSensorBrightness + Get Current Brightness + + + + + + + + + + + Success + Success + + + + + + + + + + + failed + failed + + + + ControlBrightnessManualWidget + + + Form + Form + + + + + Y10/E10/E06:1(min)~64(max); M90/Y30/E60/Y60:1(min)~256(max) + + + + + + Readback + Readback + + + + + Brightness value + Brightness value + + + + + Set + Set + + + + + + Tip + Tip + + + + + NoSelectedController + Please select screen first + + + + ManualBrightnessInputTip + Adjust brightness manually + + + + SetBrightness + Set brightness + + + + + Success + Success + + + + + failed + failed + + + + GetBrightness + Get brightness + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlBrightnessSchedule + + + Form + Form + + + + + Default brightness + Default brightness + + + + + 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 80, set the brightness to 180, and the time range to 8:00-17:00, then the brightness in the time range is 180, and the default brightness in other times is 80! + + + + + Add + Add + + + Edit + Edit + + + + + Delete + Delete + + + + + Clear + Clear + + + + + Import + Import + + + + + Export + Export + + + + + Apply + Apply + + + + + Readback + Readback + + + + BrightnessValue + Brightness Value + + + + Start Time + Start Time + + + + End Time + End Time + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + BrightnessSchedule (*.bjs) + + + + + Save File + Save file + + + + + Tip + Tip + + + + DefaultInputTip + Please input default brightness value + + + + NoSelectedController + Please select screen first + + + + SetAutoBrightnessTask + Send brightness schedule table + + + + + Success + Success + + + + + failed + failed + + + + GetAutoBrightnessTask + Get brightness schedule + + + + ControlBrightnessScheduleEdit + + + Dialog + Dialog + + + + Schedule Item + Schedule Item + + + + X + X + + + + Brightness Value + Brightness Value + + + + Start time + Start time + + + + End time + End time + + + + 255 + 255 + + + + Add + Add + + + + Cancel + Cancel + + + + ControlBrightnessWidget + + + Form + Form + + + + + Brightness Configuration + Brightness configuration + + + + + Auto + Auto + + + + + Manual + Manual + + + + + Schedule + Schedule + + + + ControlEncryptWidget + + + Form + Form + + + + + Entrypt Configuration + Entrypt configuration + + + + Original password + Original password + + + + + + original password + original password + + + + + + New password + New password + + + + + Repeat new password + Repeat new password + + + + + + + Set encryption + Set encryption + + + + + Cancel encryption + Cancel encryption + + + + + Enter password + Enter password + + + + Enter again + Enter again + + + + + + + + + Tip + Tip + + + + NoSelectedController + Please select screen first + + + + + InputOriginalPasswordTip + Please input original password + + + + InputNewPasswordTip + Please input new password + + + + InputRepeatPasswordTip + Please input repeat password + + + + InputRepeatPasswordNotSameTip + The two passwords are inconsistent + + + + Tip Info + Tip Info + + + + After setting the password, please remember the password and record it. If you forget the password, the device will be unable to operate. Are you sure you want to continue with this operation? + After setting the password, please remember the password and record it. If you forget the password, the device will be unable to operate. Are you sure you want to continue with this operation? + + + + + SetControllerPassword + Set password + + + + Readback + Readback + + + + + + Success + Success + + + + + + failed + failed + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + Modify password + Modify password + + + + OriginalPasswordErrorTip + The original password is wrong + + + + ControlHdmiManual + + + Form + Form + + + + + HDMI IN + HDMI IN + + + + Program In controller + Program in screen + + + + + + Readback + Readback + + + + Async + Async + + + + Tip + Tip + + + + NoSelectedController + Please select screen first + + + + + SyncSwitch + Switch video source from HDMI-IN port + + + + + AnSyncSwitch + Switch video source from Async box + + + + IsSync + Readback video source + + + SetHdmiIn + switch to HDMI IN + + + + + + + Success + Success + + + on + ON + + + + + + + failed + failed + + + off + OFF + + + IsHdmiIn + readback video source + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlHdmiSchedule + + + Form + Form + + + + + Add + Add + + + Edit + Edit + + + + + Delete + Delete + + + + + Clear + Clear + + + + + Import + Import + + + + + Export + 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 + + + + + Apply + Apply + + + + Readback + Readback + + + + SYNC HDMI + HDMI-IN video + + + + Start Time + Start Time + + + + End Time + End Time + + + + SUN + SUN + + + + MON + MON + + + + TUE + TUE + + + + WED + WED + + + + THU + THU + + + + FRI + FRI + + + + SAT + SAT + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + On + + + + SyncSchedule (*.syncs) + + + + + Save File + Save file + + + + Sync Schedule (*.syncs) + + + + + + Tip + Tip + + + + + NoSelectedController + Please select screen first + + + + SetTimingHdmiInTask + Set video source form HDMI-IN schedule task + + + + GetTimingHdmiInTask + Get video source form HDMI-IN schedule task + + + SetTimingScreenTask + Set schedule task of screen power + + + + + Success + Success + + + + + failed + failed + + + GetTimingScreenTask + Get schedule task of screen power + + + + ControlHdmiWidget + + + Form + Form + + + + + HDMI Configuration + Video source configuration + + + + + Manual + Manual + + + + + Schedule + Schedule + + + + ControlNetConfigWidget + + + Form + Form + + + + Wire Enther(RJ45) Configuration + Wire Enther(RJ45) Configuration + + + + + DHCP + + + + + + Specify IP + Specify IP + + + + + IP Address + IP Address + + + + Mask Address + Subnet mask + + + + + Gateway + Gateway + + + + + DNS Address + DNS Address + + + + + + + + + + + Set + Set + + + + + + + + + + Readback + Readback + + + + + WIFI Configuration + WiFi Configuration + + + + + WiFi On/Off + WiFi On/Off + + + + Input Ap name + Input ap name + + + + + 4G/5G Configuration + Cellular Configuration + + + + + Open 4G/5G + Enable cellular data + + + + APN: + + + + + Get cellular network status information + Get cellular network status information + + + + + Check SIM can automatically match to MCC, and then select carrier get apn param,if not found carrier,you can check the CUSTOM checkbox,then enter custom param. + Through the chcek status button, you can automatically match the country code MCC, and then select "operator" to get the response APN information. If you can't find the operator, you can select the "custom" check box, and then enter the APN information manually. + + + Readback Apn Info + Readback Apn Info + + + + + Readback APN Info + Readback APN Info + + + + + Set Apn Info,Check SIM can automatically match to MCC, and then select carrier get apn param + Set the APN information + + + + + CUSTOM + CUSTOM + + + + + Check SIM + chcek SIM Info + + + + + + -> + + + + + + Country ID(mcc): + Country ID(mcc): + + + + + Carrier Name + Carrier Name + + + + + APN: + Carrier APN: + + + + + APN(Required) + APN(Required) + + + + + User: + User Name: + + + + + + + Not required + Not required + + + + + Password: + Password: + + + + Set Apn:iot.cargo + + + + Timezone: + Timezone: + + + + + Flight Mode + Flight Mode + + + + + WiFi name + WiFi name + + + + + + + Password + Password + + + + + + + Input password + Input password + + + + + Scan + Scan + + + + + Ap Mode + AP + + + + Ap name + AP name + + + + OFF + OFF + + + + ON + ON + + + + AP name + AP name + + + + Subnet mask + Subnet mask + + + + Input ap name + Input AP name + + + + + + + + + + + + + + + + + + + + Success + Success + + + + + + + + + + + + + + + + + + + + failed + failed + + + + + + + Tip + Tip + + + + + NoSelectedController + Please select screen first + + + + + SetEthernet + Set wire nether + + + + + + + + + + + Attention + Attention + + + + Please input IP address! + Please input IP address! + + + + Your IP Address is Invalid! + IP Address is invalid! + + + + Please input Mask address! + Please input Mask address! + + + + Your Mask Address is Invalid! + Mask Address is Invalid! + + + + Please input Gateway address! + Please input Gateway address! + + + + Your Gateway Address is Invalid! + Gateway Address is Invalid! + + + + Please input DNS address! + Please input DNS address! + + + + Your DNS Address is Invalid! + DNS Address is Invalid! + + + + GetEthernet + Get wire ethernet + + + + SetSwitchWiFi + Set WiFi on/off + + + + + + + + + SignalPower + Signal strength + + + + + ConfigurationWiFi + Configuration WiFi + + + + IsPortableHotSpot + Get AP or WiFi + + + + GetWifiList + Scan WiFi list + + + + ConfigurationHotSpot + Configuration AP HotSpot + + + + GetCurrentAPN + Get Current Apn + + + + + GetSIMStatus + Get SIM Status + + + + + SetAPN + Set APN + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + 状态: + 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 + 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 + Yes + + + + No + 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: + + + + SetSwitchSimData + SetSwitchSimData + + + SetTimezone + Set Timezone + + + + ContrFlightMode + Set flight mode + + + + GetFlightModeState + Readback flight mode state + + + + ControlPowerManual + + + Form + Form + + + + + POWER + Power + + + + + + Readback + Readback + + + + OFF + OFF + + + + ON + ON + + + + + Tip + Tip + + + + + NoSelectedController + Please select screen first + + + + IsScreenOn + Read power status + + + + + + SetScreenOn + Set power + + + + + + + Success + Success + + + + + on + ON + + + + + + + failed + failed + + + + + off + OFF + + + + + SetScreenOff + SetScreenOff + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlPowerSchedule + + + Form + Form + + + + Edit area + Edit area + + + + + Add + Add + + + Edit + Edit + + + + + Delete + Delete + + + + + Clear + Clear + + + + + Import + Import + + + + + Export + Export + + + + It is power off state outside the schedule time period + It is power off state outside the schedule time period + + + + Send command + Command area + + + + + Apply + Apply + + + + Clear Schedule + Cancel Schedule + + + + Readback + Readback + + + + Power On State + Power On State + + + + Start Time + Start Time + + + + End Time + End Time + + + + SUN + SUN + + + + MON + MON + + + + TUE + TUE + + + + WED + WED + + + + THU + THU + + + + FRI + FRI + + + + SAT + SAT + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + On + + + + + PowerSchedule (*.pjs) + PowerSchedule (*.pjs) + + + + Save File + Save file + + + + + + Tip + Tip + + + + + + NoSelectedController + Please select screen first + + + + + Tip Info + Tip Info + + + + + Clear schedule task? + Clear schedule task? + + + + + CleanTimingScreenTask + Clear schedule task + + + + SetTimingScreenTask + Set schedule task of screen power + + + + + + + Success + Success + + + + + + + failed + failed + + + + GetTimingScreenTask + Get schedule task of screen power + + + + ControlPowerWidget + + + Form + Form + + + + + Power Configuration + Power configuration + + + + + Manual + Manual + + + + + Schedule + Schedule + + + + ControlTestWidget + + + Form + Form + + + + + Test Screen + Test Screen + + + + + Line test + Line test + + + + + + + + + + Red + Red + + + + + + + + + + Green + Green + + + + + + + + + + Blue + Blue + + + + + + + + + + White + White + + + + + Vertical + Vertical + + + + + Slash + Oblique line + + + + + + Horizontal + Horizontal + + + + + + + Speed + Speed + + + + + ms(>10) + + + + + + Line Distance + Line Distance + + + + px + px + + + + + + + + Test + Test + + + + + Gradation test + Gradation test + + + + + Only the gray value is displayed + Only the gray value is displayed + + + + (>10) + + + + + + GrayValue + Gray value + + + + (0-255) + + + + + + Color test + Color test + + + + + Gradient + Gradient + + + + 8 + 8 + + + + 2 + 2 + + + + 3 + 3 + + + + 6 + 6 + + + + 4 + 4 + + + + 5 + 5 + + + + 1 + 1 + + + + 9 + 9 + + + + 7 + 7 + + + + 0 + 0 + + + + + Clear + Clear + + + + + Reset + Loop + + + + + + + Anycast + Anycast + + + Gradient + Gradient + + + + + Stop + Stop + + + + + + + + + + + Tip + Tip + + + + + + + + NoSelectedController + Please select screen first + + + + + + StartTest + Start test + + + + + + + Success + Success + + + + + + + failed + failed + + + + StopTest + Stop test + + + + loopback mode + loopback mode + + + + Connect timeout + Connect timeout + + + + Reset loop mode + Reset loop mode + + + + + success + success + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + wDevicesItem OnProHttpResponse json error! + + + + ControlVerifyClockWidget + + + Form + Form + + + + Verify Clock Configuration + Verify clock configuration + + + + Verify to Computer time + Verify to Computer time + + + + + Cur time of controller + Cur time of controller + + + + LAN + LAN + + + + (min/time) + (min/time) + + + + Sync identificationCode + Sync identificationCode + + + + + identification code + identification code + + + + + Time offset(msec) + Time offset(msec) + + + + + Brightness + Screen Brightness + + + + + Volume + Volume + + + + + Screen on/off + Screen On/Off + + + + + Slave + Slave + + + + Master + Master + + + + + NTP Server + NTP Server + + + + + + + NTP Server address + NTP Server address + + + + + + + TimeZone + Time zone + + + + + + + + + + + + + Set + Set + + + + + Enable Synchronous playing + Enable Synchronous playing + + + + Lora + + + + + GPS + + + + + NTP + + + + Sync ime interval + Sync ime interval + + + + Time zone + Time zone + + + + + + + Sync time interval + Sync time interval + + + + Verify clock configuration + Verify clock configuration + + + + + + + + + + + + Readback + Readback + + + + Master + Master + + + + Sync clock to computer time + Calibrate clock to computer time + + + + Identification Code + Identification Code + + + + + + + + + + + + + + Success + Success + + + + + + + + + + + + + + failed + failed + + + + SetNtpServer + 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 + SyncTime + + + + GetNtpServer + GetNtpServer + + + + GetingSyncMethod + Geting Sync Method + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + SetTimezone + Set Timezone + + + + ControlVolumeManual + + + Form + Form + + + + Volume(0-15) + Volume(0-15) + + + + + + Readback + Readback + + + + SetVolume + Set Volume + + + + + + Success + Success + + + + + + failed + failed + + + + Volume(min:0-max:15) + Volume(min:0-max:15) + + + + GetVolume + Get Volume + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + wDevicesItem OnProHttpResponse json error! + + + + ControlVolumeSchedule + + + Form + Form + + + + Defalut volume tip + Reminder: the brightness within the fixed time period is displayed according to the timing brightness, and the default brightness value is not set for other time periods + + + + + Add + Add + + + + + Delete + Delete + + + + + Clear + Clear + + + + Default Volume + Default Volume + + + + (0-15) + + + + + + Import + Import + + + + + Export + Export + + + + + Apply + Apply + + + + Readback + Readback + + + + Volume value + Volume value + + + + Start Time + Start Time + + + + End Time + End Time + + + + SUN + SUN + + + + MON + MON + + + + TUE + TUE + + + + WED + WED + + + + THU + THU + + + + FRI + FRI + + + + SAT + SAT + + + + Default volume tip + Reminder: the display screen is the default brightness outside the fixed time period + + + + Default volume + Default volume + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + wDevicesItem OnProHttpResponse json error! + + + + 10 + 10 + + + + + Volume Schedule (*.vols) + + + + + Save File + Save file + + + + + Tip + Tip + + + + + NoSelectedController + Please select screen first + + + + SetAutoVolumeTask + Set volume schedule + + + + + Success + Success + + + + + failed + failed + + + + GetAutoVolumeTask + Get volume schedule + + + + ControlVolumeWidget + + + Form + Form + + + + + Volume Control + Volume Control + + + + + Manual + Manual + + + + + Schedule + Schedule + + + + DevicesControllWidget + + + Form + Form + + + + Current Screen: none + Current screen: + + + + Control your devices in this widget + + + + + + Clear + Clear + + + + + Current Screen: + Current screen: + + + + + single screen operation + single screen operation + + + + + none + none + + + + + Current Screen + Current screen + + + + Multi screen operation + Multi screen operation + + + + selected num + Selected number + + + + Downloader + + + + Updater + Updater + + + Software update + Software update + + + + X + X + + + + + + Downloading updates + Downloading updates + + + + Time remaining: 0 minutes + Time remaining: 0 minutes + + + + Open + Open + + + + + Stop + Stop + + + + + Time remaining + Time remaining + + + + unknown + unknown + + + + Error + Error + + + + Cannot find downloaded update! + Cannot find downloaded update! + + + + Close + Close + + + + Download complete! + Download complete! + + + + The installer will open separately + The installer will open separately + + + Click "OK" to begin installing the update + Click "OK" to begin installing the update + + + In order to install the update, you may need to quit the application. + In order to install the update, you may need to quit the application. + + + + In order to install the update + In order to install the update + + + + In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application + In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application + + + + Tip Info + Tip Info + + + + Click the "Open" button to apply the update + Click the "Open" button to apply the update + + + + Are you sure you want to cancel the download? + Are you sure you want to cancel the download? + + + + Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application + Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application + + + + + %1 bytes + + + + + + %1 KB + + + + + + %1 MB + + + + + of + アップデートのダウンロード + + + + Downloading Updates + Downloading Updates + + + + Time Remaining + Time Remaining + + + + Unknown + Unknown + + + + about %1 hours + about %1 hours + + + + about one hour + about one hour + + + + %1 minutes + %1 minutes + + + + 1 minute + 1 minute + + + + %1 seconds + %1 seconds + + + + 1 second + 1 seconds + + + + ImageCutWidget + + + Form + Form + + + + ImportBnInProgramDlg + + Dialog + Dialog + + + + InputPasswordDialog + + + Dialog + Dialog + + + + Input password + Input password + + + + Change Password + Change Password + + + + OK + Ok + + + + Cancel + Cancel + + + + LoAppTools + + + + + Select File + Select File + + + + + File name conflicted + File name conflicted + + + + LoColorSelector + + Select Color + Select Color + + + + LoDateSelector + + + Date selector + Date selector + + + + LoEmptyDialog + + + Dialog + Dialog + + + + TextLabel + + + + + LoQTitleBar + + + + + Minimize + Minimize + + + + + + Maximize + Maximize + + + + + + Close + Close + + + + Restore + Restore + + + + LoUIMsgBoxOk + + Dialog + Dialog + + + OK + Ok + + + + LoUIMsgBoxOkCancel + + + Dialog + Dialog + + + + TextLabel + + + + + OK + Ok + + + + Cancel + Cancel + + + + MainWindow + + DhcpTip + 1.This function is only used to connect to the termianl via Ethernet cable and the terminal is assignned with a dynamic IP address.\r\n2.Please turn off the firewall or turn on ICMP echo before you turn on DHCP.\r\n3.If the connection is unstable,set a static IP address for your PC + + + DHCP Service + DHCP Service + + + + + RJ45 Cable directly connected + RJ45 Cable directly connected + + + OFF + OFF + + + ON + ON + + + + + Check card + Detect + + + DhcpTip4 + 1.Turn this option on if the computer is connected directly to the LED control card using a RJ45 network cable + + + DhcpTip5 + 2.The IP address of the computer will be configured as static IP:192.168.0.88 + + + DhcpTip6 + 3.The IP address of the LED control card will be configured to 192.168.0.200 + + + + Tip Info + Tip Info + + + + RestoreLedCardIpByUdpTip + This operation will fix all the control cards in the LAN that are not in the same network segment as the computer IP. Please be careful! + + + + Tip + Tip + + + + No available network was detected + No available network was detected + + + Do you want set IP of cable network to DHCP + Do you want set the network to automatically get IP through DHCP + + + DhcpTip1 + 1.This function is only used to connect to the termianl via Ethernet cable and the terminal is assignned with a dynamic IP address + + + DhcpTip2 + 2.Please turn off the firewall or turn on ICMP echo before you turn on DHCP + + + DhcpTip3 + 3.If the connection is unstable,set a static IP address for your PC + + + + MainWndIcon + + + + + LedOK Express + LedOK Express + + + + NetComm + + + wDevicesItem OnProHttpResponse 解析json文件错误! + wDevicesItem OnProHttpResponse json error! + + + + 解析json文件错误! + json file error! + + + + PixbmpShowDialog + + + Dialog + Dialog + + + + X + X + + + + PublishForm + + + Form + Form + + + + + + TextLabel + + + + + X + X + + + + + + PushButton + PushButton + + + + QFfWidget + + + Form + Form + + + + QObject + + Setting up the Xanadu Express... + Setting up the Xanadu Express... + + + Setting up the Xanadu Express OK! + Setting up the Xanadu Express OK!Add app to firewall rule! + + + Setting up the Xanadu Express OK! +Add app to firewall rule... + Setting up the Xanadu Express OK!Add app to firewall rule... + + + + Setting up the LedOK Express... + Setting up the LedOK Express... + + + + Setting up the LedOK Express OK! + Setting up the LedOK Express OK! + + + + SendProgramDialog + + + Dialog + Dialog + + + + + Publish + Publish + + + + 口 + + + + + X + + + + + Program name + Program name + + + + success info + + + + + Refresh + Refresh + + + + Cancel + Cancel + + + + Program Name + Program name + + + + Screen ID + Screen ID + + + + Remark Name + Alias + + + + Online + Online + + + + Screen IP + Screen IP + + + + Screen Size + Screen Size + + + + Security + encryption + + + + Progress + Progress + + + + Remarks + Remarks + + + + All + ALL + + + + SoftConfigDialog + + + Dialog + Dialog + + + + Software Configuration + Software Configuration + + + + X + X + + + + Video convert format + Video transcoding + + + + Text antialiasing + Text antialiasing + + + + TextAntilaTip + (Note: this option is suitable for screens with small spacing and large size. If this option is selected, the shadow on the edge of the text will be smooth; it is not recommended for small size screens and single and double color screens.) + + + + GuangYinPin + Lora screen + + + + OK + Ok + + + + SpecialDlg + + + Dialog + Dialog + + + + Specify IP range + Specify IP range + + + + + Specify IP + Specify IP + + + + + Search + Search + + + + Cancel + Cancel + + + + X + + + + + + Attention + Attention + + + + Please input IP address! + Please input IP address! + + + + Your IP Address is Invalid! + IP Address is invalid! + + + + Success + Success + + + + Can't find this device IP + Can't find this device IP + + + + SubSpecifyIp + + + Form + Form + + + + Specify IP + Specify IP + + + + SubSpecifyIpRange + + + Form + Form + + + + Start IP + Start IP + + + + End IP + End IP + + + + ThreadSendPro + + + get readAckSempahore + + + + + open file failed + open file failed + + + send failed + send failed + + + socket error + socket error + + + + ThreadUpgradeApk + + open file failed + open file failed + + + send failed + send failed + + + Timeout + Timeout + + + + Uploadding + Uploadding + + + + TipDialog + + + Dialog + Dialog + + + + TextLabel + + + + + + OK + Ok + + + + + Cancel + Cancel + + + + X + + + + + + Import + Import + + + + + Path + Path + + + + + + : + + + + + + browse + Browse + + + + You will delete the selected solution(s),are you sure? + You will delete the selected solution(s),are you sure? + + + + + Save as + Save as + + + + + Export + Export + + + + + Done + Done + + + + + Solution Name + Solution Name + + + + + Progress + Progress + + + + Delete + Delete + + + + Select the network to connect to the device + Please select the network to connect to the LED controller + + + + Network name + Network name + + + + + This operation will only set cable network to static IP,are you sure? + This operation will only set cable network to static IP,are you sure? + + + + Do you want set IP of cable network to DHCP + Do you want set the network to automatically get IP through DHCP + + + + + + + + Tip + Tip + + + + + + Please select the network to connect to the Led controller + Please select the network to connect to the LED controller + + + + Choose Directory + Choose Directory + + + + The imported directory is already in the working directory, so there is no need to import it again! + The imported directory is already in the working directory, so there is no need to import it again! + + + + no find program can be imported + no find program can be imported + + + Export again + Export angin + + + + UpdateLedset3Dialog + + + Dialog + Dialog + + + + LedSet3.0 Update + LedSet3.0 Update + + + + X + X + + + + V1.0.0 + V1.0.0 + + + + Update + Update + + + + + CurVersion + CurVersion + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + + + + LatestVersion: + LatestVersion: + + + + Update log: + Update log: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + + + + Updater + + + Would you like to download the update now? + Would you like to download the update now? + + + + Would you like to download the update now? This is a mandatory update, exiting now will close the application + Would you like to download the update now? This is a mandatory update, exiting now will close the application + + + Version %1 of %2 has been released! + Version %1 of %2 has been released! + + + + No updates are available for the moment + No updates are available for the moment + + + + Congratulations! You are running the latest version of %1 + Congratulations! You are running the latest version of %1 + + + + UpdaterDialog + + + Dialog + Dialog + + + + Software Update + Software Update + + + + X + X + + + + V1.0 + + + + + Update + Update + + + + CurVersion + CurVersion + + + + LatestVersion: + LatestVersion: + + + + Update log: + Update log: + + + + The current version is already the latest version + The current version is already the latest version + + + + UpdaterFirmwareDialog + + + Dialog + Dialog + + + + Firmware Update + Firmware Update + + + + X + X + + + + V1.0 + + + + + Update + Update + + + + + CurVersion + CurVersion + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + + + + LatestVersion: + LatestVersion: + + + + Update log: + Update log: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + + + + UpgradeApkDialog + + + Dialog + Dialog + + + + Upgrade apk + Upgrade apk + + + + 口 + + + + + X + X + + + + Select apk + Select apk + + + + + Upgrade + Upgrade + + + + APK: + + + + + Uninstall + Uninstall + + + + check running state + check running state + + + + Select Fpga + Select Fpga + + + + success info + + + + + Refresh + Refresh + + + + Cancel + Cancel + + + + Screen ID + Screen ID + + + + Remark Name + Alias + + + + Online + Online + + + + Screen IP + Screen IP + + + + Security + encryption + + + + Progress + Progress + + + + xixunplayer + + + + + cardsystem + + + + + taxiapp + + + + + starter + + + + + connection + + + + + displayer + + + + + FPGA + FPGA + + + + update + + + + + State + State + + + Remarks + Remarks + + + + + All + ALL + + + + The encrypted control card can be upgraded directly + The encrypted control card can be upgraded directly + + + + apk package (*.rpd) + + + + + apk package (*.apk *.zip) + + + + + UsbDetectDialog + + + Form + Form + + + + Usb upgrade program + Usb upgrade program + + + + X + X + + + + Password + Password + + + + OK + Ok + + + + Input password + Input password + + + + + Tip + Tip + + + + No checked USB device + No checked USB device + + + + please select usb device in list + please select usb device in list + + + + UsbDiskFuncDialog + + + Dialog + Dialog + + + + Usb upgrade program + Usb upgrade program + + + + X + + + + + Path + Path + + + + Password + Password + + + + ... + + + + + OK + Ok + + + + Cancel + Cancel + + + + Input password + Input password + + + + Please select path for usb playback + Please select path + + + + Choose Directory + Choose Directory + + + + X_UIMsgBoxOk + + + Dialog + Dialog + + + + + TextLabel + + + + + X + + + + + OK + Ok + + + + Cancel + Cancel + + + + Sync + Sync + + + + install + Install + + + + Tip Info + Tip Info + + + + No found xixunplayer.apk,Do you want download it from internet? + No found xixunplayer.apk,Do you want download it from internet? + + + + X_UIMsgBoxOkCancel + + + Dialog + Dialog + + + + + TextLabel + + + + + X + + + + + OK + Ok + + + + Cancel + Cancel + + + + X_UIMsgBoxYesNoCancel + + + Dialog + Dialog + + + + + TextLabel + + + + + X + + + + + Yes + Yes + + + + No + No + + + + Cancel + Cancel + + + + eAClockAttr + + + Form + Form + + + Widget + Text + + + + Basic Properties + Basic properties + + + + Time Zone + Time Zone + + + + Custom Dial + Custom Dial + + + + Hour Mark + Hour Scale + + + + + Circular + Circle + + + + + Rectangle + Rectangle + + + + Number + Number + + + + + + + T + + + + + Min Mark + Minute Scale + + + + Hand Color + Hand Color + + + + H + + + + + M + + + + + S + + + + + s + s + + + + Date + Date + + + Custom Dial + Custom Dial + + + + Select + Select + + + + Text + Text + + + + Play + Playback Method + + + + Duration + Play Duration + + + + Select Dail file + Select dial file + + + + eDClock + + + + Y_ + - + + + + + M_ + - + + + + + D_ + - + + + + + + + + + + + + + + + / + / + + + + + + + + + + + + + + + - + - + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + MON + MON + + + + TUE + TUE + + + + WED + WED + + + + THU + THU + + + + FRI + FRI + + + + SAT + SAT + + + + SUN + SUN + + + + AM + AM + + + + PM + PM + + + + YEAR + - + + + + MONTH + - + + + + DAY + + + + + eDClockAttr + + + Form + Form + + + Widget + Text + + + + Basic Properties + Basic properties + + + + Time Zone + Time Zone + + + + Year + Year + + + + Month + Month + + + + Day + Day + + + + Hour + Hour + + + + Min. + Min. + + + + Sec. + Sec. + + + + Weekly + Day of the Week + + + + Full Year + 4-Digit Year + + + + 12-Hour + 12-Hour + + + + Morning / Afternoon + AM/PM + + + + Date Style + Date Format + + + + 1955年02月24日 + + + + + 1955年2月24日 + + + + + Time Style + Time format + + + + Display Style + Display style + + + + Multiline + Multiline + + + + T + + + + + Play + Playback Method + + + + Play Duration + Play Duration + + + + s + s + + + + eGif + + + Gif(*.gif) + + + + + eGifAttr + + + Form + Form + + + Widget + Text + + + + Basic Properties + Basic properties + + + + File + File + + + + ... + + + + + Play + Playback Method + + + + Play Duration + Play Duration + + + + s + s + + + + Play Times + Play Times + + + + eMovie + + + Movie(*.mp4 *.mkv *.rm *.rmvb *.avi *.wmv *.mov);;Flash(*.flv *.swf) + + + + + + + Convert video + Processing video + + + + + + Success + Success + + + + + + failed + failed + + + + Converting format + Converting format + + + + eMovieAttr + + + Form + Form + + + Widget + Text + + + + File + File + + + + ... + + + + + Play + Playback Method + + + + AspectRatioMode + + + + + IgnoreAspectRatio + + + + + KeepAspectRatio + + + + + KeepAspectRatioByExpanding + + + + + Play Duration + Play Duration + + + + Basic Properties + Basic properties + + + + Play Times + Play Times + + + + + Convert video + Processing video + + + + + Success + Success + + + + + failed + failed + + + + Converting format + Converting format + + + + eObjectAttr + + + GroupBox + + + + + Area + Area(px) + + + + X + + + + + Y + + + + + W + + + + + H + + + + + ePhoto + + + Images (*.png *.jpg *.jpeg *.bmp) + + + + + ePhotoAttr + + + Form + Form + + + Widget + Text + + + + File + File + + + + ... + + + + + Play + Playback Method + + + + Play Duration + Play Duration + + + Zoom out + ZOOM_OUT + + + Zoom out to left bottom + ZOOM_OUT_LEFT_BOTTOM + + + Zoom out to left top + ZOOM_OUT_LEFT_TOP + + + Zoom out to right top + ZOOM_OUT_RIGHT_TOP + + + Zoom out to right bottom + ZOOM_OUT_RIGHT_BOTTOM + + + + Play Times + Play Times + + + + Enter Style + Entrance Effect + + + + Basic Properties + Basic properties + + + + None + None + + + + Alpha_In + ALPHA_IN + + + Alpha Out + ALPHA_OUT + + + + Moving to left + MOVING_TO_LEFT + + + + Moving to right + MOVE_TO_RIGHT + + + Moving to right + MOVE_TO_RIGHT + + + + Moving to top + MOVING_TO_TOP + + + + Move to bottom + MOVE_TO_BOTTOM + + + + Zoom in + ZOOM_IN + + + + Rotate to right + ROTATE_TO_RIGHT + + + + Rotate to left + ROTATE_TO_LEFT + + + + + s + s + + + + Zoom in to left_bottom + ZOOM_IN_LEFT_BOTTOM + + + + Zoom in to left_top + ZOOM_IN_LEFT_TOP + + + + Zoom in to right_top + ZOOM_IN_RIGHT_TOP + + + + Zoom in to right bottom + ZOOM_IN_RIGHT_BOTTOM + + + + Enter Duration + Effect Duration + + + + Attention + Attention + + + + file( + file( + + + + ) is not exist + )is not exist + + + + Tip Info + Tip Info + + + + Effect time cannot be longer than duration time + Effect time cannot be longer than duration time + + + + eTemp + + + Temperature: + Temperature: + + + + Humidity: + Humidity: + + + + Noise: + Noise: + + + + Wind Speed: + Wind Speed: + + + + Wind Direction: + Wind Direction: + + + + PM25: + + + + + PM10: + + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + + + + + + + north + north + + + + + + + + + + east + east + + + + + + + + + + south + south + + + + + + + + + + west + west + + + + eTempAttr + + + Form + Form + + + Widget + Text + + + + Basic Properties + Basic properties + + + + Title + Title + + + + Temp. + Temperature + + + Temp. Compensation + Compensation + + + Temp. Type + unit + + + + ℃ + + + + + ℉ + + + + Custom Label + Custom text + + + + Temperature: + Temperature: + + + Fixed Text + Fixed text + + + + Compensation + Compensation + + + + Humidity + Humidity: + + + + %RH + + + + + Humidity: + Humidity: + + + + Wind speed + Wind speed + + + + m/s + + + + + Wind Speed: + Wind Speed: + + + + Wind direction + Wind direction + + + Wind Directon: + Wind Direction: + + + + Wind Direction: + Wind Direction: + + + + Noise + Noise + + + + dB + + + + + Noise: + Noise: + + + + PM2.5 + + + + + + μg/m³ + + + + + PM2.5: + + + + + PM10 + + + + + PM10: + + + + + Left + Left + + + + Center + Center + + + + Right + Right + + + + Single scroll + Single scroll + + + + Speed + Speed + + + + ms/pixel + ms/pixel + + + + T + + + + + window-background + Window background + + + + B + + + + + Play + Playback Method + + + + Refresh Cycle + Refresh cycle + + + + min. + min. + + + + Duration + Duration + + + + eText + + + Hello Text ! + Double click to enter your text! + + + + eTextAttr + + + Form + Form + + + Widget + Text + + + + T + + + + + S + + + + + B + + + + Letter Spacing + Kerning + + + Text + Text + + + + Basic Properties + Basic properties + + + + Font + Font + + + + Font-background + Background + + + + window-background + Window background + + + + Kerning + Kerning + + + + Line Spacing + Line Spacing + + + + PageCount: + PageCount: + + + + 1 + 1 + + + + page + Page + + + + Play + Playback Method + + + + Turning + Flip + + + + Rolling + scroll + + + + Static + Static + + + + eTextFlipAttr + + + Form + Form + + + + Play Duration + Play Duration + + + + + H:mm:ss + + + + Effect Speed + Effect Speed + + + Effect Duration + Effect Duration + + + + Effect time + effect duration + + + + s + s + + + + Entrance Effect + Entrance Effect + + + + no + no + + + + random + random + + + + right to lef + right to left + + + + bottom to top + bottom to top + + + + left to right + left to right + + + + top to bottom + top to bottom + + + + Duration/Page + Duration/Page + + + + + Tip Info + Tip Info + + + + + Effect time cannot be longer than duration time + Effect time cannot be longer than duration time + + + + eTextInput + + + Dialog + Dialog + + + + Text Edit + Text Edit + + + + Close + Close + + + + eTextScrollAttr + + + Form + Form + + + + Play Duration + Play Duration + + + + H:mm:ss + + + + + Head-Tail Connected + Head to Tail + + + + Head-Tail Spacing + Spacing + + + + Rolling Style + Direction + + + + Left -> Right + From left to right + + + + + Right -> Left + From right to left + + + + Top -> Bottom + Frome top to bottom + + + + Bottom -> Top + From bottom to top + + + + Rolling Speed + Scrolling speed + + + + eTextStaticAttr + + + Form + Form + + + + Play Duration + Play Duration + + + + H:mm:ss + + + + + eTimer + + + d + d + + + + h + h + + + + m + m + + + + s + s + + + + eTimerAttr + + + Form + Form + + + Widget + Text + + + + Basic Properties + Basic properties + + + + Forward + Count down + + + + Backward + Count up + + + + Date + End date + + + + yyyy-MM-dd + + + + + Time + End time + + + + HH:mm:ss + + + + + Day + Day + + + + Hour + Hour + + + + Min + Min. + + + + Sec + Sec. + + + + Text + Text + + + + Style + Display format + + + + Multiline + Multi-line + + + + T + + + + + B + + + + + Play + Playback Method + + + + Duration + Play duration + + + + s + s + + + + eWeather + + + Weather: + Weather: + + + + Temperature: + Temperature: + + + + Wind: + Wind: + + + + Humidity: + Humidity: + + + + Current Temperature: + Current Temperature: + + + + + Shower + + + + + + No Continuous, Range 4-5 + + + + + eWeatherAttr + + + Form + Form + + + Widget + Text + + + + Basic Properties + Basic properties + + + + Country + Country + + + + China + China + + + + America + America + + + + Province + Province + + + + City + City + + + + State + + + + + District + + + + + + Weather + Weather + + + + + Temp. + Temperature + + + + + Wind + Wind + + + + + Humidity + Humidity + + + + + Current Temp. + Current temperature + + + + Temp. Type + Temperature type + + + + + ℃ + + + + + ℉ + + + + + Temp. Unit + Temperature unit + + + + ° + + + + + Custom Label + Custom + + + + Weather: + Weather: + + + + Temperature: + Temperature: + + + + Wind: + Wind: + + + + Humidity: + Humidity: + + + + Current Temperature: + Current Temperature: + + + + Display Style + Display style + + + + Multiline + Multi-line + + + + Singleline(Scrolling) + Single line(Scrolling) + + + + Singleline(Static) + Single line(static) + + + + T + + + + + Play + Playback Method + + + + Refresh Cycle + Refresh cycle + + + + min. + min. + + + + Duration + Play duration + + + + s + s + + + + eWindow + + + 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 + + + + eWindowAttr + + + Form + Form + + + + Media List + Media List + + + + + + Text + Text + + + + + + Photo + Photo + + + + + + Movie + Movie + + + + + + Gif + Gif + + + + + + DClock + Clock + + + + + + AClock + Analog Clock + + + + Office + Office + + + + + Temp + + + + + + Weather + Weather + + + + Rss + RSS + + + + + Timer + Timer + + + + + Window + Window + + + + ColorText + ColorText + + + + mConverter + + + Preparing ... + Preparing ... + + + + Organizing resources ... + Organizing resources ... + + + + Create json ... + Create json ... + + + Zipped program ... + Zipped program ... + + + Zipped finished ... + Zipped finished ... + + + delete tmp dir ... + delete tmp dir ... + + + + Scan program ... + Scan program ... + + + + mDeviceManager + + + Form + + + + + + All + ALL + ALL + + + + + + Online + Online + Online + + + + + Unlogin + Unlogin + + + + + Offline + Offline + Offline + + + + Refresh + Refresh + Refresh + + + Flash + Refresh + + + + + Specify IP + Specify IP + Specify IP + + + + + devManager + + + + + devFlash + + + + + devFlashSpeciallyIP + + + + + bnFlashArrowItem + + + + + Screen ID + Screen ID + + + + Screen IP + Screen IP + + + + Screen Size + Screen Size + + + + Remark Name + Alias + + + + readback pic + LED screenshot + + + + send + send + + + SetBrightnessSensitivity + Set brightness sensitivity + + + SetBrightness + Set brightness + + + Brightness + Screen Brightness + + + Power + Power Status + + + + More Info + More Info + + + + Refresh + Refresh + Refresh + + + Specify IP + Specify IP + Specify IP + + + Online + Online + Online + + + All + All + ALL + + + Unlogin + Unlogin + Unlogin + + + Offline + Offline + Offline + + + + Cur Brightness + Screen Current Brightness + + + + Power Status + Power Status + + + + Security + encryption + + + + mDeviceSetting + + + Form + + + + + + Brightness Adjustment + Brightness Adjustment + + + + + Power Control + Power Control + + + + + Net Config + Network Configuration + + + + + Time Synchronization + Time Synchronization + + + + + Video source + Video source + + + + + Encrypt + Encrypt + + + + + Advanced parameters + Advanced parameters + + + + Volume + Volume + + + + + Test + Test + + + + + Lora + Lora + + + + Volume Adjustment + Volume Adjustment + + + Advance + Advanced Solutions + + + Control + Terminal Control + + + + mGuangYingPinWidget + + + Form + Form + + + + + Com + Com + + + + + Main + Main Device + + + + + + + PortName + Port Name + + + + + + + BaudRate + BaudRate + + + + + 1200 + 1200 + + + + + 2400 + 2400 + + + + + 4800 + 4800 + + + + + 9600 + 9600 + + + + + 19200 + 19200 + + + + + 38400 + 38400 + + + + + 57600 + 57600 + + + + + 115200 + 115200 + + + + + + + DataBit + DataBit + + + + + + 5 + 5 + + + + + + 6 + 6 + + + + + + 7 + 7 + + + + + + 8 + 8 + + + + + + + OEBit + OEBit + + + + + No + No + + + + + Even + + + + + + Odd + + + + + + Space + + + + + + Mark + + + + + + + + StopBit + StopBit + + + + + + 1 + 1 + + + + + + 2 + 2 + + + + + 1.5 + 1.5 + + + + + State:Close + State:Close + + + + + + + + + + + + Open + Open + + + + + Auxiliary + Auxiliary + + + + + Refresh + Refresh + + + Newwork + Network + + + + + Param configuration + Param configuration + + + + + Resend times + Resend times + + + + + Delay millsecond + Delay millsecond + + + + 3 + 3 + + + + 4 + 4 + + + + 9 + 9 + + + + + Clear + Clear + + + + + Debug + Debug + + + + + + 10 + 10 + + + + + Network + Network + + + + 11 + 11 + + + + 12 + 12 + + + + 13 + 13 + + + + 14 + 14 + + + + 15 + 15 + + + + 16 + 16 + + + + 17 + 17 + + + + 18 + 18 + + + + 19 + 19 + + + + 20 + 20 + + + + + Program number + Program number + + + + + Send + Send + + + Previous + Previous + + + Next + Next + + + + + Brightness + Screen Brightness + + + + + Set + Set + + + + + Screen Off + Screen Off + + + + Screen on + Screen On + + + + + + + + + + + State:Off + State:Off + + + + Screen On + Screen On + + + + + + + + + + + + + Close + Close + + + + + State:On + State:On + + + + + Tip + Tip + + + + + OpenPort COM failed + OpenPort COM failed + + + + mProgramManager + + + Form + + + + + + New + New + + + + + Edit + Edit + + + + + Delete + Delete + + + + + Import + Import + + + + + Export + Export + + + + + Send + Send + + + + Publish + Publish + + + + Name + Name + + + + Resolution + Resolution + + + + File Size + File Size + + + + Last Modify + Last Modified + + + + Usb playback + USB playback + + + + Program name conflicted + Program name conflicted + + + + You will delete the selected solution(s),are you sure? + You will delete the selected solution(s),are you sure? + + + + Tip Info + Tip Info + + + Import program successed + Import program successed + + + + mProgramManagerA + + + Form + + + + + + + New + New + + + + + + Edit + Edit + + + + + + Delete + Delete + + + + + + Import + Import + + + + + + + + Export + Export + + + Send + Send + + + + + Name + Name + + + + + Number + Solution Qty + + + + + File Size + File Size + + + + + Last Modify + Last Modified + + + + + + + + Publish + Publish + + + + mTabWidget + + + + Device + Termianls + + + + + Program + Solutions + + + + + GuangYinPin + Lora screen + + + + Advance + Advanced Solutions + + + + + Control + Terminal Control + + + + mTitleBar + + + + Setting + Setting + + + + + Language + Language + + + + + Check for updates + Check for updates + + + Check for firmware updates + Check for firmware updates + + + + + Software Configuration + Software Configuration + + + + 中文 + + + + + 中文繁体 + + + + + 日本語 + + + + Update + Update + + + + + Help + Help + + + + + firmware manager + Firmware management + + + + + About + About + + + Chinese + Chinese + + + + English + English + + + Japanese + Japanese + + + + wAttrView + + + TabWidget + + + + + + 页 + Page + + + Element + Element + + + + widget properties + Widget properties + + + + Page properties + Program properties + + + + wDevicesItem + + GetCardDetailInfoButtonTip + Get more detail info + + + + + GetScreenDetailInfo + Get more detail info + + + + + ReadbackPic + Screenshot + + + + GetScreenshotFull + readback screenshot + + + + cur brightness: + Current Brightness: + + + + android version: + Android Version: + + + + IMEI: + + + + + HardWard Version: + FPGA Version: + + + + MAX Brightness level: + Brightness Level: + + + + Android OS Resolution: + Android OS Resolution: + + + + Firmware Version: + Firmware Version: + + + + Player Version: + Player firmware version: + + + Xixun player cur version: + Cur player firmware version: + + + + + you can click sync firmware button to lastest version + You can click the sync firmware button to store the version on your computer + + + + + + + Detail Info + Detail Info + + + + No install xixunplay apk firmware! + No install xixunplay apk firmware! + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + receive + Receive + + + + SetScreenOn + Set power + + + + AliIotSetting + + + + + + GetScreenStatus + GetScreenStatus + + + + + Status + Status + + + + DHCP IP + DHCP IP + + + + STATIC IP + STATIC IP + + + + Tip Info + Tip Info + + + + password is wrong + password is wrong + + + + GetBrightness + Get brightness + + + + + + + brightness + brightnenss + + + IsMasterSlave + Read back the identity of master and slave + + + + MasterSlaveSwitch + Configure master slave identity + + + + SetBrightness + Set brightness + + + + + SetMinBrightness + Set min brightness value + + + + GetBrightnessSensitivity + Get brightness sensitivity + + + + sensitivity + sensitivity + + + + + GetMinBrightness + Get min brightness + + + Tip + Tip + + + no sensorBrightnessTable + no sensor brightnessTable in controller + + + Tab + Table + + + + SetSensorBrightnessTable + SetSensorBrightnessTable + + + + SetSwitchWiFi + Set WiFi on/off + + + + ConfigurationWiFi + Configuration WiFi + + + + ConfigurationHotSpot + Configuration AP HotSpot + + + + GetSwitchWiFi + GetSwitchWiFi + + + + SetAutoBrightnessTask + Send brightness schedule table + + + + SetAutoVolumeTask + Set volume schedule + + + + SetVolume + Set Volume + + + + GetVolume + Get Volume + + + + SetTimingScreenTask + Set schedule task of screen power + + + + GetControllerDate + Get date time + + + + SetHighForBusy + Set level for busy + + + + + GetStateForBusy + Get level of busy + + + + Service:Low Out of service:High + Service:Low Out of service:High + + + + Service:High Out of service:Low + Service:High Out of service:Low + + + + + + IsPortableHotSpot + Get AP or WiFi + + + + WifiName + WifiName + + + + ApName + Ap Name + + + + SetScreenSize + Set Screen Size + + + + TestScreen + Test screen + + + + SetOnlineAddr + Set Web server address + + + + SetRealtimeServer + Set realtimer address + + + + GetOnlineAddr + Get web server address + + + + GetRealtimeServer + Get realtime server address + + + + SetNtpServer + SetNtpServer + + + + GetNtpServer + GetNtpServer + + + + SyncTime + SyncTime + + + + DelPrograms + Clear program + + + + SetingSyncMethod + Set sync method + + + + GetCurrentSensorBrightness + Get Current Brightness + + + + Cur brightness + Cur brightness + + + + SetSpecialResolution + Set Special Resolution + + + + GetSpecialResolution + Get Special Resolution + + + + totalResolution + FPGA total resoltuion + + + + strCurDisplayResolution + Cur display resolution + + + + CleanDisplayScreenSize + Restore to default relolution + + + + SetMaxBrightness + Set maximum brightness value + + + + GetMaxBrightness + Get maximum brightness + + + + + screenSwitch + Switch Screen + + + + + + YES + On + + + + + + NO + Close + + + + Connect + Connect + + + + timeout + timeout + + + + Anycast + Anycast + + + + + + volume + Volume + + + + + + + GetingSyncMethod + Geting Sync Method + + + + identificationCode + Identification Code + + + + delaySync + Time offset + + + + msec + msec + + + + + + OtherSyncItem + Other sync items + + + + + + lastSynchronousTime + Last Synchronous Time + + + + checkNtpTime + Synchronization interval + + + + install start... + Start installation... + + + + not found xixunplayer.apk in computer: + not found xixunplayer.apk in computer: + + + + UpgradeSoftware + Upgrade firmware + + + + Uploadding + Uploadding + + + + + Success + Success + + + + + failed + failed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + success + success + + + + + Lora identity + Lora identity + + + + Master + Master + + + + Slave + Slave + + + + SetBrightnessSensitivity + Set brightness sensitivity + + + + + + on + ON + + + + + + off + OFF + + + + wDrawingBoard + + + Zoom In + Zoom In + + + + Zoom Out + Zoom Out + + + + Original size + Origianl Size + + + + Delete the secect media + Delete the seleted media + + + Clear + Clear all media + + + Cut + Cut + + + + Clear all media + Clear all media + + + + Cut media + Cut media + + + + Move layer up + Move layer up(shortcut key PgUp) + + + + Send backward + Send backward(shortcut key PgDn) + + + + Bring to front + Bring to front(shortcut key home) + + + + Move to the bottom layer + Move to the bottom layer(shortcut key end) + + + + Fill the entire screen + Fill the entire screen + + + + Fill the screen horizontally + Fill the screen horizontally + + + + Fill the screen vertically + Fill the screen vertically + + + + Align top + Align up + + + + Center vertically + Center vertically + + + + Bottom align + Bottom up + + + + Align left + Align left + + + + Center horizontally + Center horizontally + + + + Align right + Align right + + + + Tip Info + Tip Info + + + + Clear all medias? + + + + + wEditProgram + + + MainWindow + + + + Saving + Saving + + + Saving success + Save success + + + + Tip Info + Tip Info + + + + Do you want to save the modifications? + Do you want to save the modifications? + + + + + Saving... + Saving... + + + + + Success + Success + + + + + Save failed + Save failed + + + + Convertering + Convertering + + + + Converter Successed + Converter Successed + + + + Converter TimeOut + Converter TimeOut + + + + Generate preview data + Generate preview data + + + + Ready + Ready + + + + Generate TimeOut + Generate TimeOut + + + + Tip + Tip + + + + Waring + + + + + wExportProgramItem + + + Tip Info + Tip Info + + + + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? + + + + wMainToolBar + + + save + Save + + + + Save as + Save as + + + + Setting + Setting + + + + Text + Text + + + + Photo + Photo + + + + Video + Video + + + + Gif + Gif + + + + Clock + Clock + + + + Analog Clock + Analog Clock + + + + Audio + Audio + + + + MuliContentWindow + Multi material window + + + + In this window, a plurality of different program materials can be added and played according to the order of joining the list; + In this window, a plurality of different program materials can be added and played according to the order of joining the list + + + + Stop preview + Stop + + + Office + Office + + + + Environment + Environmental Monitoring + + + Weather + Weather + + + Rss + RSS + + + Timer + Timer + + + Colorful Word + Colorful Word + + + Window + Window + + + + + + Preview + Preview + + + + Publish + Publish + + + + wNewProgram + + + Dialog + Dialog + + + Name + Name + + + + Resolution + Resolution + + + + Solution Information + Solution Information + + + + X + X + + + + Solution Name + Solution Name + + + + Width + Width + + + + Height + Height + + + + Remarks + Remarks + + + + OK + Ok + + + + Cancel + Cancel + + + New + New + + + + wPageAttr + + + Form + Form + + + + Page name + Program name + + + + Play times + Play times + + + + Valid Date + Valid date + + + + Start + Start + + + + + yyyy-MM-dd + + + + + End + End + + + + Plan + Plan + + + + New + New + + + + + The end time can not be earlier than the start time + The end time cannot be earlier than the start time + + + + wPageItemWidget + + + Form + Form + + + + times + Times + + + + wPageList + + + Add page + Add page + + + + Copy page + Copy page + + + Delete + Delete + + + + Delete page + Delete page + + + + Move up + Move up + + + + Move down + Move down + + + + program + Program LIs + + + + + Tip Info + Tip Info + + + + Are you sure you want to delete this program page? + Are you sure you want to delete this program page? + + + New + New + + + + wPlanItem + + + Form + Form + + + Weekly + Every week: + + + + 1 + 1 + + + + Every week: + Every week: + + + + M + M + + + + Tu + Tu + + + + W + W + + + + Th + Th + + + + F + F + + + + Sa + Sa + + + + Su + Su + + + + wProgramItem + + + + ExportButtonTip + USB playback + + + + + SendButtonTip + Publish + + + + + Convertering + Convertering + + + + USB Export Successed + USB disk exported successfully + + + + USB Export TimeOut + USB disk export failed + + + + Converter Successed + Converter Successed + + + + Converter TimeOut + Converter TimeOut + + + + wProgramPublishItem + + + This screen is encrypted + This screen is encrypted + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Tip Info + Tip Info + + + + password is wrong + password is wrong + + + + wUpgradeApkItem + + + uninstalling + Uninstalling + + + + + IsSoftwareRunning + Check apk running status + + + + + This screen is encrypted + This screen is encrypted + + + + + Start upgrading + Start upgrade + + + Uploadding + Uploading + + + + + Timeout + Timeout + + + + install start... + Start installation... + + + + + SynchronousHardwareVersion + Sync FPGA + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + wDevicesItem OnProHttpResponse json error! + + + + Tip Info + Tip Info + + + + password is wrong + password is wrong + + + + + UninstallSoftware + Uninstall + + + + + Success + Success + + + + Running + Running + + + + NoRunning + Not running + + + + install success + Install success + + + + + Fail + Fail + + + + x_uiMsgBoxOnlyCloseBtn + + + Dialog + Dialog + + + + TextLabel + + + + + X + X + + + diff --git a/LedOK/Languages/jaJP.qm b/LedOK/Languages/jaJP.qm new file mode 100644 index 0000000000000000000000000000000000000000..9d5a20a7fbeb825fd15094f9e8e392dcb14b22d8 GIT binary patch literal 110226 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 literal 0 HcmV?d00001 diff --git a/LedOK/Languages/jaJP.ts b/LedOK/Languages/jaJP.ts new file mode 100644 index 0000000..4e09ead --- /dev/null +++ b/LedOK/Languages/jaJP.ts @@ -0,0 +1,9605 @@ + + + + + AboutDlg + + + Dialog + ダイアログ + + + + About + 当ソフトウェアについて + + + + X + X + + + + LedOK Express + LedOK Express + + + + V20200429 + + + + + <a href="https://www.ledok.cn/">www.ledok.cn + + + + + ChangePasswordForm + + + Form + リフレッシュ + + + + Old password + 古いパスワード + + + + New password + 新しいパスワード + + + + Repeat again + 再び繰り返す + + + + OK + 確定 + + + + Cancel + キャンセル + + + + + + + + + + Tip + 提示 + + + + Please input old password + 古いパスワードを入力してください + + + + Old password is wrong + 古いパスワードが間違っている + + + + + Please enter a password with more than 6 characters + 6文字以上のパスワードを入力してください + + + + The new password is not consistent in two times + 新しいパスワードは2回で一貫していません + + + + Please enter a new password + 新しいパスワードを入力してください + + + + Password changed successfully + パスワードが正常に変更 + + + + ColorDialog + + + ColorDialog + + + + + Tone(H): + + + + + Saturation(S): + + + + + Brightness(V): + + + + + 度 + + + + + Basic color + 基本色 + + + + Custom color + 色をカスタマイズ + + + + # + + + + + Add to custom + カスタム色を追加 + + + + Blue(B): + 青: + + + + Green(G): + 緑: + + + + Red(R): + 赤: + + + + transparency: + 透明度: + + + + Cur color + 現在の色 + + + + New color + 新しい色 + + + + Ok + 確定 + + + + Cancel + キャンセル + + + + Select color + 色を選択 + + + + ControlAdvParamWidget + + + Form + リフレッシュ + + + + + Advanced parameters + 上級パラメータ + + + + + LED Screen Width(pixel): + 画面の画面幅(ピクセル): + + + + + Width + + + + + + Height(pixel): + 高さ(ピクセル): + + + + + Height + 高さ + + + + + + + + + + + + + + + Set + セット + + + + + Alias + 別名 + + + + + Web Server Address: + Webサーバのアドレス: + + + + www.m2mled.net + + + + + www.ledaips.com + + + + + https://www.taxihub.cn:2340 + + + + + https://www.ledaips.com:2340 + + + + + https://www.36taxi.com:2340 + + + + + www.tlzxled.com + + + + + Company ID: + 会社ID: + + + + Input Company ID + 会社IDを入力します + + + + + Realtimer Server Address: + Realtimerアドレス: + + + + + Input Realtimer Server Address + Realtimerサーバのアドレスを入力します + + + + + Clear + クリア + + + + + + Apk upgrade + APKアップグレード + + + + + Check Apk + APKを検出 + + + + + Uninstall + アンマウント + + + + + Running check + 運転状態モニタ + + + + FPAG Upgrade + FPGAアップグレード + + + + + FPGA version check + FPGAバージョンクエリ + + + + + Sync FPGA version + 同期FPGAバージョン + + + + + Restart led controller system + 再起動 + + + + + Check Log + ログを見る + + + + Open ADB + ADBデバッグ機能を開く + + + + Post custom json + Post custom json + + + + + Clear Program + 番組をクリア + + + + + M80 configuration + M 80の設定 + + + + + Refresh + 更新 + + + + + Restore to default + 標準の値を復元 + + + + + Taxi top screen configuration + タクシートップ画面の設定 + + + + + Service:High Out of service:Low + 客がいます:高 客がいません:低 + + + + + Service:Low Out of service:High + 客がいます:低 客がいません:高 + + + + + Start LedSet3.0 configure LED module + LedSet 3.0を使ってLEDモジュールを配置する(メーカーの専門家が使用する) + + + + Bind *.ic Certificate + テーピングtaxihubプラットフォームのユーザーID証明書 + + + + Binding *.ic account indentity voucher + テーピングtaxihubプラットフォームのユーザーID証明書 + + + + + Rotate + 回転 + + + + + 0 degrees + 0度 + + + + + 90 degrees + 90度 + + + + + 180 degrees + 180度 + + + + + 270 degrees + 270度 + + + + + Min brightness + 最低輝度 + + + + 1 + 1 + + + + + (min:1) + (最小:1) + + + + + + + + + Readback + 読み戻し + + + + + + + + Send + 送信 + + + + + Max brightness + 最高輝度 + + + + 255 + 255 + + + + + (max:255) + (マックス:255) + + + + SetScreenSize + スクリーンのピクセルサイズを設定 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Success + 成功 + + + + Compant ID: + 会社ID: + + + + FPGA Upgrade + FPGAアップグレード + + + + Compant ID + 会社ID + + + Input password + パスワードを入力 + + + + InputWebServerAddressTip + Webサーバのアドレスを入力してください + + + + InputCompanyIdTip + 会社IDを入力してください + + + + Do you want to modify webserveraddress and companyId? + 設定サーバアドレスと会社IDを確認しますか? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + failed + 失敗 + + + + SetOnlineAddr + ウェブサーバのアドレスを設定 + + + + ClearRealtimeServer + クリア + + + + InputRealTimeAddressTip + RealTimerアドレスを入力してください + + + + SetRealtimeServer + RealTimerアドレスを設定 + + + + + + + + + + Tip Info + ヒント + + + Do you want to save the modifications? + 変更された内容を保存してもよろしいですか? + + + + + + + + + Can not find LedSet3.0.exe,down you need download and install it + LEDSET 3.0 . exeを見つけることができません。ダウンロードしてインストールする必要があります + + + + RestartAndroid + 再起動 + + + + FPGA Version + FPGAバージョン + + + + running + 実行中 + + + + no running + 実行されていません + + + + version + バージョン + + + + CheckSoftVersions + チェックAPKバージョン + + + + UninstallSoftware + アンマウント + + + + IsSoftwareRunning + APK運転状態監視 + + + + apk package (*.rpd) + + + + + CheckHardwareVersions + お問い合わせFPGAバージョン + + + + + + SynchronousHardwareVersion + ハードウェアバージョンの同期 + + + + Check Screen untile fpga update finished + 画面のアップグレードの進捗を確認します + + + + OpenAdb + ADBデバッグ機能を開く + + + + indentity voucher (*.ic) + 身分証明書(*.ic) + + + + + InvokeTaxiAppFunction + 証明書をバインド + + + + Json format is error! + + + + + + AliIotSetting + + + + SetTaxiServer + taxihubサーバを設定します + + + DelPrograms + 番組をクリア + + + + apk package (*.apk *.zip) + + + + + + UpgradeSoftware + ファームウェアをアップグレードする + + + + This screen is encrypted,Please decrypt and upgrade APK! + この画面は、暗号化され、復号化し、アップグレードAPK! + + + + + + + SetScreenRotation + 画面の回転を設定する + + + + SetMinBrightness + 最小輝度値を設定します + + + + SetMaxBrightness + 輝度最大値を設定 + + + + GetMinBrightness + 輝度最小値を取得 + + + + GetMaxBrightness + 輝度最大値を取得 + + + + SetSpecialResolution + 解像度を設定 + + + + GetSpecialResolution + 読み込み解像度 + + + + CleanDisplayScreenSize + デフォルトの解像度を復元 + + + + SetHighForBusy + 客レベルの設定 + + + + GetStateForBusy + ゲストレベルを取得 + + + + install start... + インストールを開始します... + + + + InputAliasTip + エイリアスを入力してください + + + + SetCardAlias + エイリアスの設定 + + + + Clear program successed! + プログラムクリア成功 + + + + Clear program failed! + プログラムのクリアに失敗しました + + + + Clear program timeout! + 番組クリアタイムアウト + + + + Uploadding + アップロード + + + + + + + + + + + + + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + InputWidthTip + 正しい幅のピクセル値を入力してください + + + + InputHeightTip + 正しい高さのピクセル値を入力してください + + + Can not find LedSet3.0.exe,please install it first! + LEDSET 3.0 . exeを見つけることができません、最初にそれをインストールしてください! + + + + Password is error + パスワード + + + GetScreenSize + スクリーンのピクセルサイズを取得 + + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + jsonファイルの解析エラー! + + + + ControlBrightnessAutoWidget + + + Form + リフレッシュ + + + + + Sensitivity + 感度 + + + + Minimum Brightness + 最小輝度 + + + + (1~100) + + + + + (1~255) + + + + + + + + Set + セット + + + + + Cur brigntness:0 + カールの明るさ:0 + + + + + Refresh + 更新 + + + + + + + + + Readback + 読み戻し + + + + R60 + + + + + RL1 + + + + + Upload file + ファイルのアップロード + + + + When uploading files, you can only select the card of the same sensor; otherwise it will fail! + ファイルをアップロードする時、正しいセンサータイプを選択してください。でないと、無効です。 + + + + 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 80 or above, otherwise the brightness will be low. + 最大輝度が64であるならば、最小の明るさは1または適切な値として構成されることができます;最大の明るさが255であるならば、最小の明るさは80かそれ以上として構成されなければなりません、さもなければ、明るさは低くなります。 + + + + BrightnessTip1 + 最大輝度が64であるならば、最小の明るさは1または適切な値として構成されることができます;最大の明るさが255であるならば、最小の明るさは80かそれ以上として構成されなければなりません、さもなければ、明るさは低くなります。 + + + + BrightnessTip2 + ファイルをアップロードする時、正しいセンサータイプを選択してください。でないと、無効です。 + + + + Minbrightness + 最小輝度 + + + + Upload + ファイルのアップロード + + + + ReadbackTable + 読み戻し + + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + MinBrightnessInputTip + 正しい最小輝度値を入力してください + + + + SetMinBrightness + 最小輝度値を設定します + + + + SensitivityInputTip + 正しい感度値を入力してください + + + + SetBrightnessSensitivity + 輝度センサ感度を設定する + + + + + NeedSelectSensorTypeTip + センサータイプを選択してください + + + + SensorBrightnessTable + 輝度センサ設定テーブルの設定 + + + + GetMinBrightness + 輝度最小値を取得 + + + + GetBrightnessSensitivity + 明るさ感を得る + + + + GetSensorBrightnessTable + センサーブライトテーブル + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Cur brightness + カールの明るさ + + + + Save file + 保存 + + + + no sensorBrightnessTable + コントロールカードに輝度設定表が見つかりませんでした + + + + GetCurrentSensorBrightness + 現在の明るさを取得する + + + + + + + + + + + Success + 成功 + + + + + + + + + + + failed + 失敗 + + + + ControlBrightnessManualWidget + + + Form + リフレッシュ + + + + + Y10/E10/E06:1(min)~64(max); M90/Y30/E60/Y60:1(min)~256(max) + + + + + + Readback + 読み戻し + + + + + Brightness value + 輝度値 + + + + + Set + セット + + + + + + Tip + 提示 + + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + ManualBrightnessInputTip + 明るさを手動で調整する + + + + SetBrightness + 輝度を設定する + + + + + Success + 成功 + + + + + failed + 失敗 + + + + GetBrightness + 輝度値を取得 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlBrightnessSchedule + + + Form + リフレッシュ + + + + + Default brightness + 標準の明るさ + + + + + Default brightness tip + ヒント:この設定時間内は明るさを設定し、設定時間外はデフォルトの明るさとなります。例えば、デフォルトの輝度を80とし、設定輝度は180とし、時間範囲は8:00〜17:00とすると、時間範囲は180となり、他の時間はデフォルトの輝度80となる。 + + + + + Add + 追加 + + + Edit + 編集 + + + + + Delete + 削除 + + + + + Clear + クリア + + + + + Import + インポート + + + + + Export + 出力 + + + + + Apply + 適用 + + + + + Readback + 読み戻し + + + + BrightnessValue + 輝度値 + + + + Start Time + 開始時間 + + + + End Time + 終了時間 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + BrightnessSchedule (*.bjs) + + + + + Save File + 保存 + + + + + Tip + 提示 + + + + DefaultInputTip + デフォルトの明るさの値を入力してください + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + SetAutoBrightnessTask + 送信タイミング輝度表 + + + + + Success + 成功 + + + + + failed + 失敗 + + + + GetAutoBrightnessTask + 取得タイミング輝度表 + + + + ControlBrightnessScheduleEdit + + + Dialog + ダイアログ + + + + Schedule Item + 時間を決める + + + + X + X + + + + Brightness Value + 輝度値 + + + + Start time + 開始時間 + + + + End time + 終了時間 + + + + 255 + 255 + + + + Add + 追加 + + + + Cancel + キャンセル + + + + ControlBrightnessWidget + + + Form + リフレッシュ + + + + + Brightness Configuration + 輝度の設定 + + + + + Auto + 自動 + + + + + Manual + 手動 + + + + + Schedule + スケジュール + + + + ControlEncryptWidget + + + Form + リフレッシュ + + + + + Entrypt Configuration + セキュリティ設定 + + + + Original password + 元のパスワード + + + + + + original password + 元のパスワード + + + + + + New password + 新しいパスワード + + + + + Repeat new password + 繰り返し入力 + + + + + + + Set encryption + 暗号化 + + + + + Cancel encryption + 暗号化を解除 + + + + + Enter password + パスワードを入力 + + + + Enter again + 再入力 + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + + InputOriginalPasswordTip + オリジナルのパスワードを入力してください + + + + InputNewPasswordTip + 新しいパスワードを入力してください + + + + InputRepeatPasswordTip + 新しいパスワードを繰り返して入力してください + + + + InputRepeatPasswordNotSameTip + 二回入力したパスワードが一致しません + + + + Tip Info + ヒント + + + + After setting the password, please remember the password and record it. If you forget the password, the device will be unable to operate. Are you sure you want to continue with this operation? + パスワードを設定した後、パスワードを覚えて、それを記録してください。パスワードを忘れた場合は、デバイスが動作することができなくなります。この操作を続行しますか? + + + + + SetControllerPassword + 暗号化の設定 + + + + Readback + 読み戻し + + + + + + Success + 成功 + + + + + + failed + 失敗 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + Modify password + パスワードを変更 + + + + OriginalPasswordErrorTip + 元のパスワードが間違っています + + + + ControlHdmiManual + + + Form + リフレッシュ + + + + + HDMI IN + HDMI IN + + + + Program In controller + 番組を内蔵する + + + + + + Readback + 読み戻し + + + + Async + アシュリン + + + + Tip + 提示 + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + + SyncSwitch + スイッチのビデオソースをHDMI-IN + + + + + AnSyncSwitch + 異ステップモードを切り替え + + + + IsSync + 同じ非同期モードを読み返す + + + SetHdmiIn + HDMIに切り替え + + + + + + + Success + 成功 + + + on + オン + + + + + + + failed + 失敗 + + + off + オフ + + + IsHdmiIn + 読み返し入力元 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlHdmiSchedule + + + Form + リフレッシュ + + + + + Add + 追加 + + + Edit + 編集 + + + + + Delete + 削除 + + + + + Clear + クリア + + + + + Import + インポート + + + + + Export + 出力 + + + + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period + 非同期のコンテンツをデフォルトで再生し、同期のHMI-INポートに入力します + + + + + Apply + 適用 + + + + Readback + 読み戻し + + + + SYNC HDMI + HDMI-IN + + + + Start Time + 開始時間 + + + + End Time + 終了時間 + + + + SUN + 日曜日 + + + + MON + 月曜日 + + + + TUE + 火曜日 + + + + WED + 水曜日 + + + + THU + 木曜日 + + + + FRI + 金曜日 + + + + SAT + 土曜日 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + 開く + + + + SyncSchedule (*.syncs) + + + + + Save File + 保存 + + + + Sync Schedule (*.syncs) + + + + + + Tip + 提示 + + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + SetTimingHdmiInTask + 同期モードタイミングタスクの設定 + + + + GetTimingHdmiInTask + 同期モードタイミングタスクの取得 + + + SetTimingScreenTask + 画面タイミングスイッチタスクの設定 + + + + + Success + 成功 + + + + + failed + 失敗 + + + GetTimingScreenTask + 画面タイミングスイッチタスクの取得 + + + + ControlHdmiWidget + + + Form + リフレッシュ + + + + + HDMI Configuration + ビデオソースの設定 + + + + + Manual + 手動 + + + + + Schedule + スケジュール + + + + ControlNetConfigWidget + + + Form + リフレッシュ + + + + Wire Enther(RJ45) Configuration + 有線ネットワークの設定 + + + + + DHCP + + + + + + Specify IP + 指定IP + + + + + IP Address + IPアドレス + + + + Mask Address + サブネットマスク + + + + + Gateway + ゲートウェイ + + + + + DNS Address + DNSアドレス + + + + + + + + + + + Set + セット + + + + + + + + + + Readback + 読み戻し + + + + + WIFI Configuration + WiFiの設定 + + + + + WiFi On/Off + WiFi機能 + + + + Input Ap name + 入力AP名 + + + + + 4G/5G Configuration + セルラーデータ構成 + + + + + Open 4G/5G + セルラーデータを有効にする + + + + APN: + + + + + Get cellular network status information + セルラーネットワーク状態情報を取得する + + + + + Check SIM can automatically match to MCC, and then select carrier get apn param,if not found carrier,you can check the CUSTOM checkbox,then enter custom param. + チェックシムは自動的にMCCに一致することができますし、キャリアー取得APNパームを選択し、キャリアが見つからない場合は、カスタムチェックボックスをチェックし、カスタムパームを入力します。 + + + Readback Apn Info + APN情報を読み返す + + + + + Readback APN Info + APN情報を読み返す + + + + + Set Apn Info,Check SIM can automatically match to MCC, and then select carrier get apn param + APN情報を設定する + + + + + CUSTOM + カスタム + + + + + Check SIM + SIM情報の照会 + + + + + + -> + + + + + + Country ID(mcc): + 国号(mcc): + + + + + Carrier Name + 運営者 + + + + + APN: + キャリアAPN: + + + + + APN(Required) + APN(必ず記入) + + + + + User: + ユーザ名: + + + + + + + Not required + 必要でない + + + + + Password: + パスワード: + + + + Set Apn:iot.cargo + + + + Timezone: + タイムゾーン: + + + + + Flight Mode + 飛行モード + + + + + WiFi name + WiFiの名前 + + + + + + + Password + パスワード + + + + + + + Input password + パスワードを入力 + + + + + Scan + スキャン + + + + + Ap Mode + APエネルギー + + + + Ap name + APの名前 + + + + OFF + オフ + + + + ON + オン + + + + AP name + AP名 + + + + Subnet mask + サブネットマスク + + + + Input ap name + APの名前を入力 + + + + + + + + + + + + + + + + + + + + Success + 成功 + + + + + + + + + + + + + + + + + + + + failed + 失敗 + + + + + + + Tip + 提示 + + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + + SetEthernet + 有線網を設置する + + + + + + + + + + + Attention + 注意 + + + + Please input IP address! + IPアドレスを入力してください! + + + + Your IP Address is Invalid! + IPアドレスが無効です! + + + + Please input Mask address! + サブネットマスクの住所を入力してください! + + + + Your Mask Address is Invalid! + マスクアドレスが無効です! + + + + Please input Gateway address! + ゲートウェイのアドレスを入力してください! + + + + Your Gateway Address is Invalid! + ゲートウェイアドレスが無効です! + + + + Please input DNS address! + DNSアドレスを入力してください! + + + + Your DNS Address is Invalid! + DNSアドレスを入力してください! + + + + GetEthernet + 有線ネットワークの設定を取得 + + + + SetSwitchWiFi + WiFiスイッチの設定 + + + + + + + + + SignalPower + 信号強度 + + + + + ConfigurationWiFi + WiFiの設定 + + + + IsPortableHotSpot + ホットスポットとWiFiモードの取得 + + + + GetWifiList + スキャンWiFi + + + + ConfigurationHotSpot + ホットスポットの設定 + + + + GetCurrentAPN + APN情報の取得 + + + + + GetSIMStatus + SIM状態を取得 + + + + + SetAPN + APNの設定 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + 状态: + 状態: + + + + + 未知 + 不明 + + + + 锁定状态,需要用户的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 + いいえ + + + + 数据连接状态: + データ接続状態: + + + + 断开 + 切断 + + + + 正在连接 + 接続中 + + + + 已连接 + 接続済み + + + + 暂停 + 一時停止 + + + + 数据活动休眠状态: + データアクティビティの休止状態: + + + + 活动,但无数据发送和接收 + アクティブですが、データ送信と受信はありません + + + + 活动,正在接收数据 + アクティブ、データ受信中 + + + + 活动,正在发送数据 + イベント、データ送信中 + + + + 活动,正在接收和发送数据 + イベント、データ受信と送信中 + + + + 休眠状态 + スリープ状態 + + + + 信号强度: + 信号の強度: + + + + SetSwitchSimData + 4G/5Gスイッチの設定 + + + SetTimezone + タイムゾーンを設定 + + + + ContrFlightMode + 飛行モードの設定 + + + + GetFlightModeState + 飛行モード状態を取得 + + + + ControlPowerManual + + + Form + リフレッシュ + + + + + POWER + パワー + + + + + + Readback + 読み戻し + + + + OFF + オフ + + + + ON + オン + + + + + Tip + 提示 + + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + IsScreenOn + スイッチ状態を読み出します + + + + + + SetScreenOn + 電源の設定 + + + + + + + Success + 成功 + + + + + on + オン + + + + + + + failed + 失敗 + + + + + off + オフ + + + + + SetScreenOff + スクリーンスイッチの設定 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlPowerSchedule + + + Form + リフレッシュ + + + + Edit area + 編集エリア + + + + + Add + 追加 + + + Edit + 編集 + + + + + Delete + 削除 + + + + + Clear + クリア + + + + + Import + インポート + + + + + Export + 出力 + + + + It is power off state outside the schedule time period + 定時の時間帯にはモニターがオンになり、他の時間はオフになります + + + + Send command + 指令エリア + + + + + Apply + 適用 + + + + Clear Schedule + タイミング指令をクリア + + + + Readback + 読み戻し + + + + Power On State + スクリーンスイッチ状態 + + + + Start Time + 開始時間 + + + + End Time + 終了時間 + + + + SUN + 日曜日 + + + + MON + 月曜日 + + + + TUE + 火曜日 + + + + WED + 水曜日 + + + + THU + 木曜日 + + + + FRI + 金曜日 + + + + SAT + 土曜日 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + 開く + + + + + PowerSchedule (*.pjs) + スイッチパネルタイミング(*.pjs) + + + + Save File + 保存 + + + + + + Tip + 提示 + + + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + + Tip Info + ヒント + + + + + Clear schedule task? + スケジュールのタスクをキャンセル? + + + + + CleanTimingScreenTask + スケジュールのタスクをキャンセル + + + + SetTimingScreenTask + 画面タイミングスイッチタスクの設定 + + + + + + + Success + 成功 + + + + + + + failed + 失敗 + + + + GetTimingScreenTask + 画面タイミングスイッチタスクの取得 + + + + ControlPowerWidget + + + Form + リフレッシュ + + + + + Power Configuration + スイッチパネル制御 + + + + + Manual + 手動 + + + + + Schedule + スケジュール + + + + ControlTestWidget + + + Form + リフレッシュ + + + + + Test Screen + テスト画面 + + + + + Line test + 線テスト + + + + + + + + + + Red + + + + + + + + + + + Green + + + + + + + + + + + Blue + + + + + + + + + + + White + + + + + + Vertical + 縦線 + + + + + Slash + 斜線 + + + + + + Horizontal + 水平線 + + + + + + + Speed + スピード + + + + + ms(>10) + ミリ秒(>10) + + + + + Line Distance + 線の間隔 + + + + px + px + + + + + + + + Test + テスト + + + + + Gradation test + グレースケールテスト + + + + + Only the gray value is displayed + 色の値のみを表示 + + + + (>10) + + + + + + GrayValue + グレースケール値 + + + + (0-255) + + + + + + Color test + カラーテスト + + + + + Gradient + グラデーション + + + + 8 + 8 + + + + 2 + 2 + + + + 3 + 3 + + + + 6 + 6 + + + + 4 + 4 + + + + 5 + 5 + + + + 1 + 1 + + + + 9 + 9 + + + + 7 + 7 + + + + 0 + 0 + + + + + Clear + クリア + + + + + Reset + ループ + + + + + + + Anycast + リクエスト + + + Gradient + グラデーション + + + + + Stop + 停止 + + + + + + + + + + + Tip + 提示 + + + + + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + + + StartTest + テストを開始します + + + + + + + Success + 成功 + + + + + + + failed + 失敗 + + + + StopTest + テストを中止します + + + + loopback mode + サイクルモード + + + + Connect timeout + 接続タイムアウト + + + + Reset loop mode + ループを設定 + + + + + success + 成功 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + jsonファイルの解析エラー! + + + + ControlVerifyClockWidget + + + Form + リフレッシュ + + + + Verify Clock Configuration + 検証クロック設定 + + + + Verify to Computer time + コンピュータ時刻の確認 + + + + + Cur time of controller + ディスプレイの現在の時間 + + + + LAN + LAN + + + + (min/time) + (分/回) + + + + Sync identificationCode + 同期IDコード + + + + + identification code + 識別コード + + + + + Time offset(msec) + タイム・オフセット( msec ) + + + + + Brightness + スクリーン輝度 + + + + + Volume + 体積 + + + + + Screen on/off + スクリーンスイッチ + + + + + Slave + から + + + + Master + + + + + + NTP Server + NTPサーバ + + + + + + + NTP Server address + NTPサーバのアドレス + + + + + + + TimeZone + タイムゾーン + + + + + + + + + + + + + Set + セット + + + + + Enable Synchronous playing + 画面を同期させる機能 + + + + Lora + + + + + GPS + + + + + NTP + + + + Sync ime interval + 同期時間間隔 + + + + Time zone + タイムゾーン + + + + + + + Sync time interval + 同期時間間隔 + + + + Verify clock configuration + 検証クロック設定 + + + + + + + + + + + + Readback + 読み戻し + + + + Master + + + + + Sync clock to computer time + 校正クロックからコンピュータ時間まで + + + + Identification Code + 識別コード + + + + + + + + + + + + + + Success + 成功 + + + + + + + + + + + + + + failed + 失敗 + + + + SetNtpServer + NTPサービスの設定 + + + + MasterSwitch + メインデバイスの設定 + + + + SlaveSwitch + スレーブデバイスとして設定 + + + + IsMasterSlave + 主従の身分を読み返す + + + + GetControllerDate + 日付時間の取得 + + + + SetingSyncMethod + set syncメソッド + + + + SyncTime + キャリブレーション時間 + + + + GetNtpServer + NTPサービス情報を取得する + + + + GetingSyncMethod + 同期方式を取得 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + SetTimezone + タイムゾーンを設定 + + + + ControlVolumeManual + + + Form + リフレッシュ + + + + Volume(0-15) + 音量(0-15) + + + + + + Readback + 読み戻し + + + + SetVolume + 音量調節 + + + + + + Success + 成功 + + + + + + failed + 失敗 + + + + Volume(min:0-max:15) + 音量(0-15) + + + + GetVolume + 現在の音量を取得 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + jsonファイルの解析エラー! + + + + ControlVolumeSchedule + + + Form + リフレッシュ + + + + Defalut volume tip + 注意:時間帯の明るさは、定時輝度で表示されます。他の設定されていない時間帯は、デフォルトの輝度値です + + + + + Add + 追加 + + + + + Delete + 削除 + + + + + Clear + クリア + + + + Default Volume + デフォルトの音量 + + + + (0-15) + + + + + + Import + インポート + + + + + Export + 出力 + + + + + Apply + 適用 + + + + Readback + 読み戻し + + + + Volume value + 音量値 + + + + Start Time + 開始時間 + + + + End Time + 終了時間 + + + + SUN + 日曜日 + + + + MON + 月曜日 + + + + TUE + 火曜日 + + + + WED + 水曜日 + + + + THU + 木曜日 + + + + FRI + 金曜日 + + + + SAT + 土曜日 + + + + Default volume tip + 注意:時間帯以外の時間表示はデフォルトの明るさです + + + + Default volume + デフォルトの音量値 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + jsonファイルの解析エラー! + + + + 10 + 10 + + + + + Volume Schedule (*.vols) + + + + + Save File + 保存 + + + + + Tip + 提示 + + + + + NoSelectedController + 先に大きいスクリーンを選んでください + + + + SetAutoVolumeTask + 設定タイミング音量表 + + + + + Success + 成功 + + + + + failed + 失敗 + + + + GetAutoVolumeTask + タイミング音量表の取得 + + + + ControlVolumeWidget + + + Form + リフレッシュ + + + + + Volume Control + 音量調節 + + + + + Manual + 手動 + + + + + Schedule + スケジュール + + + + DevicesControllWidget + + + Form + リフレッシュ + + + + Current Screen: none + 現在のスクリーン: + + + + Control your devices in this widget + + + + + + Clear + クリア + + + + + Current Screen: + 現在のスクリーン: + + + + + single screen operation + シングルスクリーン操作 + + + + + none + なし + + + + + Current Screen + 現在のスクリーン + + + + Multi screen operation + マルチスクリーン操作 + + + + selected num + 選択された数 + + + + Downloader + + + + Updater + 更新 + + + Software update + ソフトウェアアップデート + + + + X + X + + + + + + Downloading updates + 更新をダウンロード + + + + Time remaining: 0 minutes + 残り:0分 + + + + Open + オープン + + + + + Stop + 停止 + + + + + Time remaining + 残り時間 + + + + unknown + 不明 + + + + Error + エラー + + + + Cannot find downloaded update! + ダウンロードされたアップデートを見つけることができません! + + + + Close + 確定 + + + + Download complete! + ダウンロード完了! + + + + The installer will open separately + インストーラは別々に開きます + + + Click "OK" to begin installing the update + をクリックしてアップデートをインストールします + + + In order to install the update, you may need to quit the application. + 更新をインストールするには、アプリケーションを終了する必要があります。 + + + + In order to install the update + 更新をインストール + + + + In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application + 更新をインストールするには、アプリケーションを終了する必要があります。これは必須の更新プログラムは、今すぐ終了アプリケーションが終了します + + + + Tip Info + ヒント + + + + Click the "Open" button to apply the update + ボタンをクリックして更新を適用します + + + + Are you sure you want to cancel the download? + あなたは確かにダウンロードをキャンセルしたいですか? + + + + Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application + あなたは確かにダウンロードをキャンセルしたいですか?これは必須の更新プログラムは、今すぐ終了アプリケーションが終了します + + + + + %1 bytes + + + + + + %1 KB + + + + + + %1 MB + + + + + of + ,総サイズ + + + + Downloading Updates + アップデートのダウンロード + + + + Time Remaining + 残り時間 + + + + Unknown + 不明 + + + + about %1 hours + 約%1時間 + + + + about one hour + 約1時間 + + + + %1 minutes + %1 分 + + + + 1 minute + 1 分 + + + + %1 seconds + %1 秒 + + + + 1 second + 1 秒 + + + + ImageCutWidget + + + Form + リフレッシュ + + + + ImportBnInProgramDlg + + Dialog + ダイアログ + + + + InputPasswordDialog + + + Dialog + ダイアログ + + + + Input password + パスワードを入力 + + + + Change Password + パスワード変更 + + + + OK + 確定 + + + + Cancel + キャンセル + + + + LoAppTools + + + + + Select File + ファイルを選択 + + + + + File name conflicted + ファイル名の衝突 + + + + LoColorSelector + + Select Color + 選択色 + + + + LoDateSelector + + + Date selector + 日付セレクタ + + + + LoEmptyDialog + + + Dialog + ダイアログ + + + + TextLabel + + + + + LoQTitleBar + + + + + Minimize + 最小化 + + + + + + Maximize + 最大化する + + + + + + Close + 閉じる + + + + Restore + 元に戻す + + + + LoUIMsgBoxOk + + Dialog + ダイアログ + + + OK + 確定 + + + + LoUIMsgBoxOkCancel + + + Dialog + ダイアログ + + + + TextLabel + + + + + OK + 確定 + + + + Cancel + キャンセル + + + + MainWindow + + DhcpTip + 1.動的IPの場合のダイレクト端末にのみ使用されます。\r\n2.起動前にファイヤーウォールをオフにするかICMPエコーをオンにしてください。\r\n3.接続が不安定になった場合は、PCで静的IPにしてください + + + DHCP Service + DHCPサービス + + + + + RJ45 Cable directly connected + 網線がつながっている + + + OFF + オフ + + + ON + オン + + + + + Check card + ワンタッチ修復 + + + DhcpTip4 + 1.パソコンとLEDコントロールカードがlanケーブルを使ってつながっていれば、このオプションを開きます + + + DhcpTip5 + 2.オプションを開くと、コンピュータのipアドレスは静的ip:192.168.0.88に設定される + + + DhcpTip6 + 3.LED制御カードのIPアドレスは192.168.0.200になる + + + + Tip Info + ヒント + + + + RestoreLedCardIpByUdpTip + この操作はLAN内のすべてのコンピュータIPと同じセグメントにないコントロールカードを固定IPに修正します。慎重に操作してください。 + + + + Tip + 提示 + + + + No available network was detected + 利用可能なネットワークは検出されない + + + Do you want set IP of cable network to DHCP + ネットワークの設定はDHCPにより自動的にIPを取得する + + + DhcpTip1 + 1.動的IPの場合のダイレクト端末にのみ使用されます + + + DhcpTip2 + 2.起動前にファイヤーウォールをオフにするかICMPエコーをオンにしてください + + + DhcpTip3 + 3.接続が不安定になった場合は、PCで静的IPにしてください + + + + MainWndIcon + + + + + LedOK Express + LedOK Express + + + + NetComm + + + wDevicesItem OnProHttpResponse 解析json文件错误! + jsonファイルの解析エラー! + + + + 解析json文件错误! + jsonファイルの解析エラー! + + + + PixbmpShowDialog + + + Dialog + ダイアログ + + + + X + X + + + + PublishForm + + + Form + リフレッシュ + + + + + + TextLabel + + + + + X + X + + + + + + PushButton + + + + + QFfWidget + + + Form + リフレッシュ + + + + QObject + + Setting up the Xanadu Express... + セットアップXanadu Express... + + + Setting up the Xanadu Express OK! + 起動成功!アプリケーションをファイアウォールルールに追加します! + + + Setting up the Xanadu Express OK! +Add app to firewall rule... + 起動成功!アプリケーションをファイアウォールルールに追加します... + + + + Setting up the LedOK Express... + 初期化LedOK Express… + + + + Setting up the LedOK Express OK! + LedOK Express搭載に成功! + + + + SendProgramDialog + + + Dialog + ダイアログ + + + + + Publish + 転送 + + + + 口 + + + + + X + + + + + Program name + プログラム名 + + + + success info + + + + + Refresh + 更新 + + + + Cancel + キャンセル + + + + Program Name + プログラム名 + + + + Screen ID + ターミナルID + + + + Remark Name + 別名 + + + + Online + オンライン中 + + + + Screen IP + ターミナルIP + + + + Screen Size + スクリーンサイズ + + + + Security + 暗号化 + + + + Progress + 程度 + + + + Remarks + 備考 + + + + All + トータル + + + + SoftConfigDialog + + + Dialog + ダイアログ + + + + Software Configuration + ソフトウェアの設定 + + + + X + X + + + + Video convert format + 動画リスト + + + + Text antialiasing + 文字のアンチエイリアス + + + + TextAntilaTip + (ヒント:小さい間隔の大きい画面に適しています。このオプションを有効にすると、文字の端に影がフォントのエッジの滑らかさに達します。小さいサイズのスクリーンと単色のスクリーンは使用を推奨しません) + + + + GuangYinPin + スクリーン + + + + OK + 確定 + + + + SpecialDlg + + + Dialog + ダイアログ + + + + Specify IP range + IP範囲を指定 + + + + + Specify IP + 指定IP + + + + + Search + 検索 + + + + Cancel + キャンセル + + + + X + + + + + + Attention + 注意 + + + + Please input IP address! + IPアドレスを入力してください! + + + + Your IP Address is Invalid! + IPアドレスが無効です! + + + + Success + 成功 + + + + Can't find this device IP + このデバイスは見つかりません + + + + SubSpecifyIp + + + Form + リフレッシュ + + + + Specify IP + 指定IP + + + + SubSpecifyIpRange + + + Form + リフレッシュ + + + + Start IP + 開始IP + + + + End IP + 終了IP + + + + ThreadSendPro + + + get readAckSempahore + + + + + open file failed + ファイルのオープンに失敗しました + + + send failed + 送信失敗 + + + socket error + socket error + + + + ThreadUpgradeApk + + open file failed + ファイルのオープンに失敗しました + + + send failed + 送信失敗 + + + Timeout + タイムアウト + + + + Uploadding + アップロード中 + + + + TipDialog + + + Dialog + ダイアログ + + + + TextLabel + + + + + + OK + 確定 + + + + + Cancel + キャンセル + + + + X + + + + + + Import + インポート + + + + + Path + パス + + + + + + : + + + + + + browse + ブラウズ + + + + You will delete the selected solution(s),are you sure? + 是否确认删除选中的节目? + + + + + Save as + 名前を付けて保存 + + + + + Export + 出力 + + + + + Done + 完了 + + + + + Solution Name + リスト名 + + + + + Progress + 程度 + + + + Delete + 削除 + + + + Select the network to connect to the device + LEDコントローラに接続するネットワークを選択してください + + + + Network name + ネットワーク名 + + + + + This operation will only set cable network to static IP,are you sure? + この動作は,選択されたネットワークを固定IPに設定し,自動で直連のLEDデバイスを同一セグメントのIPアドレスに設定して確認するかどうかである? + + + + Do you want set IP of cable network to DHCP + ネットワークの設定はDHCPにより自動的にIPを取得する + + + + + + + + Tip + 提示 + + + + + + Please select the network to connect to the Led controller + LEDコントローラに接続するネットワークを選択してください + + + + Choose Directory + ディレクトリを選択 + + + + The imported directory is already in the working directory, so there is no need to import it again! + このインポートしたディレクトリはすでにワークディレクトリの下にあります。再インポートする必要はありません! + + + + no find program can be imported + プログラムはインポートできません + + + Export again + 再出力 + + + + UpdateLedset3Dialog + + + Dialog + ダイアログ + + + + LedSet3.0 Update + LedSet 3.0更新 + + + + X + X + + + + V1.0.0 + V1.0.0 + + + + Update + 更新 + + + + + CurVersion + 現在のバージョン + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + APKはインターネットからダウンロードして、あなたは現在、画面の同期ファームウェアを選択することができます! + + + + LatestVersion: + 最新バージョン: + + + + Update log: + 更新ログ: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + 現在のバージョンはすでに最新バージョンです、あなたは現在、LEDスクリーン同期ファームウェアを選ぶことができます! + + + + Updater + + + Would you like to download the update now? + 今ダウンロードして更新したいですか? + + + + Would you like to download the update now? This is a mandatory update, exiting now will close the application + 今すぐ更新をダウンロードしますか?これは必須の更新プログラムは、今すぐ終了アプリケーションが終了します + + + Version %1 of %2 has been released! + %2のバージョン%1がリリースされました! + + + + No updates are available for the moment + いいえ更新は、現在入手可能です + + + + Congratulations! You are running the latest version of %1 + おめでとう!あなたは%1の最新バージョンを実行しています + + + + UpdaterDialog + + + Dialog + ダイアログ + + + + Software Update + ソフトウェアの更新 + + + + X + X + + + + V1.0 + + + + + Update + 更新 + + + + CurVersion + 現在のバージョン + + + + LatestVersion: + 最新バージョン: + + + + Update log: + 更新ログ: + + + + The current version is already the latest version + すでに最新バージョンです。 + + + + UpdaterFirmwareDialog + + + Dialog + ダイアログ + + + + Firmware Update + ファームウェアアップグレード + + + + X + X + + + + V1.0 + + + + + Update + 更新 + + + + + CurVersion + 現在のバージョン + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + APKはインターネットからダウンロードして、あなたは現在、画面の同期ファームウェアを選択することができます! + + + + LatestVersion: + 最新バージョン: + + + + Update log: + 更新ログ: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + 現在のバージョンはすでに最新バージョンです、あなたは現在、LEDスクリーン同期ファームウェアを選ぶことができます! + + + + UpgradeApkDialog + + + Dialog + ダイアログ + + + + Upgrade apk + アップグレード + + + + 口 + + + + + X + X + + + + Select apk + Appパッケージを選択 + + + + + Upgrade + アップグレード + + + + APK: + + + + + Uninstall + アンマウント + + + + check running state + 運転状態を検出 + + + + Select Fpga + FPGAファイルを選択 + + + + success info + + + + + Refresh + 更新 + + + + Cancel + キャンセル + + + + Screen ID + ターミナルID + + + + Remark Name + 別名 + + + + Online + オンライン中 + + + + Screen IP + ターミナルIP + + + + Security + 暗号化 + + + + Progress + 程度 + + + + xixunplayer + + + + + cardsystem + + + + + taxiapp + + + + + starter + + + + + connection + + + + + displayer + + + + + FPGA + FPGA + + + + update + + + + + State + 状態 + + + Remarks + 備考 + + + + + All + トータル + + + + The encrypted control card can be upgraded directly + 暗号化されたコントロールカードを直接アップグレードすることができます + + + + apk package (*.rpd) + + + + + apk package (*.apk *.zip) + + + + + UsbDetectDialog + + + Form + リフレッシュ + + + + Usb upgrade program + Uディスク更新プログラム + + + + X + X + + + + Password + パスワード + + + + OK + 確定 + + + + Input password + パスワードを入力 + + + + + Tip + 提示 + + + + No checked USB device + チェックUSBデバイス + + + + please select usb device in list + リスト内のUSBデバイスを選択してください + + + + UsbDiskFuncDialog + + + Dialog + ダイアログ + + + + Usb upgrade program + Uディスク更新プログラム + + + + X + + + + + Path + パス + + + + Password + パスワード + + + + ... + + + + + OK + 確定 + + + + Cancel + キャンセル + + + + Input password + パスワードを入力 + + + + Please select path for usb playback + パスを選択してください + + + + Choose Directory + ディレクトリを選択 + + + + X_UIMsgBoxOk + + + Dialog + ダイアログ + + + + + TextLabel + + + + + X + + + + + OK + 確定 + + + + Cancel + キャンセル + + + + Sync + 同期 + + + + install + インストール + + + + Tip Info + ヒント + + + + No found xixunplayer.apk,Do you want download it from internet? + いいえxixunplayer.apkは、インターネットからダウンロードしたいですか? + + + + X_UIMsgBoxOkCancel + + + Dialog + ダイアログ + + + + + TextLabel + + + + + X + + + + + OK + 確定 + + + + Cancel + キャンセル + + + + X_UIMsgBoxYesNoCancel + + + Dialog + ダイアログ + + + + + TextLabel + + + + + X + + + + + Yes + + + + + No + いいえ + + + + Cancel + キャンセル + + + + eAClockAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + Basic Properties + 基本的な属性 + + + + Time Zone + タイムゾーン + + + + Custom Dial + ユーザー定義の文字盤 + + + + Hour Mark + 時間目盛り + + + + + Circular + 円形 + + + + + Rectangle + 矩形 + + + + Number + デジタル + + + + + + + T + + + + + Min Mark + 分目盛り + + + + Hand Color + 剣カラー + + + + H + + + + + M + + + + + S + + + + + s + + + + + Date + 日付 + + + Custom Dial + 文字盤 + + + + Select + 選択 + + + + Text + テキスト + + + + Play + 再生方法 + + + + Duration + 再生時間 + + + + Select Dail file + 文字盤の画像を選択 + + + + eDClock + + + + Y_ + + + + + + M_ + + + + + + D_ + + + + + + + + + + + + + + + + / + / + + + + + + + + + + + + + + + - + - + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + MON + 月曜日 + + + + TUE + 火曜日 + + + + WED + 水曜日 + + + + THU + 木曜日 + + + + FRI + 金曜日 + + + + SAT + 土曜日 + + + + SUN + 日曜日 + + + + AM + 午前 + + + + PM + 午後 + + + + YEAR + + + + + MONTH + + + + + DAY + + + + + eDClockAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + Basic Properties + 基本的な属性 + + + + Time Zone + タイムゾーン + + + + Year + + + + + Month + + + + + Day + + + + + Hour + 時間 + + + + Min. + + + + + Sec. + + + + + Weekly + 曜日 + + + + Full Year + 四桁数の年表示 + + + + 12-Hour + + + + + Morning / Afternoon + 午前/午後 + + + + Date Style + 日付スタイル + + + + 1955年02月24日 + + + + + 1955年2月24日 + + + + + Time Style + タイムスタイル + + + + Display Style + 表示スタイル + + + + Multiline + 複数行表示 + + + + T + + + + + Play + 再生方法 + + + + Play Duration + 再生時間 + + + + s + + + + + eGif + + + Gif(*.gif) + + + + + eGifAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + Basic Properties + 基本的な属性 + + + + File + ファイル + + + + ... + + + + + Play + 再生方法 + + + + Play Duration + 再生時間 + + + + s + + + + + Play Times + 再生回数 + + + + eMovie + + + Movie(*.mp4 *.mkv *.rm *.rmvb *.avi *.wmv *.mov);;Flash(*.flv *.swf) + + + + + + + Convert video + 動画リスト + + + + + + Success + 成功 + + + + + + failed + 失敗 + + + + Converting format + ビデオ処理中 + + + + eMovieAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + File + ファイル + + + + ... + + + + + Play + 再生方法 + + + + AspectRatioMode + + + + + IgnoreAspectRatio + + + + + KeepAspectRatio + + + + + KeepAspectRatioByExpanding + + + + + Play Duration + 再生時間 + + + + Basic Properties + 基本的な属性 + + + + Play Times + 再生回数 + + + + + Convert video + 動画リスト + + + + + Success + 成功 + + + + + failed + 失敗 + + + + Converting format + ビデオ処理中 + + + + eObjectAttr + + + GroupBox + + + + + Area + 領域(px) + + + + X + + + + + Y + + + + + W + + + + + H + + + + + ePhoto + + + Images (*.png *.jpg *.jpeg *.bmp) + 写真(*.png *.jpg *.jpeg *.bmp) + + + + ePhotoAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + File + ファイル + + + + ... + + + + + Play + 再生方法 + + + + Play Duration + 再生時間 + + + Zoom out + 縮小 + + + Zoom out to left bottom + 左下縮小 + + + Zoom out to left top + 左上の縮小 + + + Zoom out to right top + 右上の縮小 + + + Zoom out to right bottom + 右下の縮小 + + + + Play Times + 再生回数 + + + + Enter Style + 開始効果 + + + + Basic Properties + 基本的な属性 + + + + None + + + + + Alpha_In + 淡入 + + + Alpha Out + フェードアウト + + + + Moving to left + 連続する左シフト + + + + Moving to right + 連続右シフト + + + Moving to right + 連続右シフト + + + + Moving to top + 連続アップコンバート + + + + Move to bottom + 連続的下向 + + + + Zoom in + 拡大 + + + + Rotate to right + 右回り + + + + Rotate to left + 左回り + + + + + s + + + + + Zoom in to left_bottom + 左下の拡大 + + + + Zoom in to left_top + 左上の角を大きく + + + + Zoom in to right_top + 右上拡大 + + + + Zoom in to right bottom + 右下隅を大きく + + + + Enter Duration + 効果時間 + + + + Attention + 注意 + + + + file( + ファイル( + + + + ) is not exist + )は存在しません + + + + Tip Info + ヒント + + + + Effect time cannot be longer than duration time + 効果の長さはプレイ時間より長くできません + + + + eTemp + + + Temperature: + 温度: + + + + Humidity: + 湿度: + + + + Noise: + ノイズ: + + + + Wind Speed: + 風速: + + + + Wind Direction: + 風向: + + + + PM25: + + + + + PM10: + + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + + + + + + + north + 北の方 + + + + + + + + + + east + + + + + + + + + + + south + 南の方 + + + + + + + + + + west + 西の方 + + + + eTempAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + Basic Properties + 基本的な属性 + + + + Title + タイトル + + + + Temp. + 温度 + + + Temp. Compensation + 温度補正 + + + Temp. Type + 単位 + + + + ℃ + + + + + ℉ + + + + Custom Label + カスタム + + + + Temperature: + 温度: + + + Fixed Text + 固定テキスト + + + + Compensation + 補償 + + + + Humidity + 湿度: + + + + %RH + + + + + Humidity: + 湿度: + + + + Wind speed + 風速 + + + + m/s + + + + + Wind Speed: + 風速: + + + + Wind direction + 風向 + + + Wind Directon: + 風向: + + + + Wind Direction: + 風向: + + + + Noise + ノイズ + + + + dB + + + + + Noise: + ノイズ: + + + + PM2.5 + + + + + + μg/m³ + + + + + PM2.5: + + + + + PM10 + + + + + PM10: + + + + + Left + 左に寄る + + + + Center + 中央にある + + + + Right + 右に寄る + + + + Single scroll + 1行スクロール + + + + Speed + スピード + + + + ms/pixel + ミリ秒/ピクセル + + + + T + + + + + window-background + ウィンドウの背景 + + + + B + + + + + Play + 再生方法 + + + + Refresh Cycle + リフレッシュサイクル + + + + min. + + + + + Duration + 再生時間が長い + + + + eText + + + Hello Text ! + 内容を入力してください! + + + + eTextAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + T + + + + + S + + + + + B + + + + Letter Spacing + + + + Text + テキスト + + + + Basic Properties + 基本的な属性 + + + + Font + フォント色 + + + + Font-background + フォントの背景 + + + + window-background + ウィンドウの背景 + + + + Kerning + 字の間隔 + + + + Line Spacing + 間隔 + + + + PageCount: + 総ページ数: + + + + 1 + 1 + + + + page + ページ + + + + Play + 再生方法 + + + + Turning + 次頁 + + + + Rolling + スクロール + + + + Static + スタティック + + + + eTextFlipAttr + + + Form + リフレッシュ + + + + Play Duration + 再生時間 + + + + + H:mm:ss + + + + Effect Speed + 特技のスピード + + + Effect Duration + 効果時間 + + + + Effect time + 効果時間 + + + + s + + + + + Entrance Effect + 開始効果 + + + + no + なし + + + + random + ランダム + + + + right to lef + 左へ連続移動 + + + + bottom to top + 連続して上に移動 + + + + left to right + 右へ連続移動 + + + + top to bottom + 連続して下に移動 + + + + Duration/Page + ページごとの再生時間 + + + + + Tip Info + ヒント + + + + + Effect time cannot be longer than duration time + 効果の長さはプレイ時間より長くできません + + + + eTextInput + + + Dialog + ダイアログ + + + + Text Edit + テキスト編集 + + + + Close + 確定 + + + + eTextScrollAttr + + + Form + リフレッシュ + + + + Play Duration + 再生時間 + + + + H:mm:ss + + + + + Head-Tail Connected + 首尾接続 + + + + Head-Tail Spacing + 首尾間隔 + + + + Rolling Style + スクロール方向 + + + + Left -> Right + 右へ + + + + + Right -> Left + 左へ + + + + Top -> Bottom + 下へ + + + + Bottom -> Top + 上へ + + + + Rolling Speed + スクロールスピード + + + + eTextStaticAttr + + + Form + リフレッシュ + + + + Play Duration + 再生時間 + + + + H:mm:ss + + + + + eTimer + + + d + + + + + h + + + + + m + + + + + s + + + + + eTimerAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + Basic Properties + 基本的な属性 + + + + Forward + カウントダウン + + + + Backward + カウント + + + + Date + 終了日付 + + + + yyyy-MM-dd + + + + + Time + 终了時間 + + + + HH:mm:ss + + + + + Day + + + + + Hour + + + + + Min + + + + + Sec + + + + + Text + テキスト + + + + Style + 表示スタイル + + + + Multiline + 複数行表示 + + + + T + + + + + B + + + + + Play + 再生方法 + + + + Duration + 再生時間 + + + + s + + + + + eWeather + + + Weather: + 天気: + + + + Temperature: + 温度: + + + + Wind: + 风が: + + + + Humidity: + 湿度: + + + + Current Temperature: + 現在の温度: + + + + + Shower + + + + + + No Continuous, Range 4-5 + + + + + eWeatherAttr + + + Form + リフレッシュ + + + Widget + テキスト + + + + Basic Properties + 基本的な属性 + + + + Country + 国家 + + + + China + 中国 + + + + America + アメリカ + + + + Province + + + + + City + + + + + State + + + + + District + + + + + + Weather + 天気 + + + + + Temp. + 温度 + + + + + Wind + 风が + + + + + Humidity + 湿度 + + + + + Current Temp. + 現在の温度 + + + + Temp. Type + 温度类型 + + + + + ℃ + + + + + ℉ + + + + + Temp. Unit + 温度単位 + + + + ° + + + + + Custom Label + カスタム + + + + Weather: + 天気: + + + + Temperature: + 温度: + + + + Wind: + 風: + + + + Humidity: + 湿度: + + + + Current Temperature: + 現在の温度: + + + + Display Style + 表示モード + + + + Multiline + 複数行 + + + + Singleline(Scrolling) + 単一行(スクロール) + + + + Singleline(Static) + 単一行(静的) + + + + T + + + + + Play + 再生方法 + + + + Refresh Cycle + 更新サイクル + + + + min. + + + + + Duration + 再生時間 + + + + s + + + + + eWindow + + + Please add media on the right + 右側にメディアを追加してください。複数のメディアに参加できます。LEDディスプレイはリスト順に再生されます + + + + eWindowAttr + + + Form + リフレッシュ + + + + Media List + メディアリスト + + + + + + Text + テキスト + + + + + + Photo + 写真 + + + + + + Movie + 動画リスト + + + + + + Gif + アニメーション + + + + + + DClock + デジタル時計 + + + + + + AClock + アナログ時計 + + + + Office + Officeコントロール + + + + + Temp + + + + + + Weather + 天気 + + + + Rss + RSS + + + + + Timer + タイマー + + + + + Window + ウィンドウ + + + + ColorText + 多彩な文字 + + + + mConverter + + + Preparing ... + 準備... + + + + Organizing resources ... + リソースの整理... + + + + Create json ... + クリエイトjson... + + + Zipped program ... + 番組を圧縮する... + + + Zipped finished ... + 圧縮完了... + + + delete tmp dir ... + 一時ディレクトリを削除... + + + + Scan program ... + スキャン番組… + + + + mDeviceManager + + + Form + リフレッシュ + + + + + All + トータル + トータル + + + + + + Online + オンライン中 + + + + + Unlogin + 未ログイン + + + + + Offline + オフライン + オフライン + + + + Refresh + 更新 + 更新 + + + Flash + 更新 + + + + + Specify IP + 指定IP + 指定IP + + + + + devManager + + + + + devFlash + + + + + devFlashSpeciallyIP + + + + + bnFlashArrowItem + + + + + Screen ID + ターミナルID + + + + Screen IP + ターミナルIP + + + + Screen Size + スクリーンサイズ + + + + Remark Name + 別名 + + + + readback pic + 読み戻し + + + + send + 送信 + + + SetBrightnessSensitivity + 輝度センサ感度を設定する + + + SetBrightness + 輝度を設定する + + + Brightness + スクリーン輝度 + + + Power + 画面切り替えステータス + + + + More Info + 詳細 + + + + Refresh + Refresh + 更新 + + + Specify IP + Specify IP + 指定IP + + + Online + Online + オンライン中 + + + All + All + トータル + + + Unlogin + Unlogin + 未ログイン + + + Offline + Offline + オフライン + + + + Cur Brightness + 現在の画面の明るさ + + + + Power Status + 画面切り替えステータス + + + + Security + 暗号化 + + + + mDeviceSetting + + + Form + リフレッシュ + + + + + Brightness Adjustment + 輝度設定 + + + + + Power Control + 電源コントロール + + + + + Net Config + ネット配置 + + + + + Time Synchronization + タイマ配置 + + + + + Video source + ビデオソース + + + + + Encrypt + 暗号化する + + + + + Advanced parameters + 上級パラメータ + + + + Volume + 音量 + + + + + Test + テスト + + + + + Lora + Lora + + + + Volume Adjustment + 音量調節 + + + Advance + 詳細スケジュール + + + Control + ターミナルコントロール + + + + mGuangYingPinWidget + + + Form + リフレッシュ + + + + + Com + シリアル + + + + + Main + メインデバイス + + + + + + + PortName + シリアル名 + + + + + + + BaudRate + ポートレート + + + + + 1200 + 1200 + + + + + 2400 + 2400 + + + + + 4800 + 4800 + + + + + 9600 + 9600 + + + + + 19200 + 19200 + + + + + 38400 + 38400 + + + + + 57600 + 57600 + + + + + 115200 + 115200 + + + + + + + DataBit + データビット + + + + + + 5 + 5 + + + + + + 6 + 6 + + + + + + 7 + 7 + + + + + + 8 + 8 + + + + + + + OEBit + ビットを検証 + + + + + No + いいえ + + + + + Even + + + + + + Odd + + + + + + Space + + + + + + Mark + + + + + + + + StopBit + ストップビット + + + + + + 1 + 1 + + + + + + 2 + 2 + + + + + 1.5 + 1.5 + + + + + State:Close + 状態:接続 + + + + + + + + + + + + Open + オープン + + + + + Auxiliary + 副設備 + + + + + Refresh + 更新 + + + Newwork + ネットワーク + + + + + Param configuration + パラメータ設定 + + + + + Resend times + 再送回数 + + + + + Delay millsecond + 遅延(マイクロ秒) + + + + 3 + 3 + + + + 4 + 4 + + + + 9 + 9 + + + + + Clear + 空をクリア + + + + + Debug + デバッグ + + + + + + 10 + 10 + + + + + Network + ネットワーク + + + + 11 + 11 + + + + 12 + 12 + + + + 13 + 13 + + + + 14 + 14 + + + + 15 + 15 + + + + 16 + 16 + + + + 17 + 17 + + + + 18 + 18 + + + + 19 + 19 + + + + 20 + 20 + + + + + Program number + 番組番号 + + + + + Send + 送信 + + + Previous + 前の方 + + + Next + 次の方 + + + + + Brightness + スクリーン輝度 + + + + + Set + セット + + + + + Screen Off + スクリーンオフ + + + + Screen on + 気絶する + + + + + + + + + + + State:Off + 状態:切断 + + + + Screen On + 気絶する + + + + + + + + + + + + + Close + 閉じる + + + + + State:On + 状態:接続 + + + + + Tip + 提示 + + + + + OpenPort COM failed + シリアルのオープンに失敗しました + + + + mProgramManager + + + Form + リフレッシュ + + + + + New + 新規 + + + + + Edit + 編集 + + + + + Delete + 削除 + + + + + Import + インポート + + + + + Export + 出力 + + + + + Send + 送信 + + + + Publish + 転送 + + + + Name + 名前 + + + + Resolution + 解像度 + + + + File Size + サイズ + + + + Last Modify + 最終更新日 + + + + Usb playback + USBメモリで再生する + + + + Program name conflicted + 番組名が重なる + + + + You will delete the selected solution(s),are you sure? + 是否确认删除选中的节目? + + + + Tip Info + ヒント + + + Import program successed + 导入节目成功 + + + + mProgramManagerA + + + Form + リフレッシュ + + + + + + New + 新規 + + + + + + Edit + 編集 + + + + + + Delete + 削除 + + + + + + Import + インポート + + + + + + + + Export + 出力 + + + Send + 送信 + + + + + Name + 名前 + + + + + Number + スケジュール数 + + + + + File Size + サイズ + + + + + Last Modify + 最終更新日 + + + + + + + + Publish + 転送 + + + + mTabWidget + + + + Device + 端末管理 + + + + + Program + コンテンツ管理 + + + + + GuangYinPin + スクリーン + + + + Advance + 詳細スケジュール + + + + + Control + ターミナルコントロール + + + + mTitleBar + + + + Setting + 設置 + + + + + Language + 言語 + + + + + Check for updates + アップデートをチェック + + + Check for firmware updates + ファームウェアアップデートをチェック + + + + + Software Configuration + ソフトウェアの設定 + + + + 中文 + + + + + 中文繁体 + + + + + 日本語 + + + + Update + 更新 + + + + + Help + ヘルプ + + + + + firmware manager + ファームウェア管理 + + + + + About + 当ソフトウェアについて + + + Chinese + 中国語 + + + + English + 英語 + + + Japanese + 日本語 + + + + wAttrView + + + TabWidget + + + + + + 页 + Page + + + + widget properties + パッケージプロパティ + + + + Page properties + プログラムのプロパティ + + + + wDevicesItem + + GetCardDetailInfoButtonTip + 詳細 + + + + + GetScreenDetailInfo + 詳細 + + + + + ReadbackPic + 回読画面 + + + + GetScreenshotFull + 回読画面 + + + + cur brightness: + 現在の明るさ: + + + + android version: + Androidバージョン: + + + + IMEI: + + + + + HardWard Version: + FPGAバージョン: + + + + MAX Brightness level: + 輝度レベル: + + + + Android OS Resolution: + Androidの解像度: + + + + Firmware Version: + ファームウェアバージョン: + + + + Player Version: + プレーヤーファームウェアバージョン: + + + Xixun player cur version: + ファームウェアバージョン: + + + + + you can click sync firmware button to lastest version + 同期ファームウェアボタンをクリックしてコンピュータのバージョンを保存できます + + + + + + + Detail Info + 詳細 + + + + No install xixunplay apk firmware! + いいえインストールXiXunplay APKファームウェア! + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + receive + 受信 + + + + SetScreenOn + 電源の設定 + + + + AliIotSetting + + + + + + GetScreenStatus + スクリーン状態を取得 + + + + + Status + 状態 + + + + DHCP IP + DHCP IP + + + + STATIC IP + 静的IP + + + + Tip Info + ヒント + + + + password is wrong + パスワードが間違っている + + + + GetBrightness + 輝度値を取得 + + + + + + + brightness + 明るさ + + + IsMasterSlave + 主従の身分を読み返す + + + + MasterSlaveSwitch + メインの個人情報を設定 + + + + SetBrightness + 輝度を設定する + + + + + SetMinBrightness + 最小輝度値を設定します + + + + GetBrightnessSensitivity + 明るさ感を得る + + + + sensitivity + 感度 + + + + + GetMinBrightness + 輝度最小値を取得 + + + Tip + 提示 + + + no sensorBrightnessTable + コントロールカードに輝度設定表が見つかりませんでした + + + Tab + テーブル + + + + SetSensorBrightnessTable + センサーパラメータの設定表 + + + + SetSwitchWiFi + WiFiスイッチの設定 + + + + ConfigurationWiFi + WiFiの設定 + + + + ConfigurationHotSpot + ホットスポットの設定 + + + + GetSwitchWiFi + WiFi状態を取得 + + + + SetAutoBrightnessTask + 送信タイミング輝度表 + + + + SetAutoVolumeTask + 設定タイミング音量表 + + + + SetVolume + 音量調節 + + + + GetVolume + 現在の音量を取得 + + + + SetTimingScreenTask + 画面タイミングスイッチタスクの設定 + + + + GetControllerDate + 日付時間の取得 + + + + SetHighForBusy + 客レベルの設定 + + + + + GetStateForBusy + ゲストレベルを取得 + + + + Service:Low Out of service:High + 客がいます:低 客がいません:高 + + + + Service:High Out of service:Low + 客がいます:高 客がいません:低 + + + + + + IsPortableHotSpot + ホットスポットとWiFiモードの取得 + + + + WifiName + Wifiの名前 + + + + ApName + AP名前 + + + + SetScreenSize + スクリーンのピクセルサイズを設定 + + + + TestScreen + テスト画面 + + + + SetOnlineAddr + ウェブサーバのアドレスを設定 + + + + SetRealtimeServer + RealTimerアドレスを設定 + + + + GetOnlineAddr + ウェブサーバのアドレスを取得 + + + + GetRealtimeServer + realtimeサーバのアドレスを取得します + + + + SetNtpServer + NTPサービスの設定 + + + + GetNtpServer + NTPサービス情報を取得する + + + + SyncTime + キャリブレーション時間 + + + + DelPrograms + 番組をクリア + + + + SetingSyncMethod + set syncメソッド + + + + GetCurrentSensorBrightness + 現在の明るさを取得する + + + + Cur brightness + カールの明るさ + + + + SetSpecialResolution + 解像度を設定 + + + + GetSpecialResolution + 読み込み解像度 + + + + totalResolution + FPGAトータル解像度 + + + + strCurDisplayResolution + 表示解像度 + + + + CleanDisplayScreenSize + デフォルトの解像度を復元 + + + + SetMaxBrightness + 輝度最大値を設定 + + + + GetMaxBrightness + 輝度最大値を取得 + + + + + screenSwitch + スクリーンの切り替え + + + + + + YES + 開く + + + + + + NO + オフ + + + + Connect + 接続 + + + + timeout + タイムアウト + + + + Anycast + リクエスト + + + + + + volume + 音量 + + + + + + + GetingSyncMethod + 同期方式を取得 + + + + identificationCode + 識別コード + + + + delaySync + 時間オフセット + + + + msec + ミリ秒 + + + + + + OtherSyncItem + その他の同期項目 + + + + + + lastSynchronousTime + 最終同期時間 + + + + checkNtpTime + 同期間隔 + + + + install start... + インストールを開始... + + + + not found xixunplayer.apk in computer: + アプリケーションのレベルアップディレクトリでは見つかりませんでした。xixunplayer.apk, + + + + UpgradeSoftware + ファームウェアをアップグレードする + + + + Uploadding + アップロード + + + + + Success + 成功 + + + + + failed + 失敗 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + success + 成功 + + + + + Lora identity + ロラの身分 + + + + Master + + + + + Slave + から + + + + SetBrightnessSensitivity + 輝度センサ感度を設定する + + + + + + on + オン + + + + + + off + オフ + + + + wDrawingBoard + + + Zoom In + 拡大 + + + + Zoom Out + 縮小 + + + + Original size + オリジナル割合 + + + + Delete the secect media + 選んで削除する + + + Clear + コンテンツをすべてクリアする + + + + Clear all media + コンテンツをすべてクリアする + + + + Cut media + 裁断する + + + + Move layer up + 前面にする(ショートカットキーPgUp) + + + + Send backward + 背面にする(ショートカットキーPgDn) + + + + Bring to front + 最前面にする(ショートカットキーHome) + + + + Move to the bottom layer + 写真を最背面にする(ショートカットキーEnd) + + + + Fill the entire screen + 全画面塗りつぶし + + + + Fill the screen horizontally + 行塗りつぶし + + + + Fill the screen vertically + 列塗りつぶし + + + + Align top + 縦位置 上詰め + + + + Center vertically + 縦位置 中央揃え + + + + Bottom align + 縦位置 下詰め + + + + Align left + 横位置 左詰め + + + + Center horizontally + 横位置 中央揃え + + + + Align right + 横位置 右詰め + + + + Tip Info + ヒント + + + + Clear all medias? + + + + + wEditProgram + + + MainWindow + + + + Saving + 保存中 + + + Saving success + 正常に保存されました + + + + Tip Info + ヒント + + + + Do you want to save the modifications? + 変更された内容を保存してもよろしいですか? + + + + + Saving... + 保存中、少々お待ちください... + + + + + Success + 成功 + + + + + Save failed + 保存に失敗 + + + + Convertering + データを整理する + + + + Converter Successed + 整理に成功しました + + + + Converter TimeOut + 整理タイムアウト + + + + Generate preview data + プレビューデータの生成 + + + + Ready + 準備が完了しました + + + + Generate TimeOut + タイムアウトを生成 + + + + Tip + 提示 + + + + Waring + + + + + wExportProgramItem + + + Tip Info + ヒント + + + + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? + 解決策は既に存在します。既存の解決策を上書きしたいと思いますか? + + + + wMainToolBar + + + save + 保存 + + + + Save as + 名前を付けて保存 + + + + Setting + 設置 + + + + Text + テキスト + + + + Photo + 写真 + + + + Video + ビデオ + + + + Gif + アニメーション + + + + Clock + デジタル時計 + + + + Analog Clock + アナログ時計 + + + + Audio + オーディオ + + + + MuliContentWindow + マルチ素材ウィンドウ + + + + In this window, a plurality of different program materials can be added and played according to the order of joining the list; + このウィンドウには、複数の異なる番組素材を追加して、リストに追加した順に再生することができます + + + + Stop preview + 停止 + + + Office + Officeコントロール + + + + Environment + 環境モニタリング + + + Weather + 天気 + + + Rss + RSS + + + Timer + タイマー + + + Colorful Word + ブリリアントワード + + + Window + ウィンドウ + + + + + + Preview + プレビュー + + + + Publish + 転送 + + + + wNewProgram + + + Dialog + ダイアログ + + + Name + 名前 + + + + Resolution + 解像度 + + + + Solution Information + スケジュール情報 + + + + X + X + + + + Solution Name + リスト名 + + + + Width + + + + + Height + 高さ + + + + Remarks + 備考 + + + + OK + 確定 + + + + Cancel + キャンセル + + + New + 新規 + + + + wPageAttr + + + Form + リフレッシュ + + + + Page name + プログラム名 + + + + Play times + 再生回数 + + + + Valid Date + 有効期間 + + + + Start + 開始日 + + + + + yyyy-MM-dd + + + + + End + 終了日 + + + + Plan + タイムスケジュール + + + + New + 新規 + + + + + The end time can not be earlier than the start time + 終了時間は開始時間より遅いようにしてください + + + + wPageItemWidget + + + Form + リフレッシュ + + + + times + + + + + wPageList + + + Add page + ページを追加 + + + + Copy page + コピーページ + + + Delete + 削除 + + + + Delete page + ページを削除 + + + + Move up + 前へ + + + + Move down + 次頁 + + + + program + 番組リスト + + + + Tip Info + ヒント + + + + Are you sure you want to delete this program page? + 本当にこの番組ページを削除しますか? + + + New + 新規 + + + + wPlanItem + + + Form + リフレッシュ + + + Weekly + 毎週: + + + + 1 + 1 + + + + Every week: + 毎週: + + + + M + + + + + Tu + + + + + W + + + + + Th + + + + + F + + + + + Sa + + + + + Su + + + + + wProgramItem + + + + ExportButtonTip + USBメモリで再生する + + + + + SendButtonTip + 転送 + + + + + Convertering + データを整理する + + + + USB Export Successed + USBメモリのエクスポートに成功しました + + + + USB Export TimeOut + USBメモリのエクスポートに失敗しました + + + + Converter Successed + 整理に成功しました + + + + Converter TimeOut + 整理タイムアウト + + + + wProgramPublishItem + + + This screen is encrypted + スクリーンは暗号化されています + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Tip Info + ヒント + + + + password is wrong + パスワードエラー + + + + wUpgradeApkItem + + + uninstalling + アンマウント中 + + + + + IsSoftwareRunning + APK運転状態監視 + + + + + This screen is encrypted + スクリーンは暗号化されています + + + + + Start upgrading + レベルアップします + + + Uploadding + アップロード中 + + + + + Timeout + タイムアウト + + + + install start... + インストールを開始します + + + + + SynchronousHardwareVersion + 同期FPGA + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + jsonファイルの解析エラー! + + + + Tip Info + ヒント + + + + password is wrong + + + + + + UninstallSoftware + アンマウント + + + + + Success + 成功 + + + + Running + 実行中 + + + + NoRunning + 実行されていません + + + + install success + インストール成功 + + + + + Fail + 失敗 + + + + x_uiMsgBoxOnlyCloseBtn + + + Dialog + ダイアログ + + + + TextLabel + + + + + X + X + + + diff --git a/LedOK/Languages/widgets.qm b/LedOK/Languages/widgets.qm new file mode 100644 index 0000000000000000000000000000000000000000..9349f02b5837d63ebb4afc114d0a329fcba6ea88 GIT binary patch literal 494 zcmcE7ks@*G{hX<16=n7(EZlq7iGhK^fq`ZD6(IeaL2FqhkY-@e?p_Zh6B)FRfar-# z+q#wlX#te8XdWK*|A7FmRv6@V1vQ_{yle%Z{N%)v%=|pOHU(t`vBPz + + + + CloseButton + + + Close Tab + + + + + QAbstractSpinBox + + + &Select All + + + + + &Step up + + + + + Step &down + + + + + QApplication + + + Executable '%1' requires Qt %2, found Qt %3. + + + + + Incompatible Qt Library Error + + + + + QColorDialog + + + Hu&e: + + + + + &Sat: + + + + + &Val: + + + + + &Red: + + + + + &Green: + + + + + Bl&ue: + + + + + A&lpha channel: + + + + + &HTML: + + + + + Cursor at %1, %2 +Press ESC to cancel + + + + + Select Color + + + + + &Basic colors + + + + + &Custom colors + + + + + &Add to Custom Colors + + + + + &Pick Screen Color + + + + + QComboBox + + + Open the combo box selection popup + + + + + False + + + + + True + + + + + QDateTimeParser + + + AM + + + + + am + + + + + PM + + + + + pm + + + + + QDialog + + + What's This? + + + + + QDialogButtonBox + + + + OK + + + + + QDirModel + + + Name + + + + + Size + + + + + Kind + Match OS X Finder + + + + + Type + All other platforms + + + + + Date Modified + + + + + QDockWidget + + + Float + Accessible name for button undocking a dock widget (floating state) + + + + + Undocks and re-attaches the dock widget + + + + + Close + Accessible name for button closing a dock widget + + + + + Closes the dock widget + + + + + QErrorMessage + + + Debug Message: + + + + + Warning: + + + + + Critical Error: + + + + + Fatal Error: + + + + + Information: + + + + + &Show this message again + + + + + &OK + + + + + QFileDialog + + + Look in: + + + + + + Back + + + + + Go back + + + + + Alt+Left + + + + + + Forward + + + + + Go forward + + + + + Alt+Right + + + + + + Parent Directory + + + + + Go to the parent directory + + + + + Alt+Up + + + + + + Create New Folder + + + + + Create a New Folder + + + + + + List View + + + + + Change to list view mode + + + + + + Detail View + + + + + Change to detail view mode + + + + + Sidebar + + + + + List of places and bookmarks + + + + + + Files + + + + + Files of type: + + + + + Find Directory + + + + + Open + + + + + Save As + + + + + Directory: + + + + + File &name: + + + + + + &Open + + + + + &Choose + + + + + &Save + + + + + Show + + + + + &Rename + + + + + &Delete + + + + + Show &hidden files + + + + + &New Folder + + + + + All files (*) + + + + + Directories + + + + + + %1 +Directory not found. +Please verify the correct directory name was given. + + + + + %1 already exists. +Do you want to replace it? + + + + + %1 +File not found. +Please verify the correct file name was given. + + + + + New Folder + + + + + + Delete + + + + + '%1' is write protected. +Do you want to delete it anyway? + + + + + Are you sure you want to delete '%1'? + + + + + Could not delete directory. + + + + + Recent Places + + + + + Remove + + + + + My Computer + + + + + Drive + + + + + %1 File + %1 is a file name suffix, for example txt + + + + + File + + + + + File Folder + Match Windows Explorer + + + + + Folder + All other platforms + + + + + Alias + OS X Finder + + + + + Shortcut + All other platforms + + + + + Unknown + + + + + QFileSystemModel + + + <b>The name "%1" cannot be used.</b><p>Try using another name, with fewer characters or no punctuation marks. + + + + + Invalid filename + + + + + Name + + + + + Size + + + + + Kind + Match OS X Finder + + + + + Type + All other platforms + + + + + Date Modified + + + + + My Computer + + + + + Computer + + + + + QFontDialog + + + Select Font + + + + + &Font + + + + + Font st&yle + + + + + &Size + + + + + Effects + + + + + Stri&keout + + + + + &Underline + + + + + Sample + + + + + Wr&iting System + + + + + QInputDialog + + + Enter a value: + + + + + QKeySequenceEdit + + + Press shortcut + + + + + %1, ... + This text is an "unfinished" shortcut, expands like "Ctrl+A, ..." + + + + + QLineEdit + + + &Undo + + + + + &Redo + + + + + Cu&t + + + + + &Copy + + + + + &Paste + + + + + Delete + + + + + Select All + + + + + QMdiArea + + + (Untitled) + + + + + QMdiSubWindow + + + - [%1] + + + + + %1 - [%2] + + + + + Minimize + + + + + Maximize + + + + + Unshade + + + + + Shade + + + + + Restore Down + + + + + Restore + + + + + Close + + + + + Help + + + + + Menu + + + + + &Restore + + + + + &Move + + + + + &Size + + + + + Mi&nimize + + + + + Ma&ximize + + + + + Stay on &Top + + + + + &Close + + + + + QMessageBox + + + Show Details... + + + + + Hide Details... + + + + + <h3>About Qt</h3><p>This program uses Qt version %1.</p> + + + + + <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under multiple licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of GNU (L)GPL.</p><p>Qt licensed under GNU (L)GPL is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the respective licenses.</p><p>Please see <a href="http://%2/">%2</a> for an overview of Qt licensing.</p><p>Copyright (C) %1 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p><p>Qt is The Qt Company Ltd product developed as an open source project. See <a href="http://%3/">%3</a> for more information.</p> + Leave this text untranslated or include a verbatim copy of it below and note that it is the authoritative version in case of doubt. + + + + + About Qt + + + + + QProgressDialog + + + Cancel + + + + + QScrollBar + + + Scroll here + + + + + Left edge + + + + + Top + + + + + Right edge + + + + + Bottom + + + + + Page left + + + + + Page up + + + + + Page right + + + + + Page down + + + + + Scroll left + + + + + Scroll up + + + + + Scroll right + + + + + Scroll down + + + + + QTabBar + + + Scroll Left + + + + + Scroll Right + + + + + QUndoGroup + + + Undo %1 + + + + + Undo + Default text for undo action + + + + + Redo %1 + + + + + Redo + Default text for redo action + + + + + QUndoModel + + + <empty> + + + + + QUndoStack + + + Undo %1 + + + + + Undo + Default text for undo action + + + + + Redo %1 + + + + + Redo + Default text for redo action + + + + + QUnicodeControlCharacterMenu + + + LRM Left-to-right mark + + + + + RLM Right-to-left mark + + + + + ZWJ Zero width joiner + + + + + ZWNJ Zero width non-joiner + + + + + ZWSP Zero width space + + + + + LRE Start of left-to-right embedding + + + + + RLE Start of right-to-left embedding + + + + + LRO Start of left-to-right override + + + + + RLO Start of right-to-left override + + + + + PDF Pop directional formatting + + + + + LRI Left-to-right isolate + + + + + RLI Right-to-left isolate + + + + + FSI First strong isolate + + + + + PDI Pop directional isolate + + + + + Insert Unicode control character + + + + + QWhatsThisAction + + + What's This? + + + + + QWidget + + + * + + + + + QWidgetTextControl + + + &Undo + 撤销 + + + + &Redo + 重复 + + + + Cu&t + 剪切 + + + + &Copy + 拷贝 + + + + Copy &Link Location + + + + + &Paste + 粘贴 + + + + Delete + 删除 + + + + Select All + 选择全部 + + + + QWizard + + + Go Back + + + + + < &Back + + + + + Continue + + + + + &Next + + + + + &Next > + + + + + Commit + + + + + Done + + + + + &Finish + + + + + Cancel + + + + + Help + + + + + &Help + + + + diff --git a/LedOK/Languages/widgets_cn.qm b/LedOK/Languages/widgets_cn.qm new file mode 100644 index 0000000000000000000000000000000000000000..9349f02b5837d63ebb4afc114d0a329fcba6ea88 GIT binary patch literal 494 zcmcE7ks@*G{hX<16=n7(EZlq7iGhK^fq`ZD6(IeaL2FqhkY-@e?p_Zh6B)FRfar-# z+q#wlX#te8XdWK*|A7FmRv6@V1vQ_{yle%Z{N%)v%=|pOHU(t`vBPz + + + + CloseButton + + + Close Tab + + + + + QAbstractSpinBox + + + &Select All + + + + + &Step up + + + + + Step &down + + + + + QApplication + + + Executable '%1' requires Qt %2, found Qt %3. + + + + + Incompatible Qt Library Error + + + + + QColorDialog + + + Hu&e: + + + + + &Sat: + + + + + &Val: + + + + + &Red: + + + + + &Green: + + + + + Bl&ue: + + + + + A&lpha channel: + + + + + &HTML: + + + + + Cursor at %1, %2 +Press ESC to cancel + + + + + Select Color + + + + + &Basic colors + + + + + &Custom colors + + + + + &Add to Custom Colors + + + + + &Pick Screen Color + + + + + QComboBox + + + Open the combo box selection popup + + + + + False + + + + + True + + + + + QDateTimeParser + + + AM + + + + + am + + + + + PM + + + + + pm + + + + + QDialog + + + What's This? + + + + + QDialogButtonBox + + + + OK + + + + + QDirModel + + + Name + + + + + Size + + + + + Kind + Match OS X Finder + + + + + Type + All other platforms + + + + + Date Modified + + + + + QDockWidget + + + Float + Accessible name for button undocking a dock widget (floating state) + + + + + Undocks and re-attaches the dock widget + + + + + Close + Accessible name for button closing a dock widget + + + + + Closes the dock widget + + + + + QErrorMessage + + + Debug Message: + + + + + Warning: + + + + + Critical Error: + + + + + Fatal Error: + + + + + Information: + + + + + &Show this message again + + + + + &OK + + + + + QFileDialog + + + Look in: + + + + + + Back + + + + + Go back + + + + + Alt+Left + + + + + + Forward + + + + + Go forward + + + + + Alt+Right + + + + + + Parent Directory + + + + + Go to the parent directory + + + + + Alt+Up + + + + + + Create New Folder + + + + + Create a New Folder + + + + + + List View + + + + + Change to list view mode + + + + + + Detail View + + + + + Change to detail view mode + + + + + Sidebar + + + + + List of places and bookmarks + + + + + + Files + + + + + Files of type: + + + + + Find Directory + + + + + Open + + + + + Save As + + + + + Directory: + + + + + File &name: + + + + + + &Open + + + + + &Choose + + + + + &Save + + + + + Show + + + + + &Rename + + + + + &Delete + + + + + Show &hidden files + + + + + &New Folder + + + + + All files (*) + + + + + Directories + + + + + + %1 +Directory not found. +Please verify the correct directory name was given. + + + + + %1 already exists. +Do you want to replace it? + + + + + %1 +File not found. +Please verify the correct file name was given. + + + + + New Folder + + + + + + Delete + + + + + '%1' is write protected. +Do you want to delete it anyway? + + + + + Are you sure you want to delete '%1'? + + + + + Could not delete directory. + + + + + Recent Places + + + + + Remove + + + + + My Computer + + + + + Drive + + + + + %1 File + %1 is a file name suffix, for example txt + + + + + File + + + + + File Folder + Match Windows Explorer + + + + + Folder + All other platforms + + + + + Alias + OS X Finder + + + + + Shortcut + All other platforms + + + + + Unknown + + + + + QFileSystemModel + + + <b>The name "%1" cannot be used.</b><p>Try using another name, with fewer characters or no punctuation marks. + + + + + Invalid filename + + + + + Name + + + + + Size + + + + + Kind + Match OS X Finder + + + + + Type + All other platforms + + + + + Date Modified + + + + + My Computer + + + + + Computer + + + + + QFontDialog + + + Select Font + + + + + &Font + + + + + Font st&yle + + + + + &Size + + + + + Effects + + + + + Stri&keout + + + + + &Underline + + + + + Sample + + + + + Wr&iting System + + + + + QInputDialog + + + Enter a value: + + + + + QKeySequenceEdit + + + Press shortcut + + + + + %1, ... + This text is an "unfinished" shortcut, expands like "Ctrl+A, ..." + + + + + QLineEdit + + + &Undo + + + + + &Redo + + + + + Cu&t + + + + + &Copy + + + + + &Paste + + + + + Delete + + + + + Select All + + + + + QMdiArea + + + (Untitled) + + + + + QMdiSubWindow + + + - [%1] + + + + + %1 - [%2] + + + + + Minimize + + + + + Maximize + + + + + Unshade + + + + + Shade + + + + + Restore Down + + + + + Restore + + + + + Close + + + + + Help + + + + + Menu + + + + + &Restore + + + + + &Move + + + + + &Size + + + + + Mi&nimize + + + + + Ma&ximize + + + + + Stay on &Top + + + + + &Close + + + + + QMessageBox + + + Show Details... + + + + + Hide Details... + + + + + <h3>About Qt</h3><p>This program uses Qt version %1.</p> + + + + + <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under multiple licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of GNU (L)GPL.</p><p>Qt licensed under GNU (L)GPL is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the respective licenses.</p><p>Please see <a href="http://%2/">%2</a> for an overview of Qt licensing.</p><p>Copyright (C) %1 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p><p>Qt is The Qt Company Ltd product developed as an open source project. See <a href="http://%3/">%3</a> for more information.</p> + Leave this text untranslated or include a verbatim copy of it below and note that it is the authoritative version in case of doubt. + + + + + About Qt + + + + + QProgressDialog + + + Cancel + + + + + QScrollBar + + + Scroll here + + + + + Left edge + + + + + Top + + + + + Right edge + + + + + Bottom + + + + + Page left + + + + + Page up + + + + + Page right + + + + + Page down + + + + + Scroll left + + + + + Scroll up + + + + + Scroll right + + + + + Scroll down + + + + + QTabBar + + + Scroll Left + + + + + Scroll Right + + + + + QUndoGroup + + + Undo %1 + + + + + Undo + Default text for undo action + + + + + Redo %1 + + + + + Redo + Default text for redo action + + + + + QUndoModel + + + <empty> + + + + + QUndoStack + + + Undo %1 + + + + + Undo + Default text for undo action + + + + + Redo %1 + + + + + Redo + Default text for redo action + + + + + QUnicodeControlCharacterMenu + + + LRM Left-to-right mark + + + + + RLM Right-to-left mark + + + + + ZWJ Zero width joiner + + + + + ZWNJ Zero width non-joiner + + + + + ZWSP Zero width space + + + + + LRE Start of left-to-right embedding + + + + + RLE Start of right-to-left embedding + + + + + LRO Start of left-to-right override + + + + + RLO Start of right-to-left override + + + + + PDF Pop directional formatting + + + + + LRI Left-to-right isolate + + + + + RLI Right-to-left isolate + + + + + FSI First strong isolate + + + + + PDI Pop directional isolate + + + + + Insert Unicode control character + + + + + QWhatsThisAction + + + What's This? + + + + + QWidget + + + * + + + + + QWidgetTextControl + + + &Undo + 撤销 + + + + &Redo + 重复 + + + + Cu&t + 剪切 + + + + &Copy + 拷贝 + + + + Copy &Link Location + + + + + &Paste + 粘贴 + + + + Delete + 删除 + + + + Select All + 选择全部 + + + + QWizard + + + Go Back + + + + + < &Back + + + + + Continue + + + + + &Next + + + + + &Next > + + + + + Commit + + + + + Done + + + + + &Finish + + + + + Cancel + + + + + Help + + + + + &Help + + + + diff --git a/LedOK/Languages/widgets_th.qm b/LedOK/Languages/widgets_th.qm new file mode 100644 index 0000000000000000000000000000000000000000..f00d23b300cedc20356a8657ad200b38f5297108 GIT binary patch literal 494 zcmcE7ks@*G{hX<16=n7(EZlq7iGhK^fq`ZD6(IeaL2FqhkY-@e?p_Zh6B)FRfar-# z+q#wlX#SVWaj7LwJ9ho2;njo=Tfy2{K^%k nrNAv?b4krf#qV>D2^A^F12ZPPfNSCk25L$!QE<%3!DSNw>urA= literal 0 HcmV?d00001 diff --git a/LedOK/Languages/widgets_th.ts b/LedOK/Languages/widgets_th.ts new file mode 100644 index 0000000..2017b5c --- /dev/null +++ b/LedOK/Languages/widgets_th.ts @@ -0,0 +1,1192 @@ + + + + + CloseButton + + + Close Tab + + + + + QAbstractSpinBox + + + &Select All + + + + + &Step up + + + + + Step &down + + + + + QApplication + + + Executable '%1' requires Qt %2, found Qt %3. + + + + + Incompatible Qt Library Error + + + + + QColorDialog + + + Hu&e: + + + + + &Sat: + + + + + &Val: + + + + + &Red: + + + + + &Green: + + + + + Bl&ue: + + + + + A&lpha channel: + + + + + &HTML: + + + + + Cursor at %1, %2 +Press ESC to cancel + + + + + Select Color + + + + + &Basic colors + + + + + &Custom colors + + + + + &Add to Custom Colors + + + + + &Pick Screen Color + + + + + QComboBox + + + Open the combo box selection popup + + + + + False + + + + + True + + + + + QDateTimeParser + + + AM + + + + + am + + + + + PM + + + + + pm + + + + + QDialog + + + What's This? + + + + + QDialogButtonBox + + + + OK + + + + + QDirModel + + + Name + + + + + Size + + + + + Kind + Match OS X Finder + + + + + Type + All other platforms + + + + + Date Modified + + + + + QDockWidget + + + Float + Accessible name for button undocking a dock widget (floating state) + + + + + Undocks and re-attaches the dock widget + + + + + Close + Accessible name for button closing a dock widget + + + + + Closes the dock widget + + + + + QErrorMessage + + + Debug Message: + + + + + Warning: + + + + + Critical Error: + + + + + Fatal Error: + + + + + Information: + + + + + &Show this message again + + + + + &OK + + + + + QFileDialog + + + Look in: + + + + + + Back + + + + + Go back + + + + + Alt+Left + + + + + + Forward + + + + + Go forward + + + + + Alt+Right + + + + + + Parent Directory + + + + + Go to the parent directory + + + + + Alt+Up + + + + + + Create New Folder + + + + + Create a New Folder + + + + + + List View + + + + + Change to list view mode + + + + + + Detail View + + + + + Change to detail view mode + + + + + Sidebar + + + + + List of places and bookmarks + + + + + + Files + + + + + Files of type: + + + + + Find Directory + + + + + Open + + + + + Save As + + + + + Directory: + + + + + File &name: + + + + + + &Open + + + + + &Choose + + + + + &Save + + + + + Show + + + + + &Rename + + + + + &Delete + + + + + Show &hidden files + + + + + &New Folder + + + + + All files (*) + + + + + Directories + + + + + + %1 +Directory not found. +Please verify the correct directory name was given. + + + + + %1 already exists. +Do you want to replace it? + + + + + %1 +File not found. +Please verify the correct file name was given. + + + + + New Folder + + + + + + Delete + + + + + '%1' is write protected. +Do you want to delete it anyway? + + + + + Are you sure you want to delete '%1'? + + + + + Could not delete directory. + + + + + Recent Places + + + + + Remove + + + + + My Computer + + + + + Drive + + + + + %1 File + %1 is a file name suffix, for example txt + + + + + File + + + + + File Folder + Match Windows Explorer + + + + + Folder + All other platforms + + + + + Alias + OS X Finder + + + + + Shortcut + All other platforms + + + + + Unknown + + + + + QFileSystemModel + + + <b>The name "%1" cannot be used.</b><p>Try using another name, with fewer characters or no punctuation marks. + + + + + Invalid filename + + + + + Name + + + + + Size + + + + + Kind + Match OS X Finder + + + + + Type + All other platforms + + + + + Date Modified + + + + + My Computer + + + + + Computer + + + + + QFontDialog + + + Select Font + + + + + &Font + + + + + Font st&yle + + + + + &Size + + + + + Effects + + + + + Stri&keout + + + + + &Underline + + + + + Sample + + + + + Wr&iting System + + + + + QInputDialog + + + Enter a value: + + + + + QKeySequenceEdit + + + Press shortcut + + + + + %1, ... + This text is an "unfinished" shortcut, expands like "Ctrl+A, ..." + + + + + QLineEdit + + + &Undo + + + + + &Redo + + + + + Cu&t + + + + + &Copy + + + + + &Paste + + + + + Delete + + + + + Select All + + + + + QMdiArea + + + (Untitled) + + + + + QMdiSubWindow + + + - [%1] + + + + + %1 - [%2] + + + + + Minimize + + + + + Maximize + + + + + Unshade + + + + + Shade + + + + + Restore Down + + + + + Restore + + + + + Close + + + + + Help + + + + + Menu + + + + + &Restore + + + + + &Move + + + + + &Size + + + + + Mi&nimize + + + + + Ma&ximize + + + + + Stay on &Top + + + + + &Close + + + + + QMessageBox + + + Show Details... + + + + + Hide Details... + + + + + <h3>About Qt</h3><p>This program uses Qt version %1.</p> + + + + + <p>Qt is a C++ toolkit for cross-platform application development.</p><p>Qt provides single-source portability across all major desktop operating systems. It is also available for embedded Linux and other embedded and mobile operating systems.</p><p>Qt is available under multiple licensing options designed to accommodate the needs of our various users.</p><p>Qt licensed under our commercial license agreement is appropriate for development of proprietary/commercial software where you do not want to share any source code with third parties or otherwise cannot comply with the terms of GNU (L)GPL.</p><p>Qt licensed under GNU (L)GPL is appropriate for the development of Qt&nbsp;applications provided you can comply with the terms and conditions of the respective licenses.</p><p>Please see <a href="http://%2/">%2</a> for an overview of Qt licensing.</p><p>Copyright (C) %1 The Qt Company Ltd and other contributors.</p><p>Qt and the Qt logo are trademarks of The Qt Company Ltd.</p><p>Qt is The Qt Company Ltd product developed as an open source project. See <a href="http://%3/">%3</a> for more information.</p> + Leave this text untranslated or include a verbatim copy of it below and note that it is the authoritative version in case of doubt. + + + + + About Qt + + + + + QProgressDialog + + + Cancel + + + + + QScrollBar + + + Scroll here + + + + + Left edge + + + + + Top + + + + + Right edge + + + + + Bottom + + + + + Page left + + + + + Page up + + + + + Page right + + + + + Page down + + + + + Scroll left + + + + + Scroll up + + + + + Scroll right + + + + + Scroll down + + + + + QTabBar + + + Scroll Left + + + + + Scroll Right + + + + + QUndoGroup + + + Undo %1 + + + + + Undo + Default text for undo action + + + + + Redo %1 + + + + + Redo + Default text for redo action + + + + + QUndoModel + + + <empty> + + + + + QUndoStack + + + Undo %1 + + + + + Undo + Default text for undo action + + + + + Redo %1 + + + + + Redo + Default text for redo action + + + + + QUnicodeControlCharacterMenu + + + LRM Left-to-right mark + + + + + RLM Right-to-left mark + + + + + ZWJ Zero width joiner + + + + + ZWNJ Zero width non-joiner + + + + + ZWSP Zero width space + + + + + LRE Start of left-to-right embedding + + + + + RLE Start of right-to-left embedding + + + + + LRO Start of left-to-right override + + + + + RLO Start of right-to-left override + + + + + PDF Pop directional formatting + + + + + LRI Left-to-right isolate + + + + + RLI Right-to-left isolate + + + + + FSI First strong isolate + + + + + PDI Pop directional isolate + + + + + Insert Unicode control character + + + + + QWhatsThisAction + + + What's This? + + + + + QWidget + + + * + + + + + QWidgetTextControl + + + &Undo + 撤銷 + + + + &Redo + 重複 + + + + Cu&t + 剪切 + + + + &Copy + 拷貝 + + + + Copy &Link Location + + + + + &Paste + 粘貼 + + + + Delete + 删除 + + + + Select All + 選擇全部 + + + + QWizard + + + Go Back + + + + + < &Back + + + + + Continue + + + + + &Next + + + + + &Next > + + + + + Commit + + + + + Done + + + + + &Finish + + + + + Cancel + + + + + Help + + + + + &Help + + + + diff --git a/LedOK/Languages/zhCN.qm b/LedOK/Languages/zhCN.qm new file mode 100644 index 0000000000000000000000000000000000000000..70100fa0f4b501e056fcdf3478e0042cc4e65bda GIT binary patch literal 102778 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

You are being redirected...

+

If this piece of crap does not work, please click here.

+ + diff --git a/LedOK/QSimpleUpdater/doc/output/html/_downloader_8h_source.html b/LedOK/QSimpleUpdater/doc/output/html/_downloader_8h_source.html new file mode 100644 index 0000000..530b0fa --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/_downloader_8h_source.html @@ -0,0 +1,102 @@ + + + + + + +QSimpleUpdater: Downloader.h Source File + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Downloader.h
+
+
+
1 /*
2  * Copyright (c) 2014-2016 Alex Spataru <alex_spataru@outlook.com>
3  *
4  * This file is part of the QSimpleUpdater library, which is released under
5  * the DBAD license, you can read a copy of it below:
6  *
7  * DON'T BE A DICK PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING,
8  * DISTRIBUTION AND MODIFICATION:
9  *
10  * Do whatever you like with the original work, just don't be a dick.
11  * Being a dick includes - but is not limited to - the following instances:
12  *
13  * 1a. Outright copyright infringement - Don't just copy this and change the
14  * name.
15  * 1b. Selling the unmodified original with no work done what-so-ever, that's
16  * REALLY being a dick.
17  * 1c. Modifying the original work to contain hidden harmful content.
18  * That would make you a PROPER dick.
19  *
20  * If you become rich through modifications, related works/services, or
21  * supporting the original work, share the love.
22  * Only a dick would make loads off this work and not buy the original works
23  * creator(s) a pint.
24  *
25  * Code is provided with no warranty. Using somebody else's code and bitching
26  * when it goes wrong makes you a DONKEY dick.
27  * Fix the problem yourself. A non-dick would submit the fix back.
28  */
29 
30 #ifndef DOWNLOAD_DIALOG_H
31 #define DOWNLOAD_DIALOG_H
32 
33 #include <QDialog>
34 #include <ui_Downloader.h>
35 
36 namespace Ui {
37 class Downloader;
38 }
39 
40 class QNetworkReply;
41 class QNetworkAccessManager;
42 
46 class Downloader : public QWidget {
47  Q_OBJECT
48 
49  signals:
50  void downloadFinished (const QString& url, const QString& filepath);
51 
52  public:
53  explicit Downloader (QWidget* parent = 0);
54  ~Downloader();
55 
56  bool useCustomInstallProcedures() const;
57 
58  public slots:
59  void startDownload (const QUrl& url);
60  void setUseCustomInstallProcedures (const bool& custom);
61 
62  private slots:
63  void openDownload();
64  void installUpdate();
65  void cancelDownload();
66  void onDownloadFinished();
67  void calculateSizes (qint64 received, qint64 total);
68  void updateProgress (qint64 received, qint64 total);
69  void calculateTimeRemaining (qint64 received, qint64 total);
70 
71  private:
72  qreal round (const qreal& input);
73 
74  private:
75  uint m_startTime;
76  QString m_filePath;
77  Ui::Downloader* m_ui;
78  QNetworkReply* m_reply;
79  bool m_useCustomProcedures;
80  QNetworkAccessManager* m_manager;
81 };
82 
83 #endif
Definition: Downloader.h:36
+
Implements an integrated file downloader with a nice UI.
Definition: Downloader.h:46
+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/_q_simple_updater_8h_source.html b/LedOK/QSimpleUpdater/doc/output/html/_q_simple_updater_8h_source.html new file mode 100644 index 0000000..66cbdc7 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/_q_simple_updater_8h_source.html @@ -0,0 +1,102 @@ + + + + + + +QSimpleUpdater: QSimpleUpdater.h Source File + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
QSimpleUpdater.h
+
+
+
1 /*
2  * Copyright (c) 2014-2016 Alex Spataru <alex_spataru@outlook.com>
3  *
4  * This file is part of the QSimpleUpdater library, which is released under
5  * the DBAD license, you can read a copy of it below:
6  *
7  * DON'T BE A DICK PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING,
8  * DISTRIBUTION AND MODIFICATION:
9  *
10  * Do whatever you like with the original work, just don't be a dick.
11  * Being a dick includes - but is not limited to - the following instances:
12  *
13  * 1a. Outright copyright infringement - Don't just copy this and change the
14  * name.
15  * 1b. Selling the unmodified original with no work done what-so-ever, that's
16  * REALLY being a dick.
17  * 1c. Modifying the original work to contain hidden harmful content.
18  * That would make you a PROPER dick.
19  *
20  * If you become rich through modifications, related works/services, or
21  * supporting the original work, share the love.
22  * Only a dick would make loads off this work and not buy the original works
23  * creator(s) a pint.
24  *
25  * Code is provided with no warranty. Using somebody else's code and bitching
26  * when it goes wrong makes you a DONKEY dick.
27  * Fix the problem yourself. A non-dick would submit the fix back.
28  */
29 
30 #ifndef _QSIMPLEUPDATER_MAIN_H
31 #define _QSIMPLEUPDATER_MAIN_H
32 
33 #include <QUrl>
34 #include <QList>
35 #include <QObject>
36 
37 #if defined (QSU_SHARED)
38  #define QSU_DECL Q_DECL_EXPORT
39 #elif defined (QSU_IMPORT)
40  #define QSU_DECL Q_DECL_IMPORT
41 #else
42  #define QSU_DECL
43 #endif
44 
45 class Updater;
46 
66 class QSU_DECL QSimpleUpdater : public QObject {
67  Q_OBJECT
68 
69  signals:
70  void checkingFinished (const QString& url);
71  void downloadFinished (const QString& url, const QString& filepath);
72 
73  public:
74  static QSimpleUpdater* getInstance();
75 
76  bool getNotifyOnUpdate (const QString& url) const;
77  bool getNotifyOnFinish (const QString& url) const;
78  bool getUpdateAvailable (const QString& url) const;
79  bool getDownloaderEnabled (const QString& url) const;
80  bool usesCustomInstallProcedures (const QString& url) const;
81 
82  QString getChangelog (const QString& url) const;
83  QString getModuleName (const QString& url) const;
84  QString getDownloadUrl (const QString& url) const;
85  QString getPlatformKey (const QString& url) const;
86  QString getLatestVersion (const QString& url) const;
87  QString getModuleVersion (const QString& url) const;
88 
89  public slots:
90  void checkForUpdates (const QString& url);
91  void setModuleName (const QString& url, const QString& name);
92  void setNotifyOnUpdate (const QString& url, const bool& notify);
93  void setNotifyOnFinish (const QString& url, const bool& notify);
94  void setPlatformKey (const QString& url, const QString& platform);
95  void setModuleVersion (const QString& url, const QString& version);
96  void setDownloaderEnabled (const QString& url, const bool& enabled);
97  void setUseCustomInstallProcedures (const QString& url, const bool& custom);
98 
99  protected:
100  ~QSimpleUpdater();
101 
102  private:
103  Updater* getUpdater (const QString& url) const;
104 };
105 
106 #endif
Downloads and interprests the update definition file.
Definition: Updater.h:45
+
Manages the updater instances.
Definition: QSimpleUpdater.h:66
+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/_updater_8h_source.html b/LedOK/QSimpleUpdater/doc/output/html/_updater_8h_source.html new file mode 100644 index 0000000..10dfd38 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/_updater_8h_source.html @@ -0,0 +1,102 @@ + + + + + + +QSimpleUpdater: Updater.h Source File + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Updater.h
+
+
+
1 /*
2  * Copyright (c) 2014-2016 Alex Spataru <alex_spataru@outlook.com>
3  *
4  * This file is part of the QSimpleUpdater library, which is released under
5  * the DBAD license, you can read a copy of it below:
6  *
7  * DON'T BE A DICK PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING,
8  * DISTRIBUTION AND MODIFICATION:
9  *
10  * Do whatever you like with the original work, just don't be a dick.
11  * Being a dick includes - but is not limited to - the following instances:
12  *
13  * 1a. Outright copyright infringement - Don't just copy this and change the
14  * name.
15  * 1b. Selling the unmodified original with no work done what-so-ever, that's
16  * REALLY being a dick.
17  * 1c. Modifying the original work to contain hidden harmful content.
18  * That would make you a PROPER dick.
19  *
20  * If you become rich through modifications, related works/services, or
21  * supporting the original work, share the love.
22  * Only a dick would make loads off this work and not buy the original works
23  * creator(s) a pint.
24  *
25  * Code is provided with no warranty. Using somebody else's code and bitching
26  * when it goes wrong makes you a DONKEY dick.
27  * Fix the problem yourself. A non-dick would submit the fix back.
28  */
29 
30 #ifndef _QSIMPLEUPDATER_UPDATER_H
31 #define _QSIMPLEUPDATER_UPDATER_H
32 
33 #include <QUrl>
34 #include <QObject>
35 #include <QNetworkReply>
36 #include <QNetworkAccessManager>
37 
38 #include <QSimpleUpdater.h>
39 
40 class Downloader;
41 
45 class QSU_DECL Updater : public QObject {
46  Q_OBJECT
47 
48  signals:
49  void checkingFinished (const QString& url);
50  void downloadFinished (const QString& url, const QString& filepath);
51 
52  public:
53  Updater();
54  ~Updater();
55 
56  QString url() const;
57  QString changelog() const;
58  QString moduleName() const;
59  QString downloadUrl() const;
60  QString platformKey() const;
61  QString moduleVersion() const;
62  QString latestVersion() const;
63 
64  bool notifyOnUpdate() const;
65  bool notifyOnFinish() const;
66  bool updateAvailable() const;
67  bool downloaderEnabled() const;
68  bool useCustomInstallProcedures() const;
69 
70  public slots:
71  void checkForUpdates();
72  void setUrl (const QString& url);
73  void setModuleName (const QString& name);
74  void setNotifyOnUpdate (const bool& notify);
75  void setNotifyOnFinish (const bool& notify);
76  void setModuleVersion (const QString& version);
77  void setDownloaderEnabled (const bool& enabled);
78  void setPlatformKey (const QString& platformKey);
79  void setUseCustomInstallProcedures (const bool& custom);
80 
81  private slots:
82  void onReply (QNetworkReply* reply);
83  void setUpdateAvailable (const bool& available);
84 
85  private:
86  bool compare (const QString& x, const QString& y);
87 
88  private:
89  QString m_url;
90 
91  bool m_notifyOnUpdate;
92  bool m_notifyOnFinish;
93  bool m_updateAvailable;
94  bool m_downloaderEnabled;
95 
96  QString m_openUrl;
97  QString m_platform;
98  QString m_changelog;
99  QString m_moduleName;
100  QString m_downloadUrl;
101  QString m_moduleVersion;
102  QString m_latestVersion;
103 
104  Downloader* m_downloader;
105  QNetworkAccessManager* m_manager;
106 };
107 
108 #endif
Downloads and interprests the update definition file.
Definition: Updater.h:45
+
Implements an integrated file downloader with a nice UI.
Definition: Downloader.h:46
+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/annotated.html b/LedOK/QSimpleUpdater/doc/output/html/annotated.html new file mode 100644 index 0000000..12a2e06 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/annotated.html @@ -0,0 +1,106 @@ + + + + + + +QSimpleUpdater: Class List + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + +
 CDownloaderImplements an integrated file downloader with a nice UI
 CQSimpleUpdaterManages the updater instances
 CUpdaterDownloads and interprests the update definition file
+
+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/arrowdown.png b/LedOK/QSimpleUpdater/doc/output/html/arrowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..0b63f6d38c4b9ec907b820192ebe9724ed6eca22 GIT binary patch literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/arrowright.png b/LedOK/QSimpleUpdater/doc/output/html/arrowright.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ee22f937a07d1dbfc27c669d11f8ed13e2f152 GIT binary patch literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/bc_s.png b/LedOK/QSimpleUpdater/doc/output/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/bdwn.png b/LedOK/QSimpleUpdater/doc/output/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + +QSimpleUpdater: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
Downloader Member List
+
+
+ +

This is the complete list of members for Downloader, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
calculateSizes(qint64 received, qint64 total)Downloaderprivateslot
calculateTimeRemaining(qint64 received, qint64 total)Downloaderprivateslot
cancelDownload()Downloaderprivateslot
Downloader(QWidget *parent=0) (defined in Downloader)Downloaderexplicit
downloadFinished(const QString &url, const QString &filepath) (defined in Downloader)Downloadersignal
installUpdate()Downloaderprivateslot
m_filePath (defined in Downloader)Downloaderprivate
m_manager (defined in Downloader)Downloaderprivate
m_reply (defined in Downloader)Downloaderprivate
m_startTime (defined in Downloader)Downloaderprivate
m_ui (defined in Downloader)Downloaderprivate
m_useCustomProcedures (defined in Downloader)Downloaderprivate
onDownloadFinished()Downloaderprivateslot
openDownload()Downloaderprivateslot
round(const qreal &input)Downloaderprivate
setUseCustomInstallProcedures(const bool &custom)Downloaderslot
startDownload(const QUrl &url)Downloaderslot
updateProgress(qint64 received, qint64 total)Downloaderprivateslot
useCustomInstallProcedures() const Downloader
~Downloader() (defined in Downloader)Downloader
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/class_downloader.html b/LedOK/QSimpleUpdater/doc/output/html/class_downloader.html new file mode 100644 index 0000000..6557dfe --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/class_downloader.html @@ -0,0 +1,517 @@ + + + + + + +QSimpleUpdater: Downloader Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

Implements an integrated file downloader with a nice UI. + More...

+ +

#include <Downloader.h>

+
+Inheritance diagram for Downloader:
+
+
+ + + +
+ + + + + + +

+Public Slots

void startDownload (const QUrl &url)
 
void setUseCustomInstallProcedures (const bool &custom)
 
+ + + +

+Signals

+void downloadFinished (const QString &url, const QString &filepath)
 
+ + + + + +

+Public Member Functions

Downloader (QWidget *parent=0)
 
bool useCustomInstallProcedures () const
 
+ + + + + + + + + + + + + + + +

+Private Slots

void openDownload ()
 
void installUpdate ()
 
void cancelDownload ()
 
void onDownloadFinished ()
 
void calculateSizes (qint64 received, qint64 total)
 
void updateProgress (qint64 received, qint64 total)
 
void calculateTimeRemaining (qint64 received, qint64 total)
 
+ + + +

+Private Member Functions

qreal round (const qreal &input)
 
+ + + + + + + + + + + + + +

+Private Attributes

+uint m_startTime
 
+QString m_filePath
 
+Ui::Downloader * m_ui
 
+QNetworkReply * m_reply
 
+bool m_useCustomProcedures
 
+QNetworkAccessManager * m_manager
 
+

Detailed Description

+

Implements an integrated file downloader with a nice UI.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Downloader::calculateSizes (qint64 received,
qint64 total 
)
+
+privateslot
+
+

Calculates the appropiate size units (bytes, KB or MB) for the received data and the total download size. Then, this function proceeds to update the dialog controls/UI.

+ +

References round().

+ +

Referenced by updateProgress().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Downloader::calculateTimeRemaining (qint64 received,
qint64 total 
)
+
+privateslot
+
+

Uses two time samples (from the current time and a previous sample) to calculate how many bytes have been downloaded.

+

Then, this function proceeds to calculate the appropiate units of time (hours, minutes or seconds) and constructs a user-friendly string, which is displayed in the dialog.

+ +

Referenced by updateProgress().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void Downloader::cancelDownload ()
+
+privateslot
+
+

Prompts the user if he/she wants to cancel the download and cancels the download if the user agrees to do that.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void Downloader::installUpdate ()
+
+privateslot
+
+

Instructs the OS to open the downloaded file.

+
Note
If useCustomInstallProcedures() returns true, the function will not instruct the OS to open the downloaded file. You can use the signals fired by the QSimpleUpdater to install the update with your own implementations/code.
+ +

References openDownload(), and useCustomInstallProcedures().

+ +

Referenced by onDownloadFinished().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void Downloader::onDownloadFinished ()
+
+privateslot
+
+

Writes the downloaded data to a temp. directory and updates the UI controls.

Note
If the function detects that the downloaded data is an HTML file (e.g. a redirection notice from the server), the function will add the *.html extension to the downloaded file. This ensures that the download will be resumed when the OS opens a web-browser with the redirection notice.
+ +

References installUpdate().

+ +

Referenced by startDownload().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void Downloader::openDownload ()
+
+privateslot
+
+

Opens the downloaded file.

Note
If the downloaded file is not found, then the function will alert the user about the error.
+ +

Referenced by installUpdate().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
qreal Downloader::round (const qreal & input)
+
+private
+
+

Rounds the given input to two decimal places

+ +

Referenced by calculateSizes().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Downloader::setUseCustomInstallProcedures (const bool & custom)
+
+slot
+
+

If the custom parameter is set to true, then the Downloader will not attempt to open the downloaded file.

+

Use the signals fired by the QSimpleUpdater to implement your own install procedures.

+ +

Referenced by Updater::setUseCustomInstallProcedures().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Downloader::startDownload (const QUrl & url)
+
+slot
+
+

Begins downloading the file at the given url

+ +

References onDownloadFinished(), and updateProgress().

+ +

Referenced by Updater::setUpdateAvailable().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void Downloader::updateProgress (qint64 received,
qint64 total 
)
+
+privateslot
+
+

Uses the received and total parameters to get the download progress and update the progressbar value on the dialog.

+ +

References calculateSizes(), and calculateTimeRemaining().

+ +

Referenced by startDownload().

+ +
+
+ +
+
+ + + + + + + +
bool Downloader::useCustomInstallProcedures () const
+
+

Returns true if the updater shall not intervene when the download has finished (you can use the QSimpleUpdater signals to know when the download is completed).

+ +

Referenced by installUpdate(), and Updater::useCustomInstallProcedures().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/class_downloader.png b/LedOK/QSimpleUpdater/doc/output/html/class_downloader.png new file mode 100644 index 0000000000000000000000000000000000000000..23c2a076ee290e7c2c6cf05645036a8f2060f0c8 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBBm#UwT>t<74`jZ0^R=}9&;%e0 zj1L?*z}k679?0b=3GxeO04f53tEWPY7#J9>JY5_^Dj46+^`3NCfyZUO*}LEOE0PL+ zSU+w^GYp;bvP0;@nhOt1)6(W0QaR}_t>Kw1#pJ))>CCRQ(#gM%Fx)uQ6&idX#wYmU z>Ni?*Uj7K5$D|*0akbM%(esTTGk5q-m~xxfVC@cex94)<5{5S??Y^|Hcqj9@w+~DC zc5}Jwv2R;)=ULvVcGLUJuP5tyPF2%-!~gkTjpwBK|Cln;o@q3=TQS%?<+b5UUu6E_ z=x5bk%>NrtOLJ^k!OIeHnT=^pCNtx;EsYG>w;UQao;hRF%J>5$GNs|7V#CI^1Ke@1~_)$-z#LlaG^WrQGSbM(h{XBgp zf5XR@jkOwoU&fjxEQtU9;h&7!?Wly8MMpyQ-tXplun=VNPg6tV&zJch$m@$Pt@zyp P3|R(GS3j3^P6 + + + + + +QSimpleUpdater: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
QSimpleUpdater Member List
+
+
+ +

This is the complete list of members for QSimpleUpdater, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
checkForUpdates(const QString &url)QSimpleUpdaterslot
checkingFinished(const QString &url) (defined in QSimpleUpdater)QSimpleUpdatersignal
downloadFinished(const QString &url, const QString &filepath) (defined in QSimpleUpdater)QSimpleUpdatersignal
getChangelog(const QString &url) const QSimpleUpdater
getDownloaderEnabled(const QString &url) const QSimpleUpdater
getDownloadUrl(const QString &url) const QSimpleUpdater
getInstance()QSimpleUpdaterstatic
getLatestVersion(const QString &url) const QSimpleUpdater
getModuleName(const QString &url) const QSimpleUpdater
getModuleVersion(const QString &url) const QSimpleUpdater
getNotifyOnFinish(const QString &url) const QSimpleUpdater
getNotifyOnUpdate(const QString &url) const QSimpleUpdater
getPlatformKey(const QString &url) const QSimpleUpdater
getUpdateAvailable(const QString &url) const QSimpleUpdater
getUpdater(const QString &url) const QSimpleUpdaterprivate
setDownloaderEnabled(const QString &url, const bool &enabled)QSimpleUpdaterslot
setModuleName(const QString &url, const QString &name)QSimpleUpdaterslot
setModuleVersion(const QString &url, const QString &version)QSimpleUpdaterslot
setNotifyOnFinish(const QString &url, const bool &notify)QSimpleUpdaterslot
setNotifyOnUpdate(const QString &url, const bool &notify)QSimpleUpdaterslot
setPlatformKey(const QString &url, const QString &platform)QSimpleUpdaterslot
setUseCustomInstallProcedures(const QString &url, const bool &custom)QSimpleUpdaterslot
usesCustomInstallProcedures(const QString &url) const QSimpleUpdater
~QSimpleUpdater() (defined in QSimpleUpdater)QSimpleUpdaterprotected
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater.html b/LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater.html new file mode 100644 index 0000000..765a386 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater.html @@ -0,0 +1,787 @@ + + + + + + +QSimpleUpdater: QSimpleUpdater Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

Manages the updater instances. + More...

+ +

#include <QSimpleUpdater.h>

+
+Inheritance diagram for QSimpleUpdater:
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + +

+Public Slots

void checkForUpdates (const QString &url)
 
void setModuleName (const QString &url, const QString &name)
 
void setNotifyOnUpdate (const QString &url, const bool &notify)
 
void setNotifyOnFinish (const QString &url, const bool &notify)
 
void setPlatformKey (const QString &url, const QString &platform)
 
void setModuleVersion (const QString &url, const QString &version)
 
void setDownloaderEnabled (const QString &url, const bool &enabled)
 
void setUseCustomInstallProcedures (const QString &url, const bool &custom)
 
+ + + + + +

+Signals

+void checkingFinished (const QString &url)
 
+void downloadFinished (const QString &url, const QString &filepath)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

bool getNotifyOnUpdate (const QString &url) const
 
bool getNotifyOnFinish (const QString &url) const
 
bool getUpdateAvailable (const QString &url) const
 
bool getDownloaderEnabled (const QString &url) const
 
bool usesCustomInstallProcedures (const QString &url) const
 
QString getChangelog (const QString &url) const
 
QString getModuleName (const QString &url) const
 
QString getDownloadUrl (const QString &url) const
 
QString getPlatformKey (const QString &url) const
 
QString getLatestVersion (const QString &url) const
 
QString getModuleVersion (const QString &url) const
 
+ + + +

+Static Public Member Functions

static QSimpleUpdatergetInstance ()
 
+ + + +

+Private Member Functions

UpdatergetUpdater (const QString &url) const
 
+

Detailed Description

+

Manages the updater instances.

+

The QSimpleUpdater class manages the updater system and allows for parallel application modules to check for updates and download them.

+

The behavior of each updater can be regulated by specifying the update definitions URL (from where we download the individual update definitions) and defining the desired options by calling the individual "setter" functions (e.g. setNotifyOnUpdate()).

+

The QSimpleUpdater also implements an integrated downloader. If you need to use a custom install procedure/code, just create a function that is called when the downloadFinished() signal is emitted to implement your own install procedures.

+

By default, the downloader will try to open the file as if you opened it from a file manager or a web browser (with the "file:*" url).

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
void QSimpleUpdater::checkForUpdates (const QString & url)
+
+slot
+
+

Instructs the Updater instance with the registered url to download and interpret the update definitions file.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References Updater::checkForUpdates(), and getUpdater().

+ +
+
+ +
+
+ + + + + + + + +
QString QSimpleUpdater::getChangelog (const QString & url) const
+
+

Returns the changelog of the Updater instance registered with the given url.

+
Warning
You should call checkForUpdates() before using this function
+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References Updater::changelog(), and getUpdater().

+ +
+
+ +
+
+ + + + + + + + +
bool QSimpleUpdater::getDownloaderEnabled (const QString & url) const
+
+

Returns true if the Updater instance registered with the given url has the integrated downloader enabled.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References Updater::downloaderEnabled(), and getUpdater().

+ +
+
+ +
+
+ + + + + + + + +
QString QSimpleUpdater::getDownloadUrl (const QString & url) const
+
+

Returns the download URL of the Updater instance registered with the given url.

+
Warning
You should call checkForUpdates() before using this function
+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References Updater::downloadUrl(), and getUpdater().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
QSimpleUpdater * QSimpleUpdater::getInstance ()
+
+static
+
+

Returns the only instance of the class

+ +
+
+ +
+
+ + + + + + + + +
QString QSimpleUpdater::getLatestVersion (const QString & url) const
+
+

Returns the remote module version of the Updater instance registered with the given url.

+
Warning
You should call checkForUpdates() before using this function
+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::latestVersion().

+ +
+
+ +
+
+ + + + + + + + +
QString QSimpleUpdater::getModuleName (const QString & url) const
+
+

Returns the module name of the Updater instance registered with the given url.

+
Note
If the module name is empty, then the Updater will use the application name as its module name.
+
+If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::moduleName().

+ +
+
+ +
+
+ + + + + + + + +
QString QSimpleUpdater::getModuleVersion (const QString & url) const
+
+

Returns the module version of the Updater instance registered with the given url.

+
Note
If the module version is empty, then the Updater will use the application version as its module version.
+
+If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::moduleVersion().

+ +
+
+ +
+
+ + + + + + + + +
bool QSimpleUpdater::getNotifyOnFinish (const QString & url) const
+
+

Returns true if the Updater instance registered with the given url shall notify the user when it finishes checking for updates.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::notifyOnFinish().

+ +
+
+ +
+
+ + + + + + + + +
bool QSimpleUpdater::getNotifyOnUpdate (const QString & url) const
+
+

Returns true if the Updater instance registered with the given url shall notify the user when an update is available.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::notifyOnUpdate().

+ +
+
+ +
+
+ + + + + + + + +
QString QSimpleUpdater::getPlatformKey (const QString & url) const
+
+

Returns the platform key of the Updater registered with the given url. If you do not define a platform key, the system will assign the following platform key:

    +
  • On iOS: ios
  • +
  • On Mac OSX: osx
  • +
  • On Android: android
  • +
  • On GNU/Linux: linux
  • +
  • On Microsoft Windows: windows
  • +
+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::platformKey().

+ +
+
+ +
+
+ + + + + + + + +
bool QSimpleUpdater::getUpdateAvailable (const QString & url) const
+
+

Returns true if the Updater instance registered with the given url has an update available.

+
Warning
You should call checkForUpdates() before using this function
+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::updateAvailable().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
Updater * QSimpleUpdater::getUpdater (const QString & url) const
+
+private
+
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void QSimpleUpdater::setDownloaderEnabled (const QString & url,
const bool & enabled 
)
+
+slot
+
+

If the enabled parameter is set to true, the Updater instance registered with the given url will open the integrated downloader if the user agrees to install the update (if any).

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::setDownloaderEnabled().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void QSimpleUpdater::setModuleName (const QString & url,
const QString & name 
)
+
+slot
+
+

Changes the module name of the Updater instance registered at the given url.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+
+The module name is used on the user prompts. If the module name is empty, then the prompts will show the name of the application.
+ +

References getUpdater(), and Updater::setModuleName().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void QSimpleUpdater::setModuleVersion (const QString & url,
const QString & version 
)
+
+slot
+
+

Changes the module

Version
of the Updater instance registered at the given url.
+
Note
The module version is used to compare it with the remove version. If the module name is empty, then the Updater instance will use the application version.
+ +

References getUpdater(), and Updater::setModuleVersion().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void QSimpleUpdater::setNotifyOnFinish (const QString & url,
const bool & notify 
)
+
+slot
+
+

If notify is set to true, then the Updater instance registered with the given url will notify the user when it has finished interpreting the update definitions file.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::setNotifyOnFinish().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void QSimpleUpdater::setNotifyOnUpdate (const QString & url,
const bool & notify 
)
+
+slot
+
+

If notify is set to true, then the Updater instance registered with the given url will notify the user when an update is available.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::setNotifyOnUpdate().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void QSimpleUpdater::setPlatformKey (const QString & url,
const QString & platform 
)
+
+slot
+
+

Changes the platform key of the Updater isntance registered at the given url.

+

If the platform key is empty, then the system will use the following keys:

    +
  • On iOS: ios
  • +
  • On Mac OSX: osx
  • +
  • On Android: android
  • +
  • On GNU/Linux: linux
  • +
  • On Microsoft Windows: windows
  • +
+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::setPlatformKey().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void QSimpleUpdater::setUseCustomInstallProcedures (const QString & url,
const bool & custom 
)
+
+slot
+
+

If the custom parameter is set to true, the Updater instance registered with the given url will not try to open the downloaded file.

+

If you want to implement your own way to handle the downloaded file, just bind to the downloadFinished() signal and disable the integrated downloader with the setUseCustomInstallProcedures() function.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::setUseCustomInstallProcedures().

+ +
+
+ +
+
+ + + + + + + + +
bool QSimpleUpdater::usesCustomInstallProcedures (const QString & url) const
+
+

Returns true if the Updater instance registered with the given url shall try to open the downloaded file.

+

If you want to implement your own way to handle the downloaded file, just bind to the downloadFinished() signal and disable the integrated downloader with the setUseCustomInstallProcedures() function.

+
Note
If an Updater instance registered with the given url is not found, that Updater instance will be initialized automatically
+ +

References getUpdater(), and Updater::useCustomInstallProcedures().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater.png b/LedOK/QSimpleUpdater/doc/output/html/class_q_simple_updater.png new file mode 100644 index 0000000000000000000000000000000000000000..0addadd802dcadf7fbf57920c60b699bdb5d0588 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^=|CL7!3-pgAI!c7q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg%ROBjLn;{G&b?jsT7ievUH|6)|HpF~ zlnV;ZO%%SoZi>#fi90g{PCOAc-pqMOpUTm%*%sepUaox`8WcXy>X-O&+v~?K zwuD>k`*zK%P<1ND`_SI#NpdA^lka;)$9rB1SpG<|;NFJ(cb^+42S4_m^Se>z_-7Ty z__N!&&n>SpjSkCw*!xL$yVoU;=kJ?u?1?|m=@d?_M$Uq)`>fWm^X0FI3p)Q|844ix49^_UAJ&@#A<~dVDdkrHR z%vD#*Z+y)%>(Lym;s=j9OZO zpFME; + + + + + +QSimpleUpdater: Member List + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+
+
+
Updater Member List
+
+
+ +

This is the complete list of members for Updater, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
changelog() const Updater
checkForUpdates()Updaterslot
checkingFinished(const QString &url) (defined in Updater)Updatersignal
compare(const QString &x, const QString &y)Updaterprivate
downloaderEnabled() const Updater
downloadFinished(const QString &url, const QString &filepath) (defined in Updater)Updatersignal
downloadUrl() const Updater
latestVersion() const Updater
m_changelog (defined in Updater)Updaterprivate
m_downloader (defined in Updater)Updaterprivate
m_downloaderEnabled (defined in Updater)Updaterprivate
m_downloadUrl (defined in Updater)Updaterprivate
m_latestVersion (defined in Updater)Updaterprivate
m_manager (defined in Updater)Updaterprivate
m_moduleName (defined in Updater)Updaterprivate
m_moduleVersion (defined in Updater)Updaterprivate
m_notifyOnFinish (defined in Updater)Updaterprivate
m_notifyOnUpdate (defined in Updater)Updaterprivate
m_openUrl (defined in Updater)Updaterprivate
m_platform (defined in Updater)Updaterprivate
m_updateAvailable (defined in Updater)Updaterprivate
m_url (defined in Updater)Updaterprivate
moduleName() const Updater
moduleVersion() const Updater
notifyOnFinish() const Updater
notifyOnUpdate() const Updater
onReply(QNetworkReply *reply)Updaterprivateslot
platformKey() const Updater
setDownloaderEnabled(const bool &enabled)Updaterslot
setModuleName(const QString &name)Updaterslot
setModuleVersion(const QString &version)Updaterslot
setNotifyOnFinish(const bool &notify)Updaterslot
setNotifyOnUpdate(const bool &notify)Updaterslot
setPlatformKey(const QString &platformKey)Updaterslot
setUpdateAvailable(const bool &available)Updaterprivateslot
setUrl(const QString &url)Updaterslot
setUseCustomInstallProcedures(const bool &custom)Updaterslot
updateAvailable() const Updater
Updater() (defined in Updater)Updater
url() const Updater
useCustomInstallProcedures() const Updater
~Updater() (defined in Updater)Updater
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/class_updater.html b/LedOK/QSimpleUpdater/doc/output/html/class_updater.html new file mode 100644 index 0000000..b76c110 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/class_updater.html @@ -0,0 +1,820 @@ + + + + + + +QSimpleUpdater: Updater Class Reference + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

Downloads and interprests the update definition file. + More...

+ +

#include <Updater.h>

+
+Inheritance diagram for Updater:
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + +

+Public Slots

void checkForUpdates ()
 
void setUrl (const QString &url)
 
void setModuleName (const QString &name)
 
void setNotifyOnUpdate (const bool &notify)
 
void setNotifyOnFinish (const bool &notify)
 
void setModuleVersion (const QString &version)
 
void setDownloaderEnabled (const bool &enabled)
 
void setPlatformKey (const QString &platformKey)
 
void setUseCustomInstallProcedures (const bool &custom)
 
+ + + + + +

+Signals

+void checkingFinished (const QString &url)
 
+void downloadFinished (const QString &url, const QString &filepath)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

QString url () const
 
QString changelog () const
 
QString moduleName () const
 
QString downloadUrl () const
 
QString platformKey () const
 
QString moduleVersion () const
 
QString latestVersion () const
 
bool notifyOnUpdate () const
 
bool notifyOnFinish () const
 
bool updateAvailable () const
 
bool downloaderEnabled () const
 
bool useCustomInstallProcedures () const
 
+ + + + + +

+Private Slots

void onReply (QNetworkReply *reply)
 
void setUpdateAvailable (const bool &available)
 
+ + + +

+Private Member Functions

bool compare (const QString &x, const QString &y)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QString m_url
 
+bool m_notifyOnUpdate
 
+bool m_notifyOnFinish
 
+bool m_updateAvailable
 
+bool m_downloaderEnabled
 
+QString m_openUrl
 
+QString m_platform
 
+QString m_changelog
 
+QString m_moduleName
 
+QString m_downloadUrl
 
+QString m_moduleVersion
 
+QString m_latestVersion
 
+Downloaderm_downloader
 
+QNetworkAccessManager * m_manager
 
+

Detailed Description

+

Downloads and interprests the update definition file.

+

Member Function Documentation

+ +
+
+ + + + + + + +
QString Updater::changelog () const
+
+

Returns the changelog defined by the update definitions file.

Warning
You should call checkForUpdates() before using this function
+ +

Referenced by QSimpleUpdater::getChangelog().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void Updater::checkForUpdates ()
+
+slot
+
+

Downloads and interpets the update definitions file referenced by the url() function.

+ +

References url().

+ +

Referenced by QSimpleUpdater::checkForUpdates().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool Updater::compare (const QString & x,
const QString & y 
)
+
+private
+
+

Compares the two version strings (x and y).

    +
  • If x is greater than , this function returns true.
  • +
  • If y is greater than , this function returns false.
  • +
  • If both versions are the same, this function returns false.
  • +
+ +

Referenced by onReply().

+ +
+
+ +
+
+ + + + + + + +
bool Updater::downloaderEnabled () const
+
+

Returns true if the integrated downloader is enabled.

Note
If set to true, the Updater will open the downloader dialog if the user agrees to download the update.
+ +

Referenced by QSimpleUpdater::getDownloaderEnabled(), and setUpdateAvailable().

+ +
+
+ +
+
+ + + + + + + +
QString Updater::downloadUrl () const
+
+

Returns the download URL defined by the update definitions file.

Warning
You should call checkForUpdates() before using this function
+ +

Referenced by QSimpleUpdater::getDownloadUrl(), and setUpdateAvailable().

+ +
+
+ +
+
+ + + + + + + +
QString Updater::latestVersion () const
+
+

Returns the latest version defined by the update definitions file.

Warning
You should call checkForUpdates() before using this function
+ +

Referenced by QSimpleUpdater::getLatestVersion(), onReply(), and setUpdateAvailable().

+ +
+
+ +
+
+ + + + + + + +
QString Updater::moduleName () const
+
+

Returns the name of the module (if defined)

+ +

Referenced by QSimpleUpdater::getModuleName(), and setUpdateAvailable().

+ +
+
+ +
+
+ + + + + + + +
QString Updater::moduleVersion () const
+
+

Returns the "local" version of the installed module

+ +

Referenced by QSimpleUpdater::getModuleVersion(), and onReply().

+ +
+
+ +
+
+ + + + + + + +
bool Updater::notifyOnFinish () const
+
+

Returns true if the updater should notify the user when it finishes checking for updates.

+
Note
If set to true, the Updater will notify the user even when there are no updates available (by congratulating him/her about being smart)
+ +

Referenced by QSimpleUpdater::getNotifyOnFinish(), and setUpdateAvailable().

+ +
+
+ +
+
+ + + + + + + +
bool Updater::notifyOnUpdate () const
+
+

Returns true if the updater should notify the user when an update is available.

+ +

Referenced by QSimpleUpdater::getNotifyOnUpdate(), and setUpdateAvailable().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::onReply (QNetworkReply * reply)
+
+privateslot
+
+

Called when the download of the update definitions file is finished.

+ +

References compare(), latestVersion(), moduleVersion(), platformKey(), setUpdateAvailable(), and url().

+ +
+
+ +
+
+ + + + + + + +
QString Updater::platformKey () const
+
+

Returns the platform key (be it system-set or user-set). If you do not define a platform key, the system will assign the following platform key:

    +
  • On iOS: ios
  • +
  • On Mac OSX: osx
  • +
  • On Android: android
  • +
  • On GNU/Linux: linux
  • +
  • On Microsoft Windows: windows
  • +
+ +

Referenced by QSimpleUpdater::getPlatformKey(), onReply(), and setPlatformKey().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setDownloaderEnabled (const bool & enabled)
+
+slot
+
+

If the enabled parameter is set to true, the Updater will open the integrated downloader if the user agrees to install the update (if any)

+ +

Referenced by QSimpleUpdater::setDownloaderEnabled().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setModuleName (const QString & name)
+
+slot
+
+

Changes the module name.

Note
The module name is used on the user prompts. If the module name is empty, then the prompts will show the name of the application.
+ +

Referenced by QSimpleUpdater::setModuleName().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setModuleVersion (const QString & version)
+
+slot
+
+

Changes the module version

Note
The module version is used to compare the local and remote versions. If the version parameter is empty, then the Updater will use the application version (referenced by qApp)
+ +

Referenced by QSimpleUpdater::setModuleVersion().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setNotifyOnFinish (const bool & notify)
+
+slot
+
+

If notify is set to true, then the Updater will notify the user when it has finished interpreting the update definitions file.

+ +

Referenced by QSimpleUpdater::setNotifyOnFinish().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setNotifyOnUpdate (const bool & notify)
+
+slot
+
+

If notify is set to true, then the Updater will notify the user when an update is available.

+ +

Referenced by QSimpleUpdater::setNotifyOnUpdate().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setPlatformKey (const QString & platformKey)
+
+slot
+
+

Changes the platform key. If the platform key is empty, then the system will use the following keys:

    +
  • On iOS: ios
  • +
  • On Mac OSX: osx
  • +
  • On Android: android
  • +
  • On GNU/Linux: linux
  • +
  • On Microsoft Windows: windows
  • +
+ +

References platformKey().

+ +

Referenced by QSimpleUpdater::setPlatformKey().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setUpdateAvailable (const bool & available)
+
+privateslot
+
+

Prompts the user based on the value of the available parameter and the settings of this instance of the Updater class.

+ +

References downloaderEnabled(), downloadUrl(), latestVersion(), moduleName(), notifyOnFinish(), notifyOnUpdate(), Downloader::startDownload(), and updateAvailable().

+ +

Referenced by onReply().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setUrl (const QString & url)
+
+slot
+
+

Changes the url in which the Updater can find the update definitions file.

+ +

References url().

+ +

Referenced by QSimpleUpdater::getUpdater().

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void Updater::setUseCustomInstallProcedures (const bool & custom)
+
+slot
+
+

If the custom parameter is set to true, the Updater will not try to open the downloaded file. Use the signals fired by the QSimpleUpdater to install the update from the downloaded file by yourself.

+ +

References Downloader::setUseCustomInstallProcedures().

+ +

Referenced by QSimpleUpdater::setUseCustomInstallProcedures().

+ +
+
+ +
+
+ + + + + + + +
bool Updater::updateAvailable () const
+
+

Returns true if there is an update available.

Warning
You should call checkForUpdates() before using this function
+ +

Referenced by QSimpleUpdater::getUpdateAvailable(), and setUpdateAvailable().

+ +
+
+ +
+
+ + + + + + + +
QString Updater::url () const
+
+

Returns the URL of the update definitions file

+ +

Referenced by checkForUpdates(), onReply(), and setUrl().

+ +
+
+ +
+
+ + + + + + + +
bool Updater::useCustomInstallProcedures () const
+
+

Returns true if the updater shall not intervene when the download has finished (you can use the QSimpleUpdater signals to know when the download is completed).

+ +

References Downloader::useCustomInstallProcedures().

+ +

Referenced by QSimpleUpdater::usesCustomInstallProcedures().

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/class_updater.png b/LedOK/QSimpleUpdater/doc/output/html/class_updater.png new file mode 100644 index 0000000000000000000000000000000000000000..f04fd4c1ee5722968c89912c1ca3b15aee8f4458 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^)<7J>mntVOH>~x%boVR1_Y0=QA_E-rOJlvHDwiM8gcZ6J9~H>liv0E16%7 Su=xxOB?eDdKbLh*2~7a?@vWr* literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/classes.html b/LedOK/QSimpleUpdater/doc/output/html/classes.html new file mode 100644 index 0000000..7a89a3d --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/classes.html @@ -0,0 +1,110 @@ + + + + + + +QSimpleUpdater: Class Index + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
D | Q | U
+ + + + + +
  D  
+
  Q  
+
  U  
+
Downloader   QSimpleUpdater   Updater   
+
D | Q | U
+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/closed.png b/LedOK/QSimpleUpdater/doc/output/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/LedOK/QSimpleUpdater/doc/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000..2bdd1a7 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,104 @@ + + + + + + +QSimpleUpdater: src Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
src Directory Reference
+
+
+ + +

+Files

+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/dir_d44c64559bbebec7f509842c48db8b23.html b/LedOK/QSimpleUpdater/doc/output/html/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 0000000..f65d94f --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,104 @@ + + + + + + +QSimpleUpdater: include Directory Reference + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
include Directory Reference
+
+
+ + +

+Files

+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/doc.png b/LedOK/QSimpleUpdater/doc/output/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/doxygen.css b/LedOK/QSimpleUpdater/doc/output/html/doxygen.css new file mode 100644 index 0000000..1425ec5 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/doxygen.css @@ -0,0 +1,1475 @@ +/* The standard CSS for doxygen 1.8.11 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 4px 6px; + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: bold; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + diff --git a/LedOK/QSimpleUpdater/doc/output/html/doxygen.png b/LedOK/QSimpleUpdater/doc/output/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/dynsections.js b/LedOK/QSimpleUpdater/doc/output/html/dynsections.js new file mode 100644 index 0000000..85e1836 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/dynsections.js @@ -0,0 +1,97 @@ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + +QSimpleUpdater: File List + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+ + + + +
 Downloader.h
 QSimpleUpdater.h
 Updater.h
+
+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/folderclosed.png b/LedOK/QSimpleUpdater/doc/output/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/LedOK/QSimpleUpdater/doc/output/html/functions.html b/LedOK/QSimpleUpdater/doc/output/html/functions.html new file mode 100644 index 0000000..ba4c874 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/functions.html @@ -0,0 +1,313 @@ + + + + + + +QSimpleUpdater: Class Members + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- c -

+ + +

- d -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- u -

+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/functions_func.html b/LedOK/QSimpleUpdater/doc/output/html/functions_func.html new file mode 100644 index 0000000..2d03d8f --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/functions_func.html @@ -0,0 +1,313 @@ + + + + + + +QSimpleUpdater: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- c -

+ + +

- d -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- u -

+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/hierarchy.html b/LedOK/QSimpleUpdater/doc/output/html/hierarchy.html new file mode 100644 index 0000000..4e5944a --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/hierarchy.html @@ -0,0 +1,108 @@ + + + + + + +QSimpleUpdater: Class Hierarchy + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + + +
 CQObject
 CQSimpleUpdaterManages the updater instances
 CUpdaterDownloads and interprests the update definition file
 CQWidget
 CDownloaderImplements an integrated file downloader with a nice UI
+
+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/icon.png b/LedOK/QSimpleUpdater/doc/output/html/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d106793d118f0c8ea21be788581e1caf2a6bfec7 GIT binary patch literal 12307 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 + + + + + +QSimpleUpdater: Introduction + + + + + + + + + + +
+
+ + + + + + + +
+
QSimpleUpdater +
+
A simple auto-updater system for Qt applications
+
+
+ + + + +
+ +
+
+ + +
+ +
+ +
+
+
Introduction
+
+
+

QSimpleUpdater is an implementation of an auto-updating system to be used with Qt projects. It allows you to easily check for updates, download them and install them. Additionally, the QSimpleUpdater allows you to check for updates for different "modules" of your application. Check the WTFs for more information.

+

Integrating QSimpleUpdater with your projects

+
    +
  1. Copy the QSimpleUpdater folder in your "3rd-party" folder.
  2. +
  3. Include the QSimpleUpdater project include (pri) file using the include() function.
  4. +
  5. That's all! Check the tutorial project as a reference for your project.
  6. +
+

WTFs Section

+

1. How does the QSimpleUpdater check for updates?

+

The QSimpleUpdater downloads an update definition file stored in JSON format. This file specifies the latest version, the download links and changelogs for each platform (you can also register your own platform easily if needed).

+

After downloading this file, the library analyzes the local version and the remote version. If the remote version is greater than the local version, then the library infers that there is an update available and notifies the user.

+

2. Can I customize the update notifications shown to the user?

+

Yes! You can "toggle" which notifications to show using the library's functions or re-implement by yourself the notifications by "reacting" to the signals emitted by the QSimpleUpdater.

+
1 QString url = "https://MyBadassApplication.com/updates.json";
2 
3 QSimpleUpdater::getInstance()->setNotifyOnUpdate (url, true);
4 QSimpleUpdater::getInstance()->setNotifyOnFinish (url, false);
5 
6 QSimpleUpdater::getInstance()->checkForUpdates (url);

3. Is the application able to download the updates directly?

+

Yes. If there is an update available, the library will prompt the user if he/she wants to download the update. You can enable or disable the integrated downloader with the following code:

+
1 QString url = "https://MyBadassApplication.com/updates.json";
2 QSimpleUpdater::getInstance()->setDownloaderEnabled (url, true);

4. Why do I need to specify an URL for each function of the library?

+

The QSimpleUpdater allows you to use different updater instances, which can be accessed with the URL of the update definitions. While it is not obligatory to use multiple updater instances, this can be useful for applications that make use of plugins or different modules.

+

Say that you are developing a game, in this case, you could use the following code:

+
1 // Update the game textures
2 QString textures_url = "https://MyBadassGame.com/textures.json"
3 QSimpleUpdater::getInstance()->setModuleName (textures_url, "textures");
4 QSimpleUpdater::getInstance()->setModuleVersion (textures_url, "0.4");
5 QSimpleUpdater::getInstance()->checkForUpdates (textures_url);
6 
7 // Update the game sounds
8 QString sounds_url = "https://MyBadassGame.com/sounds.json"
9 QSimpleUpdater::getInstance()->setModuleName (sounds_url, "sounds");
10 QSimpleUpdater::getInstance()->setModuleVersion (sounds_url, "0.6");
11 QSimpleUpdater::getInstance()->checkForUpdates (sounds_url);
12 
13 // Update the client (name & versions are already stored in qApp)
14 QString client_url = "https://MyBadassGame.com/client.json"
15 QSimpleUpdater::getInstance()->checkForUpdates (client_url);

License

+

QSimpleUpdater is free and open-source software, it is released under the Don't Be A Dick License.

+
+ + + + diff --git a/LedOK/QSimpleUpdater/doc/output/html/jquery.js b/LedOK/QSimpleUpdater/doc/output/html/jquery.js new file mode 100644 index 0000000..1f4d0b4 --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/output/html/jquery.js @@ -0,0 +1,68 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('

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 F|3Bkg=h*-N literal 0 HcmV?d00001 diff --git a/LedOK/Languages/zhCN.ts b/LedOK/Languages/zhCN.ts new file mode 100644 index 0000000..5f59588 --- /dev/null +++ b/LedOK/Languages/zhCN.ts @@ -0,0 +1,9610 @@ + + + + + AboutDlg + + + Dialog + 对话框 + + + + About + 关于 + + + + X + X + + + + LedOK Express + LedOK Express + + + + V20200429 + + + + + <a href="https://www.ledok.cn/">www.ledok.cn + + + + + ChangePasswordForm + + + Form + Form + + + + Old password + 旧密码 + + + + New password + 新密码 + + + + Repeat again + 重复一遍 + + + + OK + 确认 + + + + Cancel + 取消 + + + + + + + + + + Tip + 提示 + + + + Please input old password + 请输入旧密码 + + + + Old password is wrong + 旧密码错误 + + + + + Please enter a password with more than 6 characters + 请输入超过6个字符的密码 + + + + The new password is not consistent in two times + 新密码两次不一致 + + + + Please enter a new password + 请输入新密码 + + + + Password changed successfully + 密码更改成功 + + + + ColorDialog + + + ColorDialog + + + + + Tone(H): + + + + + Saturation(S): + + + + + Brightness(V): + + + + + 度 + + + + + Basic color + 基本色 + + + + Custom color + 自定义颜色 + + + + # + + + + + Add to custom + 添加自定义颜色 + + + + Blue(B): + 蓝: + + + + Green(G): + 绿: + + + + Red(R): + 红: + + + + transparency: + 透明度: + + + + Cur color + 当前颜色 + + + + New color + 新颜色 + + + + Ok + 确定 + + + + Cancel + 取消 + + + + Select color + 选取颜色 + + + + ControlAdvParamWidget + + + Form + Form + + + + + Advanced parameters + 高级参数 + + + + + LED Screen Width(pixel): + LED屏幕宽(像素): + + + + + Width + + + + + + Height(pixel): + 高(像素): + + + + + Height + + + + + + + + + + + + + + + + Set + 设置 + + + + + Alias + 别名 + + + + + Web Server Address: + Web服务器地址: + + + + www.m2mled.net + + + + + www.ledaips.com + + + + + https://www.taxihub.cn:2340 + + + + + https://www.ledaips.com:2340 + + + + + https://www.36taxi.com:2340 + + + + + www.tlzxled.com + + + + + Company ID: + 公司ID: + + + + Input Company ID + 输入公司ID + + + + + Realtimer Server Address: + Realtimer地址: + + + + + Input Realtimer Server Address + 输入Realtimer服务器地址 + + + + + Clear + 清除 + + + + + + Apk upgrade + Apk升级 + + + + + Check Apk + 检查Apk + + + + + Uninstall + 卸载 + + + + + Running check + 运行状态监测 + + + + FPAG Upgrade + FAGA更新 + + + + + FPGA version check + FPGA版本查询 + + + + + Sync FPGA version + 同步FPGA版本 + + + + + Restart led controller system + 重启 + + + + + Check Log + 查看日志 + + + + Open ADB + 打开ADB调试功能 + + + + Post custom json + Post custom json + + + + + Clear Program + 清除节目 + + + + + M80 configuration + M80配置 + + + + + Refresh + 刷新 + + + + + Restore to default + 恢复默认值 + + + + + Taxi top screen configuration + 车顶有无客电平配置 + + + + + Service:High Out of service:Low + 有客:高电平 无客:低电平 + + + + + Service:Low Out of service:High + 有客:低电平 无客:高电平 + + + + + Start LedSet3.0 configure LED module + 使用LedSet3.0配置LED模组(厂家专业人员使用) + + + + Bind *.ic Certificate + 绑定taxihub平台用户身份凭证 + + + + Binding *.ic account indentity voucher + 绑定taxihub平台用户身份凭证 + + + + + Rotate + 旋转 + + + + + 0 degrees + 0度 + + + + + 90 degrees + 90度 + + + + + 180 degrees + 180度 + + + + + 270 degrees + 270度 + + + + + Min brightness + 最低亮度 + + + + 1 + 1 + + + + + (min:1) + (最小:1) + + + + + + + + + Readback + 回读 + + + + + + + + Send + 发送 + + + + + Max brightness + 最高亮度 + + + + 255 + 255 + + + + + (max:255) + (最高:255) + + + + SetScreenSize + 设置屏幕像素尺寸 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Success + 成功 + + + + Compant ID: + 公司ID: + + + + FPGA Upgrade + FPGA升级 + + + + Compant ID + 公司ID + + + Input password + 输入密码 + + + + InputWebServerAddressTip + 请输入Web服务器地址 + + + + InputCompanyIdTip + 请输入公司ID + + + + Do you want to modify webserveraddress and companyId? + 是否确认配置服务器地址和公司ID? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + failed + 失败 + + + + SetOnlineAddr + 设置web服务器地址 + + + + ClearRealtimeServer + 清除 + + + + InputRealTimeAddressTip + 请输入RealTimer地址 + + + + SetRealtimeServer + 设置RealTimer地址 + + + + + + + + + + Tip Info + 提示 + + + Do you want to save the modifications? + 是否保存修改? + + + + + + + + + Can not find LedSet3.0.exe,down you need download and install it + 找不到LedSet3.0.exe,确认下载并安装 + + + + RestartAndroid + 重启 + + + + FPGA Version + FPGA版本 + + + + running + 正在运行 + + + + no running + 没有运行 + + + + version + 版本 + + + + CheckSoftVersions + 查询已安装apk版本 + + + + UninstallSoftware + 卸载 + + + + IsSoftwareRunning + 监测APK运行状态 + + + + apk package (*.rpd) + + + + + CheckHardwareVersions + 查询FPGA版本 + + + + + + SynchronousHardwareVersion + 同步FPGA硬件版本 + + + + Check Screen untile fpga update finished + 观察屏幕升级进度直到升级成功 + + + + OpenAdb + 打开ADB调试功能 + + + + indentity voucher (*.ic) + 身份凭证(*.ic) + + + + + InvokeTaxiAppFunction + 绑定证书 + + + + Json format is error! + + + + + + AliIotSetting + + + + SetTaxiServer + 设置taxihub服务器 + + + DelPrograms + 清除节目 + + + + apk package (*.apk *.zip) + + + + + + UpgradeSoftware + 升级固件 + + + + This screen is encrypted,Please decrypt and upgrade APK! + 此屏幕已加密,请解密并升级APK! + + + + + + + SetScreenRotation + 设置屏幕旋转 + + + + SetMinBrightness + 设置最小的亮度值 + + + + SetMaxBrightness + 设置亮度最大值 + + + + GetMinBrightness + 获取亮度最小值 + + + + GetMaxBrightness + 获取亮度最大值 + + + + SetSpecialResolution + 设置分辨率 + + + + GetSpecialResolution + 读取分辨率 + + + + CleanDisplayScreenSize + 恢复默认分辨率 + + + + SetHighForBusy + 设置有无客电平 + + + + GetStateForBusy + 获取有无客电平 + + + + install start... + 开始安装... + + + + InputAliasTip + 请输入别名 + + + + SetCardAlias + 设置别名 + + + + Clear program successed! + 清除节目成功 + + + + Clear program failed! + 清除节目失败 + + + + Clear program timeout! + 清除节目超时 + + + + Uploadding + 上传 + + + + + + + + + + + + + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 请先选择大屏幕 + + + + InputWidthTip + 请输入正确的宽度像素值 + + + + InputHeightTip + 请输入正确的高度像素值 + + + Can not find LedSet3.0.exe,please install it first! + 没有找到LedSet3.0软件,请先安装! + + + + Password is error + 密码错误 + + + GetScreenSize + 获取屏幕像素尺寸 + + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json文件错误! + + + + ControlBrightnessAutoWidget + + + Form + Form + + + + + Sensitivity + 灵敏度 + + + + Minimum Brightness + 最小亮度值 + + + + (1~100) + + + + + (1~255) + + + + + + + + Set + 设置 + + + + + Cur brigntness:0 + 当前亮度:0 + + + + + Refresh + 刷新 + + + + + + + + + Readback + 回读 + + + + R60 + + + + + RL1 + + + + + Upload file + 上传配置文件 + + + + When uploading files, you can only select the card of the same sensor; otherwise it will fail! + 上传文件时,请确认选择正确的传感器类型,否则无效! + + + + 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 80 or above, otherwise the brightness will be low. + 如果最大亮度为64,则最小亮度可以配置为1或适当的值;如果最大亮度为255,则最小亮度必须配置为80或更高,否则亮度将很低。 + + + + BrightnessTip1 + 上传文件时,请确认选择正确的传感器类型,否则无效! + + + + BrightnessTip2 + 上传文件时,请确认选择正确的传感器类型,否则无效! + + + + Minbrightness + 最小亮度值 + + + + Upload + 上传配置文件 + + + + ReadbackTable + 回读 + + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 请先选择大屏幕 + + + + MinBrightnessInputTip + 请输入正确的最小亮度值 + + + + SetMinBrightness + 设置最小的亮度值 + + + + SensitivityInputTip + 请输入正确的灵敏度值 + + + + SetBrightnessSensitivity + 设置亮度传感器灵敏度 + + + + + NeedSelectSensorTypeTip + 请先选择传感器类型 + + + + SensorBrightnessTable + 设置亮度传感器配置表 + + + + GetMinBrightness + 获取亮度最小值 + + + + GetBrightnessSensitivity + 获取亮度传感器灵敏度 + + + + GetSensorBrightnessTable + 获取传感器亮度配置表 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Cur brightness + 当前亮度 + + + + Save file + 保存 + + + + no sensorBrightnessTable + 控制卡没有发现亮度配置表 + + + + GetCurrentSensorBrightness + 获取当前亮度 + + + + + + + + + + + Success + 成功 + + + + + + + + + + + failed + 失败 + + + + ControlBrightnessManualWidget + + + Form + Form + + + + + Y10/E10/E06:1(min)~64(max); M90/Y30/E60/Y60:1(min)~256(max) + + + + + + Readback + 回读 + + + + + Brightness value + 亮度值 + + + + + Set + 设置 + + + + + + Tip + 提示 + + + + + NoSelectedController + 请先选择大屏幕 + + + + ManualBrightnessInputTip + 手动调节亮度 + + + + SetBrightness + 设置亮度 + + + + + Success + 成功 + + + + + failed + 失败 + + + + GetBrightness + 获取亮度值 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlBrightnessSchedule + + + Form + Form + + + + + Default brightness + 默认亮度 + + + + + Default brightness tip + 提示:该设定时间内为设定亮度,设定时间外为默认亮度。例如设定默认亮度为80,设定亮度为180,时间范围是8:00-17:00,则时间范围内亮度为180,其他时间内为默认亮度80! + + + + + Add + 添加 + + + Edit + 编辑 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + + Import + 导入 + + + + + Export + 导出 + + + + + Apply + 应用 + + + + + Readback + 回读 + + + + BrightnessValue + 亮度值 + + + + Start Time + 开始时间 + + + + End Time + 结束时间 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + BrightnessSchedule (*.bjs) + + + + + Save File + 保存 + + + + + Tip + 提示 + + + + DefaultInputTip + 请输入默认亮度值 + + + + NoSelectedController + 请先选择大屏幕 + + + + SetAutoBrightnessTask + 发送定时亮度表 + + + + + Success + 成功 + + + + + failed + 失败 + + + + GetAutoBrightnessTask + 获取定时亮度表 + + + + ControlBrightnessScheduleEdit + + + Dialog + 对话框 + + + + Schedule Item + 定时 + + + + X + X + + + + Brightness Value + 亮度值 + + + + Start time + 开始时间 + + + + End time + 结束时间 + + + + 255 + 255 + + + + Add + 添加 + + + + Cancel + 取消 + + + + ControlBrightnessWidget + + + Form + Form + + + + + Brightness Configuration + 亮度配置 + + + + + Auto + 自动 + + + + + Manual + 手动 + + + + + Schedule + 定时 + + + + ControlEncryptWidget + + + Form + Form + + + + + Entrypt Configuration + 安全配置 + + + + Original password + 原始密码 + + + + + + original password + 原始密码 + + + + + + New password + 新密码 + + + + + Repeat new password + 重复输入 + + + + + + + Set encryption + 加密 + + + + + Cancel encryption + 取消加密 + + + + + Enter password + 输入密码 + + + + Enter again + 再次输入 + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 请先选择大屏幕 + + + + + InputOriginalPasswordTip + 请输入原始密码 + + + + InputNewPasswordTip + 请输入新密码 + + + + InputRepeatPasswordTip + 请重复输入新密码 + + + + InputRepeatPasswordNotSameTip + 两次输入的密码不一致 + + + + Tip Info + 提示 + + + + After setting the password, please remember the password and record it. If you forget the password, the device will be unable to operate. Are you sure you want to continue with this operation? + 设置密码后,请记住密码并记录。如果忘记密码,设备将无法运行。确实要继续此操作吗? + + + + + SetControllerPassword + 设置加密 + + + + Readback + 回读 + + + + + + Success + 成功 + + + + + + failed + 失败 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + Modify password + 修改密码 + + + + OriginalPasswordErrorTip + 原始密码错误 + + + + ControlHdmiManual + + + Form + Form + + + + + HDMI IN + 同步 + + + + Program In controller + 异步 + + + + + + Readback + 回读 + + + + Async + 异步 + + + + Tip + 提示 + + + + NoSelectedController + 请先选择大屏幕 + + + + + SyncSwitch + 切换同步模式 + + + + + AnSyncSwitch + 切换异步步模式 + + + + IsSync + 回读同异步模式 + + + SetHdmiIn + 切换到同步 + + + + + + + Success + 成功 + + + on + + + + + + + + failed + 失败 + + + off + + + + IsHdmiIn + 读取模式 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlHdmiSchedule + + + Form + Form + + + + + Add + 添加 + + + Edit + 编辑 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + + Import + 导入 + + + + + Export + 导出 + + + + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period + 默认播放异步内容,定时时间段内播放同步HDMI-IN端口输入内容 + + + + + Apply + 应用 + + + + Readback + 回读 + + + + SYNC HDMI + 同步模式 + + + + Start Time + 开始时间 + + + + End Time + 结束时间 + + + + SUN + 星期日 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + + + + + SyncSchedule (*.syncs) + + + + + Save File + 保存 + + + + Sync Schedule (*.syncs) + + + + + + Tip + 提示 + + + + + NoSelectedController + 请先选择大屏幕 + + + + SetTimingHdmiInTask + 设置同步模式定时任务 + + + + GetTimingHdmiInTask + 获取同步模式定时任务 + + + SetTimingScreenTask + 设置屏幕定时开关任务 + + + + + Success + 成功 + + + + + failed + 失败 + + + GetTimingScreenTask + 获取屏幕定时开关任务 + + + + ControlHdmiWidget + + + Form + Form + + + + + HDMI Configuration + 画面输入源配置 + + + + + Manual + 手动 + + + + + Schedule + 定时 + + + + ControlNetConfigWidget + + + Form + Form + + + + Wire Enther(RJ45) Configuration + 有线网配置 + + + + + DHCP + + + + + + Specify IP + 指定IP + + + + + IP Address + IP地址 + + + + Mask Address + 子网掩码 + + + + + Gateway + 网关 + + + + + DNS Address + DNS地址 + + + + + + + + + + + Set + 设置 + + + + + + + + + + Readback + 回读 + + + + + WIFI Configuration + WiFi配置 + + + + + WiFi On/Off + WiFi使能 + + + + Input Ap name + 输入热点名称 + + + + + 4G/5G Configuration + 蜂窝数据配置 + + + + + Open 4G/5G + 启用蜂窝数据 + + + + APN: + + + + + Get cellular network status information + 获取蜂窝网络状态信息 + + + + + Check SIM can automatically match to MCC, and then select carrier get apn param,if not found carrier,you can check the CUSTOM checkbox,then enter custom param. + 通过获取状态按钮可以自动匹配国家码MCC,然后选择“运营商”可获取到响应的APN信息,如果找不到运营商,可以选中“自定义”复选框,然后手动输入APN信息。 + + + Readback Apn Info + 回读APN信息 + + + + + Readback APN Info + 回读APN信息 + + + + + Set Apn Info,Check SIM can automatically match to MCC, and then select carrier get apn param + 设置Apn信息 + + + + + CUSTOM + 自定义 + + + + + Check SIM + 查询SIM信息 + + + + + + -> + + + + + + Country ID(mcc): + 国家码(mcc): + + + + + Carrier Name + 运营商 + + + + + APN: + 运营商APN: + + + + + APN(Required) + APN(必填) + + + + + User: + 用户名: + + + + + + + Not required + 非必填 + + + + + Password: + 密码: + + + + Set Apn:iot.cargo + + + + Timezone: + 时区: + + + + + Flight Mode + 飞行模式 + + + + + WiFi name + WiFi名称 + + + + + + + Password + 密码 + + + + + + + Input password + 输入密码 + + + + + Scan + 扫描 + + + + + Ap Mode + AP使能 + + + + Ap name + 热点名称 + + + + OFF + + + + + ON + + + + + AP name + 热点名称 + + + + Subnet mask + 子网掩码 + + + + Input ap name + 输入AP名称 + + + + + + + + + + + + + + + + + + + + Success + 成功 + + + + + + + + + + + + + + + + + + + + failed + 失败 + + + + + + + Tip + 提示 + + + + + NoSelectedController + 请先选择大屏幕 + + + + + SetEthernet + 设置有线网 + + + + + + + + + + + Attention + 注意 + + + + Please input IP address! + 请输入IP地址! + + + + Your IP Address is Invalid! + IP地址无效! + + + + Please input Mask address! + 请输入子网掩码地址! + + + + Your Mask Address is Invalid! + 掩码地址无效! + + + + Please input Gateway address! + 请输入网关地址! + + + + Your Gateway Address is Invalid! + 网关地址无效! + + + + Please input DNS address! + 请输入DNS地址! + + + + Your DNS Address is Invalid! + DNS地址无效! + + + + GetEthernet + 获取有线网配置 + + + + SetSwitchWiFi + 设置WiFi开关 + + + + + + + + + SignalPower + 信号强度 + + + + + ConfigurationWiFi + 配置WiFi + + + + IsPortableHotSpot + 获取热点和WiFi模式 + + + + GetWifiList + 扫描WiFi + + + + ConfigurationHotSpot + 配置热点 + + + + GetCurrentAPN + 获取APN信息 + + + + + GetSIMStatus + 获取SIM状态 + + + + + SetAPN + 设置APN + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + 状态: + 状态: + + + + + 未知 + 未知 + + + + 锁定状态,需要用户的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 + + + + + 数据连接状态: + 数据连接状态: + + + + 断开 + 断开 + + + + 正在连接 + 正在连接 + + + + 已连接 + 已连接 + + + + 暂停 + 暂停 + + + + 数据活动休眠状态: + 数据活动休眠状态: + + + + 活动,但无数据发送和接收 + 活动,但无数据发送和接收 + + + + 活动,正在接收数据 + 活动,正在接收数据 + + + + 活动,正在发送数据 + 活动,正在发送数据 + + + + 活动,正在接收和发送数据 + 活动,正在接收和发送数据 + + + + 休眠状态 + 休眠状态 + + + + 信号强度: + + + + + SetSwitchSimData + 设置4G/5G开关 + + + SetTimezone + 设置时区 + + + + ContrFlightMode + 配置飞行模式 + + + + GetFlightModeState + 获取飞行模式状态 + + + + ControlPowerManual + + + Form + Form + + + + + POWER + 开关 + + + + + + Readback + 回读 + + + + OFF + + + + + ON + + + + + + Tip + 提示 + + + + + NoSelectedController + 请先选择大屏幕 + + + + IsScreenOn + 读取开关状态 + + + + + + SetScreenOn + 设置电源 + + + + + + + Success + 成功 + + + + + on + + + + + + + + failed + 失败 + + + + + off + + + + + + SetScreenOff + 配置屏幕开关 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlPowerSchedule + + + Form + Form + + + + Edit area + 编辑区 + + + + + Add + 添加 + + + Edit + 编辑 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + + Import + 导入 + + + + + Export + 导出 + + + + It is power off state outside the schedule time period + 定时时间段内显示屏开启,其他时间段为关屏状态 + + + + Send command + 指令区 + + + + + Apply + 应用 + + + + Clear Schedule + 清除定时 + + + + Readback + 回读 + + + + Power On State + 屏开关状态 + + + + Start Time + 开始时间 + + + + End Time + 结束时间 + + + + SUN + 星期日 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + + + + + + PowerSchedule (*.pjs) + 开关屏定时(*.pjs) + + + + Save File + 保存 + + + + + + Tip + 提示 + + + + + + NoSelectedController + 请先选择大屏幕 + + + + + Tip Info + 提示 + + + + + Clear schedule task? + 取消计划任务? + + + + + CleanTimingScreenTask + 取消计划任务 + + + + SetTimingScreenTask + 设置屏幕定时开关任务 + + + + + + + Success + 成功 + + + + + + + failed + 失败 + + + + GetTimingScreenTask + 获取屏幕定时开关任务 + + + + ControlPowerWidget + + + Form + Form + + + + + Power Configuration + 开关屏控制 + + + + + Manual + 手动 + + + + + Schedule + 定时 + + + + ControlTestWidget + + + Form + Form + + + + + Test Screen + 测试屏幕 + + + + + Line test + 线条测试 + + + + + + + + + + Red + + + + + + + + + + + Green + 绿 + + + + + + + + + + Blue + + + + + + + + + + + White + + + + + + Vertical + 竖线 + + + + + Slash + 斜线 + + + + + + Horizontal + 横线 + + + + + + + Speed + 速度 + + + + + ms(>10) + 毫秒(>10) + + + + + Line Distance + 线距 + + + + px + 像素 + + + + + + + + Test + 测试 + + + + + Gradation test + 灰度测试 + + + + + Only the gray value is displayed + 只显示颜色值 + + + + (>10) + + + + + + GrayValue + 灰度值 + + + + (0-255) + + + + + + Color test + 颜色测试 + + + + + Gradient + 渐变 + + + + 8 + 8 + + + + 2 + 2 + + + + 3 + 3 + + + + 6 + 6 + + + + 4 + 4 + + + + 5 + 5 + + + + 1 + 1 + + + + 9 + 9 + + + + 7 + 7 + + + + 0 + 0 + + + + + Clear + 清除 + + + + + Reset + 循环 + + + + + + + Anycast + 点播 + + + Gradient + 渐变 + + + + + Stop + 停止 + + + + + + + + + + + Tip + 提示 + + + + + + + + NoSelectedController + 请先选择大屏幕 + + + + + + StartTest + 开始测试 + + + + + + + Success + 成功 + + + + + + + failed + 失败 + + + + StopTest + 停止测试 + + + + loopback mode + 循环模式 + + + + Connect timeout + 连接超时 + + + + Reset loop mode + 设置循环 + + + + + success + 成功 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json文件错误! + + + + ControlVerifyClockWidget + + + Form + Form + + + + Verify Clock Configuration + 校准时间 + + + + Verify to Computer time + 校准到计算机时间 + + + + + Cur time of controller + LED显示屏设备当前时间 + + + + LAN + 局域网 + + + + (min/time) + (分钟/次) + + + + Sync identificationCode + 同步识别码 + + + + + identification code + 同步识别码 + + + + + Time offset(msec) + 时间偏移(毫秒) + + + + + Brightness + 屏体亮度 + + + + + Volume + 音量 + + + + + Screen on/off + 屏幕开关 + + + + + Slave + + + + + Master + + + + + + NTP Server + NTP服务器 + + + + + + + NTP Server address + NTP服务器地址 + + + + + + + TimeZone + 时区 + + + + + + + + + + + + + Set + 设置 + + + + + Enable Synchronous playing + 使能同步画面功能 + + + + Lora + + + + + GPS + + + + + NTP + + + + Sync ime interval + 同步时间间隔 + + + + Time zone + 时区 + + + + + + + Sync time interval + 同步时间间隔 + + + + Verify clock configuration + 校准时间 + + + + + + + + + + + + Readback + 回读 + + + + Master + + + + + Sync clock to computer time + 校准时钟到计算机时间 + + + + Identification Code + 识别码 + + + + + + + + + + + + + + Success + 成功 + + + + + + + + + + + + + + failed + 失败 + + + + SetNtpServer + 设置NTP服务 + + + + MasterSwitch + 设置为主设备 + + + + SlaveSwitch + 设置为从设备 + + + + IsMasterSlave + 回读主从身份 + + + + GetControllerDate + 获取日期时间 + + + + SetingSyncMethod + 设置同步方法 + + + + SyncTime + 校准时间 + + + + GetNtpServer + 获取NTP服务信息 + + + + GetingSyncMethod + 获取同步方式 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + SetTimezone + 设置时区 + + + + ControlVolumeManual + + + Form + Form + + + + Volume(0-15) + 音量(0-15) + + + + + + Readback + 回读 + + + + SetVolume + 音量调节 + + + + + + Success + 成功 + + + + + + failed + 失败 + + + + Volume(min:0-max:15) + 音量(最小値:0-最大値:15) + + + + GetVolume + 获取当前音量 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json文件错误! + + + + ControlVolumeSchedule + + + Form + Form + + + + Defalut volume tip + + + + + + Add + 添加 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + Default Volume + 默认音量 + + + + (0-15) + + + + + + Import + 导入 + + + + + Export + 导出 + + + + + Apply + 应用 + + + + Readback + 回读 + + + + Volume value + 音量值 + + + + Start Time + 开始时间 + + + + End Time + 结束时间 + + + + SUN + 星期日 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + Default volume tip + 提醒:定时时间段以外的时间显示屏为默认亮度 + + + + Default volume + 默认音量值 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json文件错误! + + + + 10 + 10 + + + + + Volume Schedule (*.vols) + + + + + Save File + 保存 + + + + + Tip + 提示 + + + + + NoSelectedController + 请先选择大屏幕 + + + + SetAutoVolumeTask + 配置定时音量表 + + + + + Success + 成功 + + + + + failed + 失败 + + + + GetAutoVolumeTask + 获取定时音量表 + + + + ControlVolumeWidget + + + Form + Form + + + + + Volume Control + 音量调节 + + + + + Manual + 手动 + + + + + Schedule + 定时 + + + + DevicesControllWidget + + + Form + Form + + + + Current Screen: none + 当前屏幕: + + + + Control your devices in this widget + + + + + + Clear + 清除 + + + + + Current Screen: + 当前屏幕: + + + + + single screen operation + 单屏操作 + + + + + none + + + + + + Current Screen + 当前屏幕 + + + + Multi screen operation + 多屏操作 + + + + selected num + 选中数目 + + + + Downloader + + + + Updater + 更新 + + + Software update + 软件升级 + + + + X + X + + + + + + Downloading updates + 下载更新 + + + + Time remaining: 0 minutes + 还剩:0分钟 + + + + Open + 打开 + + + + + Stop + 停止 + + + + + Time remaining + 剩余时间 + + + + unknown + 未知 + + + + Error + 错误 + + + + Cannot find downloaded update! + 找不到下载的更新! + + + + Close + 确认 + + + + Download complete! + 下载完成! + + + + The installer will open separately + 安装程序将单独打开 + + + Click "OK" to begin installing the update + 单击“确定”开始安装更新 + + + In order to install the update, you may need to quit the application. + 要安装更新,可能需要退出应用程序。 + + + + In order to install the update + 安装更新 + + + + In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application + 要安装更新,可能需要退出应用程序。这是强制更新,现在退出将关闭应用程序 + + + + Tip Info + 提示 + + + + Click the "Open" button to apply the update + 单击“打开”按钮应用更新 + + + + Are you sure you want to cancel the download? + 您想现在下载更新吗? + + + + Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application + 确实要取消下载吗?这是强制更新,现在退出将关闭应用程序 + + + + + %1 bytes + + + + + + %1 KB + + + + + + %1 MB + + + + + of + ,总大小 + + + + Downloading Updates + 正在下载更新 + + + + Time Remaining + 剩余时间 + + + + Unknown + 未知 + + + + about %1 hours + 约%1小时 + + + + about one hour + 约1小时 + + + + %1 minutes + %1 分钟 + + + + 1 minute + 1 分钟 + + + + %1 seconds + %1 秒 + + + + 1 second + 1 秒 + + + + ImageCutWidget + + + Form + Form + + + + ImportBnInProgramDlg + + Dialog + 对话框 + + + + InputPasswordDialog + + + Dialog + 对话框 + + + + Input password + 输入密码 + + + + Change Password + 修改密码 + + + + OK + 确认 + + + + Cancel + 取消 + + + + LoAppTools + + + + + Select File + 选择文件 + + + + + File name conflicted + 文件名冲突 + + + + LoColorSelector + + Select Color + 选择颜色 + + + + LoDateSelector + + + Date selector + 日期选择器 + + + + LoEmptyDialog + + + Dialog + 对话框 + + + + TextLabel + + + + + LoQTitleBar + + + + + Minimize + 最小化 + + + + + + Maximize + 最小化 + + + + + + Close + 关闭 + + + + Restore + 恢复 + + + + LoUIMsgBoxOk + + Dialog + 对话框 + + + OK + 确认 + + + + LoUIMsgBoxOkCancel + + + Dialog + 对话框 + + + + TextLabel + + + + + OK + 确认 + + + + Cancel + 取消 + + + + MainWindow + + DhcpTip + 1.仅用于直连终端,且终端是动态IP的情况;\r\n2.开启前,请关闭防火墙,或打开ICMP回显;\r\n3.若出现连接不稳定请将PC设置成静态IP + + + DHCP Service + DHCP服务 + + + + + RJ45 Cable directly connected + 网线直连 + + + OFF + + + + ON + + + + + + Check card + 一键找卡 + + + DhcpTip4 + 1.如果电脑和LED控制卡使用网线直连,打开这个选项 + + + DhcpTip5 + 2.打开选项后计算机的ip地址会被配置成静态IP:192.168.0.88 + + + DhcpTip6 + 3.LED控制卡的IP地址将被配置成192.168.0.200 + + + + Tip Info + 提示 + + + + RestoreLedCardIpByUdpTip + 该操作会把局域网内的所有与计算机IP不在同一网段的控制卡修复成固定IP,请谨慎操作! + + + + Tip + 提示 + + + + No available network was detected + 没有检测到可用的网络 + + + Do you want set IP of cable network to DHCP + 是否设置网络为通过DHCP自动获取IP + + + DhcpTip1 + 1.仅用于直连终端,且终端是动态IP的情况 + + + DhcpTip2 + 2.开启前,请关闭防火墙,或打开ICMP回显 + + + DhcpTip3 + 3.若出现连接不稳定请将PC设置成静态IP + + + + MainWndIcon + + + + + LedOK Express + LedOK Express + + + + NetComm + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json文件错误! + + + + 解析json文件错误! + 解析json文件错误! + + + + PixbmpShowDialog + + + Dialog + 对话框 + + + + X + X + + + + PublishForm + + + Form + Form + + + + + + TextLabel + + + + + X + X + + + + + + PushButton + + + + + QFfWidget + + + Form + Form + + + + QObject + + Setting up the Xanadu Express... + Xanadu Express启动中... + + + Setting up the Xanadu Express OK! + 启动成功!将应用程序添加到防火墙规则! + + + Setting up the Xanadu Express OK! +Add app to firewall rule... + 启动成功!将应用程序添加到防火墙规则... + + + + Setting up the LedOK Express... + 初始化LedOK Express... + + + + Setting up the LedOK Express OK! + LedOK Express装载成功! + + + + SendProgramDialog + + + Dialog + 对话框 + + + + + Publish + 发布 + + + + 口 + + + + + X + + + + + Program name + 节目名称 + + + + success info + + + + + Refresh + 刷新 + + + + Cancel + 取消 + + + + Program Name + 节目名称 + + + + Screen ID + 屏幕ID + + + + Remark Name + 別名 + + + + Online + 在线 + + + + Screen IP + 屏幕IP + + + + Screen Size + 屏幕像素 + + + + Security + 加密 + + + + Progress + 进度 + + + + Remarks + 备注 + + + + All + 总数 + + + + SoftConfigDialog + + + Dialog + 对话框 + + + + Software Configuration + 软件配置 + + + + X + X + + + + Video convert format + 视频转码 + + + + Text antialiasing + 文字反锯齿 + + + + TextAntilaTip + (提示:该选项适合小间距大尺寸的屏幕,选中此项,文字边缘会有暗影已达到字体边缘光滑的效果;小尺寸屏幕和单双色屏幕不建议使用) + + + + GuangYinPin + 光影屏 + + + + OK + 确认 + + + + SpecialDlg + + + Dialog + 对话框 + + + + Specify IP range + 指定IP范围 + + + + + Specify IP + 指定IP + + + + + Search + 搜索 + + + + Cancel + 取消 + + + + X + + + + + + Attention + 注意 + + + + Please input IP address! + 请输入IP地址! + + + + Your IP Address is Invalid! + IP地址无效! + + + + Success + 成功 + + + + Can't find this device IP + 未查找到设备 IP地址 + + + + SubSpecifyIp + + + Form + Form + + + + Specify IP + 指定IP + + + + SubSpecifyIpRange + + + Form + Form + + + + Start IP + 开始IP + + + + End IP + 结束IP + + + + ThreadSendPro + + + get readAckSempahore + + + + + open file failed + 文件打开失败 + + + send failed + 发送失败 + + + socket error + 套接字错误 + + + + ThreadUpgradeApk + + open file failed + 文件打开失败 + + + send failed + 发送失败 + + + Timeout + 超时 + + + + Uploadding + 正在上传 + + + + TipDialog + + + Dialog + 对话框 + + + + TextLabel + + + + + + OK + 确认 + + + + + Cancel + 取消 + + + + X + + + + + + Import + 导入 + + + + + Path + 路径 + + + + + + : + + + + + + browse + 选择 + + + + You will delete the selected solution(s),are you sure? + 是否确认删除选中的节目? + + + + + Save as + 另存为 + + + + + Export + 导出 + + + + + Done + 完成 + + + + + Solution Name + 节目名称 + + + + + Progress + 进度 + + + + Delete + 删除 + + + + Select the network to connect to the device + 选择和LED控制卡直连的网络 + + + + Network name + 网络名称 + + + + + This operation will only set cable network to static IP,are you sure? + 此操作将设置选中的网络为固定IP,并自动配置直连的LED设备为同一网段的IP地址,是否确认? + + + + Do you want set IP of cable network to DHCP + 是否设置网络为通过DHCP自动获取IP + + + + + + + + Tip + 提示 + + + + + + Please select the network to connect to the Led controller + 请选择连接到LED控制器的网络 + + + + Choose Directory + 选择目录 + + + + The imported directory is already in the working directory, so there is no need to import it again! + 该导入的目录已经在工作目录下,无需再次导入! + + + + no find program can be imported + 没有找到可以导入的节目 + + + Export again + 重新导出 + + + + UpdateLedset3Dialog + + + Dialog + 对话框 + + + + LedSet3.0 Update + LedSet3.0更新 + + + + X + X + + + + V1.0.0 + V1.0.0 + + + + Update + 升级 + + + + + CurVersion + 当前版本 + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + 固件APK成功下载,您可以选择需要的LED屏幕同步固件! + + + + LatestVersion: + 最新版本: + + + + Update log: + 更新日志: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + 当前固件APK版本已经是最新版本,您可以选择需要的LED屏幕同步固件! + + + + Updater + + + Would you like to download the update now? + 您想现在下载更新吗? + + + + Would you like to download the update now? This is a mandatory update, exiting now will close the application + 您想现在下载更新吗?这是强制更新,现在退出将关闭应用程序 + + + Version %1 of %2 has been released! + 已发布%2的版本%1! + + + + No updates are available for the moment + 暂时没有可用的更新 + + + + Congratulations! You are running the latest version of %1 + 祝贺你!您正在运行最新版本的%1 + + + + UpdaterDialog + + + Dialog + 对话框 + + + + Software Update + 软件更新 + + + + X + X + + + + V1.0 + + + + + Update + 升级 + + + + CurVersion + 当前版本 + + + + LatestVersion: + 最新版本: + + + + Update log: + 更新日志: + + + + The current version is already the latest version + 已经是最新的版本 + + + + UpdaterFirmwareDialog + + + Dialog + 对话框 + + + + Firmware Update + 固件升级 + + + + X + X + + + + V1.0 + + + + + Update + 升级 + + + + + CurVersion + 当前版本 + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + 固件APK成功下载,您可以选择需要的LED屏幕同步固件! + + + + LatestVersion: + 最新版本: + + + + Update log: + 更新日志: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + 当前固件APK版本已经是最新版本,您可以选择需要的LED屏幕同步固件! + + + + UpgradeApkDialog + + + Dialog + 对话框 + + + + Upgrade apk + 升级apk + + + + 口 + + + + + X + + + + + Select apk + 选择Apk包 + + + + + Upgrade + 升级 + + + + APK: + + + + + Uninstall + 卸载 + + + + check running state + 检测运行状态 + + + + Select Fpga + 选择FPGA文件 + + + + success info + + + + + Refresh + 刷新 + + + + Cancel + 取消 + + + + Screen ID + 屏幕ID + + + + Remark Name + 別名 + + + + Online + 在线 + + + + Screen IP + 屏幕IP + + + + Security + 加密 + + + + Progress + 进度 + + + + xixunplayer + + + + + cardsystem + + + + + taxiapp + + + + + starter + + + + + connection + + + + + displayer + + + + + FPGA + FPGA + + + + update + + + + + State + 状态 + + + Remarks + 备注 + + + + + All + 总数 + + + + The encrypted control card can be upgraded directly + 加密控制卡可以直接升级 + + + + apk package (*.rpd) + + + + + apk package (*.apk *.zip) + + + + + UsbDetectDialog + + + Form + Form + + + + Usb upgrade program + U盘更新节目 + + + + X + + + + + Password + 密码 + + + + OK + 确认 + + + + Input password + 输入密码 + + + + + Tip + 提示 + + + + No checked USB device + 未检查USB设备 + + + + please select usb device in list + 请在列表中选择usb设备 + + + + UsbDiskFuncDialog + + + Dialog + 对话框 + + + + Usb upgrade program + U盘更新节目 + + + + X + + + + + Path + 路径 + + + + Password + 密码 + + + + ... + + + + + OK + 确认 + + + + Cancel + 取消 + + + + Input password + 输入密码 + + + + Please select path for usb playback + 请选择路径 + + + + Choose Directory + 选择目录 + + + + X_UIMsgBoxOk + + + Dialog + 对话框 + + + + + TextLabel + + + + + X + + + + + OK + 确认 + + + + Cancel + 取消 + + + + Sync + 同步 + + + + install + 安装 + + + + Tip Info + 提示 + + + + No found xixunplayer.apk,Do you want download it from internet? + 找不到xixunplayer.apk,你想从网上下载吗? + + + + X_UIMsgBoxOkCancel + + + Dialog + 对话框 + + + + + TextLabel + + + + + X + + + + + OK + 确认 + + + + Cancel + 取消 + + + + X_UIMsgBoxYesNoCancel + + + Dialog + 对话框 + + + + + TextLabel + + + + + X + + + + + Yes + + + + + No + + + + + Cancel + 取消 + + + + eAClockAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本属性 + + + + Time Zone + 时区 + + + + Custom Dial + 自定义表盘 + + + + Hour Mark + 时标 + + + + + Circular + 圆形 + + + + + Rectangle + 矩形 + + + + Number + 数字 + + + + + + + T + + + + + Min Mark + 分标 + + + + Hand Color + 指针颜色 + + + + H + + + + + M + + + + + S + + + + + s + + + + + Date + 日期 + + + Custom Dial + 自定义表盘 + + + + Select + 选择 + + + + Text + 文本 + + + + Play + 播放方式 + + + + Duration + 播放时长 + + + + Select Dail file + 选择表盘图片 + + + + eDClock + + + + Y_ + + + + + + M_ + + + + + + D_ + + + + + + + + + + + + + + + + / + / + + + + + + + + + + + + + + + - + - + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + SUN + 星期日 + + + + AM + 上午 + + + + PM + 下午 + + + + YEAR + + + + + MONTH + + + + + DAY + + + + + eDClockAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本属性 + + + + Time Zone + 时区 + + + + Year + + + + + Month + + + + + Day + + + + + Hour + + + + + Min. + + + + + Sec. + + + + + Weekly + 星期 + + + + Full Year + 四位年 + + + + 12-Hour + 12小时制 + + + + Morning / Afternoon + 上午/下午 + + + + Date Style + 日期风格 + + + + 1955年02月24日 + + + + + 1955年2月24日 + + + + + Time Style + 时间风格 + + + + Display Style + 显示风格 + + + + Multiline + 多行显示 + + + + T + + + + + Play + 播放方式 + + + + Play Duration + 播放时长 + + + + s + + + + + eGif + + + Gif(*.gif) + + + + + eGifAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本属性 + + + + File + 文件 + + + + ... + + + + + Play + 播放方式 + + + + Play Duration + 播放时长 + + + + s + + + + + Play Times + 播放次数 + + + + eMovie + + + Movie(*.mp4 *.mkv *.rm *.rmvb *.avi *.wmv *.mov);;Flash(*.flv *.swf) + + + + + + + Convert video + 处理视频 + + + + + + Success + 成功 + + + + + + failed + 失败 + + + + Converting format + 视频处理中 + + + + eMovieAttr + + + Form + Form + + + Widget + 文本 + + + + File + 文件 + + + + ... + + + + + Play + 播放方式 + + + + AspectRatioMode + + + + + IgnoreAspectRatio + + + + + KeepAspectRatio + + + + + KeepAspectRatioByExpanding + + + + + Play Duration + 播放时长 + + + + Basic Properties + 基本属性 + + + + Play Times + 播放次数 + + + + + Convert video + 处理视频 + + + + + Success + 成功 + + + + + failed + 失败 + + + + Converting format + 视频处理中 + + + + eObjectAttr + + + GroupBox + + + + + Area + 区域(px) + + + + X + + + + + Y + + + + + W + + + + + H + + + + + ePhoto + + + Images (*.png *.jpg *.jpeg *.bmp) + 图片(*.png *.jpg *.jpeg *.bmp) + + + + ePhotoAttr + + + Form + Form + + + Widget + 文本 + + + + File + 文件 + + + + ... + + + + + Play + 播放方式 + + + + Play Duration + 播放时长 + + + Zoom out + 缩小 + + + Zoom out to left bottom + 左下角缩小 + + + Zoom out to left top + 左上角缩小 + + + Zoom out to right top + 右上角缩小 + + + Zoom out to right bottom + 右下角缩小 + + + + Play Times + 播放次数 + + + + Enter Style + 入场特效 + + + + Basic Properties + 基本属性 + + + + None + + + + + Alpha_In + 淡入 + + + Alpha Out + 淡出 + + + + Moving to left + 连续左移 + + + + Moving to right + 连续右移 + + + Moving to right + 连续右移 + + + + Moving to top + 连续上移 + + + + Move to bottom + 连续下移 + + + + Zoom in + 放大 + + + + Rotate to right + 向右旋转 + + + + Rotate to left + 向左旋转 + + + + + s + + + + + Zoom in to left_bottom + 左下角放大 + + + + Zoom in to left_top + 左上角放大 + + + + Zoom in to right_top + 右上角放大 + + + + Zoom in to right bottom + 右下角放大 + + + + Enter Duration + 特效时长 + + + + Attention + 注意 + + + + file( + 文件( + + + + ) is not exist + )不存在 + + + + Tip Info + 提示 + + + + Effect time cannot be longer than duration time + 特效时长不能大于播放时长 + + + + eTemp + + + Temperature: + 温度: + + + + Humidity: + 湿度: + + + + Noise: + 噪音: + + + + Wind Speed: + 风速: + + + + Wind Direction: + 风向: + + + + PM25: + + + + + PM10: + + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + + + + + + + north + + + + + + + + + + + east + + + + + + + + + + + south + + + + + + + + + + + west + 西 + + + + eTempAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本属性 + + + + Title + 标题 + + + + Temp. + 温度 + + + Temp. Compensation + 温度补偿 + + + Temp. Type + 单位 + + + + ℃ + + + + + ℉ + + + + Custom Label + 自定义 + + + + Temperature: + 温度: + + + Fixed Text + 固定文本 + + + + Compensation + 补偿 + + + + Humidity + 湿度: + + + + %RH + + + + + Humidity: + 湿度: + + + + Wind speed + 风速 + + + + m/s + + + + + Wind Speed: + 风速: + + + + Wind direction + 风向 + + + Wind Directon: + 风向: + + + + Wind Direction: + 风向: + + + + Noise + 噪音 + + + + dB + + + + + Noise: + 噪音: + + + + PM2.5 + + + + + + μg/m³ + + + + + PM2.5: + + + + + PM10 + + + + + PM10: + + + + + Left + 靠左 + + + + Center + 居中 + + + + Right + 靠右 + + + + Single scroll + 单行滚动 + + + + Speed + 速度 + + + + ms/pixel + 毫秒/像素 + + + + T + + + + + window-background + 窗口背景 + + + + B + + + + + Play + 播放方式 + + + + Refresh Cycle + 刷新周期 + + + + min. + 分钟 + + + + Duration + 播放时长 + + + + eText + + + Hello Text ! + 请输入内容! + + + + eTextAttr + + + Form + Form + + + Widget + 文本 + + + + T + + + + + S + + + + + B + + + + Letter Spacing + 字距 + + + Text + 文本 + + + + Basic Properties + 基本属性 + + + + Font + 字体色 + + + + Font-background + 字体背景 + + + + window-background + 窗口背景 + + + + Kerning + 字间距 + + + + Line Spacing + 行距 + + + + PageCount: + 总页数: + + + + 1 + 1 + + + + page + + + + + Play + 播放方式 + + + + Turning + 翻页 + + + + Rolling + 滚动 + + + + Static + 静态 + + + + eTextFlipAttr + + + Form + Form + + + + Play Duration + 播放时长 + + + + + H:mm:ss + + + + Effect Speed + 特技速度 + + + Effect Duration + 特效时长 + + + + Effect time + 特效时长 + + + + s + + + + + Entrance Effect + 入场特效 + + + + no + + + + + random + 随机 + + + + right to lef + 连续左移 + + + + bottom to top + 连续上移 + + + + left to right + 连续右移 + + + + top to bottom + 连续下移 + + + + Duration/Page + 每页播放时长 + + + + + Tip Info + 提示 + + + + + Effect time cannot be longer than duration time + 特效时长不能大于播放时长 + + + + eTextInput + + + Dialog + 对话框 + + + + Text Edit + 文本 + + + + Close + 确认 + + + + eTextScrollAttr + + + Form + Form + + + + Play Duration + 播放时长 + + + + H:mm:ss + + + + + Head-Tail Connected + 首尾相接 + + + + Head-Tail Spacing + 首尾间隔 + + + + Rolling Style + 滚动方向 + + + + Left -> Right + 向右 + + + + + Right -> Left + 向左 + + + + Top -> Bottom + 向下 + + + + Bottom -> Top + 向上 + + + + Rolling Speed + 滚动速度 + + + + eTextStaticAttr + + + Form + Form + + + + Play Duration + 播放时长 + + + + H:mm:ss + + + + + eTimer + + + d + + + + + h + 小时 + + + + m + 分钟 + + + + s + + + + + eTimerAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本属性 + + + + Forward + 倒计时 + + + + Backward + 正计时 + + + + Date + 到达日期 + + + + yyyy-MM-dd + + + + + Time + 到达时间 + + + + HH:mm:ss + + + + + Day + + + + + Hour + + + + + Min + + + + + Sec + + + + + Text + 文本 + + + + Style + 显示风格 + + + + Multiline + 多行显示 + + + + T + + + + + B + + + + + Play + 播放方式 + + + + Duration + 播放时长 + + + + s + + + + + eWeather + + + Weather: + 天气: + + + + Temperature: + 温度: + + + + Wind: + 风: + + + + Humidity: + 湿度: + + + + Current Temperature: + 当前温度: + + + + + Shower + + + + + + No Continuous, Range 4-5 + + + + + eWeatherAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本属性 + + + + Country + 国家 + + + + China + 中国 + + + + America + 美国 + + + + Province + + + + + City + 城市 + + + + State + + + + + District + + + + + + Weather + 天气 + + + + + Temp. + 温度 + + + + + Wind + + + + + + Humidity + 湿度 + + + + + Current Temp. + 当前温度 + + + + Temp. Type + 温度类型 + + + + + ℃ + + + + + ℉ + + + + + Temp. Unit + 温度单位 + + + + ° + + + + + Custom Label + 自定义 + + + + Weather: + 天气: + + + + Temperature: + 温度: + + + + Wind: + 风: + + + + Humidity: + 湿度: + + + + Current Temperature: + 当前温度: + + + + Display Style + 显示方式 + + + + Multiline + 多行 + + + + Singleline(Scrolling) + 单行(滚动) + + + + Singleline(Static) + 单行(静态) + + + + T + + + + + Play + 播放方式 + + + + Refresh Cycle + 更新周期 + + + + min. + 分钟 + + + + Duration + 播放时长 + + + + s + + + + + eWindow + + + Please add media on the right + 请在右边添加媒体,可以加入多个不同媒体,LED显示屏将按列表先后顺序播放 + + + + eWindowAttr + + + Form + Form + + + + Media List + 媒体列表 + + + + + + Text + 文本 + + + + + + Photo + 图片 + + + + + + Movie + 视频 + + + + + + Gif + 动画 + + + + + + DClock + 数字时钟 + + + + + + AClock + 模拟时钟 + + + + Office + Office控件 + + + + + Temp + + + + + + Weather + 天气 + + + + Rss + RSS + + + + + Timer + 计时器 + + + + + Window + 窗口 + + + + ColorText + 多彩文字 + + + + mConverter + + + Preparing ... + 准备中... + + + + Organizing resources ... + 整理资源... + + + + Create json ... + 生成json... + + + Zipped program ... + 压缩节目... + + + Zipped finished ... + 压缩完成... + + + delete tmp dir ... + 删除临时目录... + + + + Scan program ... + 扫描节目... + + + + mDeviceManager + + + Form + + + + + + All + 总数 + 总数 + + + + + + Online + 在线 + 在线 + + + + + Unlogin + 未登录 + + + + + Offline + 离线 + 离线 + + + + Refresh + 刷新 + 刷新 + + + Flash + 刷新 + + + + + Specify IP + 指定IP + 指定IP + + + + + devManager + + + + + devFlash + + + + + devFlashSpeciallyIP + + + + + bnFlashArrowItem + + + + + Screen ID + 屏幕ID + + + + Screen IP + 屏幕IP + + + + Screen Size + 屏幕像素 + + + + Remark Name + 別名 + + + + readback pic + 回读画面 + + + + send + 发送 + + + SetBrightnessSensitivity + 设置亮度传感器灵敏度 + + + SetBrightness + 设置亮度 + + + Brightness + 屏体亮度 + + + Power + 屏幕开关状态 + + + + More Info + 详细信息 + + + + Refresh + Refresh + 刷新 + + + Specify IP + Specify IP + 指定IP + + + Online + Online + 在线 + + + All + All + 总数 + + + Unlogin + Unlogin + 未登录 + + + Offline + Offline + 离线 + + + + Cur Brightness + 屏幕当前亮度 + + + + Power Status + 屏幕开关状态 + + + + Security + 加密 + + + + mDeviceSetting + + + Form + + + + + + Brightness Adjustment + 亮度调节 + + + + + Power Control + 电源控制 + + + + + Net Config + 网络配置 + + + + + Time Synchronization + 对时管理 + + + + + Video source + 同异步配置 + + + + + Encrypt + 加密配置 + + + + + Advanced parameters + 高级设置 + + + + Volume + 音量 + + + + + Test + 测试 + + + + + Lora + Lora + + + + Volume Adjustment + 音量调节 + + + Advance + 高级节目 + + + Control + 终端控制 + + + + mGuangYingPinWidget + + + Form + Form + + + + + Com + 串口 + + + + + Main + 主设备 + + + + + + + PortName + 串口名称 + + + + + + + BaudRate + 波特率 + + + + + 1200 + 1200 + + + + + 2400 + 2400 + + + + + 4800 + 4800 + + + + + 9600 + 9600 + + + + + 19200 + 19200 + + + + + 38400 + 38400 + + + + + 57600 + 57600 + + + + + 115200 + 115200 + + + + + + + DataBit + 数据位 + + + + + + 5 + 5 + + + + + + 6 + 6 + + + + + + 7 + 7 + + + + + + 8 + 8 + + + + + + + OEBit + 校验位 + + + + + No + + + + + + Even + + + + + + Odd + + + + + + Space + + + + + + Mark + + + + + + + + StopBit + 停止位 + + + + + + 1 + 1 + + + + + + 2 + 2 + + + + + 1.5 + 1.5 + + + + + State:Close + 状态:连接 + + + + + + + + + + + + Open + 打开 + + + + + Auxiliary + 副设备 + + + + + Refresh + 刷新 + + + Newwork + 网络 + + + + + Param configuration + 参数配置 + + + + + Resend times + 重发次数 + + + + + Delay millsecond + 延时(微秒) + + + + 3 + 3 + + + + 4 + 4 + + + + 9 + 9 + + + + + Clear + 清空 + + + + + Debug + 调试 + + + + + + 10 + 10 + + + + + Network + 网络 + + + + 11 + 11 + + + + 12 + 12 + + + + 13 + 13 + + + + 14 + 14 + + + + 15 + 15 + + + + 16 + 16 + + + + 17 + 17 + + + + 18 + 18 + + + + 19 + 19 + + + + 20 + 20 + + + + + Program number + 节目号 + + + + + Send + 发送 + + + Previous + 上一个 + + + Next + 下一个 + + + + + Brightness + 屏体亮度 + + + + + Set + 设置 + + + + + Screen Off + 关屏 + + + + Screen on + 开屏 + + + + + + + + + + + State:Off + 状态:断开 + + + + Screen On + 开屏 + + + + + + + + + + + + + Close + 关闭 + + + + + State:On + 状态:连接 + + + + + Tip + 提示 + + + + + OpenPort COM failed + 串口打开失败 + + + + mProgramManager + + + Form + + + + + + New + 新建 + + + + + Edit + 编辑 + + + + + Delete + 删除 + + + + + Import + 导入 + + + + + Export + 导出 + + + + + Send + 发送 + + + + Publish + 发布 + + + + Name + 名称 + + + + Resolution + 分辨率 + + + + File Size + 文件大小 + + + + Last Modify + 最后修改时间 + + + + Usb playback + U盘更新 + + + + Program name conflicted + 节目名称重复 + + + + You will delete the selected solution(s),are you sure? + 是否确认删除选中的节目? + + + + Tip Info + 提示 + + + Import program successed + 导入节目成功 + + + + mProgramManagerA + + + Form + + + + + + + New + 新建 + + + + + + Edit + 编辑 + + + + + + Delete + 删除 + + + + + + Import + 导入 + + + + + + + + Export + 导出 + + + Send + 发送 + + + + + Name + 名称 + + + + + Number + 节目数 + + + + + File Size + 文件大小 + + + + + Last Modify + 最后修改时间 + + + + + + + + Publish + 发布 + + + + mTabWidget + + + + Device + 设备管理 + + + + + Program + 节目管理 + + + + + GuangYinPin + 光影屏 + + + + Advance + 高级节目 + + + + + Control + 终端控制 + + + + mTitleBar + + + + Setting + 设置 + + + + + Language + 语言 + + + + + Check for updates + 检查更新 + + + Check for firmware updates + 检查固件更新 + + + + + Software Configuration + 软件配置 + + + + 中文 + + + + + 中文繁体 + + + + + 日本語 + + + + Update + 升级 + + + + + Help + 帮助 + + + + + firmware manager + 固件管理 + + + + + About + 关于 + + + Chinese + 中文 + + + + English + 英语 + + + Japanese + 日语 + + + + wAttrView + + + TabWidget + + + + + + 页 + 页面 + + + + widget properties + 组件属性 + + + + Page properties + 节目属性 + + + + wDevicesItem + + GetCardDetailInfoButtonTip + 更多信息 + + + + + GetScreenDetailInfo + 更多信息 + + + + + ReadbackPic + 回读画面 + + + + GetScreenshotFull + 回读画面 + + + + cur brightness: + 当前亮度: + + + + android version: + 安卓版本: + + + + IMEI: + + + + + HardWard Version: + FPGA版本: + + + + MAX Brightness level: + 亮度等级: + + + + Android OS Resolution: + 安卓分辨率: + + + + Firmware Version: + 固件版本: + + + + Player Version: + 播放器固件版本: + + + Xixun player cur version: + 当前播放器固件版本: + + + + + you can click sync firmware button to lastest version + 你可以点击同步固件按钮到计算机存储版本 + + + + + + + Detail Info + 详细信息 + + + + No install xixunplay apk firmware! + 没有安装xixunplay apk固件! + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + receive + 接收 + + + + SetScreenOn + 设置电源 + + + + AliIotSetting + + + + + + GetScreenStatus + 获取屏幕状态 + + + + + Status + 状态 + + + + DHCP IP + 动态DHCP IP + + + + STATIC IP + 静态IP + + + + Tip Info + 提示 + + + + password is wrong + 密码错误 + + + + GetBrightness + 获取亮度值 + + + + + + + brightness + 亮度 + + + IsMasterSlave + 回读主从身份 + + + + MasterSlaveSwitch + 配置主从身份 + + + + SetBrightness + 设置亮度 + + + + + SetMinBrightness + 设置最小的亮度值 + + + + GetBrightnessSensitivity + 获取亮度传感器灵敏度 + + + + sensitivity + 灵敏度 + + + + + GetMinBrightness + 获取亮度最小值 + + + Tip + 提示 + + + no sensorBrightnessTable + 控制卡中没有发现亮度配置表 + + + Tab + + + + + SetSensorBrightnessTable + 配置传感器参数表 + + + + SetSwitchWiFi + 设置WiFi开关 + + + + ConfigurationWiFi + 配置WiFi + + + + ConfigurationHotSpot + 配置热点 + + + + GetSwitchWiFi + 获取WiFi状态 + + + + SetAutoBrightnessTask + 发送定时亮度表 + + + + SetAutoVolumeTask + 配置定时音量表 + + + + SetVolume + 音量调节 + + + + GetVolume + 获取当前音量 + + + + SetTimingScreenTask + 设置屏幕定时开关任务 + + + + GetControllerDate + 获取日期时间 + + + + SetHighForBusy + 设置有无客电平 + + + + + GetStateForBusy + 获取有无客电平 + + + + Service:Low Out of service:High + 有客:低电平 无客:高电平 + + + + Service:High Out of service:Low + 有客:高电平 无客:低电平 + + + + + + IsPortableHotSpot + 获取热点和WiFi模式 + + + + WifiName + Wifi名称 + + + + ApName + 热点名称 + + + + SetScreenSize + 设置屏幕像素尺寸 + + + + TestScreen + 测试屏幕 + + + + SetOnlineAddr + 设置web服务器地址 + + + + SetRealtimeServer + 设置RealTimer地址 + + + + GetOnlineAddr + 获取web服务器地址 + + + + GetRealtimeServer + 获取realtime服务器地址 + + + + SetNtpServer + 设置NTP服务 + + + + GetNtpServer + 获取NTP服务信息 + + + + SyncTime + 校准时间 + + + + DelPrograms + 清除节目 + + + + SetingSyncMethod + 设置同步方法 + + + + GetCurrentSensorBrightness + 获取当前亮度 + + + + Cur brightness + 当前亮度 + + + + SetSpecialResolution + 设置分辨率 + + + + GetSpecialResolution + 读取分辨率 + + + + totalResolution + 包括行场数的分辨率 + + + + strCurDisplayResolution + 当前显示屏分辨率 + + + + CleanDisplayScreenSize + 恢复默认分辨率 + + + + SetMaxBrightness + 设置亮度最大值 + + + + GetMaxBrightness + 获取亮度最大值 + + + + + screenSwitch + 开关屏 + + + + + + YES + + + + + + + NO + + + + + Connect + 连接 + + + + timeout + 超时 + + + + Anycast + 点播 + + + + + + volume + 音量 + + + + + + + GetingSyncMethod + 获取同步方式 + + + + identificationCode + 识别码 + + + + delaySync + 时间偏移 + + + + msec + 毫秒 + + + + + + OtherSyncItem + 其他同步项 + + + + + + lastSynchronousTime + 上次同步时间 + + + + checkNtpTime + 同步间隔 + + + + install start... + 开始安装... + + + + not found xixunplayer.apk in computer: + 在应用程序升级目录下没有发现xixunplayer.apk, + + + + UpgradeSoftware + 升级固件 + + + + Uploadding + 上传 + + + + + Success + 成功 + + + + + failed + 失败 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + success + 成功 + + + + + Lora identity + Lora身份 + + + + Master + + + + + Slave + + + + + SetBrightnessSensitivity + 设置亮度传感器灵敏度 + + + + + + on + + + + + + + off + + + + + wDrawingBoard + + + Zoom In + 放大 + + + + Zoom Out + 缩小 + + + + Original size + 原始比例 + + + + Delete the secect media + 删除选中的媒体 + + + Clear + 清除所有媒体 + + + Cut + 剪切 + + + + Clear all media + 清空所有媒体 + + + + Cut media + 裁剪 + + + + Move layer up + 向上一层(快捷键PgUp) + + + + Send backward + 向下一层(快捷键PgDn) + + + + Bring to front + 图层置顶(快捷键Home) + + + + Move to the bottom layer + 图层置底(快捷键End) + + + + Fill the entire screen + 全屏铺满 + + + + Fill the screen horizontally + 水平铺满 + + + + Fill the screen vertically + 垂直铺满 + + + + Align top + 垂直靠顶 + + + + Center vertically + 垂直居中 + + + + Bottom align + 垂直靠底 + + + + Align left + 水平靠左 + + + + Center horizontally + 水平居中 + + + + Align right + 水平靠右 + + + + Tip Info + 提示 + + + + Clear all medias? + 清除所有媒体? + + + + wEditProgram + + + MainWindow + + + + Saving + 正在保存 + + + Saving success + 保存成功 + + + + Tip Info + 提示 + + + + Do you want to save the modifications? + 是否保存修改? + + + + + Saving... + 正在保存... + + + + + Success + 成功 + + + + + Save failed + 保存失败 + + + + Convertering + 整理数据 + + + + Converter Successed + 整理成功 + + + + Converter TimeOut + 整理超时 + + + + Generate preview data + 生成预览数据 + + + + Ready + 准备完毕 + + + + Generate TimeOut + 超时 + + + + Tip + 提示 + + + + Waring + + + + + wExportProgramItem + + + Tip Info + 提示 + + + + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? + :节目已存在。是否确实要覆盖现有节目? + + + + wMainToolBar + + + save + 保存 + + + + Save as + 另存为 + + + + Setting + 设置 + + + + Text + 文本 + + + + Photo + 图片 + + + + Video + 视频 + + + + Gif + 动画 + + + + Clock + 数字时钟 + + + + Analog Clock + 模拟时钟 + + + + Audio + 音频 + + + + MuliContentWindow + 多素材窗口 + + + + In this window, a plurality of different program materials can be added and played according to the order of joining the list; + 该窗口中可以加入多个不同是节目素材,并按照加入列表的先后顺序播放 + + + + Stop preview + 停止 + + + Office + Office控件 + + + + Environment + 环境监测 + + + Weather + 天气 + + + Rss + RSS + + + Timer + 计时器 + + + Colorful Word + 炫彩字 + + + Window + 窗口 + + + + + + Preview + 预览 + + + + Publish + 发布 + + + + wNewProgram + + + Dialog + 对话框 + + + Name + 名称 + + + + Resolution + 分辨率 + + + + Solution Information + 节目信息 + + + + X + X + + + + Solution Name + 节目名称 + + + + Width + + + + + Height + + + + + Remarks + 备注 + + + + OK + 确认 + + + + Cancel + 取消 + + + New + 新建 + + + + wPageAttr + + + Form + Form + + + + Page name + 节目名称 + + + + Play times + 播放次数 + + + + Valid Date + 有效日期 + + + + Start + 开始日期 + + + + + yyyy-MM-dd + + + + + End + 结束日期 + + + + Plan + 时间计划表 + + + + New + 新建 + + + + + The end time can not be earlier than the start time + 结束时间不能早于开始时间 + + + + wPageItemWidget + + + Form + Form + + + + times + + + + + wPageList + + + Add page + 添加页面 + + + + Copy page + 复制页面 + + + Delete + 删除 + + + + Delete page + 删除页面 + + + + Move up + 向上移动一个页面 + + + + Move down + 向下移动一个页面 + + + + program + 节目列表 + + + + Tip Info + 提示 + + + + Are you sure you want to delete this program page? + 确定要删除该节目页吗? + + + New + 新建 + + + + wPlanItem + + + Form + Form + + + Weekly + 每周: + + + + 1 + 1 + + + + Every week: + 每周: + + + + M + + + + + Tu + + + + + W + + + + + Th + + + + + F + + + + + Sa + + + + + Su + + + + + wProgramItem + + + + ExportButtonTip + U盘播放 + + + + + SendButtonTip + 发布 + + + + + Convertering + 整理数据中 + + + + USB Export Successed + U盘导出成功 + + + + USB Export TimeOut + U盘导出失败 + + + + Converter Successed + 整理成功 + + + + Converter TimeOut + 整理超时 + + + + wProgramPublishItem + + + This screen is encrypted + 屏幕已加密 + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Tip Info + 提示 + + + + password is wrong + 密码错误 + + + + wUpgradeApkItem + + + uninstalling + 正在卸载 + + + + + IsSoftwareRunning + 监测APK运行状态 + + + + + This screen is encrypted + 屏幕已加密 + + + + + Start upgrading + 开始升级 + + + Uploadding + 正在上传 + + + + + Timeout + 超时 + + + + install start... + 开始安装... + + + + + SynchronousHardwareVersion + 同步FPGA + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json文件错误! + + + + Tip Info + 提示 + + + + password is wrong + 密码错误 + + + + + UninstallSoftware + 卸载 + + + + + Success + 成功 + + + + Running + 正在运行 + + + + NoRunning + 没有运行 + + + + install success + 安装成功 + + + + + Fail + 失败 + + + + x_uiMsgBoxOnlyCloseBtn + + + Dialog + 对话框 + + + + TextLabel + + + + + X + X + + + diff --git a/LedOK/Languages/zhTH.qm b/LedOK/Languages/zhTH.qm new file mode 100644 index 0000000000000000000000000000000000000000..98236ad08d8b28dc9edaeae4b5f867eadd6ee12f GIT binary patch literal 102840 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 + + + + AboutDlg + + + Dialog + 對話方塊 + + + + About + 關於 + + + + X + X + + + + LedOK Express + LedOK Express + + + + V20200429 + + + + + <a href="https://www.ledok.cn/">www.ledok.cn + + + + + ChangePasswordForm + + + Form + Form + + + + Old password + 舊密碼 + + + + New password + 新密碼 + + + + Repeat again + 重複一遍 + + + + OK + + + + + Cancel + 取消 + + + + + + + + + + Tip + 提示 + + + + Please input old password + 請輸入舊密碼 + + + + Old password is wrong + 舊密碼錯誤 + + + + + Please enter a password with more than 6 characters + 請輸入超過6個字元的密碼 + + + + The new password is not consistent in two times + 新密碼兩次不一致 + + + + Please enter a new password + 請輸入新密碼 + + + + Password changed successfully + 密碼更改成功 + + + + ColorDialog + + + ColorDialog + + + + + Tone(H): + + + + + Saturation(S): + + + + + Brightness(V): + + + + + 度 + + + + + Basic color + 基本色 + + + + Custom color + 自定義顏色 + + + + # + + + + + Add to custom + 添加自定义颜色 + + + + Blue(B): + 藍: + + + + Green(G): + 綠: + + + + Red(R): + 紅: + + + + transparency: + 透明度: + + + + Cur color + 當前顏色 + + + + New color + 新顏色 + + + + Ok + 確定 + + + + Cancel + 取消 + + + + Select color + 選取顏色 + + + + ControlAdvParamWidget + + + Form + Form + + + + + Advanced parameters + 高級參數 + + + + + LED Screen Width(pixel): + LED荧幕寬(點數): + + + + + Width + + + + + + Height(pixel): + 高(點數): + + + + + Height + + + + + + + + + + + + + + + + Set + 設定 + + + + + Alias + 別名 + + + + + Web Server Address: + Web伺服器地址: + + + + www.m2mled.net + + + + + www.ledaips.com + + + + + https://www.taxihub.cn:2340 + + + + + https://www.ledaips.com:2340 + + + + + https://www.36taxi.com:2340 + + + + + www.tlzxled.com + + + + + Company ID: + 公司ID: + + + + Input Company ID + 輸入公司ID + + + + + Realtimer Server Address: + Realtimer地址: + + + + + Input Realtimer Server Address + 輸入Realtimer伺服器地址 + + + + + Clear + 清除 + + + + + + Apk upgrade + Apk陞級 + + + + + Check Apk + 檢查Apk + + + + + Uninstall + 卸載 + + + + + Running check + 運行狀態監測 + + + + FPAG Upgrade + FPGA更新 + + + + + FPGA version check + FPGA版本査詢 + + + + + Sync FPGA version + 同步FPGA版本 + + + + + Restart led controller system + 重啓 + + + + + Check Log + 查看日誌 + + + + Open ADB + 打開ADB調試功能 + + + + Post custom json + Post custom json + + + + + Clear Program + 清除節目 + + + + + M80 configuration + M80配寘 + + + + + Refresh + 檢測 + + + + + Restore to default + 恢復預設值 + + + + + Taxi top screen configuration + 車頂有無客電平配寘 + + + + + Service:High Out of service:Low + 有客:高電平無客:低電平 + + + + + Service:Low Out of service:High + 有客:低電平 無客:高電平 + + + + + Start LedSet3.0 configure LED module + 使用LedSet3.0配寘LED模組(廠家專業人員使用) + + + + Bind *.ic Certificate + 綁定taxihub平臺用戶身份憑證 + + + + Binding *.ic account indentity voucher + 綁定taxihub平臺用戶身份憑證 + + + + + Rotate + 旋轉 + + + + + 0 degrees + 0度 + + + + + 90 degrees + 90度 + + + + + 180 degrees + 10度 + + + + + 270 degrees + 270度 + + + + + Min brightness + 最低亮度 + + + + 1 + 1 + + + + + (min:1) + (最小:1) + + + + + + + + + Readback + 回讀 + + + + + + + + Send + 發送 + + + + + Max brightness + 最高亮度 + + + + 255 + 255 + + + + + (max:255) + (最高:255) + + + + SetScreenSize + 設定荧幕點數尺寸 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Success + 成功 + + + + Compant ID: + 公司ID: + + + + FPGA Upgrade + FPGA陞級 + + + + Compant ID + 公司ID + + + + NoSelectedController + 請先選擇大螢幕 + + + + InputWebServerAddressTip + 請輸入Web伺服器地址 + + + + InputCompanyIdTip + 請輸入公司ID + + + + Do you want to modify webserveraddress and companyId? + 是否確認配寘伺服器地址和公司ID? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + failed + 失敗 + + + + SetOnlineAddr + 設定web伺服器地址 + + + + ClearRealtimeServer + 清除 + + + + InputRealTimeAddressTip + 請輸入RealTimer地址 + + + + SetRealtimeServer + 設定RealTimer地址 + + + + + + + + + + Tip Info + 提示 + + + Do you want to save the modifications? + 是否保存修改? + + + + + + + + + Can not find LedSet3.0.exe,down you need download and install it + 找不到LedSet3.0.exe,確認下載並安裝 + + + + RestartAndroid + 重啓 + + + + FPGA Version + FPGA版本 + + + + running + 正在運行 + + + + no running + 沒有運行 + + + + version + 版本 + + + + CheckSoftVersions + 査詢已安裝apk版本 + + + + UninstallSoftware + 卸載 + + + + IsSoftwareRunning + 監測APK運行狀態 + + + + apk package (*.rpd) + + + + + CheckHardwareVersions + 査詢FPGA版本 + + + + + + SynchronousHardwareVersion + 同步FPGA硬體版本 + + + + Check Screen untile fpga update finished + 觀察荧幕陞級進度直到陞級成功 + + + + OpenAdb + 打開ADB調試功能 + + + + indentity voucher (*.ic) + 身份憑證(*.ic) + + + + + InvokeTaxiAppFunction + 綁定證書 + + + + Json format is error! + + + + + + AliIotSetting + + + + SetTaxiServer + 設定taxihub服務器 + + + DelPrograms + 清除節目 + + + + apk package (*.apk *.zip) + + + + + + UpgradeSoftware + 陞級固件 + + + + This screen is encrypted,Please decrypt and upgrade APK! + 此荧幕已加密,請解密並陞級APK! + + + + + + + SetScreenRotation + 設定荧幕旋轉 + + + + SetMinBrightness + 設定最小的亮度值 + + + + SetMaxBrightness + 設定亮度最大值 + + + + GetMinBrightness + 獲取亮度最小值 + + + + GetMaxBrightness + 獲取亮度最大值 + + + + SetSpecialResolution + 設定分辯率 + + + + GetSpecialResolution + 讀取分辯率 + + + + CleanDisplayScreenSize + 恢復默認分辯率 + + + + SetHighForBusy + 設定有無客電平 + + + + GetStateForBusy + 獲取有無客電平 + + + + install start... + 開始安裝… + + + + InputAliasTip + 請輸入別名 + + + + SetCardAlias + 設定別名 + + + + Clear program successed! + 清除節目成功 + + + + Clear program failed! + 清除節目失敗 + + + + Clear program timeout! + 清除節目超時 + + + + Uploadding + 上傳 + + + + + + + + + + + + + + + + + + + + + Tip + 提示 + + + + InputWidthTip + 請輸入正確的寬度點數值 + + + + InputHeightTip + 請輸入正確的高度點數值 + + + Can not find LedSet3.0.exe,please install it first! + 没有找到LedSet3.0软件,请先安装! + + + + Password is error + 密碼錯誤 + + + GetScreenSize + 獲取荧幕點數尺寸 + + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json檔案錯誤! + + + + ControlBrightnessAutoWidget + + + Form + Form + + + + + Sensitivity + 靈敏度 + + + + Minimum Brightness + 最小亮度值 + + + + (1~100) + + + + + (1~255) + + + + + + + + Set + 設定 + + + + + Cur brigntness:0 + 當前亮度:0 + + + + + Refresh + 檢測 + + + + + + + + + Readback + 回讀 + + + + R60 + + + + + RL1 + + + + + Upload file + 上傳設定檔 + + + + When uploading files, you can only select the card of the same sensor; otherwise it will fail! + 上傳文件時,請確認選擇正確的感測器類型,否則無效! + + + + 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 80 or above, otherwise the brightness will be low. + 如果最大亮度為64,則最小亮度可以配寘為1或適當的值;如果最大亮度為255,則最小亮度必須配寘為80或更高,否則亮度將很低。 + + + + BrightnessTip1 + 上傳文件時,請確認選擇正確的感測器類型,否則無效! + + + + BrightnessTip2 + 上傳文件時,請確認選擇正確的感測器類型,否則無效! + + + + Minbrightness + 最小亮度值 + + + + Upload + 上傳設定檔 + + + + ReadbackTable + 回讀 + + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 請先選擇大螢幕 + + + + MinBrightnessInputTip + 請輸入正確的最小亮度值 + + + + SetMinBrightness + 設定最小的亮度值 + + + + SensitivityInputTip + 請輸入正確的靈敏度值 + + + + SetBrightnessSensitivity + 設定亮度感測器靈敏度 + + + + + NeedSelectSensorTypeTip + 請先選擇感測器類型 + + + + SensorBrightnessTable + 設定亮度感測器配寘錶 + + + + GetMinBrightness + 獲取亮度最小值 + + + + GetBrightnessSensitivity + 獲取亮度感測器靈敏度 + + + + GetSensorBrightnessTable + 獲取感測器亮度配寘錶 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Cur brightness + 當前亮度 + + + + Save file + 保存 + + + + no sensorBrightnessTable + 控制卡沒有發現亮度配寘錶 + + + + GetCurrentSensorBrightness + 獲取當前亮度 + + + + + + + + + + + Success + 成功 + + + + + + + + + + + failed + 失敗 + + + + ControlBrightnessManualWidget + + + Form + Form + + + + + Y10/E10/E06:1(min)~64(max); M90/Y30/E60/Y60:1(min)~256(max) + + + + + + Readback + 回讀 + + + + + Brightness value + 亮度值 + + + + + Set + 設定 + + + + + + Tip + 提示 + + + + + NoSelectedController + 請先選擇大螢幕 + + + + ManualBrightnessInputTip + 手動調節亮度 + + + + SetBrightness + 設定亮度 + + + + + Success + 成功 + + + + + failed + 失敗 + + + + GetBrightness + 獲取亮度值 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlBrightnessSchedule + + + Form + Form + + + + + Default brightness + 默認亮度 + + + + + Default brightness tip + 提示:該設定時間內為設定亮度,設定時間外為默認亮度。例如設定默認亮度為80,設定亮度為180,時間範圍是8:00-17:00,則時間範圍內亮度為180,其他時間內為默認亮度80! + + + + + Add + 添加 + + + Edit + 编辑 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + + Import + 導入 + + + + + Export + 匯出 + + + + + Apply + 應用 + + + + + Readback + 回讀 + + + + BrightnessValue + 亮度值 + + + + Start Time + 開始時間 + + + + End Time + 結束時間 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + BrightnessSchedule (*.bjs) + + + + + Save File + 保存 + + + + + Tip + 提示 + + + + DefaultInputTip + 請輸入默認亮度值 + + + + NoSelectedController + 請先選擇大螢幕 + + + + SetAutoBrightnessTask + 發送定時亮度錶 + + + + + Success + 成功 + + + + + failed + 失敗 + + + + GetAutoBrightnessTask + 獲取定時亮度錶 + + + + ControlBrightnessScheduleEdit + + + Dialog + 對話方塊 + + + + Schedule Item + 定時 + + + + X + X + + + + Brightness Value + 亮度值 + + + + Start time + 開始時間 + + + + End time + 結束時間 + + + + 255 + 255 + + + + Add + 添加 + + + + Cancel + 取消 + + + + ControlBrightnessWidget + + + Form + Form + + + + + Brightness Configuration + 亮度配寘 + + + + + Auto + 自動 + + + + + Manual + 手動 + + + + + Schedule + 定時 + + + + ControlEncryptWidget + + + Form + Form + + + + + Entrypt Configuration + 安全配寘 + + + + Original password + 原始密碼 + + + + + + original password + 原始密碼 + + + + + + New password + 新密碼 + + + + + Repeat new password + 重複輸入 + + + + + + + Set encryption + 加密 + + + + + Cancel encryption + 取消加密 + + + + + Enter password + 輸入密碼 + + + + Enter again + 再次輸入 + + + + + + + + + Tip + 提示 + + + + NoSelectedController + 請先選擇大螢幕 + + + + + InputOriginalPasswordTip + 請輸入原始密碼 + + + + InputNewPasswordTip + 請輸入新密碼 + + + + InputRepeatPasswordTip + 請重複輸入新密碼 + + + + InputRepeatPasswordNotSameTip + 兩次輸入的密碼不一致 + + + + Tip Info + 提示 + + + + After setting the password, please remember the password and record it. If you forget the password, the device will be unable to operate. Are you sure you want to continue with this operation? + 設置密碼後,請記住密碼並記錄。如果忘記密碼,設備將無法運行。確實要繼續此操作嗎? + + + + + SetControllerPassword + 設定加密 + + + + Readback + 回讀 + + + + + + Success + 成功 + + + + + + failed + 失敗 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + Modify password + 修改密碼 + + + + OriginalPasswordErrorTip + 原始密碼錯誤 + + + + ControlHdmiManual + + + Form + Form + + + + + HDMI IN + HDMI IN + + + + Program In controller + BOX + + + + + + Readback + 回讀 + + + + Async + BOX + + + + Tip + 提示 + + + + NoSelectedController + 請先選擇大螢幕 + + + + + SyncSwitch + 切換同步模式 + + + + + AnSyncSwitch + 切換异步步模式 + + + + IsSync + 回讀同非同步模式 + + + SetHdmiIn + 切換到同步 + + + + + + + Success + 成功 + + + on + + + + + + + + failed + 失敗 + + + off + + + + IsHdmiIn + 讀取模式 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlHdmiSchedule + + + Form + Form + + + + + Add + 添加 + + + Edit + 編輯 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + + Import + + + + + + Export + 匯出 + + + + By default, the asynchronous content is played, and the synchronous signal content is played in the fixed time period + 默認播放非同步內容,定時時間段內播放同步HDMI-IN埠輸入內容 + + + + + Apply + 應用 + + + + Readback + + + + + SYNC HDMI + 同步模式 + + + + Start Time + + + + + End Time + + + + + SUN + 星期日 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + + + + + SyncSchedule (*.syncs) + + + + + Save File + 保存 + + + + Sync Schedule (*.syncs) + + + + + + Tip + 提示 + + + + + NoSelectedController + 請先選擇大螢幕 + + + + SetTimingHdmiInTask + 設定同步模式定時任務 + + + + GetTimingHdmiInTask + 獲取同步模式定時任務 + + + + + Success + 成功 + + + + + failed + 失败 + + + GetTimingScreenTask + 获取屏幕定时开关任务 + + + + ControlHdmiWidget + + + Form + Form + + + + + HDMI Configuration + 畫面輸入源配寘 + + + + + Manual + 手動 + + + + + Schedule + 定時 + + + + ControlNetConfigWidget + + + Form + Form + + + + Wire Enther(RJ45) Configuration + 有線網配寘 + + + + + DHCP + + + + + + Specify IP + 指定IP + + + + + IP Address + IP地址 + + + + Mask Address + 子網路遮罩 + + + + + Gateway + 閘道 + + + + + DNS Address + DNS地址 + + + + + + + + + + + Set + 設定 + + + + + + + + + + Readback + 回讀 + + + + + WIFI Configuration + WiFi配寘 + + + + + WiFi On/Off + WiFi使能 + + + + Input Ap name + 輸入熱點名稱 + + + + + 4G/5G Configuration + 蜂窩數據G配寘 + + + + + Open 4G/5G + 啟用蜂窩數據 + + + + APN: + + + + + Get cellular network status information + 獲取蜂窩網絡狀態資訊 + + + + + Check SIM can automatically match to MCC, and then select carrier get apn param,if not found carrier,you can check the CUSTOM checkbox,then enter custom param. + 通過獲取狀態按鈕可以自動匹配國家碼MCC,然後選擇“運營商”可獲取到響應的APN資訊,如果找不到運營商,可以選中“自定義”核取方塊,然後手動輸入APN資訊。 + + + Readback Apn Info + 回讀APN資訊 + + + + + Readback APN Info + 回讀APN資訊 + + + + + Set Apn Info,Check SIM can automatically match to MCC, and then select carrier get apn param + 設定Apn資訊 + + + + + CUSTOM + 自定義 + + + + + Check SIM + 査詢SIM資訊 + + + + + + -> + + + + + + Country ID(mcc): + 国家码(mcc):國家碼(mcc): + + + + + Carrier Name + 運營商 + + + + + APN: + 運營商APN: + + + + + APN(Required) + APN(必填) + + + + + User: + 用戶名: + + + + + + + Not required + 非必填 + + + + + Password: + 密碼: + + + + Set Apn:iot.cargo + + + + Timezone: + 時區: + + + + + Flight Mode + 飛行模式 + + + + + WiFi name + WiFi名稱 + + + + + + + Password + 密碼 + + + + + + + Input password + 輸入密碼 + + + + + Scan + 掃描 + + + + + Ap Mode + AP使能 + + + + Ap name + 熱點名稱 + + + + OFF + + + + + ON + + + + + AP name + 熱點名稱 + + + + Subnet mask + 子網路遮罩 + + + + Input ap name + 輸入AP名稱 + + + + + + + + + + + + + + + + + + + + Success + 成功 + + + + + + + + + + + + + + + + + + + + failed + 失敗 + + + + + + + Tip + 提示 + + + + + NoSelectedController + 請先選擇大螢幕 + + + + + SetEthernet + 設定有線網 + + + + + + + + + + + Attention + 注意 + + + + Please input IP address! + 請輸入IP地址! + + + + Your IP Address is Invalid! + IP地址無效! + + + + Please input Mask address! + 請輸入子網路遮罩地址! + + + + Your Mask Address is Invalid! + 遮罩地址無效! + + + + Please input Gateway address! + 請輸入閘道地址! + + + + Your Gateway Address is Invalid! + 閘道地址無效! + + + + Please input DNS address! + 請輸入DNS地址! + + + + Your DNS Address is Invalid! + DNS地址無效! + + + + GetEthernet + 獲取有線網配寘 + + + + SetSwitchWiFi + 設定WiFi開關 + + + + + + + + + SignalPower + 信號強度 + + + + + ConfigurationWiFi + 配寘WiFi + + + + IsPortableHotSpot + 獲取熱點和WiFi模式 + + + + GetWifiList + 掃描WiFi + + + + ConfigurationHotSpot + 配寘熱點 + + + + GetCurrentAPN + 獲取APN資訊 + + + + + GetSIMStatus + 獲取SIM狀態 + + + + + SetAPN + 設定APN + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + 状态: + 狀態: + + + + + 未知 + 未知 + + + + 锁定状态,需要用户的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 + + + + + 数据连接状态: + 數據連接狀態: + + + + 断开 + 斷開 + + + + 正在连接 + 正在連接 + + + + 已连接 + 已連接 + + + + 暂停 + 暫停 + + + + 数据活动休眠状态: + 數據活動休眠狀態: + + + + 活动,但无数据发送和接收 + 活動,但無數據發送和接收 + + + + 活动,正在接收数据 + 活動,正在接收數據 + + + + 活动,正在发送数据 + 活動,正在發送數據 + + + + 活动,正在接收和发送数据 + 活動,正在接收和發送數據 + + + + 休眠状态 + 休眠狀態 + + + + 信号强度: + 信號強度: + + + + SetSwitchSimData + 設定4G/5G開關 + + + SetTimezone + 設定時區 + + + + ContrFlightMode + 配寘飛行模式 + + + + GetFlightModeState + 獲取飛行模式狀態 + + + + ControlPowerManual + + + Form + Form + + + + + POWER + 開關 + + + + + + Readback + 回讀 + + + + OFF + + + + + ON + + + + + + Tip + 提示 + + + + + NoSelectedController + 請先選擇大螢幕 + + + + IsScreenOn + 讀取開關狀態 + + + + + + SetScreenOn + 設定電源 + + + + + + + Success + 成功 + + + + + on + + + + + + + + failed + 失敗 + + + + + off + + + + + + SetScreenOff + 配寘荧幕開關 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + ControlPowerSchedule + + + Form + Form + + + + Edit area + 編輯區 + + + + + Add + 添加 + + + Edit + 编辑 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + + Import + 导入 + + + + + Export + 导出 + + + + It is power off state outside the schedule time period + 定時時間段內顯示幕開啟,其他時間段為關屏狀態 + + + + Send command + 指令區 + + + + + Apply + 应用 + + + + Clear Schedule + 清除定時 + + + + Readback + 回读 + + + + Power On State + 屏开关状态 + + + + Start Time + 开始时间 + + + + End Time + 结束时间 + + + + SUN + 星期日 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + On + + + + + + PowerSchedule (*.pjs) + 开关屏定时(*.pjs) + + + + Save File + 保存 + + + + + + Tip + 提示 + + + + + + NoSelectedController + 請先選擇大螢幕 + + + + + Tip Info + 提示 + + + + + Clear schedule task? + 取消計畫任務? + + + + + CleanTimingScreenTask + 取消計畫任務 + + + + SetTimingScreenTask + 设置屏幕定时开关任务 + + + + + + + Success + 成功 + + + + + + + failed + 失败 + + + + GetTimingScreenTask + 获取屏幕定时开关任务 + + + + ControlPowerWidget + + + Form + Form + + + + + Power Configuration + 开关屏控制 + + + + + Manual + 手动 + + + + + Schedule + 定时 + + + + ControlTestWidget + + + Form + Form + + + + + Test Screen + 測試荧幕 + + + + + Line test + 線條測試 + + + + + + + + + + Red + + + + + + + + + + + Green + + + + + + + + + + + Blue + + + + + + + + + + + White + + + + + + Vertical + 豎線 + + + + + Slash + 斜線 + + + + + + Horizontal + 橫線 + + + + + + + Speed + 速度 + + + + + ms(>10) + 毫秒(>10) + + + + + Line Distance + 線距 + + + + px + px + + + + + + + + Test + 測試 + + + + + Gradation test + 灰度測試 + + + + + Only the gray value is displayed + 只顯示顏色值 + + + + (>10) + + + + + + GrayValue + 灰度值 + + + + (0-255) + + + + + + Color test + 顏色測試 + + + + + Gradient + 漸變 + + + + 8 + 8 + + + + 2 + 2 + + + + 3 + 3 + + + + 6 + 6 + + + + 4 + 4 + + + + 5 + 5 + + + + 1 + 1 + + + + 9 + 9 + + + + 7 + 7 + + + + 0 + 0 + + + + + Clear + 清除 + + + + + Reset + 迴圈 + + + + + + + Anycast + 點播 + + + Gradient + 漸變 + + + + + Stop + 停止 + + + + + + + + + + + Tip + 提示 + + + + + + + + NoSelectedController + 請先選擇大螢幕 + + + + + + StartTest + 開始測試 + + + + + + + Success + 成功 + + + + + + + failed + 失敗 + + + + StopTest + 停止測試 + + + + loopback mode + 迴圈模式 + + + + Connect timeout + 連接超時 + + + + Reset loop mode + 設定迴圈 + + + + + success + 成功 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json檔案錯誤! + + + + ControlVerifyClockWidget + + + Form + Form + + + + Verify Clock Configuration + 校准时间 + + + + Verify to Computer time + 校准到计算机时间 + + + + + Cur time of controller + 顯示幕設備當前時間 + + + + LAN + 局域網 + + + + (min/time) + (分鐘/次) + + + + Sync identificationCode + 同步识别码 + + + + + identification code + 同步识别码 + + + + + Time offset(msec) + 时间偏移(毫秒) + + + + + Brightness + 屏体亮度 + + + + + Volume + 音量 + + + + + Screen on/off + 荧幕開關 + + + + + Slave + + + + + Master + + + + + + NTP Server + NTP服务器 + + + + + + + NTP Server address + NTP服务器地址 + + + + + + + TimeZone + 时区 + + + + + + + + + + + + + Set + 设置 + + + + + Enable Synchronous playing + 使能同步画面功能 + + + + Lora + + + + + GPS + + + + + NTP + + + + Sync ime interval + 同步时间间隔 + + + + Time zone + 时区 + + + + + + + Sync time interval + 同步时间间隔 + + + + Verify clock configuration + 校准时间 + + + + + + + + + + + + Readback + 回读 + + + + Master + + + + + Sync clock to computer time + 校準時鐘到電腦時間 + + + + Identification Code + 識別碼 + + + + + + + + + + + + + + Success + 成功 + + + + + + + + + + + + + + failed + 失败 + + + + SetNtpServer + 设置NTP服务 + + + + MasterSwitch + 設定為主設備 + + + + SlaveSwitch + 設定為從設備 + + + + IsMasterSlave + 回讀主從身份 + + + + GetControllerDate + 獲取日期時間 + + + + SetingSyncMethod + 設定同步方法 + + + + SyncTime + 校准时间 + + + + GetNtpServer + 获取NTP服务信息 + + + + GetingSyncMethod + 获取同步方式 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + SetTimezone + 設定時區 + + + + ControlVolumeManual + + + Form + Form + + + + Volume(0-15) + 音量(0-15) + + + + + + Readback + + + + + SetVolume + 音量調節 + + + + + + Success + 成功 + + + + + + failed + 失败 + + + + Volume(min:0-max:15) + 音量(最小值:0-最大值:15) + + + + GetVolume + 獲取當前音量 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json檔案錯誤! + + + + ControlVolumeSchedule + + + Form + Form + + + + Defalut volume tip + 提醒:定時時間段內亮度按定時亮度顯示,其他沒有設定時間段為默認亮度值 + + + + + Add + 添加 + + + + + Delete + 删除 + + + + + Clear + 清除 + + + + Default Volume + 默認音量 + + + + (0-15) + + + + + + Import + 導入 + + + + + Export + 匯出 + + + + + Apply + 應用 + + + + Readback + 回讀 + + + + Volume value + 音量值 + + + + Start Time + 開始時間 + + + + End Time + 結束時間 + + + + SUN + 星期日 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + Default volume tip + 提醒:定時時間段以外的時間顯示幕為默認亮度 + + + + Default volume + 默認音量值 + + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json檔案錯誤! + + + + 10 + 10 + + + + + Volume Schedule (*.vols) + + + + + Save File + 保存 + + + + + Tip + 提示 + + + + + NoSelectedController + 請先選擇大螢幕 + + + + SetAutoVolumeTask + 配寘定時音量表 + + + + + Success + 成功 + + + + + failed + 失敗 + + + + GetAutoVolumeTask + 獲取定時音量表 + + + + ControlVolumeWidget + + + Form + Form + + + + + Volume Control + 音量調節 + + + + + Manual + 手動 + + + + + Schedule + 定時 + + + + DevicesControllWidget + + + Form + Form + + + + Current Screen: none + 当前屏幕: + + + + Control your devices in this widget + + + + + + Clear + 清除 + + + + + Current Screen: + 当前屏幕: + + + + + single screen operation + 單屏操作 + + + + + none + + + + + + Current Screen + 当前屏幕 + + + + Multi screen operation + 多屏操作 + + + + selected num + 選中數目 + + + + Downloader + + + + Updater + 更新 + + + Software update + 软件升级 + + + + X + X + + + + + + Downloading updates + 下载更新 + + + + Time remaining: 0 minutes + 还剩:0分钟 + + + + Open + 打开 + + + + + Stop + 停止 + + + + + Time remaining + 剩余时间 + + + + unknown + 未知 + + + + Error + 错误 + + + + Cannot find downloaded update! + 找不到下载的更新! + + + + Close + 确认 + + + + Download complete! + 下载完成! + + + + The installer will open separately + 安装程序将单独打开 + + + Click "OK" to begin installing the update + 单击“确定”开始安装更新 + + + In order to install the update, you may need to quit the application. + 要安装更新,可能需要退出应用程序。 + + + + In order to install the update + 安装更新 + + + + In order to install the update, you may need to quit the application. This is a mandatory update, exiting now will close the application + 要安装更新,可能需要退出应用程序。这是强制更新,现在退出将关闭应用程序 + + + + Tip Info + 提示 + + + + Click the "Open" button to apply the update + 单击“打开”按钮应用更新 + + + + Are you sure you want to cancel the download? + 您想现在下载更新吗? + + + + Are you sure you want to cancel the download? This is a mandatory update, exiting now will close the application + 确实要取消下载吗?这是强制更新,现在退出将关闭应用程序 + + + + + %1 bytes + + + + + + %1 KB + + + + + + %1 MB + + + + + of + ,总大小 + + + + Downloading Updates + 正在下载更新 + + + + Time Remaining + 剩余时间 + + + + Unknown + 未知 + + + + about %1 hours + 约%1小时 + + + + about one hour + 约1小时 + + + + %1 minutes + %1 分钟 + + + + 1 minute + 1 分钟 + + + + %1 seconds + %1 秒 + + + + 1 second + 1 秒 + + + + ImageCutWidget + + + Form + Form + + + + ImportBnInProgramDlg + + Dialog + 对话框 + + + + InputPasswordDialog + + + Dialog + 对话框 + + + + Input password + 輸入密碼 + + + + Change Password + 修改密碼 + + + + OK + 確認 + + + + Cancel + 取消 + + + + LoAppTools + + + + + Select File + 選擇檔案 + + + + + File name conflicted + 檔名衝突 + + + + LoColorSelector + + Select Color + 选择颜色 + + + + LoDateSelector + + + Date selector + 日期選擇器 + + + + LoEmptyDialog + + + Dialog + 對話方塊 + + + + TextLabel + + + + + LoQTitleBar + + + + + Minimize + 最小化 + + + + + + Maximize + 最大化 + + + + + + Close + 關閉 + + + + Restore + 恢復 + + + + LoUIMsgBoxOk + + Dialog + 对话框 + + + OK + 确认 + + + + LoUIMsgBoxOkCancel + + + Dialog + 對話方塊 + + + + TextLabel + + + + + OK + 確認 + + + + Cancel + 取消 + + + + MainWindow + + DhcpTip + 1.仅用于直连终端,且终端是动态IP的情况;\r\n2.开启前,请关闭防火墙,或打开ICMP回显;\r\n3.若出现连接不稳定请将PC设置成静态IP + + + DHCP Service + DHCP服务 + + + + + RJ45 Cable directly connected + 網線直連 + + + OFF + + + + ON + + + + + + Check card + 一键找卡 + + + DhcpTip4 + 1.如果電腦和LED控制卡使用網線直連,打開這個選項 + + + DhcpTip5 + 2.打開選項後電腦的ip地址會被配寘成靜態IP:192.168.0.88 + + + DhcpTip6 + 3.LED控制卡的IP地址將被配寘成192.168.0.200 + + + + Tip Info + 提示 + + + + RestoreLedCardIpByUdpTip + 該操作會把局域網內的所有與電腦IP不在同一網段的控制卡修復成固定IP,請謹慎操作! + + + + Tip + 提示 + + + + No available network was detected + 沒有檢測到可用的網絡 + + + Do you want set IP of cable network to DHCP + 是否设置网络为通过DHCP自动获取IP + + + DhcpTip1 + 1.仅用于直连终端,且终端是动态IP的情况 + + + DhcpTip2 + 2.开启前,请关闭防火墙,或打开ICMP回显 + + + DhcpTip3 + 3.若出现连接不稳定请将PC设置成静态IP + + + + MainWndIcon + + + + + LedOK Express + LedOK Express + + + + NetComm + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json檔案錯誤! + + + + 解析json文件错误! + 解析json檔案錯誤! + + + + PixbmpShowDialog + + + Dialog + + + + + X + X + + + + PublishForm + + + Form + Form + + + + + + TextLabel + + + + + X + X + + + + + + PushButton + + + + + QFfWidget + + + Form + Form + + + + QObject + + Setting up the Xanadu Express... + Xanadu Express启动中... + + + Setting up the Xanadu Express OK! + 启动成功!将应用程序添加到防火墙规则! + + + Setting up the Xanadu Express OK! +Add app to firewall rule... + 启动成功!将应用程序添加到防火墙规则... + + + + Setting up the LedOK Express... + 初始化LedOK Express… + + + + Setting up the LedOK Express OK! + LedOK Express裝載成功! + + + + SendProgramDialog + + + Dialog + 對話方塊 + + + + + Publish + 發佈 + + + + 口 + + + + + X + X + + + + Program name + 節目名稱 + + + + success info + + + + + Refresh + 檢測 + + + + Cancel + 取消 + + + + Program Name + 節目名稱 + + + + Screen ID + 荧幕ID + + + + Remark Name + 別名 + + + + Online + 線上 + + + + Screen IP + 荧幕IP + + + + Screen Size + 荧幕點數 + + + + Security + 加密 + + + + Progress + 進度 + + + + Remarks + 備註 + + + + All + 總數 + + + + SoftConfigDialog + + + Dialog + 對話方塊 + + + + Software Configuration + 軟件配寘 + + + + X + X + + + + Video convert format + 視頻轉碼 + + + + Text antialiasing + 文字反鋸齒 + + + + TextAntilaTip + (提示:該選項適合小間距大尺寸的荧幕,選中此項,文字邊緣會有暗影已達到字體邊緣光滑的效果;小尺寸荧幕和單雙色荧幕不建議使用) + + + + GuangYinPin + 光影屏 + + + + OK + 確認 + + + + SpecialDlg + + + Dialog + 對話方塊 + + + + Specify IP range + 指定IP範圍 + + + + + Specify IP + 指定IP + + + + + Search + 蒐索 + + + + Cancel + 取消 + + + + X + X + + + + + Attention + 注意 + + + + Please input IP address! + 請輸入IP地址! + + + + Your IP Address is Invalid! + IP地址無效! + + + + Success + 成功 + + + + Can't find this device IP + 未查找到設備IP地址 + + + + SubSpecifyIp + + + Form + Form + + + + Specify IP + 指定IP + + + + SubSpecifyIpRange + + + Form + Form + + + + Start IP + 開始IP + + + + End IP + 結束IP + + + + ThreadSendPro + + + get readAckSempahore + + + + + open file failed + 檔案打開失敗 + + + send failed + 發送失敗 + + + socket error + 通訊端錯誤 + + + + ThreadUpgradeApk + + open file failed + 檔案打開失敗 + + + send failed + 發送失敗 + + + Timeout + 超時 + + + + Uploadding + 正在上傳 + + + + TipDialog + + + Dialog + 對話方塊 + + + + TextLabel + + + + + + OK + 確認 + + + + + Cancel + 取消 + + + + X + X + + + + + Import + 導入 + + + + + Path + 路徑 + + + + + + : + + + + + + browse + 選擇 + + + + You will delete the selected solution(s),are you sure? + 是否確認删除選中的節目? + + + + + Save as + 另存為 + + + + + Export + 匯出 + + + + + Done + 完成 + + + + + Solution Name + 節目名稱 + + + + + Progress + 進度 + + + + Delete + 删除 + + + + Select the network to connect to the device + 選擇和LED控制卡直連的網絡 + + + + Network name + 網絡名稱 + + + + + This operation will only set cable network to static IP,are you sure? + 此操作將設定選中的網絡為固定IP,並自動配寘直連的LED設備為同一網段的IP地址,是否確認? + + + + Do you want set IP of cable network to DHCP + 是否設定網絡為通過DHCP自動獲取IP + + + + + + + + Tip + 提示 + + + + + + Please select the network to connect to the Led controller + 請選擇連接到LED控制器的網絡 + + + + Choose Directory + 選擇目錄 + + + + The imported directory is already in the working directory, so there is no need to import it again! + 該導入的目錄已經在工作目錄下,無需再次導入! + + + + no find program can be imported + 沒有找到可以導入的節目 + + + Export again + 重新导出 + + + + UpdateLedset3Dialog + + + Dialog + 對話方塊 + + + + LedSet3.0 Update + LedSet3.04更新 + + + + X + X + + + + V1.0.0 + V1.0.0 + + + + Update + 陞級 + + + + + CurVersion + 當前版本 + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + 固件APK成功下載,您可以選擇需要的LED荧幕同步固件! + + + + LatestVersion: + 最新版本: + + + + Update log: + 更新日誌: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + 當前固件APK版本已經是最新版本,您可以選擇需要的LED荧幕同步固件! + + + + Updater + + + Would you like to download the update now? + 您想現在下載更新嗎? + + + + Would you like to download the update now? This is a mandatory update, exiting now will close the application + 您想現在下載更新嗎?這是強制更新,現在退出將關閉應用程序 + + + Version %1 of %2 has been released! + 已發佈%2的版本%1! + + + + No updates are available for the moment + 暫時沒有可用的更新 + + + + Congratulations! You are running the latest version of %1 + 祝賀你!您正在運行最新版本的%1 + + + + UpdaterDialog + + + Dialog + 對話方塊 + + + + Software Update + 软件更新 + + + + X + X + + + + V1.0 + + + + + Update + 陞級 + + + + CurVersion + 當前版本 + + + + LatestVersion: + 最新版本: + + + + Update log: + 更新日誌: + + + + The current version is already the latest version + 已經是最新的版本 + + + + UpdaterFirmwareDialog + + + Dialog + 對話方塊 + + + + Firmware Update + 固件升级 + + + + X + X + + + + V1.0 + + + + + Update + 升级 + + + + + CurVersion + 当前版本 + + + + Apk is download finished from internet,you can select LED Screen SYNC firmware now! + 固件APK成功下载,您可以选择需要的LED屏幕同步固件! + + + + LatestVersion: + 最新版本: + + + + Update log: + 更新日志: + + + + The current version is already the latest version,,you can select LED Screen SYNC firmware now! + 当前固件APK版本已经是最新版本,您可以选择需要的LED屏幕同步固件! + + + + UpgradeApkDialog + + + Dialog + + + + + Upgrade apk + 陞級apk + + + + 口 + + + + + X + + + + + Select apk + 選擇Apk包 + + + + + Upgrade + 陞級 + + + + APK: + + + + + Uninstall + 卸載 + + + + check running state + 檢測運行狀態 + + + + Select Fpga + 選擇FPGA檔案 + + + + success info + + + + + Refresh + 檢測 + + + + Cancel + 取消 + + + + Screen ID + 荧幕ID + + + + Remark Name + 別名 + + + + Online + 線上 + + + + Screen IP + 荧幕IP + + + + Security + 加密 + + + + Progress + 進度 + + + + xixunplayer + + + + + cardsystem + + + + + taxiapp + + + + + starter + + + + + connection + + + + + displayer + + + + + FPGA + FPGA + + + + update + + + + + State + 陳述 + + + Remarks + 備註 + + + + + All + 總數 + + + + The encrypted control card can be upgraded directly + 加密控制卡可以直接陞級 + + + + apk package (*.rpd) + + + + + apk package (*.apk *.zip) + + + + + UsbDetectDialog + + + Form + Form + + + + Usb upgrade program + U盘更新节目 + + + + X + + + + + Password + + + + + OK + + + + + Input password + + + + + + Tip + 提示 + + + + No checked USB device + 未檢查USB設備 + + + + please select usb device in list + 請在清單中選擇usb設備 + + + + UsbDiskFuncDialog + + + Dialog + 對話方塊 + + + + Usb upgrade program + U盘更新节目 + + + + X + + + + + Path + 路径 + + + + Password + 密码 + + + + ... + + + + + OK + 确认 + + + + Cancel + 取消 + + + + Input password + 输入密码 + + + + Please select path for usb playback + 请选择路径 + + + + Choose Directory + 選擇目錄 + + + + X_UIMsgBoxOk + + + Dialog + 對話方塊 + + + + + TextLabel + + + + + X + + + + + OK + 確認 + + + + Cancel + 取消 + + + + Sync + 同步 + + + + install + 安裝 + + + + Tip Info + 提示 + + + + No found xixunplayer.apk,Do you want download it from internet? + 找不到xixunplayer.apk,你想從網上下載嗎? + + + + X_UIMsgBoxOkCancel + + + Dialog + 對話方塊 + + + + + TextLabel + + + + + X + X + + + + OK + + + + + Cancel + 取消 + + + + X_UIMsgBoxYesNoCancel + + + Dialog + 對話方塊 + + + + + TextLabel + + + + + X + X + + + + Yes + + + + + No + + + + + Cancel + 取消 + + + + eAClockAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本屬性 + + + + Time Zone + 時區 + + + + Custom Dial + 自定義錶盤 + + + + Hour Mark + 時標 + + + + + Circular + 圓形 + + + + + Rectangle + 矩形 + + + + Number + 數位 + + + + + + + T + + + + + Min Mark + 分標 + + + + Hand Color + 指針顏色 + + + + H + + + + + M + + + + + S + + + + + s + + + + + Date + 日期 + + + Custom Dial + 自定义表盘 + + + + Select + 選擇 + + + + Text + 文字 + + + + Play + 播放管道 + + + + Duration + 播放時長 + + + + Select Dail file + 選擇錶盤圖片 + + + + eDClock + + + + Y_ + + + + + + M_ + + + + + + D_ + + + + + + + + + + + + + + + + / + / + + + + + + + + + + + + + + + - + - + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + MON + 星期一 + + + + TUE + 星期二 + + + + WED + 星期三 + + + + THU + 星期四 + + + + FRI + 星期五 + + + + SAT + 星期六 + + + + SUN + 星期日 + + + + AM + 上午 + + + + PM + 下午 + + + + YEAR + + + + + MONTH + + + + + DAY + + + + + eDClockAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本屬性 + + + + Time Zone + 時區 + + + + Year + + + + + Month + + + + + Day + + + + + Hour + + + + + Min. + + + + + Sec. + + + + + Weekly + 星期 + + + + Full Year + 四比特年 + + + + 12-Hour + 12小時制 + + + + Morning / Afternoon + 上午/下午 + + + + Date Style + 日期風格 + + + + 1955年02月24日 + + + + + 1955年2月24日 + + + + + Time Style + 時間風格 + + + + Display Style + 顯示風格 + + + + Multiline + 多行顯示 + + + + T + + + + + Play + 播放管道 + + + + Play Duration + 播放時長 + + + + s + + + + + eGif + + + Gif(*.gif) + + + + + eGifAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本屬性 + + + + File + 檔案 + + + + ... + + + + + Play + 播放管道 + + + + Play Duration + 播放時長 + + + + s + + + + + Play Times + 播放次數 + + + + eMovie + + + Movie(*.mp4 *.mkv *.rm *.rmvb *.avi *.wmv *.mov);;Flash(*.flv *.swf) + + + + + + + Convert video + 處理視頻 + + + + + + Success + 成功 + + + + + + failed + 失敗 + + + + Converting format + 視頻處理中 + + + + eMovieAttr + + + Form + Form + + + Widget + 文本 + + + + File + 檔案 + + + + ... + + + + + Play + 播放管道 + + + + AspectRatioMode + + + + + IgnoreAspectRatio + + + + + KeepAspectRatio + + + + + KeepAspectRatioByExpanding + + + + + Play Duration + 播放時長 + + + + Basic Properties + 基本屬性 + + + + Play Times + 播放次數 + + + + + Convert video + 處理視頻 + + + + + Success + 成功 + + + + + failed + 失敗 + + + + Converting format + 視頻處理中 + + + + eObjectAttr + + + GroupBox + + + + + Area + 區域(px) + + + + X + + + + + Y + + + + + W + + + + + H + + + + + ePhoto + + + Images (*.png *.jpg *.jpeg *.bmp) + 圖片(*.png *.jpg *.jpeg *.bmp) + + + + ePhotoAttr + + + Form + Form + + + Widget + 文本 + + + + File + 檔案 + + + + ... + + + + + Play + 播放管道 + + + + Play Duration + 播放時長 + + + Zoom out + 缩小 + + + Zoom out to left bottom + 左下角缩小 + + + Zoom out to left top + 左上角缩小 + + + Zoom out to right top + 右上角缩小 + + + Zoom out to right bottom + 右下角缩小 + + + + Play Times + 播放次數 + + + + Enter Style + 入場特效 + + + + Basic Properties + 基本屬性 + + + + None + + + + + Alpha_In + 淡入 + + + Alpha Out + 淡出 + + + + Moving to left + 連續左移 + + + + Moving to right + 連續右移 + + + Moving to right + 连续右移 + + + + Moving to top + 連續上移 + + + + Move to bottom + 連續下移 + + + + Zoom in + 放大 + + + + Rotate to right + 向右旋轉 + + + + Rotate to left + 向左旋轉 + + + + + s + + + + + Zoom in to left_bottom + 左下角放大 + + + + Zoom in to left_top + 左上角放大 + + + + Zoom in to right_top + 右上角放大 + + + + Zoom in to right bottom + 右下角放大 + + + + Enter Duration + 特效時長 + + + + Attention + 注意 + + + + file( + 檔案( + + + + ) is not exist + )不存在 + + + + Tip Info + 提示 + + + + Effect time cannot be longer than duration time + 特效時長不能大於播放時長 + + + + eTemp + + + Temperature: + 溫度: + + + + Humidity: + 濕度: + + + + Noise: + 譟音: + + + + Wind Speed: + 風速: + + + + Wind Direction: + 風向: + + + + PM25: + + + + + PM10: + + + + + 0 + 0 + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + + + 9 + 9 + + + + + + + + + + north + + + + + + + + + + + east + + + + + + + + + + + south + + + + + + + + + + + west + 西 + + + + eTempAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本屬性 + + + + Title + 標題 + + + + Temp. + 溫度 + + + Temp. Compensation + 溫度補償 + + + Temp. Type + 符號 + + + + ℃ + + + + + ℉ + + + + Custom Label + 自定義 + + + + Temperature: + 溫度: + + + Fixed Text + 固定文字 + + + + Compensation + 補償 + + + + Humidity + 濕度: + + + + %RH + + + + + Humidity: + 濕度: + + + + Wind speed + 風速 + + + + m/s + + + + + Wind Speed: + 風速: + + + + Wind direction + 風向 + + + Wind Directon: + 風向: + + + + Wind Direction: + 風向: + + + + Noise + 譟音 + + + + dB + + + + + Noise: + 譟音: + + + + PM2.5 + + + + + + μg/m³ + + + + + PM2.5: + + + + + PM10 + + + + + PM10: + + + + + Left + 靠左 + + + + Center + 居中 + + + + Right + 靠右 + + + + Single scroll + 單行滾動 + + + + Speed + 速度 + + + + ms/pixel + 毫秒/點數 + + + + T + + + + + window-background + 視窗背景 + + + + B + + + + + Play + 播放管道 + + + + Refresh Cycle + 重繪週期 + + + + min. + 分鐘 + + + + Duration + 播放時長 + + + + eText + + + Hello Text ! + 請輸入內容! + + + + eTextAttr + + + Form + Form + + + Widget + 文本 + + + + T + + + + + S + + + + + B + + + + Letter Spacing + 字距 + + + Text + 文本 + + + + Basic Properties + 基本屬性 + + + + Font + 字體色 + + + + Font-background + 字體背景 + + + + window-background + 視窗背景 + + + + Kerning + 字間距 + + + + Line Spacing + 行距 + + + + PageCount: + 總頁數: + + + + 1 + 1 + + + + page + + + + + Play + 播放管道 + + + + Turning + 翻頁 + + + + Rolling + 滾動 + + + + Static + 靜態 + + + + eTextFlipAttr + + + Form + Form + + + + Play Duration + 播放時長 + + + + + H:mm:ss + + + + Effect Speed + 特技速度 + + + Effect Duration + 特效时长 + + + + Effect time + 特效時長 + + + + s + + + + + Entrance Effect + 入場特效 + + + + no + + + + + random + 隨機 + + + + right to lef + 連續左移 + + + + bottom to top + 連續上移 + + + + left to right + 連續右移 + + + + top to bottom + 連續下移 + + + + Duration/Page + 每頁播放時長 + + + + + Tip Info + 提示 + + + + + Effect time cannot be longer than duration time + 特效時長不能大於播放時長 + + + + eTextInput + + + Dialog + 对话框 + + + + Text Edit + 文字 + + + + Close + 確認 + + + + eTextScrollAttr + + + Form + Form + + + + Play Duration + 播放時長 + + + + H:mm:ss + + + + + Head-Tail Connected + 首尾相接 + + + + Head-Tail Spacing + 首尾間隔 + + + + Rolling Style + 滾動方向 + + + + Left -> Right + 向右 + + + + + Right -> Left + 向左 + + + + Top -> Bottom + 向下 + + + + Bottom -> Top + 向上 + + + + Rolling Speed + 滾動速度 + + + + eTextStaticAttr + + + Form + Form + + + + Play Duration + 播放時長 + + + + H:mm:ss + + + + + eTimer + + + d + + + + + h + 小时 + + + + m + 分钟 + + + + s + + + + + eTimerAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本屬性 + + + + Forward + 倒數計時 + + + + Backward + 正計時 + + + + Date + 到達日期 + + + + yyyy-MM-dd + + + + + Time + 到達時間 + + + + HH:mm:ss + + + + + Day + + + + + Hour + + + + + Min + + + + + Sec + + + + + Text + 文字 + + + + Style + 顯示風格 + + + + Multiline + 多行顯示 + + + + T + + + + + B + + + + + Play + 播放管道 + + + + Duration + 播放時長 + + + + s + + + + + eWeather + + + Weather: + 天氣: + + + + Temperature: + 溫度: + + + + Wind: + 風: + + + + Humidity: + 濕度: + + + + Current Temperature: + 當前溫度: + + + + + Shower + + + + + + No Continuous, Range 4-5 + + + + + eWeatherAttr + + + Form + Form + + + Widget + 文本 + + + + Basic Properties + 基本屬性 + + + + Country + 國家 + + + + China + 中國 + + + + America + 美國 + + + + Province + + + + + City + 都市 + + + + State + + + + + District + + + + + + Weather + 天氣 + + + + + Temp. + 溫度 + + + + + Wind + 风風 + + + + + Humidity + 濕度 + + + + + Current Temp. + 當前溫度 + + + + Temp. Type + 溫度類型 + + + + + ℃ + + + + + ℉ + + + + + Temp. Unit + 溫度符號 + + + + ° + + + + + Custom Label + 自定義 + + + + Weather: + 天氣: + + + + Temperature: + 溫度: + + + + Wind: + 風: + + + + Humidity: + 濕度: + + + + Current Temperature: + 當前溫度: + + + + Display Style + 顯示方式 + + + + Multiline + 多行 + + + + Singleline(Scrolling) + 單行(滾動) + + + + Singleline(Static) + 單行(靜態) + + + + T + + + + + Play + 播放管道 + + + + Refresh Cycle + 更新週期 + + + + min. + 分鐘 + + + + Duration + 播放時長 + + + + s + + + + + eWindow + + + Please add media on the right + 請在右邊添加媒體,可以加入多個不同媒體,LED顯示幕將按清單先後順序播放 + + + + eWindowAttr + + + Form + Form + + + + Media List + 媒體清單 + + + + + + Text + 文字 + + + + + + Photo + 圖片 + + + + + + Movie + 視頻 + + + + + + Gif + 動畫 + + + + + + DClock + 數位時鐘 + + + + + + AClock + 圓形時鐘 + + + + Office + Office控制項 + + + + + Temp + + + + + + Weather + 天氣 + + + + Rss + RSS + + + + + Timer + 計時器 + + + + + Window + 視窗 + + + + ColorText + 多彩文字 + + + + mConverter + + + Preparing ... + 準備中… + + + + Organizing resources ... + 整理資源… + + + + Create json ... + 生成json… + + + Zipped program ... + 压缩节目... + + + Zipped finished ... + 压缩完成... + + + delete tmp dir ... + 删除临时目录... + + + + Scan program ... + 掃描節目… + + + + mDeviceManager + + + Form + + + + + + All + 總數 + + + + + + Online + 在线 + 線上 + + + + + Unlogin + 未登錄 + + + + + Offline + 离线 + 離線 + + + + Refresh + 檢測 + + + Flash + 刷新 + + + + + Specify IP + 指定IP + 指定IP + + + + + devManager + + + + + devFlash + + + + + devFlashSpeciallyIP + + + + + bnFlashArrowItem + + + + + Screen ID + 荧幕ID + + + + Screen IP + 荧幕IP + + + + Screen Size + 荧幕點數 + + + + Remark Name + 別名 + + + + readback pic + 回讀畫面 + + + + send + 發送 + + + SetBrightnessSensitivity + 设置亮度传感器灵敏度 + + + SetBrightness + 设置亮度 + + + Brightness + 屏体亮度 + + + Power + 屏幕开关状态 + + + + More Info + 詳細資訊 + + + + Refresh + Refresh + 檢測 + + + Specify IP + Specify IP + 指定IP + + + Online + Online + 線上 + + + All + All + 總數 + + + Unlogin + Unlogin + 未登錄 + + + Offline + Offline + 離線 + + + + Cur Brightness + 荧幕當前亮度 + + + + Power Status + 荧幕開關狀態 + + + + Security + 加密 + + + + mDeviceSetting + + + Form + + + + + + Brightness Adjustment + 亮度調節 + + + + + Power Control + 電源控制 + + + + + Net Config + 網絡配寘 + + + + + Time Synchronization + 對時管理 + + + + + Video source + 同异步配置 + + + + + Encrypt + 加密配寘 + + + + + Advanced parameters + 高級設定 + + + + Volume + 音量 + + + + + Test + 測試 + + + + + Lora + Lora + + + + Volume Adjustment + 音量調節 + + + Advance + 高级节目 + + + Control + 终端控制 + + + + mGuangYingPinWidget + + + Form + Form + + + + + Com + 串口 + + + + + Main + 主設備 + + + + + + + PortName + 串口名稱 + + + + + + + BaudRate + 串列傳輸速率 + + + + + 1200 + 1200 + + + + + 2400 + 2400 + + + + + 4800 + 4800 + + + + + 9600 + 9600 + + + + + 19200 + 19200 + + + + + 38400 + 38400 + + + + + 57600 + 57600 + + + + + 115200 + 115200 + + + + + + + DataBit + 數據比特 + + + + + + 5 + 5 + + + + + + 6 + 6 + + + + + + 7 + 7 + + + + + + 8 + 8 + + + + + + + OEBit + 校驗比特 + + + + + No + + + + + + Even + + + + + + Odd + + + + + + Space + + + + + + Mark + + + + + + + + StopBit + 停止比特 + + + + + + 1 + 1 + + + + + + 2 + 2 + + + + + 1.5 + 1.5 + + + + + State:Close + 狀態:連接 + + + + + + + + + + + + Open + 打开 + + + + + Auxiliary + 副設備 + + + + + Refresh + 檢測 + + + Newwork + 網絡 + + + + + Param configuration + 參數配寘 + + + + + Resend times + 重發次數 + + + + + Delay millsecond + 延時(微秒) + + + + 3 + 3 + + + + 4 + 4 + + + + 9 + 9 + + + + + Clear + 清空 + + + + + Debug + 調試 + + + + + + 10 + 10 + + + + + Network + 網絡 + + + + 11 + 11 + + + + 12 + 12 + + + + 13 + 13 + + + + 14 + 14 + + + + 15 + 15 + + + + 16 + 16 + + + + 17 + 17 + + + + 18 + 18 + + + + 19 + 19 + + + + 20 + 20 + + + + + Program number + 節目號 + + + + + Send + 發送 + + + Previous + 上一個 + + + Next + 下一個 + + + + + Brightness + 屏体亮度 + + + + + Set + 設定 + + + + + Screen Off + 關屏 + + + + Screen on + 開屏 + + + + + + + + + + + State:Off + 狀態:斷開 + + + + Screen On + 開屏 + + + + + + + + + + + + + Close + 關閉 + + + + + State:On + 狀態:連接 + + + + + Tip + 提示 + + + + + OpenPort COM failed + 串口打開失敗 + + + + mProgramManager + + + Form + + + + + + New + 新建 + + + + + Edit + 編輯 + + + + + Delete + 删除 + + + + + Import + 導入 + + + + + Export + 匯出 + + + + + Send + 發送 + + + + Publish + 發佈 + + + + Name + 名稱 + + + + Resolution + 分辯率 + + + + File Size + 文件大小 + + + + Last Modify + 最後修改時間 + + + + Usb playback + U盤更新 + + + + Program name conflicted + 節目名稱重複 + + + + You will delete the selected solution(s),are you sure? + 是否確認删除選中的節目? + + + + Tip Info + 提示 + + + Import program successed + 导入节目成功 + + + + mProgramManagerA + + + Form + + + + + + + New + 新建 + + + + + + Edit + 編輯 + + + + + + Delete + 删除 + + + + + + Import + 導入 + + + + + + + + Export + 匯出 + + + Send + 发送 + + + + + Name + 名稱 + + + + + Number + 節目數 + + + + + File Size + 文件大小 + + + + + Last Modify + 最後修改時間 + + + + + + + + Publish + 發佈 + + + + mTabWidget + + + + Device + 設備管理 + + + + + Program + 節目管理 + + + + + GuangYinPin + 光影屏 + + + + Advance + 高級節目 + + + + + Control + 終端控制 + + + + mTitleBar + + + + Setting + 設定 + + + + + Language + 語言 + + + + + Check for updates + 檢查更新 + + + Check for firmware updates + 檢查固件更新 + + + + + Software Configuration + 軟件配寘 + + + + 中文 + + + + + 中文繁体 + 中文繁體 + + + + 日本語 + + + + + + Help + 幫助 + + + + + firmware manager + 固件管理 + + + + + About + 關於 + + + Chinese + 中文 + + + + English + 英語 + + + Japanese + 日语 + + + + wAttrView + + + TabWidget + + + + + + 页 + 頁面 + + + + widget properties + 組件内容 + + + + Page properties + 節目内容 + + + + wDevicesItem + + GetCardDetailInfoButtonTip + 更多信息 + + + + + GetScreenDetailInfo + 更多資訊 + + + + + ReadbackPic + 回讀畫面 + + + + GetScreenshotFull + 回讀畫面 + + + + cur brightness: + 當前亮度: + + + + android version: + 安卓版本: + + + + IMEI: + + + + + HardWard Version: + FPGA版本: + + + + MAX Brightness level: + 亮度等級: + + + + Android OS Resolution: + 安卓分辯率: + + + + Firmware Version: + 固件版本: + + + + Player Version: + 播放機固件版本: + + + Xixun player cur version: + 當前播放機固件版本: + + + + + you can click sync firmware button to lastest version + 你可以點擊同步固件按鈕到電腦存儲版本 + + + + + + + Detail Info + 詳細資訊 + + + + No install xixunplay apk firmware! + 沒有安裝xixunplay apk固件! + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + receive + 接收 + + + + SetScreenOn + 設定電源 + + + + AliIotSetting + + + + + + GetScreenStatus + 獲取荧幕狀態 + + + + + Status + 狀態 + + + + DHCP IP + 動態DHCP IP + + + + STATIC IP + 靜態IP + + + + Tip Info + 提示 + + + + password is wrong + 密碼錯誤 + + + + GetBrightness + 獲取亮度值 + + + + + + + brightness + 亮度 + + + IsMasterSlave + 回讀主從身份 + + + + MasterSlaveSwitch + 配寘主從身份 + + + + SetBrightness + 設定亮度 + + + + + SetMinBrightness + 設定最小的亮度值 + + + + GetBrightnessSensitivity + 獲取亮度感測器靈敏度 + + + + sensitivity + 靈敏度 + + + + + GetMinBrightness + 獲取亮度最小值 + + + Tip + 提示 + + + no sensorBrightnessTable + 控制卡中沒有發現亮度配寘錶 + + + Tab + + + + + SetSensorBrightnessTable + 配寘感測器參數表 + + + + SetSwitchWiFi + 設定WiFi開關 + + + + ConfigurationWiFi + 配寘WiFi + + + + ConfigurationHotSpot + 配寘熱點 + + + + GetSwitchWiFi + 獲取WiFi狀態 + + + + SetAutoBrightnessTask + 發送定時亮度錶 + + + + SetAutoVolumeTask + 配寘定時音量表 + + + + SetVolume + 音量調節 + + + + GetVolume + 獲取當前音量 + + + + SetTimingScreenTask + 設定荧幕定時開關任務 + + + + GetControllerDate + 獲取日期時間 + + + + SetHighForBusy + 設定有無客電平 + + + + + GetStateForBusy + 獲取有無客電平 + + + + Service:Low Out of service:High + 有客:低電平 無客:高電平 + + + + Service:High Out of service:Low + 有客:高電平無客:低電平 + + + + + + IsPortableHotSpot + 獲取熱點和WiFi模式 + + + + WifiName + Wifi名稱 + + + + ApName + 熱點名稱 + + + + SetScreenSize + 設定荧幕點數尺寸 + + + + TestScreen + 測試荧幕 + + + + SetOnlineAddr + 設定web伺服器地址 + + + + SetRealtimeServer + 設定RealTimer地址 + + + + GetOnlineAddr + 取得web伺服器地址 + + + + GetRealtimeServer + 獲取realtime伺服器地址 + + + + SetNtpServer + 設定NTP服務 + + + + GetNtpServer + 獲取NTP服務資訊 + + + + SyncTime + 校準時間 + + + + DelPrograms + 清除節目 + + + + SetingSyncMethod + 設定同步方法 + + + + GetCurrentSensorBrightness + 獲取當前亮度 + + + + Cur brightness + 當前亮度 + + + + SetSpecialResolution + 設定分辯率 + + + + GetSpecialResolution + 讀取分辯率 + + + + totalResolution + 行数を含む解像度 + + + + strCurDisplayResolution + 當前顯示分辯率 + + + + CleanDisplayScreenSize + 恢復默認分辯率 + + + + SetMaxBrightness + 設定亮度最大值 + + + + GetMaxBrightness + 獲取亮度最大值 + + + + + screenSwitch + 開關屏 + + + + + + YES + + + + + + + NO + + + + + Connect + 連接 + + + + timeout + 超時 + + + + Anycast + 點播 + + + + + + volume + 音量 + + + + + + + GetingSyncMethod + 獲取同步管道 + + + + identificationCode + 識別碼 + + + + delaySync + 時間偏移 + + + + msec + 毫秒 + + + + + + OtherSyncItem + 其他同步項 + + + + + + lastSynchronousTime + 上次同步時間 + + + + checkNtpTime + 同步間隔 + + + + install start... + 開始安裝... + + + + not found xixunplayer.apk in computer: + 在應用程序陞級目錄下沒有發現xixunplayer.apk, + + + + UpgradeSoftware + 陞級固件 + + + + Uploadding + 上傳 + + + + + Success + 成功 + + + + + failed + 失敗 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + success + 成功 + + + + + Lora identity + Lora身份 + + + + Master + + + + + Slave + + + + + SetBrightnessSensitivity + 設定亮度感測器靈敏度 + + + + + + on + + + + + + + off + + + + + wDrawingBoard + + + Zoom In + 放大 + + + + Zoom Out + 縮小 + + + + Original size + 原始比例 + + + + Delete the secect media + 删除選中的媒體 + + + Clear + 清除所有媒体 + + + Cut + 剪切 + + + + Clear all media + 清空所有媒體 + + + + Cut media + 裁剪 + + + + Move layer up + 向上一層(快速鍵PgUp) + + + + Send backward + 向下一層(快速鍵PgDn) + + + + Bring to front + 圖層置頂(快速鍵Home) + + + + Move to the bottom layer + 圖層置底(快速鍵End) + + + + Fill the entire screen + 全屏鋪滿 + + + + Fill the screen horizontally + 水准鋪滿 + + + + Fill the screen vertically + 垂直鋪滿 + + + + Align top + 垂直靠頂 + + + + Center vertically + 垂直居中 + + + + Bottom align + 垂直靠底 + + + + Align left + 水准靠左 + + + + Center horizontally + 水准居中 + + + + Align right + 水准靠右 + + + + Tip Info + 提示 + + + + Clear all medias? + 清除所有媒體? + + + + wEditProgram + + + MainWindow + + + + Saving + 正在保存 + + + Saving success + 保存成功 + + + + Tip Info + 提示 + + + + Do you want to save the modifications? + 是否保存修改? + + + + + Saving... + 正在保存… + + + + + Success + 成功 + + + + + Save failed + 保存失敗 + + + + Convertering + 整理數據 + + + + Converter Successed + 整理成功 + + + + Converter TimeOut + 整理超時 + + + + Generate preview data + 生成預覽數據 + + + + Ready + 準備完畢 + + + + Generate TimeOut + 超時 + + + + Tip + 提示 + + + + Waring + + + + + wExportProgramItem + + + Tip Info + 提示 + + + + :solution(s) already exist.are you sure you want to overwrite the existing solution(s)? + :節目已存在。是否確實要覆蓋現有節目? + + + + wMainToolBar + + + save + 保存 + + + + Save as + 另存為 + + + + Setting + 設定 + + + + Text + 文字 + + + + Photo + 圖片 + + + + Video + 視頻 + + + + Gif + 動畫 + + + + Clock + 數位時鐘 + + + + Analog Clock + 圓形時鐘 + + + + Audio + 音訊 + + + + MuliContentWindow + 多素材視窗 + + + + In this window, a plurality of different program materials can be added and played according to the order of joining the list; + 該視窗中可以加入多個不同是節目素材,並按照加入列表的先後順序播放 + + + + Stop preview + 停止 + + + Office + Office控件 + + + + Environment + 環境監測 + + + Weather + 天气 + + + Rss + RSS + + + Timer + 计时器 + + + Colorful Word + 炫彩字 + + + Window + 窗口 + + + + + + Preview + 預覽 + + + + Publish + 發佈 + + + + wNewProgram + + + Dialog + 對話方塊 + + + Name + 名称 + + + + Resolution + 分辯率 + + + + Solution Information + 節目資訊 + + + + X + X + + + + Solution Name + 節目名稱 + + + + Width + + + + + Height + + + + + Remarks + 備註 + + + + OK + 確認 + + + + Cancel + 取消 + + + New + 新建 + + + + wPageAttr + + + Form + Form + + + + Page name + 節目名稱 + + + + Play times + 播放次數 + + + + Valid Date + 有效日期 + + + + Start + 開始日期 + + + + + yyyy-MM-dd + + + + + End + 結束日期 + + + + Plan + 時間計畫表 + + + + New + 新建 + + + + + The end time can not be earlier than the start time + 結束時間不能早於開始時間 + + + + wPageItemWidget + + + Form + Form + + + + times + + + + + wPageList + + + Add page + 添加頁面 + + + + Copy page + 複製頁面 + + + Delete + 删除 + + + + Delete page + 删除頁面 + + + + Move up + 向上移動一個頁面 + + + + Move down + 向下移動一個頁面 + + + + program + 節目清單 + + + + Tip Info + 提示 + + + + Are you sure you want to delete this program page? + 確定要删除該節目頁嗎? + + + New + 新建 + + + + wPlanItem + + + Form + Form + + + Weekly + 每周: + + + + 1 + 1 + + + + Every week: + 每週: + + + + M + + + + + Tu + + + + + W + + + + + Th + + + + + F + + + + + Sa + + + + + Su + + + + + wProgramItem + + + + ExportButtonTip + U盤播放 + + + + + SendButtonTip + 發佈 + + + + + Convertering + 整理數據中 + + + + USB Export Successed + U盤匯出成功 + + + + USB Export TimeOut + U盤匯出失敗 + + + + Converter Successed + 整理成功 + + + + Converter TimeOut + 整理超時 + + + + wProgramPublishItem + + + This screen is encrypted + 荧幕已加密 + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + + + + + Tip Info + 提示 + + + + password is wrong + 密碼錯誤 + + + + wUpgradeApkItem + + + uninstalling + 正在卸載 + + + + + IsSoftwareRunning + 監測APK運行狀態 + + + + + This screen is encrypted + 荧幕已加密 + + + + + Start upgrading + 開始陞級 + + + Uploadding + 正在上傳 + + + + + Timeout + 超時 + + + + install start... + 開始安裝… + + + + + SynchronousHardwareVersion + 同步FPGA + + + + wDevicesItem OnProHttpResponse 解析json文件错误! + 解析json檔案錯誤! + + + + Tip Info + 提示 + + + + password is wrong + 密碼錯誤 + + + + + UninstallSoftware + 卸載 + + + + + Success + 成功 + + + + Running + 正在運行 + + + + NoRunning + 沒有運行 + + + + install success + 安裝成功 + + + + + Fail + 失敗 + + + + x_uiMsgBoxOnlyCloseBtn + + + Dialog + + + + + TextLabel + + + + + X + X + + + diff --git a/LedOK/LedOK.pro b/LedOK/LedOK.pro new file mode 100644 index 0000000..b4ff174 --- /dev/null +++ b/LedOK/LedOK.pro @@ -0,0 +1,493 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2019-04-10T23:15:55 +# +#------------------------------------------------- +VERSION = 1.1.46 +DEFINES += APP_VERSION=\\\"$$VERSION\\\" +QT += core gui +QT += network +QT += core network concurrent +#QT += axcontainer +QT += xlsx +QT += serialport +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets multimedia multimediawidgets network + +#TARGET = LedOK +TARGET = $$quote(LedOK Express) +TEMPLATE = app +# The following define makes your compiler emit warnings if you use +# any feature of Qt which has been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. + +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# 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 + +CONFIG += c++11 +#CONFIG += qaxcontainer +SOURCES += \ + ColorDialog/BasicColorArea.cpp \ + ColorDialog/BasicColorItem.cpp \ + ColorDialog/ColorDialog.cpp \ + ColorDialog/CustomColorArea.cpp \ + ColorDialog/HColorArea.cpp \ + ColorDialog/PreviewColorArea.cpp \ + ColorDialog/SVColorArea.cpp \ + LoQClass/extendedgroupbox.cpp \ + LoQClass/locolorselector.cpp \ + LoQClass/lodateselector.cpp \ + LoQClass/loglwindow.cpp \ + LoQClass/loqgraphicsobject.cpp \ + LoQClass/loqgraphicsvideoitem.cpp \ + LoQClass/loqgraphicsview.cpp \ + LoQClass/loqheaderviewcheckbox.cpp \ + LoQClass/loqlineedit.cpp \ + LoQClass/loqtreewidget.cpp \ + LoQClass/loqvideosurface.cpp \ + LoUIClass/aboutdlg.cpp \ + LoUIClass/changepasswordform.cpp \ + LoUIClass/customprogressindicator.cpp \ + LoUIClass/loemptydialog.cpp \ + LoUIClass/louimsgboxokcancel.cpp \ + LoUIClass/pixbmpshowdialog.cpp \ + LoUIClass/qiplineedit.cpp \ + LoUIClass/softconfigdialog.cpp \ + LoUIClass/switchcontrol.cpp \ + LoUIClass/taesclass.cpp \ + LoUIClass/updateledset3dialog.cpp \ + LoUIClass/updaterdialog.cpp \ + LoUIClass/updaterfirmwaredialog.cpp \ + LoUIClass/x_checkboxdelegate.cpp \ + LoUIClass/x_spinboxdelegate.cpp \ + LoUIClass/x_timeeditdelegate.cpp \ + LoUIClass/x_uimsgboxok.cpp \ + LoUIClass/x_uimsgboxokcancel.cpp \ + LoUIClass/x_uimsgboxonlyclosebtn.cpp \ + LoUIClass/x_uimsgboxyesnocancel.cpp \ + ccrashstack.cpp \ + communication/hpptclient.cpp \ + communication/network.cpp \ + communication/taserialthread.cpp \ + globaldefine.cpp \ + jsondecoderloop.cpp \ + loappconfig.cpp \ + loapptools.cpp \ + main.cpp \ + mainwindow.cpp \ + mdevicemanager.cpp \ + mdevicesetting.cpp \ + mguangyingpinwidget.cpp \ + mprogrammanagera.cpp \ + mtitlebar.cpp \ + mtabwidget.cpp \ + mprogrammanager.cpp \ + publishform.cpp \ + tipdialog.cpp \ + wDevicesManager/controladvparamwidget.cpp \ + wDevicesManager/controlbrightnessautowidget.cpp \ + wDevicesManager/controlbrightnessmanualwidget.cpp \ + wDevicesManager/controlbrightnessschedule.cpp \ + wDevicesManager/controlbrightnessscheduleedit.cpp \ + wDevicesManager/controlbrightnesswidget.cpp \ + wDevicesManager/controlencryptwidget.cpp \ + wDevicesManager/controlhdmimanual.cpp \ + wDevicesManager/controlhdmischedule.cpp \ + wDevicesManager/controlhdmiwidget.cpp \ + wDevicesManager/controlnetconfigwidget.cpp \ + wDevicesManager/controlpowermanual.cpp \ + wDevicesManager/controlpowerschedule.cpp \ + wDevicesManager/controlpowerwidget.cpp \ + wDevicesManager/controltestwidget.cpp \ + wDevicesManager/controlverifyclockwidget.cpp \ + wDevicesManager/controlvolumemanual.cpp \ + wDevicesManager/controlvolumeschedule.cpp \ + wDevicesManager/controlvolumewidget.cpp \ + wDevicesManager/devicescontrollwidget.cpp \ + wDevicesManager/inputpassworddialog.cpp \ + wDevicesManager/ledcard.cpp \ + wDevicesManager/specialdlg.cpp \ + wDevicesManager/subspecifyip.cpp \ + wDevicesManager/subspecifyiprange.cpp \ + wDevicesManager/threadupgradeapk.cpp \ + wDevicesManager/upgradeapkdialog.cpp \ + wDevicesManager/wdevicesitem.cpp \ + wDevicesManager/wupgradeapkitem.cpp \ + wProgramManager/mconverter.cpp \ + wProgramManager/sendprogramdialog.cpp \ + wProgramManager/threadexportprogrampro.cpp \ + wProgramManager/threadsendpro.cpp \ + wProgramManager/usbdetectdialog.cpp \ + wProgramManager/usbdiskfuncdialog.cpp \ + wProgramManager/wEditProgram/wElement/eaclock.cpp \ + wProgramManager/wEditProgram/wElement/eaclockattr.cpp \ + wProgramManager/wEditProgram/wElement/eattr.cpp \ + wProgramManager/wEditProgram/wElement/edclock.cpp \ + wProgramManager/wEditProgram/wElement/edclockattr.cpp \ + wProgramManager/wEditProgram/wElement/egif.cpp \ + wProgramManager/wEditProgram/wElement/egifattr.cpp \ + wProgramManager/wEditProgram/wElement/emovie.cpp \ + wProgramManager/wEditProgram/wElement/emovieattr.cpp \ + wProgramManager/wEditProgram/wElement/eobject.cpp \ + wProgramManager/wEditProgram/wElement/eobjectattr.cpp \ + wProgramManager/wEditProgram/wElement/ephoto.cpp \ + wProgramManager/wEditProgram/wElement/ephotoattr.cpp \ + wProgramManager/wEditProgram/wElement/etemp.cpp \ + wProgramManager/wEditProgram/wElement/etempattr.cpp \ + wProgramManager/wEditProgram/wElement/etext.cpp \ + wProgramManager/wEditProgram/wElement/etextattr.cpp \ + wProgramManager/wEditProgram/wElement/etextflipattr.cpp \ + wProgramManager/wEditProgram/wElement/etextinput.cpp \ + wProgramManager/wEditProgram/wElement/etextscrollattr.cpp \ + wProgramManager/wEditProgram/wElement/etextstaticattr.cpp \ + wProgramManager/wEditProgram/wElement/etimer.cpp \ + wProgramManager/wEditProgram/wElement/etimerattr.cpp \ + wProgramManager/wEditProgram/wElement/eweather.cpp \ + wProgramManager/wEditProgram/wElement/eweatherattr.cpp \ + wProgramManager/wEditProgram/wElement/ewindow.cpp \ + wProgramManager/wEditProgram/wElement/ewindowattr.cpp \ + wProgramManager/wEditProgram/wElement/fyxcircleprogress.cpp \ + wProgramManager/wEditProgram/wElement/imagecutwidget.cpp \ + wProgramManager/wEditProgram/wElement/qffwidget.cpp \ + wProgramManager/wEditProgram/wElement/videodec.cpp \ + wProgramManager/wEditProgram/wattrview.cpp \ + wProgramManager/wEditProgram/wpageattr.cpp \ + wProgramManager/wEditProgram/wpageitem.cpp \ + wProgramManager/wEditProgram/wpageitemwidget.cpp \ + wProgramManager/wEditProgram/wplanitem.cpp \ + wProgramManager/wEditProgram/wplanlist.cpp \ + wProgramManager/wexportprogramitem.cpp \ + wProgramManager/wnewprogram.cpp \ + LoQClass/loqdialog.cpp \ + LoQClass/loqpushbutton.cpp \ + wProgramManager/weditprogram.cpp \ + LoQClass/loqmainwindow.cpp \ + LoQClass/loqtitlebar.cpp \ + LoQClass/loqwindowtitlebar.cpp \ + wProgramManager/wEditProgram/wmaintoolbar.cpp \ + wProgramManager/wEditProgram/wpagelist.cpp \ + wProgramManager/wEditProgram/wdrawingboard.cpp \ + wProgramManager/wprogramitem.cpp \ + wProgramManager/wprogrampublishitem.cpp \ + wProgramManagerA/wprogramitema.cpp + +HEADERS += \ + ColorDialog/BasicColorArea.h \ + ColorDialog/BasicColorItem.h \ + ColorDialog/ColorDialog.h \ + ColorDialog/CustomColorArea.h \ + ColorDialog/HColorArea.h \ + ColorDialog/PreviewColorArea.h \ + ColorDialog/SVColorArea.h \ + LoQClass/extendedgroupbox.h \ + LoQClass/locolorselector.h \ + LoQClass/lodateselector.h \ + LoQClass/loglwindow.h \ + LoQClass/loqgraphicsobject.h \ + LoQClass/loqgraphicsvideoitem.h \ + LoQClass/loqgraphicsview.h \ + LoQClass/loqheaderviewcheckbox.h \ + LoQClass/loqlineedit.h \ + LoQClass/loqmacro.h \ + LoQClass/loqtreewidget.h \ + LoQClass/loqvideosurface.h \ + LoUIClass/aboutdlg.h \ + LoUIClass/changepasswordform.h \ + LoUIClass/customprogressindicator.h \ + LoUIClass/loemptydialog.h \ + LoUIClass/louimsgboxokcancel.h \ + LoUIClass/pixbmpshowdialog.h \ + LoUIClass/qiplineedit.h \ + LoUIClass/softconfigdialog.h \ + LoUIClass/switchcontrol.h \ + LoUIClass/taesclass.h \ + LoUIClass/updateledset3dialog.h \ + LoUIClass/updaterdialog.h \ + LoUIClass/updaterfirmwaredialog.h \ + LoUIClass/x_checkboxdelegate.h \ + LoUIClass/x_spinboxdelegate.h \ + LoUIClass/x_timeeditdelegate.h \ + LoUIClass/x_uimsgboxok.h \ + LoUIClass/x_uimsgboxokcancel.h \ + LoUIClass/x_uimsgboxonlyclosebtn.h \ + LoUIClass/x_uimsgboxyesnocancel.h \ + ccrashstack.h \ + communication/hpptclient.h \ + communication/network.h \ + communication/taserialthread.h \ + globaldefine.h \ + jsondecoderloop.h \ + loappconfig.h \ + loapptools.h \ + mainwindow.h \ + mdevicemanager.h \ + mdevicesetting.h \ + mguangyingpinwidget.h \ + mprogrammanagera.h \ + mtitlebar.h \ + mtabwidget.h \ + mprogrammanager.h \ + publishform.h \ + tipdialog.h \ + wDevicesManager/controladvparamwidget.h \ + wDevicesManager/controlbrightnessautowidget.h \ + wDevicesManager/controlbrightnessmanualwidget.h \ + wDevicesManager/controlbrightnessschedule.h \ + wDevicesManager/controlbrightnessscheduleedit.h \ + wDevicesManager/controlbrightnesswidget.h \ + wDevicesManager/controlencryptwidget.h \ + wDevicesManager/controlhdmimanual.h \ + wDevicesManager/controlhdmischedule.h \ + wDevicesManager/controlhdmiwidget.h \ + wDevicesManager/controlnetconfigwidget.h \ + wDevicesManager/controlpowermanual.h \ + wDevicesManager/controlpowerschedule.h \ + wDevicesManager/controlpowerwidget.h \ + wDevicesManager/controltestwidget.h \ + wDevicesManager/controlverifyclockwidget.h \ + wDevicesManager/controlvolumemanual.h \ + wDevicesManager/controlvolumeschedule.h \ + wDevicesManager/controlvolumewidget.h \ + wDevicesManager/devicescontrollwidget.h \ + wDevicesManager/inputpassworddialog.h \ + wDevicesManager/ledcard.h \ + wDevicesManager/specialdlg.h \ + wDevicesManager/subspecifyip.h \ + wDevicesManager/subspecifyiprange.h \ + wDevicesManager/threadupgradeapk.h \ + wDevicesManager/upgradeapkdialog.h \ + wDevicesManager/wdevicesitem.h \ + wDevicesManager/wupgradeapkitem.h \ + wProgramManager/mconverter.h \ + wProgramManager/sendprogramdialog.h \ + wProgramManager/threadexportprogrampro.h \ + wProgramManager/threadsendpro.h \ + wProgramManager/usbdetectdialog.h \ + wProgramManager/usbdiskfuncdialog.h \ + wProgramManager/wEditProgram/wElement/eaclock.h \ + wProgramManager/wEditProgram/wElement/eaclockattr.h \ + wProgramManager/wEditProgram/wElement/eattr.h \ + wProgramManager/wEditProgram/wElement/edclock.h \ + wProgramManager/wEditProgram/wElement/edclockattr.h \ + wProgramManager/wEditProgram/wElement/egif.h \ + wProgramManager/wEditProgram/wElement/egifattr.h \ + wProgramManager/wEditProgram/wElement/emovie.h \ + wProgramManager/wEditProgram/wElement/emovieattr.h \ + wProgramManager/wEditProgram/wElement/eobject.h \ + wProgramManager/wEditProgram/wElement/eobjectattr.h \ + wProgramManager/wEditProgram/wElement/ephoto.h \ + wProgramManager/wEditProgram/wElement/ephotoattr.h \ + wProgramManager/wEditProgram/wElement/etemp.h \ + wProgramManager/wEditProgram/wElement/etempattr.h \ + wProgramManager/wEditProgram/wElement/etext.h \ + wProgramManager/wEditProgram/wElement/etextattr.h \ + wProgramManager/wEditProgram/wElement/etextflipattr.h \ + wProgramManager/wEditProgram/wElement/etextinput.h \ + wProgramManager/wEditProgram/wElement/etextscrollattr.h \ + wProgramManager/wEditProgram/wElement/etextstaticattr.h \ + wProgramManager/wEditProgram/wElement/etimer.h \ + wProgramManager/wEditProgram/wElement/etimerattr.h \ + wProgramManager/wEditProgram/wElement/eweather.h \ + wProgramManager/wEditProgram/wElement/eweatherattr.h \ + wProgramManager/wEditProgram/wElement/ewindow.h \ + wProgramManager/wEditProgram/wElement/ewindowattr.h \ + wProgramManager/wEditProgram/wElement/fyxcircleprogress.h \ + wProgramManager/wEditProgram/wElement/imagecutwidget.h \ + wProgramManager/wEditProgram/wElement/qffwidget.h \ + wProgramManager/wEditProgram/wElement/videodec.h \ + wProgramManager/wEditProgram/wattrview.h \ + wProgramManager/wEditProgram/wpageattr.h \ + wProgramManager/wEditProgram/wpageitem.h \ + wProgramManager/wEditProgram/wpageitemwidget.h \ + wProgramManager/wEditProgram/wplanitem.h \ + wProgramManager/wEditProgram/wplanlist.h \ + wProgramManager/wexportprogramitem.h \ + wProgramManager/wnewprogram.h \ + LoQClass/loqdialog.h \ + LoQClass/loqpushbutton.h \ + wProgramManager/weditprogram.h \ + LoQClass/loqmainwindow.h \ + LoQClass/loqtitlebar.h \ + LoQClass/loqwindowtitlebar.h \ + wProgramManager/wEditProgram/wmaintoolbar.h \ + wProgramManager/wEditProgram/wpagelist.h \ + wProgramManager/wEditProgram/wdrawingboard.h \ + wProgramManager/wprogramitem.h \ + wProgramManager/wprogrampublishitem.h \ + wProgramManagerA/wprogramitema.h + +FORMS += \ + ColorDialog/ColorDialog.ui \ + LoUIClass/aboutdlg.ui \ + LoUIClass/changepasswordform.ui \ + LoUIClass/loemptydialog.ui \ + LoUIClass/louimsgboxokcancel.ui \ + LoUIClass/pixbmpshowdialog.ui \ + LoUIClass/softconfigdialog.ui \ + LoUIClass/updateledset3dialog.ui \ + LoUIClass/updaterdialog.ui \ + LoUIClass/updaterfirmwaredialog.ui \ + LoUIClass/x_uimsgboxok.ui \ + LoUIClass/x_uimsgboxokcancel.ui \ + LoUIClass/x_uimsgboxonlyclosebtn.ui \ + LoUIClass/x_uimsgboxyesnocancel.ui \ + mainwindow.ui \ + mdevicemanager.ui \ + mdevicesetting.ui \ + mguangyingpinwidget.ui \ + mprogrammanager.ui \ + mprogrammanagera.ui \ + publishform.ui \ + tipdialog.ui \ + wDevicesManager/controladvparamwidget.ui \ + wDevicesManager/controlbrightnessautowidget.ui \ + wDevicesManager/controlbrightnessmanualwidget.ui \ + wDevicesManager/controlbrightnessschedule.ui \ + wDevicesManager/controlbrightnessscheduleedit.ui \ + wDevicesManager/controlbrightnesswidget.ui \ + wDevicesManager/controlencryptwidget.ui \ + wDevicesManager/controlhdmimanual.ui \ + wDevicesManager/controlhdmischedule.ui \ + wDevicesManager/controlhdmiwidget.ui \ + wDevicesManager/controlnetconfigwidget.ui \ + wDevicesManager/controlpowermanual.ui \ + wDevicesManager/controlpowerschedule.ui \ + wDevicesManager/controlpowerwidget.ui \ + wDevicesManager/controltestwidget.ui \ + wDevicesManager/controlverifyclockwidget.ui \ + wDevicesManager/controlvolumemanual.ui \ + wDevicesManager/controlvolumeschedule.ui \ + wDevicesManager/controlvolumewidget.ui \ + wDevicesManager/devicescontrollwidget.ui \ + wDevicesManager/inputpassworddialog.ui \ + wDevicesManager/specialdlg.ui \ + wDevicesManager/subspecifyip.ui \ + wDevicesManager/subspecifyiprange.ui \ + wDevicesManager/upgradeapkdialog.ui \ + wProgramManager/sendprogramdialog.ui \ + wProgramManager/usbdetectdialog.ui \ + wProgramManager/usbdiskfuncdialog.ui \ + wProgramManager/wEditProgram/wElement/eaclockattr.ui \ + wProgramManager/wEditProgram/wElement/edclockattr.ui \ + wProgramManager/wEditProgram/wElement/egifattr.ui \ + wProgramManager/wEditProgram/wElement/emovieattr.ui \ + wProgramManager/wEditProgram/wElement/eobjectattr.ui \ + wProgramManager/wEditProgram/wElement/ephotoattr.ui \ + wProgramManager/wEditProgram/wElement/etempattr.ui \ + wProgramManager/wEditProgram/wElement/etextattr.ui \ + wProgramManager/wEditProgram/wElement/etextflipattr.ui \ + wProgramManager/wEditProgram/wElement/etextinput.ui \ + wProgramManager/wEditProgram/wElement/etextscrollattr.ui \ + wProgramManager/wEditProgram/wElement/etextstaticattr.ui \ + wProgramManager/wEditProgram/wElement/etimerattr.ui \ + wProgramManager/wEditProgram/wElement/eweatherattr.ui \ + wProgramManager/wEditProgram/wElement/ewindowattr.ui \ + wProgramManager/wEditProgram/wElement/imagecutwidget.ui \ + wProgramManager/wEditProgram/wElement/qffwidget.ui \ + wProgramManager/wEditProgram/wattrview.ui \ + wProgramManager/wEditProgram/wpageattr.ui \ + wProgramManager/wEditProgram/wpageitemwidget.ui \ + wProgramManager/wEditProgram/wplanitem.ui \ + wProgramManager/wnewprogram.ui \ + wProgramManager/weditprogram.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + qss/MainWnd.css \ + qss/MainTab.css \ + qss/TabDeviceManager.css \ + qss/TabProgramManager.css \ + qss/TabPMEditProgram.css \ + res/Logo.ico + +RESOURCES += \ + icons.qrc \ + images.qrc \ + languages.qrc \ + qss.qrc + +TRANSLATIONS += Languages/zhCN.ts Languages/enUS.ts Languages/jaJP.ts Languages/zhTH.ts + +#DEFINES += QT_NO_CAST_FROM_ASCII + +win32:RC_ICONS = res/Logo.ico +osx:ICON = res/Logo.icns + +INCLUDEPATH += $$PWD/include +win32 { + LIBS += -L$$PWD/lib -lquazip +} +win64 { + LIBS += -L$$PWD/lib64 -lquazip +} +win32 { +INCLUDEPATH += $$PWD/ffmpeg-4.2.2-win32-dev/include +LIBS += $$PWD/ffmpeg-4.2.2-win32-dev/lib/avformat.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avcodec.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avdevice.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avfilter.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avutil.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/postproc.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/swresample.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/swscale.lib +} + +include(./JQLibrary/JQLibrary.pri) +include(./QSimpleUpdater/QSimpleUpdater.pri) + +#QMAKE_CXXFLAGS_RELEASE += -g +#QMAKE_CFLAGS_RELEASE += -g +#QMAKE_LFLAGS_RELEASE = -mthreads -Wl,#其中最后的逗号注意添加,如果不添加可能编译不过 +##禁止优化 +#QMAKE_CFLAGS_RELEASE -= -O2 +#QMAKE_CXXFLAGS_RELEASE -= -O2 + +#QMAKE_CXXFLAGS_RELEASE += -g + + + + +#QMAKE_CFLAGS_RELEASE += -g +#QMAKE_LFLAGS_RELEASE = -mthreads -W +#LIBS += -ldbghelp +#QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO +#QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO +#QMAKE_LFLAGS_RELEASE += /MAP /DEBUG /opt:ref /INCREMENTAL:NO +#QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG +#INCLUDEPATH +="G:\Dev\QT\LedOK-master\LedOK-master\ffmpeg\include" +#INCLUDEPATH +="G:\Dev\QT\LedOK-master\LedOK-master\sdl\include" + +#LIBS += -Lffmpeg/Lib/ffmpeg/lib -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale +#LIBS += -LG:\Dev\QT\LedOK-master\LedOK-master\ffmpeg\lib -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale +#LIBS += -LG:\Dev\QT\LedOK-master\LedOK-master\sdl\lib -lSDL2 + +#RC_FILE=main.rc + + +unix|win32: LIBS += -L$$PWD/wProgramManager/wEditProgram/wElement/mpv/ -llibmpv.dll + +INCLUDEPATH += $$PWD/wProgramManager/wEditProgram/wElement/mpv +DEPENDPATH += $$PWD/wProgramManager/wEditProgram/wElement/mpv + +LIBS += -L$$PWD/../ffmpeg/lib/\ + -lavcodec \ + -lavdevice \ + -lavfilter \ + -lavformat \ + -lavutil \ + -lswresample \ + -lswscale\ + +#SDL2 +LIBS += -L$$PWD/../SDL2/lib/\ + -lSDL2 +INCLUDEPATH += $$PWD/../ffmpeg/include \ + $$PWD/../SDL2/include diff --git a/LedOK/LedOK111.pro b/LedOK/LedOK111.pro new file mode 100644 index 0000000..c89bcde --- /dev/null +++ b/LedOK/LedOK111.pro @@ -0,0 +1,471 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2019-04-10T23:15:55 +# +#------------------------------------------------- + +QT += core gui +QT += network +QT += core network concurrent +QT += axcontainer + + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets multimedia multimediawidgets network + +#TARGET = LedOK +TARGET = $$quote(Xanadu Express) +TEMPLATE = app + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which has been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# 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 + +CONFIG += c++11 + +SOURCES += \ + LoQClass/extendedgroupbox.cpp \ + LoQClass/locolorselector.cpp \ + LoQClass/lodateselector.cpp \ + LoQClass/loglwindow.cpp \ + LoQClass/loqgraphicsobject.cpp \ + LoQClass/loqgraphicsvideoitem.cpp \ + LoQClass/loqheaderviewcheckbox.cpp \ + LoQClass/loqlineedit.cpp \ + LoQClass/loqtreewidget.cpp \ + LoQClass/loqvideosurface.cpp \ + LoQClass/qexcel.cpp \ + LoQClass/readexcel.cpp \ + LoUIClass/aboutdlg.cpp \ + LoUIClass/customprogressindicator.cpp \ + LoUIClass/loemptydialog.cpp \ + LoUIClass/louimsgboxokcancel.cpp \ + LoUIClass/qiplineedit.cpp \ + LoUIClass/switchcontrol.cpp \ + LoUIClass/x_spinboxdelegate.cpp \ + LoUIClass/x_timeeditdelegate.cpp \ + LoUIClass/x_uimsgboxok.cpp \ + LoUIClass/x_uimsgboxokcancel.cpp \ + LoUIClass/x_uimsgboxyesnocancel.cpp \ + backup/mprogrammanager.cpp \ + communication/hpptclient.cpp \ + communication/network.cpp \ + globaldefine.cpp \ + importbninprogramdlg.cpp \ + jsondecoderloop.cpp \ + loappconfig.cpp \ + loapptools.cpp \ + main.cpp \ + mainwindow.cpp \ + mdevicemanager.cpp \ + mdevicesetting.cpp \ + mprogrammanagera.cpp \ + mtitlebar.cpp \ + mtabwidget.cpp \ + mprogrammanager.cpp \ + publishform.cpp \ + switchcontrol.cpp \ + tipdialog.cpp \ + wDevicesManager/controlbrightnessautowidget.cpp \ + wDevicesManager/controlbrightnessmanualwidget.cpp \ + wDevicesManager/controlbrightnessschedule.cpp \ + wDevicesManager/controlbrightnessscheduleedit.cpp \ + wDevicesManager/controlbrightnesswidget.cpp \ + wDevicesManager/controlencryptwidget.cpp \ + wDevicesManager/controlhdmimanual.cpp \ + wDevicesManager/controlhdmischedule.cpp \ + wDevicesManager/controlhdmiwidget.cpp \ + wDevicesManager/controlnetconfigwidget.cpp \ + wDevicesManager/controlpowermanual.cpp \ + wDevicesManager/controlpowerschedule.cpp \ + wDevicesManager/controlpowerwidget.cpp \ + wDevicesManager/controlverifyclockwidget.cpp \ + wDevicesManager/devicescontrollwidget.cpp \ + wDevicesManager/inputpassworddialog.cpp \ + wDevicesManager/ledcard.cpp \ + wDevicesManager/specialdlg.cpp \ + wDevicesManager/subspecifyip.cpp \ + wDevicesManager/subspecifyiprange.cpp \ + wDevicesManager/wdevicesitem.cpp \ + wProgramManager/mconverter.cpp \ + wProgramManager/sendprogramdialog.cpp \ + wProgramManager/threadsendpro.cpp \ + wProgramManager/usbdiskfuncdialog.cpp \ + wProgramManager/wEditProgram/wElement/backup/etext.cpp \ + wProgramManager/wEditProgram/wElement/eaclock.cpp \ + wProgramManager/wEditProgram/wElement/eaclockattr.cpp \ + wProgramManager/wEditProgram/wElement/eattr.cpp \ + wProgramManager/wEditProgram/wElement/edclock.cpp \ + wProgramManager/wEditProgram/wElement/edclockattr.cpp \ + wProgramManager/wEditProgram/wElement/egif.cpp \ + wProgramManager/wEditProgram/wElement/egifattr.cpp \ + wProgramManager/wEditProgram/wElement/emovie.cpp \ + wProgramManager/wEditProgram/wElement/emovieattr.cpp \ + wProgramManager/wEditProgram/wElement/eobject.cpp \ + wProgramManager/wEditProgram/wElement/eobjectattr.cpp \ + wProgramManager/wEditProgram/wElement/ephoto.cpp \ + wProgramManager/wEditProgram/wElement/ephotoattr.cpp \ + wProgramManager/wEditProgram/wElement/etemp.cpp \ + wProgramManager/wEditProgram/wElement/etempattr.cpp \ + wProgramManager/wEditProgram/wElement/etext.cpp \ + wProgramManager/wEditProgram/wElement/etextattr.cpp \ + wProgramManager/wEditProgram/wElement/etextflipattr.cpp \ + wProgramManager/wEditProgram/wElement/etextinput.cpp \ + wProgramManager/wEditProgram/wElement/etextscrollattr.cpp \ + wProgramManager/wEditProgram/wElement/etextstaticattr.cpp \ + wProgramManager/wEditProgram/wElement/etimer.cpp \ + wProgramManager/wEditProgram/wElement/etimerattr.cpp \ + wProgramManager/wEditProgram/wElement/eweather.cpp \ + wProgramManager/wEditProgram/wElement/eweatherattr.cpp \ + wProgramManager/wEditProgram/wElement/ewindow.cpp \ + wProgramManager/wEditProgram/wElement/ewindowattr.cpp \ + wProgramManager/wEditProgram/wElement/fyxcircleprogress.cpp \ + wProgramManager/wEditProgram/wattrview.cpp \ + wProgramManager/wEditProgram/wpageattr.cpp \ + wProgramManager/wEditProgram/wpageitem.cpp \ + wProgramManager/wEditProgram/wpageitemwidget.cpp \ + wProgramManager/wEditProgram/wplanitem.cpp \ + wProgramManager/wEditProgram/wplanlist.cpp \ + wProgramManager/wnewprogram.cpp \ + LoQClass/loqdialog.cpp \ + LoQClass/loqpushbutton.cpp \ + wProgramManager/weditprogram.cpp \ + LoQClass/loqmainwindow.cpp \ + LoQClass/loqtitlebar.cpp \ + LoQClass/loqwindowtitlebar.cpp \ + wProgramManager/wEditProgram/wmaintoolbar.cpp \ + wProgramManager/wEditProgram/wpagelist.cpp \ + wProgramManager/wEditProgram/wdrawingboard.cpp \ + wProgramManager/wprogramitem.cpp \ + wProgramManager/wprogrampublishitem.cpp \ + wProgramManagerA/wprogramitema.cpp + +HEADERS += \ + LoQClass/extendedgroupbox.h \ + LoQClass/locolorselector.h \ + LoQClass/lodateselector.h \ + LoQClass/loglwindow.h \ + LoQClass/loqgraphicsobject.h \ + LoQClass/loqgraphicsvideoitem.h \ + LoQClass/loqheaderviewcheckbox.h \ + LoQClass/loqlineedit.h \ + LoQClass/loqmacro.h \ + LoQClass/loqtreewidget.h \ + LoQClass/loqvideosurface.h \ + LoQClass/qexcel.h \ + LoQClass/readexcel.h \ + LoUIClass/aboutdlg.h \ + LoUIClass/customprogressindicator.h \ + LoUIClass/loemptydialog.h \ + LoUIClass/louimsgboxok.h \ + LoUIClass/louimsgboxokcancel.h \ + LoUIClass/qiplineedit.h \ + LoUIClass/switchcontrol.h \ + LoUIClass/x_spinboxdelegate.h \ + LoUIClass/x_timeeditdelegate.h \ + LoUIClass/x_uimsgboxok.h \ + LoUIClass/x_uimsgboxokcancel.h \ + LoUIClass/x_uimsgboxyesnocancel.h \ + backup/mprogrammanager.h \ + communication/hpptclient - 副本.h \ + communication/hpptclient.h \ + communication/network.h \ + globaldefine.h \ + importbninprogramdlg.h \ + include/JlCompress.h \ + include/ioapi.h \ + include/minizip_crypt.h \ + include/quaadler32.h \ + include/quachecksum32.h \ + include/quacrc32.h \ + include/quagzipfile.h \ + include/quaziodevice.h \ + include/quazip.h \ + include/quazip_global.h \ + include/quazipdir.h \ + include/quazipfile.h \ + include/quazipfileinfo.h \ + include/quazipnewinfo.h \ + include/unzip.h \ + include/zconf.h \ + include/zip.h \ + include/zlib.h \ + jsondecoderloop.h \ + loappconfig.h \ + loapptools.h \ + mainwindow.h \ + mdevicemanager.h \ + mdevicesetting.h \ + mprogrammanagera.h \ + mtitlebar.h \ + mtabwidget.h \ + mprogrammanager.h \ + publishform.h \ + sdl/include/SDL.h \ + sdl/include/SDL_assert.h \ + sdl/include/SDL_atomic.h \ + sdl/include/SDL_audio.h \ + sdl/include/SDL_bits.h \ + sdl/include/SDL_blendmode.h \ + sdl/include/SDL_clipboard.h \ + sdl/include/SDL_config.h \ + sdl/include/SDL_cpuinfo.h \ + sdl/include/SDL_egl.h \ + sdl/include/SDL_endian.h \ + sdl/include/SDL_error.h \ + sdl/include/SDL_events.h \ + sdl/include/SDL_filesystem.h \ + sdl/include/SDL_gamecontroller.h \ + sdl/include/SDL_gesture.h \ + sdl/include/SDL_haptic.h \ + sdl/include/SDL_hints.h \ + sdl/include/SDL_joystick.h \ + sdl/include/SDL_keyboard.h \ + sdl/include/SDL_keycode.h \ + sdl/include/SDL_loadso.h \ + sdl/include/SDL_log.h \ + sdl/include/SDL_main.h \ + sdl/include/SDL_messagebox.h \ + sdl/include/SDL_metal.h \ + sdl/include/SDL_mouse.h \ + sdl/include/SDL_mutex.h \ + sdl/include/SDL_name.h \ + sdl/include/SDL_opengl.h \ + sdl/include/SDL_opengl_glext.h \ + sdl/include/SDL_opengles.h \ + sdl/include/SDL_opengles2.h \ + sdl/include/SDL_opengles2_gl2.h \ + sdl/include/SDL_opengles2_gl2ext.h \ + sdl/include/SDL_opengles2_gl2platform.h \ + sdl/include/SDL_opengles2_khrplatform.h \ + sdl/include/SDL_pixels.h \ + sdl/include/SDL_platform.h \ + sdl/include/SDL_power.h \ + sdl/include/SDL_quit.h \ + sdl/include/SDL_rect.h \ + sdl/include/SDL_render.h \ + sdl/include/SDL_revision.h \ + sdl/include/SDL_rwops.h \ + sdl/include/SDL_scancode.h \ + sdl/include/SDL_sensor.h \ + sdl/include/SDL_shape.h \ + sdl/include/SDL_stdinc.h \ + sdl/include/SDL_surface.h \ + sdl/include/SDL_system.h \ + sdl/include/SDL_syswm.h \ + sdl/include/SDL_test.h \ + sdl/include/SDL_test_assert.h \ + sdl/include/SDL_test_common.h \ + sdl/include/SDL_test_compare.h \ + sdl/include/SDL_test_crc32.h \ + sdl/include/SDL_test_font.h \ + sdl/include/SDL_test_fuzzer.h \ + sdl/include/SDL_test_harness.h \ + sdl/include/SDL_test_images.h \ + sdl/include/SDL_test_log.h \ + sdl/include/SDL_test_md5.h \ + sdl/include/SDL_test_memory.h \ + sdl/include/SDL_test_random.h \ + sdl/include/SDL_thread.h \ + sdl/include/SDL_timer.h \ + sdl/include/SDL_touch.h \ + sdl/include/SDL_types.h \ + sdl/include/SDL_version.h \ + sdl/include/SDL_video.h \ + sdl/include/SDL_vulkan.h \ + sdl/include/begin_code.h \ + sdl/include/close_code.h \ + switchcontrol.h \ + tipdialog.h \ + wDevicesManager/controlbrightnessautowidget.h \ + wDevicesManager/controlbrightnessmanualwidget.h \ + wDevicesManager/controlbrightnessschedule.h \ + wDevicesManager/controlbrightnessscheduleedit.h \ + wDevicesManager/controlbrightnesswidget.h \ + wDevicesManager/controlencryptwidget.h \ + wDevicesManager/controlhdmimanual.h \ + wDevicesManager/controlhdmischedule.h \ + wDevicesManager/controlhdmiwidget.h \ + wDevicesManager/controlnetconfigwidget.h \ + wDevicesManager/controlpowermanual.h \ + wDevicesManager/controlpowerschedule.h \ + wDevicesManager/controlpowerwidget.h \ + wDevicesManager/controlverifyclockwidget.h \ + wDevicesManager/devicescontrollwidget.h \ + wDevicesManager/inputpassworddialog.h \ + wDevicesManager/ledcard.h \ + wDevicesManager/specialdlg.h \ + wDevicesManager/subspecifyip.h \ + wDevicesManager/subspecifyiprange.h \ + wDevicesManager/wdevicesitem.h \ + wProgramManager/mconverter.h \ + wProgramManager/sendprogramdialog.h \ + wProgramManager/threadsendpro.h \ + wProgramManager/usbdiskfuncdialog.h \ + wProgramManager/wEditProgram/wElement/backup/etext.h \ + wProgramManager/wEditProgram/wElement/eaclock.h \ + wProgramManager/wEditProgram/wElement/eaclockattr.h \ + wProgramManager/wEditProgram/wElement/eattr.h \ + wProgramManager/wEditProgram/wElement/edclock.h \ + wProgramManager/wEditProgram/wElement/edclockattr.h \ + wProgramManager/wEditProgram/wElement/egif.h \ + wProgramManager/wEditProgram/wElement/egifattr.h \ + wProgramManager/wEditProgram/wElement/emovie.h \ + wProgramManager/wEditProgram/wElement/emovieattr.h \ + wProgramManager/wEditProgram/wElement/eobject.h \ + wProgramManager/wEditProgram/wElement/eobjectattr.h \ + wProgramManager/wEditProgram/wElement/ephoto.h \ + wProgramManager/wEditProgram/wElement/ephotoattr.h \ + wProgramManager/wEditProgram/wElement/etemp.h \ + wProgramManager/wEditProgram/wElement/etempattr.h \ + wProgramManager/wEditProgram/wElement/etext.h \ + wProgramManager/wEditProgram/wElement/etextattr.h \ + wProgramManager/wEditProgram/wElement/etextflipattr.h \ + wProgramManager/wEditProgram/wElement/etextinput.h \ + wProgramManager/wEditProgram/wElement/etextscrollattr.h \ + wProgramManager/wEditProgram/wElement/etextstaticattr.h \ + wProgramManager/wEditProgram/wElement/etimer.h \ + wProgramManager/wEditProgram/wElement/etimerattr.h \ + wProgramManager/wEditProgram/wElement/eweather.h \ + wProgramManager/wEditProgram/wElement/eweatherattr.h \ + wProgramManager/wEditProgram/wElement/ewindow.h \ + wProgramManager/wEditProgram/wElement/ewindowattr.h \ + wProgramManager/wEditProgram/wElement/fyxcircleprogress.h \ + wProgramManager/wEditProgram/wattrview.h \ + wProgramManager/wEditProgram/wpageattr.h \ + wProgramManager/wEditProgram/wpageitem.h \ + wProgramManager/wEditProgram/wpageitemwidget.h \ + wProgramManager/wEditProgram/wplanitem.h \ + wProgramManager/wEditProgram/wplanlist.h \ + wProgramManager/wnewprogram.h \ + LoQClass/loqdialog.h \ + LoQClass/loqpushbutton.h \ + wProgramManager/weditprogram.h \ + LoQClass/loqmainwindow.h \ + LoQClass/loqtitlebar.h \ + LoQClass/loqwindowtitlebar.h \ + wProgramManager/wEditProgram/wmaintoolbar.h \ + wProgramManager/wEditProgram/wpagelist.h \ + wProgramManager/wEditProgram/wdrawingboard.h \ + wProgramManager/wprogramitem.h \ + wProgramManager/wprogrampublishitem.h \ + wProgramManagerA/wprogramitema.h + +FORMS += \ + LoUIClass/aboutdlg.ui \ + LoUIClass/loemptydialog.ui \ + LoUIClass/louimsgboxokcancel.ui \ + LoUIClass/x_uimsgboxok.ui \ + LoUIClass/x_uimsgboxokcancel.ui \ + LoUIClass/x_uimsgboxyesnocancel.ui \ + mainwindow.ui \ + mdevicemanager.ui \ + mdevicesetting.ui \ + mprogrammanager.ui \ + mprogrammanagera.ui \ + publishform.ui \ + tipdialog.ui \ + wDevicesManager/controlbrightnessautowidget.ui \ + wDevicesManager/controlbrightnessmanualwidget.ui \ + wDevicesManager/controlbrightnessschedule.ui \ + wDevicesManager/controlbrightnessscheduleedit.ui \ + wDevicesManager/controlbrightnesswidget.ui \ + wDevicesManager/controlencryptwidget.ui \ + wDevicesManager/controlhdmimanual.ui \ + wDevicesManager/controlhdmischedule.ui \ + wDevicesManager/controlhdmiwidget.ui \ + wDevicesManager/controlnetconfigwidget.ui \ + wDevicesManager/controlpowermanual.ui \ + wDevicesManager/controlpowerschedule.ui \ + wDevicesManager/controlpowerwidget.ui \ + wDevicesManager/controlverifyclockwidget.ui \ + wDevicesManager/devicescontrollwidget.ui \ + wDevicesManager/inputpassworddialog.ui \ + wDevicesManager/specialdlg.ui \ + wDevicesManager/subspecifyip.ui \ + wDevicesManager/subspecifyiprange.ui \ + wProgramManager/sendprogramdialog.ui \ + wProgramManager/usbdiskfuncdialog.ui \ + wProgramManager/wEditProgram/wElement/eaclockattr.ui \ + wProgramManager/wEditProgram/wElement/edclockattr.ui \ + wProgramManager/wEditProgram/wElement/egifattr.ui \ + wProgramManager/wEditProgram/wElement/emovieattr.ui \ + wProgramManager/wEditProgram/wElement/eobjectattr.ui \ + wProgramManager/wEditProgram/wElement/ephotoattr.ui \ + wProgramManager/wEditProgram/wElement/etempattr.ui \ + wProgramManager/wEditProgram/wElement/etextattr.ui \ + wProgramManager/wEditProgram/wElement/etextflipattr.ui \ + wProgramManager/wEditProgram/wElement/etextinput.ui \ + wProgramManager/wEditProgram/wElement/etextscrollattr.ui \ + wProgramManager/wEditProgram/wElement/etextstaticattr.ui \ + wProgramManager/wEditProgram/wElement/etimerattr.ui \ + wProgramManager/wEditProgram/wElement/eweatherattr.ui \ + wProgramManager/wEditProgram/wElement/ewindowattr.ui \ + wProgramManager/wEditProgram/wattrview.ui \ + wProgramManager/wEditProgram/wpageattr.ui \ + wProgramManager/wEditProgram/wpageitemwidget.ui \ + wProgramManager/wEditProgram/wplanitem.ui \ + wProgramManager/wnewprogram.ui \ + wProgramManager/weditprogram.ui + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +DISTFILES += \ + qss/MainWnd.css \ + qss/MainTab.css \ + qss/TabDeviceManager.css \ + qss/TabProgramManager.css \ + qss/TabPMEditProgram.css \ + res/Logo.ico + +RESOURCES += \ + icons.qrc \ + images.qrc \ + languages.qrc \ + qss.qrc + +TRANSLATIONS += Languages/zhCN.ts Languages/enUS.ts Languages/jaJP.ts + +#DEFINES += QT_NO_CAST_FROM_ASCII +win32:RC_ICONS = res/Logo.ico +osx:ICON = res/Logo.icns + +INCLUDEPATH += $$PWD/include + +CONFIG(debug, debug|release) { + LIBS += -L$$PWD/lib -lquazipd +} else { + LIBS += -L$$PWD/lib -lquazip +} + +win32 { +INCLUDEPATH += $$PWD/ffmpeg-4.2.2-win32-dev/include +LIBS += $$PWD/ffmpeg-4.2.2-win32-dev/lib/avformat.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avcodec.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avdevice.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avfilter.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/avutil.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/postproc.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/swresample.lib \ + $$PWD/ffmpeg-4.2.2-win32-dev/lib/swscale.lib +} + +include(./JQLibrary/JQLibrary.pri) + +#INCLUDEPATH +="G:\Dev\QT\LedOK-master\LedOK-master\ffmpeg\include" +#INCLUDEPATH +="G:\Dev\QT\LedOK-master\LedOK-master\sdl\include" + +#LIBS += -Lffmpeg/Lib/ffmpeg/lib -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale +#LIBS += -LG:\Dev\QT\LedOK-master\LedOK-master\ffmpeg\lib -lavutil -lavformat -lavcodec -lavdevice -lavfilter -lpostproc -lswresample -lswscale +#LIBS += -LG:\Dev\QT\LedOK-master\LedOK-master\sdl\lib -lSDL2 + +SUBDIRS += \ diff --git a/LedOK/LoQClass/extendedgroupbox.cpp b/LedOK/LoQClass/extendedgroupbox.cpp new file mode 100644 index 0000000..91a7a1c --- /dev/null +++ b/LedOK/LoQClass/extendedgroupbox.cpp @@ -0,0 +1,64 @@ +#include "extendedgroupbox.h" +ExtendedGroupBox::ExtendedGroupBox(QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/) + : QGroupBox(parent) +{ + setObjectName("ExtendedGroupBox"); + setCheckable(true); + state_ = state; + if (state_ == STATE_NORMAL) + { + //隐藏垂直边框 + setFlat(true); + } + connect(this, SIGNAL(clicked(bool)), this, SLOT(onChecked(bool))); +} + +ExtendedGroupBox::ExtendedGroupBox(const QString &title, QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/) + : QGroupBox(title, parent) +{ + setObjectName("ExtendedGroupBox"); + setCheckable(true); + state_ = state; + if (state_ == STATE_NORMAL) + { + //隐藏垂直边框 + setFlat(true); + } + // this->toggled(); + + connect(this, SIGNAL(toggled(bool)), this, SLOT(onChecked(bool))); +} + + +void ExtendedGroupBox::onChecked(bool checked) +{ + if (checked) + { + //显示垂直边框 + QList widgets = findChildren(); + for (auto iter = widgets.begin(); iter != widgets.end(); ++iter) + { + (*iter)->setVisible(true); + } + state_ = STATE_EXPAND; + } + else + { + //隐藏垂直边框 + QList widgets = findChildren(); + for (auto iter = widgets.begin(); iter != widgets.end(); ++iter) + (*iter)->setVisible(false); +// QList layouts = findChildren(); +// for (auto iter1 = layouts.begin(); iter1 != layouts.end(); ++iter1) +// (*iter1)->setVisible(false); + +// QLayout aa; +// a-> + state_ = STATE_NORMAL; + } +} + +ExtendedGroupBox::State ExtendedGroupBox::getState() const +{ + return state_; +} diff --git a/LedOK/LoQClass/extendedgroupbox.h b/LedOK/LoQClass/extendedgroupbox.h new file mode 100644 index 0000000..960d675 --- /dev/null +++ b/LedOK/LoQClass/extendedgroupbox.h @@ -0,0 +1,32 @@ +#ifndef EXTENDEDGROUPBOX_H +#define EXTENDEDGROUPBOX_H +#include +#include + +class ExtendedGroupBox : public QGroupBox +{ + Q_OBJECT + +public: + enum State + { + STATE_NORMAL, + STATE_EXPAND + }; + +public: + ExtendedGroupBox(QWidget *parent = nullptr, State state = STATE_NORMAL); + ExtendedGroupBox(const QString &title, QWidget *parent = nullptr, State state = STATE_NORMAL); + +private Q_SLOTS: + void onChecked(bool checked); + +public: + void addWidget(QWidget *widget); + State getState() const; + +private: + State state_; +}; + +#endif // EXTENDEDGROUPBOX_H diff --git a/LedOK/LoQClass/locolorselector.cpp b/LedOK/LoQClass/locolorselector.cpp new file mode 100644 index 0000000..75e2baa --- /dev/null +++ b/LedOK/LoQClass/locolorselector.cpp @@ -0,0 +1,63 @@ +#include "locolorselector.h" +#include "./ColorDialog/ColorDialog.h" +LoColorSelector::LoColorSelector(QWidget *parent) : + QPushButton(parent), + m_text(""), + m_color(Qt::transparent) +{ init(); } + +LoColorSelector::LoColorSelector(const QString &text, const QColor &color, QWidget *parent): + QPushButton(parent), + m_text(text), + m_color(color) +{ init(); } + +void LoColorSelector::init() +{ + setText(m_text); + setColor(m_color); + connect(this, SIGNAL(clicked()), this, SLOT(onColorChanged())); +} + +void LoColorSelector::setColor(const QColor &color) +{ + QFont ft = font(); + QString sColor; + if(color.alpha() == 0) { + ft.setStrikeOut(true); + } else { + ft.setStrikeOut(false); + } + sColor = QString("background-color: rgba(%1, %2, %3, %4);color: rgba(%5, %6, %7, %8);"). + arg(color.red()).arg(color.green()).arg(color.blue()).arg(color.alpha()).arg(255-color.red()).arg(255-color.green()).arg(255-color.blue()).arg(255); + setStyleSheet(sColor); +// QString strFontColor; +// strFontColor = QString("color: rgba(%1, %2, %3, %4);"). +// arg(255-color.red()).arg(255-color.green()).arg(255-color.blue()).arg(255); +// setStyleSheet(strFontColor); + + setFont(ft); + m_color = color; +} + +void LoColorSelector::onColorChanged() +{ + bool bAlpha=true; + // if(this->text()=="T") + // bAlpha=false; + ColorDialog *m_pColorDlg = new ColorDialog(m_color,bAlpha,this); + connect(m_pColorDlg, SIGNAL(accepted()), this, SLOT(onAccepted())); + m_pColorDlg->showDialog(); + if(m_pColorDlg->m_buttonRole==m_pColorDlg->Yes) + { + QColor color=m_pColorDlg->getRgba(); + // m_color.setAlpha(255); + // QColor color = ColorDialog::getColor();//::getColor(m_color, nullptr, tr("Select Color"), QColorDialog::ShowAlphaChannel); + if(color.isValid()) { + setColor(color); + + emit sColorChanged(color); + } + } + +} diff --git a/LedOK/LoQClass/locolorselector.h b/LedOK/LoQClass/locolorselector.h new file mode 100644 index 0000000..877b08d --- /dev/null +++ b/LedOK/LoQClass/locolorselector.h @@ -0,0 +1,32 @@ +#ifndef LOCOLORSELECTOR_H +#define LOCOLORSELECTOR_H + +#include +#include +#include +class LoColorSelector : public QPushButton +{ + Q_OBJECT +public: + explicit LoColorSelector(QWidget *parent = nullptr); + explicit LoColorSelector(const QString &text, const QColor &color, QWidget *parent = nullptr); + +private: + void init(); + +public: + void setColor(const QColor &color); + QColor color() const { return m_color; } + +signals: + void sColorChanged(const QColor &); + +protected slots: + void onColorChanged(); + +private: + QString m_text; + QColor m_color; +}; + +#endif // LOCOLORSELECTOR_H diff --git a/LedOK/LoQClass/lodateselector.cpp b/LedOK/LoQClass/lodateselector.cpp new file mode 100644 index 0000000..050ddfe --- /dev/null +++ b/LedOK/LoQClass/lodateselector.cpp @@ -0,0 +1,27 @@ +#include "lodateselector.h" +#include "LoUIClass/x_uimsgboxonlyclosebtn.h" +LoDateSelector::LoDateSelector(QWidget *parent) : + QPushButton(parent) +{ + connect(this, SIGNAL(clicked(bool)), this, SLOT(onClicked(bool))); +} + +void LoDateSelector::onClicked(bool) +{ + +// LoQDialog *w = new LoQDialog(this); +// QCalendarWidget *wDate = new QCalendarWidget(); +// QVBoxLayout *layout = new QVBoxLayout(); +// layout->addWidget(wDate, 1); +// connect(wDate, SIGNAL(clicked(const QDate &)), w, SLOT(accept())); +// connect(wDate, SIGNAL(clicked(const QDate &)), this, SIGNAL(sDateSelected(const QDate &))); +// w->setLayout(layout); +// w->exec(); + x_uiMsgBoxOnlyCloseBtn *w = new x_uiMsgBoxOnlyCloseBtn(tr("Date selector"),this); + QCalendarWidget *wDate = new QCalendarWidget(); + connect(wDate, SIGNAL(clicked(const QDate &)), w, SLOT(accept())); + connect(wDate, SIGNAL(clicked(const QDate &)), this, SIGNAL(sDateSelected(const QDate &))); + w->InSertDateSelector(wDate); + w->exec(); + +} diff --git a/LedOK/LoQClass/lodateselector.h b/LedOK/LoQClass/lodateselector.h new file mode 100644 index 0000000..17b670f --- /dev/null +++ b/LedOK/LoQClass/lodateselector.h @@ -0,0 +1,22 @@ +#ifndef LODATESELECTOR_H +#define LODATESELECTOR_H + +#include +#include +#include +#include + +class LoDateSelector : public QPushButton +{ + Q_OBJECT +public: + explicit LoDateSelector(QWidget *parent = nullptr); + +signals: + void sDateSelected(const QDate &); + +public slots: + void onClicked(bool); +}; + +#endif // LODATESELECTOR_H diff --git a/LedOK/LoQClass/loglwindow.cpp b/LedOK/LoQClass/loglwindow.cpp new file mode 100644 index 0000000..791116c --- /dev/null +++ b/LedOK/LoQClass/loglwindow.cpp @@ -0,0 +1,19 @@ +#include "loglwindow.h" + +LoGLWindow::LoGLWindow(QScreen *screen) + : QWindow(screen) +{ + setSurfaceType(OpenGLSurface); + create(); + // Create an OpenGL context + m_context = new QOpenGLContext; + m_context->create(); + // Setup scene and render it + m_context->makeCurrent(this); + initializeOpenGLFunctions(); +} + +QString LoGLWindow::vendor() { return QString(reinterpret_cast(glGetString(GL_VENDOR))); } +QString LoGLWindow::renderer() { return QString(reinterpret_cast(glGetString(GL_RENDERER))); } +QString LoGLWindow::version() { return QString(reinterpret_cast(glGetString(GL_VERSION))); } +QString LoGLWindow::extensions() { return QString(reinterpret_cast(glGetString(GL_EXTENSIONS))); } diff --git a/LedOK/LoQClass/loglwindow.h b/LedOK/LoQClass/loglwindow.h new file mode 100644 index 0000000..a605249 --- /dev/null +++ b/LedOK/LoQClass/loglwindow.h @@ -0,0 +1,28 @@ +#ifndef LOGLWINDOW_H +#define LOGLWINDOW_H + +#include +#include +#include +#include + +class LoGLWindow : public QWindow, protected QOpenGLFunctions +{ + Q_OBJECT +public: + LoGLWindow(QScreen *screen = nullptr); + +public: + QString vendor(); + QString renderer(); + QString version(); + QString extensions(); + +public: + QOpenGLContext *context() { return m_context; } + +private: + QOpenGLContext *m_context; +}; + +#endif // LOGLWINDOW_H diff --git a/LedOK/LoQClass/loqdialog.cpp b/LedOK/LoQClass/loqdialog.cpp new file mode 100644 index 0000000..ffc0b79 --- /dev/null +++ b/LedOK/LoQClass/loqdialog.cpp @@ -0,0 +1,65 @@ +#include "loqdialog.h" + +LoQDialog::LoQDialog(QWidget *parent) : QDialog(parent) +{ + + setAttribute(Qt::WA_DeleteOnClose); + setAttribute(Qt::WA_TranslucentBackground); + setWindowFlags(windowFlags() & + ~Qt::WindowContextHelpButtonHint | + Qt::Dialog|Qt::FramelessWindowHint + //|Qt::Tool + ); + setWindowModality(Qt::WindowModal); + +// setWindowFlags(windowFlags() & +// ~Qt::WindowContextHelpButtonHint | +// Qt::FramelessWindowHint | +// Qt::Tool); +// setWindowFlags(windowFlags() & +// ~Qt::WindowContextHelpButtonHint | +// Qt::FramelessWindowHint | +// Qt::Tool); +} + +void LoQDialog::mousePressEvent(QMouseEvent *event) +{ + + if (event->button() == Qt::LeftButton) { + QRect gRect = this->geometry(); + gRect.setWidth(gRect.width() - 10); + gRect.setHeight(gRect.height() - 10); + gRect.setX(gRect.x() + 5); + gRect.setY(gRect.y() + 5); + + if(gRect.contains(event->globalPos())) { + m_winMove = true; + m_winOrgPoint = event->globalPos(); + m_winWorldPoint = this->frameGeometry().topLeft(); + } else { + // Resize the window + } + } +} + +void LoQDialog::mouseMoveEvent(QMouseEvent *event) +{ + //return; + if(m_winMove) { + if (event->buttons() & Qt::LeftButton) { + QPoint relativePos = event->globalPos() - m_winOrgPoint; + this->move(m_winWorldPoint + relativePos ); + } + } +} + +void LoQDialog::mouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + m_winMove = false; + } +} +void LoQDialog::showEvent(QShowEvent *event) { +this->setAttribute(Qt::WA_Mapped); +QWidget::showEvent(event); +} diff --git a/LedOK/LoQClass/loqdialog.h b/LedOK/LoQClass/loqdialog.h new file mode 100644 index 0000000..cc1c310 --- /dev/null +++ b/LedOK/LoQClass/loqdialog.h @@ -0,0 +1,29 @@ +#ifndef LOQDIALOG_H +#define LOQDIALOG_H + +#include +#include + +class LoQDialog : public QDialog +{ + Q_OBJECT +public: + explicit LoQDialog(QWidget *parent = nullptr); + +protected: + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void showEvent(QShowEvent *event); + +signals: + +public slots: + +protected: + bool m_winMove=false; + QPoint m_winOrgPoint; + QPoint m_winWorldPoint; +}; + +#endif // LOQDIALOG_H diff --git a/LedOK/LoQClass/loqgraphicsobject.cpp b/LedOK/LoQClass/loqgraphicsobject.cpp new file mode 100644 index 0000000..be42b09 --- /dev/null +++ b/LedOK/LoQClass/loqgraphicsobject.cpp @@ -0,0 +1,578 @@ +#include "loqgraphicsobject.h" +#include "QCoreApplication" +LoQGraphicsObject::LoQGraphicsObject(InteractiveType type, QGraphicsItem *parent) : + QGraphicsObject(parent), + m_interactiveType(type), + m_movable(false), + m_handleLen(10), + m_rLimit(INVALID_RECT) +{ + setGeometry(0, 0, 100, 100); + init(); +} + +LoQGraphicsObject::LoQGraphicsObject(QRectF rect, InteractiveType type, QGraphicsItem *parent) : + QGraphicsObject(parent), + m_interactiveType(type), + m_movable(false), + m_handleLen(10), + m_rLimit(INVALID_RECT) +{ + setGeometry(rect); + init(); +} + +LoQGraphicsObject::LoQGraphicsObject(qreal x, qreal y, qreal w, qreal h, InteractiveType type, QGraphicsItem *parent) : + QGraphicsObject(parent), + m_interactiveType(type), + m_movable(false), + m_handleLen(10), + m_rLimit(INVALID_RECT) +{ + setGeometry(x, y, w, h); + init(); +} + +void LoQGraphicsObject::setInteractiveType(InteractiveType type) +{ + m_interactiveType = type; + GraphicsItemFlags flag = flags(); + if(Dynamic == m_interactiveType) { + flag |= ItemIsMovable; + flag |= ItemIsSelectable; + flag &= ~ItemIsFocusable; + } else { + flag &= ~ItemIsMovable; + flag &= ~ItemIsSelectable; + flag &= ~ItemIsFocusable; + } + setFlags(flag); +} + +void LoQGraphicsObject::init() +{ + setInteractiveType(m_interactiveType); + + m_handlePen.setBrush(QBrush(QColor::fromRgb(0, 255, 0))); + m_handlePen.setWidth(1); + + QVector dashes; + qreal space = 2; + qreal solid = 2; + dashes << solid << space << solid <save(); +//绘制边框 + QPen pen; // creates a default pen + +// pen.setStyle(Qt::DashDotLine); +// QLinearGradient svGradient(0, 0, 2, 0); +// svGradient.setColorAt(1, QColor("#00ff00")); +// svGradient.setColorAt(0, QColor("#ffffff")); +// QBrush myBrush(svGradient); + + QString qexeFullPath = QCoreApplication::applicationDirPath(); + QString qtBordImage=qexeFullPath+"/m/"+"M8_8.bmp"; + QPixmap aa(qtBordImage); + int iBordWidth=aa.height(); + pen.setWidth(iBordWidth); + QBrush myBrush(aa); + //myBrush.setTexture(aa); + pen.setBrush(myBrush); + pen.setCapStyle(Qt::RoundCap); + pen.setJoinStyle(Qt::RoundJoin); + + + QPainterPath path; + + path.moveTo(iBordWidth/2,iBordWidth/2); + path.lineTo(rect().right()-iBordWidth/2,iBordWidth/2); + path.lineTo(rect().right()-iBordWidth/2,rect().bottom()-iBordWidth/2); + path.lineTo(iBordWidth/2,rect().bottom()-iBordWidth/2); + path.lineTo(iBordWidth/2,iBordWidth/2); + painter->setPen(pen); + painter->drawPath(path); + + QMatrix matrix2; + matrix2.rotate(90); + QBrush myBrush2; + QPixmap bb=aa.transformed(matrix2, Qt::SmoothTransformation); + myBrush2.setTexture(bb); + QPen pen2; + pen2.setBrush(myBrush2); + QPainterPath path2; + path2.moveTo(rect().right()-iBordWidth/2,iBordWidth/2); + path2.lineTo(rect().right()-iBordWidth/2,rect().bottom()-iBordWidth/2); + painter->setPen(pen2); + painter->drawPath(path2); + + //QMatrix matrix3; + //matrix3.rotate(0); +// QBrush myBrush3; +// QPainterPath path3; +//// myBrush3.setTexture(aa); +//// pen.setBrush(myBrush); +//// painter->setPen(pen); +// path3.moveTo(rect().right()-iBordWidth/2,rect().bottom()-iBordWidth/2); +// path3.lineTo(iBordWidth/2,rect().bottom()-iBordWidth/2); +// painter->drawPath(path3); + +// QMatrix matrix4; +// matrix4.rotate(270); +// QBrush myBrush4; +// QPainterPath path4; +// myBrush4.setTexture(aa.transformed(matrix4, Qt::SmoothTransformation)); +// pen.setBrush(myBrush4); +// path4.moveTo(iBordWidth/2,rect().bottom()-iBordWidth/2); +// path4.lineTo(iBordWidth/2,iBordWidth/2); +// painter->drawPath(path4); + + if(isSelected()) { + QPainterPath pRect; + pRect.addRect(rect()); + m_borderPen.setBrush(QBrush(QColor::fromRgb(0, 255, 0))); + painter->setPen(m_borderPen); + painter->drawPath(pRect); + QPainterPath pHandle; + pHandle.addRect(m_rLT); + pHandle.addRect(m_rT); + pHandle.addRect(m_rRT); + pHandle.addRect(m_rL); + pHandle.addRect(m_rR); + pHandle.addRect(m_rLB); + pHandle.addRect(m_rB); + pHandle.addRect(m_rRB); + painter->setPen(m_handlePen); + painter->drawPath(pHandle); + } + else { + + m_borderPen.setBrush(QBrush(QColor::fromRgb(0, 125, 0))); + + QPainterPath pRect; + pRect.addRect(rect()); + painter->setPen(m_borderPen); + painter->drawPath(pRect); + + } + + //磁条吸附时两化吸附的边 + QPen CitiePen=QPen(QColor::fromRgb(0, 255, 0),1,Qt::SolidLine); + painter->setPen(CitiePen); + //if(bMousePress) + { + if (bLeftCitie) { + painter->setPen(CitiePen); + //painter->drawLine(QPointF(rect().x(),rect().y()-100),QPointF(rect().x(),rect().bottom()+100)); + painter->drawLine(QPointF(rect().topLeft()),QPointF(rect().bottomLeft())); + } + if (bTopCitie) { + painter->setPen(CitiePen); + painter->drawLine(QPointF(rect().topLeft()),QPointF(rect().topRight())); + } + if (bRightCitie) { + painter->setPen(CitiePen); + painter->drawLine(QPointF(rect().topRight()),QPointF(rect().bottomRight())); + } + if (bBottomCitie) { + painter->setPen(CitiePen); + painter->drawLine(QPointF(rect().bottomLeft()),QPointF(rect().bottomRight())); + } + + } + +// QPen(const QBrush &brush, +// qreal width, +// Qt::PenStyle style = Qt::SolidLine, +// Qt::PenCapStyle cap = Qt::SquareCap, +// Qt::PenJoinStyle join = Qt::BevelJoin); +// QPen pen(Qt::green, 3, Qt::DashDotLine, Qt::RoundCap, Qt::RoundJoin); + + + //painter->drawLine(QPointF(rect().bottomLeft()),QPointF(rect().bottomRight())); + painter->restore(); +} +void LoQGraphicsObject::setBrightBianLeft(bool b) +{ + //if(bMousePress) +// { +// bLeftCitie=b; + +// } +// else { +// bLeftCitie=false; +// } + bLeftCitie=b; + updateGeometry(); + +} +void LoQGraphicsObject::setBrightBianRight(bool b) +{ +// if(bMousePress) +// { +// bRightCitie=b; + +// } +// else { +// bRightCitie=false; +// } + bRightCitie=b; + updateGeometry(); + +} +void LoQGraphicsObject::setBrightBianTop(bool b) +{ +// if(bMousePress) +// { +// bTopCitie=b; + +// } +// else { +// bTopCitie=false; +// } + bTopCitie=b; + updateGeometry(); + +} +void LoQGraphicsObject::setBrightBianbottom(bool b) +{ +// if(bMousePress) +// { +// bBottomCitie=b; + +// } +// else { +// bBottomCitie=false; +// } + bBottomCitie=b; + updateGeometry(); + +} +void LoQGraphicsObject::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + // return; + if(false == m_movable) return; + + qreal cx, cy, cw, ch; + qreal mx, my, mw, mh; + QPointF ePos = pointToParent(event->pos()); + QPointF absoluteOfs = ePos - m_pOrg; + + mx = m_rOrg.x(); + my = m_rOrg.y(); + mw = m_w; + mh = m_h; + + if(m_hDir != NONE) { + prepareGeometryChange(); + + switch(m_hDir) { + case LT: + cx = m_rOrg.x() + absoluteOfs.x(); + cy = m_rOrg.y() + absoluteOfs.y(); + if(m_rOrg.right() - cx < m_handleLen) cx = m_rOrg.right() - m_handleLen; + if(m_rOrg.bottom() - cy < m_handleLen) cy = m_rOrg.bottom() - m_handleLen; + mx = cx; + my = cy; + if(m_rLimit != INVALID_RECT) { + if(mx < 0) mx = 0; + if(my < 0) my = 0; + } + mw = m_rOrg.right() - mx; + mh = m_rOrg.bottom() - my; + break; + + case T: + cy = m_rOrg.y() + absoluteOfs.y(); + if(m_rOrg.bottom() - cy < m_handleLen) cy = m_rOrg.bottom() - m_handleLen; + my = cy; + if(m_rLimit != INVALID_RECT) { + if(my < 0) my = 0; + } + mh = m_rOrg.bottom() - my; + break; + + case RT: + cy = m_rOrg.y() + absoluteOfs.y(); + cw = m_rOrg.width() + absoluteOfs.x(); + if(m_rOrg.bottom() - cy < m_handleLen) cy = m_rOrg.bottom() - m_handleLen; + if(cw < m_handleLen) cw = m_handleLen; + my = cy; + mw = cw; + if(m_rLimit != INVALID_RECT) { + if(my < 0) my = 0; + if(mx + mw > m_rLimit.width()) mw = m_rLimit.width() - mx; + } + mh = m_rOrg.bottom() - my; + break; + + case L: + cx = m_rOrg.x() + absoluteOfs.x(); + if(m_rOrg.right() - cx < m_handleLen) cx = m_rOrg.right() - m_handleLen; + mx = cx; + if(m_rLimit != INVALID_RECT) { + if(mx < 0) mx = 0; + } + mw = m_rOrg.right() - mx; + break; + + case R: + cw = m_rOrg.width() + absoluteOfs.x(); + if(cw < m_handleLen) cw = m_handleLen; + mw = cw; + if(m_rLimit != INVALID_RECT) { + if(mx + mw > m_rLimit.width()) mw = m_rLimit.width() - mx; + } + break; + + case LB: + cx = m_rOrg.x() + absoluteOfs.x(); + ch = m_rOrg.height() + absoluteOfs.y(); + if(m_rOrg.right() - cx < m_handleLen) cx = m_rOrg.right() - m_handleLen; + if(ch < m_handleLen) ch = m_handleLen; + mx = cx; + if(m_rLimit != INVALID_RECT) { + if(mx < 0) mx = 0; + } + mw = m_rOrg.right() - mx; + mh = ch; + if(m_rLimit != INVALID_RECT) { + if(my + mh > m_rLimit.height()) mh = m_rLimit.height() - my; + } + break; + + case B: + ch = m_rOrg.height() + absoluteOfs.y(); + if(ch < m_handleLen) ch = m_handleLen; + mh = ch; + if(m_rLimit != INVALID_RECT) { + if(my + mh > m_rLimit.height()) mh = m_rLimit.height() - my; + } + break; + + case RB: + cw = m_rOrg.width() + absoluteOfs.x(); + ch = m_rOrg.height() + absoluteOfs.y(); + if(cw < m_handleLen) cw = m_handleLen; + if(ch < m_handleLen) ch = m_handleLen; + mw = cw; + mh = ch; + if(m_rLimit != INVALID_RECT) { + if(mx + mw > m_rLimit.width()) mw = m_rLimit.width() - mx; + if(my + mh > m_rLimit.height()) mh = m_rLimit.height() - my; + } + break; + + default: + break; + } + + setPos(mx, my); + m_w = mw; + m_h = mh; + adjustHandle(); + updateGeometry(m_rOrg); + rectChanged(rect()); + } else { + mx = m_rOrg.x() + absoluteOfs.x(); + my = m_rOrg.y() + absoluteOfs.y(); + if(m_rLimit != INVALID_RECT) { + if(mx < 0) mx = 0; + if(my < 0) my = 0; + if(mx + mw > m_rLimit.width()) mx = m_rLimit.width() - mw; + if(my + mh > m_rLimit.height()) my = m_rLimit.height() - mh; + } + setPos(mx, my); + } + + geometryChanged(geometry()); + if(bMousePress) + { + + emit sigCiTie(true,m_hDir); + + } +} + +void LoQGraphicsObject::setRLimit(const QRectF &r) +{ + if(m_rLimit != INVALID_RECT) { + qreal mx, my, mw, mh; + qreal scale_w = r.width() / m_rLimit.width(); + qreal scale_h = r.height() / m_rLimit.height(); + mx = std::round(x() * scale_w); + my = std::round(y() * scale_h); + mw = std::round(m_w * scale_w); + mh = std::round(m_h * scale_h); + setPos(mx, my); + m_w = mw; + m_h = mh; + adjustHandle(); + geometryChanged(geometry()); + } + m_rLimit = r; +} + +void LoQGraphicsObject::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if(Qt::LeftButton == event->button()) { + + m_hDir = handleDir(event->pos()); + m_pOrg = pointToParent(event->pos()); + m_rOrg = geometry(); + m_movable = true; + bMousePress=true; + + } + QGraphicsItem::mousePressEvent(event); +} + +void LoQGraphicsObject::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + bMousePress=false; + + if(Qt::LeftButton == event->button()) { + m_hDir = NONE; + m_movable = false; + bLeftCitie=false; + bRightCitie=false; + bTopCitie=false; + bBottomCitie=false; + m_keyPressId++; + emit sigCiTie(false,m_keyPressId); + + } + QGraphicsItem::mouseReleaseEvent(event); +} + +void LoQGraphicsObject::setGeometry(const QRectF &r) +{ + if(r != geometry()) { + prepareGeometryChange(); + setPos(r.x(), r.y()); + m_w = r.width(); + m_h = r.height(); + adjustHandle(); + emit rectChanged(rect()); + } +} + +void LoQGraphicsObject::updateGeometry() +{ + QRectF r = geometry(); + qreal x, y, w, h; + x = r.x() - m_handleLen; + y = r.y() - m_handleLen; + w = r.width() + m_handleLen * 2; + h = r.height() + m_handleLen * 2; + r = QRectF(x, y, w, h); + if(nullptr != scene()) { + scene()->update(r); + } + emit requestUpdate(r); +} + +void LoQGraphicsObject::updateGeometry(const QRectF &gC, const QRectF &gL) +{ + qreal x, y, w, h; + QRectF gCur, gLast; + x = gC.x() - m_handleLen; + y = gC.y() - m_handleLen; + w = gC.width() + m_handleLen * 2; + h = gC.height() + m_handleLen * 2; + gCur = QRectF(x, y, w, h); + x = gL.x() - m_handleLen; + y = gL.y() - m_handleLen; + w = gL.width() + m_handleLen * 2; + h = gL.height() + m_handleLen * 2; + gLast = QRectF(x, y, w, h); + qreal l = (gCur.left() < gLast.left()) ? gCur.left() : gLast.left(); + qreal t = (gCur.top() < gLast.top()) ? gCur.top() : gLast.top(); + qreal r = (gCur.right() > gLast.right()) ? gCur.right() : gLast.right(); + qreal b = (gCur.bottom() > gLast.bottom()) ? gCur.bottom() : gLast.bottom(); + QRectF gFlash = QRectF(QPointF(l, t), QPointF(r, b)); + if(nullptr != scene()) { + scene()->update(gFlash); + } + emit requestUpdate(gFlash); +} + +QPointF LoQGraphicsObject::pointToParent(const QPointF &p) +{ + qreal px, py; + px = p.x() + x(); + py = p.y() + y(); + return QPointF(px, py); +} + +LoQGraphicsObject::HANDLE_DIR LoQGraphicsObject::handleDir(const QPointF &p) +{ + HANDLE_DIR hDir = NONE; + if(isSelected()) { + if(m_rLT.contains(p)) hDir = LT; + else if(m_rT.contains(p)) hDir = T; + else if(m_rRT.contains(p)) hDir = RT; + else if(m_rL.contains(p)) hDir = L; + else if(m_rR.contains(p)) hDir = R; + else if(m_rLB.contains(p)) hDir = LB; + else if(m_rB.contains(p)) hDir = B; + else if(m_rRB.contains(p)) hDir = RB; + } + return hDir; +} +//拖拽的虚线矩形 +void LoQGraphicsObject::adjustHandle() +{ + const QRectF &r = rect(); + //左上角 + m_rLT = QRectF(r.left() - m_handleLen/2, + r.top() - m_handleLen/2, + m_handleLen, m_handleLen); + //上中 + m_rT = QRectF(r.center().x() - m_handleLen / 2, + r.top() - m_handleLen/2, + m_handleLen, m_handleLen); + //右上角 + m_rRT = QRectF(r.right()-m_handleLen/2, + r.top() - m_handleLen/2, + m_handleLen, m_handleLen); + //左中 + m_rL = QRectF(r.left() - m_handleLen/2, + r.center().y() - m_handleLen / 2, + m_handleLen, m_handleLen); + //右中 + m_rR = QRectF(r.right()-m_handleLen/2, + r.center().y() - m_handleLen / 2, + m_handleLen, m_handleLen); + //左下角 + m_rLB = QRectF(r.left() - m_handleLen/2, + r.bottom()-m_handleLen / 2, + m_handleLen, m_handleLen); + //中下 + m_rB = QRectF(r.center().x() - m_handleLen / 2, + r.bottom()-m_handleLen / 2, + m_handleLen, m_handleLen); + //右下角 + m_rRB = QRectF(r.right()-m_handleLen / 2, + r.bottom()-m_handleLen / 2, + m_handleLen, m_handleLen); +} diff --git a/LedOK/LoQClass/loqgraphicsobject.h b/LedOK/LoQClass/loqgraphicsobject.h new file mode 100644 index 0000000..b78431a --- /dev/null +++ b/LedOK/LoQClass/loqgraphicsobject.h @@ -0,0 +1,117 @@ +#ifndef LOQGRAPHICSOBJECT_H +#define LOQGRAPHICSOBJECT_H + +#include +#include +#include +#include +#include +#include +#include + +#define INVALID_RECT QRect(-1, -5, -6, -8) + +class LoQGraphicsObject : public QGraphicsObject +{ + Q_OBJECT + + typedef enum { + NONE = 0, + LT, + T, + RT, + L, + R, + LB, + B, + RB + } HANDLE_DIR; + +public: + enum InteractiveType { + Dynamic = 0, + Static, + Custom + }; + +public: + explicit LoQGraphicsObject(InteractiveType type = Dynamic, QGraphicsItem *parent = nullptr); + LoQGraphicsObject(QRectF rect, InteractiveType type = Dynamic, QGraphicsItem *parent = nullptr); + LoQGraphicsObject(qreal x, qreal y, qreal w, qreal h, InteractiveType type = Dynamic, QGraphicsItem *parent = nullptr); + +private: + void init(); + +public: + virtual QRectF boundingRect() const override; + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override; + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + virtual void setInteractiveType(InteractiveType type = Dynamic); + +public: + InteractiveType interactiveType() const { return m_interactiveType; } + QRectF rect() const { return QRectF(0, 0, m_w, m_h); } + QRectF geometry() const { return QRectF(x(), y(), m_w, m_h); } + +public: + void setRLimit(const QRectF &r); + QRectF rLimit() const { return m_rLimit; } + +signals: + void requestUpdate(const QRectF &); + void geometryChanged(const QRectF &); + void rectChanged(const QRectF &); + + void sigCiTie(bool,int); +public slots: + void setGeometry (qreal x, qreal y, qreal w, qreal h) { setGeometry(QRectF(x, y, w, h)); } + void setGeometry (const QRectF &r); + void updateGeometry(); + void updateGeometry(const QRectF &gLast) { updateGeometry(geometry(), gLast); } + void updateGeometry(const QRectF &gCur, const QRectF &gLast); + void setBrightBianLeft(bool); + void setBrightBianTop(bool); + void setBrightBianRight(bool); + void setBrightBianbottom(bool); + +protected: + int handleLen() const { return m_handleLen; } + QPointF pointToParent(const QPointF &p); + HANDLE_DIR handleDir(const QPointF &p); + void adjustHandle(); + +private: + InteractiveType m_interactiveType; + bool m_movable; + int m_handleLen; + QPen m_handlePen; + QPen m_borderPen; + +private: + qreal m_w; + qreal m_h; + QRectF m_rLT; + QRectF m_rT; + + QRectF m_rRT; + QRectF m_rL; + QRectF m_rR; + QRectF m_rLB; + QRectF m_rB; + QRectF m_rRB; + QRectF m_rOrg; + QPointF m_pOrg; + HANDLE_DIR m_hDir; + QRectF m_rLimit; + bool bMousePress=false; + bool bLeftCitie=false; + bool bRightCitie=false; + bool bTopCitie=false; + bool bBottomCitie=false; + int m_keyPressId=0; + +}; + +#endif // LOQGRAPHICSOBJECT_H diff --git a/LedOK/LoQClass/loqgraphicsvideoitem.cpp b/LedOK/LoQClass/loqgraphicsvideoitem.cpp new file mode 100644 index 0000000..286b170 --- /dev/null +++ b/LedOK/LoQClass/loqgraphicsvideoitem.cpp @@ -0,0 +1,24 @@ +#include "loqgraphicsvideoitem.h" +#include "loappconfig.h" + +LoQGraphicsVideoItem::LoQGraphicsVideoItem(QGraphicsItem *parent) : + QGraphicsVideoItem(parent), + m_painterCompositionMode(QPainter::CompositionMode_SourceOver) +{ + QString glVendor = LoAppConfig::getInstance()->OpenGLVendor(); + if(glVendor.contains("NVIDIA Corporation")) { // QPainter::RasterOp_SourceAndNotDestination + m_painterCompositionMode = QPainter::RasterOp_SourceAndNotDestination; + } +} + +void LoQGraphicsVideoItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + if(m_painterCompositionMode != QPainter::CompositionMode_SourceOver) { + painter->save(); + painter->setCompositionMode(static_cast(m_painterCompositionMode)); + QGraphicsVideoItem::paint(painter, option, widget); + painter->restore(); + } else { + QGraphicsVideoItem::paint(painter, option, widget); + } +} diff --git a/LedOK/LoQClass/loqgraphicsvideoitem.h b/LedOK/LoQClass/loqgraphicsvideoitem.h new file mode 100644 index 0000000..23da86a --- /dev/null +++ b/LedOK/LoQClass/loqgraphicsvideoitem.h @@ -0,0 +1,23 @@ +#ifndef LOQGRAPHICSVIDEOITEM_H +#define LOQGRAPHICSVIDEOITEM_H + +#include +#include +#include + +class LoQGraphicsVideoItem : public QGraphicsVideoItem +{ + Q_OBJECT +public: + explicit LoQGraphicsVideoItem(QGraphicsItem *parent = nullptr); + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + +signals: + +public slots: + +private: + int m_painterCompositionMode; +}; + +#endif // LOQGRAPHICSVIDEOITEM_H diff --git a/LedOK/LoQClass/loqgraphicsview.cpp b/LedOK/LoQClass/loqgraphicsview.cpp new file mode 100644 index 0000000..305526d --- /dev/null +++ b/LedOK/LoQClass/loqgraphicsview.cpp @@ -0,0 +1,38 @@ +#include "loqgraphicsview.h" + +LoQGraphicsview::LoQGraphicsview() +{ + +} +void LoQGraphicsview::paintEvent(QPaintEvent * event) +{ + QGraphicsView::paintEvent(event); + QPainter painter(this); + QPen CitiePen=QPen(QColor::fromRgb(255, 0, 0),2,Qt::SolidLine); + painter.setPen(CitiePen); + painter.drawLine(QPointF(0,0),QPointF(400,400)); + if(true) + { + switch (0) { + case 0: + painter.setPen(CitiePen); + painter.drawLine(QPointF(0,0),QPointF(400,400)); + break; + case 1: + painter.setPen(CitiePen); + painter.drawLine(QPointF(rect().topLeft()),QPointF(rect().topRight())); + break; + case 2: + painter.setPen(CitiePen); + painter.drawLine(QPointF(rect().topRight()),QPointF(rect().bottomRight())); + break; + case 3: + painter.setPen(CitiePen); + painter.drawLine(QPointF(rect().bottomLeft()),QPointF(rect().bottomRight())); + break; + default: + break; + + } + } +} diff --git a/LedOK/LoQClass/loqgraphicsview.h b/LedOK/LoQClass/loqgraphicsview.h new file mode 100644 index 0000000..e224b51 --- /dev/null +++ b/LedOK/LoQClass/loqgraphicsview.h @@ -0,0 +1,12 @@ +#ifndef LOQGRAPHICSVIEW_H +#define LOQGRAPHICSVIEW_H + +#include +class LoQGraphicsview : public QGraphicsView +{ +public: + LoQGraphicsview(); + virtual void paintEvent(QPaintEvent * event) ; +}; + +#endif // LOQGRAPHICSVIEW_H diff --git a/LedOK/LoQClass/loqheaderviewcheckbox.cpp b/LedOK/LoQClass/loqheaderviewcheckbox.cpp new file mode 100644 index 0000000..0a2ff5b --- /dev/null +++ b/LedOK/LoQClass/loqheaderviewcheckbox.cpp @@ -0,0 +1,41 @@ +#include "loqheaderviewcheckbox.h" + +LoQHeaderViewCheckBox::LoQHeaderViewCheckBox(Qt::Orientation orientation, QWidget *parent, const QString &id) : QHeaderView(orientation, parent) +{ + qDebug() <<"LoQHeaderViewCheckBox -s"; + m_checkBox = new QCheckBox(this); + m_checkBox->setProperty("ssType", "header"); + m_checkBox->setProperty("ssName", "selectAll"); + m_checkBox->setProperty("ssId" , id); + m_checkBox->setChecked(false); + connect(m_checkBox, SIGNAL(toggled(bool)), this, SIGNAL(sigCheckAll(bool))); + qDebug() <<"LoQHeaderViewCheckBox -o"; +} +void LoQHeaderViewCheckBox::HideHeaderCheckBox(bool b) +{ + qDebug() <<"HideHeaderCheckBox -s"; + if(b) + m_checkBox->hide(); + else { + m_checkBox->show(); + } + qDebug() <<"HideHeaderCheckBox -o"; +} +void LoQHeaderViewCheckBox::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const +{ + qDebug() <<"paintSection -s"; + QHeaderView::paintSection(painter, rect, logicalIndex); + if (logicalIndex == 0) { + m_checkBox->setGeometry(rect); + } + qDebug() <<"paintSection -o"; +} + +void LoQHeaderViewCheckBox::onAllChecked(bool f) +{ + qDebug() <<"onAllChecked -s"; + m_checkBox->blockSignals(true); + m_checkBox->setChecked(f); + m_checkBox->blockSignals(false); + qDebug() <<"onAllChecked -o"; +} diff --git a/LedOK/LoQClass/loqheaderviewcheckbox.h b/LedOK/LoQClass/loqheaderviewcheckbox.h new file mode 100644 index 0000000..bc49b6e --- /dev/null +++ b/LedOK/LoQClass/loqheaderviewcheckbox.h @@ -0,0 +1,27 @@ +#ifndef LOQHEADERVIEWCHECKBOX_H +#define LOQHEADERVIEWCHECKBOX_H + +#include +#include +#include + +class LoQHeaderViewCheckBox : public QHeaderView +{ + Q_OBJECT +public: + explicit LoQHeaderViewCheckBox(Qt::Orientation orientation, QWidget *parent = nullptr, const QString &id = "none"); + void HideHeaderCheckBox(bool b); +protected: + void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const override; + +signals: + void sigCheckAll(bool); + +public slots: + void onAllChecked(bool f); + +private: + QCheckBox *m_checkBox; +}; + +#endif // LOQHEADERVIEWCHECKBOX_H diff --git a/LedOK/LoQClass/loqlineedit.cpp b/LedOK/LoQClass/loqlineedit.cpp new file mode 100644 index 0000000..624f2da --- /dev/null +++ b/LedOK/LoQClass/loqlineedit.cpp @@ -0,0 +1,11 @@ +#include "loqlineedit.h" + +LoQLineEdit::LoQLineEdit(QWidget *parent) : QLineEdit(parent) +{ + connect(this, SIGNAL(textChanged(const QString &)), this, SLOT(onTextChanged(const QString &))); +} + +void LoQLineEdit::onTextChanged(const QString &text) +{ + emit sigTextChanged(this, text); +} diff --git a/LedOK/LoQClass/loqlineedit.h b/LedOK/LoQClass/loqlineedit.h new file mode 100644 index 0000000..d63f40e --- /dev/null +++ b/LedOK/LoQClass/loqlineedit.h @@ -0,0 +1,19 @@ +#ifndef LOQLINEEDIT_H +#define LOQLINEEDIT_H + +#include + +class LoQLineEdit : public QLineEdit +{ + Q_OBJECT +public: + explicit LoQLineEdit(QWidget *parent = nullptr); + +signals: + void sigTextChanged(LoQLineEdit *obj, const QString &text); + +public slots: + void onTextChanged(const QString &text); +}; + +#endif // LOQLINEEDIT_H diff --git a/LedOK/LoQClass/loqmacro.h b/LedOK/LoQClass/loqmacro.h new file mode 100644 index 0000000..0fe5c49 --- /dev/null +++ b/LedOK/LoQClass/loqmacro.h @@ -0,0 +1,14 @@ +#ifndef LOQMACRO_H +#define LOQMACRO_H + +/* +#define LoQ_PROPERTY(type, name) \ +public slots: type get##name() const { return m_##name; } \ +public slots: void set##name(const type &a) { m_##name = a; } \ +signals: void name##Changed(const type &); \ +private: \ + Q_PROPERTY(type name MEMBER m_##name READ get##name WRITE set##name NOTIFY name##Changed) \ + type m_##name; +*/ + +#endif // LOQMACRO_H diff --git a/LedOK/LoQClass/loqmainwindow.cpp b/LedOK/LoQClass/loqmainwindow.cpp new file mode 100644 index 0000000..52fb518 --- /dev/null +++ b/LedOK/LoQClass/loqmainwindow.cpp @@ -0,0 +1,172 @@ +#include "loqmainwindow.h" +#include "QtMath" +LoQMainWindow::LoQMainWindow(QWidget *parent) : + QMainWindow(parent), + m_winMove(false) +{ + setAttribute(Qt::WA_TranslucentBackground,true); + setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + setMouseTracking(true); + + // ui->centralWidget->setMouseTracking(true); +} + +void LoQMainWindow::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + QRect gRect = this->geometry(); + gRect.setWidth(gRect.width() - 10); + gRect.setHeight(gRect.height() - 10); + gRect.setX(gRect.x() + 5); + gRect.setY(gRect.y() + 5); + QPoint pointXiangDui = event->pos(); + if((pointXiangDui.y()<100&&pointXiangDui.x()>5)&&(pointXiangDui.y()<100&&pointXiangDui.x()globalPos())) { + m_winMove = true; + m_winOrgPoint = event->globalPos(); + m_winWorldPoint = this->frameGeometry().topLeft(); + } + else + { + // Resize the window + + } + } + else { + m_winMove = false; + m_iCalCursorPos = CalCursorPos(event->pos(),CalCursorCol(event->pos())); + if (event->button() == Qt::LeftButton /*&& Qt::WindowMaximized != windowState()*/) + { + if(m_iCalCursorPos != CENTER) + { + m_bLeftPress = true; + } + } + m_rtPreGeometry = geometry(); + m_ptViewMousePos = event->globalPos(); + } + + + } +} + +void LoQMainWindow::mouseMoveEvent(QMouseEvent *event) +{ + if(m_winMove) { + if (event->buttons() & Qt::LeftButton) { + QPoint relativePos = event->globalPos() - m_winOrgPoint; + this->move(m_winWorldPoint + relativePos ); + } + } + else { + //窗体不是最大的话就改变鼠标的形状 + if(Qt::WindowMaximized != windowState()) + { + setCursorShape(CalCursorPos(event->pos(),CalCursorCol(event->pos()))); + } + else { + return; + } + //获取当前的点,这个点是全局的 + QPoint ptCurrentPos = QCursor::pos(); + //计算出移动的位置,当前点 - 鼠标左键按下的点 + QPoint ptMoveSize = ptCurrentPos - m_ptViewMousePos; + QRect rtTempGeometry = m_rtPreGeometry; + if(m_bLeftPress) + { + switch(m_iCalCursorPos) + { + case TOPLEFT: + rtTempGeometry.setTopLeft(m_rtPreGeometry.topLeft()+ptMoveSize); + break; + case TOP: + rtTempGeometry.setTop(m_rtPreGeometry.top()+ptMoveSize.y()); + break; + case TOPRIGHT: + rtTempGeometry.setTopRight(m_rtPreGeometry.topRight()+ptMoveSize); + break; + case LEFT: + rtTempGeometry.setLeft(m_rtPreGeometry.left()+ptMoveSize.x()); + break; + case RIGHT: + rtTempGeometry.setRight(m_rtPreGeometry.right()+ptMoveSize.x()); + break; + case BUTTOMLEFT: + rtTempGeometry.setBottomLeft(m_rtPreGeometry.bottomLeft()+ptMoveSize); + break; + case BUTTOM: + rtTempGeometry.setBottom(m_rtPreGeometry.bottom()+ptMoveSize.y()); + break; + case BUTTOMRIGHT: + rtTempGeometry.setBottomRight(m_rtPreGeometry.bottomRight()+ptMoveSize); + break; + default: + break; + } + //移动窗体,如果比最小窗体大,就移动 + if(rtTempGeometry.width() >= 200 && rtTempGeometry.height() >= 300) + setGeometry(rtTempGeometry); + + } + } +} + +void LoQMainWindow::mouseReleaseEvent(QMouseEvent *event) +{ + + if (event->button() == Qt::LeftButton) { + + m_winMove = false; + } + m_bLeftPress = false; + setCursor(Qt::ArrowCursor); + +} + +void LoQMainWindow::paintEvent(QPaintEvent *) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); +} + + +int LoQMainWindow::CalCursorCol(QPoint pt) +{ + return (pt.x() < FRAMESHAPE ? 1 : ((pt.x() > this->width() - FRAMESHAPE) ? 3 : 2)); +} + +int LoQMainWindow::CalCursorPos(QPoint pt, int colPos) +{ + return ((pt.y() < FRAMESHAPE ? 10 : ((pt.y() > this->height() - FRAMESHAPE) ? 30 : 20)) + colPos); +} + +void LoQMainWindow::setCursorShape(int CalPos) +{ + Qt::CursorShape cursor; + switch(CalPos) + { + case TOPLEFT: + case BUTTOMRIGHT: + cursor = Qt::SizeFDiagCursor; + break; + case TOPRIGHT: + case BUTTOMLEFT: + cursor = Qt::SizeBDiagCursor; + break; + case TOP: + case BUTTOM: + cursor = Qt::SizeVerCursor; + break; + case LEFT: + case RIGHT: + cursor = Qt::SizeHorCursor; + break; + default: + cursor = Qt::ArrowCursor; + break; + } + setCursor(cursor); +} diff --git a/LedOK/LoQClass/loqmainwindow.h b/LedOK/LoQClass/loqmainwindow.h new file mode 100644 index 0000000..6ef56ed --- /dev/null +++ b/LedOK/LoQClass/loqmainwindow.h @@ -0,0 +1,53 @@ +#ifndef LOQMAINWINDOW_H +#define LOQMAINWINDOW_H + +#include +#include +#include +#include +#include + +class LoQMainWindow : public QMainWindow +{ + Q_OBJECT +public: + explicit LoQMainWindow(QWidget *parent = nullptr); + +public: + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void paintEvent(QPaintEvent *); + +private: + bool m_winMove=false; + QPoint m_winOrgPoint; + QPoint m_winWorldPoint; + + + enum { + TOPLEFT = 11, + TOP = 12, + TOPRIGHT = 13, + LEFT = 21, + CENTER = 22, + RIGHT = 23, + BUTTOMLEFT = 31, + BUTTOM = 32, + BUTTOMRIGHT = 33 + }; + + #define FRAMESHAPE 10 + + int CalCursorCol(QPoint pt); //计算鼠标X的位置 + int CalCursorPos(QPoint pt, int colPos); //计算鼠标的位置 + void setCursorShape(int CalPos); //设置鼠标对应位置的形状 + + private: + int m_iCalCursorPos; + bool m_bLeftPress; + QRect m_rtPreGeometry; + QPoint m_ptViewMousePos; +}; + +#endif // LOQMAINWINDOW_H diff --git a/LedOK/LoQClass/loqpushbutton.cpp b/LedOK/LoQClass/loqpushbutton.cpp new file mode 100644 index 0000000..b54613d --- /dev/null +++ b/LedOK/LoQClass/loqpushbutton.cpp @@ -0,0 +1,27 @@ +#include "loqpushbutton.h" + +LoQPushButton::LoQPushButton(QWidget *parent) : + QPushButton(parent), + m_customData(nullptr) +{ + connect(this, SIGNAL(clicked(bool)), this, SLOT(onClicked(bool))); +} + +LoQPushButton::LoQPushButton(const QString &text, QWidget *parent) : + QPushButton(text, parent), + m_customData(nullptr) +{ + connect(this, SIGNAL(clicked(bool)), this, SLOT(onClicked(bool))); +} + +LoQPushButton::LoQPushButton(const QIcon& icon, const QString &text, QWidget *parent) : + QPushButton(icon, text, parent), + m_customData(nullptr) +{ + connect(this, SIGNAL(clicked(bool)), this, SLOT(onClicked(bool))); +} + +void LoQPushButton::onClicked(bool f) +{ + emit sigClicked(this, f); +} diff --git a/LedOK/LoQClass/loqpushbutton.h b/LedOK/LoQClass/loqpushbutton.h new file mode 100644 index 0000000..f863bf0 --- /dev/null +++ b/LedOK/LoQClass/loqpushbutton.h @@ -0,0 +1,28 @@ +#ifndef LOQPUSHBUTTON_H +#define LOQPUSHBUTTON_H + +#include + +class LoQPushButton : public QPushButton +{ + Q_OBJECT +public: + explicit LoQPushButton(QWidget *parent = nullptr); + explicit LoQPushButton(const QString &text, QWidget *parent = nullptr); + LoQPushButton(const QIcon& icon, const QString &text, QWidget *parent = nullptr); + +public: + void setCustomData(void *data) { m_customData = data; } + void* customData() { return m_customData; } + +signals: + void sigClicked(LoQPushButton* obj, bool f); + +public slots: + void onClicked(bool f); + +private: + void *m_customData; +}; + +#endif // LOQPUSHBUTTON_H diff --git a/LedOK/LoQClass/loqtitlebar.cpp b/LedOK/LoQClass/loqtitlebar.cpp new file mode 100644 index 0000000..4b6d307 --- /dev/null +++ b/LedOK/LoQClass/loqtitlebar.cpp @@ -0,0 +1,80 @@ +#include "loqtitlebar.h" +#include "QDebug" +LoQTitleBar::LoQTitleBar(QWidget *parent) : QWidget(parent) +{ + setAttribute(Qt::WA_DeleteOnClose); + + bn_Minimize = new QPushButton(this); + bn_Maximize = new QPushButton(this); + bn_Close = new QPushButton(this); + + bn_Minimize->setObjectName("bnMinimize"); + bn_Maximize->setObjectName("bnMaximize"); + bn_Close->setObjectName("bnClose"); + + bn_Minimize->setToolTip(tr("Minimize")); + bn_Maximize->setToolTip(tr("Maximize")); + bn_Close->setToolTip(tr("Close")); + + connect(bn_Minimize, SIGNAL(clicked(bool)), window(), SLOT(showMinimized())); + connect(bn_Maximize, SIGNAL(clicked(bool)), this, SLOT(onBnMaximizeClicked())); + connect(bn_Close, SIGNAL(clicked(bool)), window(), SLOT(close())); +} +void LoQTitleBar::hideMixmumButton() +{ + bn_Minimize->hide(); + +} +void LoQTitleBar::refreshLable() +{ + bn_Minimize->setToolTip(tr("Minimize")); + bn_Maximize->setToolTip(tr("Maximize")); + bn_Close->setToolTip(tr("Close")); + +} +bool LoQTitleBar::eventFilter(QObject *obj, QEvent *event) +{ + switch (event->type()) { + case QEvent::WindowStateChange: + case QEvent::Resize: + updateMaximize(); + return true; +// case QEvent::MouseButtonPress: { +// QMouseEvent *e = static_cast(event); +// if(this->geometry().contains(e->pos())){ +// return true; +// } +// break; +// } + default: break; + } + return QWidget::eventFilter(obj, event); +} + +void LoQTitleBar::updateMaximize() +{ + QWidget *pWindow = window(); + if (pWindow->isTopLevel()) { + bool bMaximize = pWindow->isMaximized(); + if (bMaximize) { + bn_Maximize->setToolTip(tr("Restore")); + } else { + bn_Maximize->setToolTip(tr("Maximize")); + } + bn_Maximize->setStyle(QApplication::style()); + } + bn_Minimize->setToolTip(tr("Minimize")); + bn_Close->setToolTip(tr("Close")); +} + +void LoQTitleBar::onBnMaximizeClicked() +{ + QWidget *pWindow = window(); + if(pWindow->isMaximized()) { + pWindow->showNormal(); + qDebug()<<"showNormal"; + } else { + pWindow->showMaximized(); + qDebug()<<"showMaximized"; + } +} diff --git a/LedOK/LoQClass/loqtitlebar.h b/LedOK/LoQClass/loqtitlebar.h new file mode 100644 index 0000000..bcefeb8 --- /dev/null +++ b/LedOK/LoQClass/loqtitlebar.h @@ -0,0 +1,34 @@ +#ifndef LOQTITLEBAR_H +#define LOQTITLEBAR_H + +#include +#include +#include +#include +#include + +class LoQTitleBar : public QWidget +{ + Q_OBJECT +public: + explicit LoQTitleBar(QWidget *parent = nullptr); + void hideMixmumButton(); + void refreshLable(); +protected: + virtual bool eventFilter(QObject *obj, QEvent *event); + +protected: + void updateMaximize(); + +signals: + +public slots: + void onBnMaximizeClicked(); + +protected: + QPushButton *bn_Minimize; + QPushButton *bn_Maximize; + QPushButton *bn_Close; +}; + +#endif // LOQTITLEBAR_H diff --git a/LedOK/LoQClass/loqtreewidget.cpp b/LedOK/LoQClass/loqtreewidget.cpp new file mode 100644 index 0000000..52ec727 --- /dev/null +++ b/LedOK/LoQClass/loqtreewidget.cpp @@ -0,0 +1,119 @@ +#include "loqtreewidget.h" + +LoQTreeWidget::LoQTreeWidget(QWidget *parent) : + QTreeWidget(parent), + m_checkState(CheckNone) +{ + qDebug() <<"LoQTreeWidget::LoQTreeWidget -s"; + m_header = new LoQHeaderViewCheckBox(Qt::Horizontal, this); + setHeader(m_header); + setProperty("ssType", "topList"); + connect(m_header, SIGNAL(sigCheckAll(bool)), this, SLOT(onCheckAll(bool))); + connect(this, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(onItemClicked(QTreeWidgetItem*,int))); + setFocusPolicy(Qt::NoFocus); + qDebug() <<"LoQTreeWidget::LoQTreeWidget -o"; + +} +void LoQTreeWidget::HideHeaderCheckBox(bool b) +{ + qDebug() <<"HideHeaderCheckBox -s"; + m_header->HideHeaderCheckBox(b); + qDebug() <<"HideHeaderCheckBox -o"; +} +void LoQTreeWidget::adjustCheckState() +{ + qDebug() <<"adjustCheckState -s"; + bool isAllChecked = true; + int cnt = topLevelItemCount(); + if(cnt == 0) { + isAllChecked = false; + m_checkState = CheckNone; + } else { + int k = 0; + for(int i=0; iisRowHidden(i,indexFromItem(topLevelItem(i)->parent()))) + { + if(topLevelItem(i)->checkState(0) == Qt::Unchecked) { + isAllChecked = false; + } else { + k++; + } + } + + } + if(k > 1) { + m_checkState = CheckMulti; + } else if(k > 0) { + m_checkState = CheckOne; + } else { + m_checkState = CheckNone; + } + } + m_header->onAllChecked(isAllChecked); + sigCheckStateChanged(m_checkState); + qDebug() <<"adjustCheckState -o"; +} + +QTreeWidgetItem* LoQTreeWidget::itemChecked() +{ + qDebug() <<"itemChecked -s"; + QTreeWidgetItem *res = nullptr; + int cnt = topLevelItemCount(); + for(int i=0; icheckState(0)) { + res = item; + break; + } + } + qDebug() <<"itemChecked -o"; + return res; +} + +void LoQTreeWidget::onCheckAll(bool checked) +{ + qDebug() <<"onCheckAll -s"; + int cnt = topLevelItemCount(); + for(int i=0; iisRowHidden(i,indexFromItem(topLevelItem(i)->parent()))) + { + topLevelItem(i)->setCheckState(0, Qt::Unchecked); + } + else { + topLevelItem(i)->setCheckState(0, Qt::Checked); + + } + } + else { + + topLevelItem(i)->setCheckState(0, Qt::Unchecked); + + } + + } + // topLevelItem(i)->setCheckState(0, checked ? Qt::Checked : Qt::Unchecked); + adjustCheckState(); + qDebug() <<"onCheckAll -o"; +} + +void LoQTreeWidget::onItemClicked(QTreeWidgetItem *item, int column) +{ + qDebug() <<"onItemClicked -s"; + if(column > 0) { + item->setCheckState(0, item->checkState(0) == Qt::Unchecked ? Qt::Checked : Qt::Unchecked); + } + adjustCheckState(); + qDebug() <<"onItemClicked -o"; +} +QModelIndex LoQTreeWidget::indexFromItem(QTreeWidgetItem *item, int column) const +{ + qDebug() <<"onItemClicked -s"; + return QTreeWidget::indexFromItem(item, column); + qDebug() <<"onItemClicked -o"; +} + + diff --git a/LedOK/LoQClass/loqtreewidget.h b/LedOK/LoQClass/loqtreewidget.h new file mode 100644 index 0000000..012f501 --- /dev/null +++ b/LedOK/LoQClass/loqtreewidget.h @@ -0,0 +1,39 @@ +#ifndef LOQTREEWIDGET_H +#define LOQTREEWIDGET_H + +#include +#include +#include + +class LoQTreeWidget : public QTreeWidget +{ + Q_OBJECT +public: + enum CheckState { + CheckNone, + CheckOne, + CheckMulti + }; + +public: + explicit LoQTreeWidget(QWidget *parent = nullptr); + +public: + void adjustCheckState(); + QTreeWidgetItem* itemChecked(); + QModelIndex indexFromItem(QTreeWidgetItem *item, int column = 0) const;//add by alahover 20200306 + void HideHeaderCheckBox(bool b); + +signals: + void sigCheckStateChanged(int); + +public slots: + void onCheckAll(bool checked); + void onItemClicked(QTreeWidgetItem *item, int column); + +private: + LoQHeaderViewCheckBox *m_header; + int m_checkState; +}; + +#endif // LOQTREEWIDGET_H diff --git a/LedOK/LoQClass/loqvideosurface.cpp b/LedOK/LoQClass/loqvideosurface.cpp new file mode 100644 index 0000000..1ad6de3 --- /dev/null +++ b/LedOK/LoQClass/loqvideosurface.cpp @@ -0,0 +1,57 @@ +#include "loqvideosurface.h" + +LoQVideoSurface::LoQVideoSurface(QObject *parent) : + QAbstractVideoSurface(parent) +{} + +QList LoQVideoSurface::supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const +{ + Q_UNUSED(handleType); + QList listPixelFormats; + listPixelFormats << QVideoFrame::Format_ARGB32 + << QVideoFrame::Format_ARGB32_Premultiplied + << QVideoFrame::Format_RGB32 + << QVideoFrame::Format_RGB24 + << QVideoFrame::Format_RGB565 + << QVideoFrame::Format_RGB555 + << QVideoFrame::Format_ARGB8565_Premultiplied + << QVideoFrame::Format_BGRA32 + << QVideoFrame::Format_BGRA32_Premultiplied + << QVideoFrame::Format_BGR32 + << QVideoFrame::Format_BGR24 + << QVideoFrame::Format_BGR565 + << QVideoFrame::Format_BGR555 + << QVideoFrame::Format_BGRA5658_Premultiplied + << QVideoFrame::Format_AYUV444 + << QVideoFrame::Format_AYUV444_Premultiplied + << QVideoFrame::Format_YUV444 + << QVideoFrame::Format_YUV420P + << QVideoFrame::Format_YV12 + << QVideoFrame::Format_UYVY + << QVideoFrame::Format_YUYV + << QVideoFrame::Format_NV12 + << QVideoFrame::Format_NV21 + << QVideoFrame::Format_IMC1 + << QVideoFrame::Format_IMC2 + << QVideoFrame::Format_IMC3 + << QVideoFrame::Format_IMC4 + << QVideoFrame::Format_Y8 + << QVideoFrame::Format_Y16 + << QVideoFrame::Format_Jpeg + << QVideoFrame::Format_CameraRaw + << QVideoFrame::Format_AdobeDng; + // Return the formats you will support + return listPixelFormats; +} + +bool LoQVideoSurface::present(const QVideoFrame &frame) +{ + // Handle the frame and do your processing + if (frame.isValid()) + { + QVideoFrame cloneFrame(frame); + emit frameAvailable(cloneFrame); + return true; + } + return false; +} diff --git a/LedOK/LoQClass/loqvideosurface.h b/LedOK/LoQClass/loqvideosurface.h new file mode 100644 index 0000000..6d02d8b --- /dev/null +++ b/LedOK/LoQClass/loqvideosurface.h @@ -0,0 +1,21 @@ +#ifndef LOQVIDEOSURFACE_H +#define LOQVIDEOSURFACE_H + +#include + +class LoQVideoSurface : public QAbstractVideoSurface +{ + Q_OBJECT +public: + explicit LoQVideoSurface(QObject *parent = nullptr); + + +public: + virtual QListsupportedPixelFormats(QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const override; + virtual bool present(const QVideoFrame &frame) override; + +signals: + void frameAvailable(QVideoFrame &frame); +}; + +#endif // LOQVIDEOSURFACE_H diff --git a/LedOK/LoQClass/loqwindowtitlebar.cpp b/LedOK/LoQClass/loqwindowtitlebar.cpp new file mode 100644 index 0000000..01d9102 --- /dev/null +++ b/LedOK/LoQClass/loqwindowtitlebar.cpp @@ -0,0 +1,56 @@ +#include "loqwindowtitlebar.h" + +LoQWindowTitleBar::LoQWindowTitleBar(QWidget *parent) : + LoQTitleBar(parent) +{ + QHBoxLayout *pLayout = new QHBoxLayout(this); + pLayout->addStretch(); + pLayout->addWidget(bn_Minimize); + pLayout->addWidget(bn_Maximize); + pLayout->addWidget(bn_Close); + pLayout->setContentsMargins(3, 3, 3, 0); + setLayout(pLayout); +} + +LoQWindowTitleBar::LoQWindowTitleBar(const QString &text, QWidget *parent) : + LoQTitleBar(parent) +{ + m_wText = new QLabel(text, this); + m_wText->adjustSize(); + + QHBoxLayout *pLayout = new QHBoxLayout(this); + pLayout->addStretch(); + pLayout->addWidget(m_wText); + pLayout->addStretch(); + pLayout->addWidget(bn_Minimize); + pLayout->addWidget(bn_Maximize); + pLayout->addWidget(bn_Close); + pLayout->setContentsMargins(3, 3, 3, 0); + setLayout(pLayout); +} + +LoQWindowTitleBar::LoQWindowTitleBar(const QPixmap &icon, const QString &text, QWidget *parent) : + LoQTitleBar(parent) +{ + m_wIcon = new QLabel(this); + m_wIcon->setPixmap(icon); + m_wIcon->adjustSize(); + + m_wText = new QLabel(text, this); + m_wText->adjustSize(); + + QHBoxLayout *pLayout = new QHBoxLayout(this); + pLayout->addWidget(m_wIcon); + pLayout->addStretch(); + pLayout->addWidget(m_wText); + pLayout->addStretch(); + pLayout->addWidget(bn_Minimize); + pLayout->addWidget(bn_Maximize); + pLayout->addWidget(bn_Close); + pLayout->setContentsMargins(3, 3, 3, 0); + setLayout(pLayout); +} +void LoQWindowTitleBar::RenameTitle(QString strName) +{ + m_wText->setText(strName); +} diff --git a/LedOK/LoQClass/loqwindowtitlebar.h b/LedOK/LoQClass/loqwindowtitlebar.h new file mode 100644 index 0000000..79de6ef --- /dev/null +++ b/LedOK/LoQClass/loqwindowtitlebar.h @@ -0,0 +1,27 @@ +#ifndef LOQWINDOWTITLEBAR_H +#define LOQWINDOWTITLEBAR_H + +#include +#include +#include +#include + +class LoQWindowTitleBar : public LoQTitleBar +{ + Q_OBJECT +public: + explicit LoQWindowTitleBar(QWidget *parent = nullptr); + LoQWindowTitleBar(const QString &text, QWidget *parent = nullptr); + LoQWindowTitleBar(const QPixmap &icon, const QString &text, QWidget *parent = nullptr); + void RenameTitle(QString strName); + +signals: + +public slots: + +private: + QLabel *m_wIcon; + QLabel *m_wText; +}; + +#endif // LOQWINDOWTITLEBAR_H diff --git a/LedOK/LoQClass/qexcel.cpp b/LedOK/LoQClass/qexcel.cpp new file mode 100644 index 0000000..d90b7ed --- /dev/null +++ b/LedOK/LoQClass/qexcel.cpp @@ -0,0 +1,335 @@ +#include +#include +#include +#include + +#include "qexcel.h" +#include "QMessageBox" +#include + +QExcel::QExcel(QString xlsFilePath, QObject *parent) +{ + excel = nullptr; + workBooks = nullptr; + workBook = nullptr; + sheets = nullptr; + sheet = nullptr; + CoInitializeEx(NULL, COINIT_MULTITHREADED); + + excel = new QAxObject("Excel.Application"); + excel->setProperty("Visible", false); + workBooks = excel->querySubObject("Workbooks"); + if(workBooks!=nullptr) + { + QFile file(xlsFilePath); + if (file.exists()) + { + workBooks->dynamicCall("Open(const QString&)", xlsFilePath); + workBook = excel->querySubObject("ActiveWorkBook"); + sheets = workBook->querySubObject("WorkSheets"); + } + m_bSupportExcel=true; + } + else { + QMessageBox::information(nullptr, "Title", tr("no support QExcel"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + m_bSupportExcel=false; + } + +} + +QExcel::~QExcel() +{ + if(excel!=nullptr) + close(); +} + +void QExcel::close() +{ + excel->dynamicCall("Quit()"); + delete sheet; + delete sheets; + delete workBook; + delete workBooks; + delete excel; + + excel = nullptr; + workBooks = nullptr; + workBook = nullptr; + sheets = nullptr; + sheet = nullptr; +} + +QAxObject *QExcel::getWorkBooks() +{ + return workBooks; +} + +QAxObject *QExcel::getWorkBook() +{ + return workBook; +} + +QAxObject *QExcel::getWorkSheets() +{ + return sheets; +} + +QAxObject *QExcel::getWorkSheet() +{ + return sheet; +} + +void QExcel::selectSheet(const QString& sheetName) +{ + sheet = sheets->querySubObject("Item(const QString&)", sheetName); +} + +void QExcel::deleteSheet(const QString& sheetName) +{ + QAxObject * a = sheets->querySubObject("Item(const QString&)", sheetName); + a->dynamicCall("delete"); +} + +void QExcel::deleteSheet(int sheetIndex) +{ + QAxObject * a = sheets->querySubObject("Item(int)", sheetIndex); + a->dynamicCall("delete"); +} + +void QExcel::selectSheet(int sheetIndex) +{ + sheet = sheets->querySubObject("Item(int)", sheetIndex); +} + +void QExcel::setCellString(int row, int column, const QString& value) +{ + QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column); + range->dynamicCall("SetValue(const QString&)", value); +} + +void QExcel::setCellFontBold(int row, int column, bool isBold) +{ + QString cell; + cell.append(QChar(column - 1 + 'A')); + cell.append(QString::number(row)); + + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range = range->querySubObject("Font"); + range->setProperty("Bold", isBold); +} + +void QExcel::setCellFontSize(int row, int column, int size) +{ + QString cell; + cell.append(QChar(column - 1 + 'A')); + cell.append(QString::number(row)); + + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range = range->querySubObject("Font"); + range->setProperty("Size", size); +} + +void QExcel::mergeCells(const QString& cell) +{ + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->setProperty("VerticalAlignment", -4108);//xlCenter + range->setProperty("WrapText", true); + range->setProperty("MergeCells", true); +} + +void QExcel::mergeCells(int topLeftRow, int topLeftColumn, int bottomRightRow, int bottomRightColumn) +{ + QString cell; + cell.append(QChar(topLeftColumn - 1 + 'A')); + cell.append(QString::number(topLeftRow)); + cell.append(":"); + cell.append(QChar(bottomRightColumn - 1 + 'A')); + cell.append(QString::number(bottomRightRow)); + + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->setProperty("VerticalAlignment", -4108);//xlCenter + range->setProperty("WrapText", true); + range->setProperty("MergeCells", true); +} + +QVariant QExcel::getCellValue(int row, int column) +{ + QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column); + return range->property("Value"); +} + +void QExcel::save() +{ + workBook->dynamicCall("Save()"); +} + +int QExcel::getSheetsCount() +{ + return sheets->property("Count").toInt(); +} + +QString QExcel::getSheetName() +{ + return sheet->property("Name").toString(); +} + +QString QExcel::getSheetName(int sheetIndex) +{ + QAxObject * a = sheets->querySubObject("Item(int)", sheetIndex); + return a->property("Name").toString(); +} + +void QExcel::getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn) +{ + QAxObject *usedRange = sheet->querySubObject("UsedRange"); + *topLeftRow = usedRange->property("Row").toInt(); + *topLeftColumn = usedRange->property("Column").toInt(); + + QAxObject *rows = usedRange->querySubObject("Rows"); + *bottomRightRow = *topLeftRow + rows->property("Count").toInt() - 1; + + QAxObject *columns = usedRange->querySubObject("Columns"); + *bottomRightColumn = *topLeftColumn + columns->property("Count").toInt() - 1; +} + +void QExcel::setColumnWidth(int column, int width) +{ + QString columnName; + columnName.append(QChar(column - 1 + 'A')); + columnName.append(":"); + columnName.append(QChar(column - 1 + 'A')); + + QAxObject * col = sheet->querySubObject("Columns(const QString&)", columnName); + col->setProperty("ColumnWidth", width); +} + +void QExcel::setCellTextCenter(int row, int column) +{ + QString cell; + cell.append(QChar(column - 1 + 'A')); + cell.append(QString::number(row)); + + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->setProperty("HorizontalAlignment", -4108);//xlCenter +} + +void QExcel::setCellTextWrap(int row, int column, bool isWrap) +{ + QString cell; + cell.append(QChar(column - 1 + 'A')); + cell.append(QString::number(row)); + + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->setProperty("WrapText", isWrap); +} + +void QExcel::setAutoFitRow(int row) +{ + QString rowsName; + rowsName.append(QString::number(row)); + rowsName.append(":"); + rowsName.append(QString::number(row)); + + QAxObject * rows = sheet->querySubObject("Rows(const QString &)", rowsName); + rows->dynamicCall("AutoFit()"); +} + +void QExcel::insertSheet(QString sheetName) +{ + sheets->querySubObject("Add()"); + QAxObject * a = sheets->querySubObject("Item(int)", 1); + a->setProperty("Name", sheetName); +} + +void QExcel::mergeSerialSameCellsInAColumn(int column, int topRow) +{ + int a,b,c,rowsCount; + getUsedRange(&a, &b, &rowsCount, &c); + + int aMergeStart = topRow, aMergeEnd = topRow + 1; + + QString value; + while(aMergeEnd <= rowsCount) + { + value = getCellValue(aMergeStart, column).toString(); + while(value == getCellValue(aMergeEnd, column).toString()) + { + clearCell(aMergeEnd, column); + aMergeEnd++; + } + aMergeEnd--; + mergeCells(aMergeStart, column, aMergeEnd, column); + + aMergeStart = aMergeEnd + 1; + aMergeEnd = aMergeStart + 1; + } +} + +void QExcel::clearCell(int row, int column) +{ + QString cell; + cell.append(QChar(column - 1 + 'A')); + cell.append(QString::number(row)); + + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->dynamicCall("ClearContents()"); +} + +void QExcel::clearCell(const QString& cell) +{ + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->dynamicCall("ClearContents()"); +} + +int QExcel::getUsedRowsCount() +{ + QAxObject *usedRange = sheet->querySubObject("UsedRange"); + int topRow = usedRange->property("Row").toInt(); + QAxObject *rows = usedRange->querySubObject("Rows"); + int bottomRow = topRow + rows->property("Count").toInt() - 1; + return bottomRow; +} + +void QExcel::setCellString(const QString& cell, const QString& value) +{ + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->dynamicCall("SetValue(const QString&)", value); +} + +void QExcel::setCellFontSize(const QString &cell, int size) +{ + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range = range->querySubObject("Font"); + range->setProperty("Size", size); +} + +void QExcel::setCellTextCenter(const QString &cell) +{ + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->setProperty("HorizontalAlignment", -4108);//xlCenter +} + +void QExcel::setCellFontBold(const QString &cell, bool isBold) +{ + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range = range->querySubObject("Font"); + range->setProperty("Bold", isBold); +} + +void QExcel::setCellTextWrap(const QString &cell, bool isWrap) +{ + QAxObject *range = sheet->querySubObject("Range(const QString&)", cell); + range->setProperty("WrapText", isWrap); +} + +void QExcel::setRowHeight(int row, int height) +{ + QString rowsName; + rowsName.append(QString::number(row)); + rowsName.append(":"); + rowsName.append(QString::number(row)); + + QAxObject * r = sheet->querySubObject("Rows(const QString &)", rowsName); + r->setProperty("RowHeight", height); +} diff --git a/LedOK/LoQClass/qexcel.h b/LedOK/LoQClass/qexcel.h new file mode 100644 index 0000000..02b5551 --- /dev/null +++ b/LedOK/LoQClass/qexcel.h @@ -0,0 +1,82 @@ +#ifndef QEXCEL_H +#define QEXCEL_H + +#include +#include + +class QAxObject; + +class QExcel : public QObject +{ +public: + QExcel(QString xlsFilePath, QObject *parent = 0); + ~QExcel(); + +public: + QAxObject * getWorkBooks(); + QAxObject * getWorkBook(); + QAxObject * getWorkSheets(); + QAxObject * getWorkSheet(); + int m_bSupportExcel=false; + +public: + /**************************************************************************/ + /* 工作表 */ + /**************************************************************************/ + void selectSheet(const QString& sheetName); + //sheetIndex 起始于 1 + void selectSheet(int sheetIndex); + void deleteSheet(const QString& sheetName); + void deleteSheet(int sheetIndex); + void insertSheet(QString sheetName); + int getSheetsCount(); + //在 selectSheet() 之后才可调用 + QString getSheetName(); + QString getSheetName(int sheetIndex); + + /**************************************************************************/ + /* 单元格 */ + /**************************************************************************/ + void setCellString(int row, int column, const QString& value); + //cell 例如 "A7" + void setCellString(const QString& cell, const QString& value); + //range 例如 "A5:C7" + void mergeCells(const QString& range); + void mergeCells(int topLeftRow, int topLeftColumn, int bottomRightRow, int bottomRightColumn); + QVariant getCellValue(int row, int column); + void clearCell(int row, int column); + void clearCell(const QString& cell); + + /**************************************************************************/ + /* 布局格式 */ + /**************************************************************************/ + void getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn); + void setColumnWidth(int column, int width); + void setRowHeight(int row, int height); + void setCellTextCenter(int row, int column); + void setCellTextCenter(const QString& cell); + void setCellTextWrap(int row, int column, bool isWrap); + void setCellTextWrap(const QString& cell, bool isWrap); + void setAutoFitRow(int row); + void mergeSerialSameCellsInAColumn(int column, int topRow); + int getUsedRowsCount(); + void setCellFontBold(int row, int column, bool isBold); + void setCellFontBold(const QString& cell, bool isBold); + void setCellFontSize(int row, int column, int size); + void setCellFontSize(const QString& cell, int size); + + /**************************************************************************/ + /* 文件 */ + /**************************************************************************/ + void save(); + void close(); + +private: + QAxObject * excel; + QAxObject * workBooks; + QAxObject * workBook; + QAxObject * sheets; + QAxObject * sheet; +}; + +#endif diff --git a/LedOK/LoQClass/readexcel.cpp b/LedOK/LoQClass/readexcel.cpp new file mode 100644 index 0000000..302f608 --- /dev/null +++ b/LedOK/LoQClass/readexcel.cpp @@ -0,0 +1,169 @@ +#include "readexcel.h" +#include +#include + +ReadExcel::ReadExcel() + :m_row(0), m_col(0), m_filename("") +{ + m_excel = new QAxObject("Excel.Application"); +} + +ReadExcel::~ReadExcel() +{ + if (!m_mapdata.empty()) { + m_mapdata.clear(); + } + delete m_excel; +} + +// +bool ReadExcel::openExcel(const QString &filename) +{ + if (filename.isEmpty()) { + m_row = 0; + m_col = 0; + return false; + } + QFile file(filename); + if (!file.exists()){ + m_row = 0; + m_col = 0; + return false; + }; + if (!m_mapdata.empty()) { + m_mapdata.clear(); + } + m_filename = filename; + try { + getALLfromExcel(); + + } catch (...) { + return false; + } + + return true; +} +void ReadExcel::getALLfromDirNormalExcel(QString strFileName) +{ + openExcelForWrite(strFileName); +} +bool ReadExcel::openExcelForWrite(const QString &filename) +{ + if (filename.isEmpty()) { + m_row = 0; + m_col = 0; + return false; + } + QFile file(filename); + if (!file.exists()){ + m_row = 0; + m_col = 0; + return false; + }; + if (!m_mapdata.empty()) { + m_mapdata.clear(); + } + m_filename = filename; + try { + WriteALLfromExcel(); + } catch (...) { + return false; + } + + return true; +} + +void ReadExcel::getInfo(int &row, int &col) const +{ + row = m_row; + col = m_col; +} + +std::string ReadExcel::getCellData(const int &row, const int &col) +{ + if (row >= 1 && row <= m_row && col >= 1 && col <= m_col) { + p.m_row = row; + p.m_col = col; + return m_mapdata[p]; + } else { + return nullptr; + } +} +int ReadExcel::WriteCellData(const int &row, const int &col,std::string strValue ) +{ + p.m_row = row; + p.m_col = col; + + m_mapdata[p]=strValue; + return 0; +} + +void ReadExcel::getALLfromExcel() +{ + m_excel->setProperty("Visible", 0); + QAxObject* workbooks = m_excel->querySubObject("WorkBooks"); + workbooks->dynamicCall("Open (const QString&)", m_filename); + QAxObject* workbook = m_excel->querySubObject("ActiveWorkBook"); + QAxObject* worksheets = workbook->querySubObject("WorkSheets"); + Q_UNUSED(worksheets) + QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", 1); //worksheet number + QAxObject* usedrange = worksheet->querySubObject("UsedRange"); + QAxObject* rows = usedrange->querySubObject("Rows"); + QAxObject* columns = usedrange->querySubObject("Columns"); + int intRowStart = usedrange->property("Row").toInt(); + int intColStart = usedrange->property("Column").toInt(); + int intCols = columns->property("Count").toInt(); + int intRows = rows->property("Count").toInt(); + m_row = intRows; + m_col = intCols; + QAxObject * cell; + for (int i = intRowStart; i < intRowStart + intRows; i++) + { + for (int j = intColStart; j < intColStart + intCols; j++) + { + Position pos(i, j); + cell = m_excel->querySubObject("Cells(Int, Int)", i, j ); + QVariant cellValue = cell->dynamicCall("value"); + m_mapdata.insert(std::pair(pos, cellValue.toString().toStdString())); + } + } + m_excel->setProperty("DisplayAlerts", 0); + workbook->dynamicCall("Save(void)"); + workbook->dynamicCall("Close (Boolean)", false); + m_excel->setProperty("DisplayAlerts",1); +} +void ReadExcel::WriteALLfromExcel() +{ + m_excel->setProperty("Visible", 0); + QAxObject* workbooks = m_excel->querySubObject("WorkBooks"); + workbooks->dynamicCall("Open (const QString&)", m_filename); + QAxObject* workbook = m_excel->querySubObject("ActiveWorkBook"); + QAxObject* worksheets = workbook->querySubObject("WorkSheets"); + Q_UNUSED(worksheets) + QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", 1); //worksheet number + QAxObject* usedrange = worksheet->querySubObject("UsedRange"); + QAxObject* rows = usedrange->querySubObject("Rows"); + QAxObject* columns = usedrange->querySubObject("Columns"); + int intRowStart = usedrange->property("Row").toInt(); + int intColStart = usedrange->property("Column").toInt(); + int intCols = columns->property("Count").toInt(); + int intRows = rows->property("Count").toInt(); + m_row = intRows; + m_col = intCols; + QAxObject * cell; + for (int i = intRowStart; i < intRowStart + intRows; i++) + { + for (int j = intColStart; j < intColStart + intCols; j++) + { + Position pos(i, j); + cell = m_excel->querySubObject("Cells(Int, Int)", i, j ); + QVariant cellValue = cell->dynamicCall("value"); + m_mapdata.insert(std::pair(pos, cellValue.toString().toStdString())); + } + } + + m_excel->setProperty("DisplayAlerts", 0); + workbook->dynamicCall("Save(void)"); + workbook->dynamicCall("Close (Boolean)", false); + m_excel->setProperty("DisplayAlerts",1); +} diff --git a/LedOK/LoQClass/readexcel.h b/LedOK/LoQClass/readexcel.h new file mode 100644 index 0000000..2300d60 --- /dev/null +++ b/LedOK/LoQClass/readexcel.h @@ -0,0 +1,78 @@ +#ifndef READEXCEL_H +#define READEXCEL_H + +#include +#include +#include +#include +#include +#include +#include + + +class Position +{ +public: + Position() { + m_row = 0; + m_col = 0; + } + + Position(int row, int col) { + m_row = row; + m_col = col; + } +public: + int m_row; + int m_col; + +public: + bool operator<(const Position & ct) const // 两个const是必需的。 + { + if (m_row < ct.m_row) { + return true; + } else if (m_row == ct.m_row) { + if ( m_col < ct.m_col ) { + return true; + } + } + return false; + } +}; + +class ReadExcel +{ +public: + ReadExcel(); + ~ReadExcel(); + +public: + //打开excel文件 + bool openExcel(const QString& filename); + void getALLfromDirNormalExcel(QString strFileName); + bool openExcelForWrite(const QString &filename); + //获取 指定单元格的数据 + std::string getCellData(const int& row, const int& col); + int WriteCellData(const int& row, const int& col,std::string strValue ); + //获取 行数,列数 + void getInfo(int& row, int& col) const; + +private: + void getALLfromExcel(); + void WriteALLfromExcel(); + +private: + int m_row; //行 + int m_col; //列 + QString m_filename; + QAxObject* m_excel; + int m_rowWrite; //行 + int m_colWrite; //列 + QAxObject* m_excelWrite; + + std::map m_mapdata; + std::map m_mapdataWrite; + Position p; +}; + +#endif // READEXCEL_H diff --git a/LedOK/LoUIClass/aboutdlg.cpp b/LedOK/LoUIClass/aboutdlg.cpp new file mode 100644 index 0000000..6409c01 --- /dev/null +++ b/LedOK/LoUIClass/aboutdlg.cpp @@ -0,0 +1,18 @@ +#include "aboutdlg.h" +#include "ui_aboutdlg.h" +#include "globaldefine.h" +AboutDlg::AboutDlg(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::AboutDlg) +{ + ui->setupUi(this); + ui->label_2->setText(APP_VERSION); +#ifdef MACRO_YUANHENG_VERSION + ui->label_3->setVisible(false); +#endif +} + +AboutDlg::~AboutDlg() +{ + delete ui; +} diff --git a/LedOK/LoUIClass/aboutdlg.h b/LedOK/LoUIClass/aboutdlg.h new file mode 100644 index 0000000..ee3b3d5 --- /dev/null +++ b/LedOK/LoUIClass/aboutdlg.h @@ -0,0 +1,22 @@ +#ifndef ABOUTDLG_H +#define ABOUTDLG_H + +#include + +namespace Ui { +class AboutDlg; +} + +class AboutDlg : public LoQDialog +{ + Q_OBJECT + +public: + explicit AboutDlg(QWidget *parent = nullptr); + ~AboutDlg(); + +private: + Ui::AboutDlg *ui; +}; + +#endif // ABOUTDLG_H diff --git a/LedOK/LoUIClass/aboutdlg.ui b/LedOK/LoUIClass/aboutdlg.ui new file mode 100644 index 0000000..5ace8a7 --- /dev/null +++ b/LedOK/LoUIClass/aboutdlg.ui @@ -0,0 +1,202 @@ + + + AboutDlg + + + + 0 + 0 + 410 + 192 + + + + Dialog + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 0 + + + + + About + + + Qt::AlignCenter + + + + + + + + 30 + 24 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + image: url(:/res/Logo.png); + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 0 + 0 + + + + + Arial + 24 + 50 + false + false + + + + font: 24pt "Arial"; +color: rgb(255, 255, 255); + + + LedOK Express + + + Qt::AutoText + + + Qt::AlignCenter + + + + + + + + 14 + + + + V20200429 + + + Qt::AlignCenter + + + + + + + + 15 + + + + <a href="https://www.ledok.cn/">www.ledok.cn + + + Qt::AlignCenter + + + true + + + + + + + + + + + + + + + + pushButton + clicked() + AboutDlg + close() + + + 361 + 19 + + + 193 + 89 + + + + + diff --git a/LedOK/LoUIClass/changepasswordform.cpp b/LedOK/LoUIClass/changepasswordform.cpp new file mode 100644 index 0000000..0570059 --- /dev/null +++ b/LedOK/LoUIClass/changepasswordform.cpp @@ -0,0 +1,144 @@ +#include "changepasswordform.h" +#include "ui_changepasswordform.h" +#include +#include "loappconfig.h" +#include "x_uimsgboxok.h" +#include "LoUIClass/taesclass.h" +#include "QTextCodec" +ChangePasswordForm::ChangePasswordForm(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::ChangePasswordForm) +{ + ui->setupUi(this); + ui->lineEdit->setEchoMode(QLineEdit::Password); + ui->lineEdit_2->setEchoMode(QLineEdit::Password); + ui->lineEdit_3->setEchoMode(QLineEdit::Password); + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,1);}"); + ui->pushButton->setProperty("ssType", "progManageTool"); + ui->pushButton->setStyleSheet("QPushButton{background:rgba(28,154,210,1);}"); + setStyleSheet("background-color: #D8D8D8;"); + ui->lineEdit->setStyleSheet("background-color: #FFFFFF;"); + ui->lineEdit_2->setStyleSheet("background-color: #FFFFFF;"); + ui->lineEdit_3->setStyleSheet("background-color: #FFFFFF;"); + connect(this, SIGNAL(accepted()), this, SLOT(onAccepted())); + connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(onOkButton())); +} + +ChangePasswordForm::~ChangePasswordForm() +{ + delete ui; +} +void ChangePasswordForm::onAccepted() +{ + +} +void ChangePasswordForm::onOkButton() +{ + //如果旧密码错误 + LoAppConfig *cfg = LoAppConfig::getInstance(); + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); +#ifndef MACRO_YUANHENG_VERSION + + QString strMiWenPs=settings->value("advUiPs").toString(); +#else + QString strMiWenPs=settings->value("advUiPs_YuanHeng").toString(); + +#endif + QString result = QTextCodec::codecForName("GBK")->toUnicode(QByteArray::fromBase64(strMiWenPs.toLocal8Bit())); +// QByteArray miwen = strMiWenPs.toLatin1(); +// if(miwen.size()>=3) +// { +// miwen[0]=miwen[0]-'1'; +// miwen[1]=miwen[1]-'7'; +// miwen[2]=miwen[2]-'5'; +// miwen[3]=miwen[3]-'8'; +// miwen[4]=miwen[4]-'0'; +// miwen[5]=miwen[5]-'1'; +// } + QString strPs=result; + + + if(strPs.isEmpty()) + { +#ifndef MACRO_YUANHENG_VERSION + strPs = "888"; +#else + strPs = "Cargo10065!@#"; + +#endif + } + + QString strOldPs=ui->lineEdit->text(); + if(strOldPs.isEmpty()) + { + X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("Please input old password"),this,1); + pDlg->exec(); + ui->lineEdit->setFocus(); + return; + } + if(ui->lineEdit->text()!=strPs) + { + X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("Old password is wrong"),this,1); + pDlg->exec(); + ui->lineEdit->setFocus(); + return; + } + if(ui->lineEdit_2->text().length()<6) + { + X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("Please enter a password with more than 6 characters"),this,1); + pDlg->exec(); + ui->lineEdit_2->setFocus(); + return; + } + if(ui->lineEdit_3->text().length()<6) + { + X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("Please enter a password with more than 6 characters"),this,1); + pDlg->exec(); + ui->lineEdit_3->setFocus(); + return; + } + if(ui->lineEdit_2->text()!=ui->lineEdit_3->text())//两次输入新密码不一致 + { + X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("The new password is not consistent in two times"),this,1); + pDlg->exec(); + ui->lineEdit_2->setFocus(); + return; + } + QString strNewPs=ui->lineEdit_2->text(); + if(strNewPs.isEmpty()) + { + X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("Please enter a new password"),this,1); + pDlg->exec(); + ui->lineEdit_2->setFocus(); + return; + + } + else { + + QString str=ui->lineEdit_2->text(); + QByteArray a = str.toLocal8Bit().toBase64(); + + QString newStr(a); +// QByteArray New_mingwen = str.toLatin1(); +// New_mingwen[0]=New_mingwen[0]+'1'; +// New_mingwen[1]=New_mingwen[1]+'7'; +// New_mingwen[2]=New_mingwen[2]+'5'; +// New_mingwen[3]=New_mingwen[3]+'8'; +// New_mingwen[4]=New_mingwen[4]+'0'; +// New_mingwen[5]=New_mingwen[5]+'1'; +// QString strtemp=New_mingwen; +#ifndef MACRO_YUANHENG_VERSION + + settings->setValue("advUiPs",newStr); +#else + settings->setValue("advUiPs_YuanHeng",newStr); + +#endif + + } + X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("Password changed successfully"),this,1); + pDlg->exec(); + this->accept(); + // emit sigAcceptData(ui->lineEdit_2->text()); +} diff --git a/LedOK/LoUIClass/changepasswordform.h b/LedOK/LoUIClass/changepasswordform.h new file mode 100644 index 0000000..5442b1c --- /dev/null +++ b/LedOK/LoUIClass/changepasswordform.h @@ -0,0 +1,26 @@ +#ifndef CHANGEPASSWORDFORM_H +#define CHANGEPASSWORDFORM_H + +#include + +namespace Ui { +class ChangePasswordForm; +} + +class ChangePasswordForm : public LoQDialog +{ + Q_OBJECT + +public: + explicit ChangePasswordForm(QWidget *parent = nullptr); + ~ChangePasswordForm(); +signals: + void sigAcceptData(QString strIP); +private: + Ui::ChangePasswordForm *ui; +protected slots: + void onAccepted(); + void onOkButton(); +}; + +#endif // CHANGEPASSWORDFORM_H diff --git a/LedOK/LoUIClass/changepasswordform.ui b/LedOK/LoUIClass/changepasswordform.ui new file mode 100644 index 0000000..e797b95 --- /dev/null +++ b/LedOK/LoUIClass/changepasswordform.ui @@ -0,0 +1,135 @@ + + + ChangePasswordForm + + + + 0 + 0 + 236 + 159 + + + + Form + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 10 + + + + + Old password + + + + + + + 16 + + + + + + + + + + + New password + + + + + + + 8 + + + + + + + + + + + Repeat again + + + + + + + 8 + + + + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + + + + + pushButton + clicked() + ChangePasswordForm + close() + + + 167 + 126 + + + 117 + 79 + + + + + diff --git a/LedOK/LoUIClass/customprogressindicator.cpp b/LedOK/LoUIClass/customprogressindicator.cpp new file mode 100644 index 0000000..9630478 --- /dev/null +++ b/LedOK/LoUIClass/customprogressindicator.cpp @@ -0,0 +1,186 @@ +#include "customprogressindicator.h" +#include +#include + +CustomProgressIndicator::CustomProgressIndicator(QWidget* parent) + : QWidget(parent), + angle_(0), + timerId_(-1), + delay_(20), + displayedWhenStopped_(false), + color_(Qt::green) { + setAttribute(Qt::WA_DeleteOnClose); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + setFocusPolicy(Qt::NoFocus); + setWindowFlags(Qt::FramelessWindowHint);//无窗体 + setAttribute(Qt::WA_TranslucentBackground);//背景透明 +} + +bool CustomProgressIndicator::isAnimated () const { + return (timerId_ != -1); +} + +void CustomProgressIndicator::setDisplayedWhenStopped(bool state) { + displayedWhenStopped_ = state; + + update(); +} + +bool CustomProgressIndicator::isDisplayedWhenStopped() const { + return displayedWhenStopped_; +} +void CustomProgressIndicator::setDisplayModel(int iFlag) +{ + m_iLoopBackFlag=iFlag; +} +void CustomProgressIndicator::startAnimation() { + angle_ = 0; + + if (timerId_ == -1) { + timerId_ = startTimer(delay_); + } +} +void CustomProgressIndicator::setDisplayStringInfo(QString strTip,QString strTiping) { + m_strTip=strTip; + m_strTiping=strTiping; + update(); +} +void CustomProgressIndicator::stopAnimation() { + if (timerId_ != -1) { + killTimer(timerId_); + } + + timerId_ = -1; + + update(); +} + +void CustomProgressIndicator::setAnimationDelay(int delay) { + if (timerId_ != -1){ + killTimer(timerId_); + } + + delay_ = delay; + + if (timerId_ != -1){ + timerId_ = startTimer(delay_); + } +} + +void CustomProgressIndicator::setColor(const QColor & color) { + color_ = color; + + update(); +} + +QSize CustomProgressIndicator::sizeHint() const { + return QSize(80,80); +} + + +void CustomProgressIndicator::timerEvent(QTimerEvent * /*event*/) { + angle_ = (angle_+30)%360; + + update(); +} + +void CustomProgressIndicator::paintEvent(QPaintEvent * /*event*/) { + QPainter p(this); + +// if(m_iFlagFinishedSuccess==1) +// { + // drawUnderCircle(&p); + // } + // else + { + drawJuHua(&p); + } + + +} +void CustomProgressIndicator::drawJuHua(QPainter *painter) +{ + painter->setRenderHint(QPainter::Antialiasing); + if (displayedWhenStopped_ && !isAnimated()) //如果displayedWhenStopped_==flash并且动画已经停止则不绘制 + { + painter->setPen(color_); + painter->drawPixmap(rect(),currentPix_); + painter->drawText(rect(), Qt::AlignCenter, m_strTip); + + return; + } + + int width = qMin(this->width(), this->height()); + + + int outerRadius = (width-1) >> 1; + int innerRadius = int(((width-1) >> 1)*0.38); + + int capsuleHeight = outerRadius - innerRadius; + int capsuleWidth = (width > 32 ) ? (int)(capsuleHeight *0.23) : (int)(capsuleHeight *0.35); + int capsuleRadius = capsuleWidth >> 1; + if(m_iLoopBackFlag==1) + { + painter->setPen(color_); + painter->drawText(rect(), Qt::AlignCenter, m_strTiping); + + } + else { + /* 撰写进度 */ + if (progress_ > 0 && progress_ < 100) { + painter->setPen(color_); + painter->drawText(rect(), Qt::AlignCenter, QString("%1%").arg(progress_)); + } + else if (progress_ == 100) { + stopAnimation(); + } + } + + for (int i=0; i<12; ++i) { + QColor color = color_; + color.setAlphaF(1.0f - (i/12.0f)); + painter->setPen(Qt::NoPen); + painter->setBrush(color); + painter->save(); + painter->translate(rect().center()); + painter->rotate(angle_ - i*30.0f); + painter->drawRoundedRect(((-capsuleWidth) >> 1), -(innerRadius+capsuleHeight), capsuleWidth, capsuleHeight, capsuleRadius, capsuleRadius); + painter->restore(); + } + +} +//没有使用的画圆环函数 +void CustomProgressIndicator::drawUnderCircle(QPainter *painter) +{ + int bigradius = 50; + painter->save(); + painter->setPen(color_); + painter->setBrush(color_); + + QPainterPath bigCircle; + bigCircle.addEllipse(-width()/2, -height()/2, bigradius*2, bigradius*2); + + int smallradius = 40; + QPainterPath smallCircle; + smallCircle.addEllipse(-width()/2, -height()/2, smallradius*2, smallradius*2); + + QPainterPath path = bigCircle - smallCircle; + painter->drawPath(path); + painter->setPen(color_); + painter->drawText(rect(), Qt::AlignCenter, m_strTip); + painter->restore(); + + /* painter->save(); + painter->setPen(color_); + painter->setBrush(color_); + int m_outerRadius=width()>height()?(qreal)height()/2-4:(qreal)width()/2-4;//求最小的那个值。自己可以测试一下减4个像素与不减的区别 + QPointF TopLeft(rect().center().x() - m_outerRadius,rect().center().y() - m_outerRadius); + QPointF BottomRight(rect().center().x() + m_outerRadius,rect().center().y() + m_outerRadius); + QRectF CircleRect(TopLeft,BottomRight);//大圆矩形 + + //painter->setPen(Qt::NoPen);//大家可以注释掉这行看一下,有什么差别? + painter->drawEllipse(CircleRect);//画椭圆,其实就是画圆。特殊椭圆而已 + painter->setPen(Qt::white); + painter->drawText(rect(), Qt::AlignCenter, m_strTip); + painter->restore();*/ +} diff --git a/LedOK/LoUIClass/customprogressindicator.h b/LedOK/LoUIClass/customprogressindicator.h new file mode 100644 index 0000000..e366b1f --- /dev/null +++ b/LedOK/LoUIClass/customprogressindicator.h @@ -0,0 +1,118 @@ +#ifndef CUSTOMPROGRESSINDICATOR_H +#define CUSTOMPROGRESSINDICATOR_H + +#include +#include +#include +/* +* 菊花转 进度类,基于代码无需图片资源 +* 作者:陈鲁勇 +* 邮箱:727057301@qq.com +* 创建时间:2017年2月10日16:26:48 +* QT版本:5.0.2 +* CSDN:http://blog.csdn.net/csnd_ayo +* ************************************** +* 说明: +* 使用前请确保在QT.pro中加入 C++11 的支持 +* +* 示例代码: + + pIndicator = new CustomProgressIndicator(this); + pIndicator->setColor(Qt::red); + pIndicator->startAnimation(); +*/ + +class CustomProgressIndicator : public QWidget +{ + Q_OBJECT + Q_PROPERTY(int delay READ animationDelay WRITE setAnimationDelay) + Q_PROPERTY(bool displayedWhenStopped READ isDisplayedWhenStopped WRITE setDisplayedWhenStopped) + Q_PROPERTY(QColor color READ color WRITE setColor) +public: + CustomProgressIndicator(QWidget* parent = nullptr); + + int animationDelay() const { return delay_; } + + /* 动画是否正在进行中 */ + bool isAnimated () const; + + /* 动画完毕后,是否隐藏菊花转 */ + bool isDisplayedWhenStopped() const; + + /* 当前菊花转的颜色 */ + const QColor & color() const { return color_; } + + /* 虚函数:当前大小 */ + virtual QSize sizeHint() const; + + void setBackground(const QString& _icon) { + currentPix_ = QPixmap(_icon); + } +signals: + void Finished(void); +public slots: + + /* 开始动画 */ + void startAnimation(); + + /* 停止动画 */ + void stopAnimation(); + /* 设置停止菊花,显示圆圈加对号*/ + void setDisplayStringInfo(QString strTip,QString strTiping); + void setDisplayModel(int iFlag);//iFlag 0:表示进度统计,1:表示strTiping提示,结束后显示strTip + + /* 设置菊花转的转速 */ + void setAnimationDelay(int delay); + + /* 动画完毕后,是否隐藏菊花转 */ + void setDisplayedWhenStopped(bool state); + + /* 设置菊花转颜色 */ + void setColor(const QColor & color); + + /* + * 进度 + * 参数 _progress:当前进度 0 < _progress < 100 + */ + void onProgress(QString msg, int _progress, bool done) + { + Q_UNUSED(msg) + progress_ = _progress; + if(done) + { + progress_=100; + + } + } +protected: + /* 系统基类函数 */ + virtual void timerEvent(QTimerEvent * event); + virtual void paintEvent(QPaintEvent * event); + + void drawUnderCircle(QPainter *painter); + void drawJuHua(QPainter *painter); + +private: + /* 角度 */ + unsigned int angle_; + /* 定时器ID */ + int timerId_; + /* 转速 */ + int delay_; + /* 是否隐藏 */ + bool displayedWhenStopped_; + /* 菊花转颜色 */ + QColor color_; + /* 进度 */ + int progress_; + /* 背景图 */ + QPixmap currentPix_; + /*显示圆圈中的字符串内容*/ + QString m_strTip = ""; + QString m_strTiping = ""; + int m_iLoopBackFlag = 0; + +}; + + +#endif // CUSTOMPROGRESSINDICATOR_H diff --git a/LedOK/LoUIClass/loemptydialog.cpp b/LedOK/LoUIClass/loemptydialog.cpp new file mode 100644 index 0000000..5f71adc --- /dev/null +++ b/LedOK/LoUIClass/loemptydialog.cpp @@ -0,0 +1,97 @@ +#include "loemptydialog.h" +#include "ui_loemptydialog.h" + +#include "QThread" +LoEmptyDialog::LoEmptyDialog(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::LoEmptyDialog) +{ + ui->setupUi(this); + setStyleSheet("background-color: rgba(216,216,216,0.8);"); + ui->label->setStyleSheet("font-size: 24px;font-weight: 650;color: rgba(0,147,221,1); background-color: transparent;"); + m_pIndicator = new CustomProgressIndicator(this); + m_pIndicator->setDisplayStringInfo(tr(""),tr("")); + m_pIndicator->setDisplayModel(1); + ui->horizontalLayout_2->addWidget(m_pIndicator,Qt::AlignCenter); + m_pIndicator->show(); + m_pIndicator->setColor(QColor(0,147,221)); + m_pIndicator->setDisplayedWhenStopped(true);//动画停止后任就显示,直到关闭窗口 + m_pIndicator->startAnimation(); + +} + +LoEmptyDialog::~LoEmptyDialog() +{ + delete ui; +} +void LoEmptyDialog::SetTipTextContent(QString strTip) +{ + ui->label->setText(strTip); + +} + +void LoEmptyDialog::lock(QString strTip,QString strUnLockTip,QString strTimerOutUnLockTip) +{ + iLockFlag=true; + ui->label->setText(strTip); + m_strUnLockTip=strUnLockTip; + m_strTimerOutUnLockTip=strTimerOutUnLockTip; +} + +void LoEmptyDialog::unlock() +{ + if(iClosedFlag==1) + return; + ui->label->setText(m_strUnLockTip); + if(m_pIndicator != nullptr) + { + m_pIndicator->setBackground(":/res/success.png"); + m_pIndicator->stopAnimation(); + // QThread::sleep(1); + CloseWndByDelaySec(600); + } + iClosedFlag=1; + iLockFlag=false; +} +bool LoEmptyDialog::getLockStatus() +{ + return iLockFlag; +} +void LoEmptyDialog::TimerOutUnlock() +{ + if(iClosedFlag==1) + return; + ui->label->setText(m_strTimerOutUnLockTip); + if(m_pIndicator != nullptr) + { + m_pIndicator->setBackground(":/res/tip.png"); + m_pIndicator->stopAnimation(); + // QThread::sleep(1); + CloseWndByDelaySec(600); + + } + iClosedFlag=1; +} +void LoEmptyDialog::SetFailedTipString(QString strTip) +{ + m_strTimerOutUnLockTip=strTip; +} +void LoEmptyDialog::CloseWndByDelaySec(int iCloseWndDelaySec) { + m_pTimer = new QTimer(this); + m_pTimer->setSingleShot(true); + //connect(m_pTimer, &QTimer::timeout, this, [=](){this->close();}); + //connect(m_pTimer, &QTimer::timeout, this, SLOT(CloseDlg())); + connect(m_pTimer,SIGNAL(timeout()),this,SLOT(CloseDlg())); + m_pTimer->start(iCloseWndDelaySec); +} +void LoEmptyDialog::CloseDlg() +{ + m_pTimer->stop(); + this->close(); + emit sigClose(); +} +void LoEmptyDialog::DeleteSelf(const LoEmptyDialog *p) +{ + + //m_pSelf=p; +} diff --git a/LedOK/LoUIClass/loemptydialog.h b/LedOK/LoUIClass/loemptydialog.h new file mode 100644 index 0000000..bc0a1c6 --- /dev/null +++ b/LedOK/LoUIClass/loemptydialog.h @@ -0,0 +1,44 @@ +#ifndef LOEMPTYDIALOG_H +#define LOEMPTYDIALOG_H +#include +#include +#include +namespace Ui { +class LoEmptyDialog; +} + +class LoEmptyDialog : public LoQDialog +{ + Q_OBJECT + +public: + explicit LoEmptyDialog(QWidget *parent = nullptr); + ~LoEmptyDialog(); + CustomProgressIndicator *m_pIndicator = nullptr; + virtual int exec() override { emit startUp(); return LoQDialog::exec(); } + void DeleteSelf(const LoEmptyDialog *p); +private: + Ui::LoEmptyDialog *ui; + int iClosedFlag=0; + bool iLockFlag=false; + /*延时关闭定时器*/ + QTimer *m_pTimer; + QString m_strUnLockTip=""; + QString m_strTimerOutUnLockTip=""; + LoEmptyDialog *m_pSelf=nullptr; + void CloseWndByDelaySec(int iCloseWndDelaySec); +signals: + void startUp(); + void sigClose(); +public slots: + void lock(QString strTip,QString strUnLockTip,QString strTimerOutUnLockTip); + void unlock(); + void TimerOutUnlock(); + bool getLockStatus(); + void SetFailedTipString(QString strTip); + void SetTipTextContent(QString strTip); + void CloseDlg(); + +}; + +#endif // LOEMPTYDIALOG_H diff --git a/LedOK/LoUIClass/loemptydialog.ui b/LedOK/LoUIClass/loemptydialog.ui new file mode 100644 index 0000000..0c22e6f --- /dev/null +++ b/LedOK/LoUIClass/loemptydialog.ui @@ -0,0 +1,122 @@ + + + LoEmptyDialog + + + + 0 + 0 + 142 + 127 + + + + Dialog + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + diff --git a/LedOK/LoUIClass/louimsgboxok.h b/LedOK/LoUIClass/louimsgboxok.h new file mode 100644 index 0000000..3a1c9d6 --- /dev/null +++ b/LedOK/LoUIClass/louimsgboxok.h @@ -0,0 +1,36 @@ +#ifndef LOUIMSGBOXOK_H +#define LOUIMSGBOXOK_H + +#include +#include + +namespace Ui { +class LoUIMsgBoxOk; +} + +class LoUIMsgBoxOk : public LoQDialog +{ + Q_OBJECT + +public: + explicit LoUIMsgBoxOk(QWidget *parent = nullptr); + LoUIMsgBoxOk(QString text, QString strUnlockTip, QWidget *parent = nullptr); + LoUIMsgBoxOk(QPixmap icon, QString text, QWidget *parent = nullptr); + ~LoUIMsgBoxOk() override; + +public: + virtual int exec() override { emit startUp(); return LoQDialog::exec(); } + QString m_strUnlockTip; +public slots: + void lock(); + void unlock(); + void progress(QString msg, int pre, bool done); + +signals: + void startUp(); + +private: + Ui::LoUIMsgBoxOk *ui; +}; + +#endif // LOUIMSGBOXOK_H diff --git a/LedOK/LoUIClass/louimsgboxok.ui b/LedOK/LoUIClass/louimsgboxok.ui new file mode 100644 index 0000000..0c58ef1 --- /dev/null +++ b/LedOK/LoUIClass/louimsgboxok.ui @@ -0,0 +1,204 @@ + + + LoUIMsgBoxOk + + + + 0 + 0 + 307 + 102 + + + + + 0 + 0 + + + + Dialog + + + false + + + false + + + false + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + background-color: rgb(207, 207, 207); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + 12 + + + 12 + + + + + + + + 32 + 32 + + + + + 32 + 32 + + + + image: url(:/res/Warning.png); + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + OK + + + 300 + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + bnOK + clicked() + LoUIMsgBoxOk + accept() + + + 163 + 62 + + + 163 + 42 + + + + + diff --git a/LedOK/LoUIClass/louimsgboxokcancel.cpp b/LedOK/LoUIClass/louimsgboxokcancel.cpp new file mode 100644 index 0000000..e9fe779 --- /dev/null +++ b/LedOK/LoUIClass/louimsgboxokcancel.cpp @@ -0,0 +1,37 @@ +#include "louimsgboxokcancel.h" +#include "ui_louimsgboxokcancel.h" + +LoUIMsgBoxOkCancel::LoUIMsgBoxOkCancel(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::LoUIMsgBoxOkCancel) +{ + ui->setupUi(this); + //让QLabel自适应text的大小,直接用下面的代码: + ui->lInfo->adjustSize(); + //让QLabel能够自动判断并换行显示: + ui->lInfo->setGeometry(QRect(328, 240, 329, 27*4)); //四倍行距 + ui->lInfo->setWordWrap(true); + ui->lInfo->setAlignment(Qt::AlignTop); +} + +LoUIMsgBoxOkCancel::LoUIMsgBoxOkCancel(QString text, QWidget *parent) : + LoQDialog(parent), + ui(new Ui::LoUIMsgBoxOkCancel) +{ + ui->setupUi(this); + ui->lInfo->setText(text); + // ui->plainTextEdit->sett>setText(text); +} +LoUIMsgBoxOkCancel::LoUIMsgBoxOkCancel(QPixmap icon, QString text, QWidget *parent) : + LoQDialog(parent), + ui(new Ui::LoUIMsgBoxOkCancel) +{ + ui->setupUi(this); + ui->lInfo->setText(text); + ui->lIcon->setPixmap(icon); +} + +LoUIMsgBoxOkCancel::~LoUIMsgBoxOkCancel() +{ + delete ui; +} diff --git a/LedOK/LoUIClass/louimsgboxokcancel.h b/LedOK/LoUIClass/louimsgboxokcancel.h new file mode 100644 index 0000000..ddfccab --- /dev/null +++ b/LedOK/LoUIClass/louimsgboxokcancel.h @@ -0,0 +1,24 @@ +#ifndef LOUIMSGBOXOKCANCEL_H +#define LOUIMSGBOXOKCANCEL_H + +#include + +namespace Ui { +class LoUIMsgBoxOkCancel; +} + +class LoUIMsgBoxOkCancel : public LoQDialog +{ + Q_OBJECT + +public: + explicit LoUIMsgBoxOkCancel(QWidget *parent = nullptr); + LoUIMsgBoxOkCancel(QString text, QWidget *parent = nullptr); + LoUIMsgBoxOkCancel(QPixmap icon, QString text, QWidget *parent = nullptr); + ~LoUIMsgBoxOkCancel(); + +private: + Ui::LoUIMsgBoxOkCancel *ui; +}; + +#endif // LOUIMSGBOXOKCANCEL_H diff --git a/LedOK/LoUIClass/louimsgboxokcancel.ui b/LedOK/LoUIClass/louimsgboxokcancel.ui new file mode 100644 index 0000000..0b80401 --- /dev/null +++ b/LedOK/LoUIClass/louimsgboxokcancel.ui @@ -0,0 +1,200 @@ + + + LoUIMsgBoxOkCancel + + + + 0 + 0 + 327 + 85 + + + + Dialog + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + background-color: rgb(207, 207, 207); + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 12 + + + QLayout::SetDefaultConstraint + + + 12 + + + + + + 32 + 32 + + + + + 32 + 32 + + + + image: url(:/res/Warning.png); + + + + + + + + + + + 250 + 32 + + + + + 250 + 32 + + + + false + + + Qt::ImhMultiLine + + + 1 + + + 0 + + + TextLabel + + + true + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + bnOK + clicked() + LoUIMsgBoxOkCancel + accept() + + + 123 + 62 + + + 163 + 42 + + + + + bnCancel + clicked() + LoUIMsgBoxOkCancel + reject() + + + 204 + 62 + + + 163 + 42 + + + + + diff --git a/LedOK/LoUIClass/pixbmpshowdialog.cpp b/LedOK/LoUIClass/pixbmpshowdialog.cpp new file mode 100644 index 0000000..3595e66 --- /dev/null +++ b/LedOK/LoUIClass/pixbmpshowdialog.cpp @@ -0,0 +1,40 @@ +#include "pixbmpshowdialog.h" +#include "ui_pixbmpshowdialog.h" +#include +PixbmpShowDialog::PixbmpShowDialog(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::PixbmpShowDialog) +{ + ui->setupUi(this); + +} + +PixbmpShowDialog::~PixbmpShowDialog() +{ + delete ui; +} +void PixbmpShowDialog::ResizeByPixmap(int w,int h) +{ + m_iWidth=w; + m_iHeight=h; + int iWidth=w; + int iHeight=h; + if(iWidthresize(iWidth,iHeight); + else { + if(iWidth>iHeight) + this->resize(rect().height()*iWidth/iHeight,rect().height()); + else + this->resize(rect().width(),rect().width()*iHeight/iWidth); + } +} +void PixbmpShowDialog::paintEvent(QPaintEvent * event) +{ + Q_UNUSED(event); + QPainter painter(this); + //painter.eraseRect(rect()); + // painter.scale(m_PixMap.width(), m_PixMap.height()); + QRectF sourceRt(0,0,m_iWidth,m_iHeight); + painter.drawPixmap(rect(), m_PixMap,sourceRt); + +} diff --git a/LedOK/LoUIClass/pixbmpshowdialog.h b/LedOK/LoUIClass/pixbmpshowdialog.h new file mode 100644 index 0000000..acf1b6a --- /dev/null +++ b/LedOK/LoUIClass/pixbmpshowdialog.h @@ -0,0 +1,30 @@ +#ifndef PIXBMPSHOWDIALOG_H +#define PIXBMPSHOWDIALOG_H + +#include + +namespace Ui { +class PixbmpShowDialog; +} + +class PixbmpShowDialog : public LoQDialog +{ + Q_OBJECT + +public: + explicit PixbmpShowDialog(QWidget *parent = nullptr); + ~PixbmpShowDialog(); + QPixmap m_PixMap; + void ResizeByPixmap(int w,int h); + int m_iWidth; + int m_iHeight; + +public: + virtual void paintEvent(QPaintEvent *); + +private: + Ui::PixbmpShowDialog *ui; + +}; + +#endif // PIXBMPSHOWDIALOG_H diff --git a/LedOK/LoUIClass/pixbmpshowdialog.ui b/LedOK/LoUIClass/pixbmpshowdialog.ui new file mode 100644 index 0000000..028d37b --- /dev/null +++ b/LedOK/LoUIClass/pixbmpshowdialog.ui @@ -0,0 +1,91 @@ + + + PixbmpShowDialog + + + + 0 + 0 + 800 + 600 + + + + Dialog + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 30 + 20 + + + + + 40 + 30 + + + + X + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + pushButton + clicked() + PixbmpShowDialog + close() + + + 199 + 20 + + + 199 + 149 + + + + + diff --git a/LedOK/LoUIClass/qiplineedit.cpp b/LedOK/LoUIClass/qiplineedit.cpp new file mode 100644 index 0000000..6bed804 --- /dev/null +++ b/LedOK/LoUIClass/qiplineedit.cpp @@ -0,0 +1,343 @@ +/* + * 此类的封装参考了:博客网址:http://blog.csdn.net/u011417605,并在此基础上进行修改 + * 1.连续输入 + * 2.连续删除 + * 3.任意位置插入 + * 4.自适应大小变化 + * 5.正则匹配,每个值不大于255.设置IP值时,有正则验证是否是IP格式 + * 实现方法:使用一个大的QLineEdit嵌套四个小的QLineEdit,中间的点是使用paintEvent画出来的。操作是使用eventFilter来进行分发实现的 + * 修改: + * 用QWidget替换原先的__super + * 修改构造函数中的正则匹配 + * 修改小圆点位置和大小 + * 两个QLineEdit之间的空隙,在绘制小圆点之前,把空气用白色背景填充 + * 修改样式表加边框 + * 当输入类似192时,焦点自动跳转到下一个QLineEdit出 + * 修改text()的输出,使输出由原来的1921680127变为192.168.0.127 + * */ + +#include "qiplineedit.h" +#include +#include +#include +#include +#include + +QIPLineEdit::QIPLineEdit(QWidget *parent) + : QLineEdit(parent) +{ + QRegExp rx("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"); + pHBox = new QHBoxLayout(this); + pHBox->setSpacing(SPACE); + pHBox->setContentsMargins(0, 0, 0, 0); + for (int i = 0; i < 4; i++) + { + m_lineEidt[i] = new QLineEdit(this); + m_lineEidt[i]->setFrame(false); + m_lineEidt[i]->setMaxLength(3); + m_lineEidt[i]->setAlignment(Qt::AlignCenter); + m_lineEidt[i]->installEventFilter(this); + m_lineEidt[i]->setValidator(new QRegExpValidator(rx, this)); + m_lineEidt[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + switch (i) + { + case 0: + m_lineEidt[i]->setStyleSheet(QLatin1String( "border:1px solid #536874;\n" "border-left-color: rgb(0, 0, 0);\n" + "border-top-color: rgb(0, 0, 0);\n" "border-bottom-color: rgb(0, 0, 0);\n" "border-right: 0px;\n" + "border-right-color: rgbl(255, 255, 255,0);" "border-radius:0px")); + break; + case 1: + m_lineEidt[i]->setStyleSheet(QLatin1String( "border:1px solid #536874;\n" "border-left-color: rgb(255, 255, 255);\n" + "border-top-color: rgb(0, 0, 0);\n" "border-bottom-color: rgb(0, 0, 0);\n" "border-right: 0px;\n" "border-left: 0px;\n" + "border-right-color: rgb(255, 255, 255);" "border-radius:0px")); + break; + case 2: + m_lineEidt[i]->setStyleSheet(QLatin1String( "border:1px solid #536874;\n" "border-left-color: rgb(255, 255, 255);\n" + "border-top-color: rgb(0, 0, 0);\n" "border-bottom-color: rgb(0, 0, 0);\n" "border-right: 0px;\n" "border-left: 0px;\n" + "border-right-color: rgb(255, 255, 255);" "border-radius:0px")); + break; + case 3: + m_lineEidt[i]->setStyleSheet(QLatin1String( "border:1px solid #536874;\n" "border-left-color: rgb(255, 255, 255);\n" + "border-top-color: rgb(0, 0, 0);\n" "border-bottom-color: rgb(0, 0, 0);\n" "border-left: 0px;\n" + "border-right-color: rgb(0, 0, 0);" "border-radius:0px")); + break; + default: + break; + } + pHBox->addWidget(m_lineEidt[i]); + } + this->setReadOnly(true); + m_Color=Qt::white; + connect(m_lineEidt[0],SIGNAL(textChanged(const QString &)),this,SLOT(OnLineEdit1TextChanged(const QString &))); + connect(m_lineEidt[1],SIGNAL(textChanged(const QString &)),this,SLOT(OnLineEdit2TextChanged(const QString &))); + connect(m_lineEidt[2],SIGNAL(textChanged(const QString &)),this,SLOT(OnLineEdit3TextChanged(const QString &))); + connect(m_lineEidt[3],SIGNAL(textChanged(const QString &)),this,SLOT(OnLineEdit4TextChanged(const QString &))); + +} + +QIPLineEdit::~QIPLineEdit() +{ + m_lineEidt[0]->deleteLater(); + m_lineEidt[1]->deleteLater(); + m_lineEidt[2]->deleteLater(); + m_lineEidt[3]->deleteLater(); + pHBox->deleteLater(); +// delete pHBox; +// delete m_lineEidt[1]; +// delete m_lineEidt[2]; +// delete m_lineEidt[3]; +// delete m_lineEidt[4]; +} +void QIPLineEdit::MySetColor(QColor cr) +{ + m_Color=cr; +} +void QIPLineEdit::OnLineEdit1TextChanged(const QString & strtemp) +{ + if(strtemp.right(1)=="."||strtemp.right(1)=="。") + { + m_lineEidt[0]->setText(strtemp.left(strtemp.length()-1)); + m_lineEidt[0 + 1]->setFocus(); + m_lineEidt[0 + 1]->setCursorPosition(0); + } +} +void QIPLineEdit::OnLineEdit2TextChanged(const QString & strtemp) +{ + if(strtemp.right(1)=="."||strtemp.right(1)=="。") + { + m_lineEidt[1]->setText(strtemp.left(strtemp.length()-1)); + m_lineEidt[1 + 1]->setFocus(); + m_lineEidt[1 + 1]->setCursorPosition(0); + } +} +void QIPLineEdit::OnLineEdit3TextChanged(const QString & strtemp) +{ + if(strtemp.right(1)=="."||strtemp.right(1)=="。") + { + m_lineEidt[2]->setText(strtemp.left(strtemp.length()-1)); + m_lineEidt[2 + 1]->setFocus(); + m_lineEidt[2 + 1]->setCursorPosition(0); + } +} +void QIPLineEdit::OnLineEdit4TextChanged(const QString & strtemp) +{ + if(strtemp.right(1)=="."||strtemp.right(1)=="。") + { + m_lineEidt[3]->setText(strtemp.left(strtemp.length()-1)); + } +} +void QIPLineEdit::paintEvent(QPaintEvent *event) +{ + QWidget::paintEvent(event); + QPainter painter(this); + QBrush brush; + + int width = 0; + for (int i = 0; i < 3; i++) + { + brush.setStyle(Qt::BrushStyle::SolidPattern); + + //将两个lineEdit之间的空隙绘制成白色 + brush.setColor(m_Color); + painter.setPen(m_Color); + painter.setBrush(brush); + painter.drawRect(m_lineEidt[i]->x() + m_lineEidt[i]->width(), m_lineEidt[i]->y(), SPACE, height()); + + //绘制空隙的边框 + painter.setPen(Qt::black); + painter.drawLine(0, 0, this->width(), 0); + painter.drawLine(0, this->height() - 1, this->width(), this->height() - 1); + + //绘制小黑点 + brush.setColor(Qt::black); + painter.setPen(QPen()); + painter.setBrush(brush); + width += m_lineEidt[i]->width() + (i == 0 ? 2 : SPACE);//布局的间隔 + painter.drawEllipse(width, height() / 2 + 4, 1, 1); + } +} + +int QIPLineEdit::getIndex(QLineEdit *pEdit) +{ + int index = -1; + for (int i = 0; i < 4; i++) + { + if (pEdit == m_lineEidt[i]) + index = i; + } + return index; +} + +bool QIPLineEdit::eventFilter(QObject *obj, QEvent *ev) +{ + if (children().contains(obj) && QEvent::KeyPress == ev->type()) + { + QKeyEvent *keyEvent = dynamic_cast(ev); + QLineEdit *pEdit = qobject_cast(obj); + switch (keyEvent->key()) + { + case Qt::Key_0: + case Qt::Key_1: + case Qt::Key_2: + case Qt::Key_3: + case Qt::Key_4: + case Qt::Key_5: + case Qt::Key_6: + case Qt::Key_7: + case Qt::Key_8: + case Qt::Key_9: + { + QString strText = pEdit->text(); + if (pEdit->selectedText().length()) + { + pEdit->text().replace(pEdit->selectedText(), QChar(keyEvent->key())); + } + else if (strText.length() == 2 || (strText.length() < 2 && strText.toInt() * 10 > 255)) + { + int index = getIndex(pEdit); + if (index != -1 && index != 3) + { + m_lineEidt[index + 1]->setFocus(); + m_lineEidt[index + 1]->selectAll(); + } + } + else if (strText.length() == 1 && strText.toInt() * 10 < 255) + { + if (Qt::Key_0 == keyEvent->key() && strText.toInt()) + { + pEdit->setText(strText.insert(pEdit->cursorPosition(), QChar(Qt::Key_0))); + } + } + return QWidget::eventFilter(obj, ev); + } + break; + case Qt::Key_Backspace: + { + QString strText = pEdit->text(); + if (!strText.length() || (strText.length() && !pEdit->cursorPosition())) + { + int index = getIndex(pEdit); + if (index != -1 && index != 0) + { + m_lineEidt[index - 1]->setFocus(); + int length = m_lineEidt[index - 1]->text().length(); + m_lineEidt[index - 1]->setCursorPosition(length ? length : 0); + } + } + return QWidget::eventFilter(obj, ev); + } + break; + case Qt::Key_Left: + { + if (!pEdit->cursorPosition()) + { + int index = getIndex(pEdit); + if (index != -1 && index != 0) + { + m_lineEidt[index - 1]->setFocus(); + int length = m_lineEidt[index - 1]->text().length(); + m_lineEidt[index - 1]->setCursorPosition(length ? length : 0); + } + } + return QWidget::eventFilter(obj, ev); + } + break; + case Qt::Key_Right: + { + if (pEdit->cursorPosition() == pEdit->text().length()) + { + int index = getIndex(pEdit); + if (index != -1 && index != 3) + { + m_lineEidt[index + 1]->setFocus(); + m_lineEidt[index + 1]->setCursorPosition(0); + } + } + return QWidget::eventFilter(obj, ev); + } + break; +// case Qt::Key_Period: +// { +// if (pEdit->cursorPosition() == pEdit->text().length()) +// { +// int index = getIndex(pEdit); +// if (index != -1 && index != 3) +// { +// m_lineEidt[index + 1]->setFocus(); +// m_lineEidt[index + 1]->setCursorPosition(0); +// pEdit->setText(pEdit->text().left(pEdit->text().length()-1)); +// } +// } +// return QWidget::eventFilter(obj, ev); +// } + break; + default: + break; + } + } + return false; +} + +//void QIPLineEdit::keyPressEvent(QKeyEvent *e) +//{ +// int key=e->key(); +// QMessageBox::warning(this, "Attention", "Your IP Address is Invalid!", QMessageBox::StandardButton::Ok); +// if(key==Qt::Key_Period ) +// { +// // QLineEdit::keyPressEvent(e); //调用父类键盘事件处理函数 +// QMessageBox::warning(this, "Attention", "Your IP Address is Invalid!", QMessageBox::StandardButton::Ok); + +// } +// else +// { +// QLineEdit::keyPressEvent(e); +// } +//} +void QIPLineEdit::setText(const QString &strIP) +{ + if (!isTextValid(strIP)) + { + QMessageBox::warning(this, "Attention", "Your IP Address is Invalid!["+strIP+"]", QMessageBox::StandardButton::Ok); + return; + } + else + { + int i = 0; + QStringList ipList = strIP.split("."); + foreach (QString ip, ipList) + { + m_lineEidt[i]->setText(ip); + i++; + } + } +} + +bool QIPLineEdit::isTextValid(const QString &strIP) +{ + QRegExp rx2("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b"); + if (!rx2.exactMatch(strIP)) + return false; + return true; +} + +QString QIPLineEdit::text() const +{ + QString strIP; + for (int i = 0; i < 4; i++) + { + strIP.append(m_lineEidt[i]->text()); + if (i < 3) + { + strIP.append("."); + } + } + return strIP; +} +void QIPLineEdit::MyClear() +{ + m_lineEidt[0]->clear(); + m_lineEidt[1]->clear(); + m_lineEidt[2]->clear(); + m_lineEidt[3]->clear(); +} diff --git a/LedOK/LoUIClass/qiplineedit.h b/LedOK/LoUIClass/qiplineedit.h new file mode 100644 index 0000000..e0efd0c --- /dev/null +++ b/LedOK/LoUIClass/qiplineedit.h @@ -0,0 +1,41 @@ +#ifndef QIPLINEEDIT_H +#define QIPLINEEDIT_H + +#include +#include +#include +#define SPACE 5 + +class QIPLineEdit : public QLineEdit +{ + Q_OBJECT + +public: + QIPLineEdit(QWidget *parent = nullptr); + ~QIPLineEdit(); + + void setText(const QString &strIP); + QString text() const; + void MyClear(); + void MySetColor(QColor cr); + +protected: + void paintEvent(QPaintEvent *event); + bool eventFilter(QObject *obj, QEvent *ev); + + int getIndex(QLineEdit *pEdit); + bool isTextValid(const QString &strIP); +// virtual void keyPressEvent(QKeyEvent *e); +protected slots: + void OnLineEdit1TextChanged(const QString & strtemp); + void OnLineEdit2TextChanged(const QString & strtemp); + void OnLineEdit3TextChanged(const QString & strtemp); + void OnLineEdit4TextChanged(const QString & strtemp); + +private: + QLineEdit *m_lineEidt[4]; + QHBoxLayout *pHBox; + QColor m_Color; +}; + +#endif // QIPLINEEDIT_H diff --git a/LedOK/LoUIClass/softconfigdialog.cpp b/LedOK/LoUIClass/softconfigdialog.cpp new file mode 100644 index 0000000..2d20dc9 --- /dev/null +++ b/LedOK/LoUIClass/softconfigdialog.cpp @@ -0,0 +1,102 @@ +#include "softconfigdialog.h" +#include "ui_softconfigdialog.h" +#include "loappconfig.h" +#include +SoftConfigDialog::SoftConfigDialog(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::SoftConfigDialog) +{ + ui->setupUi(this); + LoAppConfig *cfg = LoAppConfig::getInstance(); + + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); + if(settings->value("videoconvert").isValid()) + { + if(settings->value("videoconvert").toBool()) + { + ui->checkBoxVideoConvert->setChecked(true); + } + else { + ui->checkBoxVideoConvert->setChecked(false); + + } + } + else { + ui->checkBoxVideoConvert->setChecked(false); + + } + if(settings->value("TextAntialiasing").isValid()) + { + if(settings->value("TextAntialiasing").toBool()) + { + ui->checkBoxFontGuanghua->setChecked(true); + } + else { + ui->checkBoxFontGuanghua->setChecked(false); + + } + } + else { + ui->checkBoxFontGuanghua->setChecked(false); + + } + //元亨 + // ui->checkBoxGuangYingPin->setVisible(false); + if(settings->value("GuangYingPin").isValid()) + { + if(settings->value("GuangYingPin").toBool()) + { + ui->checkBoxGuangYingPin->setChecked(true); + } + else { + ui->checkBoxGuangYingPin->setChecked(false); + + } + } + else { + ui->checkBoxGuangYingPin->setChecked(false); + + } + + connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(OnOK())); + +} + +SoftConfigDialog::~SoftConfigDialog() +{ + delete ui; +} +void SoftConfigDialog::OnOK() +{ + LoAppConfig *cfg = LoAppConfig::getInstance(); + + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); + if(ui->checkBoxVideoConvert->isChecked()) + { + settings->setValue("videoconvert",true); + } + else { + settings->setValue("videoconvert",false); + + } + m_globBoolFontantialiasing=ui->checkBoxFontGuanghua->isChecked(); + if(m_globBoolFontantialiasing) + { + settings->setValue("TextAntialiasing",true); + } + else { + settings->setValue("TextAntialiasing",false); + + } + m_globBoolGuangYingPin=ui->checkBoxGuangYingPin->isChecked(); + if(m_globBoolGuangYingPin) + { + settings->setValue("GuangYingPin",true); + } + else { + settings->setValue("GuangYingPin",false); + + } + + QDialog::accept(); +} diff --git a/LedOK/LoUIClass/softconfigdialog.h b/LedOK/LoUIClass/softconfigdialog.h new file mode 100644 index 0000000..c2af113 --- /dev/null +++ b/LedOK/LoUIClass/softconfigdialog.h @@ -0,0 +1,25 @@ +#ifndef SOFTCONFIGDIALOG_H +#define SOFTCONFIGDIALOG_H + +#include + +namespace Ui { +class SoftConfigDialog; +} + +class SoftConfigDialog : public LoQDialog +{ + Q_OBJECT + +public: + explicit SoftConfigDialog(QWidget *parent = nullptr); + ~SoftConfigDialog(); + +private: + Ui::SoftConfigDialog *ui; + +protected slots: + void OnOK(); +}; + +#endif // SOFTCONFIGDIALOG_H diff --git a/LedOK/LoUIClass/softconfigdialog.ui b/LedOK/LoUIClass/softconfigdialog.ui new file mode 100644 index 0000000..3c6d1d2 --- /dev/null +++ b/LedOK/LoUIClass/softconfigdialog.ui @@ -0,0 +1,168 @@ + + + SoftConfigDialog + + + + 0 + 0 + 399 + 259 + + + + Dialog + + + + + 10 + 10 + 382 + 241 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 0 + + + + + Software Configuration + + + Qt::AlignCenter + + + + + + + + 30 + 24 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + Qt::Horizontal + + + + + + + + + Video convert format + + + + + + + + + 0 + + + + + + + + Text antialiasing + + + + + + + + 0 + 0 + + + + color: #FF0000; + + + TextAntilaTip + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + GuangYinPin + + + + + + + OK + + + + + + + + + + pushButton + clicked() + SoftConfigDialog + close() + + + 365 + 32 + + + 199 + 90 + + + + + diff --git a/LedOK/LoUIClass/switchcontrol.cpp b/LedOK/LoUIClass/switchcontrol.cpp new file mode 100644 index 0000000..d5784a9 --- /dev/null +++ b/LedOK/LoUIClass/switchcontrol.cpp @@ -0,0 +1,484 @@ +#include "switchcontrol.h" +#include "qpainter.h" +#include +#include "qevent.h" +#include "qtimer.h" +#include "qdebug.h" + +SwitchControl::SwitchControl(QWidget *parent): QWidget(parent) +{ + checked = false; + buttonStyle = ButtonStyle_Rect; + + bgColorOff = QColor(225, 225, 225); + bgColorOn = QColor(250, 250, 250); + + sliderColorOff = QColor(100, 100, 100); + sliderColorOn = QColor(100, 184, 255); + + textColorOff = QColor(255, 255, 255); + textColorOn = QColor(10, 10, 10); + + textOff = ""; + textOn = ""; + + imageOff = ":/image/btncheckoff1.png"; + imageOn = ":/image/btncheckon1.png"; + + space = 2; + rectRadius = 5; + + step = width() / 50; + startX = 0; + endX = 0; + + timer = new QTimer(this); + timer->setInterval(5); + connect(timer, SIGNAL(timeout()), this, SLOT(updateValue())); + + setFont(QFont("Microsoft Yahei", 10)); +} + +SwitchControl::~SwitchControl() +{ + +} + +void SwitchControl::mousePressEvent(QMouseEvent *) +{ + checked = !checked; + + //每次移动的步长为宽度的 50分之一 + step = width() / 50; + + //状态切换改变后自动计算终点坐标 + if (checked) { + if (buttonStyle == ButtonStyle_Rect) { + endX = width() - width() / 2; + } else if (buttonStyle == ButtonStyle_CircleIn) { + endX = width() - height(); + } else if (buttonStyle == ButtonStyle_CircleOut) { + endX = width() - height() + space; + } + } else { + endX = 0; + } + + timer->start(); + emit checkedChanged(checked); +} + +void SwitchControl::resizeEvent(QResizeEvent *) +{ + //每次移动的步长为宽度的 50分之一 + step = width() / 50; + + //尺寸大小改变后自动设置起点坐标为终点 + if (checked) { + if (buttonStyle == ButtonStyle_Rect) { + startX = width() - width() / 2; + } else if (buttonStyle == ButtonStyle_CircleIn) { + startX = width() - height(); + } else if (buttonStyle == ButtonStyle_CircleOut) { + startX = width() - height() + space; + } + } else { + startX = 0; + } + + update(); +} + +void SwitchControl::paintEvent(QPaintEvent *) +{ + //绘制准备工作,启用反锯齿 + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + + if (buttonStyle == ButtonStyle_Image) { + //绘制图片 + drawImage(&painter); + } else { + //绘制背景 + drawBg(&painter); + //绘制滑块 + drawSlider(&painter); + //绘制文字 + drawText(&painter); + } +} + +void SwitchControl::drawBg(QPainter *painter) +{ + painter->save(); + painter->setPen(Qt::NoPen); + + if (!checked) { + painter->setBrush(bgColorOff); + } else { + painter->setBrush(bgColorOn); + } + + if (buttonStyle == ButtonStyle_Rect) { + painter->drawRoundedRect(rect(), rectRadius, rectRadius); + } else if (buttonStyle == ButtonStyle_CircleIn) { + QRect rect(0, 0, width(), height()); + //半径为高度的一半 + int radius = rect.height() / 2; + //圆的宽度为高度 + int circleWidth = rect.height(); + + QPainterPath path; + path.moveTo(radius, rect.left()); + path.arcTo(QRectF(rect.left(), rect.top(), circleWidth, circleWidth), 90, 180); + path.lineTo(rect.width() - radius, rect.height()); + path.arcTo(QRectF(rect.width() - rect.height(), rect.top(), circleWidth, circleWidth), 270, 180); + path.lineTo(radius, rect.top()); + + painter->drawPath(path); + } else if (buttonStyle == ButtonStyle_CircleOut) { + QRect rect(space, space, width() - space * 2, height() - space * 2); + painter->drawRoundedRect(rect, rectRadius, rectRadius); + } + + painter->restore(); +} + +void SwitchControl::drawSlider(QPainter *painter) +{ + painter->save(); + painter->setPen(Qt::NoPen); + + if (!checked) { + painter->setBrush(sliderColorOff); + } else { + painter->setBrush(sliderColorOn); + } + + if (buttonStyle == ButtonStyle_Rect) { + int sliderWidth = width() / 2 - space * 2; + int sliderHeight = height() - space * 2; + QRect sliderRect(startX + space, space, sliderWidth , sliderHeight); + painter->drawRoundedRect(sliderRect, rectRadius, rectRadius); + } else if (buttonStyle == ButtonStyle_CircleIn) { + QRect rect(0, 0, width(), height()); + int sliderWidth = rect.height() - space * 2; + QRect sliderRect(startX + space, space, sliderWidth, sliderWidth); + painter->drawEllipse(sliderRect); + } else if (buttonStyle == ButtonStyle_CircleOut) { + QRect rect(0, 0, width() - space, height() - space); + int sliderWidth = rect.height(); + QRect sliderRect(startX, space / 2, sliderWidth, sliderWidth); + painter->drawEllipse(sliderRect); + } + + painter->restore(); +} + +void SwitchControl::drawText(QPainter *painter) +{ + painter->save(); + + if (!checked) { + painter->setPen(textColorOff); + painter->drawText(width() / 2, 0, width() / 2 - space, height(), Qt::AlignCenter, textOff); + } else { + painter->setPen(textColorOn); + painter->drawText(0, 0, width() / 2 + space * 2, height(), Qt::AlignCenter, textOn); + } + + painter->restore(); +} + +void SwitchControl::drawImage(QPainter *painter) +{ + painter->save(); + + QPixmap pix; + + if (!checked) { + pix = QPixmap(imageOff); + } else { + pix = QPixmap(imageOn); + } + + //自动等比例平滑缩放居中显示 + int targetWidth = pix.width(); + int targetHeight = pix.height(); + pix = pix.scaled(targetWidth, targetHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation); + + int pixX = rect().center().x() - targetWidth / 2; + int pixY = rect().center().y() - targetHeight / 2; + QPoint point(pixX, pixY); + painter->drawPixmap(point, pix); + + painter->restore(); +} + +void SwitchControl::updateValue() +{ + if (checked) { + if (startX < endX) { + startX = startX + step; + } else { + startX = endX; + timer->stop(); + } + } else { + if (startX > endX) { + startX = startX - step; + } else { + startX = endX; + timer->stop(); + } + } + + update(); +} + +void SwitchControl::setChecked(bool checked) +{ + if (this->checked != checked) { + this->checked = checked; + emit checkedChanged(checked); + update(); + } +} +void SwitchControl::setCheckedStatus(bool checked) +{ + if (this->checked != checked) { + this->checked = checked; + + } + update(); + step = width() / 50; + //状态切换改变后自动计算终点坐标 + if (checked) { + if (buttonStyle == ButtonStyle_Rect) { + endX = width() - width() / 2; + } else if (buttonStyle == ButtonStyle_CircleIn) { + endX = width() - height(); + } else if (buttonStyle == ButtonStyle_CircleOut) { + endX = width() - height() + space; + } + } else { + endX = 0; + } + + timer->start(); + +} +void SwitchControl::setButtonStyle(SwitchControl::ButtonStyle buttonStyle) +{ + this->buttonStyle = buttonStyle; + update(); +} + +void SwitchControl::setBgColor(QColor bgColorOff, QColor bgColorOn) +{ + this->bgColorOff = bgColorOff; + this->bgColorOn = bgColorOn; + update(); +} + +void SwitchControl::setSliderColor(QColor sliderColorOff, QColor sliderColorOn) +{ + this->sliderColorOff = sliderColorOff; + this->sliderColorOn = sliderColorOn; + update(); +} + +void SwitchControl::setTextColor(QColor textColorOff, QColor textColorOn) +{ + this->textColorOff = textColorOff; + this->textColorOn = textColorOn; + update(); +} + +void SwitchControl::setText(QString textOff, QString textOn) +{ + this->textOff = textOff; + this->textOn = textOn; + update(); +} + +void SwitchControl::setImage(QString imageOff, QString imageOn) +{ + this->imageOff = imageOff; + this->imageOn = imageOn; + update(); +} + +void SwitchControl::setSpace(int space) +{ + this->space = space; + update(); +} + +void SwitchControl::setRectRadius(int rectRadius) +{ + this->rectRadius = rectRadius; + update(); +} +/*#include +#include + + +SwitchControl::SwitchControl(QWidget *parent) + : QWidget(parent) +{ + m_nHeight=16; + m_bChecked=false; + m_radius=8.0; + m_nMargin=5; + m_checkedColor=QColor(0, 150, 136); + m_thumbColor=Qt::white; + m_disabledColor=QColor(190, 190, 190); + m_background=Qt::black; + setAttribute(Qt::WA_DeleteOnClose); + // 鼠标滑过光标形状 - 手型 + setCursor(Qt::PointingHandCursor); + + // 连接信号槽 + connect(&m_timer, SIGNAL(timeout()), this, SLOT(onTimeout())); +} + +// 绘制开关 +void SwitchControl::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + QPainter painter(this); + painter.setPen(Qt::NoPen); + painter.setRenderHint(QPainter::Antialiasing); + + QPainterPath path; + QColor background; + QColor thumbColor; + qreal dOpacity; + if (isEnabled()) { // 可用状态 + if (m_bChecked) { // 打开状态 + background = m_checkedColor; + thumbColor = m_checkedColor; + dOpacity = 0.600; + } else { //关闭状态 + background = m_background; + thumbColor = m_thumbColor; + dOpacity = 0.800; + } + } else { // 不可用状态 + background = m_background; + dOpacity = 0.260; + thumbColor = m_disabledColor; + } + // 绘制大椭圆 + painter.setBrush(background); + painter.setOpacity(dOpacity); + path.addRoundedRect(QRectF(m_nMargin, m_nMargin, width() - 2 * m_nMargin-(m_nHeight / 2), height() - 2 * m_nMargin), m_radius, m_radius); + painter.drawPath(path.simplified()); + + // 绘制小椭圆 + painter.setBrush(thumbColor); + painter.setOpacity(1.0); + painter.drawEllipse(QRectF(m_nX - (m_nHeight / 2), m_nY - (m_nHeight / 2), height(), height())); +} + +// 鼠标按下事件 +void SwitchControl::mousePressEvent(QMouseEvent *event) +{ + if (isEnabled()) { + if (event->buttons() & Qt::LeftButton) { + event->accept(); + } else { + event->ignore(); + } + } +} + +// 鼠标释放事件 - 切换开关状态、发射toggled()信号 +void SwitchControl::mouseReleaseEvent(QMouseEvent *event) +{ + if (isEnabled()) { + if ((event->type() == QMouseEvent::MouseButtonRelease) && (event->button() == Qt::LeftButton)) { + event->accept(); + m_bChecked = !m_bChecked; + emit toggled(m_bChecked); + m_timer.start(10); + } else { + event->ignore(); + } + } +} + +// 大小改变事件 +void SwitchControl::resizeEvent(QResizeEvent *event) +{ + m_nX = m_nHeight / 2; + m_nY = m_nHeight / 2; + QWidget::resizeEvent(event); +} + +// 默认大小 +QSize SwitchControl::sizeHint() const +{ + return minimumSizeHint(); +} + +// 最小大小 +QSize SwitchControl::minimumSizeHint() const +{ + return QSize(2 * (m_nHeight + m_nMargin), m_nHeight + 2 * m_nMargin); +} + +// 切换状态 - 滑动 +void SwitchControl::onTimeout() +{ + if (m_bChecked) { + m_nX += 1; + if (m_nX >= width() - m_nHeight*2) + m_timer.stop(); + } else { + m_nX -= 1; + if (m_nX <= m_nHeight / 2) + m_timer.stop(); + } + update(); +} + +// 返回开关状态 - 打开:true 关闭:false +bool SwitchControl::isToggled() const +{ + return m_bChecked; +} + +// 设置开关状态 +void SwitchControl::setToggle(bool checked) +{ + m_bChecked = checked; + m_timer.start(10); +} + +// 设置背景颜色 +void SwitchControl::setBackgroundColor(QColor color) +{ + m_background = color; +} +// 设置拇指颜色 +void SwitchControl::setthumbColor(QColor color) +{ + //拇指颜色 + m_thumbColor = color; +} + +// 设置选中颜色 +void SwitchControl::setCheckedColor(QColor color) +{ + m_checkedColor = color; +} + +// 设置不可用颜色 +void SwitchControl::setDisbaledColor(QColor color) +{ + m_disabledColor = color; +} +*/ diff --git a/LedOK/LoUIClass/switchcontrol.h b/LedOK/LoUIClass/switchcontrol.h new file mode 100644 index 0000000..e65a198 --- /dev/null +++ b/LedOK/LoUIClass/switchcontrol.h @@ -0,0 +1,230 @@ +#ifndef SWITCHCONTROL_H +#define SWITCHCONTROL_H +/** + * 作者:feiyangqingyun(QQ:517216493) 2016-11-6 + * 1:可设置开关按钮的样式 圆角矩形/内圆形/外圆形/图片 + * 2:可设置选中和未选中时的背景颜色 + * 3:可设置选中和未选中时的滑块颜色 + * 4:可设置显示的文本 + * 5:可设置滑块离背景的间隔 + * 6:可设置圆角角度 + */ + +#include + +class QTimer; + +class SwitchControl: public QWidget +{ + Q_OBJECT +public: + enum ButtonStyle { + ButtonStyle_Rect = 0, //圆角矩形 + ButtonStyle_CircleIn = 1, //内圆形 + ButtonStyle_CircleOut = 2,//外圆形 + ButtonStyle_Image = 3 //图片 + }; + + SwitchControl(QWidget *parent = 0); + ~SwitchControl(); + +protected: + void mousePressEvent(QMouseEvent *); + void resizeEvent(QResizeEvent *); + void paintEvent(QPaintEvent *); + void drawBg(QPainter *painter); + void drawSlider(QPainter *painter); + void drawText(QPainter *painter); + void drawImage(QPainter *painter); + +private: + bool checked; //是否选中 + ButtonStyle buttonStyle; //开关按钮样式 + + QColor bgColorOff; //关闭时背景颜色 + QColor bgColorOn; //打开时背景颜色 + + QColor sliderColorOff; //关闭时滑块颜色 + QColor sliderColorOn; //打开时滑块颜色 + + QColor textColorOff; //关闭时文本颜色 + QColor textColorOn; //打开时文本颜色 + + QString textOff; //关闭时显示的文字 + QString textOn; //打开时显示的文字 + + QString imageOff; //关闭时显示的图片 + QString imageOn; //打开时显示的图片 + + int space; //滑块离背景间隔 + int rectRadius; //圆角角度 + + int step; //每次移动的步长 + int startX; //滑块开始X轴坐标 + int endX; //滑块结束X轴坐标 + QTimer *timer; //定时器绘制 + +private slots: + void updateValue(); + +public: + bool getChecked()const + { + return checked; + } + ButtonStyle getButtonStyle()const + { + return buttonStyle; + } + + QColor getBgColorOff()const + { + return bgColorOff; + } + QColor getBgColorOn()const + { + return bgColorOn; + } + + QColor getSliderColorOff()const + { + return sliderColorOff; + } + QColor getSliderColorOn()const + { + return sliderColorOn; + } + + QColor getTextColorOff()const + { + return textColorOff; + } + QColor getTextColorOn()const + { + return textColorOn; + } + + QString getTextOff()const + { + return textOff; + } + QString getTextOn()const + { + return textOn; + } + + QString getImageOff()const + { + return imageOff; + } + QString getImageOn()const + { + return imageOn; + } + + int getSpace()const + { + return space; + } + int getRectRadius()const + { + return rectRadius; + } + +public slots: + //设置是否选中 + void setChecked(bool checked); + void setCheckedStatus(bool checked); + //设置风格样式 + void setButtonStyle(ButtonStyle buttonStyle); + + //设置背景颜色 + void setBgColor(QColor bgColorOff, QColor bgColorOn); + //设置滑块颜色 + void setSliderColor(QColor sliderColorOff, QColor sliderColorOn); + //设置文本颜色 + void setTextColor(QColor textColorOff, QColor textColorOn); + + //设置文本 + void setText(QString textOff, QString textOn); + + //设置背景图片 + void setImage(QString imageOff, QString imageOn); + + //设置间隔 + void setSpace(int space); + //设置圆角角度 + void setRectRadius(int rectRadius); + +signals: + void checkedChanged(bool checked); +}; + +/* +#include +#include + +class SwitchControl : public QWidget +{ + Q_OBJECT + +public: + explicit SwitchControl(QWidget *parent = nullptr); + + // 返回开关状态 - 打开:true 关闭:false + bool isToggled() const; + + // 设置开关状态 + void setToggle(bool checked); + + // 设置背景颜色 + void setBackgroundColor(QColor color); + + // 设置选中颜色 + void setCheckedColor(QColor color); + + // 设置不可用颜色 + void setDisbaledColor(QColor color); + // 设置拇指颜色 + void setthumbColor(QColor color); +protected: + // 绘制开关 + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; + + // 鼠标按下事件 + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + + // 鼠标释放事件 - 切换开关状态、发射toggled()信号 + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + + // 大小改变事件 + void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; + + // 缺省大小 + QSize sizeHint() const Q_DECL_OVERRIDE; + QSize minimumSizeHint() const Q_DECL_OVERRIDE; + +signals: + // 状态改变时,发射信号 + void toggled(bool checked); + +private slots: + // 状态切换时,用于产生滑动效果 + void onTimeout(); + +private: + bool m_bChecked=false; //是否选中 + QColor m_background; //背景颜色 + QColor m_checkedColor; //选中颜色 + QColor m_disabledColor; //不可用颜色 + QColor m_thumbColor; //拇指颜色 + qreal m_radius; //圆角 + qreal m_nX; //x点坐标 + qreal m_nY; //y点坐标 + qint16 m_nHeight=20; //高度 + qint16 m_nMargin=5; //外边距 + QTimer m_timer; //定时器 + +};*/ + +#endif // SWITCHCONTROL_H diff --git a/LedOK/LoUIClass/taesclass.cpp b/LedOK/LoUIClass/taesclass.cpp new file mode 100644 index 0000000..7af2aa5 --- /dev/null +++ b/LedOK/LoUIClass/taesclass.cpp @@ -0,0 +1,472 @@ +#include "TAesClass.h" + +Aes::~Aes() +{ + +} +Aes::Aes() +{ + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//构造函数 +Aes::Aes(int keysize,unsigned char* keyBytes) +{ + SetNbNkNr(keysize); //设置密钥块数,轮数 + memcpy(key,keyBytes,keysize); //字符串拷贝函数,把keyBytes的keysize个字符复制到key中 + KeyExpansion(); //密钥扩展,必须提前做的初始化 +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::SetNbNkNr(int keySize) +{ + Nb=4; + if(keySize==Bits128) + { + Nk=4; //4*4字节,128位密钥,10轮加密 + Nr=10; + } + else if(keySize==Bits192) + { + Nk=6; //6*4字节,192位密钥,12轮加密 + Nr=12; + } + else if(keySize==Bits256) + { + Nk=8; //8*4字节,256位密钥,14轮加密 + Nr=14; + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::KeyExpansion() +{ + + memset(w,0,16*15); + for(int row=0;row 6 && (row % Nk == 4) ) //这个还没有搞清楚 + { + temp = SubWord(temp); + } + + // w[row] = w[row-Nk] xor temp + w[4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] ); + w[4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] ); + w[4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] ); + w[4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] ); + } // for loop + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//密钥移位函数 +unsigned char* Aes::RotWord(unsigned char* word) +{ + byte* temp = new byte[4]; + temp[0] = word[1]; + temp[1] = word[2]; + temp[2] = word[3]; + temp[3] = word[0]; + return temp; +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//密钥字代换函数 +unsigned char* Aes::SubWord(unsigned char* word) +{ + byte* temp = new byte[4]; + for(int j=0;j<4;j++) + { + temp[j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)]; //实际上也可以写成AesSbox[[j]];因为两者相等 + } + return temp; + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//Aes加密函数 +void Aes::Cipher(unsigned char* input, unsigned char* output) +{ + memset(&State[0][0],0,16); + for(int i=0;i<4*Nb;i++) //这里是先写列后写行的,即输入是一列一列的进来的 + { + State[i%4][i/4]=input[i]; //换成先写行后写列也是可以的,只要在输出时也是这样就可以了 + } + AddRoundKey(0); //轮密钥加 + + for (int round = 1; round <= (Nr - 1); round++) // main round loop + { + SubBytes(); //字节代换 + ShiftRows(); //行移位 + MixColumns(); //列混淆 + AddRoundKey(round); //轮密钥加 + } // main round loop + + SubBytes(); //字节代换 + ShiftRows(); //行移位 + AddRoundKey(Nr); //轮密钥加 + + // output = state + for (int i = 0; i < (4 * Nb); i++) + { + output[i] = State[i % 4][ i / 4]; + } + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//Aes解密函数 +void Aes::InvCipher(unsigned char* input,unsigned char* output) +{ + memset(&State[0][0],0,16); + for (int i = 0; i < (4 * Nb); i++) + { + State[i % 4][ i / 4] = input[i]; + } + + AddRoundKey(Nr); + + for (int round = Nr-1; round >= 1; round--) // main round loop + { + InvShiftRows(); + InvSubBytes(); + AddRoundKey(round); + InvMixColumns(); + } // end main round loop for InvCipher + + InvShiftRows(); + InvSubBytes(); + AddRoundKey(0); + + // output = state + for (int i = 0; i < (4 * Nb); i++) + { + output[i] = State[i % 4][ i / 4]; + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//轮密钥加 +void Aes::AddRoundKey(int round) +{ + int i,j; //i行 j列 //因为密钥w是一列一列排列的,即 k0 k4 k8 k12 + for(j=0;j<4;j++) // k1 k5 k9 k13 + { // k2 k6 k10k14 + for(i=0;i<4;i++) // k3 k7 k11k15 + { // 所以i行j列的下标是4*((round*4)+j)+i即16*round+4*j+i + State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]); + } + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +//字节代换函数 +void Aes::SubBytes() //Page 103 +{ + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + State[i][j]=AesSbox[State[i][j]]; + //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j] + + + } + } +} + +void Aes::InvSubBytes() +{ + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + State[i][j]=AesiSbox[State[i][j]]; //因为 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j] + } + } + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::ShiftRows() +{ + unsigned char temp[4*4]; //Page105 + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + temp[4*i+j]=State[i][j]; + } + } + for(i=1;i<4;i++) + { + for(j=0;j<4;j++) + { + if(i==1)State[i][j]=temp[4*i+(j+1)%4]; //第一行左移1位 + else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行左移2位 + else if(i==3)State[i][j]=temp[4*i+(j+3)%4]; //第三行左移3位 + } + } + +} +void Aes::InvShiftRows() +{ + unsigned char temp[4*4]; + int i,j; + for(j=0;j<4;j++) + { + for(i=0;i<4;i++) + { + temp[4*i+j]=State[i][j]; + } + } + for(i=1;i<4;i++) + { + for(j=0;j<4;j++) + { + //if(i==1)State[i][j]=temp[4*i+(j-1)%4]; 在此犯了一个错误 -1%4=-1 而不是3,所以采用了下面再加一个4的做法 + if(i==1)State[i][j]=temp[4*i+(j+3)%4]; //第一行右移1位 j-1+4=j+3 + else if(i==2)State[i][j]=temp[4*i+(j+2)%4]; //第二行右移2位 j-2+4=j+2 + else if(i==3)State[i][j]=temp[4*i+(j+1)%4]; //第三行右移3位 j-3+4=j+2 + } + } + +} +//////////////////////////////////////////////////////////////////////////////////////////////// +void Aes::MixColumns() +{ + unsigned char temp[4*4]; + int i,j; + for(j=0;j<4;j++) //2 3 1 1 列混淆矩阵 Page107 + { //1 2 3 1 + for(i=0;i<4;i++) //1 1 2 3 + { //3 1 1 2 + temp[4*i+j]=State[i][j]; + } + } + for(j=0;j<4;j++) + { + State[0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^ + (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); + State[1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^ + (int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) ); + State[2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ + (int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) ); + State[3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^ + (int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) ); + } + +} +void Aes::InvMixColumns() +{ + unsigned char temp[4*4]; + int i,j; + for (i = 0; i < 4; i++) // copy State into temp[] + { + for (j = 0; j < 4; j++) //0e 0b 0d 09 逆变换矩阵 Page108 + { //09 0e 0b 0d + temp[4*i+j] = State[i][j]; //0d 09 0e 0b + } //0b 0d 09 0e + } + + for (j = 0; j < 4; j++) + { + State[0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^ + (int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) ); + State[1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^ + (int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) ); + State[2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^ + (int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) ); + State[3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^ + (int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) ); + } +} +//////////////////////////////////////////////////////////////////////////////////////////////// +unsigned char Aes::gfmultby01(unsigned char b) +{ + return b; +} +unsigned char Aes::gfmultby02(unsigned char b) +{ + if (b < 0x80) + return (unsigned char)(int)(b <<1); + else + return (unsigned char)( (int)(b << 1) ^ (int)(0x1b) ); +} + +unsigned char Aes::gfmultby03(unsigned char b) +{ + return (unsigned char) ( (int)gfmultby02(b) ^ (int)b ); +} + +unsigned char Aes::gfmultby09(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b ); +} + +unsigned char Aes::gfmultby0b(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ + (int)gfmultby02(b) ^ (int)b ); +} + +unsigned char Aes::gfmultby0d(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ + (int)gfmultby02(gfmultby02(b)) ^ (int)(b) ); +} + +unsigned char Aes::gfmultby0e(unsigned char b) +{ + return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ + (int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) ); +} + +TAesClass::TAesClass() +{ + m_lpAes=NULL; + InitializePrivateKey(16,(unsigned char*)"\x79\x76\x68\x6B\x77\x66\x6E\x68\x72\x65\x73\x63\x6C\x6B\x70\x6E"); +} + +TAesClass::~TAesClass() +{ + if (m_lpAes!=NULL) + { + delete m_lpAes; + } +} +//------------------------------------------------------------------------------------------------------------ +// 编写人员:wfnhddd +// +// 函数名称:InitializeAes +// +// 函数描述:初始化AES 密钥,密钥用于加密解密 +// +// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 +// +// 返回数值:无 +// +// 最近修改:2009 年 08 月 07 日 +//------------------------------------------------------------------------------------------------------------ + + +VOID TAesClass::InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes) +{ + if (m_lpAes) + { + delete m_lpAes; + m_lpAes=NULL; + } + m_lpAes=new Aes(KeySize,KeyBytes); + +} + +//------------------------------------------------------------------------------------------------------------ +// 编写人员:wfnhddd +// +// 函数名称:OnAesEncrypt +// +// 函数描述:用AES加密算法加密数据 +// +// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 +// +// 返回数值:加密后的数据大小 ,错误返回值 0 +// +// 最近修改:2009 年 08 月 07 日 +//------------------------------------------------------------------------------------------------------------ + +DWORD TAesClass::OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer) +{ + DWORD OutLength=0; + if (m_lpAes==NULL||OutBuffer==NULL) + { + return 0; + } + + UCHAR *lpCurInBuff=(UCHAR *)InBuffer; + UCHAR *lpCurOutBuff=(UCHAR *)OutBuffer; + long blocknum=InLength/16; + long leftnum=InLength%16; + for(long i=0;iCipher(lpCurInBuff,lpCurOutBuff); + lpCurInBuff+=16; + lpCurOutBuff+=16; + OutLength+=16; + } + if(leftnum) //多余出leftnum 字节 则加密时 多出16-leftnum 个字节 + { + UCHAR inbuff[16]; + memset(inbuff,0,16); + memcpy(inbuff,lpCurInBuff,leftnum); + m_lpAes->Cipher(inbuff,lpCurOutBuff); + lpCurOutBuff+=16; + OutLength+=16; + } + //新增16个字节,用以确定增加的字节数 + UCHAR extrabuff[16]; + memset(extrabuff,0,16); + *((LPDWORD)extrabuff)=16+(16-leftnum)%16; //多出16+(16-leftnum)%16个字节 + m_lpAes->Cipher(extrabuff,lpCurOutBuff); + OutLength+=16; + return OutLength; + +} + + +//------------------------------------------------------------------------------------------------------------ +// 编写人员:wfnhddd +// +// 函数名称:OnAesUncrypt +// +// 函数描述:用AES加密算法解密数据 +// +// 调用参数:详细说明参考 MSDN 中的相关描述或相关的开发文档 +// +// 返回数值:解密后的数据大小 ,错误返回值 0 +// +// 最近修改:2009 年 08 月 07 日 +//------------------------------------------------------------------------------------------------------------ +DWORD TAesClass::OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer) +{ + DWORD OutLength=0; + if (m_lpAes==NULL||OutBuffer==NULL) + { + return 0; + } + UCHAR *lpCurInBuff=(UCHAR *)InBuffer; + UCHAR *lpCurOutBuff=(UCHAR *)OutBuffer; + long blocknum=InLength/16; + long leftnum=InLength%16; + if(leftnum) + { + return 0; + } + for(long i=0;iInvCipher(lpCurInBuff,lpCurOutBuff); + lpCurInBuff+=16; + lpCurOutBuff+=16; + OutLength+=16; + } + + UCHAR *lpExtraInBuff=lpCurOutBuff-16; + DWORD dwExtraBytes=*((LPDWORD)lpExtraInBuff); + return (OutLength-dwExtraBytes); + +} diff --git a/LedOK/LoUIClass/taesclass.h b/LedOK/LoUIClass/taesclass.h new file mode 100644 index 0000000..dd93304 --- /dev/null +++ b/LedOK/LoUIClass/taesclass.h @@ -0,0 +1,129 @@ +#include +#include +#include +#include + +typedef unsigned long DWORD; +typedef unsigned char UCHAR,*PUCHAR; +typedef void *PVOID,*LPVOID; +typedef unsigned char byte; +typedef DWORD *PDWORD,*LPDWORD; + +#ifndef VOID +#define VOID void +#endif + +//#pragma once + +//enum KeySize { Bits128, Bits192, Bits256 }; // key size, in bits, for construtor +#define Bits128 16 +#define Bits192 24 +#define Bits256 32 + +static unsigned char AesSbox[16*16]= +{// populate the Sbox matrix + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /*0*/ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + /*1*/ 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + /*2*/ 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + /*3*/ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + /*4*/ 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + /*5*/ 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + /*6*/ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + /*7*/ 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + /*8*/ 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + /*9*/ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + /*a*/ 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + /*b*/ 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + /*c*/ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + /*d*/ 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + /*e*/ 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + /*f*/ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +static unsigned char AesiSbox[16*16]= +{ + // populate the iSbox matrix + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + /*0*/ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + /*1*/ 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + /*2*/ 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + /*3*/ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + /*4*/ 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + /*5*/ 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + /*6*/ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + /*7*/ 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + /*8*/ 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + /*9*/ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + /*a*/ 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + /*b*/ 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + /*c*/ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + /*d*/ 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + /*e*/ 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + /*f*/ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; +static unsigned char AesRcon[11*4]= +{ + 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, + 0x1b, 0x00, 0x00, 0x00, + 0x36, 0x00, 0x00, 0x00 +}; + + +class Aes // Advanced Encryption Standard +{ +public: + ~Aes(); + Aes(); + Aes(int keySize, unsigned char* keyBytes); + unsigned char State[4][4]; + void Cipher(unsigned char* input, unsigned char* output); // encipher 16-bit input + void InvCipher(unsigned char* input, unsigned char* output); // decipher 16-bit input +private: + int Nb; // block size in 32-bit words. Always 4 for AES. (128 bits). + int Nk; // key size in 32-bit words. 4, 6, 8. (128, 192, 256 bits). + int Nr; // number of rounds. 10, 12, 14. + + unsigned char key[32]; + unsigned char w[16*15]; + + void SetNbNkNr(int keySize); + void AddRoundKey(int round); //轮密钥加 + void SubBytes(); //S盒字节代换 + void InvSubBytes(); //逆S盒字节代换 + void ShiftRows(); //行移位 + void InvShiftRows(); + void MixColumns(); //列混淆 + void InvMixColumns(); + unsigned char gfmultby01(unsigned char b); + unsigned char gfmultby02(unsigned char b); + unsigned char gfmultby03(unsigned char b); + unsigned char gfmultby09(unsigned char b); + unsigned char gfmultby0b(unsigned char b); + unsigned char gfmultby0d(unsigned char b); + unsigned char gfmultby0e(unsigned char b); + void KeyExpansion(); //密钥扩展 + unsigned char* SubWord(unsigned char* word); //密钥S盒字代换 + unsigned char* RotWord(unsigned char* word); //密钥移位 + +}; + +class TAesClass +{ +public: + TAesClass(); + ~TAesClass(); + void InitializePrivateKey(DWORD KeySize,UCHAR *KeyBytes); //AES 密钥初始化 + DWORD OnAesEncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer); //AES 加密数据 + DWORD OnAesUncrypt(LPVOID InBuffer,DWORD InLength,LPVOID OutBuffer); //AES 解密数据 +private: + Aes * m_lpAes; +}; diff --git a/LedOK/LoUIClass/updateledset3dialog.cpp b/LedOK/LoUIClass/updateledset3dialog.cpp new file mode 100644 index 0000000..15a1a70 --- /dev/null +++ b/LedOK/LoUIClass/updateledset3dialog.cpp @@ -0,0 +1,91 @@ +#include "updateledset3dialog.h" +#include "ui_updateledset3dialog.h" +#include "x_uimsgboxok.h" +#include +#include +static const QString DEFS_LEDSET_URL = "https://www.ledok.cn/download/definitions/ledset3updates.json"; + +UpdateLedset3Dialog::UpdateLedset3Dialog(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::UpdateLedset3Dialog) +{ + ui->setupUi(this); + ui->pushButton_2->setVisible(false); + + QString strCurApkVersion=""; + LoAppConfig *cfg = LoAppConfig::getInstance(); + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); + strCurApkVersion=settings->value(DEFS_LEDSET_URL).toString(); + if(strCurApkVersion.isEmpty()) + strCurApkVersion="0.0.0"; + strCurApkVersion="0.0.0"; + + setStyleSheet("background-color:#D8D8D8"); + ui->label_2->setText(tr("CurVersion")+":"+strCurApkVersion); + ui->label_2->setVisible(false); + + QSimpleUpdater *m_updater=QSimpleUpdater::getInstance(); + connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(OnCheckForUpdates())); + connect(m_updater,SIGNAL(checkingFinished(QString)),this,SLOT(updateChangelog(QString))); + connect(m_updater,SIGNAL(downloadFinished(QString,QString)),this,SLOT(OnDownloadFinished(QString,QString))); + + + m_updater->getInstance()->setModuleVersion(DEFS_LEDSET_URL,strCurApkVersion); + m_updater->getInstance()->setNotifyOnUpdate(DEFS_LEDSET_URL,false); + m_updater->getInstance()->setNotifyOnFinish(DEFS_LEDSET_URL,false); + m_updater->getInstance()->setCompareBySameString(DEFS_LEDSET_URL,true); + m_updater->getInstance()->checkForUpdates(DEFS_LEDSET_URL); + ui->pushButton->setProperty("ssType", "progManageTool"); + ui->pushButton->setStyleSheet("QPushButton{background:rgba(28,154,210,1);}"); + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,1);}"); + +} + +UpdateLedset3Dialog::~UpdateLedset3Dialog() +{ + delete ui; +} +void UpdateLedset3Dialog::OnDownloadFinished( QString url, QString filepath) +{ + ui->label_2->setText(tr("CurVersion")+":"+m_updater->getInstance()->getLatestVersion(DEFS_LEDSET_URL)); + ui->textEdit->setText(tr("Apk is download finished from internet,you can select LED Screen SYNC firmware now!")); + ui->pushButton_2->setVisible(false); + LoAppConfig *cfg = LoAppConfig::getInstance(); + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); + settings->setValue(url, m_strLastestVersion); + settings->setValue("ledset", filepath); +// m_updater->getInstance()->setNotifyOnUpdate(DEFS_FIRMWARE_URL,false); +// m_updater->getInstance()->setNotifyOnFinish(DEFS_FIRMWARE_URL,false); +// m_updater->getInstance()->checkForUpdates(DEFS_FIRMWARE_URL); +} + +void UpdateLedset3Dialog::OnCheckForUpdates() +{ + m_updater->getInstance()->setNotifyOnUpdate(DEFS_LEDSET_URL,true); + m_updater->getInstance()->setNotifyOnFinish(DEFS_LEDSET_URL,false); + // m_updater->getInstance()->setUseCustomInstallProcedures(DEFS_LEDSET_URL,true); + m_updater->getInstance()->setNoNotifyDownload(DEFS_LEDSET_URL,true); + m_updater->getInstance()->setCompareBySameString(DEFS_LEDSET_URL,true); + m_updater->getInstance()->setMandatoryUpdate(DEFS_LEDSET_URL,false); + m_updater->getInstance()->checkForUpdates(DEFS_LEDSET_URL); + +} +void UpdateLedset3Dialog::updateChangelog(QString strTip) +{ + Q_UNUSED(strTip) + + if(m_updater->getInstance()->getUpdateAvailable(DEFS_LEDSET_URL)) + { + QString strtip=tr("LatestVersion:"); + m_strLastestVersion=m_updater->getInstance()->getLatestVersion(DEFS_LEDSET_URL); + strtip+= m_strLastestVersion +"\r\n"; + strtip+= tr("Update log:")+"\r\n"+m_updater->getInstance()->getChangelog (DEFS_LEDSET_URL) ; + ui->textEdit->setText(strtip); + ui->pushButton_2->setVisible(true); + } + else { + ui->textEdit->setText(tr("The current version is already the latest version,,you can select LED Screen SYNC firmware now!")); + } + disconnect(m_updater,SIGNAL(checkingFinished(QString)),this,SLOT(updateChangelog(QString))); +} diff --git a/LedOK/LoUIClass/updateledset3dialog.h b/LedOK/LoUIClass/updateledset3dialog.h new file mode 100644 index 0000000..11917b1 --- /dev/null +++ b/LedOK/LoUIClass/updateledset3dialog.h @@ -0,0 +1,30 @@ +#ifndef UPDATELEDSET3DIALOG_H +#define UPDATELEDSET3DIALOG_H + +#include +#include + +namespace Ui { +class UpdateLedset3Dialog; +} + +class UpdateLedset3Dialog : public LoQDialog +{ + Q_OBJECT + +public: + explicit UpdateLedset3Dialog(QWidget *parent = nullptr); + ~UpdateLedset3Dialog(); + +private: + Ui::UpdateLedset3Dialog *ui; + QSimpleUpdater *m_updater; + QString m_strLastestVersion=""; +protected slots: + void OnCheckForUpdates() ; + void updateChangelog(QString); + void OnDownloadFinished( QString url, QString filepath); + +}; + +#endif // UPDATELEDSET3DIALOG_H diff --git a/LedOK/LoUIClass/updateledset3dialog.ui b/LedOK/LoUIClass/updateledset3dialog.ui new file mode 100644 index 0000000..3eb0cda --- /dev/null +++ b/LedOK/LoUIClass/updateledset3dialog.ui @@ -0,0 +1,207 @@ + + + UpdateLedset3Dialog + + + + 0 + 0 + 381 + 272 + + + + Dialog + + + + + 0 + 0 + 382 + 275 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 0 + + + + + LedSet3.0 Update + + + Qt::AlignCenter + + + + + + + + 30 + 24 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + image: url(:/res/ledset.png); + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 0 + 0 + + + + + 14 + + + + V1.0.0 + + + Qt::AlignCenter + + + + + + + true + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + 80 + 16777215 + + + + Update + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + pushButton + clicked() + UpdateLedset3Dialog + close() + + + 355 + 22 + + + 190 + 135 + + + + + diff --git a/LedOK/LoUIClass/updaterdialog.cpp b/LedOK/LoUIClass/updaterdialog.cpp new file mode 100644 index 0000000..4403f50 --- /dev/null +++ b/LedOK/LoUIClass/updaterdialog.cpp @@ -0,0 +1,85 @@ +#include "updaterdialog.h" +#include "ui_updaterdialog.h" +#include "x_uimsgboxok.h" +static const QString DEFS_URL = "https://www.ledok.cn/download/definitions/updates.json"; + +UpdaterDialog::UpdaterDialog(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::UpdaterDialog) +{ + ui->setupUi(this); + ui->pushButton_2->setVisible(false); + ui->label_2->setText(tr("CurVersion")+":"+APP_VERSION); + QSimpleUpdater *m_updater=QSimpleUpdater::getInstance(); + connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(OnCheckForUpdates())); + connect(m_updater,SIGNAL(checkingFinished(QString)),this,SLOT(updateChangelog(QString))); + m_updater->getInstance()->setModuleVersion(DEFS_URL,APP_VERSION); + m_updater->getInstance()->setNotifyOnUpdate(DEFS_URL,false); + m_updater->getInstance()->setNotifyOnFinish(DEFS_URL,false); + m_updater->getInstance()->checkForUpdates(DEFS_URL); +// X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("UpdaterDialog!"),this,1); +// pDlg->exec(); + + + +} + +UpdaterDialog::~UpdaterDialog() +{ + delete ui; +} +void UpdaterDialog::OnCheckForUpdates() +{ + m_updater->getInstance()->setNotifyOnUpdate(DEFS_URL,true); + m_updater->getInstance()->setNotifyOnFinish(DEFS_URL,false); + m_updater->getInstance()->setMandatoryUpdate(DEFS_URL,true); + + m_updater->getInstance()->checkForUpdates(DEFS_URL); +// if(m_updater->getInstance()->getUpdateAvailable(DEFS_URL)) +// { + +// } +//m_updater->getInstance()->checkForUpdates(DEFS_URL); +// m_updater->getInstance()->usesCustomAppcast (DEFS_URL) ; +// m_updater->getInstance()->getNotifyOnUpdate (DEFS_URL) ; +// m_updater->getInstance()->getNotifyOnFinish (DEFS_URL) ; +// m_updater->getInstance()->getUpdateAvailable (DEFS_URL) ; +// m_updater->getInstance()->getDownloaderEnabled (DEFS_URL) ; +// m_updater->getInstance()->usesCustomInstallProcedures (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getModuleName (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getDownloadUrl (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getPlatformKey (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getLatestVersion (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getModuleVersion (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getUserAgentString (DEFS_URL) ; + + + +} +void UpdaterDialog::updateChangelog(QString strTip) +{ + Q_UNUSED(strTip) +// X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),DEFS_URL,this,1); +// pDlg->exec(); + + if(m_updater->getInstance()->getUpdateAvailable(DEFS_URL)) + { +// X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),"1",this,1); +// pDlg->exec(); + QString strtip=tr("LatestVersion:"); + strtip+= m_updater->getInstance()->getLatestVersion(DEFS_URL) +"\r\n"; + strtip+= tr("Update log:")+"\r\n"+m_updater->getInstance()->getChangelog (DEFS_URL) ; + // ui->textEdit->setVisible(true); + ui->textEdit->setText(strtip); + ui->pushButton_2->setVisible(true); + } + else { +// X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),"2",this,1); +// pDlg->exec(); + //ui->textEdit->setVisible(false); + ui->textEdit->setText(tr("The current version is already the latest version")); + } +// disconnect(m_updater,SIGNAL(checkingFinished(QString)),this,SLOT(updateChangelog(QString))); +// X_UIMsgBoxOk *pDlg1=new X_UIMsgBoxOk(tr("Tip"),tr("Update finished!"),this,1); +// pDlg1->exec(); +} diff --git a/LedOK/LoUIClass/updaterdialog.h b/LedOK/LoUIClass/updaterdialog.h new file mode 100644 index 0000000..e1960fb --- /dev/null +++ b/LedOK/LoUIClass/updaterdialog.h @@ -0,0 +1,28 @@ +#ifndef UPDATERDIALOG_H +#define UPDATERDIALOG_H + +#include +#include + +namespace Ui { +class UpdaterDialog; +} + +class UpdaterDialog : public LoQDialog +{ + Q_OBJECT + +public: + explicit UpdaterDialog(QWidget *parent = nullptr); + ~UpdaterDialog(); + +private: + Ui::UpdaterDialog *ui; + QSimpleUpdater *m_updater; + +protected slots: + void OnCheckForUpdates() ; + void updateChangelog(QString); +}; + +#endif // UPDATERDIALOG_H diff --git a/LedOK/LoUIClass/updaterdialog.ui b/LedOK/LoUIClass/updaterdialog.ui new file mode 100644 index 0000000..c206524 --- /dev/null +++ b/LedOK/LoUIClass/updaterdialog.ui @@ -0,0 +1,209 @@ + + + UpdaterDialog + + + + 0 + 0 + 400 + 293 + + + + + 0 + 0 + + + + Dialog + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 0 + + + + + Software Update + + + Qt::AlignCenter + + + + + + + + 30 + 24 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + image: url(:/res/Logo.png); + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 0 + 0 + + + + + 14 + + + + V1.0 + + + Qt::AlignCenter + + + + + + + true + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + 80 + 16777215 + + + + Update + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + pushButton + clicked() + UpdaterDialog + close() + + + 364 + 29 + + + 199 + 78 + + + + + diff --git a/LedOK/LoUIClass/updaterfirmwaredialog.cpp b/LedOK/LoUIClass/updaterfirmwaredialog.cpp new file mode 100644 index 0000000..33ef0d8 --- /dev/null +++ b/LedOK/LoUIClass/updaterfirmwaredialog.cpp @@ -0,0 +1,119 @@ +#include "updaterfirmwaredialog.h" +#include "ui_updaterfirmwaredialog.h" +#include "x_uimsgboxok.h" +#include +#include +static const QString DEFS_FIRMWARE_URL = "https://www.ledok.cn/download/definitions/player.json"; +UpdaterFirmwareDialog::UpdaterFirmwareDialog(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::UpdaterFirmwareDialog) +{ + ui->setupUi(this); + ui->pushButton_2->setVisible(false); + + QString strCurApkVersion=""; + LoAppConfig *cfg = LoAppConfig::getInstance(); + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); + strCurApkVersion=settings->value(DEFS_FIRMWARE_URL).toString(); + if(strCurApkVersion.isEmpty()) + strCurApkVersion="10.9.9-8"; + + + QString strfilepath = settings->value("xixunplayer").toString(); + if(strfilepath.isEmpty()) + { + strfilepath=QCoreApplication::applicationDirPath() + "/Downloads/"+"xixunplayer10.9.9-8.apk"; + } + + QFile tempApk(strfilepath); + if(!tempApk.exists()) + strCurApkVersion="10.9.9-8"; + else { + if(strCurApkVersion.isEmpty()) + strCurApkVersion="10.9.9-8"; + } + ui->label_2->setText(tr("CurVersion")+":"+strCurApkVersion); + QSimpleUpdater *m_updater=QSimpleUpdater::getInstance(); + connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(OnCheckForUpdates())); + connect(m_updater,SIGNAL(checkingFinished(QString)),this,SLOT(updateChangelog(QString))); + connect(m_updater,SIGNAL(downloadFinished(QString,QString)),this,SLOT(OnDownloadFinished(QString,QString))); + + + m_updater->getInstance()->setModuleVersion(DEFS_FIRMWARE_URL,strCurApkVersion); + m_updater->getInstance()->setNotifyOnUpdate(DEFS_FIRMWARE_URL,false); + m_updater->getInstance()->setNotifyOnFinish(DEFS_FIRMWARE_URL,false); + m_updater->getInstance()->setCompareBySameString(DEFS_FIRMWARE_URL,false); + m_updater->getInstance()->checkForUpdates(DEFS_FIRMWARE_URL); + + + } + +UpdaterFirmwareDialog::~UpdaterFirmwareDialog() +{ + delete ui; +} +void UpdaterFirmwareDialog::OnDownloadFinished( QString url, QString filepath) +{ + ui->label_2->setText(tr("CurVersion")+":"+m_updater->getInstance()->getLatestVersion(DEFS_FIRMWARE_URL)); + ui->textEdit->setText(tr("Apk is download finished from internet,you can select LED Screen SYNC firmware now!")); + ui->pushButton_2->setVisible(false); + LoAppConfig *cfg = LoAppConfig::getInstance(); + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); + settings->setValue(url, m_strLastestVersion); + settings->setValue("xixunplayer", filepath); +// m_updater->getInstance()->setNotifyOnUpdate(DEFS_FIRMWARE_URL,false); +// m_updater->getInstance()->setNotifyOnFinish(DEFS_FIRMWARE_URL,false); +// m_updater->getInstance()->checkForUpdates(DEFS_FIRMWARE_URL); +} + +void UpdaterFirmwareDialog::OnCheckForUpdates() +{ + m_updater->getInstance()->setNotifyOnUpdate(DEFS_FIRMWARE_URL,true); + m_updater->getInstance()->setNotifyOnFinish(DEFS_FIRMWARE_URL,false); + m_updater->getInstance()->setUseCustomInstallProcedures(DEFS_FIRMWARE_URL,true); + m_updater->getInstance()->setNoNotifyDownload(DEFS_FIRMWARE_URL,true); + m_updater->getInstance()->setCompareBySameString(DEFS_FIRMWARE_URL,true); + m_updater->getInstance()->checkForUpdates(DEFS_FIRMWARE_URL); +// if(m_updater->getInstance()->getUpdateAvailable(DEFS_URL)) +// { + +// } +//m_updater->getInstance()->checkForUpdates(DEFS_URL); +// m_updater->getInstance()->usesCustomAppcast (DEFS_URL) ; +// m_updater->getInstance()->getNotifyOnUpdate (DEFS_URL) ; +// m_updater->getInstance()->getNotifyOnFinish (DEFS_URL) ; +// m_updater->getInstance()->getUpdateAvailable (DEFS_URL) ; +// m_updater->getInstance()->getDownloaderEnabled (DEFS_URL) ; +// m_updater->getInstance()->usesCustomInstallProcedures (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getModuleName (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getDownloadUrl (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getPlatformKey (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getLatestVersion (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getModuleVersion (DEFS_URL) ; +// strtip+= m_updater->getInstance()->getUserAgentString (DEFS_URL) ; + + + +} +void UpdaterFirmwareDialog::updateChangelog(QString strTip) +{ + Q_UNUSED(strTip) + + if(m_updater->getInstance()->getUpdateAvailable(DEFS_FIRMWARE_URL)) + { + QString strtip=tr("LatestVersion:"); + m_strLastestVersion=m_updater->getInstance()->getLatestVersion(DEFS_FIRMWARE_URL); + strtip+= m_strLastestVersion +"\r\n"; + strtip+= tr("Update log:")+"\r\n"+m_updater->getInstance()->getChangelog (DEFS_FIRMWARE_URL) ; + // ui->textEdit->setVisible(true); + ui->textEdit->setText(strtip); + ui->pushButton_2->setVisible(true); + } + else { + //ui->textEdit->setVisible(false); + ui->textEdit->setText(tr("The current version is already the latest version,,you can select LED Screen SYNC firmware now!")); + } + disconnect(m_updater,SIGNAL(checkingFinished(QString)),this,SLOT(updateChangelog(QString))); +// X_UIMsgBoxOk *pDlg=new X_UIMsgBoxOk(tr("Tip"),tr("Update finished!"),this,1); +// pDlg->exec(); +} diff --git a/LedOK/LoUIClass/updaterfirmwaredialog.h b/LedOK/LoUIClass/updaterfirmwaredialog.h new file mode 100644 index 0000000..b0d9f14 --- /dev/null +++ b/LedOK/LoUIClass/updaterfirmwaredialog.h @@ -0,0 +1,29 @@ +#ifndef UPDATERFIRMWAREDIALOG_H +#define UPDATERFIRMWAREDIALOG_H + +#include +#include +namespace Ui { +class UpdaterFirmwareDialog; +} + +class UpdaterFirmwareDialog : public LoQDialog +{ + Q_OBJECT + +public: + explicit UpdaterFirmwareDialog(QWidget *parent = nullptr); + ~UpdaterFirmwareDialog(); + +private: + Ui::UpdaterFirmwareDialog *ui; + QSimpleUpdater *m_updater; + QString m_strLastestVersion=""; +protected slots: + void OnCheckForUpdates() ; + void updateChangelog(QString); + void OnDownloadFinished( QString url, QString filepath); + +}; + +#endif // UPDATERFIRMWAREDIALOG_H diff --git a/LedOK/LoUIClass/updaterfirmwaredialog.ui b/LedOK/LoUIClass/updaterfirmwaredialog.ui new file mode 100644 index 0000000..3f4072c --- /dev/null +++ b/LedOK/LoUIClass/updaterfirmwaredialog.ui @@ -0,0 +1,207 @@ + + + UpdaterFirmwareDialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + 0 + 0 + 382 + 275 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 0 + + + + + Firmware Update + + + Qt::AlignCenter + + + + + + + + 30 + 24 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + + 64 + 64 + + + + image: url(:/res/apk.png); + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 0 + 0 + + + + + 14 + + + + V1.0 + + + Qt::AlignCenter + + + + + + + true + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + 80 + 16777215 + + + + Update + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + pushButton + clicked() + UpdaterFirmwareDialog + close() + + + 355 + 22 + + + 199 + 149 + + + + + diff --git a/LedOK/LoUIClass/x_checkboxdelegate.cpp b/LedOK/LoUIClass/x_checkboxdelegate.cpp new file mode 100644 index 0000000..4489bc5 --- /dev/null +++ b/LedOK/LoUIClass/x_checkboxdelegate.cpp @@ -0,0 +1,116 @@ +/* + delegate.cpp + + A delegate that allows the user to change integer values from the model + using a spin box widget. +*/ + +#include "x_checkboxdelegate.h" + +#include +#include +#include +X_CheckBoxDelegate::X_CheckBoxDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ + +} + +QWidget *X_CheckBoxDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem & option , + const QModelIndex & index ) const +{ +// if(index.column()>=3&&index.column()<=9) +// { +// QCheckBox *editor = new QCheckBox(parent); +// // editor->setFrame(false); + +// ///editor->setAlignment(Qt::AlignHCenter); +// // editor->setDisplayFormat("hh:mm"); + +// return editor; + +// } + + if(index.column()>=3&&index.column()<=9) + { + QCheckBox *editor=new QCheckBox(parent); + editor->installEventFilter(const_cast(this)); + return editor; + } + else + return QStyledItemDelegate::createEditor(parent,option,index); + + return nullptr; +} + +//void X_CheckBoxDelegate::setEditorData(QWidget *editor, +// const QModelIndex &index) const +//{ +// if(index.column()>=3&&index.column()<=9) +// { +// bool data = index.model()->data(index, Qt::UserRole).toBool(); +// QCheckBox *checkBox = static_cast(editor); +// checkBox->setChecked(data); + +// } +// else +// QStyledItemDelegate::setEditorData(editor,index); + +//} + +//void X_CheckBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, +// const QModelIndex &index) const +//{ +// QCheckBox *checkBox = static_cast(editor); +// bool value = checkBox->isChecked(); +// model->setData(index, value, Qt::UserRole); +//} +// 绘制复选框 +void X_CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QStyleOptionViewItem viewOption(option); + initStyleOption(&viewOption, index); + if (option.state.testFlag(QStyle::State_HasFocus)) + viewOption.state = viewOption.state ^ QStyle::State_HasFocus; + + QStyledItemDelegate::paint(painter, viewOption, index); + + if (index.column()>=3&&index.column()<=9) + { + bool data = index.model()->data(index, Qt::UserRole).toBool(); + + QStyleOptionButton checkBoxStyle; + checkBoxStyle.state = data ? QStyle::State_On : QStyle::State_Off; + checkBoxStyle.state |= QStyle::State_Enabled; + checkBoxStyle.iconSize = QSize(20, 20); + checkBoxStyle.rect = option.rect; + + QCheckBox checkBox; + QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkBoxStyle, painter, &checkBox); + } +} + +// 响应鼠标事件,更新数据 +bool X_CheckBoxDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) +{ + QRect decorationRect = option.rect; + + QMouseEvent *mouseEvent = static_cast(event); + if (event->type() == QEvent::MouseButtonPress && decorationRect.contains(mouseEvent->pos())) + { + if (index.column()>=3&&index.column()<=9) + { + bool data = model->data(index, Qt::UserRole).toBool(); + model->setData(index, !data, Qt::UserRole); + } + } + + return QStyledItemDelegate::editorEvent(event, model, option, index); +} +void X_CheckBoxDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &/* index */) const +{ + editor->setGeometry(option.rect); +} + diff --git a/LedOK/LoUIClass/x_checkboxdelegate.h b/LedOK/LoUIClass/x_checkboxdelegate.h new file mode 100644 index 0000000..6f2297b --- /dev/null +++ b/LedOK/LoUIClass/x_checkboxdelegate.h @@ -0,0 +1,73 @@ +#ifndef X_CHECKBOXDELEGATE_H +#define X_CHECKBOXDELEGATE_H +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +//! [0] +class X_CheckBoxDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + X_CheckBoxDelegate(QObject *parent = nullptr); + QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; +// void setEditorData(QWidget *editor, const QModelIndex &index) const override; +// void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override; + + +}; +//! [0] + +#endif // X_CHECKBOXDELEGATE_H diff --git a/LedOK/LoUIClass/x_spinboxdelegate.cpp b/LedOK/LoUIClass/x_spinboxdelegate.cpp new file mode 100644 index 0000000..77b5fcb --- /dev/null +++ b/LedOK/LoUIClass/x_spinboxdelegate.cpp @@ -0,0 +1,79 @@ +#include "x_spinboxdelegate.h" +/* + delegate.cpp + + A delegate that allows the user to change integer values from the model + using a spin box widget. +*/ + +#include "x_spinboxdelegate.h" + +#include + +//! [0] +SpinBoxDelegate::SpinBoxDelegate(QObject *parent,int iFlag) + : QStyledItemDelegate(parent) +{ + m_iFlag=iFlag; +} +//! [0] + +//! [1] +QWidget *SpinBoxDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &/* option */, + const QModelIndex & index ) const +{ + if(index.column()==0) + { + QSpinBox *editor = new QSpinBox(parent); + editor->setFrame(false); + editor->setMinimum(0); + if(m_iFlag==0) + editor->setMaximum(255);//亮度最大值 + else if(m_iFlag==1) + editor->setMaximum(15);//音量最大值 + editor->setAlignment(Qt::AlignHCenter); + return editor; + + } + return nullptr; +} +//! [1] +//void SpinBoxDelegate::setMinMaxData(int min,int max) +//{ + +// m_editor->setMinimum(min); +// m_editor->setMaximum(max); + + +//} +//! [2] +void SpinBoxDelegate::setEditorData(QWidget *editor, + const QModelIndex &index) const +{ + int value = index.model()->data(index, Qt::EditRole).toInt(); + + QSpinBox *spinBox = static_cast(editor); + spinBox->setValue(value); +} +//! [2] + +//! [3] +void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const +{ + QSpinBox *spinBox = static_cast(editor); + spinBox->interpretText(); + int value = spinBox->value(); + + model->setData(index, value, Qt::EditRole); +} +//! [3] + +//! [4] +void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &/* index */) const +{ + editor->setGeometry(option.rect); +} +//! [4] diff --git a/LedOK/LoUIClass/x_spinboxdelegate.h b/LedOK/LoUIClass/x_spinboxdelegate.h new file mode 100644 index 0000000..a86f806 --- /dev/null +++ b/LedOK/LoUIClass/x_spinboxdelegate.h @@ -0,0 +1,79 @@ +#ifndef X_SPINBOXDELEGATE_H +#define X_SPINBOXDELEGATE_H +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +//! [0] +class SpinBoxDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + SpinBoxDelegate(QObject *parent = 0,int iFlag=0); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const override; +// void setMinMaxData(int min,int max); + + void setEditorData(QWidget *editor, const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const override; + + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const override; +public: +// QSpinBox *m_editor=nullptr; + int m_iFlag=0; +}; +//! [0] + +#endif // X_SPINBOXDELEGATE_H diff --git a/LedOK/LoUIClass/x_timeeditdelegate.cpp b/LedOK/LoUIClass/x_timeeditdelegate.cpp new file mode 100644 index 0000000..4b9306b --- /dev/null +++ b/LedOK/LoUIClass/x_timeeditdelegate.cpp @@ -0,0 +1,62 @@ +#include "X_timeEditDelegate.h" +/* + delegate.cpp + + A delegate that allows the user to change integer values from the model + using a spin box widget. +*/ + +#include "X_timeEditDelegate.h" + +#include + +X_timeEditDelegate::X_timeEditDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ +} + +QWidget *X_timeEditDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &/* option */, + const QModelIndex & index ) const +{ + if(index.column()==1||index.column()==2) + { + QTimeEdit *editor = new QTimeEdit(parent); + editor->setFrame(false); + + editor->setAlignment(Qt::AlignHCenter); + editor->setDisplayFormat("hh:mm"); + + return editor; + + } + return nullptr; +} + +void X_timeEditDelegate::setEditorData(QWidget *editor, + const QModelIndex &index) const +{ + QString value = index.model()->data(index, Qt::EditRole).toString(); + + QTimeEdit *spinBoxTimeEdit = static_cast(editor); + QTime qtime=QTime::fromString(value,"hh:mm"); + spinBoxTimeEdit->setTime(qtime); + +} + +void X_timeEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const +{ + QTimeEdit *spinBoxTimeEdit = static_cast(editor); + spinBoxTimeEdit->interpretText(); + QString value = spinBoxTimeEdit->time().toString("hh:mm"); + + model->setData(index, value, Qt::EditRole); +} + +void X_timeEditDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &/* index */) const +{ + editor->setGeometry(option.rect); +} + diff --git a/LedOK/LoUIClass/x_timeeditdelegate.h b/LedOK/LoUIClass/x_timeeditdelegate.h new file mode 100644 index 0000000..5f98dc3 --- /dev/null +++ b/LedOK/LoUIClass/x_timeeditdelegate.h @@ -0,0 +1,75 @@ +#ifndef X_TIMEEDITDELEGATE_H +#define X_TIMEEDITDELEGATE_H +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +//! [0] +class X_timeEditDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + X_timeEditDelegate(QObject *parent = 0); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + + void setEditorData(QWidget *editor, const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const override; + + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const override; +}; +//! [0] + +#endif // X_TIMEEDITDELEGATE_H diff --git a/LedOK/LoUIClass/x_uimsgboxok.cpp b/LedOK/LoUIClass/x_uimsgboxok.cpp new file mode 100644 index 0000000..dac11f8 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxok.cpp @@ -0,0 +1,115 @@ +#include "x_uimsgboxok.h" +#include "ui_x_uimsgboxok.h" +#include +#include +#include "LoUIClass/x_uimsgboxokcancel.h" +#include "LoUIClass/updaterfirmwaredialog.h" +X_UIMsgBoxOk::X_UIMsgBoxOk(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::X_UIMsgBoxOk) +{ + ui->setupUi(this); + m_bExitTypeFlag=0; +} + +X_UIMsgBoxOk::~X_UIMsgBoxOk() +{ + delete ui; +} +X_UIMsgBoxOk::X_UIMsgBoxOk(QString strTitle,QString text, QWidget *parent) : + LoQDialog(parent), + ui(new Ui::X_UIMsgBoxOk) +{ + ui->setupUi(this); + ui->lInfoTip->adjustSize(); + ui->label_3->setText(strTitle); + //让QLabel能够自动判断并换行显示: +// ui->lInfoTip->setGeometry(QRect(328, 240, 329, 27*4)); //四倍行距 + ui->lInfoTip->setWordWrap(true); + ui->lInfoTip->setAlignment(Qt::AlignTop); + ui->lInfoTip->setText(text); + ui->pushButton_3->setVisible(false); + m_bExitTypeFlag=0; + ui->pushButton->setProperty("ssType", "progManageTool"); + ui->pushButton->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + ui->pushButton_3->setProperty("ssType", "progManageTool"); + ui->pushButton_3->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + +} +X_UIMsgBoxOk::X_UIMsgBoxOk(QString strTitle,QString text, QWidget *parent,int iType) : + LoQDialog(parent), + ui(new Ui::X_UIMsgBoxOk) +{ + ui->setupUi(this); + m_bExitTypeFlag=0; + ui->lInfoTip->adjustSize(); + ui->label_3->setText(strTitle); + //让QLabel能够自动判断并换行显示: +// ui->lInfoTip->setGeometry(QRect(328, 240, 329, 27*4)); //四倍行距 + ui->lInfoTip->setWordWrap(true); + ui->lInfoTip->setAlignment(Qt::AlignTop); + ui->lInfoTip->setText(text); + ui->pushButton_3->setVisible(false); + if(iType==1) + { + ui->lInfoTip->setStyleSheet("background:rgba(206,206,206,1)"); + ui->frame->setStyleSheet("QFrame{background:rgba(206,206,206,1)}"); + setStyleSheet("background:rgba(206,206,206,1)"); + ui->pushButton->setProperty("ssType", "progManageTool"); + ui->pushButton->setStyleSheet("QPushButton{background:rgba(28,154,210,1);}"); + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,1);}"); + + } + else if(iType==2)//升级同步提示,升级固件 + { + ui->pushButton_3->setText(tr("Sync")); + ui->pushButton_3->setVisible(true); + + } + else if(iType==3)//升级同步提示,升级固件 + { + ui->pushButton_3->setText(tr("install")); + ui->pushButton_3->setVisible(true); + + } + //connect(ui->pushButton_3, SIGNAL(clicked()), this, SIGNAL(signSyncFirmware())); + connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(OnSyncFirmware())); + connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(close())); + // ui->frame->setStyleSheet("border:1px solid rgb(116,116,116)"); +} + +void X_UIMsgBoxOk::OnSyncFirmware() +{ + LoAppConfig *cfg = LoAppConfig::getInstance(); + QSettings *settings = new QSettings(cfg->OrganizationName(), cfg->ApplicationName()); + + QString strfilepath = settings->value("xixunplayer").toString(); + if(strfilepath.isEmpty()) + { + strfilepath=QCoreApplication::applicationDirPath() + "/Downloads/"+"xixunplayer10.9.9-8.apk"; + } + QFileInfo file1(strfilepath); + + QFile file(strfilepath); + if(file.exists()) + { + emit signSyncFirmware(); + + } + else { + settings->setValue("https://www.ledok.cn/download/definitions/player.json","10.9.9-8"); + X_UIMsgBoxOkCancel *dlg = new X_UIMsgBoxOkCancel(tr("Tip Info"),tr("No found xixunplayer.apk,Do you want download it from internet?"), this); + if(dlg->exec() == QDialog::Accepted) + { + UpdaterFirmwareDialog *pDlg=new UpdaterFirmwareDialog(this); + pDlg->exec(); + emit signSyncFirmware(); + } + else { + + } + } +} diff --git a/LedOK/LoUIClass/x_uimsgboxok.h b/LedOK/LoUIClass/x_uimsgboxok.h new file mode 100644 index 0000000..a594ef3 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxok.h @@ -0,0 +1,29 @@ +#ifndef X_UIMSGBOXOK_H +#define X_UIMSGBOXOK_H + +#include +namespace Ui { +class X_UIMsgBoxOk; +} + +class X_UIMsgBoxOk : public LoQDialog +{ + Q_OBJECT + +public: + explicit X_UIMsgBoxOk(QWidget *parent = nullptr); + X_UIMsgBoxOk(QString strTitle,QString text, QWidget *parent = nullptr); + X_UIMsgBoxOk(QString strTitle,QString text, QWidget *parent = nullptr,int iType=0); + ~X_UIMsgBoxOk(); + int m_bExitTypeFlag=0; +signals: + void signSyncFirmware(); + +protected slots: + void OnSyncFirmware(); +private: + Ui::X_UIMsgBoxOk *ui; + +}; + +#endif // X_UIMSGBOXOK_H diff --git a/LedOK/LoUIClass/x_uimsgboxok.ui b/LedOK/LoUIClass/x_uimsgboxok.ui new file mode 100644 index 0000000..c9e514e --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxok.ui @@ -0,0 +1,246 @@ + + + X_UIMsgBoxOk + + + + 0 + 0 + 426 + 200 + + + + + 0 + 0 + + + + Dialog + + + + + + true + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + QFrame::Sunken + + + 0 + + + TextLabel + + + Qt::AlignCenter + + + + + + + + 31 + 23 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + image: url(:/res/tip.png); + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + pushButton + clicked() + X_UIMsgBoxOk + accept() + + + 128 + 119 + + + 127 + 75 + + + + + pushButton_2 + clicked() + X_UIMsgBoxOk + close() + + + 220 + 31 + + + 127 + 75 + + + + + diff --git a/LedOK/LoUIClass/x_uimsgboxokcancel.cpp b/LedOK/LoUIClass/x_uimsgboxokcancel.cpp new file mode 100644 index 0000000..9699dc8 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxokcancel.cpp @@ -0,0 +1,48 @@ +#include "x_uimsgboxokcancel.h" +#include "ui_x_uimsgboxokcancel.h" + +X_UIMsgBoxOkCancel::X_UIMsgBoxOkCancel(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::X_UIMsgBoxOkCancel) +{ + ui->setupUi(this); +} + +X_UIMsgBoxOkCancel::~X_UIMsgBoxOkCancel() +{ + delete ui; +} +X_UIMsgBoxOkCancel::X_UIMsgBoxOkCancel(QString strTitle,QString text, QWidget *parent) : + LoQDialog(parent), + ui(new Ui::X_UIMsgBoxOkCancel) +{ + ui->setupUi(this); + ui->lInfoTip->adjustSize(); + ui->label_3->setText(strTitle); + //让QLabel能够自动判断并换行显示: +// ui->lInfoTip->setGeometry(QRect(328, 240, 329, 27*4)); //四倍行距 + ui->lInfoTip->setWordWrap(true); + ui->lInfoTip->setAlignment(Qt::AlignTop); + ui->lInfoTip->setText(text); + + //if(iType==1) + { + ui->lInfoTip->setStyleSheet("background:rgba(236,236,236,1)"); + ui->frame->setStyleSheet("QFrame{background:rgba(236,236,236,1)}"); + setStyleSheet("background:rgba(236,236,236,1)"); + // ui->buttonBox->setProperty("ssType", "progManageTool"); + // ui->buttonBox->setStyleSheet("color:rgba(28,154,210,255);"); + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + + } + ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("OK")); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); + ui->buttonBox->button(QDialogButtonBox::Ok)->setProperty("ssType", "progManageTool"); + ui->buttonBox->button(QDialogButtonBox::Ok)->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setProperty("ssType", "progManageTool"); + ui->buttonBox->button(QDialogButtonBox::Cancel)->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + +} diff --git a/LedOK/LoUIClass/x_uimsgboxokcancel.h b/LedOK/LoUIClass/x_uimsgboxokcancel.h new file mode 100644 index 0000000..ebf7e47 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxokcancel.h @@ -0,0 +1,23 @@ +#ifndef X_UIMSGBOXOKCANCEL_H +#define X_UIMSGBOXOKCANCEL_H + +#include + +namespace Ui { +class X_UIMsgBoxOkCancel; +} + +class X_UIMsgBoxOkCancel : public LoQDialog +{ + Q_OBJECT + +public: + explicit X_UIMsgBoxOkCancel(QWidget *parent = nullptr); + X_UIMsgBoxOkCancel(QString strTitle,QString text, QWidget *parent = nullptr); + ~X_UIMsgBoxOkCancel(); + +private: + Ui::X_UIMsgBoxOkCancel *ui; +}; + +#endif // X_UIMSGBOXOKCANCEL_H diff --git a/LedOK/LoUIClass/x_uimsgboxokcancel.ui b/LedOK/LoUIClass/x_uimsgboxokcancel.ui new file mode 100644 index 0000000..9b339d0 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxokcancel.ui @@ -0,0 +1,246 @@ + + + X_UIMsgBoxOkCancel + + + + 0 + 0 + 300 + 200 + + + + + 0 + 0 + + + + Dialog + + + + + + true + + + + 0 + 0 + + + + QFrame::NoFrame + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + Qt::AlignCenter + + + + + + + + 31 + 23 + + + + Qt::LeftToRight + + + X + + + + + + + + + border-top: 2px solid gray; + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + image: url(:/res/tip.png); + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + buttonBox + accepted() + X_UIMsgBoxOkCancel + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + X_UIMsgBoxOkCancel + reject() + + + 316 + 260 + + + 286 + 274 + + + + + pushButton_2 + clicked() + X_UIMsgBoxOkCancel + close() + + + 252 + 31 + + + 144 + 99 + + + + + diff --git a/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.cpp b/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.cpp new file mode 100644 index 0000000..a72893d --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.cpp @@ -0,0 +1,27 @@ +#include "x_uimsgboxonlyclosebtn.h" +#include "ui_x_uimsgboxonlyclosebtn.h" + +x_uiMsgBoxOnlyCloseBtn::x_uiMsgBoxOnlyCloseBtn(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::x_uiMsgBoxOnlyCloseBtn) +{ + ui->setupUi(this); +} + +x_uiMsgBoxOnlyCloseBtn::~x_uiMsgBoxOnlyCloseBtn() +{ + delete ui; +} +x_uiMsgBoxOnlyCloseBtn::x_uiMsgBoxOnlyCloseBtn(QString strTitle, QWidget *parent) : + LoQDialog(parent), + ui(new Ui::x_uiMsgBoxOnlyCloseBtn) +{ + ui->setupUi(this); + ui->label_3->setText(strTitle); + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); +} +void x_uiMsgBoxOnlyCloseBtn::InSertDateSelector(QCalendarWidget *wDate) +{ + ui->horizontalLayout->addWidget(wDate); +} diff --git a/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.h b/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.h new file mode 100644 index 0000000..f2c64b2 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.h @@ -0,0 +1,23 @@ +#ifndef X_UIMSGBOXONLYCLOSEBTN_H +#define X_UIMSGBOXONLYCLOSEBTN_H + +#include +#include +namespace Ui { +class x_uiMsgBoxOnlyCloseBtn; +} + +class x_uiMsgBoxOnlyCloseBtn : public LoQDialog +{ + Q_OBJECT + +public: + explicit x_uiMsgBoxOnlyCloseBtn(QWidget *parent = nullptr); + x_uiMsgBoxOnlyCloseBtn(QString strTitle, QWidget *parent = nullptr); + ~x_uiMsgBoxOnlyCloseBtn(); + void InSertDateSelector(QCalendarWidget *wDate); +private: + Ui::x_uiMsgBoxOnlyCloseBtn *ui; +}; + +#endif // X_UIMSGBOXONLYCLOSEBTN_H diff --git a/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.ui b/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.ui new file mode 100644 index 0000000..b2557c0 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxonlyclosebtn.ui @@ -0,0 +1,135 @@ + + + x_uiMsgBoxOnlyCloseBtn + + + + 0 + 0 + 433 + 242 + + + + Dialog + + + + + + true + + + + 0 + 0 + + + + QFrame::Box + + + + + + + + + + + 0 + 0 + + + + QFrame::Sunken + + + 0 + + + TextLabel + + + Qt::AlignCenter + + + + + + + + 31 + 23 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + 0 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + pushButton_2 + clicked() + x_uiMsgBoxOnlyCloseBtn + close() + + + 396 + 30 + + + 216 + 120 + + + + + diff --git a/LedOK/LoUIClass/x_uimsgboxyesnocancel.cpp b/LedOK/LoUIClass/x_uimsgboxyesnocancel.cpp new file mode 100644 index 0000000..cbeecb9 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxyesnocancel.cpp @@ -0,0 +1,57 @@ +#include "x_uimsgboxyesnocancel.h" +#include "ui_x_uimsgboxyesnocancel.h" + +X_UIMsgBoxYesNoCancel::X_UIMsgBoxYesNoCancel(QWidget *parent) : + LoQDialog(parent), + ui(new Ui::X_UIMsgBoxYesNoCancel) +{ + ui->setupUi(this); + +} + +X_UIMsgBoxYesNoCancel::~X_UIMsgBoxYesNoCancel() +{ + delete ui; +} +X_UIMsgBoxYesNoCancel::X_UIMsgBoxYesNoCancel(QString strTitle,QString text, QWidget *parent) : + LoQDialog(parent), + ui(new Ui::X_UIMsgBoxYesNoCancel) +{ + ui->setupUi(this); + + ui->lInfoTip->setStyleSheet("background:rgba(206,206,206,1)"); + ui->frame->setStyleSheet("QFrame{background:rgba(206,206,206,1)}"); + setStyleSheet("background:rgba(206,206,206,1)"); + + ui->bnYes->setProperty("ssType", "progManageTool"); + ui->bnYes->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + ui->bnNo->setProperty("ssType", "progManageTool"); + ui->bnNo->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + ui->bnCancel->setProperty("ssType", "progManageTool"); + ui->bnCancel->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + + ui->pushButton_2->setProperty("ssType", "progManageTool"); + ui->pushButton_2->setStyleSheet("QPushButton{background:rgba(28,154,210,255);}"); + + ui->lInfoTip->adjustSize(); + ui->label_3->setText(strTitle); + //让QLabel能够自动判断并换行显示: +// ui->lInfoTip->setGeometry(QRect(328, 240, 329, 27*4)); //四倍行距 + ui->lInfoTip->setWordWrap(true); + ui->lInfoTip->setAlignment(Qt::AlignTop); + ui->lInfoTip->setText(text); + connect(ui->bnYes, SIGNAL(clicked()), this, SLOT(onYes())); + connect(ui->bnNo, SIGNAL(clicked()), this, SLOT(onNo())); +} +void X_UIMsgBoxYesNoCancel::onYes() +{ + + m_flagSave=1; + QDialog::accept(); +} +void X_UIMsgBoxYesNoCancel::onNo() +{ + + m_flagSave=2; + QDialog::accept(); +} diff --git a/LedOK/LoUIClass/x_uimsgboxyesnocancel.h b/LedOK/LoUIClass/x_uimsgboxyesnocancel.h new file mode 100644 index 0000000..e724a57 --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxyesnocancel.h @@ -0,0 +1,28 @@ +#ifndef X_UIMSGBOXYESNOCANCEL_H +#define X_UIMSGBOXYESNOCANCEL_H + +#include + +namespace Ui { +class X_UIMsgBoxYesNoCancel; +} + +class X_UIMsgBoxYesNoCancel : public LoQDialog +{ + Q_OBJECT + +public: + explicit X_UIMsgBoxYesNoCancel(QWidget *parent = nullptr); + X_UIMsgBoxYesNoCancel(QString strTitle,QString text, QWidget *parent = nullptr); + ~X_UIMsgBoxYesNoCancel(); + int m_flagSave=0; +private: + Ui::X_UIMsgBoxYesNoCancel *ui; +protected slots: + void onYes(); + void onNo(); + + +}; + +#endif // X_UIMSGBOXYESNOCANCEL_H diff --git a/LedOK/LoUIClass/x_uimsgboxyesnocancel.ui b/LedOK/LoUIClass/x_uimsgboxyesnocancel.ui new file mode 100644 index 0000000..f57622f --- /dev/null +++ b/LedOK/LoUIClass/x_uimsgboxyesnocancel.ui @@ -0,0 +1,250 @@ + + + X_UIMsgBoxYesNoCancel + + + + 0 + 0 + 361 + 215 + + + + Dialog + + + + + + true + + + + 0 + 0 + + + + QFrame::NoFrame + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + Qt::AlignCenter + + + + + + + + 31 + 23 + + + + X + + + + + + + + + border-top: 2px solid gray; + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + image: url(:/res/tip.png); + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Yes + + + + + + + + 0 + 0 + + + + No + + + + + + + + 0 + 0 + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + bnCancel + clicked() + X_UIMsgBoxYesNoCancel + reject() + + + 265 + 184 + + + 180 + 107 + + + + + pushButton_2 + clicked() + X_UIMsgBoxYesNoCancel + reject() + + + 325 + 29 + + + 180 + 107 + + + + + diff --git a/LedOK/QSimpleUpdater/.gitattributes b/LedOK/QSimpleUpdater/.gitattributes new file mode 100644 index 0000000..21aee9e --- /dev/null +++ b/LedOK/QSimpleUpdater/.gitattributes @@ -0,0 +1 @@ +doc/* linguist-documentation diff --git a/LedOK/QSimpleUpdater/.gitignore b/LedOK/QSimpleUpdater/.gitignore new file mode 100644 index 0000000..7259a79 --- /dev/null +++ b/LedOK/QSimpleUpdater/.gitignore @@ -0,0 +1,19 @@ +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Fortran module files +*.mod + +# Executables +*.exe +*.out +*.app + +*.user diff --git a/LedOK/QSimpleUpdater/.travis.yml b/LedOK/QSimpleUpdater/.travis.yml new file mode 100644 index 0000000..c49d0b4 --- /dev/null +++ b/LedOK/QSimpleUpdater/.travis.yml @@ -0,0 +1,19 @@ +language: cpp +compiler: gcc + +dist: trusty +sudo: required + +before_install: + - sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test + - sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa + - sudo apt-get update -qq + +install: + - sudo apt-get install -y --force-yes build-essential g++-4.8 -y + - sudo apt-get install -y --force-yes libudev-dev libts-dev libgl1-mesa-dev libglu1-mesa-dev libasound2-dev libpulse-dev -y + - sudo apt-get install -y --force-yes qtbase5-dev qtdeclarative5-dev libqt5gui5 qttools5-dev-tools qttools5-dev qtmultimedia5-dev + +script: + - qmake -qt=qt5 QSimpleUpdater.pro + - make -j4 diff --git a/LedOK/QSimpleUpdater/COPYING.md b/LedOK/QSimpleUpdater/COPYING.md new file mode 100644 index 0000000..750696a --- /dev/null +++ b/LedOK/QSimpleUpdater/COPYING.md @@ -0,0 +1,27 @@ +# DON'T BE A DICK PUBLIC LICENSE + +> Version 1, December 2009 + +> Copyright (C) 2009 Philip Sturgeon + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + +> DON'T BE A DICK PUBLIC LICENSE +> TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 1. Do whatever you like with the original work, just don't be a dick. + + Being a dick includes - but is not limited to - the following instances: + + 1a. Outright copyright infringement - Don't just copy this and change the name. + 1b. Selling the unmodified original with no work done what-so-ever, that's REALLY being a dick. + 1c. Modifying the original work to contain hidden harmful content. That would make you a PROPER dick. + + 2. If you become rich through modifications, related works/services, or supporting the original work, + share the love. Only a dick would make loads off this work and not buy the original work's + creator(s) a pint. + + 3. Code is provided with no warranty. Using somebody else's code and bitching when it goes wrong makes + you a DONKEY dick. Fix the problem yourself. A non-dick would submit the fix back. diff --git a/LedOK/QSimpleUpdater/QSimpleUpdater.pri b/LedOK/QSimpleUpdater/QSimpleUpdater.pri new file mode 100644 index 0000000..3ecf38c --- /dev/null +++ b/LedOK/QSimpleUpdater/QSimpleUpdater.pri @@ -0,0 +1,47 @@ +# +# Copyright (c) 2014-2016 Alex Spataru +# +# This file is part of the QSimpleUpdater library, which is released under +# the DBAD license, you can read a copy of it below: +# +# DON'T BE A DICK PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION +# AND MODIFICATION: +# +# Do whatever you like with the original work, just don't be a dick. +# Being a dick includes - but is not limited to - the following instances: +# +# 1a. Outright copyright infringement - Don't just copy this and change the +# name. +# 1b. Selling the unmodified original with no work done what-so-ever, that's +# REALLY being a dick. +# 1c. Modifying the original work to contain hidden harmful content. +# That would make you a PROPER dick. +# +# If you become rich through modifications, related works/services, or +# supporting the original work, share the love. +# Only a dick would make loads off this work and not buy the original works +# creator(s) a pint. +# +# Code is provided with no warranty. Using somebody else's code and bitching +# when it goes wrong makes you a DONKEY dick. +# Fix the problem yourself. A non-dick would submit the fix back. + +QT += gui +QT += core +QT += network +QT += widgets + +INCLUDEPATH += $$PWD/include + +SOURCES += \ + $$PWD/src/Updater.cpp \ + $$PWD/src/Downloader.cpp \ + $$PWD/src/QSimpleUpdater.cpp + +HEADERS += \ + $$PWD/include/QSimpleUpdater.h \ + $$PWD/src/Updater.h \ + $$PWD/src/Downloader.h + +FORMS += $$PWD/src/Downloader.ui +RESOURCES += $$PWD/etc/resources/qsimpleupdater.qrc diff --git a/LedOK/QSimpleUpdater/QSimpleUpdater.pro b/LedOK/QSimpleUpdater/QSimpleUpdater.pro new file mode 100644 index 0000000..2fe9492 --- /dev/null +++ b/LedOK/QSimpleUpdater/QSimpleUpdater.pro @@ -0,0 +1,31 @@ +# +# Copyright (c) 2014-2016 Alex Spataru +# +# This file is part of the QSimpleUpdater library, which is released under +# the DBAD license, you can read a copy of it below: +# +# DON'T BE A DICK PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION +# AND MODIFICATION: +# +# Do whatever you like with the original work, just don't be a dick. +# Being a dick includes - but is not limited to - the following instances: +# +# 1a. Outright copyright infringement - Don't just copy this and change the +# name. +# 1b. Selling the unmodified original with no work done what-so-ever, that's +# REALLY being a dick. +# 1c. Modifying the original work to contain hidden harmful content. +# That would make you a PROPER dick. +# +# If you become rich through modifications, related works/services, or +# supporting the original work, share the love. +# Only a dick would make loads off this work and not buy the original works +# creator(s) a pint. +# +# Code is provided with no warranty. Using somebody else's code and bitching +# when it goes wrong makes you a DONKEY dick. +# Fix the problem yourself. A non-dick would submit the fix back. + +TEMPLATE = lib +DEFINES += QSU_SHARED +include ($$PWD/QSimpleUpdater.pri) diff --git a/LedOK/QSimpleUpdater/README.md b/LedOK/QSimpleUpdater/README.md new file mode 100644 index 0000000..4825173 --- /dev/null +++ b/LedOK/QSimpleUpdater/README.md @@ -0,0 +1,75 @@ +# QSimpleUpdater + +[![Build Status](https://img.shields.io/travis/alex-spataru/QSimpleUpdater.svg?style=flat-square)](https://travis-ci.org/alex-spataru/QSimpleUpdater) +[![Donate button](https://img.shields.io/badge/bitcoin-donate-brightgreen.svg?style=flat-square)](https://blockchain.info/address/1K85yLxjuqUmhkjP839R7C23XFhSxrefMx "Donate once-off to this project using BitCoin") + +QSimpleUpdater is an implementation of an auto-updating system to be used with Qt projects. It allows you to easily check for updates, download them and install them. Additionally, the QSimpleUpdater allows you to check for updates for different "modules" of your application. Check the [WTFs Section](#wtfs-section) for more information. + +Online documentation can be found [here](http://frc-utilities.github.io/documentation/qsimpleupdater/). + +[![Downloading](etc/screenshots/downloading.png)](etc/screenshots/) + +## Integrating QSimpleUpdater with your projects +1. Copy the QSimpleUpdater folder in your "3rd-party" folder. +2. Include the QSimpleUpdater project include (*pri*) file using the include() function. +3. That's all! Check the [tutorial project](/tutorial) as a reference for your project. + +## WTFs Section + +### 1. How does the QSimpleUpdater check for updates? + +The QSimpleUpdater downloads an update definition file stored in JSON format. This file specifies the latest version, the download links and changelogs for each platform (you can also register your own platform easily if needed). + +After downloading this file, the library analyzes the local version and the remote version. If the remote version is greater than the local version, then the library infers that there is an update available and notifies the user. + +An example update definition file can be found [here](https://github.com/alex-spataru/QSimpleUpdater/blob/master/tutorial/definitions/updates.json). + +### 2. Can I customize the update notifications shown to the user? + +Yes! You can "toggle" which notifications to show using the library's functions or re-implement by yourself the notifications by "reacting" to the signals emitted by the QSimpleUpdater. + +```c++ +QString url = "https://MyBadassApplication.com/updates.json"; + +QSimpleUpdater::getInstance()->setNotifyOnUpdate (url, true); +QSimpleUpdater::getInstance()->setNotifyOnFinish (url, false); + +QSimpleUpdater::getInstance()->checkForUpdates (url); +``` + +### 3. Is the application able to download the updates directly? + +Yes. If there is an update available, the library will prompt the user if he/she wants to download the update. You can enable or disable the integrated downloader with the following code: + +```c++ +QString url = "https://MyBadassApplication.com/updates.json"; +QSimpleUpdater::getInstance()->setDownloaderEnabled (url, true); +``` + +### 4. Why do I need to specify an URL for each function of the library? + +The QSimpleUpdater allows you to use different updater instances, which can be accessed with the URL of the update definitions. +While it is not obligatory to use multiple updater instances, this can be useful for applications that make use of plugins or different modules. + +Say that you are developing a game, in this case, you could use the following code: + +```c++ +// Update the game textures +QString textures_url = "https://MyBadassGame.com/textures.json" +QSimpleUpdater::getInstance()->setModuleName (textures_url, "textures"); +QSimpleUpdater::getInstance()->setModuleVersion (textures_url, "0.4"); +QSimpleUpdater::getInstance()->checkForUpdates (textures_url); + +// Update the game sounds +QString sounds_url = "https://MyBadassGame.com/sounds.json" +QSimpleUpdater::getInstance()->setModuleName (sounds_url, "sounds"); +QSimpleUpdater::getInstance()->setModuleVersion (sounds_url, "0.6"); +QSimpleUpdater::getInstance()->checkForUpdates (sounds_url); + +// Update the client (name & versions are already stored in qApp) +QString client_url = "https://MyBadassGame.com/client.json" +QSimpleUpdater::getInstance()->checkForUpdates (client_url); +``` + +## License +QSimpleUpdater is free and open-source software, it is released under the [DBAD](COPYING.md) license. diff --git a/LedOK/QSimpleUpdater/doc/config/doxyfile b/LedOK/QSimpleUpdater/doc/config/doxyfile new file mode 100644 index 0000000..61275ba --- /dev/null +++ b/LedOK/QSimpleUpdater/doc/config/doxyfile @@ -0,0 +1,2479 @@ +# Doxyfile 1.8.11 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = QSimpleUpdater + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "A simple auto-updater system for Qt applications" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = icon.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ../output + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = NO + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ../../src \ + ../../include \ + startpage.md + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, +# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.as \ + *.js + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = startpage.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /