Compare commits
210 Commits
blending_c
...
master_v2_
Author | SHA1 | Date | |
---|---|---|---|
9cd50bc908 | |||
9b677d7828 | |||
eed5964f02 | |||
|
6bfdb69fd8 | ||
|
be2a23fdff | ||
|
3d0925f444 | ||
|
4ddd39864e | ||
|
1379a257c7 | ||
|
d7104f33fd | ||
|
70d7a7010e | ||
|
66dffac3fe | ||
|
ea83d8023a | ||
|
4821e2100c | ||
6d5a661004 | |||
|
6105a290b3 | ||
|
ed0e427cd3 | ||
|
946f2dda3f | ||
|
7213e6bddb | ||
|
caac3e3d60 | ||
|
1f1a26de65 | ||
|
8583f77627 | ||
|
0f6972635c | ||
|
590ea06f2f | ||
|
7b25ddfee0 | ||
|
b6820b4368 | ||
|
4aef830905 | ||
|
f0c6ad03d9 | ||
|
191beed68d | ||
|
b2f2805247 | ||
|
7a0842ea24 | ||
|
67d3799550 | ||
|
a6842221ad | ||
|
be5bffaaff | ||
|
9eee4a4d1f | ||
44ae08f0c1 | |||
c62a34e34b | |||
70cb05c4ce | |||
12504e0ff6 | |||
55cba70a1c | |||
52dd69a9a5 | |||
e5a142fad4 | |||
33e76ee393 | |||
0a5f561bd6 | |||
2c498c05f0 | |||
75311073cb | |||
14076866ec | |||
|
44aadff1d2 | ||
82fc72c185 | |||
006d13af6a | |||
1eb926d029 | |||
a87b1bc380 | |||
593323a934 | |||
039d2d2de3 | |||
3f499105d9 | |||
243516ca6d | |||
6360f499da | |||
|
bb438b9eec | ||
|
61b3766012 | ||
f8dd60edbd | |||
d59a111b0d | |||
48466524bb | |||
|
46dee256f3 | ||
|
84ae856c71 | ||
55b518facc | |||
4738681294 | |||
|
da7a4bdd05 | ||
5998be5c1c | |||
5ce15fcb80 | |||
efb6f0437a | |||
d71124dfc4 | |||
2f645fa71c | |||
5027ba5233 | |||
aa0e83045b | |||
77e270c6b2 | |||
d29ca4c6dd | |||
361bcb7719 | |||
ae87589a45 | |||
800dfec98d | |||
|
3bc125cff0 | ||
5c7ac2a7d0 | |||
|
1b93f2f92a | ||
3b84db438f | |||
1d7e4de1d1 | |||
740ff764e5 | |||
|
9c7d961e67 | ||
966fe44583 | |||
899fdc5e66 | |||
|
98975d4cd5 | ||
|
f0f340e9a9 | ||
09c37b7e82 | |||
52c375fc7d | |||
|
a380a132b7 | ||
|
ba2594addf | ||
|
53ca6af019 | ||
6c304fdfe6 | |||
fdeb182c75 | |||
|
e4003940da | ||
|
789e80cffc | ||
|
ee37d680b2 | ||
|
00c4056b5d | ||
|
a4c3a24dda | ||
|
e9cbd79d3b | ||
|
4a8aacd710 | ||
740f175b69 | |||
|
1ce66817d4 | ||
|
a45c188c1e | ||
|
a254c7d118 | ||
|
dea3713269 | ||
|
652f6bfd2e | ||
ff00c6e652 | |||
b4338153f9 | |||
|
3fcd25ec96 | ||
7f833fd6f2 | |||
06dfea0815 | |||
|
8a197be56a | ||
|
601a95a33e | ||
|
27f914c995 | ||
|
1bfb5af0a5 | ||
|
5f3f9fd074 | ||
|
3afdf5c3bc | ||
|
80c44141e0 | ||
|
f9207cd6eb | ||
|
b2bd16128a | ||
|
fc6b23432c | ||
|
e68eb4c8d6 | ||
|
71abf1bba2 | ||
|
a2102bdb5e | ||
|
5a1dba7a8f | ||
|
e4827b4fe6 | ||
|
3e2a941f80 | ||
|
a5df1e0635 | ||
|
1273319fb6 | ||
|
d16df7ada8 | ||
12a940a55f | |||
dbecb1ff15 | |||
|
c35ff719c6 | ||
|
febcf00d94 | ||
|
8b6949f087 | ||
|
aee328fb82 | ||
|
2a6e8e78c0 | ||
|
f4b2e6cd15 | ||
|
2930add85f | ||
|
225fbd4faf | ||
|
da82416bd1 | ||
|
b0751a1b18 | ||
c88033899b | |||
b3cc026b41 | |||
e37999a924 | |||
|
114dd2794e | ||
|
c6c4522be7 | ||
|
33413fbb27 | ||
|
b2aff3720c | ||
15088f9d5e | |||
|
9ad2665b0d | ||
|
71bb5d58e7 | ||
|
b58ad2a4fd | ||
|
2ca40619d5 | ||
|
e940f24b52 | ||
|
3accecee65 | ||
|
17118497e2 | ||
|
939ce286f3 | ||
|
9c211e13bf | ||
|
6864213d67 | ||
|
d47ebdf1d4 | ||
|
3c20ba2461 | ||
|
ed2632279b | ||
|
d9c0368b7b | ||
|
2b60548fa9 | ||
|
e5b8380fe3 | ||
|
d37e1bfd43 | ||
|
385b5a230f | ||
|
a20a1c916c | ||
|
a81b7bbbc4 | ||
|
e38899754e | ||
|
b64ba60922 | ||
|
e4faef2694 | ||
|
d41b0843b1 | ||
|
c44a2076f3 | ||
|
273a141823 | ||
|
b8319dee50 | ||
|
089ce906d4 | ||
|
cbdaa5ee92 | ||
|
aa43b6965b | ||
|
3a92bee88e | ||
|
27dfbe138f | ||
|
cc8a36708d | ||
|
ae6eb30af5 | ||
|
35d5a3fdb9 | ||
|
5f9ab983e0 | ||
|
45e2e4589e | ||
|
4ecd2ab89d | ||
|
c21585bdba | ||
|
ddc87b464d | ||
|
bbde7029d8 | ||
|
a5488a0aca | ||
|
2807b58d4a | ||
|
887407ddb9 | ||
|
4f83a9b0e5 | ||
|
c0b97255d3 | ||
|
330c8a205e | ||
|
5f23bf8194 | ||
|
bddc61c63b | ||
|
f65ee05422 | ||
|
5f4ab631d0 | ||
|
938cb8ed83 | ||
|
d342ba6b54 | ||
|
7e28f2c5ea | ||
|
e6fed227dc | ||
|
2b1ab68d29 | ||
|
a43188c3a1 |
14
package.json
14
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "media_player_client",
|
"name": "media_player_client",
|
||||||
"version": "1.5.6",
|
"version": "1.6.0",
|
||||||
"description": "A Quasar Framework app",
|
"description": "A Quasar Framework app",
|
||||||
"productName": "MediaPlayerClient",
|
"productName": "MediaPlayerClient",
|
||||||
"author": "fangxiang <fangxiang@cloudview.work>",
|
"author": "fangxiang <fangxiang@cloudview.work>",
|
||||||
@ -9,16 +9,18 @@
|
|||||||
"test": "echo \"No test specified\" && exit 0"
|
"test": "echo \"No test specified\" && exit 0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@quasar/cli": "^1.3.2",
|
"@quasar/cli": "^2.0.0",
|
||||||
"@quasar/extras": "^1.15.6",
|
"@quasar/extras": "^1.15.11",
|
||||||
"@tinymce/tinymce-vue": "4",
|
"@tinymce/tinymce-vue": "4",
|
||||||
"@types/element-resize-detector": "^1.1.3",
|
"@types/element-resize-detector": "^1.1.3",
|
||||||
"autoprefixer": "^10.4.2",
|
"autoprefixer": "^10.4.2",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
|
"babel-loader": "^9.1.2",
|
||||||
"core-js": "^3.21.0",
|
"core-js": "^3.21.0",
|
||||||
"element-resize-detector": "^1.2.4",
|
"element-resize-detector": "^1.2.4",
|
||||||
|
"konva": "^8.4.2",
|
||||||
"qrcode.vue": "^3.3.3",
|
"qrcode.vue": "^3.3.3",
|
||||||
"quasar": "^2.10.2",
|
"quasar": "^2.11.6",
|
||||||
"reconnecting-websocket": "^4.4.0",
|
"reconnecting-websocket": "^4.4.0",
|
||||||
"sortablejs": "^1.15.0",
|
"sortablejs": "^1.15.0",
|
||||||
"to": "^0.2.9",
|
"to": "^0.2.9",
|
||||||
@ -26,8 +28,8 @@
|
|||||||
"update": "^0.7.4",
|
"update": "^0.7.4",
|
||||||
"v-viewer": "^3.0.9",
|
"v-viewer": "^3.0.9",
|
||||||
"vue": "^3.0.0",
|
"vue": "^3.0.0",
|
||||||
"vue-drag-resize": "^1.5.4",
|
|
||||||
"vue-i18n": "^9.1.9",
|
"vue-i18n": "^9.1.9",
|
||||||
|
"vue-konva": "^3.0.2",
|
||||||
"vue-router": "^4.0.0",
|
"vue-router": "^4.0.0",
|
||||||
"vue3-draggable-resizable": "^1.6.5",
|
"vue3-draggable-resizable": "^1.6.5",
|
||||||
"vuex": "^4.0.1",
|
"vuex": "^4.0.1",
|
||||||
@ -35,7 +37,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@capacitor/core": "^2.5.0",
|
"@capacitor/core": "^2.5.0",
|
||||||
"@quasar/app": "^3.3.3",
|
"@quasar/app-webpack": "^3.7.1",
|
||||||
"@types/node": "^10.17.15",
|
"@types/node": "^10.17.15",
|
||||||
"workbox-webpack-plugin": "^6.4.2"
|
"workbox-webpack-plugin": "^6.4.2"
|
||||||
},
|
},
|
||||||
|
BIN
public/magic_bg/bg.jpg
Normal file
BIN
public/magic_bg/bg.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 MiB |
@ -1,3 +1,5 @@
|
|||||||
window.media_control_client_product = "LED_PLAYER";
|
window.media_control_client_product = "LED_PLAYER";
|
||||||
// window.media_control_client_product = "SPECIAL_VIDEO";
|
// window.media_control_client_product = "SPECIAL_VIDEO";
|
||||||
// window.media_control_client_product = "RK_3568";
|
// window.media_control_client_product = "RK_3568";
|
||||||
|
|
||||||
|
window.media_control_client_custom_title = "SmartPlayer";
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 262 KiB |
2
public/tinymce/icons/default/icons.min.js
vendored
2
public/tinymce/icons/default/icons.min.js
vendored
File diff suppressed because one or more lines are too long
3
public/tinymce/langs/README.md
Normal file
3
public/tinymce/langs/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
This is where language files should be placed.
|
||||||
|
|
||||||
|
Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/
|
412
public/tinymce/langs/zh-Hans.js
Normal file
412
public/tinymce/langs/zh-Hans.js
Normal file
@ -0,0 +1,412 @@
|
|||||||
|
/*!
|
||||||
|
* TinyMCE Language Pack
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.
|
||||||
|
* Licensed under the Tiny commercial license. See https://www.tiny.cloud/legal/
|
||||||
|
*/
|
||||||
|
tinymce.addI18n('zh-Hans', {
|
||||||
|
"Redo": "重做",
|
||||||
|
"Undo": "撤销",
|
||||||
|
"Cut": "剪切",
|
||||||
|
"Copy": "复制",
|
||||||
|
"Paste": "粘贴",
|
||||||
|
"Select all": "全选",
|
||||||
|
"New document": "新建文档",
|
||||||
|
"Ok": "确定",
|
||||||
|
"Cancel": "取消",
|
||||||
|
"Visual aids": "网格线",
|
||||||
|
"Bold": "粗体",
|
||||||
|
"Italic": "斜体",
|
||||||
|
"Underline": "下划线",
|
||||||
|
"Strikethrough": "删除线",
|
||||||
|
"Superscript": "上标",
|
||||||
|
"Subscript": "下标",
|
||||||
|
"Clear formatting": "清除格式",
|
||||||
|
"Remove": "移除",
|
||||||
|
"Align left": "左对齐",
|
||||||
|
"Align center": "居中对齐",
|
||||||
|
"Align right": "右对齐",
|
||||||
|
"No alignment": "未对齐",
|
||||||
|
"Justify": "两端对齐",
|
||||||
|
"Bullet list": "无序列表",
|
||||||
|
"Numbered list": "有序列表",
|
||||||
|
"Decrease indent": "减少缩进",
|
||||||
|
"Increase indent": "增加缩进",
|
||||||
|
"Close": "关闭",
|
||||||
|
"Formats": "格式",
|
||||||
|
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.": "你的浏览器不支持打开剪贴板,请使用Ctrl+X/C/V等快捷键。",
|
||||||
|
"Headings": "标题",
|
||||||
|
"Heading 1": "一级标题",
|
||||||
|
"Heading 2": "二级标题",
|
||||||
|
"Heading 3": "三级标题",
|
||||||
|
"Heading 4": "四级标题",
|
||||||
|
"Heading 5": "五级标题",
|
||||||
|
"Heading 6": "六级标题",
|
||||||
|
"Preformatted": "预先格式化的",
|
||||||
|
"Div": "Div",
|
||||||
|
"Pre": "前言",
|
||||||
|
"Code": "代码",
|
||||||
|
"Paragraph": "段落",
|
||||||
|
"Blockquote": "引文区块",
|
||||||
|
"Inline": "文本",
|
||||||
|
"Blocks": "样式",
|
||||||
|
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "当前为纯文本粘贴模式,再次点击可以回到普通粘贴模式。",
|
||||||
|
"Fonts": "字体",
|
||||||
|
"Font sizes": "字体大小",
|
||||||
|
"Class": "类型",
|
||||||
|
"Browse for an image": "浏览图像",
|
||||||
|
"OR": "或",
|
||||||
|
"Drop an image here": "拖放一张图像至此",
|
||||||
|
"Upload": "上传",
|
||||||
|
"Uploading image": "上传图片",
|
||||||
|
"Block": "块",
|
||||||
|
"Align": "对齐",
|
||||||
|
"Default": "预设",
|
||||||
|
"Circle": "空心圆",
|
||||||
|
"Disc": "实心圆",
|
||||||
|
"Square": "实心方块",
|
||||||
|
"Lower Alpha": "小写英文字母",
|
||||||
|
"Lower Greek": "小写希腊字母",
|
||||||
|
"Lower Roman": "小写罗马数字",
|
||||||
|
"Upper Alpha": "大写英文字母",
|
||||||
|
"Upper Roman": "大写罗马数字",
|
||||||
|
"Anchor...": "锚点...",
|
||||||
|
"Anchor": "锚点",
|
||||||
|
"Name": "名称",
|
||||||
|
"ID": "ID",
|
||||||
|
"ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "ID应该以英文字母开头,后面只能有英文字母、数字、破折号、点、冒号或下划线。",
|
||||||
|
"You have unsaved changes are you sure you want to navigate away?": "你还有文档尚未保存,确定要离开?",
|
||||||
|
"Restore last draft": "恢复上次的草稿",
|
||||||
|
"Special character...": "特殊字符...",
|
||||||
|
"Special Character": "特殊字符",
|
||||||
|
"Source code": "源代码",
|
||||||
|
"Insert/Edit code sample": "插入/编辑代码示例",
|
||||||
|
"Language": "语言",
|
||||||
|
"Code sample...": "示例代码...",
|
||||||
|
"Left to right": "由左到右",
|
||||||
|
"Right to left": "由右到左",
|
||||||
|
"Title": "标题",
|
||||||
|
"Fullscreen": "全屏",
|
||||||
|
"Action": "动作",
|
||||||
|
"Shortcut": "快捷方式",
|
||||||
|
"Help": "帮助",
|
||||||
|
"Address": "地址",
|
||||||
|
"Focus to menubar": "移动焦点到菜单栏",
|
||||||
|
"Focus to toolbar": "移动焦点到工具栏",
|
||||||
|
"Focus to element path": "移动焦点到元素路径",
|
||||||
|
"Focus to contextual toolbar": "移动焦点到上下文菜单",
|
||||||
|
"Insert link (if link plugin activated)": "插入链接 (如果链接插件已激活)",
|
||||||
|
"Save (if save plugin activated)": "保存(如果保存插件已激活)",
|
||||||
|
"Find (if searchreplace plugin activated)": "查找(如果查找替换插件已激活)",
|
||||||
|
"Plugins installed ({0}):": "已安装插件 ({0}):",
|
||||||
|
"Premium plugins:": "优秀插件:",
|
||||||
|
"Learn more...": "了解更多...",
|
||||||
|
"You are using {0}": "你正在使用 {0}",
|
||||||
|
"Plugins": "插件",
|
||||||
|
"Handy Shortcuts": "快捷键",
|
||||||
|
"Horizontal line": "水平分割线",
|
||||||
|
"Insert/edit image": "插入/编辑图片",
|
||||||
|
"Alternative description": "替代描述",
|
||||||
|
"Accessibility": "辅助功能",
|
||||||
|
"Image is decorative": "图像是装饰性的",
|
||||||
|
"Source": "源",
|
||||||
|
"Dimensions": "尺寸",
|
||||||
|
"Constrain proportions": "保持比例",
|
||||||
|
"General": "一般",
|
||||||
|
"Advanced": "高级",
|
||||||
|
"Style": "样式",
|
||||||
|
"Vertical space": "垂直间距",
|
||||||
|
"Horizontal space": "水平间距",
|
||||||
|
"Border": "框线",
|
||||||
|
"Insert image": "插入图片",
|
||||||
|
"Image...": "图片...",
|
||||||
|
"Image list": "图片清单",
|
||||||
|
"Resize": "调整大小",
|
||||||
|
"Insert date/time": "插入日期/时间",
|
||||||
|
"Date/time": "日期/时间",
|
||||||
|
"Insert/edit link": "插入/编辑链接",
|
||||||
|
"Text to display": "要显示的文本",
|
||||||
|
"Url": "地址",
|
||||||
|
"Open link in...": "链接打开位置...",
|
||||||
|
"Current window": "当前窗口",
|
||||||
|
"None": "无",
|
||||||
|
"New window": "新窗口",
|
||||||
|
"Open link": "打开链接",
|
||||||
|
"Remove link": "移除链接",
|
||||||
|
"Anchors": "锚点",
|
||||||
|
"Link...": "链接...",
|
||||||
|
"Paste or type a link": "粘贴或输入链接",
|
||||||
|
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "你所填写的URL地址为邮件地址,需要加上mailto: 前缀吗?",
|
||||||
|
"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?": "你所填写的URL地址属于外部链接,需要加上http:// 前缀吗?",
|
||||||
|
"The URL you entered seems to be an external link. Do you want to add the required https:// prefix?": "您输入的 URL 似乎是一个外部链接。您想添加所需的 https:// 前缀吗?",
|
||||||
|
"Link list": "链接清单",
|
||||||
|
"Insert video": "插入视频",
|
||||||
|
"Insert/edit video": "插入/编辑视频",
|
||||||
|
"Insert/edit media": "插入/编辑媒体",
|
||||||
|
"Alternative source": "镜像",
|
||||||
|
"Alternative source URL": "替代来源网址",
|
||||||
|
"Media poster (Image URL)": "封面(图片地址)",
|
||||||
|
"Paste your embed code below:": "将内嵌代码粘贴在下面:",
|
||||||
|
"Embed": "内嵌",
|
||||||
|
"Media...": "多媒体...",
|
||||||
|
"Nonbreaking space": "不间断空格",
|
||||||
|
"Page break": "分页符",
|
||||||
|
"Paste as text": "粘贴为文本",
|
||||||
|
"Preview": "预览",
|
||||||
|
"Print": "打印",
|
||||||
|
"Print...": "打印...",
|
||||||
|
"Save": "保存",
|
||||||
|
"Find": "寻找",
|
||||||
|
"Replace with": "替换为",
|
||||||
|
"Replace": "替换",
|
||||||
|
"Replace all": "替换全部",
|
||||||
|
"Previous": "上一个",
|
||||||
|
"Next": "下一个",
|
||||||
|
"Find and Replace": "查找和替换",
|
||||||
|
"Find and replace...": "查找并替换...",
|
||||||
|
"Could not find the specified string.": "未找到搜索内容。",
|
||||||
|
"Match case": "大小写匹配",
|
||||||
|
"Find whole words only": "全字匹配",
|
||||||
|
"Find in selection": "在选区中查找",
|
||||||
|
"Insert table": "插入表格",
|
||||||
|
"Table properties": "表格属性",
|
||||||
|
"Delete table": "删除表格",
|
||||||
|
"Cell": "单元格",
|
||||||
|
"Row": "行",
|
||||||
|
"Column": "栏目",
|
||||||
|
"Cell properties": "单元格属性",
|
||||||
|
"Merge cells": "合并单元格",
|
||||||
|
"Split cell": "拆分单元格",
|
||||||
|
"Insert row before": "在上方插入行",
|
||||||
|
"Insert row after": "在下方插入行",
|
||||||
|
"Delete row": "删除行",
|
||||||
|
"Row properties": "行属性",
|
||||||
|
"Cut row": "剪切行",
|
||||||
|
"Cut column": "剪切列",
|
||||||
|
"Copy row": "复制行",
|
||||||
|
"Copy column": "复制列",
|
||||||
|
"Paste row before": "粘贴行到上方",
|
||||||
|
"Paste column before": "粘贴此列前",
|
||||||
|
"Paste row after": "粘贴行到下方",
|
||||||
|
"Paste column after": "粘贴后面的列",
|
||||||
|
"Insert column before": "在左侧插入列",
|
||||||
|
"Insert column after": "在右侧插入列",
|
||||||
|
"Delete column": "删除列",
|
||||||
|
"Cols": "列",
|
||||||
|
"Rows": "行数",
|
||||||
|
"Width": "宽度",
|
||||||
|
"Height": "高度",
|
||||||
|
"Cell spacing": "单元格外间距",
|
||||||
|
"Cell padding": "单元格内边距",
|
||||||
|
"Row clipboard actions": "行剪贴板操作",
|
||||||
|
"Column clipboard actions": "列剪贴板操作",
|
||||||
|
"Table styles": "表格样式",
|
||||||
|
"Cell styles": "单元格样式",
|
||||||
|
"Column header": "列标题",
|
||||||
|
"Row header": "行头",
|
||||||
|
"Table caption": "表格标题",
|
||||||
|
"Caption": "标题",
|
||||||
|
"Show caption": "显示标题",
|
||||||
|
"Left": "左",
|
||||||
|
"Center": "居中",
|
||||||
|
"Right": "右",
|
||||||
|
"Cell type": "储存格别",
|
||||||
|
"Scope": "范围",
|
||||||
|
"Alignment": "对齐",
|
||||||
|
"Horizontal align": "水平对齐",
|
||||||
|
"Vertical align": "垂直对齐",
|
||||||
|
"Top": "上方对齐",
|
||||||
|
"Middle": "居中对齐",
|
||||||
|
"Bottom": "下方对齐",
|
||||||
|
"Header cell": "表头单元格",
|
||||||
|
"Row group": "行组",
|
||||||
|
"Column group": "列组",
|
||||||
|
"Row type": "行类型",
|
||||||
|
"Header": "表头",
|
||||||
|
"Body": "表体",
|
||||||
|
"Footer": "表尾",
|
||||||
|
"Border color": "框线颜色",
|
||||||
|
"Solid": "实线",
|
||||||
|
"Dotted": "虚线",
|
||||||
|
"Dashed": "虚线",
|
||||||
|
"Double": "双精度",
|
||||||
|
"Groove": "凹槽",
|
||||||
|
"Ridge": "海脊座",
|
||||||
|
"Inset": "嵌入",
|
||||||
|
"Outset": "外置",
|
||||||
|
"Hidden": "隐藏",
|
||||||
|
"Insert template...": "插入模板...",
|
||||||
|
"Templates": "模板",
|
||||||
|
"Template": "模板",
|
||||||
|
"Insert Template": "插入模板",
|
||||||
|
"Text color": "文本颜色",
|
||||||
|
"Background color": "背景颜色",
|
||||||
|
"Custom...": "自定义......",
|
||||||
|
"Custom color": "自定义颜色",
|
||||||
|
"No color": "无",
|
||||||
|
"Remove color": "移除颜色",
|
||||||
|
"Show blocks": "显示区块边框",
|
||||||
|
"Show invisible characters": "显示不可见字符",
|
||||||
|
"Word count": "字数",
|
||||||
|
"Count": "计数",
|
||||||
|
"Document": "文档",
|
||||||
|
"Selection": "选择",
|
||||||
|
"Words": "单词",
|
||||||
|
"Words: {0}": "字数:{0}",
|
||||||
|
"{0} words": "{0} 字",
|
||||||
|
"File": "文件",
|
||||||
|
"Edit": "编辑",
|
||||||
|
"Insert": "插入",
|
||||||
|
"View": "查看",
|
||||||
|
"Format": "格式",
|
||||||
|
"Table": "表格",
|
||||||
|
"Tools": "工具",
|
||||||
|
"Powered by {0}": "由{0}驱动",
|
||||||
|
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "编辑区。按ALT-F9打开菜单,按ALT-F10打开工具栏,按ALT-0查看帮助",
|
||||||
|
"Image title": "图片标题",
|
||||||
|
"Border width": "边框宽度",
|
||||||
|
"Border style": "边框样式",
|
||||||
|
"Error": "错误",
|
||||||
|
"Warn": "警告",
|
||||||
|
"Valid": "有效",
|
||||||
|
"To open the popup, press Shift+Enter": "按Shitf+Enter键打开对话框",
|
||||||
|
"Rich Text Area": "富文本区域",
|
||||||
|
"Rich Text Area. Press ALT-0 for help.": "编辑区。按Alt+0键打开帮助。",
|
||||||
|
"System Font": "系统字体",
|
||||||
|
"Failed to upload image: {0}": "图片上传失败: {0}",
|
||||||
|
"Failed to load plugin: {0} from url {1}": "插件加载失败: {0} 来自链接 {1}",
|
||||||
|
"Failed to load plugin url: {0}": "插件加载失败 链接: {0}",
|
||||||
|
"Failed to initialize plugin: {0}": "插件初始化失败: {0}",
|
||||||
|
"example": "示例",
|
||||||
|
"Search": "搜索",
|
||||||
|
"All": "全部",
|
||||||
|
"Currency": "货币",
|
||||||
|
"Text": "文字",
|
||||||
|
"Quotations": "引用",
|
||||||
|
"Mathematical": "数学",
|
||||||
|
"Extended Latin": "拉丁语扩充",
|
||||||
|
"Symbols": "符号",
|
||||||
|
"Arrows": "箭头",
|
||||||
|
"User Defined": "自定义",
|
||||||
|
"dollar sign": "美元符号",
|
||||||
|
"currency sign": "货币符号",
|
||||||
|
"euro-currency sign": "欧元符号",
|
||||||
|
"colon sign": "冒号",
|
||||||
|
"cruzeiro sign": "克鲁赛罗币符号",
|
||||||
|
"french franc sign": "法郎符号",
|
||||||
|
"lira sign": "里拉符号",
|
||||||
|
"mill sign": "密尔符号",
|
||||||
|
"naira sign": "奈拉符号",
|
||||||
|
"peseta sign": "比塞塔符号",
|
||||||
|
"rupee sign": "卢比符号",
|
||||||
|
"won sign": "韩元符号",
|
||||||
|
"new sheqel sign": "新谢克尔符号",
|
||||||
|
"dong sign": "越南盾符号",
|
||||||
|
"kip sign": "老挝基普符号",
|
||||||
|
"tugrik sign": "图格里克符号",
|
||||||
|
"drachma sign": "德拉克马符号",
|
||||||
|
"german penny symbol": "德国便士符号",
|
||||||
|
"peso sign": "比索符号",
|
||||||
|
"guarani sign": "瓜拉尼符号",
|
||||||
|
"austral sign": "澳元符号",
|
||||||
|
"hryvnia sign": "格里夫尼亚符号",
|
||||||
|
"cedi sign": "塞地符号",
|
||||||
|
"livre tournois sign": "里弗弗尔符号",
|
||||||
|
"spesmilo sign": "spesmilo符号",
|
||||||
|
"tenge sign": "坚戈符号",
|
||||||
|
"indian rupee sign": "印度卢比",
|
||||||
|
"turkish lira sign": "土耳其里拉",
|
||||||
|
"nordic mark sign": "北欧马克",
|
||||||
|
"manat sign": "马纳特符号",
|
||||||
|
"ruble sign": "卢布符号",
|
||||||
|
"yen character": "日元字样",
|
||||||
|
"yuan character": "人民币元字样",
|
||||||
|
"yuan character, in hong kong and taiwan": "元字样(港台地区)",
|
||||||
|
"yen/yuan character variant one": "元字样(大写)",
|
||||||
|
"Emojis": "Emojis",
|
||||||
|
"Emojis...": "Emojis...",
|
||||||
|
"Loading emojis...": "正在加载Emojis...",
|
||||||
|
"Could not load emojis": "无法加载Emojis",
|
||||||
|
"People": "人类",
|
||||||
|
"Animals and Nature": "动物和自然",
|
||||||
|
"Food and Drink": "食物和饮品",
|
||||||
|
"Activity": "活动",
|
||||||
|
"Travel and Places": "旅游和地点",
|
||||||
|
"Objects": "物件",
|
||||||
|
"Flags": "旗帜",
|
||||||
|
"Characters": "字符",
|
||||||
|
"Characters (no spaces)": "字符(无空格)",
|
||||||
|
"{0} characters": "{0} 个字符",
|
||||||
|
"Error: Form submit field collision.": "错误: 表单提交字段冲突。",
|
||||||
|
"Error: No form element found.": "错误: 没有表单控件。",
|
||||||
|
"Color swatch": "颜色样本",
|
||||||
|
"Color Picker": "选色器",
|
||||||
|
"Invalid hex color code: {0}": "十六进制颜色代码无效: {0}",
|
||||||
|
"Invalid input": "无效输入",
|
||||||
|
"R": "R",
|
||||||
|
"Red component": "红色部分",
|
||||||
|
"G": "G",
|
||||||
|
"Green component": "绿色部分",
|
||||||
|
"B": "B",
|
||||||
|
"Blue component": "白色部分",
|
||||||
|
"#": "#",
|
||||||
|
"Hex color code": "十六进制颜色代码",
|
||||||
|
"Range 0 to 255": "范围0至255",
|
||||||
|
"Turquoise": "青绿色",
|
||||||
|
"Green": "绿色",
|
||||||
|
"Blue": "蓝色",
|
||||||
|
"Purple": "紫色",
|
||||||
|
"Navy Blue": "海军蓝",
|
||||||
|
"Dark Turquoise": "深蓝绿色",
|
||||||
|
"Dark Green": "深绿色",
|
||||||
|
"Medium Blue": "中蓝色",
|
||||||
|
"Medium Purple": "中紫色",
|
||||||
|
"Midnight Blue": "深蓝色",
|
||||||
|
"Yellow": "黄色",
|
||||||
|
"Orange": "橙色",
|
||||||
|
"Red": "红色",
|
||||||
|
"Light Gray": "浅灰色",
|
||||||
|
"Gray": "灰色",
|
||||||
|
"Dark Yellow": "暗黄色",
|
||||||
|
"Dark Orange": "深橙色",
|
||||||
|
"Dark Red": "深红色",
|
||||||
|
"Medium Gray": "中灰色",
|
||||||
|
"Dark Gray": "深灰色",
|
||||||
|
"Light Green": "浅绿色",
|
||||||
|
"Light Yellow": "浅黄色",
|
||||||
|
"Light Red": "浅红色",
|
||||||
|
"Light Purple": "浅紫色",
|
||||||
|
"Light Blue": "浅蓝色",
|
||||||
|
"Dark Purple": "深紫色",
|
||||||
|
"Dark Blue": "深蓝色",
|
||||||
|
"Black": "黑色",
|
||||||
|
"White": "白色",
|
||||||
|
"Switch to or from fullscreen mode": "切换全屏模式",
|
||||||
|
"Open help dialog": "打开帮助对话框",
|
||||||
|
"history": "历史",
|
||||||
|
"styles": "样式",
|
||||||
|
"formatting": "格式化",
|
||||||
|
"alignment": "对齐",
|
||||||
|
"indentation": "缩进",
|
||||||
|
"Font": "字体",
|
||||||
|
"Size": "字号",
|
||||||
|
"More...": "更多...",
|
||||||
|
"Select...": "选择...",
|
||||||
|
"Preferences": "首选项",
|
||||||
|
"Yes": "是",
|
||||||
|
"No": "否",
|
||||||
|
"Keyboard Navigation": "键盘指引",
|
||||||
|
"Version": "版本",
|
||||||
|
"Code view": "代码视图",
|
||||||
|
"Open popup menu for split buttons": "打开弹出式菜单,用于拆分按钮",
|
||||||
|
"List Properties": "列表属性",
|
||||||
|
"List properties...": "标题字体属性",
|
||||||
|
"Start list at number": "以数字开始列表",
|
||||||
|
"Line height": "行高",
|
||||||
|
"Dropped file type is not supported": "此文件类型不支持拖放",
|
||||||
|
"Loading...": "加载中...",
|
||||||
|
"ImageProxy HTTP error: Rejected request": "图片代理请求错误:请求被拒绝",
|
||||||
|
"ImageProxy HTTP error: Could not find Image Proxy": "图片代理请求错误:无法找到图片代理",
|
||||||
|
"ImageProxy HTTP error: Incorrect Image Proxy URL": "图片代理请求错误:图片代理地址错误",
|
||||||
|
"ImageProxy HTTP error: Unknown ImageProxy error": "图片代理请求错误:未知的图片代理错误"
|
||||||
|
});
|
@ -1,417 +0,0 @@
|
|||||||
tinymce.addI18n('zh_CN',{
|
|
||||||
"Redo": "恢复",
|
|
||||||
"Undo": "撤销",
|
|
||||||
"Cut": "剪切",
|
|
||||||
"Copy": "复制",
|
|
||||||
"Paste": "粘贴",
|
|
||||||
"Select all": "全选",
|
|
||||||
"New document": "新建文档",
|
|
||||||
"Ok": "确定",
|
|
||||||
"Cancel": "取消",
|
|
||||||
"Visual aids": "网格线",
|
|
||||||
"Bold": "粗体",
|
|
||||||
"Italic": "斜体",
|
|
||||||
"Underline": "下划线",
|
|
||||||
"Strikethrough": "删除线",
|
|
||||||
"Superscript": "上标",
|
|
||||||
"Subscript": "下标",
|
|
||||||
"Clear formatting": "清除格式",
|
|
||||||
"Align left": "左对齐",
|
|
||||||
"Align center": "居中",
|
|
||||||
"Align right": "右对齐",
|
|
||||||
"Justify": "两端对齐",
|
|
||||||
"Bullet list": "符号列表",
|
|
||||||
"Numbered list": "数字列表",
|
|
||||||
"Decrease indent": "减少缩进",
|
|
||||||
"Increase indent": "增加缩进",
|
|
||||||
"Close": "关闭",
|
|
||||||
"Formats": "格式",
|
|
||||||
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "当前浏览器不支持访问剪贴板,请使用快捷键Ctrl+X/C/V复制粘贴",
|
|
||||||
"Headers": "标题",
|
|
||||||
"Header 1": "标题1",
|
|
||||||
"Header 2": "标题2",
|
|
||||||
"Header 3": "标题3",
|
|
||||||
"Header 4": "标题4",
|
|
||||||
"Header 5": "标题5",
|
|
||||||
"Header 6": "标题6",
|
|
||||||
"Headings": "标题",
|
|
||||||
"Heading 1": "标题1",
|
|
||||||
"Heading 2": "标题2",
|
|
||||||
"Heading 3": "标题3",
|
|
||||||
"Heading 4": "标题4",
|
|
||||||
"Heading 5": "标题5",
|
|
||||||
"Heading 6": "标题6",
|
|
||||||
"Preformatted": "预格式化",
|
|
||||||
"Div": "Div区块",
|
|
||||||
"Pre": "预格式文本",
|
|
||||||
"Code": "代码",
|
|
||||||
"Paragraph": "段落",
|
|
||||||
"Blockquote": "引用",
|
|
||||||
"Inline": "文本",
|
|
||||||
"Blocks": "区块",
|
|
||||||
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "当前为纯文本粘贴模式,再次点击可以回到普通粘贴模式。",
|
|
||||||
"Fonts": "字体",
|
|
||||||
"Font Sizes": "字号",
|
|
||||||
"Class": "Class",
|
|
||||||
"Browse for an image": "浏览图像",
|
|
||||||
"OR": "或",
|
|
||||||
"Drop an image here": "拖放一张图片文件至此",
|
|
||||||
"Upload": "上传",
|
|
||||||
"Block": "块",
|
|
||||||
"Align": "对齐",
|
|
||||||
"Default": "默认",
|
|
||||||
"Circle": "空心圆",
|
|
||||||
"Disc": "实心圆",
|
|
||||||
"Square": "方块",
|
|
||||||
"Lower Alpha": "小写英文字母",
|
|
||||||
"Lower Greek": "小写希腊字母",
|
|
||||||
"Lower Roman": "小写罗马字母",
|
|
||||||
"Upper Alpha": "大写英文字母",
|
|
||||||
"Upper Roman": "大写罗马字母",
|
|
||||||
"Anchor...": "锚点...",
|
|
||||||
"Name": "名称",
|
|
||||||
"Id": "id",
|
|
||||||
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "id应该以字母开头,后跟字母、数字、横线、点、冒号或下划线。",
|
|
||||||
"You have unsaved changes are you sure you want to navigate away?": "你对文档的修改尚未保存,确定离开吗?",
|
|
||||||
"Restore last draft": "恢复上次的草稿",
|
|
||||||
"Special characters...": "特殊字符...",
|
|
||||||
"Source code": "HTML源码",
|
|
||||||
"Insert\/Edit code sample": "插入/编辑代码示例",
|
|
||||||
"Language": "语言",
|
|
||||||
"Code sample...": "代码示例...",
|
|
||||||
"Color Picker": "选取颜色",
|
|
||||||
"R": "R",
|
|
||||||
"G": "G",
|
|
||||||
"B": "B",
|
|
||||||
"Left to right": "从左到右",
|
|
||||||
"Right to left": "从右到左",
|
|
||||||
"Emoticons...": "表情符号...",
|
|
||||||
"Metadata and Document Properties": "元数据和文档属性",
|
|
||||||
"Title": "标题",
|
|
||||||
"Keywords": "关键词",
|
|
||||||
"Description": "描述",
|
|
||||||
"Robots": "机器人",
|
|
||||||
"Author": "作者",
|
|
||||||
"Encoding": "编码",
|
|
||||||
"Fullscreen": "全屏",
|
|
||||||
"Action": "操作",
|
|
||||||
"Shortcut": "快捷键",
|
|
||||||
"Help": "帮助",
|
|
||||||
"Address": "地址",
|
|
||||||
"Focus to menubar": "移动焦点到菜单栏",
|
|
||||||
"Focus to toolbar": "移动焦点到工具栏",
|
|
||||||
"Focus to element path": "移动焦点到元素路径",
|
|
||||||
"Focus to contextual toolbar": "移动焦点到上下文菜单",
|
|
||||||
"Insert link (if link plugin activated)": "插入链接 (如果链接插件已激活)",
|
|
||||||
"Save (if save plugin activated)": "保存(如果保存插件已激活)",
|
|
||||||
"Find (if searchreplace plugin activated)": "查找(如果查找替换插件已激活)",
|
|
||||||
"Plugins installed ({0}):": "已安装插件 ({0}):",
|
|
||||||
"Premium plugins:": "优秀插件:",
|
|
||||||
"Learn more...": "了解更多...",
|
|
||||||
"You are using {0}": "你正在使用 {0}",
|
|
||||||
"Plugins": "插件",
|
|
||||||
"Handy Shortcuts": "快捷键",
|
|
||||||
"Horizontal line": "水平分割线",
|
|
||||||
"Insert\/edit image": "插入/编辑图片",
|
|
||||||
"Image description": "图片描述",
|
|
||||||
"Source": "地址",
|
|
||||||
"Dimensions": "大小",
|
|
||||||
"Constrain proportions": "保持宽高比",
|
|
||||||
"General": "常规",
|
|
||||||
"Advanced": "高级",
|
|
||||||
"Style": "样式",
|
|
||||||
"Vertical space": "垂直边距",
|
|
||||||
"Horizontal space": "水平边距",
|
|
||||||
"Border": "边框",
|
|
||||||
"Insert image": "插入图片",
|
|
||||||
"Image...": "图片...",
|
|
||||||
"Image list": "图片列表",
|
|
||||||
"Rotate counterclockwise": "逆时针旋转",
|
|
||||||
"Rotate clockwise": "顺时针旋转",
|
|
||||||
"Flip vertically": "垂直翻转",
|
|
||||||
"Flip horizontally": "水平翻转",
|
|
||||||
"Edit image": "编辑图片",
|
|
||||||
"Image options": "图片选项",
|
|
||||||
"Zoom in": "放大",
|
|
||||||
"Zoom out": "缩小",
|
|
||||||
"Crop": "裁剪",
|
|
||||||
"Resize": "调整大小",
|
|
||||||
"Orientation": "方向",
|
|
||||||
"Brightness": "亮度",
|
|
||||||
"Sharpen": "锐化",
|
|
||||||
"Contrast": "对比度",
|
|
||||||
"Color levels": "色阶",
|
|
||||||
"Gamma": "伽马值",
|
|
||||||
"Invert": "反转",
|
|
||||||
"Apply": "应用",
|
|
||||||
"Back": "后退",
|
|
||||||
"Insert date\/time": "插入日期/时间",
|
|
||||||
"Date\/time": "日期/时间",
|
|
||||||
"Insert\/Edit Link": "插入/编辑链接",
|
|
||||||
"Insert\/edit link": "插入/编辑链接",
|
|
||||||
"Text to display": "显示文字",
|
|
||||||
"Url": "地址",
|
|
||||||
"Open link in...": "链接打开方式...",
|
|
||||||
"Current window": "当前窗口打开",
|
|
||||||
"None": "在当前窗口/框架打开",
|
|
||||||
"New window": "在新窗口打开",
|
|
||||||
"Remove link": "删除链接",
|
|
||||||
"Anchors": "锚点",
|
|
||||||
"Link...": "链接...",
|
|
||||||
"Paste or type a link": "粘贴或输入链接",
|
|
||||||
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "你所填写的URL地址为邮件地址,需要加上mailto:前缀吗?",
|
|
||||||
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "你所填写的URL地址属于外部链接,需要加上http://:前缀吗?",
|
|
||||||
"Link list": "链接列表",
|
|
||||||
"Insert video": "插入视频",
|
|
||||||
"Insert\/edit video": "插入/编辑视频",
|
|
||||||
"Insert\/edit media": "插入/编辑媒体",
|
|
||||||
"Alternative source": "替代资源",
|
|
||||||
"Alternative image URL": "资源备用地址",
|
|
||||||
"Media poster (Image URL)": "封面(图片地址)",
|
|
||||||
"Paste your embed code below:": "将内嵌代码粘贴在下面:",
|
|
||||||
"Embed": "内嵌",
|
|
||||||
"Media...": "多媒体...",
|
|
||||||
"Nonbreaking space": "不间断空格",
|
|
||||||
"Page break": "分页符",
|
|
||||||
"Paste as text": "粘贴为文本",
|
|
||||||
"Preview": "预览",
|
|
||||||
"Print...": "打印...",
|
|
||||||
"Save": "保存",
|
|
||||||
"Find": "查找",
|
|
||||||
"Replace with": "替换为",
|
|
||||||
"Replace": "替换",
|
|
||||||
"Replace all": "替换全部",
|
|
||||||
"Previous": "上一个",
|
|
||||||
"Next": "下一个",
|
|
||||||
"Find and replace...": "查找并替换...",
|
|
||||||
"Could not find the specified string.": "未找到搜索内容。",
|
|
||||||
"Match case": "区分大小写",
|
|
||||||
"Find whole words only": "全单词匹配",
|
|
||||||
"Spell check": "拼写检查",
|
|
||||||
"Ignore": "忽略",
|
|
||||||
"Ignore all": "忽略全部",
|
|
||||||
"Finish": "完成",
|
|
||||||
"Add to Dictionary": "添加到字典",
|
|
||||||
"Insert table": "插入表格",
|
|
||||||
"Table properties": "表格属性",
|
|
||||||
"Delete table": "删除表格",
|
|
||||||
"Cell": "单元格",
|
|
||||||
"Row": "行",
|
|
||||||
"Column": "列",
|
|
||||||
"Cell properties": "单元格属性",
|
|
||||||
"Merge cells": "合并单元格",
|
|
||||||
"Split cell": "拆分单元格",
|
|
||||||
"Insert row before": "在上方插入",
|
|
||||||
"Insert row after": "在下方插入",
|
|
||||||
"Delete row": "删除行",
|
|
||||||
"Row properties": "行属性",
|
|
||||||
"Cut row": "剪切行",
|
|
||||||
"Copy row": "复制行",
|
|
||||||
"Paste row before": "粘贴到上方",
|
|
||||||
"Paste row after": "粘贴到下方",
|
|
||||||
"Insert column before": "在左侧插入",
|
|
||||||
"Insert column after": "在右侧插入",
|
|
||||||
"Delete column": "删除列",
|
|
||||||
"Cols": "列",
|
|
||||||
"Rows": "行",
|
|
||||||
"Width": "宽",
|
|
||||||
"Height": "高",
|
|
||||||
"Cell spacing": "单元格外间距",
|
|
||||||
"Cell padding": "单元格内边距",
|
|
||||||
"Show caption": "显示标题",
|
|
||||||
"Left": "左对齐",
|
|
||||||
"Center": "居中",
|
|
||||||
"Right": "右对齐",
|
|
||||||
"Cell type": "单元格类型",
|
|
||||||
"Scope": "范围",
|
|
||||||
"Alignment": "对齐方式",
|
|
||||||
"H Align": "水平对齐",
|
|
||||||
"V Align": "垂直对齐",
|
|
||||||
"Top": "顶部对齐",
|
|
||||||
"Middle": "垂直居中",
|
|
||||||
"Bottom": "底部对齐",
|
|
||||||
"Header cell": "表头单元格",
|
|
||||||
"Row group": "行组",
|
|
||||||
"Column group": "列组",
|
|
||||||
"Row type": "行类型",
|
|
||||||
"Header": "表头",
|
|
||||||
"Body": "表体",
|
|
||||||
"Footer": "表尾",
|
|
||||||
"Border color": "边框颜色",
|
|
||||||
"Insert template...": "插入模板...",
|
|
||||||
"Templates": "模板",
|
|
||||||
"Template": "模板",
|
|
||||||
"Text color": "文字颜色",
|
|
||||||
"Background color": "背景色",
|
|
||||||
"Custom...": "自定义...",
|
|
||||||
"Custom color": "自定义颜色",
|
|
||||||
"No color": "无",
|
|
||||||
"Remove color": "删除颜色",
|
|
||||||
"Table of Contents": "目录",
|
|
||||||
"Show blocks": "显示区块边框",
|
|
||||||
"Show invisible characters": "显示不可见字符",
|
|
||||||
"Word count": "字数统计",
|
|
||||||
"Words: {0}": "字数:{0}",
|
|
||||||
"{0} words": "{0} 个字",
|
|
||||||
"File": "文件",
|
|
||||||
"Edit": "编辑",
|
|
||||||
"Insert": "插入",
|
|
||||||
"View": "查看",
|
|
||||||
"Format": "格式",
|
|
||||||
"Table": "表格",
|
|
||||||
"Tools": "工具",
|
|
||||||
"Powered by {0}": "Powered by {0}",
|
|
||||||
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "在编辑区按ALT+F9打开菜单,按ALT+F10打开工具栏,按ALT+0查看帮助",
|
|
||||||
"Image title": "图片标题",
|
|
||||||
"Border width": "边框宽度",
|
|
||||||
"Border style": "边框样式",
|
|
||||||
"Error": "错误",
|
|
||||||
"Warn": "警告",
|
|
||||||
"Valid": "有效",
|
|
||||||
"To open the popup, press Shift+Enter": "此快捷为软回车(插入<br>)",
|
|
||||||
"Rich Text Area. Press ALT-0 for help.": "编辑区. 按Alt+0键打开帮助",
|
|
||||||
"System Font": "默认字体",
|
|
||||||
"Failed to upload image: {0}": "图片上传失败: {0}",
|
|
||||||
"Failed to load plugin: {0} from url {1}": "插件加载失败: {0} - {1}",
|
|
||||||
"Failed to load plugin url: {0}": "插件加载失败: {0}",
|
|
||||||
"Failed to initialize plugin: {0}": "插件初始化失败: {0}",
|
|
||||||
"example": "示例",
|
|
||||||
"Search": "查找",
|
|
||||||
"All": "全部",
|
|
||||||
"Currency": "货币",
|
|
||||||
"Text": "文本",
|
|
||||||
"Quotations": "引用",
|
|
||||||
"Mathematical": "数学运算符",
|
|
||||||
"Extended Latin": "拉丁语扩充",
|
|
||||||
"Symbols": "符号",
|
|
||||||
"Arrows": "箭头",
|
|
||||||
"User Defined": "自定义",
|
|
||||||
"dollar sign": "美元",
|
|
||||||
"currency sign": "货币",
|
|
||||||
"euro-currency sign": "欧元",
|
|
||||||
"colon sign": "冒号",
|
|
||||||
"cruzeiro sign": "克鲁赛罗币",
|
|
||||||
"french franc sign": "法郎",
|
|
||||||
"lira sign": "里拉",
|
|
||||||
"mill sign": "密尔",
|
|
||||||
"naira sign": "奈拉",
|
|
||||||
"peseta sign": "比塞塔",
|
|
||||||
"rupee sign": "卢比",
|
|
||||||
"won sign": "韩元",
|
|
||||||
"new sheqel sign": "新谢克尔",
|
|
||||||
"dong sign": "越南盾",
|
|
||||||
"kip sign": "老挝基普",
|
|
||||||
"tugrik sign": "图格里克",
|
|
||||||
"drachma sign": "德拉克马",
|
|
||||||
"german penny symbol": "德国便士",
|
|
||||||
"peso sign": "比索",
|
|
||||||
"guarani sign": "瓜拉尼",
|
|
||||||
"austral sign": "澳元",
|
|
||||||
"hryvnia sign": "格里夫尼亚",
|
|
||||||
"cedi sign": "塞地",
|
|
||||||
"livre tournois sign": "里弗弗尔",
|
|
||||||
"spesmilo sign": "一千spesoj的货币符号,该货币未使用",
|
|
||||||
"tenge sign": "坚戈",
|
|
||||||
"indian rupee sign": "印度卢比",
|
|
||||||
"turkish lira sign": "土耳其里拉",
|
|
||||||
"nordic mark sign": "北欧马克",
|
|
||||||
"manat sign": "马纳特",
|
|
||||||
"ruble sign": "卢布",
|
|
||||||
"yen character": "日元",
|
|
||||||
"yuan character": "人民币元",
|
|
||||||
"yuan character, in hong kong and taiwan": "元的繁体字",
|
|
||||||
"yen\/yuan character variant one": "元(大写)",
|
|
||||||
"Loading emoticons...": "正在加载表情文字...",
|
|
||||||
"Could not load emoticons": "不能加载表情文字",
|
|
||||||
"People": "人类",
|
|
||||||
"Animals and Nature": "动物和自然",
|
|
||||||
"Food and Drink": "食物和饮品",
|
|
||||||
"Activity": "活动",
|
|
||||||
"Travel and Places": "旅游和地点",
|
|
||||||
"Objects": "物件",
|
|
||||||
"Flags": "旗帜",
|
|
||||||
"Characters": "字数",
|
|
||||||
"Characters (no spaces)": "字数(不含空格)",
|
|
||||||
"Error: Form submit field collision.": "错误: 表单提交字段冲突.",
|
|
||||||
"Error: No form element found.": "错误: 未找到可用的form.",
|
|
||||||
"Update": "更新",
|
|
||||||
"Color swatch": "颜色样本",
|
|
||||||
"Turquoise": "青绿",
|
|
||||||
"Green": "绿色",
|
|
||||||
"Blue": "蓝色",
|
|
||||||
"Purple": "紫色",
|
|
||||||
"Navy Blue": "海军蓝",
|
|
||||||
"Dark Turquoise": "深蓝绿色",
|
|
||||||
"Dark Green": "暗绿",
|
|
||||||
"Medium Blue": "中蓝",
|
|
||||||
"Medium Purple": "中紫",
|
|
||||||
"Midnight Blue": "深蓝",
|
|
||||||
"Yellow": "黄色",
|
|
||||||
"Orange": "橙色",
|
|
||||||
"Red": "红色",
|
|
||||||
"Light Gray": "浅灰",
|
|
||||||
"Gray": "灰色",
|
|
||||||
"Dark Yellow": "暗黄",
|
|
||||||
"Dark Orange": "暗橙",
|
|
||||||
"Dark Red": "暗红",
|
|
||||||
"Medium Gray": "中灰",
|
|
||||||
"Dark Gray": "深灰",
|
|
||||||
"Black": "黑色",
|
|
||||||
"White": "白色",
|
|
||||||
"Switch to or from fullscreen mode": "切换全屏模式",
|
|
||||||
"Open help dialog": "打开帮助对话框",
|
|
||||||
"history": "历史",
|
|
||||||
"styles": "样式",
|
|
||||||
"formatting": "格式化",
|
|
||||||
"alignment": "对齐",
|
|
||||||
"indentation": "缩进",
|
|
||||||
"permanent pen": "记号笔",
|
|
||||||
"comments": "注释",
|
|
||||||
"Anchor": "锚点",
|
|
||||||
"Special character": "特殊字符",
|
|
||||||
"Code sample": "代码示例",
|
|
||||||
"Color": "颜色",
|
|
||||||
"Emoticons": "表情",
|
|
||||||
"Document properties": "文档属性",
|
|
||||||
"Image": "图片",
|
|
||||||
"Insert link": "插入链接",
|
|
||||||
"Target": "目标",
|
|
||||||
"Link": "链接",
|
|
||||||
"Poster": "封面",
|
|
||||||
"Media": "音视频",
|
|
||||||
"Print": "打印",
|
|
||||||
"Prev": "上一个",
|
|
||||||
"Find and replace": "查找并替换",
|
|
||||||
"Whole words": "全字匹配",
|
|
||||||
"Spellcheck": "拼写检查",
|
|
||||||
"Caption": "标题",
|
|
||||||
"Insert template": "插入模板",
|
|
||||||
//以下为补充汉化内容 by 莫若卿
|
|
||||||
"Code view": "代码区域",
|
|
||||||
"Select...": "选择...",
|
|
||||||
"Format Painter": "格式刷",
|
|
||||||
"No templates defined.": "无内置模板",
|
|
||||||
"Special character...": "特殊字符...",
|
|
||||||
"Open link": "打开链接",
|
|
||||||
"None": "无",
|
|
||||||
"Count": "统计",
|
|
||||||
"Document": "整个文档",
|
|
||||||
"Selection": "选取部分",
|
|
||||||
"Words": "字词数",
|
|
||||||
"{0} characters": "{0} 个字符",
|
|
||||||
"Alternative source URL": "替代资源地址",
|
|
||||||
"Alternative description": "替代说明文字",
|
|
||||||
"Accessibility": "可访问性",
|
|
||||||
"Image is decorative": "仅用于装饰",
|
|
||||||
//5.6新增
|
|
||||||
"Line height": "行高",
|
|
||||||
"Cut column": "剪切列",
|
|
||||||
"Copy column": "复制列",
|
|
||||||
"Paste column before": "粘贴到前方",
|
|
||||||
"Paste column after": "粘贴到后方",
|
|
||||||
"Copy column": "复制列",
|
|
||||||
//帮助窗口内的文字
|
|
||||||
"Version": "版本",
|
|
||||||
"Keyboard Navigation": "键盘导航",
|
|
||||||
"Open popup menu for split buttons": "该组合键的作用是软回车(插入br)",
|
|
||||||
});
|
|
21
public/tinymce/license.txt
Normal file
21
public/tinymce/license.txt
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 Ephox Corporation DBA Tiny Technologies, Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
4
public/tinymce/models/dom/model.min.js
vendored
4
public/tinymce/models/dom/model.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
public/tinymce/plugins/wordcount/plugin.min.js
vendored
Normal file
4
public/tinymce/plugins/wordcount/plugin.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
public/tinymce/skins/ui/oxide/skin.min.css
vendored
1
public/tinymce/skins/ui/oxide/skin.min.css
vendored
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@
|
|||||||
body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4
public/tinymce/themes/silver/theme.min.js
vendored
4
public/tinymce/themes/silver/theme.min.js
vendored
File diff suppressed because one or more lines are too long
4
public/tinymce/tinymce.min.js
vendored
4
public/tinymce/tinymce.min.js
vendored
File diff suppressed because one or more lines are too long
@ -41,9 +41,12 @@ module.exports = configure(function (ctx) {
|
|||||||
// Full list of options: https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build
|
// Full list of options: https://v2.quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build
|
||||||
build: {
|
build: {
|
||||||
vueRouterMode: "hash", // available values: 'hash', 'history'
|
vueRouterMode: "hash", // available values: 'hash', 'history'
|
||||||
|
uglifyOptions: {
|
||||||
|
compress: {
|
||||||
|
drop_console: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
// transpile: false,
|
// transpile: false,
|
||||||
|
|
||||||
// Add dependencies for transpiling with Babel (Array of string/regex)
|
// Add dependencies for transpiling with Babel (Array of string/regex)
|
||||||
// (from node_modules, which are by default not transpiled).
|
// (from node_modules, which are by default not transpiled).
|
||||||
// Applies only if "transpile" is set to true.
|
// Applies only if "transpile" is set to true.
|
||||||
@ -52,7 +55,7 @@ module.exports = configure(function (ctx) {
|
|||||||
// rtl: true, // https://v2.quasar.dev/options/rtl-support
|
// rtl: true, // https://v2.quasar.dev/options/rtl-support
|
||||||
// preloadChunks: true,
|
// preloadChunks: true,
|
||||||
// showProgress: false,
|
// showProgress: false,
|
||||||
// gzip: true,
|
gzip: true,
|
||||||
// analyze: true,
|
// analyze: true,
|
||||||
|
|
||||||
// Options below are automatically set depending on the env, set them if you want to override
|
// Options below are automatically set depending on the env, set them if you want to override
|
||||||
|
52
src/App.vue
52
src/App.vue
@ -10,10 +10,13 @@ import { SessionStorage, Cookies, useQuasar, setCssVar } from "quasar";
|
|||||||
import { defineComponent } from "vue";
|
import { defineComponent } from "vue";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import EventBus, { EventNamesDefine } from "src/common/EventBus";
|
import EventBus, { EventNamesDefine } from "src/common/EventBus";
|
||||||
import { useStore } from "src/store";
|
import { IWuJieInterface, useStore } from "src/store";
|
||||||
import GlobalData from "./common/GlobalData";
|
import GlobalData from "./common/GlobalData";
|
||||||
import { EProductNames } from "./entities/ProductNames";
|
import { EProductNames } from "./entities/ProductNames";
|
||||||
import { api } from "./boot/axios";
|
import { api } from "./boot/axios";
|
||||||
|
import { WuJieInitializer } from "./common/WuJieInitializer";
|
||||||
|
import ClientConnection from "./common/ClientConnection";
|
||||||
|
import { Common } from "./common/Common";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "App",
|
name: "App",
|
||||||
@ -23,6 +26,12 @@ export default defineComponent({
|
|||||||
const $store = useStore();
|
const $store = useStore();
|
||||||
const $q = useQuasar();
|
const $q = useQuasar();
|
||||||
|
|
||||||
|
if ((window as any).$wujie) {
|
||||||
|
const $wujie = (window as any).$wujie as IWuJieInterface;
|
||||||
|
$store.commit("setWuJie", $wujie);
|
||||||
|
WuJieInitializer.initialize($wujie, $store, $q, $t);
|
||||||
|
}
|
||||||
|
|
||||||
document.title = $t.t("title");
|
document.title = $t.t("title");
|
||||||
|
|
||||||
if (!navigator.cookieEnabled) {
|
if (!navigator.cookieEnabled) {
|
||||||
@ -63,7 +72,12 @@ export default defineComponent({
|
|||||||
(<any>window).media_control_client_product == EProductNames.LED_PLAYER ||
|
(<any>window).media_control_client_product == EProductNames.LED_PLAYER ||
|
||||||
(<any>window).media_control_client_product == EProductNames.OLD_LED_PLAYER
|
(<any>window).media_control_client_product == EProductNames.OLD_LED_PLAYER
|
||||||
) {
|
) {
|
||||||
document.title = $t.t("LedPlayer") + "WebApp";
|
const custom_title = (<any>window).media_control_client_custom_title;
|
||||||
|
if (custom_title && typeof custom_title == "string") {
|
||||||
|
document.title = custom_title;
|
||||||
|
} else {
|
||||||
|
document.title = $t.t("LedPlayer") + "WebApp";
|
||||||
|
}
|
||||||
} else if (
|
} else if (
|
||||||
(<any>window).media_control_client_product == EProductNames.SPECIAL_VIDEO
|
(<any>window).media_control_client_product == EProductNames.SPECIAL_VIDEO
|
||||||
) {
|
) {
|
||||||
@ -272,6 +286,40 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EventBus.getInstance().on(
|
||||||
|
EventNamesDefine.CurrentConnectConnected,
|
||||||
|
async (connection: ClientConnection) => {
|
||||||
|
const show_version_tip = () =>
|
||||||
|
$q.dialog({
|
||||||
|
persistent: true,
|
||||||
|
title: $t.t("Version Mismatch !"),
|
||||||
|
message: $t.t(
|
||||||
|
"Version Mismatch ! Please Upgrade The Software Again ! Otherwise, The File Function Cannot Be Used !"
|
||||||
|
),
|
||||||
|
});
|
||||||
|
if (connection) {
|
||||||
|
let count = 0;
|
||||||
|
while (
|
||||||
|
connection &&
|
||||||
|
!connection.is_login &&
|
||||||
|
count < (1000 * 10) / 100 /* 10 S */
|
||||||
|
) {
|
||||||
|
await Common.waitFor(100);
|
||||||
|
}
|
||||||
|
if (count < (1000 * 10) / 100) {
|
||||||
|
try {
|
||||||
|
const response = await connection.getHttpInterfaceVersion();
|
||||||
|
if (!response || response.version != 2) {
|
||||||
|
show_version_tip();
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
show_version_tip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -16,6 +16,7 @@ import JointActionEquipmentTableEntity from "src/entities/JointActionEquipmentTa
|
|||||||
import { CustomProtocol } from "src/entities/WSProtocolCustom";
|
import { CustomProtocol } from "src/entities/WSProtocolCustom";
|
||||||
import ClientConnectionCustom from "./ClientConnectionCustom";
|
import ClientConnectionCustom from "./ClientConnectionCustom";
|
||||||
import MagicWallConfig from "src/entities/MagicWallConfig";
|
import MagicWallConfig from "src/entities/MagicWallConfig";
|
||||||
|
import WuJieReconnectingWebSocket from "./WuJieReconnectingWebSocket";
|
||||||
|
|
||||||
class _RpcInfo {
|
class _RpcInfo {
|
||||||
send_timestamp: number;
|
send_timestamp: number;
|
||||||
@ -45,7 +46,7 @@ class _RpcInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default class ClientConnection {
|
export default class ClientConnection {
|
||||||
ws: ReconnectingWebSocket | null = null;
|
ws: ReconnectingWebSocket | null | WuJieReconnectingWebSocket = null;
|
||||||
url = "";
|
url = "";
|
||||||
user_name = "";
|
user_name = "";
|
||||||
password = "";
|
password = "";
|
||||||
@ -67,14 +68,17 @@ export default class ClientConnection {
|
|||||||
this.url = url;
|
this.url = url;
|
||||||
this.user_name = user_name ?? "";
|
this.user_name = user_name ?? "";
|
||||||
this.password = password ?? "";
|
this.password = password ?? "";
|
||||||
|
const $wujie = (window as any).$wujie;
|
||||||
|
|
||||||
if (this.ws) {
|
if (this.ws) {
|
||||||
this.ws.close();
|
this.ws.close();
|
||||||
}
|
}
|
||||||
this.ws = new ReconnectingWebSocket(url);
|
if ($wujie) {
|
||||||
|
this.ws = new WuJieReconnectingWebSocket();
|
||||||
|
} else {
|
||||||
|
this.ws = new ReconnectingWebSocket(url);
|
||||||
|
}
|
||||||
this.initializeWs();
|
this.initializeWs();
|
||||||
|
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
this.checkRpcTimeout();
|
this.checkRpcTimeout();
|
||||||
}, 1000);
|
}, 1000);
|
||||||
@ -104,13 +108,13 @@ export default class ClientConnection {
|
|||||||
|
|
||||||
initializeWs() {
|
initializeWs() {
|
||||||
if (this.ws) {
|
if (this.ws) {
|
||||||
this.ws.onclose = (ev) => {
|
this.ws.onclose = (ev: any) => {
|
||||||
this.onClose(ev);
|
this.onClose(ev);
|
||||||
};
|
};
|
||||||
this.ws.onerror = (ev) => {
|
this.ws.onerror = (ev: any) => {
|
||||||
this.onError(ev);
|
this.onError(ev);
|
||||||
};
|
};
|
||||||
this.ws.onopen = (ev) => {
|
this.ws.onopen = (ev: any) => {
|
||||||
this.onOpen(ev);
|
this.onOpen(ev);
|
||||||
};
|
};
|
||||||
this.ws.onmessage = (ev) => {
|
this.ws.onmessage = (ev) => {
|
||||||
@ -706,6 +710,23 @@ export default class ClientConnection {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
public setMagicWallList(list:any) {
|
||||||
|
this.ws?.send(
|
||||||
|
JSON.stringify(
|
||||||
|
new Protocol.SetApplicationConfigRequestEntity(
|
||||||
|
0,
|
||||||
|
"magic_list",
|
||||||
|
typeof (list) == 'string' ? list : JSON.stringify(list)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setConfigure(k: string, v: string) {
|
||||||
|
this.ws?.send(
|
||||||
|
JSON.stringify(new Protocol.SetApplicationConfigRequestEntity(0, k, v))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public setUserName(user_name: string) {
|
public setUserName(user_name: string) {
|
||||||
this.ws?.send(
|
this.ws?.send(
|
||||||
@ -813,6 +834,7 @@ export default class ClientConnection {
|
|||||||
active_code: string,
|
active_code: string,
|
||||||
online: boolean,
|
online: boolean,
|
||||||
active_forever: boolean,
|
active_forever: boolean,
|
||||||
|
attribute: number,
|
||||||
secret_key?: string,
|
secret_key?: string,
|
||||||
hour?: number
|
hour?: number
|
||||||
) {
|
) {
|
||||||
@ -823,6 +845,7 @@ export default class ClientConnection {
|
|||||||
active_code,
|
active_code,
|
||||||
online,
|
online,
|
||||||
active_forever,
|
active_forever,
|
||||||
|
attribute,
|
||||||
secret_key,
|
secret_key,
|
||||||
hour,
|
hour,
|
||||||
0
|
0
|
||||||
@ -1242,7 +1265,6 @@ export default class ClientConnection {
|
|||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async setMagicWallConfig(config: MagicWallConfig) {
|
public async setMagicWallConfig(config: MagicWallConfig) {
|
||||||
try {
|
try {
|
||||||
return await this.doRpc<Protocol.RpcSetMagicWallConfigResponseEntity>(
|
return await this.doRpc<Protocol.RpcSetMagicWallConfigResponseEntity>(
|
||||||
@ -1252,7 +1274,26 @@ export default class ClientConnection {
|
|||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//
|
||||||
|
public async getMagicWallGridState() {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.RpcGetMagicWallGridStateResponseEntity>(
|
||||||
|
new Protocol.RpcGetMagicWallGridStateRequestEntity()
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async setMagicWallGridState(show_grid: boolean) {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.RpcSetMagicWallGridStateResponseEntity>(
|
||||||
|
new Protocol.RpcSetMagicWallGridStateRequestEntity(show_grid)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
public async testA(
|
public async testA(
|
||||||
x: number,
|
x: number,
|
||||||
y: number,
|
y: number,
|
||||||
@ -1315,6 +1356,12 @@ export default class ClientConnection {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getHttpInterfaceVersion() {
|
||||||
|
return await this.doRpc<Protocol.RpcGetHttpInterfaceVersionResponseEntity>(
|
||||||
|
new Protocol.RpcGetHttpInterfaceVersionRequestEntity()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public async setJointActionEquipment(
|
public async setJointActionEquipment(
|
||||||
entity: JointActionEquipmentTableEntity
|
entity: JointActionEquipmentTableEntity
|
||||||
) {
|
) {
|
||||||
@ -1333,6 +1380,7 @@ export default class ClientConnection {
|
|||||||
row: number,
|
row: number,
|
||||||
column: number,
|
column: number,
|
||||||
correction_type: number,
|
correction_type: number,
|
||||||
|
control_point_count: number,
|
||||||
control_point: number,
|
control_point: number,
|
||||||
x: number,
|
x: number,
|
||||||
y: number
|
y: number
|
||||||
@ -1342,6 +1390,7 @@ export default class ClientConnection {
|
|||||||
row,
|
row,
|
||||||
column,
|
column,
|
||||||
correction_type,
|
correction_type,
|
||||||
|
control_point_count,
|
||||||
control_point,
|
control_point,
|
||||||
x,
|
x,
|
||||||
y
|
y
|
||||||
@ -1397,13 +1446,9 @@ export default class ClientConnection {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async EnableBlending(
|
public async EnableBlending(enable: boolean) {
|
||||||
enable: boolean
|
|
||||||
) {
|
|
||||||
return await this.doRpc<Protocol.NoneResponse>(
|
return await this.doRpc<Protocol.NoneResponse>(
|
||||||
new Protocol.EnableBlendingRequestEntity(
|
new Protocol.EnableBlendingRequestEntity(enable)
|
||||||
enable
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1412,7 +1457,8 @@ export default class ClientConnection {
|
|||||||
column: number,
|
column: number,
|
||||||
location: number,
|
location: number,
|
||||||
enable: boolean,
|
enable: boolean,
|
||||||
width: number
|
width: number,
|
||||||
|
auto_sync: boolean,
|
||||||
) {
|
) {
|
||||||
return await this.doRpc<Protocol.NoneResponse>(
|
return await this.doRpc<Protocol.NoneResponse>(
|
||||||
new Protocol.SetBlendingOverlapRequestEntity(
|
new Protocol.SetBlendingOverlapRequestEntity(
|
||||||
@ -1420,7 +1466,8 @@ export default class ClientConnection {
|
|||||||
column,
|
column,
|
||||||
location,
|
location,
|
||||||
enable,
|
enable,
|
||||||
width
|
width,
|
||||||
|
auto_sync
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1440,6 +1487,7 @@ export default class ClientConnection {
|
|||||||
public async SetBlendingHorDensity(
|
public async SetBlendingHorDensity(
|
||||||
row: number,
|
row: number,
|
||||||
column: number,
|
column: number,
|
||||||
|
control_point_count: number,
|
||||||
control_point: number,
|
control_point: number,
|
||||||
value: number
|
value: number
|
||||||
) {
|
) {
|
||||||
@ -1447,6 +1495,7 @@ export default class ClientConnection {
|
|||||||
new Protocol.SetBlendingHorDensityRequestEntity(
|
new Protocol.SetBlendingHorDensityRequestEntity(
|
||||||
row,
|
row,
|
||||||
column,
|
column,
|
||||||
|
control_point_count,
|
||||||
control_point,
|
control_point,
|
||||||
value
|
value
|
||||||
)
|
)
|
||||||
@ -1456,6 +1505,7 @@ export default class ClientConnection {
|
|||||||
public async SetBlendingVerDensity(
|
public async SetBlendingVerDensity(
|
||||||
row: number,
|
row: number,
|
||||||
column: number,
|
column: number,
|
||||||
|
control_point_count: number,
|
||||||
control_point: number,
|
control_point: number,
|
||||||
value: number
|
value: number
|
||||||
) {
|
) {
|
||||||
@ -1463,6 +1513,7 @@ export default class ClientConnection {
|
|||||||
new Protocol.SetBlendingVerDensityRequestEntity(
|
new Protocol.SetBlendingVerDensityRequestEntity(
|
||||||
row,
|
row,
|
||||||
column,
|
column,
|
||||||
|
control_point_count,
|
||||||
control_point,
|
control_point,
|
||||||
value
|
value
|
||||||
)
|
)
|
||||||
@ -1475,15 +1526,9 @@ export default class ClientConnection {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async SetBlendingOption(
|
public async SetBlendingOption(id: string, value: string) {
|
||||||
id: string,
|
|
||||||
value: string
|
|
||||||
) {
|
|
||||||
return await this.doRpc<Protocol.NoneResponse>(
|
return await this.doRpc<Protocol.NoneResponse>(
|
||||||
new Protocol.SetBlendingOptionRequestEntity(
|
new Protocol.SetBlendingOptionRequestEntity(id, value)
|
||||||
id,
|
|
||||||
value
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1505,6 +1550,52 @@ export default class ClientConnection {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async AddBlendingCtrlPoint(
|
||||||
|
type: string,
|
||||||
|
row: number,
|
||||||
|
column: number,
|
||||||
|
count: number
|
||||||
|
) {
|
||||||
|
return await this.doRpc<Protocol.GetBlendingConfigResponseEntity>(
|
||||||
|
new Protocol.AddBlendingCtrlPointRequestEntity(type, row, column, count)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async DelBlendingCtrlPoint(
|
||||||
|
type: string,
|
||||||
|
row: number,
|
||||||
|
column: number,
|
||||||
|
count: number
|
||||||
|
) {
|
||||||
|
return await this.doRpc<Protocol.GetBlendingConfigResponseEntity>(
|
||||||
|
new Protocol.DelBlendingCtrlPointRequestEntity(type, row, column, count)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async SetProjectorResolution(width: number, height: number) {
|
||||||
|
return await this.doRpc<Protocol.GetBlendingConfigResponseEntity>(
|
||||||
|
new Protocol.SetProjectorResolutionRequestEntity(width, height)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async SetProjectorLayout(row: number, column: number) {
|
||||||
|
return await this.doRpc<Protocol.GetBlendingConfigResponseEntity>(
|
||||||
|
new Protocol.SetProjectorLayoutRequestEntity(row, column)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async setCloudServerSetting(
|
||||||
|
cloud_server_address: string,
|
||||||
|
cloud_server_verify_key: string,
|
||||||
|
cloud_server_use_wss: boolean,
|
||||||
|
cloud_server_enable: boolean
|
||||||
|
) {
|
||||||
|
this.setConfigure("cloud_server_address", cloud_server_address);
|
||||||
|
this.setConfigure("cloud_server_verify_key", cloud_server_verify_key);
|
||||||
|
this.setConfigure("cloud_server_use_wss", cloud_server_use_wss ? "1" : "0");
|
||||||
|
this.setConfigure("cloud_server_enable", cloud_server_enable ? "1" : "0");
|
||||||
|
}
|
||||||
|
|
||||||
public destory() {
|
public destory() {
|
||||||
this.ws?.close();
|
this.ws?.close();
|
||||||
if (this.ws) {
|
if (this.ws) {
|
||||||
@ -1515,6 +1606,59 @@ export default class ClientConnection {
|
|||||||
}
|
}
|
||||||
this.ws = null;
|
this.ws = null;
|
||||||
}
|
}
|
||||||
|
public async getFileListFileManager(dir_path: string) {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.RpcFileManagerGetFileListResponse>(
|
||||||
|
new Protocol.RpcFileManagerGetFileListRequest(dir_path)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async RenameFileManager(
|
||||||
|
base_dir: string,
|
||||||
|
file_name: string,
|
||||||
|
new_file_name: string
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.RpcFileManagerRenameResponse>(
|
||||||
|
new Protocol.RpcFileManagerRenameRequest(
|
||||||
|
base_dir,
|
||||||
|
file_name,
|
||||||
|
new_file_name
|
||||||
|
)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async DeleteFileManager(base_dir: string, file_name: string) {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.RpcFileManagerDeleteResponse>(
|
||||||
|
new Protocol.RpcFileManagerDeleteRequest(base_dir, file_name)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async CreateDirectoryFileManager(base_dir: string, dir_name: string) {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.RpcFileManagerCreateDirectoryResponse>(
|
||||||
|
new Protocol.RpcFileManagerCreateDirectoryRequest(base_dir, dir_name)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async CheckModeIndex(mode_index: number) {
|
||||||
|
try {
|
||||||
|
return await this.doRpc<Protocol.RpcCheckModeIndexResponseEntity>(
|
||||||
|
new Protocol.RpcCheckModeIndexRequestEntity(mode_index)
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface NotifyMessage {
|
export interface NotifyMessage {
|
||||||
|
@ -21,6 +21,10 @@ export default class GlobalData {
|
|||||||
return 61428;
|
return 61428;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static get kDefaultHttpPort() {
|
||||||
|
return 80;
|
||||||
|
}
|
||||||
|
|
||||||
private _current_client_name = "";
|
private _current_client_name = "";
|
||||||
|
|
||||||
public static getInstance() {
|
public static getInstance() {
|
||||||
|
59
src/common/ValidationUtil.ts
Normal file
59
src/common/ValidationUtil.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
export default class ValidationUtil {
|
||||||
|
static isIpAddress(str: string): boolean {
|
||||||
|
return (
|
||||||
|
str == "localhost" ||
|
||||||
|
/^([1-9]|[1-9][0-9]|1\d\d|2[0-2][0-3])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])\.([1-9]|[1-9][0-9]|1\d\d|2[0-4]\d|25[0-4])$/.test(
|
||||||
|
str
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isHost(str: string): boolean {
|
||||||
|
return (
|
||||||
|
str == "localhost" ||
|
||||||
|
/^([1-9]|[1-9][0-9]|1\d\d|2[0-2][0-3])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])\.([1-9]|[1-9][0-9]|1\d\d|2[0-4]\d|25[0-4])$/.test(
|
||||||
|
str
|
||||||
|
) ||
|
||||||
|
/^([1-9]|[1-9][0-9]|1\d\d|2[0-2][0-3])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])\.([1-9]|[1-9][0-9]|1\d\d|2[0-4]\d|25[0-4])\:([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5])$/.test(
|
||||||
|
str
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isMacAddress(str: string): boolean {
|
||||||
|
return /([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}/.test(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isMaskAddress(str: string): boolean {
|
||||||
|
return /^(254|252|248|240|224|192|128|0)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)$/.test(
|
||||||
|
str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isHexStr(str: string): boolean {
|
||||||
|
if (str != null && str != undefined && typeof str == "string") {
|
||||||
|
str = str.trim();
|
||||||
|
if (str.length == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (const item of str.split(" ")) {
|
||||||
|
if (item.length > 4) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!/^0[xX][A-Fa-f0-9]{1,2}/.test(item)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static isResolution(str: string): boolean {
|
||||||
|
return /([0-9]{1,5})[x|X]([0-9]{1,5}@[0-9]{1,3}$)/.test(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
static isEnglishOrNum(str: string): boolean {
|
||||||
|
return /^[0-9a-zA-Z_\-]+$/.test(str);
|
||||||
|
}
|
||||||
|
}
|
92
src/common/WuJieInitializer.ts
Normal file
92
src/common/WuJieInitializer.ts
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import GlobalData from "src/common/GlobalData";
|
||||||
|
import {
|
||||||
|
LocaleMessage,
|
||||||
|
DateTimeFormat,
|
||||||
|
NumberFormat,
|
||||||
|
} from "@intlify/core-base";
|
||||||
|
import { QVueGlobals } from "quasar";
|
||||||
|
import { Composer, VueMessageType } from "vue-i18n";
|
||||||
|
import { Store } from "vuex";
|
||||||
|
import { IWuJieInterface, StateInterface } from "./../store/index";
|
||||||
|
import EventBus, { EventNamesDefine } from "./EventBus";
|
||||||
|
import Initializer from "./Initializer";
|
||||||
|
import ClientConnection from "./ClientConnection";
|
||||||
|
|
||||||
|
export class WuJieInitializer {
|
||||||
|
public static initialize(
|
||||||
|
$wujie: IWuJieInterface,
|
||||||
|
$store: Store<StateInterface>,
|
||||||
|
$q: QVueGlobals,
|
||||||
|
$t: Composer<
|
||||||
|
{
|
||||||
|
[x: string]: LocaleMessage<VueMessageType>;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[x: string]: DateTimeFormat;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[x: string]: NumberFormat;
|
||||||
|
},
|
||||||
|
string,
|
||||||
|
string,
|
||||||
|
string
|
||||||
|
>
|
||||||
|
) {
|
||||||
|
if ($wujie) {
|
||||||
|
$wujie.bus.$on("initialize_app", (device_sn: string) => {
|
||||||
|
WuJieInitializer.onInitializeApp(device_sn, $wujie, $store, $q, $t);
|
||||||
|
});
|
||||||
|
setTimeout(() => {
|
||||||
|
$wujie.bus.$emit("client_mounted");
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static onInitializeApp(
|
||||||
|
device_sn: string,
|
||||||
|
$wujie: IWuJieInterface,
|
||||||
|
$store: Store<StateInterface>,
|
||||||
|
$q: QVueGlobals,
|
||||||
|
$t: Composer<
|
||||||
|
{
|
||||||
|
[x: string]: LocaleMessage<VueMessageType>;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[x: string]: DateTimeFormat;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[x: string]: NumberFormat;
|
||||||
|
},
|
||||||
|
string,
|
||||||
|
string,
|
||||||
|
string
|
||||||
|
>
|
||||||
|
) {
|
||||||
|
setTimeout(() => {
|
||||||
|
const global_data = GlobalData.getInstance();
|
||||||
|
const client = global_data.getCurrentClient();
|
||||||
|
if (!client) {
|
||||||
|
const client_name = "WuJie@" + device_sn;
|
||||||
|
console.log(client_name);
|
||||||
|
global_data.addClient(client_name, new ClientConnection("", "", ""));
|
||||||
|
global_data.setCurrentClientName(client_name);
|
||||||
|
}
|
||||||
|
if (client) {
|
||||||
|
client._is_login = true;
|
||||||
|
}
|
||||||
|
new Initializer({
|
||||||
|
$t,
|
||||||
|
$store,
|
||||||
|
$q,
|
||||||
|
})
|
||||||
|
.initialize()
|
||||||
|
.then(() => {
|
||||||
|
$store.commit("setInitialized");
|
||||||
|
if ($wujie) {
|
||||||
|
$wujie.bus.$emit("client_initialize_end");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
EventBus.getInstance().emit(EventNamesDefine.WebSocketConnected, this);
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
}
|
59
src/common/WuJieReconnectingWebSocket.ts
Normal file
59
src/common/WuJieReconnectingWebSocket.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { IWuJieInterface } from "./../store/index";
|
||||||
|
import { store } from "quasar/wrappers";
|
||||||
|
|
||||||
|
export default class WuJieReconnectingWebSocket {
|
||||||
|
readyState: number;
|
||||||
|
$wujie: IWuJieInterface;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.readyState = WebSocket.OPEN;
|
||||||
|
this.onclose = (ev: any) => {};
|
||||||
|
this.onerror = (ev: any) => {};
|
||||||
|
this.onmessage = (ev: any) => {};
|
||||||
|
this.onopen = (ev: any) => {};
|
||||||
|
|
||||||
|
this.$wujie = (window as any).$wujie;
|
||||||
|
if (this.$wujie) {
|
||||||
|
this.$wujie.bus.$on("onclose", this.onclose);
|
||||||
|
this.$wujie.bus.$on("onerror", this.onerror);
|
||||||
|
this.$wujie.bus.$on("onmessage", (ev: any) => {
|
||||||
|
if (this.onmessage) {
|
||||||
|
this.onmessage(ev);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.$wujie.bus.$on("onopen", this.onopen);
|
||||||
|
setTimeout(() => {
|
||||||
|
if (this.onopen) {
|
||||||
|
this.onopen(null);
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onclose: ((event: any) => void) | null;
|
||||||
|
/**
|
||||||
|
* An event listener to be called when an error occurs
|
||||||
|
*/
|
||||||
|
onerror: ((event: any) => void) | null;
|
||||||
|
/**
|
||||||
|
* An event listener to be called when a message is received from the server
|
||||||
|
*/
|
||||||
|
onmessage: ((event: MessageEvent) => void) | null;
|
||||||
|
/**
|
||||||
|
* An event listener to be called when the WebSocket connection's readyState changes to OPEN;
|
||||||
|
* this indicates that the connection is ready to send and receive data
|
||||||
|
*/
|
||||||
|
onopen: ((event: any) => void) | null;
|
||||||
|
/**
|
||||||
|
* Closes the WebSocket connection or connection attempt, if any. If the connection is already
|
||||||
|
* CLOSED, this method does nothing
|
||||||
|
*/
|
||||||
|
close(code?: number, reason?: string) {}
|
||||||
|
/**
|
||||||
|
* Enqueue specified data to be transmitted to the server over the WebSocket connection
|
||||||
|
*/
|
||||||
|
send(data: string) {
|
||||||
|
if (this.$wujie) {
|
||||||
|
this.$wujie.bus.$emit("send_to", data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -11,7 +11,7 @@
|
|||||||
}
|
}
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<q-card class="overflow-hidden" style="overflow-y: scroll; max-width: 35vw">
|
<q-card class="overflow-hidden" style="overflow-y: scroll; max-width: 40vw">
|
||||||
<q-form>
|
<q-form>
|
||||||
<q-card-section class="q-ma-none q-pa-sm">
|
<q-card-section class="q-ma-none q-pa-sm">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -37,8 +37,67 @@
|
|||||||
|
|
||||||
<q-separator />
|
<q-separator />
|
||||||
|
|
||||||
<q-card-section style="max-height: 50vh; width: 35vw" class="scroll">
|
<q-card-section style="max-height: 60vh; width: 40vw" class="scroll">
|
||||||
<q-list>
|
<q-list>
|
||||||
|
<q-item>
|
||||||
|
<q-item-section avatar>{{ $t("product") }}</q-item-section>
|
||||||
|
<q-item-section>
|
||||||
|
<q-radio
|
||||||
|
v-model="selected_product"
|
||||||
|
val=""
|
||||||
|
:label="$t('normal')"
|
||||||
|
color="cyan"
|
||||||
|
class="offset-md-1 col"
|
||||||
|
:loading="loading"
|
||||||
|
:disable="loading"
|
||||||
|
/>
|
||||||
|
</q-item-section>
|
||||||
|
<q-item-section>
|
||||||
|
<q-radio
|
||||||
|
v-model="selected_product"
|
||||||
|
val="magic_wall"
|
||||||
|
:label="$t('magic wall')"
|
||||||
|
color="cyan"
|
||||||
|
class="offset-md-1 col"
|
||||||
|
:loading="loading"
|
||||||
|
:disable="loading"
|
||||||
|
/>
|
||||||
|
</q-item-section>
|
||||||
|
<q-item-section>
|
||||||
|
<q-radio
|
||||||
|
v-model="selected_product"
|
||||||
|
val="fusion"
|
||||||
|
:label="$t('fusion')"
|
||||||
|
color="cyan"
|
||||||
|
class="offset-md-1 col"
|
||||||
|
:loading="loading"
|
||||||
|
:disable="loading"
|
||||||
|
/>
|
||||||
|
</q-item-section>
|
||||||
|
</q-item>
|
||||||
|
<q-item v-if="selected_product == 'fusion'">
|
||||||
|
<q-item-section avatar>{{ $t("fusion") }}</q-item-section>
|
||||||
|
<q-item-section>
|
||||||
|
<div class="row" v-for="(row, row_index) in 3" :key="row">
|
||||||
|
<q-radio
|
||||||
|
v-for="(item, item_index) in 3"
|
||||||
|
:key="row_index * 3 + item"
|
||||||
|
v-model="function_fusion_count"
|
||||||
|
:val="row_index * 3 + item"
|
||||||
|
:label="
|
||||||
|
(row_index * 3 + item).toString() +
|
||||||
|
$t(' ') +
|
||||||
|
$t('fusion out')
|
||||||
|
"
|
||||||
|
color="cyan"
|
||||||
|
class="col"
|
||||||
|
:class="item_index ? 'offset-md-1 ' : ''"
|
||||||
|
:loading="loading"
|
||||||
|
:disable="loading"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</q-item-section>
|
||||||
|
</q-item>
|
||||||
<q-item>
|
<q-item>
|
||||||
<q-item-section avatar>{{ $t("function") }}</q-item-section>
|
<q-item-section avatar>{{ $t("function") }}</q-item-section>
|
||||||
<q-item-section>
|
<q-item-section>
|
||||||
@ -69,15 +128,6 @@
|
|||||||
:disable="loading"
|
:disable="loading"
|
||||||
/>
|
/>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
<q-item-section avatar>
|
|
||||||
<q-btn
|
|
||||||
@click="setDeviceAttribute"
|
|
||||||
:label="$t('commit')"
|
|
||||||
no-caps
|
|
||||||
outline
|
|
||||||
color="primary"
|
|
||||||
/>
|
|
||||||
</q-item-section>
|
|
||||||
</q-item>
|
</q-item>
|
||||||
<q-item>
|
<q-item>
|
||||||
<q-item-section avatar></q-item-section>
|
<q-item-section avatar></q-item-section>
|
||||||
@ -85,13 +135,28 @@
|
|||||||
<q-checkbox
|
<q-checkbox
|
||||||
v-model="function_custom_ISV"
|
v-model="function_custom_ISV"
|
||||||
:label="$t('Custom ISV')"
|
:label="$t('Custom ISV')"
|
||||||
class="offset-md-1 col"
|
|
||||||
color="cyan"
|
color="cyan"
|
||||||
|
class="col"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
:disable="loading"
|
:disable="loading"
|
||||||
/>
|
/>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
</q-item>
|
</q-item>
|
||||||
|
<q-item>
|
||||||
|
<q-item-section> </q-item-section>
|
||||||
|
<q-item-section>
|
||||||
|
<q-btn
|
||||||
|
@click="setDeviceAttributeAndProduct"
|
||||||
|
:label="$t('commit')"
|
||||||
|
no-caps
|
||||||
|
outline
|
||||||
|
class="q-px-lg"
|
||||||
|
color="primary"
|
||||||
|
/>
|
||||||
|
</q-item-section>
|
||||||
|
<q-item-section> </q-item-section>
|
||||||
|
</q-item>
|
||||||
|
<q-separator />
|
||||||
<q-item>
|
<q-item>
|
||||||
<q-item-section avatar>
|
<q-item-section avatar>
|
||||||
{{ $t("language") }}
|
{{ $t("language") }}
|
||||||
@ -128,7 +193,6 @@
|
|||||||
/>
|
/>
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
</q-item>
|
</q-item>
|
||||||
|
|
||||||
<q-separator class="q-mt-md" />
|
<q-separator class="q-mt-md" />
|
||||||
|
|
||||||
<q-item class="q-mt-md">
|
<q-item class="q-mt-md">
|
||||||
@ -174,8 +238,10 @@ import { useStore } from "src/store";
|
|||||||
import { useQuasar, date as $date } from "quasar";
|
import { useQuasar, date as $date } from "quasar";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import GlobalData from "src/common/GlobalData";
|
import GlobalData from "src/common/GlobalData";
|
||||||
import { Protocol } from "src/entities/WSProtocol";
|
import {
|
||||||
import { EDeviceAttribute } from "src/entities/EDeviceAttribute";
|
EDeviceAttribute,
|
||||||
|
EDeviceAttributeHelper,
|
||||||
|
} from "src/entities/EDeviceAttribute";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ComponentAdvancedDebugDialog",
|
name: "ComponentAdvancedDebugDialog",
|
||||||
@ -198,7 +264,47 @@ export default defineComponent({
|
|||||||
const function_mirroring_output = ref(
|
const function_mirroring_output = ref(
|
||||||
$store.state.custom_defines.function_mirroring_output
|
$store.state.custom_defines.function_mirroring_output
|
||||||
);
|
);
|
||||||
|
const function_magic_wall = ref(
|
||||||
|
$store.state.custom_defines.function_magic_wall
|
||||||
|
);
|
||||||
|
const function_fusion = ref($store.state.custom_defines.function_fusion);
|
||||||
|
const function_fusion_count = ref(0);
|
||||||
const target_language = ref("zh-CN");
|
const target_language = ref("zh-CN");
|
||||||
|
const selected_product = ref("");
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => selected_product.value,
|
||||||
|
(newValue) => {
|
||||||
|
function_fusion.value = newValue == "fusion";
|
||||||
|
function_magic_wall.value = newValue == "magic_wall";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const getFinalAttribute = () => {
|
||||||
|
let attribute = EDeviceAttribute.None;
|
||||||
|
if (function_center_control.value) {
|
||||||
|
attribute |= EDeviceAttribute.CenterControl;
|
||||||
|
}
|
||||||
|
if (function_output_board.value) {
|
||||||
|
attribute |= EDeviceAttribute.OutputBoard;
|
||||||
|
}
|
||||||
|
if (function_mirroring_output.value) {
|
||||||
|
attribute |= EDeviceAttribute.MirroringOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (function_custom_ISV.value) {
|
||||||
|
attribute |= EDeviceAttribute.CustomISV;
|
||||||
|
}
|
||||||
|
if (function_magic_wall.value) {
|
||||||
|
attribute |= EDeviceAttribute.ProductMagicWall;
|
||||||
|
}
|
||||||
|
if (function_fusion.value) {
|
||||||
|
attribute |= EDeviceAttributeHelper.getProdictFusionAttributeByIndex(
|
||||||
|
function_fusion_count.value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return attribute;
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
show_dialog,
|
show_dialog,
|
||||||
@ -206,8 +312,12 @@ export default defineComponent({
|
|||||||
function_center_control,
|
function_center_control,
|
||||||
function_output_board,
|
function_output_board,
|
||||||
function_custom_ISV,
|
function_custom_ISV,
|
||||||
|
function_magic_wall,
|
||||||
|
function_fusion,
|
||||||
|
function_fusion_count,
|
||||||
function_mirroring_output,
|
function_mirroring_output,
|
||||||
target_language,
|
target_language,
|
||||||
|
selected_product,
|
||||||
|
|
||||||
showDialog() {
|
showDialog() {
|
||||||
show_dialog.value = true;
|
show_dialog.value = true;
|
||||||
@ -219,6 +329,20 @@ export default defineComponent({
|
|||||||
$store.state.custom_defines.function_output_board;
|
$store.state.custom_defines.function_output_board;
|
||||||
function_mirroring_output.value =
|
function_mirroring_output.value =
|
||||||
$store.state.custom_defines.function_mirroring_output;
|
$store.state.custom_defines.function_mirroring_output;
|
||||||
|
function_magic_wall.value =
|
||||||
|
$store.state.custom_defines.function_magic_wall;
|
||||||
|
function_fusion.value = $store.state.custom_defines.function_fusion;
|
||||||
|
function_fusion_count.value =
|
||||||
|
EDeviceAttributeHelper.getProductFusionOutputCountDefault(
|
||||||
|
$store.state.device_attribute,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
|
||||||
|
if (function_magic_wall.value) {
|
||||||
|
selected_product.value = "magic_wall";
|
||||||
|
} else if (function_fusion.value) {
|
||||||
|
selected_product.value = "fusion";
|
||||||
|
}
|
||||||
},
|
},
|
||||||
resetData() {
|
resetData() {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@ -227,6 +351,9 @@ export default defineComponent({
|
|||||||
function_output_board.value = false;
|
function_output_board.value = false;
|
||||||
function_mirroring_output.value = false;
|
function_mirroring_output.value = false;
|
||||||
function_custom_ISV.value = false;
|
function_custom_ISV.value = false;
|
||||||
|
function_magic_wall.value = false;
|
||||||
|
function_fusion.value = false;
|
||||||
|
selected_product.value = "";
|
||||||
},
|
},
|
||||||
|
|
||||||
restartDevice() {
|
restartDevice() {
|
||||||
@ -304,21 +431,22 @@ export default defineComponent({
|
|||||||
</div>`,
|
</div>`,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
setDeviceAttribute() {
|
setDeviceAttributeAndProduct() {
|
||||||
let attribute = EDeviceAttribute.None;
|
let attribute = getFinalAttribute();
|
||||||
if (function_center_control.value) {
|
GlobalData.getInstance()
|
||||||
attribute |= EDeviceAttribute.CenterControl;
|
.getCurrentClient()
|
||||||
}
|
?.setDeviceAttribute(attribute);
|
||||||
if (function_output_board.value) {
|
|
||||||
attribute |= EDeviceAttribute.OutputBoard;
|
|
||||||
}
|
|
||||||
if (function_mirroring_output.value) {
|
|
||||||
attribute |= EDeviceAttribute.MirroringOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (function_custom_ISV.value) {
|
$q.notify({
|
||||||
attribute |= EDeviceAttribute.CustomISV;
|
color: "positive",
|
||||||
}
|
icon: "done",
|
||||||
|
message: $t.t("set device function") + $t.t("success") + "!",
|
||||||
|
position: "top",
|
||||||
|
timeout: 1500,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
setDeviceAttribute() {
|
||||||
|
let attribute = getFinalAttribute();
|
||||||
|
|
||||||
GlobalData.getInstance()
|
GlobalData.getInstance()
|
||||||
.getCurrentClient()
|
.getCurrentClient()
|
||||||
@ -344,6 +472,16 @@ export default defineComponent({
|
|||||||
timeout: 1500,
|
timeout: 1500,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
changeMagic() {
|
||||||
|
if (function_magic_wall.value) {
|
||||||
|
function_fusion.value = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
changeFusion() {
|
||||||
|
if (function_fusion.value) {
|
||||||
|
function_magic_wall.value = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -20,14 +20,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<q-space />
|
<q-space />
|
||||||
<div>
|
<div>
|
||||||
<q-btn
|
<q-btn flat round icon="close" color="red" v-close-popup>
|
||||||
flat
|
|
||||||
round
|
|
||||||
icon="close"
|
|
||||||
:disable="loading"
|
|
||||||
color="red"
|
|
||||||
v-close-popup
|
|
||||||
>
|
|
||||||
<q-tooltip>
|
<q-tooltip>
|
||||||
{{ $t("close") }}
|
{{ $t("close") }}
|
||||||
</q-tooltip>
|
</q-tooltip>
|
||||||
@ -88,7 +81,8 @@
|
|||||||
(val) =>
|
(val) =>
|
||||||
(val && val.length > 0) || $t('Please type something'),
|
(val && val.length > 0) || $t('Please type something'),
|
||||||
(val) =>
|
(val) =>
|
||||||
isIpAddress(val) || $t('Please input vaild ip address'),
|
isMaskAddress(val) ||
|
||||||
|
$t('Please input vaild netmask address'),
|
||||||
]"
|
]"
|
||||||
lazy-rules
|
lazy-rules
|
||||||
/>
|
/>
|
||||||
@ -162,12 +156,12 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, ref, Ref, reactive } from "vue";
|
import { defineComponent, ref } from "vue";
|
||||||
import { useStore } from "src/store";
|
import { useStore } from "src/store";
|
||||||
import { useQuasar, copyToClipboard, uid } from "quasar";
|
import { useQuasar } from "quasar";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import GlobalData from "src/common/GlobalData";
|
|
||||||
import { AdvancedIpAddressEntity } from "src/entities/AdvancedIpAddressEntity";
|
import { AdvancedIpAddressEntity } from "src/entities/AdvancedIpAddressEntity";
|
||||||
|
import ValidationUtil from "src/common/ValidationUtil";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ComponentSystenSettingAdvancedNetworkDialog",
|
name: "ComponentSystenSettingAdvancedNetworkDialog",
|
||||||
@ -267,12 +261,10 @@ export default defineComponent({
|
|||||||
} catch {}
|
} catch {}
|
||||||
},
|
},
|
||||||
isIpAddress(str: string) {
|
isIpAddress(str: string) {
|
||||||
return (
|
return ValidationUtil.isIpAddress(str);
|
||||||
str == "localhost" ||
|
},
|
||||||
/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/.test(
|
isMaskAddress(str: string) {
|
||||||
str
|
return ValidationUtil.isMaskAddress(str);
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
checkFilterListIp(str: string) {
|
checkFilterListIp(str: string) {
|
||||||
if (Array.isArray(ip_filter_list)) {
|
if (Array.isArray(ip_filter_list)) {
|
||||||
|
@ -47,7 +47,6 @@
|
|||||||
ref="uploader"
|
ref="uploader"
|
||||||
:url="upload_url"
|
:url="upload_url"
|
||||||
method="post"
|
method="post"
|
||||||
:headers="generatorFileUploadHeaders"
|
|
||||||
:label="$t('select background image') + ':'"
|
:label="$t('select background image') + ':'"
|
||||||
:accept="$store.state.isSpecialVideo() ? '.svdoj' : 'image/*'"
|
:accept="$store.state.isSpecialVideo() ? '.svdoj' : 'image/*'"
|
||||||
:hide-upload-btn="true"
|
:hide-upload-btn="true"
|
||||||
@ -56,6 +55,7 @@
|
|||||||
@added="(files) => files && (file_count += files.length)"
|
@added="(files) => files && (file_count += files.length)"
|
||||||
@removed="(files) => files && (file_count -= files.length)"
|
@removed="(files) => files && (file_count -= files.length)"
|
||||||
/>
|
/>
|
||||||
|
<!-- :headers="generatorFileUploadHeaders" -->
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
</q-item>
|
</q-item>
|
||||||
</q-list>
|
</q-list>
|
||||||
@ -70,7 +70,7 @@
|
|||||||
no-caps
|
no-caps
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
color="primary"
|
color="primary"
|
||||||
@click="showBackgroundImage"
|
@click="showBackgroundImage()"
|
||||||
:label="$t('view current background image')"
|
:label="$t('view current background image')"
|
||||||
/>
|
/>
|
||||||
<q-space />
|
<q-space />
|
||||||
@ -131,35 +131,11 @@ export default defineComponent({
|
|||||||
loga(a: any) {
|
loga(a: any) {
|
||||||
console.log(a);
|
console.log(a);
|
||||||
},
|
},
|
||||||
generatorFileUploadHeaders(files: File[]) {
|
|
||||||
if (files.length > 0) {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
name: HttpProtocol.kHeaderXProductName,
|
|
||||||
value: HttpProtocol.getProductName($store),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: HttpProtocol.kHeaderXFileLength,
|
|
||||||
value: files[0].size,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
},
|
|
||||||
showDialog() {
|
showDialog() {
|
||||||
show_dialog.value = true;
|
show_dialog.value = true;
|
||||||
let client = GlobalData.getInstance().getCurrentClient();
|
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
||||||
if (client) {
|
if (url) {
|
||||||
let url = new URL(client.url);
|
url.pathname = "/upload_background_image_file";
|
||||||
url.port =
|
|
||||||
GlobalData.getInstance().applicationConfig?.httpserver_port ??
|
|
||||||
HttpProtocol.DefaultHttpPort.toString();
|
|
||||||
url.pathname = HttpProtocol.RequestUploadFile;
|
|
||||||
url.protocol = "http:";
|
|
||||||
url.searchParams.append(
|
|
||||||
"type",
|
|
||||||
HttpProtocol.UploadTypeBackgroundImage
|
|
||||||
);
|
|
||||||
upload_url.value = url.toString();
|
upload_url.value = url.toString();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -169,30 +145,24 @@ export default defineComponent({
|
|||||||
file_count.value = 0;
|
file_count.value = 0;
|
||||||
},
|
},
|
||||||
showBackgroundImage() {
|
showBackgroundImage() {
|
||||||
const temp_port =
|
|
||||||
GlobalData.getInstance().applicationConfig?.httpserver_port ??
|
|
||||||
HttpProtocol.DefaultHttpPort.toString();
|
|
||||||
try {
|
try {
|
||||||
const url = new URL(
|
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
||||||
GlobalData.getInstance().getCurrentClient()?.url ??
|
if (url) {
|
||||||
"http://127.0.0.1:" + temp_port
|
url.pathname = "/get_background_image_file";
|
||||||
);
|
viewerApi({
|
||||||
url.protocol = "http";
|
options: {
|
||||||
url.port = temp_port.toString();
|
toolbar: true,
|
||||||
url.pathname = "/static/background_image.png";
|
url: "data-source",
|
||||||
viewerApi({
|
initialViewIndex: 0,
|
||||||
options: {
|
|
||||||
toolbar: true,
|
|
||||||
url: "data-source",
|
|
||||||
initialViewIndex: 0,
|
|
||||||
},
|
|
||||||
images: [
|
|
||||||
{
|
|
||||||
src: url.toString(),
|
|
||||||
"data-source": url.toString(),
|
|
||||||
},
|
},
|
||||||
],
|
images: [
|
||||||
});
|
{
|
||||||
|
src: url.toString(),
|
||||||
|
"data-source": url.toString(),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
} catch {}
|
} catch {}
|
||||||
},
|
},
|
||||||
async onSubmit() {
|
async onSubmit() {
|
||||||
|
@ -139,6 +139,7 @@ import { useQuasar, copyToClipboard } from "quasar";
|
|||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
|
|
||||||
import { ExternalControlTableEntity } from "src/entities/ExternalControlTableEntity";
|
import { ExternalControlTableEntity } from "src/entities/ExternalControlTableEntity";
|
||||||
|
import ValidationUtil from "src/common/ValidationUtil";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ComponentCenterControlButtonDialog",
|
name: "ComponentCenterControlButtonDialog",
|
||||||
@ -246,22 +247,7 @@ export default defineComponent({
|
|||||||
show_dialog.value = false;
|
show_dialog.value = false;
|
||||||
},
|
},
|
||||||
isHexStr(val: string) {
|
isHexStr(val: string) {
|
||||||
if (val != null && val != undefined && typeof val == "string") {
|
return ValidationUtil.isHexStr(val);
|
||||||
val = val.trim();
|
|
||||||
if (val.length == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
for (const item of val.split(" ")) {
|
|
||||||
if (item.length > 4) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!/^0[xX][A-Fa-f0-9]{1,2}/.test(item)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -406,6 +406,7 @@ import {
|
|||||||
SerialPortConfigEntity,
|
SerialPortConfigEntity,
|
||||||
} from "src/entities/SerialPortConfigEntity";
|
} from "src/entities/SerialPortConfigEntity";
|
||||||
import { Protocol } from "src/entities/WSProtocol";
|
import { Protocol } from "src/entities/WSProtocol";
|
||||||
|
import ValidationUtil from "src/common/ValidationUtil";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ComponentCenterControlDialog",
|
name: "ComponentCenterControlDialog",
|
||||||
@ -733,12 +734,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
isIpAddress(str: string) {
|
isIpAddress(str: string) {
|
||||||
return (
|
return ValidationUtil.isIpAddress(str);
|
||||||
str == "localhost" ||
|
|
||||||
/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/.test(
|
|
||||||
str
|
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
2377
src/components/ControlPanelDialog.vue
Normal file
2377
src/components/ControlPanelDialog.vue
Normal file
File diff suppressed because it is too large
Load Diff
@ -152,6 +152,7 @@ import { api } from "boot/axios";
|
|||||||
import { HttpProtocol } from "src/entities/HttpProtocol";
|
import { HttpProtocol } from "src/entities/HttpProtocol";
|
||||||
import JointActionEquipmentTableEntity from "src/entities/JointActionEquipmentTableEntity";
|
import JointActionEquipmentTableEntity from "src/entities/JointActionEquipmentTableEntity";
|
||||||
import EventBus, { EventNamesDefine } from "src/common/EventBus";
|
import EventBus, { EventNamesDefine } from "src/common/EventBus";
|
||||||
|
import ValidationUtil from "src/common/ValidationUtil";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ComponentEditJointActionEquipmentDialog",
|
name: "ComponentEditJointActionEquipmentDialog",
|
||||||
@ -330,15 +331,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
isHost(str: string) {
|
isHost(str: string) {
|
||||||
return (
|
return ValidationUtil.isHost(str);
|
||||||
str == "localhost" ||
|
|
||||||
/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/.test(
|
|
||||||
str
|
|
||||||
) ||
|
|
||||||
/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\:([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5])$/.test(
|
|
||||||
str
|
|
||||||
)
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
@ -156,7 +156,7 @@
|
|||||||
</q-btn>
|
</q-btn>
|
||||||
<q-btn
|
<q-btn
|
||||||
flat
|
flat
|
||||||
v-if="!uploading"
|
v-if="!uploading &&!iswujie"
|
||||||
no-caps
|
no-caps
|
||||||
icon="upload"
|
icon="upload"
|
||||||
:label="$t('upload file')"
|
:label="$t('upload file')"
|
||||||
@ -192,6 +192,7 @@
|
|||||||
($q.platform.is.ipad && $store.state.landspace ? '61' : '68') +
|
($q.platform.is.ipad && $store.state.landspace ? '61' : '68') +
|
||||||
'vh',
|
'vh',
|
||||||
}"
|
}"
|
||||||
|
class="q-mb-md"
|
||||||
v-show="!uploading"
|
v-show="!uploading"
|
||||||
:rows="files"
|
:rows="files"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
@ -221,10 +222,11 @@
|
|||||||
style="color: #ffbe4a; font-size: 2.5em"
|
style="color: #ffbe4a; font-size: 2.5em"
|
||||||
></q-icon>
|
></q-icon>
|
||||||
{{
|
{{
|
||||||
props.value.length > 60
|
props.value.length > 25
|
||||||
? props.value.substr(0, 60) + "..."
|
? props.value.substr(0, 25) + "..."
|
||||||
: props.value
|
: props.value
|
||||||
}}
|
}}
|
||||||
|
|
||||||
<q-tooltip> {{ props.value }} </q-tooltip>
|
<q-tooltip> {{ props.value }} </q-tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="props.col.name == 'file_size'">
|
<div v-else-if="props.col.name == 'file_size'">
|
||||||
@ -345,14 +347,12 @@
|
|||||||
style="height: 69vh; width: 70%"
|
style="height: 69vh; width: 70%"
|
||||||
:disable="uploader_loading"
|
:disable="uploader_loading"
|
||||||
:url="getUrl"
|
:url="getUrl"
|
||||||
method="post"
|
multiple
|
||||||
:headers="generatorFileUploadHeaders"
|
method="POST"
|
||||||
:label="$t('select file') + ':'"
|
:label="$t('select file') + ':'"
|
||||||
:accept="uploader_accept"
|
:accept="uploader_accept"
|
||||||
@start="onStartUpload"
|
@start="onStartUpload"
|
||||||
@uploaded="onUploaded"
|
@finish="onfinish"
|
||||||
@failed="onFailed"
|
|
||||||
@added="/*onFileAdded*/ null"
|
|
||||||
>
|
>
|
||||||
</q-uploader>
|
</q-uploader>
|
||||||
<q-space />
|
<q-space />
|
||||||
@ -623,41 +623,25 @@ export default defineComponent({
|
|||||||
label: $t.t("operator"),
|
label: $t.t("operator"),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const _request_list_files = async (path: string) => {
|
const _request_list_files = async (path: string) => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
let client = GlobalData.getInstance().getCurrentClient();
|
let client = GlobalData.getInstance().getCurrentClient();
|
||||||
if (client) {
|
if (client) {
|
||||||
let url = new URL(client.url);
|
let file_list = await GlobalData.getInstance()
|
||||||
url.port =
|
.getCurrentClient()
|
||||||
GlobalData.getInstance().applicationConfig?.httpserver_port ??
|
?.getFileListFileManager(path);
|
||||||
HttpProtocol.DefaultHttpPort.toString();
|
return file_list;
|
||||||
url.pathname = HttpProtocol.RequestPathListFile;
|
|
||||||
url.protocol = "http:";
|
|
||||||
url.searchParams.append("path", path);
|
|
||||||
return await api.get(url.toString());
|
|
||||||
}
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
const _show_files = (response: any) => {
|
const _show_files = (response: any) => {
|
||||||
if (response) {
|
if (response) {
|
||||||
if (response.status == 200) {
|
if (response.success) {
|
||||||
interface IRsponseData {
|
|
||||||
files: FileEntity[];
|
|
||||||
free: number;
|
|
||||||
}
|
|
||||||
let file_entitys: FileEntity[] = [];
|
let file_entitys: FileEntity[] = [];
|
||||||
let free = 0;
|
let free = 0;
|
||||||
|
file_entitys = response.files;
|
||||||
if (Array.isArray(response.data)) {
|
free = response.free;
|
||||||
file_entitys = response.data as FileEntity[];
|
|
||||||
} else {
|
|
||||||
const resposne_data = response.data as IRsponseData;
|
|
||||||
file_entitys = resposne_data.files;
|
|
||||||
free = resposne_data.free;
|
|
||||||
}
|
|
||||||
free_space.value = free;
|
free_space.value = free;
|
||||||
if (Array.isArray(file_entitys)) {
|
if (Array.isArray(file_entitys)) {
|
||||||
directory_count.value = 0;
|
directory_count.value = 0;
|
||||||
@ -822,7 +806,10 @@ export default defineComponent({
|
|||||||
console.log(e);
|
console.log(e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let iswujie=ref(false)
|
||||||
|
if ((window as any).$wujie) {
|
||||||
|
iswujie.value=true
|
||||||
|
}
|
||||||
// 后缀名限制
|
// 后缀名限制
|
||||||
// watch(
|
// watch(
|
||||||
// () => filters.value,
|
// () => filters.value,
|
||||||
@ -860,6 +847,7 @@ export default defineComponent({
|
|||||||
refresh_file_list_async,
|
refresh_file_list_async,
|
||||||
status,
|
status,
|
||||||
filters,
|
filters,
|
||||||
|
iswujie,
|
||||||
showDialogAsync(
|
showDialogAsync(
|
||||||
in_status: string,
|
in_status: string,
|
||||||
no_filter = true,
|
no_filter = true,
|
||||||
@ -892,21 +880,6 @@ export default defineComponent({
|
|||||||
resolve = _resolve;
|
resolve = _resolve;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
generatorFileUploadHeaders(files: File[]) {
|
|
||||||
if (files.length > 0) {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
name: HttpProtocol.kHeaderXProductName,
|
|
||||||
value: HttpProtocol.getProductName($store),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: HttpProtocol.kHeaderXFileLength,
|
|
||||||
value: files[0].size,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
},
|
|
||||||
resetData() {
|
resetData() {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
uploading.value = false;
|
uploading.value = false;
|
||||||
@ -922,83 +895,134 @@ export default defineComponent({
|
|||||||
resolve_value = null;
|
resolve_value = null;
|
||||||
},
|
},
|
||||||
async onCreateNewFolder() {
|
async onCreateNewFolder() {
|
||||||
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
$q.dialog({
|
||||||
if (url) {
|
title: $t.t("create folder"),
|
||||||
$q.dialog({
|
message: $t.t("input folder name") + ":",
|
||||||
title: $t.t("create folder"),
|
prompt: {
|
||||||
message: $t.t("input folder name") + ":",
|
model: "",
|
||||||
prompt: {
|
isValid: (val: string) =>
|
||||||
model: "",
|
!!val && val.trim().length > 0&& val.indexOf(".") != 0 ,
|
||||||
isValid: (val: string) => !!val && val.trim().length > 0,
|
type: "text",
|
||||||
type: "text",
|
},
|
||||||
},
|
ok: {
|
||||||
ok: {
|
label: $t.t("ok"),
|
||||||
label: $t.t("ok"),
|
noCaps: true,
|
||||||
noCaps: true,
|
flat: true,
|
||||||
flat: true,
|
},
|
||||||
},
|
cancel: {
|
||||||
cancel: {
|
label: $t.t("cancel"),
|
||||||
label: $t.t("cancel"),
|
noCaps: true,
|
||||||
noCaps: true,
|
flat: true,
|
||||||
flat: true,
|
},
|
||||||
},
|
persistent: true,
|
||||||
persistent: true,
|
}).onOk(async (data: string) => {
|
||||||
}).onOk(async (data: string) => {
|
const response = await GlobalData.getInstance()
|
||||||
if (url) {
|
.getCurrentClient()
|
||||||
url.pathname = HttpProtocol.RequestPathCreateDirectory;
|
?.CreateDirectoryFileManager(path.value, data);
|
||||||
let response = (
|
|
||||||
await api.post(url.toString(), {
|
|
||||||
base_dir: path.value,
|
|
||||||
dir_name: data,
|
|
||||||
})
|
|
||||||
).data as NormalResult;
|
|
||||||
if (response && response.success) {
|
|
||||||
refresh_file_list();
|
|
||||||
$q.notify({
|
|
||||||
type: "positive",
|
|
||||||
message: $t.t("create folder") + $t.t("success") + "!",
|
|
||||||
position: "top",
|
|
||||||
timeout: 1500,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
$q.notify({
|
|
||||||
type: "warning",
|
|
||||||
message:
|
|
||||||
$t.t("create folder") +
|
|
||||||
$t.t("fail") +
|
|
||||||
"!" +
|
|
||||||
(response ? response.message : ""),
|
|
||||||
position: "top",
|
|
||||||
timeout: 1500,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
selectFile,
|
|
||||||
async deleteFile(file: FileEntity) {
|
|
||||||
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
|
||||||
if (url) {
|
|
||||||
url.pathname = HttpProtocol.RequestPathDeleteFile;
|
|
||||||
let response = null;
|
|
||||||
try {
|
|
||||||
response = (
|
|
||||||
await api.delete(url.toString(), {
|
|
||||||
data: {
|
|
||||||
base_dir: path.value,
|
|
||||||
file_name: file.name,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
).data as NormalResult;
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e);
|
|
||||||
}
|
|
||||||
if (response && response.success) {
|
if (response && response.success) {
|
||||||
refresh_file_list();
|
refresh_file_list();
|
||||||
$q.notify({
|
$q.notify({
|
||||||
type: "positive",
|
type: "positive",
|
||||||
message: $t.t("delete file") + $t.t("success") + "!",
|
message: $t.t("create folder") + $t.t("success") + "!",
|
||||||
|
position: "top",
|
||||||
|
timeout: 1500,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// if (
|
||||||
|
// response?.error_message ==
|
||||||
|
// "the folder name cannot start with a '.'"
|
||||||
|
// ) {
|
||||||
|
// $q.notify({
|
||||||
|
// type: "warning",
|
||||||
|
// message:
|
||||||
|
// $t.t("create folder") +
|
||||||
|
// $t.t("fail") +
|
||||||
|
// "!" +
|
||||||
|
// $t.t("the folder name cannot start with a '.'"),
|
||||||
|
// position: "top",
|
||||||
|
// timeout: 1500,
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
if (response) {
|
||||||
|
$q.notify({
|
||||||
|
type: "warning",
|
||||||
|
message:
|
||||||
|
$t.t("create folder") +
|
||||||
|
$t.t("fail") +
|
||||||
|
"! " +
|
||||||
|
$t.t(response.error_message),
|
||||||
|
position: "top",
|
||||||
|
timeout: 1500,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
selectFile,
|
||||||
|
async deleteFile(file: FileEntity) {
|
||||||
|
let response = null;
|
||||||
|
try {
|
||||||
|
response = await GlobalData.getInstance()
|
||||||
|
.getCurrentClient()
|
||||||
|
?.DeleteFileManager(path.value, file.name);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
if (response && response.success) {
|
||||||
|
refresh_file_list();
|
||||||
|
$q.notify({
|
||||||
|
type: "positive",
|
||||||
|
message: $t.t("delete file") + $t.t("success") + "!",
|
||||||
|
position: "top",
|
||||||
|
timeout: 1500,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$q.notify({
|
||||||
|
type: "warning",
|
||||||
|
message:
|
||||||
|
$t.t("delete file") +
|
||||||
|
$t.t("fail") +
|
||||||
|
"!" +
|
||||||
|
(response ? response.error_message : ""),
|
||||||
|
position: "top",
|
||||||
|
timeout: 1500,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
renameFile(file: FileEntity) {
|
||||||
|
$q.dialog({
|
||||||
|
title: $t.t("rename"),
|
||||||
|
message: $t.t("input new file name") + ":",
|
||||||
|
prompt: {
|
||||||
|
model: file.name,
|
||||||
|
isValid: (val: string) => !!val && val.trim().length > 0,
|
||||||
|
type: "text",
|
||||||
|
},
|
||||||
|
ok: {
|
||||||
|
label: $t.t("ok"),
|
||||||
|
noCaps: true,
|
||||||
|
flat: true,
|
||||||
|
},
|
||||||
|
cancel: {
|
||||||
|
label: $t.t("cancel"),
|
||||||
|
noCaps: true,
|
||||||
|
flat: true,
|
||||||
|
},
|
||||||
|
persistent: true,
|
||||||
|
}).onOk(async (data: string) => {
|
||||||
|
if (data == file.name) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let response = await GlobalData.getInstance()
|
||||||
|
.getCurrentClient()
|
||||||
|
?.RenameFileManager(path.value, file.name, data);
|
||||||
|
if (response && response.success) {
|
||||||
|
refresh_file_list();
|
||||||
|
$q.notify({
|
||||||
|
type: "positive",
|
||||||
|
message: $t.t("file rename") + $t.t("success") + "!",
|
||||||
position: "top",
|
position: "top",
|
||||||
timeout: 1500,
|
timeout: 1500,
|
||||||
});
|
});
|
||||||
@ -1006,79 +1030,15 @@ export default defineComponent({
|
|||||||
$q.notify({
|
$q.notify({
|
||||||
type: "warning",
|
type: "warning",
|
||||||
message:
|
message:
|
||||||
$t.t("delete file") +
|
$t.t("file rename") +
|
||||||
$t.t("fail") +
|
$t.t("fail") +
|
||||||
"!" +
|
"!" +
|
||||||
(response ? response.message : ""),
|
(response ? response.error_message : ""),
|
||||||
position: "top",
|
position: "top",
|
||||||
timeout: 1500,
|
timeout: 1500,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
},
|
|
||||||
renameFile(file: FileEntity) {
|
|
||||||
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
|
||||||
if (url) {
|
|
||||||
$q.dialog({
|
|
||||||
title: $t.t("rename"),
|
|
||||||
message: $t.t("input new file name") + ":",
|
|
||||||
prompt: {
|
|
||||||
model: file.name,
|
|
||||||
isValid: (val: string) => !!val && val.trim().length > 0,
|
|
||||||
type: "text",
|
|
||||||
},
|
|
||||||
ok: {
|
|
||||||
label: $t.t("ok"),
|
|
||||||
noCaps: true,
|
|
||||||
flat: true,
|
|
||||||
},
|
|
||||||
cancel: {
|
|
||||||
label: $t.t("cancel"),
|
|
||||||
noCaps: true,
|
|
||||||
flat: true,
|
|
||||||
},
|
|
||||||
persistent: true,
|
|
||||||
}).onOk(async (data: string) => {
|
|
||||||
if (data == file.name) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (url) {
|
|
||||||
url.pathname = HttpProtocol.RequestPathRenameFile;
|
|
||||||
url.searchParams.append(
|
|
||||||
"type",
|
|
||||||
HttpProtocol.RequestPathRenameFile
|
|
||||||
);
|
|
||||||
|
|
||||||
let response = (
|
|
||||||
await api.put(url.toString(), {
|
|
||||||
base_dir: path.value,
|
|
||||||
file_name: file.name,
|
|
||||||
new_file_name: data,
|
|
||||||
})
|
|
||||||
).data as NormalResult;
|
|
||||||
if (response && response.success) {
|
|
||||||
refresh_file_list();
|
|
||||||
$q.notify({
|
|
||||||
type: "positive",
|
|
||||||
message: $t.t("file rename") + $t.t("success") + "!",
|
|
||||||
position: "top",
|
|
||||||
timeout: 1500,
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
$q.notify({
|
|
||||||
type: "warning",
|
|
||||||
message:
|
|
||||||
$t.t("file rename") +
|
|
||||||
$t.t("fail") +
|
|
||||||
"!" +
|
|
||||||
(response ? response.message : ""),
|
|
||||||
position: "top",
|
|
||||||
timeout: 1500,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
copyStringToClipboard(value: string) {
|
copyStringToClipboard(value: string) {
|
||||||
copyToClipboard(value);
|
copyToClipboard(value);
|
||||||
@ -1110,8 +1070,8 @@ export default defineComponent({
|
|||||||
getUrl(file: File[]) {
|
getUrl(file: File[]) {
|
||||||
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
||||||
if (url) {
|
if (url) {
|
||||||
url.pathname = HttpProtocol.RequestUploadFile;
|
url.pathname = "/upload_media_file"; //HttpProtocol.RequestUploadFile;
|
||||||
url.searchParams.append("type", HttpProtocol.HttpUploadTypeNormal);
|
// url.searchParams.append("type", HttpProtocol.HttpUploadTypeNormal);
|
||||||
url.searchParams.append("base_dir", path.value);
|
url.searchParams.append("base_dir", path.value);
|
||||||
return url.toString();
|
return url.toString();
|
||||||
}
|
}
|
||||||
@ -1120,101 +1080,19 @@ export default defineComponent({
|
|||||||
onStartUpload() {
|
onStartUpload() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
},
|
},
|
||||||
async onFileAdded(files: File[] | File) {
|
async onfinish(info: any) {
|
||||||
setTimeout(async () => {
|
setTimeout(() => {
|
||||||
const onError = async (file: File | null) => {
|
|
||||||
await nextTick(() => {});
|
|
||||||
uploader.value.reset();
|
|
||||||
|
|
||||||
$q.notify({
|
$q.notify({
|
||||||
color: "negative",
|
type: "positive",
|
||||||
icon: "warning",
|
message: $t.t("file upload") + $t.t("finish") + "!",
|
||||||
message: $t.t("load file error") + "!",
|
|
||||||
position: "top",
|
position: "top",
|
||||||
timeout: 3000,
|
timeout: 1500,
|
||||||
});
|
});
|
||||||
};
|
loading.value = false;
|
||||||
|
uploading.value = false;
|
||||||
let file: File | null = null;
|
refresh_file_list()
|
||||||
|
uploader.value.reset()
|
||||||
try {
|
}, 500);
|
||||||
if (Array.isArray(files)) {
|
|
||||||
if (files.length > 0) {
|
|
||||||
file = files[0];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
file = files;
|
|
||||||
}
|
|
||||||
if (file) {
|
|
||||||
const file_name = file.name;
|
|
||||||
const blob = file.slice(0, 1024 * 1024 * 1); // 1 MB
|
|
||||||
uploader_loading.value = true;
|
|
||||||
|
|
||||||
try {
|
|
||||||
let url = GlobalData.getInstance().createCurrentRequestUrl();
|
|
||||||
if (url) {
|
|
||||||
url.pathname = HttpProtocol.RequestPathCheckFileSupport;
|
|
||||||
|
|
||||||
// if (FileSuffixHelper.isVideoPath(file_name)) {
|
|
||||||
|
|
||||||
// }
|
|
||||||
const data = new FormData();
|
|
||||||
data.append(
|
|
||||||
"file",
|
|
||||||
new File([blob], file_name, {
|
|
||||||
lastModified: file.lastModified,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
const response = await api.post(url.toString(), data, {
|
|
||||||
headers: {
|
|
||||||
"Content-Type": "multipart/form-data",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response && response.data && response.data.is_support) {
|
|
||||||
} else {
|
|
||||||
onError(file);
|
|
||||||
}
|
|
||||||
console.log(response);
|
|
||||||
} else {
|
|
||||||
throw "";
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
onError(file);
|
|
||||||
}
|
|
||||||
uploader_loading.value = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
onError(file);
|
|
||||||
}
|
|
||||||
}, 1);
|
|
||||||
},
|
|
||||||
onUploaded() {
|
|
||||||
uploading.value = false;
|
|
||||||
uploader.value.reset();
|
|
||||||
refresh_file_list();
|
|
||||||
|
|
||||||
$q.notify({
|
|
||||||
type: "positive",
|
|
||||||
message: $t.t("file upload") + $t.t("success") + "!",
|
|
||||||
position: "top",
|
|
||||||
timeout: 1500,
|
|
||||||
});
|
|
||||||
loading.value = false;
|
|
||||||
},
|
|
||||||
onFailed(info: any) {
|
|
||||||
console.log(info);
|
|
||||||
$q.notify({
|
|
||||||
type: "warning",
|
|
||||||
message: $t.t("file upload") + $t.t("fail") + "!",
|
|
||||||
position: "top",
|
|
||||||
timeout: 1500,
|
|
||||||
});
|
|
||||||
loading.value = false;
|
|
||||||
loading.value = false;
|
|
||||||
},
|
},
|
||||||
copyFile(file: FileEntity) {
|
copyFile(file: FileEntity) {
|
||||||
if (file) {
|
if (file) {
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -11,15 +11,33 @@
|
|||||||
<q-toggle class="float-right" v-model="array[0].isshow" label="" />
|
<q-toggle class="float-right" v-model="array[0].isshow" label="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<q-input dense filled type="number" :autofocus="group == 0" :bg-color="group == 0 ? 'cyan-1' : ''"
|
<q-input v-show="ispad" dense filled type="number" :autofocus="group == 0"
|
||||||
@focus="group = 0" v-model="array[0].value" :label="$t('upper fusion zone parameters')" lazy-rules
|
:bg-color="group == 0 ? 'cyan-1' : ''" @focus="group = 0" v-model.number="array[0].value"
|
||||||
:rules="[
|
:label="$t('upper fusion zone parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 0 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" :rules="[
|
||||||
(val) =>
|
(val) =>
|
||||||
(val !== null && val !== '') ||
|
(val !== null && val !== '') ||
|
||||||
$t('Please enter a number'),
|
$t('Please enter a number'),
|
||||||
(val) =>
|
(val) =>
|
||||||
(val >= 0 && val < config.height) || $t('Please enter 0-100'),
|
(val >= 0 && val < config.height) || $t('Please enter 0-100'),
|
||||||
]" />
|
]" />
|
||||||
|
<q-input v-show="!ispad" dense filled type="number" :autofocus="group == 0"
|
||||||
|
:bg-color="group == 0 ? 'cyan-1' : ''" @focus="() => { group = 0; input_focus[0] = true }"
|
||||||
|
v-model.number="array[0].value" :label="$t('upper fusion zone parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 0 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" @blur="input_focus[0] = false" :rules="[
|
||||||
|
(val) =>
|
||||||
|
(val !== null && val !== '') ||
|
||||||
|
$t('Please enter a number'),
|
||||||
|
(val) =>
|
||||||
|
(val >= 0 && val < config.height) || $t('Please enter 0-100'),
|
||||||
|
]">
|
||||||
|
<template v-if="input_focus[0]" v-slot:append>
|
||||||
|
<q-icon name="arrow_upward" @mousedown="mousedown('+', 0)" @mouseup="mouseup" />
|
||||||
|
<q-icon name="arrow_downward" @mousedown="mousedown('-', 0)" @mouseup="mouseup" />
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -30,39 +48,75 @@
|
|||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-3">
|
<div class="col-3">
|
||||||
<q-toggle class="float-right" v-model="array[1].isshow" label="" />
|
<q-toggle class="float-right" @click="group = 1" v-model="array[1].isshow" label="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<q-input dense filled type="number" :autofocus="group == 1" :bg-color="group == 1 ? 'cyan-1' : ''"
|
<q-input v-show="ispad" dense filled type="number" :autofocus="group == 1"
|
||||||
@focus="group = 1" v-model="array[1].value" :label="$t('Left fusion Band Parameters')" lazy-rules
|
:bg-color="group == 1 ? 'cyan-1' : ''" @focus="group = 1" v-model.number="array[1].value"
|
||||||
:rules="[
|
:label="$t('Left fusion Band Parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 1 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" :rules="[
|
||||||
(val) =>
|
(val) =>
|
||||||
(val !== null && val !== '') ||
|
(val !== null && val !== '') ||
|
||||||
$t('Please enter a number'),
|
$t('Please enter a number'),
|
||||||
(val) =>
|
(val) =>
|
||||||
(val >= 0 && val < config.width) || $t('Please enter 0-100'),
|
(val >= 0 && val < config.width) || $t('Please enter 0-100'),
|
||||||
]" />
|
]" />
|
||||||
|
<q-input v-show="!ispad" dense filled type="number" :autofocus="group == 1"
|
||||||
|
:bg-color="group == 1 ? 'cyan-1' : ''" @focus="() => { group = 1; input_focus[1] = true }"
|
||||||
|
v-model.number="array[1].value" :label="$t('Left fusion Band Parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 1 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" @blur="input_focus[1] = false" :rules="[
|
||||||
|
(val) =>
|
||||||
|
(val !== null && val !== '') ||
|
||||||
|
$t('Please enter a number'),
|
||||||
|
(val) =>
|
||||||
|
(val >= 0 && val < config.width) || $t('Please enter 0-100'),
|
||||||
|
]">
|
||||||
|
<template v-if="input_focus[1]" v-slot:append>
|
||||||
|
<q-icon name="arrow_upward" @mousedown="mousedown('+', 1)" @mouseup="mouseup" />
|
||||||
|
<q-icon name="arrow_downward" @mousedown="mousedown('-', 1)" @mouseup="mouseup" />
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-3">
|
<div class="col-3">
|
||||||
<q-toggle class="float-right" v-model="array[2].isshow" label="" />
|
<q-toggle class="float-right" @click="group = 2" v-model="array[2].isshow" label="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<q-input dense filled type="number" :autofocus="group == 2" :bg-color="group == 2 ? 'cyan-1' : ''"
|
<q-input v-show="ispad" dense filled type="number" :autofocus="group == 2"
|
||||||
@focus="group = 2" v-model="array[2].value" :label="$t('Right fusion Band Parameters')" lazy-rules
|
:bg-color="group == 2 ? 'cyan-1' : ''" @focus="group = 2" v-model.number="array[2].value"
|
||||||
:rules="[
|
:label="$t('Right fusion Band Parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 2 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" :rules="[
|
||||||
(val) =>
|
(val) =>
|
||||||
(val !== null && val !== '') ||
|
(val !== null && val !== '') ||
|
||||||
$t('Please enter a number'),
|
$t('Please enter a number'),
|
||||||
(val) =>
|
(val) =>
|
||||||
(val >= 0 && val < config.width) || $t('Please enter 0-100'),
|
(val >= 0 && val < config.width) || $t('Please enter 0-100'),
|
||||||
]" />
|
]" />
|
||||||
|
<q-input v-show="!ispad" dense filled type="number" :autofocus="group == 2"
|
||||||
|
:bg-color="group == 2 ? 'cyan-1' : ''" @focus="() => { group = 2; input_focus[2] = true }"
|
||||||
|
v-model.number="array[2].value" :label="$t('Right fusion Band Parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 2 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" @blur="input_focus[2] = false" :rules="[
|
||||||
|
(val) =>
|
||||||
|
(val !== null && val !== '') ||
|
||||||
|
$t('Please enter a number'),
|
||||||
|
(val) =>
|
||||||
|
(val >= 0 && val < config.width) || $t('Please enter 0-100'),
|
||||||
|
]">
|
||||||
|
<template v-if="input_focus[2]" v-slot:append>
|
||||||
|
<q-icon name="arrow_upward" @mousedown="mousedown('+', 2)" @mouseup="mouseup" />
|
||||||
|
<q-icon name="arrow_downward" @mousedown="mousedown('-', 2)" @mouseup="mouseup" />
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-3"><span>{{ $t('Whether to operate synchronously') }}</span><q-checkbox
|
<div class="col-3"><span>{{ $t('Whether to operate synchronously') }}</span><q-checkbox
|
||||||
v-model="auto_sync" /></div>
|
v-model="auto_sync" @update:model-value="() => { }" /></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -75,15 +129,33 @@
|
|||||||
<q-toggle class="float-right" v-model="array[3].isshow" label="" />
|
<q-toggle class="float-right" v-model="array[3].isshow" label="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<q-input dense filled type="number" :autofocus="group == 3" :bg-color="group == 3 ? 'cyan-1' : ''"
|
<q-input v-show="ispad" dense filled type="number" :autofocus="group == 3"
|
||||||
@focus="group = 3" v-model="array[3].value" :label="$t('Lower fusion Zone Parameters')" lazy-rules
|
:bg-color="group == 3 ? 'cyan-1' : ''" @focus="group = 3" v-model.number="array[3].value"
|
||||||
:rules="[
|
:label="$t('Lower fusion Zone Parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 3 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" :rules="[
|
||||||
(val) =>
|
(val) =>
|
||||||
(val !== null && val !== '') ||
|
(val !== null && val !== '') ||
|
||||||
$t('Please enter a number'),
|
$t('Please enter a number'),
|
||||||
(val) =>
|
(val) =>
|
||||||
(val >= 0 && val < config.height) || $t('Please enter 0-100'),
|
(val >= 0 && val < config.height) || $t('Please enter 0-100'),
|
||||||
]" />
|
]" />
|
||||||
|
<q-input v-show="!ispad" dense filled type="number" :autofocus="group == 3"
|
||||||
|
:bg-color="group == 3 ? 'cyan-1' : ''" @focus="() => { group = 3; input_focus[3] = true }"
|
||||||
|
v-model.number="array[3].value" :label="$t('Lower fusion Zone Parameters')" lazy-rules
|
||||||
|
@click="() => { url.indexOf('pad') != -1 ? ipad_chang = true : ''; group = 3 }"
|
||||||
|
:readonly="url.indexOf('pad') != -1" @blur="input_focus[3] = false" :rules="[
|
||||||
|
(val) =>
|
||||||
|
(val !== null && val !== '') ||
|
||||||
|
$t('Please enter a number'),
|
||||||
|
(val) =>
|
||||||
|
(val >= 0 && val < config.height) || $t('Please enter 0-100'),
|
||||||
|
]">
|
||||||
|
<template v-if="input_focus[3]" v-slot:append>
|
||||||
|
<q-icon name="arrow_upward" @mousedown="handlerTouchstart('+')" @mouseup="handlerTouchend" />
|
||||||
|
<q-icon name="arrow_downward" @mousedown="handlerTouchstart('-')" @mouseup="handlerTouchend" />
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -91,20 +163,38 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12" v-if="group != 4">
|
<div class="col-12" v-show="group != 4 || ispad">
|
||||||
<p class="text-center" style="margin: 0 0 8;">{{ $t("Set Fusion Band Parameters") }}</p>
|
<p class="text-center" style="margin: 0 0 8;">{{ $t("Set Fusion Band Parameters") }}</p>
|
||||||
<div style="display: flex; justify-content: space-evenly">
|
<div style="display: flex; justify-content: space-evenly">
|
||||||
<div>
|
<div>
|
||||||
<q-slider v-model="array[group].alpha" :min="0.0" @change="chang('alpha')" :max="1" :step="0.01" color="green"
|
<q-slider v-model="array[group].alpha" v-show="!ispad" :min="0.0" @change="chang('alpha')" :max="1" :step="0.01"
|
||||||
vertical reverse label-always />
|
color="green" vertical reverse label-always />
|
||||||
<div> <q-input dense filled hide-bottom-space type="number" max="1" min="0" step="0.1"
|
<div> <q-input v-show="ispad" dense filled hide-bottom-space type="number" max="1" min="0" step="0.1"
|
||||||
@update:model-value="chang('alpha')" v-model="array[group].alpha" lazy-rules :rules="[
|
@update:model-value="chang('alpha')"
|
||||||
|
@click="() => { now_apg = 'alpha'; ispad ? ipad_chang_input = true : '' }" :readonly="ispad"
|
||||||
|
v-model.number="array[group].alpha" lazy-rules :rules="[
|
||||||
(val) =>
|
(val) =>
|
||||||
(val !== null && val !== '') ||
|
(val !== null && val !== '') ||
|
||||||
$t('Please enter a number'),
|
$t('Please enter a number'),
|
||||||
(val) =>
|
(val) =>
|
||||||
(val >= 0 && val <= 1) || $t('Please enter a value within the range'),
|
(val >= 0 && val <= 1) || $t('Please enter a value within the range'),
|
||||||
]" />
|
]" />
|
||||||
|
<q-input v-show="!ispad" dense filled hide-bottom-space type="number" max="1" min="0" step="0.1"
|
||||||
|
@update:model-value="chang('alpha')"
|
||||||
|
@click="() => { now_apg = 'alpha'; ispad ? ipad_chang_input = true : '' }" :readonly="ispad"
|
||||||
|
@focus="input_focus_apg[0] = true" @blur="input_focus_apg[0] = false" v-model.number="array[group].alpha"
|
||||||
|
lazy-rules :rules="[
|
||||||
|
(val) =>
|
||||||
|
(val !== null && val !== '') ||
|
||||||
|
$t('Please enter a number'),
|
||||||
|
(val) =>
|
||||||
|
(val >= 0 && val <= 1) || $t('Please enter a value within the range'),
|
||||||
|
]">
|
||||||
|
<template v-if="input_focus_apg[0]" v-slot:append>
|
||||||
|
<q-icon name="arrow_upward" @mousedown="handlerTouchstart_apg('+')" @mouseup="handlerTouchend_apg" />
|
||||||
|
<q-icon name="arrow_downward" @mousedown="handlerTouchstart_apg('-')" @mouseup="handlerTouchend_apg" />
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
<p style="text-align: center;">Alpha</p>
|
<p style="text-align: center;">Alpha</p>
|
||||||
<q-btn style="margin-top: 0.5rem;" color="white" @click="reset('alpha')" text-color="black"
|
<q-btn style="margin-top: 0.5rem;" color="white" @click="reset('alpha')" text-color="black"
|
||||||
:label="$t('reset')" />
|
:label="$t('reset')" />
|
||||||
@ -112,16 +202,32 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<q-slider v-model="array[group].p" :min="0" @change="chang('p')" :max="16" :step="0.01" color="green" vertical
|
<q-slider v-model="array[group].p" v-show="!ispad" :min="0" @change="chang('p')" :max="16" :step="0.01"
|
||||||
reverse label-always />
|
color="green" vertical reverse label-always />
|
||||||
<div> <q-input dense filled hide-bottom-space type="number" max="16" min="0" step="0.1"
|
<div> <q-input v-show="ispad" dense filled hide-bottom-space type="number" max="16" min="0" step="0.1"
|
||||||
@update:model-value="chang('p')" v-model="array[group].p" lazy-rules :rules="[
|
@update:model-value="chang('p')" @click="() => { now_apg = 'p'; ispad ? ipad_chang_input = true : '' }"
|
||||||
|
:readonly="ispad" v-model.number="array[group].p" lazy-rules :rules="[
|
||||||
(val) =>
|
(val) =>
|
||||||
(val !== null && val !== '') ||
|
(val !== null && val !== '') ||
|
||||||
$t('Please enter a number'),
|
$t('Please enter a number'),
|
||||||
(val) =>
|
(val) =>
|
||||||
(val >= 0 && val <= 16) || $t('Please enter a value within the range'),
|
(val >= 0 && val <= 16) || $t('Please enter a value within the range'),
|
||||||
]" />
|
]" />
|
||||||
|
<q-input v-show="!ispad" dense filled hide-bottom-space type="number" max="16" min="0" step="0.1"
|
||||||
|
@focus="input_focus_apg[1] = true" @blur="input_focus_apg[1] = false" @update:model-value="chang('p')"
|
||||||
|
@click="() => { now_apg = 'p'; ispad ? ipad_chang_input = true : '' }" :readonly="ispad"
|
||||||
|
v-model.number="array[group].p" lazy-rules :rules="[
|
||||||
|
(val) =>
|
||||||
|
(val !== null && val !== '') ||
|
||||||
|
$t('Please enter a number'),
|
||||||
|
(val) =>
|
||||||
|
(val >= 0 && val <= 16) || $t('Please enter a value within the range'),
|
||||||
|
]">
|
||||||
|
<template v-if="input_focus_apg[1]" v-slot:append>
|
||||||
|
<q-icon name="arrow_upward" @mousedown="handlerTouchstart_apg('+')" @mouseup="handlerTouchend_apg" />
|
||||||
|
<q-icon name="arrow_downward" @mousedown="handlerTouchstart_apg('-')" @mouseup="handlerTouchend_apg" />
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
<p style="text-align: center;">Power</p>
|
<p style="text-align: center;">Power</p>
|
||||||
<q-btn style="margin-top: 0.5rem;" color="white" @click="reset('p')" text-color="black"
|
<q-btn style="margin-top: 0.5rem;" color="white" @click="reset('p')" text-color="black"
|
||||||
:label="$t('reset')" />
|
:label="$t('reset')" />
|
||||||
@ -129,17 +235,34 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<q-slider v-model="array[group].gamma" :min="0" @change="chang('gamma')" :max="16" :step="0.01" color="green"
|
<q-slider v-model="array[group].gamma" v-show="!ispad" :min="0" @change="chang('gamma')" :max="16" :step="0.01"
|
||||||
vertical reverse label-always />
|
color="green" vertical reverse label-always />
|
||||||
<div>
|
<div>
|
||||||
<q-input :dense="true" filled hide-bottom-space type="number" max="16" min="0" step="0.1"
|
<q-input v-show="ispad" :dense="true" filled hide-bottom-space type="number" max="16" min="0" step="0.1"
|
||||||
@update:model-value="chang('gamma')" v-model="array[group].gamma" lazy-rules :rules="[
|
@update:model-value="chang('gamma')"
|
||||||
|
@click="() => { now_apg = 'gamma'; ispad ? ipad_chang_input = true : '' }" :readonly="ispad"
|
||||||
|
v-model.number="array[group].gamma" lazy-rules :rules="[
|
||||||
(val) =>
|
(val) =>
|
||||||
(val !== null && val !== '') ||
|
(val !== null && val !== '') ||
|
||||||
$t('Please enter a number'),
|
$t('Please enter a number'),
|
||||||
(val) =>
|
(val) =>
|
||||||
(val >= 0 && val <= 16) || $t('Please enter a value within the range'),
|
(val >= 0 && val <= 16) || $t('Please enter a value within the range'),
|
||||||
]" />
|
]" />
|
||||||
|
<q-input v-show="!ispad" :dense="true" filled hide-bottom-space type="number" max="16" min="0" step="0.1"
|
||||||
|
@update:model-value="chang('gamma')" @focus="input_focus_apg[2] = true" @blur="input_focus_apg[2] = false"
|
||||||
|
@click="() => { now_apg = 'gamma'; ispad ? ipad_chang_input = true : '' }" :readonly="ispad"
|
||||||
|
v-model.number="array[group].gamma" lazy-rules :rules="[
|
||||||
|
(val) =>
|
||||||
|
(val !== null && val !== '') ||
|
||||||
|
$t('Please enter a number'),
|
||||||
|
(val) =>
|
||||||
|
(val >= 0 && val <= 16) || $t('Please enter a value within the range'),
|
||||||
|
]">
|
||||||
|
<template v-if="input_focus_apg[2]" v-slot:append>
|
||||||
|
<q-icon name="arrow_upward" @mousedown="handlerTouchstart_apg('+')" @mouseup="handlerTouchend_apg" />
|
||||||
|
<q-icon name="arrow_downward" @mousedown="handlerTouchstart_apg('-')" @mouseup="handlerTouchend_apg" />
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
<p style="text-align: center;">Gamma</p>
|
<p style="text-align: center;">Gamma</p>
|
||||||
<q-btn style="margin-top: 0.5rem;" color="white" @click="reset('gamma')" text-color="black"
|
<q-btn style="margin-top: 0.5rem;" color="white" @click="reset('gamma')" text-color="black"
|
||||||
:label="$t('reset')" />
|
:label="$t('reset')" />
|
||||||
@ -147,12 +270,88 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="row" style="min-height: 40px;">
|
||||||
|
<div class="col-4 col-sm-3"></div>
|
||||||
|
<div class="col-4 col-sm-6 q-pt-sm">
|
||||||
|
<q-item>
|
||||||
|
<q-item-section avatar class="head_1">
|
||||||
|
{{ $t("background color") }}
|
||||||
|
</q-item-section>
|
||||||
|
<q-item-section>
|
||||||
|
<q-input v-model="color" :rules="['anyColor']">
|
||||||
|
<template v-slot:append>
|
||||||
|
<q-icon name="colorize" class="cursor-pointer">
|
||||||
|
<q-popup-proxy cover transition-show="scale" transition-hide="scale">
|
||||||
|
<q-color v-model="color" @change="submit" />
|
||||||
|
</q-popup-proxy>
|
||||||
|
</q-icon>
|
||||||
|
</template>
|
||||||
|
</q-input>
|
||||||
|
</q-item-section>
|
||||||
|
</q-item>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div style="position: absolute;bottom: 0;">
|
<div style="position: absolute;bottom: 0;">
|
||||||
<q-checkbox v-model="auxiliary_line" @update:model-value="(value, evt)=>{send_auxiliary_line(value)}"
|
<q-checkbox v-model="auxiliary_line" @update:model-value="(value, evt) => { send_auxiliary_line(value) }"
|
||||||
:label="$t('auxiliary lines')" />
|
:label="$t('auxiliary lines')" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<q-dialog v-model="ipad_chang" ref="ipadref">
|
||||||
|
<q-card style="width: 40vw; max-width: 80vw;">
|
||||||
|
<q-card-section>
|
||||||
|
<!-- <div class="text-h6">{{ $t('fusion zone') + (group + 1) }}</div> -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4"><q-select class="q-pt-md" :label="$t('fusion zone')" :dense="true" filled v-model="group"
|
||||||
|
@update:model-value="(val) => { group = val }" :options="options" emit-value map-options /></div>
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-section class="q-pt-none">
|
||||||
|
<div class="row q-pb-md">
|
||||||
|
<div class="col-12" style="text-align: center;"><q-btn color="white" text-color="black" icon="keyboard_arrow_up"
|
||||||
|
@touchstart="handlerTouchstart('+')" @touchend="handlerTouchend" /></div>
|
||||||
|
</div>
|
||||||
|
<div class="row q-pt-md">
|
||||||
|
<div class="col-12" style="text-align: center;"><q-btn color="white" text-color="black"
|
||||||
|
icon="keyboard_arrow_down" @touchstart="handlerTouchstart('-')" @touchend="handlerTouchend" /></div>
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
|
<q-btn flat :label="$t('close')" color="primary" @click="ipad_chang = false" />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-dialog>
|
||||||
|
<q-dialog v-model="ipad_chang_input">
|
||||||
|
<q-card style="width: 40vw; max-width: 80vw;">
|
||||||
|
<q-card-section>
|
||||||
|
<!-- <div class="text-h6">{{ $t('fusion zone') + options[group].label + ` ${now_apg}` }}</div> -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-4"><q-select class="q-pt-md" :label="$t('fusion zone') + ` ${now_apg}`" :dense="true" filled v-model="group"
|
||||||
|
@update:model-value="(val) => { group = val }" :options="options" emit-value map-options /></div>
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-section class="q-pt-none">
|
||||||
|
<div class="row q-pb-md">
|
||||||
|
<div class="col-12" style="text-align: center;"><q-btn color="white" text-color="black" icon="keyboard_arrow_up"
|
||||||
|
@touchstart="handlerTouchstart_apg('+')" @touchend="handlerTouchend_apg" /></div>
|
||||||
|
</div>
|
||||||
|
<div class="row q-pt-md">
|
||||||
|
<div class="col-12" style="text-align: center;"><q-btn color="white" text-color="black"
|
||||||
|
icon="keyboard_arrow_down" @touchstart="handlerTouchstart_apg('-')" @touchend="handlerTouchend_apg" /></div>
|
||||||
|
</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
|
<q-btn flat :label="$t('close')" color="primary" @click="ipad_chang_input = false" />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
@ -171,6 +370,14 @@
|
|||||||
p {
|
p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
</style>
|
||||||
|
<!-- 取消浏览器自带的input箭头 使用q-input的图标实现 -->
|
||||||
|
<style>
|
||||||
|
input::-webkit-outer-spin-button,
|
||||||
|
input::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none !important;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -184,12 +391,11 @@ import {
|
|||||||
onBeforeUnmount,
|
onBeforeUnmount,
|
||||||
reactive,
|
reactive,
|
||||||
onMounted,
|
onMounted,
|
||||||
|
toRefs,
|
||||||
} from "vue";
|
} from "vue";
|
||||||
import { useStore } from "src/store";
|
import { useStore } from "src/store";
|
||||||
import { useI18n } from "vue-i18n";
|
import { useI18n } from "vue-i18n";
|
||||||
import GlobalData from "src/common/GlobalData";
|
import GlobalData from "src/common/GlobalData";
|
||||||
import { number } from "@intlify/core-base";
|
|
||||||
import { switchCase } from "@babel/types";
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ComponentFusionLocale",
|
name: "ComponentFusionLocale",
|
||||||
@ -197,7 +403,7 @@ export default defineComponent({
|
|||||||
let set = GlobalData.getInstance().getCurrentClient();
|
let set = GlobalData.getInstance().getCurrentClient();
|
||||||
let $store = useStore();
|
let $store = useStore();
|
||||||
let $t = useI18n();
|
let $t = useI18n();
|
||||||
const group = ref(4);
|
const group = ref(2);
|
||||||
const set_cache: any = ref([]);
|
const set_cache: any = ref([]);
|
||||||
const enablefusion = ref(false);
|
const enablefusion = ref(false);
|
||||||
let array: any = reactive([
|
let array: any = reactive([
|
||||||
@ -207,7 +413,7 @@ export default defineComponent({
|
|||||||
{ alpha: 0, p: 0, gamma: 0, isshow: false, value: 0 },
|
{ alpha: 0, p: 0, gamma: 0, isshow: false, value: 0 },
|
||||||
{ alpha: 0, p: 0, gamma: 0, isshow: false, value: 0 },
|
{ alpha: 0, p: 0, gamma: 0, isshow: false, value: 0 },
|
||||||
]);
|
]);
|
||||||
const auto_sync = ref(false)
|
const auto_sync = ref(true)
|
||||||
const auxiliary_line = ref(false)
|
const auxiliary_line = ref(false)
|
||||||
const send_auxiliary_line = (val: boolean) => {
|
const send_auxiliary_line = (val: boolean) => {
|
||||||
set?.SetBlendingOption("blending_grids_assistant_lines", val ? "1" : "0");
|
set?.SetBlendingOption("blending_grids_assistant_lines", val ? "1" : "0");
|
||||||
@ -221,6 +427,15 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1]
|
$store.getters.GetTheCurrentlySelectedCamera[1]
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
const color = ref("#ffffff");
|
||||||
|
const ispad = computed(() => {
|
||||||
|
let url = window.location.href;
|
||||||
|
return url.indexOf("pad") != -1
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* 重置数据
|
||||||
|
* @param type
|
||||||
|
*/
|
||||||
const reset = (type: string) => {
|
const reset = (type: string) => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'gamma':
|
case 'gamma':
|
||||||
@ -237,13 +452,24 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
chang(type)
|
chang(type)
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 是否在切换数据 避免切换投影机是发送不该发送的数据
|
||||||
|
*/
|
||||||
const ste_status = ref(0);
|
const ste_status = ref(0);
|
||||||
|
/**
|
||||||
|
* 使用缓存
|
||||||
|
*/
|
||||||
const use_set_cache = () => {
|
const use_set_cache = () => {
|
||||||
if (set_cache.value[selectedprojector.value] != null) {
|
if (set_cache.value[selectedprojector.value] != null) {
|
||||||
let tmp = JSON.parse(set_cache.value[selectedprojector.value]);
|
let tmp = JSON.parse(set_cache.value[selectedprojector.value]);
|
||||||
deepcopy(array, tmp);
|
deepcopy(array, tmp);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 深度拷贝
|
||||||
|
* @param o1
|
||||||
|
* @param o2
|
||||||
|
*/
|
||||||
const deepcopy = (o1: any, o2: any) => {
|
const deepcopy = (o1: any, o2: any) => {
|
||||||
for (let k in o2) {
|
for (let k in o2) {
|
||||||
if (typeof o2[k] === "object") {
|
if (typeof o2[k] === "object") {
|
||||||
@ -254,40 +480,57 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 保存缓存
|
||||||
|
*/
|
||||||
const save_set_cache = () => {
|
const save_set_cache = () => {
|
||||||
set_cache.value[selectedprojector.value] = JSON.stringify(array);
|
set_cache.value[selectedprojector.value] = JSON.stringify(array);
|
||||||
};
|
};
|
||||||
let config = JSON.parse($store.state.fusion_configuration).projectors[0];
|
|
||||||
|
let config = JSON.parse($store.state.fusion_configuration).projectors[selectedprojector.value];
|
||||||
|
/**
|
||||||
|
* 当前选择的投影机
|
||||||
|
*/
|
||||||
const configselsect = computed(() => {
|
const configselsect = computed(() => {
|
||||||
return $store.state.selected_projector;
|
return $store.state.selected_projector;
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* 监听投影机切换
|
||||||
|
*/
|
||||||
watch(
|
watch(
|
||||||
() => configselsect,
|
() => configselsect,
|
||||||
(newVal, oldVal) => {
|
(newVal, oldVal) => {
|
||||||
let tmp = JSON.parse($store.state.fusion_configuration);
|
set?.GetBlendingConfig("").then((res) => {
|
||||||
let fortmp = null;
|
let tmp = JSON.parse(res ? res.config : "");
|
||||||
let i;
|
// let tmp = JSON.parse($store.state.fusion_configuration);
|
||||||
for (i of tmp.projectors) {
|
let fortmp = null;
|
||||||
if (
|
let i;
|
||||||
i.col === $store.getters.GetTheCurrentlySelectedCamera[1] &&
|
for (i of tmp.projectors) {
|
||||||
i.row === $store.getters.GetTheCurrentlySelectedCamera[0]
|
if (
|
||||||
) {
|
i.col === $store.getters.GetTheCurrentlySelectedCamera[1] &&
|
||||||
fortmp = JSON.parse(JSON.stringify(i));
|
i.row === $store.getters.GetTheCurrentlySelectedCamera[0]
|
||||||
|
) {
|
||||||
|
fortmp = JSON.parse(JSON.stringify(i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
ste_status.value = 1;
|
||||||
ste_status.value = 1;
|
|
||||||
|
config = JSON.parse(JSON.stringify(fortmp));
|
||||||
|
use_server_config();
|
||||||
|
// use_set_cache();
|
||||||
|
setTimeout(() => {
|
||||||
|
ste_status.value = 0;
|
||||||
|
}, 100);
|
||||||
|
setnowindex();
|
||||||
|
});
|
||||||
|
|
||||||
config = JSON.parse(JSON.stringify(fortmp));
|
|
||||||
use_server_config();
|
|
||||||
use_set_cache();
|
|
||||||
setTimeout(() => {
|
|
||||||
ste_status.value = 0;
|
|
||||||
}, 100);
|
|
||||||
setnowindex();
|
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
);
|
);
|
||||||
|
/**
|
||||||
|
* 输入inpu数据 时发送到后端
|
||||||
|
* @param type
|
||||||
|
*/
|
||||||
const chang = (type: string) => {
|
const chang = (type: string) => {
|
||||||
if (ste_status.value == 1) return
|
if (ste_status.value == 1) return
|
||||||
if (type == "alpha") {
|
if (type == "alpha") {
|
||||||
@ -320,6 +563,9 @@ export default defineComponent({
|
|||||||
save_set_cache();
|
save_set_cache();
|
||||||
};
|
};
|
||||||
//左上右下
|
//左上右下
|
||||||
|
/**
|
||||||
|
* 初始化数据时 自动获取焦点 的判断
|
||||||
|
*/
|
||||||
const setnowindex = () => {
|
const setnowindex = () => {
|
||||||
let sum = 0;
|
let sum = 0;
|
||||||
let indexx = 4;
|
let indexx = 4;
|
||||||
@ -363,6 +609,9 @@ export default defineComponent({
|
|||||||
}, 100);
|
}, 100);
|
||||||
setnowindex();
|
setnowindex();
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 初始化赋值
|
||||||
|
*/
|
||||||
const startconfig = () => {
|
const startconfig = () => {
|
||||||
for (let index = 0; index < array.length - 1; index++) {
|
for (let index = 0; index < array.length - 1; index++) {
|
||||||
array[arr[index]].gamma = Number(config.params[index].gamma.toFixed(2));
|
array[arr[index]].gamma = Number(config.params[index].gamma.toFixed(2));
|
||||||
@ -371,10 +620,15 @@ export default defineComponent({
|
|||||||
array[arr[index]].isshow = config.params[index].enable;
|
array[arr[index]].isshow = config.params[index].enable;
|
||||||
array[arr[index]].value = Number(config.params[index].size);
|
array[arr[index]].value = Number(config.params[index].size);
|
||||||
}
|
}
|
||||||
|
let tmp = JSON.parse($store.state.fusion_configuration).options;
|
||||||
|
auxiliary_line.value = tmp.blending_grids_assistant_lines == "1"
|
||||||
if (sessionStorage.FusionLocale) set_cache.value = JSON.parse(sessionStorage.FusionLocale);
|
if (sessionStorage.FusionLocale) set_cache.value = JSON.parse(sessionStorage.FusionLocale);
|
||||||
use_set_cache();
|
use_set_cache();
|
||||||
setnowindex();
|
setnowindex();
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 使用服务端配置
|
||||||
|
*/
|
||||||
const use_server_config = () => {
|
const use_server_config = () => {
|
||||||
for (let index = 0; index < array.length - 1; index++) {
|
for (let index = 0; index < array.length - 1; index++) {
|
||||||
array[arr[index]].gamma = Number(config.params[index].gamma.toFixed(2));
|
array[arr[index]].gamma = Number(config.params[index].gamma.toFixed(2));
|
||||||
@ -385,14 +639,22 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
ste_status.value = 1;
|
set?.GetBlendingConfig("").then((res) => {
|
||||||
startconfig();
|
let tmp = JSON.parse(res ? res.config : "");
|
||||||
setTimeout(() => {
|
config = tmp.projectors[selectedprojector.value];
|
||||||
ste_status.value = 0;
|
ste_status.value = 1;
|
||||||
}, 100);
|
color.value = tmp.blending_grids_background_color ?? "#7f7f7f"
|
||||||
|
// console.log(tmp.blending_grids_background_color )
|
||||||
|
startconfig();
|
||||||
|
setTimeout(() => {
|
||||||
|
ste_status.value = 0;
|
||||||
|
}, 100);
|
||||||
|
})
|
||||||
|
if (sessionStorage.FusionLocale_async) auto_sync.value = sessionStorage.FusionLocale_async == 'true'
|
||||||
}),
|
}),
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
sessionStorage.FusionLocale = JSON.stringify(set_cache.value);
|
sessionStorage.FusionLocale = JSON.stringify(set_cache.value);
|
||||||
|
sessionStorage.FusionLocale_async = auto_sync.value
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
@ -404,7 +666,7 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
1,
|
1,
|
||||||
array[0].isshow,
|
array[0].isshow,
|
||||||
Number(array[0].value)
|
Number(array[0].value), auto_sync.value
|
||||||
);
|
);
|
||||||
|
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
@ -420,9 +682,13 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
0,
|
0,
|
||||||
array[1].isshow,
|
array[1].isshow,
|
||||||
Number(array[1].value)
|
Number(array[1].value), auto_sync.value
|
||||||
);
|
);
|
||||||
if (auto_sync.value) left_right_auto_add(newVal);
|
if (auto_sync.value) {
|
||||||
|
// left_right_auto_add(Number(newVal)%2==0?newVal:Number(newVal)+1);
|
||||||
|
|
||||||
|
}
|
||||||
|
Number(newVal) % 2 != 0 ? array[1].value = Number(array[1].value) + 1 : ''
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
@ -436,9 +702,10 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
2,
|
2,
|
||||||
array[2].isshow,
|
array[2].isshow,
|
||||||
Number(array[2].value)
|
Number(array[2].value), auto_sync.value
|
||||||
);
|
);
|
||||||
if (auto_sync.value) left_right_auto_add(newVal);
|
// if (auto_sync.value) left_right_auto_add(Number(newVal)%2==0?newVal:Number(newVal)+1);
|
||||||
|
Number(newVal) % 2 != 0 ? array[2].value = Number(array[2].value) + 1 : ''
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
@ -452,7 +719,7 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
3,
|
3,
|
||||||
array[3].isshow,
|
array[3].isshow,
|
||||||
Number(array[3].value)
|
Number(array[3].value), auto_sync.value
|
||||||
);
|
);
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
},
|
},
|
||||||
@ -469,7 +736,7 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
1,
|
1,
|
||||||
array[0].isshow,
|
array[0].isshow,
|
||||||
Number(array[0].value)
|
Number(array[0].value), auto_sync.value
|
||||||
);
|
);
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
},
|
},
|
||||||
@ -484,9 +751,9 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
0,
|
0,
|
||||||
array[1].isshow,
|
array[1].isshow,
|
||||||
Number(array[1].value)
|
Number(array[1].value), auto_sync.value
|
||||||
);
|
);
|
||||||
if (auto_sync.value) left_right_auto_add(-1);
|
// if (auto_sync.value) left_right_auto_add(-1);
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
@ -500,9 +767,9 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
2,
|
2,
|
||||||
array[2].isshow,
|
array[2].isshow,
|
||||||
Number(array[2].value)
|
Number(array[2].value), auto_sync.value
|
||||||
);
|
);
|
||||||
if (auto_sync.value) left_right_auto_add(-1);
|
// if (auto_sync.value) left_right_auto_add(-1);
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
},
|
},
|
||||||
{ deep: true }
|
{ deep: true }
|
||||||
@ -516,7 +783,7 @@ export default defineComponent({
|
|||||||
$store.getters.GetTheCurrentlySelectedCamera[1],
|
$store.getters.GetTheCurrentlySelectedCamera[1],
|
||||||
3,
|
3,
|
||||||
array[3].isshow,
|
array[3].isshow,
|
||||||
Number(array[3].value)
|
Number(array[3].value), auto_sync.value
|
||||||
);
|
);
|
||||||
save_set_cache();
|
save_set_cache();
|
||||||
},
|
},
|
||||||
@ -535,71 +802,220 @@ export default defineComponent({
|
|||||||
const changenablefusion = () => {
|
const changenablefusion = () => {
|
||||||
$store.commit("setenablefusion", enablefusion.value);
|
$store.commit("setenablefusion", enablefusion.value);
|
||||||
};
|
};
|
||||||
const left_right_auto_add = (difference: number) => {
|
/**
|
||||||
|
* 利用缓存手动同步
|
||||||
|
*/
|
||||||
|
// const left_right_auto_add = (difference: number) => {
|
||||||
|
// let tmpobjall = JSON.parse($store.state.fusion_configuration)
|
||||||
|
// if ($store.getters.GetTheCurrentlySelectedCamera[1] == 0&&group.value==2) {
|
||||||
|
// let tmp = set_cache.value[1] == null ? tmpobjall.projectors[1].params : JSON.parse(set_cache.value[1]);
|
||||||
|
// let set_cache_tmp: any = []
|
||||||
|
// if (tmp[1].hasOwnProperty("power")) {
|
||||||
|
// for (let index = 0; index < 4; index++) {
|
||||||
|
// let tmpobj = { alpha: Number(tmp[arr[index]].alpha.toFixed(2)), p: Number(tmp[arr[index]].power.toFixed(2)), gamma: Number(tmp[arr[index]].gamma.toFixed(2)), isshow: tmp[arr[index]].enable, value: Number(tmp[arr[index]].size) }
|
||||||
|
// set_cache_tmp.push(tmpobj)
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// set_cache_tmp = tmp
|
||||||
|
// }
|
||||||
|
// if (ste_status.value == 0) {
|
||||||
|
// if (difference == -1) {
|
||||||
|
// set_cache_tmp[1].isshow = array[2].isshow
|
||||||
|
// } else {
|
||||||
|
// set_cache_tmp[1].value = difference
|
||||||
|
// }
|
||||||
|
// set?.SetBlendingOverlap(0, 1, 0, set_cache_tmp[1].isshow, Number(set_cache_tmp[1].value));
|
||||||
|
// set_cache.value[1] = JSON.stringify(set_cache_tmp);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if ($store.getters.GetTheCurrentlySelectedCamera[1] == 1&&group.value==1) {
|
||||||
|
|
||||||
let tmpobjall = JSON.parse($store.state.fusion_configuration)
|
// let tmp = set_cache.value[0] == null ? tmpobjall.projectors[0].params : JSON.parse(set_cache.value[0]);
|
||||||
if ($store.getters.GetTheCurrentlySelectedCamera[1] == 0) {
|
// let set_cache_tmp: any = []
|
||||||
|
// if (tmp[0].hasOwnProperty("power")) {
|
||||||
|
// for (let index = 0; index < 4; index++) {
|
||||||
|
// let tmpobj = { alpha: Number(tmp[arr[index]].alpha.toFixed(2)), p: Number(tmp[arr[index]].power.toFixed(2)), gamma: Number(tmp[arr[index]].gamma.toFixed(2)), isshow: tmp[arr[index]].enable, value: Number(tmp[arr[index]].size) }
|
||||||
|
// set_cache_tmp.push(tmpobj)
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// set_cache_tmp = tmp
|
||||||
|
// }
|
||||||
|
// if (ste_status.value == 0) {
|
||||||
|
// //set_cache_tmp[2].value = Number(set_cache_tmp[2].value) + difference
|
||||||
|
|
||||||
let tmp = set_cache.value[1] == null ? tmpobjall.projectors[1].params : JSON.parse(set_cache.value[1]);
|
// if (difference == -1) {
|
||||||
let set_cache_tmp: any = []
|
// set_cache_tmp[2].isshow = array[1].isshow
|
||||||
if (tmp[1].hasOwnProperty("power")) {
|
// } else {
|
||||||
for (let index = 0; index < 4; index++) {
|
// set_cache_tmp[2].value = difference
|
||||||
let tmpobj = { alpha: Number(tmp[arr[index]].alpha.toFixed(2)), p: Number(tmp[arr[index]].power.toFixed(2)), gamma: Number(tmp[arr[index]].gamma.toFixed(2)), isshow: tmp[arr[index]].enable, value: Number(tmp[arr[index]].size) }
|
// }
|
||||||
set_cache_tmp.push(tmpobj)
|
// set?.SetBlendingOverlap(0, 0, 2, set_cache_tmp[2].isshow, Number(set_cache_tmp[2].value));
|
||||||
}
|
// set_cache.value[0] = JSON.stringify(set_cache_tmp);
|
||||||
} else {
|
// }
|
||||||
set_cache_tmp = tmp
|
// }
|
||||||
}
|
// }
|
||||||
if (ste_status.value == 0) {
|
|
||||||
//set_cache_tmp[1].value = Number(set_cache_tmp[1].value) + difference
|
|
||||||
|
|
||||||
if (difference == -1) {
|
|
||||||
set_cache_tmp[1].isshow = array[2].isshow
|
// watch(()=>auto_sync,()=>{
|
||||||
|
// console.log(auto_sync.value)
|
||||||
|
// set?.SetBlendingOption("fusion_with_automatic_sync", auto_sync.value?'1':'0');
|
||||||
|
// },{deep:true})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 平板弹窗修改
|
||||||
|
*/
|
||||||
|
const ipad_chang = ref(false)
|
||||||
|
/**
|
||||||
|
* 当前url路径
|
||||||
|
*/
|
||||||
|
let url = window.location.href;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 长按实现
|
||||||
|
* 单击实现
|
||||||
|
*/
|
||||||
|
let loop: NodeJS.Timeout
|
||||||
|
let loop_end: NodeJS.Timeout
|
||||||
|
const handlerTouchstart = (fun: string) => {
|
||||||
|
loop_end = setTimeout(() => {
|
||||||
|
loop = setInterval(() => {
|
||||||
|
if (fun == '+') {
|
||||||
|
array[group.value].value += 2
|
||||||
} else {
|
} else {
|
||||||
set_cache_tmp[1].value = difference
|
array[group.value].value -= 2
|
||||||
}
|
}
|
||||||
set?.SetBlendingOverlap(0, 1, 0, set_cache_tmp[1].isshow, Number(set_cache_tmp[1].value));
|
}, 30)
|
||||||
set_cache.value[1] = JSON.stringify(set_cache_tmp);
|
}, 100);
|
||||||
}
|
if (fun == '+') {
|
||||||
}
|
array[group.value].value += 2
|
||||||
if ($store.getters.GetTheCurrentlySelectedCamera[1] == 1) {
|
} else {
|
||||||
|
array[group.value].value -= 2
|
||||||
let tmp = set_cache.value[0] == null ? tmpobjall.projectors[0].params : JSON.parse(set_cache.value[0]);
|
|
||||||
let set_cache_tmp: any = []
|
|
||||||
if (tmp[0].hasOwnProperty("power")) {
|
|
||||||
for (let index = 0; index < 4; index++) {
|
|
||||||
let tmpobj = { alpha: Number(tmp[arr[index]].alpha.toFixed(2)), p: Number(tmp[arr[index]].power.toFixed(2)), gamma: Number(tmp[arr[index]].gamma.toFixed(2)), isshow: tmp[arr[index]].enable, value: Number(tmp[arr[index]].size) }
|
|
||||||
set_cache_tmp.push(tmpobj)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
set_cache_tmp = tmp
|
|
||||||
}
|
|
||||||
if (ste_status.value == 0) {
|
|
||||||
//set_cache_tmp[2].value = Number(set_cache_tmp[2].value) + difference
|
|
||||||
|
|
||||||
if (difference == -1) {
|
|
||||||
set_cache_tmp[2].isshow = array[1].isshow
|
|
||||||
} else {
|
|
||||||
set_cache_tmp[2].value = difference
|
|
||||||
}
|
|
||||||
set?.SetBlendingOverlap(0, 0, 2, set_cache_tmp[2].isshow, Number(set_cache_tmp[2].value));
|
|
||||||
set_cache.value[0] = JSON.stringify(set_cache_tmp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const handlerTouchend = () => {
|
||||||
|
clearInterval(loop)
|
||||||
|
clearTimeout(loop_end)
|
||||||
|
}
|
||||||
|
|
||||||
|
const submit = () => {
|
||||||
|
set?.SetBlendingOption("blending_grids_background_color", color.value);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 处理平板模式下 伽马校正操作
|
||||||
|
* 手写实现pad长按点击
|
||||||
|
*/
|
||||||
|
const ipad_chang_input = ref(false)
|
||||||
|
const now_apg = ref("");
|
||||||
|
let loop__apg: NodeJS.Timeout
|
||||||
|
let loop__apg_end: NodeJS.Timeout
|
||||||
|
const handlerTouchstart_apg = (fun: string) => {
|
||||||
|
loop__apg_end = setTimeout(() => {
|
||||||
|
loop__apg = setInterval(() => {
|
||||||
|
if (fun == '+') {
|
||||||
|
array[group.value][now_apg.value] = toDecimal(array[group.value][now_apg.value] + 0.1)
|
||||||
|
} else {
|
||||||
|
array[group.value][now_apg.value] = toDecimal(array[group.value][now_apg.value] - 0.1)
|
||||||
|
}
|
||||||
|
chang(now_apg.value)
|
||||||
|
}, 30)
|
||||||
|
}, 1000);
|
||||||
|
if (fun == '+') {
|
||||||
|
array[group.value][now_apg.value] = toDecimal(array[group.value][now_apg.value] + 0.1)
|
||||||
|
} else {
|
||||||
|
array[group.value][now_apg.value] = toDecimal(array[group.value][now_apg.value] - 0.1)
|
||||||
|
}
|
||||||
|
chang(now_apg.value)
|
||||||
|
}
|
||||||
|
const handlerTouchend_apg = () => {
|
||||||
|
clearTimeout(loop__apg_end)
|
||||||
|
clearInterval(loop__apg)
|
||||||
|
}
|
||||||
|
const toDecimal = (num: number): number => {
|
||||||
|
return Math.round(num * 100) / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let loop_start: NodeJS.Timeout
|
||||||
|
let loop_finish: NodeJS.Timeout
|
||||||
|
const input_focus = ref([false, false, false, false,])
|
||||||
|
const mousedown = (fun: string, index: number) => {
|
||||||
|
loop_start = setTimeout(() => {
|
||||||
|
loop_finish = setInterval(() => {
|
||||||
|
if (fun == '+') {
|
||||||
|
array[index].value += 2
|
||||||
|
} else {
|
||||||
|
array[index].value -= 2
|
||||||
|
}
|
||||||
|
}, 30)
|
||||||
|
}, 1000);
|
||||||
|
if (fun == '+') {
|
||||||
|
array[index].value += 2
|
||||||
|
} else {
|
||||||
|
array[index].value -= 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const mouseup = () => {
|
||||||
|
clearTimeout(loop_start)
|
||||||
|
clearInterval(loop_finish)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const input_focus_apg = ref([false, false, false,])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// const ["上","左","右","下"]
|
||||||
|
/**
|
||||||
|
* 可供选择的
|
||||||
|
*/
|
||||||
|
const options = [{
|
||||||
|
label: $t.t('up'),
|
||||||
|
value: 0
|
||||||
|
}, {
|
||||||
|
label: $t.t('left'),
|
||||||
|
value: 1
|
||||||
|
}, {
|
||||||
|
label: $t.t('right'),
|
||||||
|
value: 2
|
||||||
|
}, {
|
||||||
|
label: $t.t('down'),
|
||||||
|
value: 3
|
||||||
|
}]
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
options,
|
||||||
|
input_focus_apg,
|
||||||
|
input_focus,
|
||||||
|
mousedown,
|
||||||
|
mouseup,
|
||||||
|
now_apg,
|
||||||
|
handlerTouchstart_apg,
|
||||||
|
handlerTouchend_apg,
|
||||||
|
ipad_chang_input,
|
||||||
send_auxiliary_line,
|
send_auxiliary_line,
|
||||||
group,
|
group,
|
||||||
array,
|
array,
|
||||||
chang,
|
chang,
|
||||||
enablefusion,
|
enablefusion,
|
||||||
changenablefusion,
|
// changenablefusion,
|
||||||
selectedprojector,
|
selectedprojector,
|
||||||
set_cache,
|
set_cache,
|
||||||
auxiliary_line,
|
auxiliary_line,
|
||||||
reset,
|
reset,
|
||||||
auto_sync,
|
auto_sync,
|
||||||
config
|
config,
|
||||||
|
save_set_cache,
|
||||||
|
ipad_chang,
|
||||||
|
url,
|
||||||
|
handlerTouchstart,
|
||||||
|
handlerTouchend,
|
||||||
|
ispad,
|
||||||
|
color,
|
||||||
|
submit
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-4"></div>
|
<div class="col-4 col-sm-3"></div>
|
||||||
<div class="col-4 q-pt-sm"><q-select outlined v-model="model[0]"
|
<div class="col-4 col-sm-6 q-pt-sm"><q-select outlined v-model="model[0]"
|
||||||
@update:model-value="update_row_col(0, model[0])" :options="options" :dense="true" :options-dense="true"
|
@update:model-value="update_row_col(0, model[0])" :options="options" :dense="true" :options-dense="true"
|
||||||
:label="$t('wall row')" /> </div><q-checkbox @update:model-value="send_off(0)"
|
:label="$t('wall row')" /> </div><q-checkbox @update:model-value="send_off(0)"
|
||||||
v-model="RowsColumns[0]" />
|
v-model="RowsColumns[0]" />
|
||||||
@ -13,8 +13,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-4"></div>
|
<div class="col-4 col-sm-3"></div>
|
||||||
<div class="col-4 q-pt-sm"><q-select outlined v-model="model[1]"
|
<div class="col-4 col-sm-6 q-pt-sm"><q-select outlined v-model="model[1]"
|
||||||
@update:model-value="update_row_col(1, model[1])" :options="options" :dense="true" :options-dense="true"
|
@update:model-value="update_row_col(1, model[1])" :options="options" :dense="true" :options-dense="true"
|
||||||
:label="$t('wall col')" /> </div><q-checkbox @update:model-value="send_off(1)"
|
:label="$t('wall col')" /> </div><q-checkbox @update:model-value="send_off(1)"
|
||||||
v-model="RowsColumns[1]" />
|
v-model="RowsColumns[1]" />
|
||||||
@ -22,16 +22,16 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-4"></div>
|
<div class="col-4 col-sm-3"></div>
|
||||||
<div class="col-4 q-pt-sm"><q-select outlined v-model="model[2]"
|
<div class="col-4 col-sm-6 q-pt-sm"><q-select outlined v-model="model[2]"
|
||||||
@update:model-value="update_row_col(2, model[2])" :options="line_width_options" :dense="true" :options-dense="true"
|
@update:model-value="update_row_col(2, model[2])" :options="line_width_options" :dense="true" :options-dense="true"
|
||||||
:label="$t('line width')" /> </div>
|
:label="$t('line width')" /> </div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="row" style="min-height: 40px;">
|
<div class="row" style="min-height: 40px;">
|
||||||
<div class="col-4"></div>
|
<div class="col-4 col-sm-3"></div>
|
||||||
<div class="col-4 q-pt-sm">
|
<div class="col-4 col-sm-6 q-pt-sm">
|
||||||
<q-item>
|
<q-item>
|
||||||
<q-item-section avatar class="head_1">
|
<q-item-section avatar class="head_1">
|
||||||
{{ $t("line color") }}
|
{{ $t("line color") }}
|
||||||
@ -51,36 +51,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="row" style="min-height: 40px;">
|
<div class="row" style="min-height: 40px;">
|
||||||
<div class="col-4"></div>
|
<div class="col-4 col-sm-3"></div>
|
||||||
<div class="col-4 q-pt-sm">
|
<div class="col-4 col-sm-6 q-pt-sm">
|
||||||
<q-item>
|
<q-item>
|
||||||
<q-item-section avatar class="head_1">
|
<q-item-section avatar class="head_1">
|
||||||
{{ $t("background color") }}
|
{{ $t("center circle color") }}
|
||||||
</q-item-section>
|
|
||||||
<q-item-section>
|
|
||||||
<q-input v-model="color[1]" :rules="['anyColor']">
|
|
||||||
<template v-slot:append>
|
|
||||||
<q-icon name="colorize" class="cursor-pointer" @click="index = 1">
|
|
||||||
<q-popup-proxy cover transition-show="scale" transition-hide="scale">
|
|
||||||
<q-color v-model="color[1]" @change="submit" />
|
|
||||||
</q-popup-proxy>
|
|
||||||
</q-icon>
|
|
||||||
</template>
|
|
||||||
</q-input>
|
|
||||||
</q-item-section>
|
|
||||||
</q-item>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="row" style="min-height: 40px;">
|
|
||||||
<div class="col-4"></div>
|
|
||||||
<div class="col-4 q-pt-sm">
|
|
||||||
<q-item>
|
|
||||||
<q-item-section avatar class="head_1">
|
|
||||||
{{ $t("center line color") }}
|
|
||||||
</q-item-section>
|
</q-item-section>
|
||||||
<q-item-section>
|
<q-item-section>
|
||||||
<q-input v-model="color[2]" :rules="['anyColor']">
|
<q-input v-model="color[2]" :rules="['anyColor']">
|
||||||
@ -130,8 +108,11 @@ export default defineComponent({
|
|||||||
const index = ref(0);
|
const index = ref(0);
|
||||||
const color = reactive(["#ffffff", "#CCCCCC", "#000", "#000"]);
|
const color = reactive(["#ffffff", "#CCCCCC", "#000", "#000"]);
|
||||||
let model = reactive([20, 40, 20]);
|
let model = reactive([20, 40, 20]);
|
||||||
let options = ref([10, 20, 30, 40, 50]);
|
let options = ref([10, 20, 30, 40, 50, 60 ,80]);
|
||||||
let line_width_options = ref([2,4,6,8,10, 20, 30, 40, 50]);
|
let line_width_options = ref([2,4,6,8,10, 20, 30, 40, 50]);
|
||||||
|
/**
|
||||||
|
* 发送颜色 根据index不同确定是那个接口
|
||||||
|
*/
|
||||||
const submit = () => {
|
const submit = () => {
|
||||||
switch (index.value) {
|
switch (index.value) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -150,6 +131,11 @@ export default defineComponent({
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 修改 横纵 线的数量
|
||||||
|
* @param type 类型
|
||||||
|
* @param value 值
|
||||||
|
*/
|
||||||
const update_row_col = (type: number, value: number) => {
|
const update_row_col = (type: number, value: number) => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -165,6 +151,10 @@ export default defineComponent({
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 修改 单选 发送数据 使用switch 匹配多个
|
||||||
|
* @param type
|
||||||
|
*/
|
||||||
const send_off = (type: number) => {
|
const send_off = (type: number) => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -186,6 +176,9 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 使用服务端配置
|
||||||
|
*/
|
||||||
const use_server_config = () => {
|
const use_server_config = () => {
|
||||||
let server_conf = JSON.parse($store.state.fusion_configuration).options
|
let server_conf = JSON.parse($store.state.fusion_configuration).options
|
||||||
model[0] = server_conf.blending_grids_row ?? 20;
|
model[0] = server_conf.blending_grids_row ?? 20;
|
||||||
@ -203,10 +196,16 @@ export default defineComponent({
|
|||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
set_sessionStorage()
|
set_sessionStorage()
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* 保存缓存到sessionStorage
|
||||||
|
*/
|
||||||
const set_sessionStorage = () => {
|
const set_sessionStorage = () => {
|
||||||
let tmp = { RowsColumns: RowsColumns, color: color, model: model }
|
let tmp = { RowsColumns: RowsColumns, color: color, model: model }
|
||||||
sessionStorage.GridSettings = JSON.stringify(tmp)
|
sessionStorage.GridSettings = JSON.stringify(tmp)
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 获取sessionStorage
|
||||||
|
*/
|
||||||
const get_sessionStorage = () => {
|
const get_sessionStorage = () => {
|
||||||
let tmp = JSON.parse(sessionStorage.GridSettings)
|
let tmp = JSON.parse(sessionStorage.GridSettings)
|
||||||
for (let index = 0; index < tmp.RowsColumns.length; index++) {
|
for (let index = 0; index < tmp.RowsColumns.length; index++) {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -9,7 +9,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
">
|
">
|
||||||
<q-card class="" style="max-width: 90vw;padding: 0;">
|
<q-card class="" id="element" style="max-width: 90vw;padding: 0;">
|
||||||
<q-form>
|
<q-form>
|
||||||
<q-card-section class="q-ma-none q-pa-sm">
|
<q-card-section class="q-ma-none q-pa-sm">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -18,6 +18,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<q-space />
|
<q-space />
|
||||||
|
<q-btn v-show="ispad" size="sm" dense flat @click="element_full_screen" round :icon="is_pad_screen?'zoom_in_map':'zoom_out_map'" >
|
||||||
|
|
||||||
|
</q-btn>
|
||||||
<q-btn size="sm" dense flat round icon="close" color="red" @click="clear()" v-close-popup>
|
<q-btn size="sm" dense flat round icon="close" color="red" @click="clear()" v-close-popup>
|
||||||
<q-tooltip>
|
<q-tooltip>
|
||||||
{{ $t("close") }}
|
{{ $t("close") }}
|
||||||
@ -28,49 +31,55 @@
|
|||||||
|
|
||||||
<q-separator />
|
<q-separator />
|
||||||
<!-- height: 80vh -->
|
<!-- height: 80vh -->
|
||||||
<q-card-section class="scroll" style="width: 60vw;padding: 0;">
|
<q-card-section class="scroll" :style="{ 'width': is_pad_style, padding: 0 }">
|
||||||
<div class="row" style="border: 1px solid #b0bec5; text-align: center">
|
<div class="row" style="border: 1px solid #b0bec5; text-align: center">
|
||||||
<div class="col-2" style="border-right: 1px solid #b0bec5">
|
<div class="col-2" style="border-right: 1px solid #b0bec5">
|
||||||
<p class="text-center">{{ $t("Projector") }}</p>
|
<p class="text-center">{{ $t("Projector") }}</p>
|
||||||
<!-- row 在前col在后 -->
|
<!-- row 在前col在后 -->
|
||||||
|
<!-- <div v-for="(item, index_row) in config.row">
|
||||||
|
<projector-item v-for="(item, index_col) in config.col" class="w-100" :llabel="
|
||||||
|
$t('Projector') + (index_row * config.col + index_col + 1)
|
||||||
|
" :lvalue="index_row + '/' + index_col"
|
||||||
|
@click="currently_selected_projector(index_row + '-' + index_col)"></projector-item>
|
||||||
|
</div> -->
|
||||||
|
|
||||||
<div v-for="(item, index_row) in config.row">
|
<div v-for="(item, index_row) in config.row">
|
||||||
<projector-item v-for="(item, index_col) in config.col" class="w-100" :llabel="
|
<projector-item v-for="(item, index_col) in config.col" class="w-100" :llabel="
|
||||||
$t('Projector') + (index_row * config.col + index_col + 1)
|
$t('Projector') + (index_row * config.col + index_col + 1)
|
||||||
" :lvalue="index_row + '/' + index_col"
|
" :lvalue="index_row + '/' + index_col"
|
||||||
@click="currently_selected_projector(index_row + '-' + index_col)"></projector-item>
|
@click="currently_selected_projector(index_row + '-' + index_col)"></projector-item>
|
||||||
</div>
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<div class="col-3 q-px-md "> <q-select class="q-pt-md overflow-hidden" :label="$t('change resolution')"
|
||||||
|
@update:model-value="(val) => { dialog(val, set_resolution, 'resolution') }" :dense="true" filled
|
||||||
|
v-model="now_resolution" :options="options_resolution" emit-value map-options /></div>
|
||||||
|
<!-- <div class="col-3 q-px-md"> <q-select class="q-pt-md " use-input hide-selected fill-input
|
||||||
|
@filter="filterFn_projector" :label="$t('Change projector layout')"
|
||||||
|
@update:model-value="(val) => { dialog(val, send_projectorlayout, 'projector') }" :dense="true" filled
|
||||||
|
v-model="now_select_projectorlayout" :options="show_projectorlayout" emit-value map-options /></div> -->
|
||||||
|
<div class="col-3 q-px-md"> <q-select class="q-pt-md " use-input hide-selected fill-input
|
||||||
|
@filter="filterFn_projector2" :label="$t('Change projector layout')"
|
||||||
|
@update:model-value="(val) => { dialog_projectorlayout(val, send_projectorlayout2) }" :dense="true" filled
|
||||||
|
v-model="now_select_projectorlayout_tmp" :options="show_projectorlayout2" emit-value /></div>
|
||||||
|
</div>
|
||||||
<div class="col-12" style="text-align: center">
|
<div class="col-12" style="text-align: center">
|
||||||
{{
|
{{
|
||||||
$t("Whether to enable integration")
|
$t("Enable projection mode")
|
||||||
}}<q-checkbox v-model="EnableBlending" />
|
}}<q-checkbox v-model="EnableBlending" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-10">
|
<div class="col-10">
|
||||||
<div class="q-ta-md">
|
<div class="q-ta-md">
|
||||||
<q-btn-toggle :disable="!$store.state.enablefusion" no-caps v-model="options" toggle-color="primary"
|
<q-btn-toggle :disable="!$store.state.enablefusion" no-caps v-model="options" toggle-color="primary"
|
||||||
:options="[
|
:options="btn_options" />
|
||||||
{ label: $t('FusionLocale'), value: 'FusionLocale' },
|
|
||||||
{
|
|
||||||
label: $t('FourPointCalibration'),
|
|
||||||
value: 'FourPointCalibration',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: $t('SurfaceCorrection'),
|
|
||||||
value: 'SurfaceCorrection',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: $t('DensityCorrection'),
|
|
||||||
value: 'DensityCorrection',
|
|
||||||
},
|
|
||||||
{ label: $t('GridSettings'), value: 'GridSettings' },
|
|
||||||
]" />
|
|
||||||
<q-btn-toggle v-show="isdebug" no-caps v-model="options" toggle-color="primary" :options="[
|
<q-btn-toggle v-show="isdebug" no-caps v-model="options" toggle-color="primary" :options="[
|
||||||
{ label: $t('debugging'), value: 'Debugging' }
|
{ label: $t('debugging'), value: 'Debugging' }
|
||||||
]" />
|
]" />
|
||||||
</div>
|
</div>
|
||||||
<div style="min-height: 72vh">
|
<div style="min-height: 72vh">
|
||||||
<component :is="options" />
|
<component ref="child" :is="options" :row="config.row" :col="config.col" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -90,16 +99,16 @@
|
|||||||
<q-btn color="white" @click="resetall" text-color="black" :label="$t('resetall config')" />
|
<q-btn color="white" @click="resetall" text-color="black" :label="$t('resetall config')" />
|
||||||
<div class="q-space" data-v-39efcd1f=""></div>
|
<div class="q-space" data-v-39efcd1f=""></div>
|
||||||
<q-btn flat :label="$t('Select saved configuration')" no-caps color="primary"
|
<q-btn flat :label="$t('Select saved configuration')" no-caps color="primary"
|
||||||
@click="select_configuration = true; get_scenes()" />
|
@click="select_configuration = true; select_configuration_name = ''; get_scenes()" />
|
||||||
<q-btn flat :label="$t('Cancel')" no-caps color="primary" v-close-popup
|
<q-btn flat :label="$t('Cancel')" no-caps color="primary" v-close-popup
|
||||||
@click="$store.commit('setSelectedProjector', '0/0');" />
|
@click="$store.commit('setSelectedProjector', '0/0'); clear()" />
|
||||||
<q-btn flat :label="$t('save config')" no-caps color="primary" @click="save" />
|
<q-btn flat :label="$t('save config')" no-caps color="primary" @click="save" />
|
||||||
</q-card-actions>
|
</q-card-actions>
|
||||||
</q-form>
|
</q-form>
|
||||||
</q-card>
|
</q-card>
|
||||||
|
|
||||||
<q-dialog v-model="medium">
|
<q-dialog v-model="medium">
|
||||||
<q-card style="width: 700px; max-width: 80vw;">
|
<q-card style="width: 40vw; max-width: 80vw;">
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-h6">{{ $t('Whether to save the configuration') }}</div>
|
<div class="text-h6">{{ $t('Whether to save the configuration') }}</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
@ -119,15 +128,15 @@
|
|||||||
</q-select>
|
</q-select>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-actions align="right" class="bg-white text-teal">
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
<q-btn flat :label="$t('Cancel')" color="primary" v-close-popup />
|
<q-btn flat :label="$t('Cancel')" color="primary" @click="medium = false"/>
|
||||||
<q-btn flat :label="$t('save')" @click="saveconfig" color="primary" v-close-popup />
|
<q-btn flat :label="$t('save')" @click="saveconfig" color="primary" />
|
||||||
</q-card-actions>
|
</q-card-actions>
|
||||||
</q-card>
|
</q-card>
|
||||||
</q-dialog>
|
</q-dialog>
|
||||||
|
|
||||||
|
|
||||||
<q-dialog v-model="select_configuration">
|
<q-dialog v-model="select_configuration">
|
||||||
<q-card style="width: 700px; max-width: 80vw;">
|
<q-card style="width: 40vw; max-width: 80vw;">
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-h6">{{ $t('read saved configuration') }}</div>
|
<div class="text-h6">{{ $t('read saved configuration') }}</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
@ -146,14 +155,14 @@
|
|||||||
</q-select>
|
</q-select>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-actions align="right" class="bg-white text-teal">
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
<q-btn flat :label="$t('Cancel')" color="primary" v-close-popup />
|
<q-btn flat :label="$t('Cancel')" color="primary" @click="select_configuration=false" />
|
||||||
<q-btn flat :label="$t('apply')" @click="apply_the_selected_configuration" color="primary" v-close-popup />
|
<q-btn flat :label="$t('load')" @click="apply_the_selected_configuration" color="primary" />
|
||||||
</q-card-actions>
|
</q-card-actions>
|
||||||
</q-card>
|
</q-card>
|
||||||
</q-dialog>
|
</q-dialog>
|
||||||
|
|
||||||
<q-dialog v-model="del_dialog">
|
<q-dialog v-model="del_dialog">
|
||||||
<q-card style="width: 700px; max-width: 80vw;">
|
<q-card style="width: 40vw; max-width: 80vw;">
|
||||||
<q-card-section>
|
<q-card-section>
|
||||||
<div class="text-h6">{{ $t('confirm delete') }}</div>
|
<div class="text-h6">{{ $t('confirm delete') }}</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
@ -161,8 +170,42 @@
|
|||||||
{{ $t('Whether to delete') + name_to_be_deleted }}
|
{{ $t('Whether to delete') + name_to_be_deleted }}
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
<q-card-actions align="right" class="bg-white text-teal">
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
<q-btn flat :label="$t('Cancel')" color="primary" v-close-popup />
|
<q-btn flat :label="$t('Cancel')" color="primary" @click="del_dialog=false" />
|
||||||
<q-btn flat :label="$t('ok')" @click="dialog_del_scenes" color="primary" v-close-popup />
|
<q-btn flat :label="$t('ok')" @click="()=>{dialog_del_scenes();del_dialog=false}" color="primary" />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-dialog>
|
||||||
|
|
||||||
|
|
||||||
|
<q-dialog v-model="confirm">
|
||||||
|
<q-card style="width: 40vw; max-width: 80vw;">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="text-h6">{{ $t('Do you confirm the modification') }}</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-section class="q-pt-none">
|
||||||
|
{{ dialog_data.type == 'resolution' ? $t('Whether to modify the resolution to') +
|
||||||
|
options_resolution[dialog_data.parameter].label : $t('Whether to change the projector layout to') +
|
||||||
|
projectorlayout[dialog_data.parameter].label }}
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
|
<q-btn flat :label="$t('Cancel')" @click="()=>{re_match_data();confirm=false}" color="primary" />
|
||||||
|
<q-btn flat :label="$t('ok')" @click="()=>{trigger_dialog();confirm=false}" color="primary" />
|
||||||
|
</q-card-actions>
|
||||||
|
</q-card>
|
||||||
|
</q-dialog>
|
||||||
|
|
||||||
|
|
||||||
|
<q-dialog v-model="confirm_projectorlayout">
|
||||||
|
<q-card style="width: 40vw; max-width: 80vw;">
|
||||||
|
<q-card-section>
|
||||||
|
<div class="text-h6">{{ $t('Do you confirm the modification') }}</div>
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-section class="q-pt-none">
|
||||||
|
{{ $t('Whether to change the projector layout to') + dialog_data_projectorlayout.parameter }}
|
||||||
|
</q-card-section>
|
||||||
|
<q-card-actions align="right" class="bg-white text-teal">
|
||||||
|
<q-btn flat :label="$t('Cancel')" @click="()=>{re_match_data();confirm_projectorlayout=false}" color="primary" />
|
||||||
|
<q-btn flat :label="$t('ok')" @click="()=>{trigger_dialog_projectorlayout();confirm_projectorlayout=false}" color="primary" />
|
||||||
</q-card-actions>
|
</q-card-actions>
|
||||||
</q-card>
|
</q-card>
|
||||||
</q-dialog>
|
</q-dialog>
|
||||||
@ -189,6 +232,7 @@ import {
|
|||||||
computed,
|
computed,
|
||||||
onMounted,
|
onMounted,
|
||||||
onBeforeMount,
|
onBeforeMount,
|
||||||
|
provide,
|
||||||
} from "vue";
|
} from "vue";
|
||||||
import { useStore } from "src/store";
|
import { useStore } from "src/store";
|
||||||
import { useQuasar, copyToClipboard } from "quasar";
|
import { useQuasar, copyToClipboard } from "quasar";
|
||||||
@ -205,6 +249,7 @@ import GridSettings from "src/components/FusionSettings/GridSettings.vue";
|
|||||||
import SurfaceCorrection from "src/components/FusionSettings/SurfaceCorrection.vue";
|
import SurfaceCorrection from "src/components/FusionSettings/SurfaceCorrection.vue";
|
||||||
import DensityCorrection from "src/components/FusionSettings/DensityCorrection.vue";
|
import DensityCorrection from "src/components/FusionSettings/DensityCorrection.vue";
|
||||||
import Debugging from "src/components/FusionSettings/Debugging.vue";
|
import Debugging from "src/components/FusionSettings/Debugging.vue";
|
||||||
|
import { number } from "yargs";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ComponentFusionSettingsDialog",
|
name: "ComponentFusionSettingsDialog",
|
||||||
@ -227,34 +272,133 @@ export default defineComponent({
|
|||||||
const showDialog = async () => {
|
const showDialog = async () => {
|
||||||
show_dialog.value = true;
|
show_dialog.value = true;
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* 当前平板是否全屏
|
||||||
|
*/
|
||||||
|
const is_pad_screen = ref(false);
|
||||||
|
/**
|
||||||
|
* 计算平板和pc的样式
|
||||||
|
*/
|
||||||
|
const is_pad_style = computed(() => {
|
||||||
|
let url = window.location.href
|
||||||
|
if (url.indexOf("pad") != -1 && $t.locale.value == "en-US") {
|
||||||
|
return ""
|