feature/gui-configuration:支持从 GUI 配置程序。 #4

Merged
Ivan merged 19 commits from feature/gui-configuration into master 2023-01-26 23:44:19 +08:00
8 changed files with 498 additions and 421 deletions
Showing only changes of commit 9030d48e21 - Show all commits

View File

@ -16,8 +16,8 @@
"@fortawesome/free-regular-svg-icons": "^6.2.1",
"@fortawesome/free-solid-svg-icons": "^6.2.1",
"@fortawesome/react-fontawesome": "^0.2.0",
"@mui/material": "^5.11.1",
"@tauri-apps/api": "^1.1.0",
"@mui/material": "^5.11.2",
"@tauri-apps/api": "^1.2.0",
"clsx": "^1.2.1",
"ramda": "^0.28.0",
"react": "^18.2.0",
@ -25,15 +25,15 @@
"react-dom": "^18.2.0"
},
"devDependencies": {
"@babel/plugin-transform-react-jsx": "^7.19.0",
"@babel/plugin-transform-react-jsx": "^7.20.7",
"@emotion/babel-plugin-jsx-pragmatic": "^0.2.0",
"@emotion/serialize": "^1.1.1",
"@tauri-apps/cli": "^1.1.0",
"@types/node": "^18.7.10",
"@tauri-apps/cli": "^1.2.2",
"@types/node": "^18.11.18",
"@types/ramda": "^0.28.20",
"@types/react": "^18.0.15",
"@types/react-dom": "^18.0.6",
"@vitejs/plugin-react": "^2.0.0",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.10",
"@vitejs/plugin-react": "^2.2.0",
"autoprefixer": "^10.4.13",
"babel-plugin-macros": "^3.1.0",
"eslint-config-prettier": "^8.5.0",
@ -41,11 +41,11 @@
"eslint-plugin-jsx-a11y": "^6.6.1",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-simple-import-sort": "^8.0.0",
"postcss": "^8.4.19",
"prettier": "^2.7.1",
"postcss": "^8.4.20",
"prettier": "^2.8.1",
"tailwindcss": "^3.2.4",
"twin.macro": "^3.1.0",
"typescript": "^4.6.4",
"vite": "^3.0.2"
"typescript": "^4.9.4",
"vite": "^3.2.5"
}
}

315
pnpm-lock.yaml generated
View File

@ -1,7 +1,7 @@
lockfileVersion: 5.4
specifiers:
'@babel/plugin-transform-react-jsx': ^7.19.0
'@babel/plugin-transform-react-jsx': ^7.20.7
'@emotion/babel-plugin-jsx-pragmatic': ^0.2.0
'@emotion/react': ^11.10.5
'@emotion/serialize': ^1.1.1
@ -10,14 +10,14 @@ specifiers:
'@fortawesome/free-regular-svg-icons': ^6.2.1
'@fortawesome/free-solid-svg-icons': ^6.2.1
'@fortawesome/react-fontawesome': ^0.2.0
'@mui/material': ^5.11.1
'@tauri-apps/api': ^1.1.0
'@tauri-apps/cli': ^1.1.0
'@types/node': ^18.7.10
'@mui/material': ^5.11.2
'@tauri-apps/api': ^1.2.0
'@tauri-apps/cli': ^1.2.2
'@types/node': ^18.11.18
'@types/ramda': ^0.28.20
'@types/react': ^18.0.15
'@types/react-dom': ^18.0.6
'@vitejs/plugin-react': ^2.0.0
'@types/react': ^18.0.26
'@types/react-dom': ^18.0.10
'@vitejs/plugin-react': ^2.2.0
autoprefixer: ^10.4.13
babel-plugin-macros: ^3.1.0
clsx: ^1.2.1
@ -26,16 +26,16 @@ specifiers:
eslint-plugin-jsx-a11y: ^6.6.1
eslint-plugin-prettier: ^4.2.1
eslint-plugin-simple-import-sort: ^8.0.0
postcss: ^8.4.19
prettier: ^2.7.1
postcss: ^8.4.20
prettier: ^2.8.1
ramda: ^0.28.0
react: ^18.2.0
react-async-hook: ^4.0.0
react-dom: ^18.2.0
tailwindcss: ^3.2.4
twin.macro: ^3.1.0
typescript: ^4.6.4
vite: ^3.0.2
typescript: ^4.9.4
vite: ^3.2.5
dependencies:
'@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4
@ -44,7 +44,7 @@ dependencies:
'@fortawesome/free-regular-svg-icons': 6.2.1
'@fortawesome/free-solid-svg-icons': 6.2.1
'@fortawesome/react-fontawesome': 0.2.0_z27bm67dtmuyyvss23ckjdrcuy
'@mui/material': 5.11.1_lskpmcsdi7ipu6qpuapyu56ihm
'@mui/material': 5.11.2_lskpmcsdi7ipu6qpuapyu56ihm
'@tauri-apps/api': 1.2.0
clsx: 1.2.1
ramda: 0.28.0
@ -53,14 +53,14 @@ dependencies:
react-dom: 18.2.0_react@18.2.0
devDependencies:
'@babel/plugin-transform-react-jsx': 7.19.0
'@babel/plugin-transform-react-jsx': 7.20.7
'@emotion/babel-plugin-jsx-pragmatic': 0.2.0
'@emotion/serialize': 1.1.1
'@tauri-apps/cli': 1.2.2
'@types/node': 18.11.16
'@types/node': 18.11.18
'@types/ramda': 0.28.20
'@types/react': 18.0.26
'@types/react-dom': 18.0.9
'@types/react-dom': 18.0.10
'@vitejs/plugin-react': 2.2.0_vite@3.2.5
autoprefixer: 10.4.13_postcss@8.4.20
babel-plugin-macros: 3.1.0
@ -74,7 +74,7 @@ devDependencies:
tailwindcss: 3.2.4_postcss@8.4.20
twin.macro: 3.1.0_tailwindcss@3.2.4
typescript: 4.9.4
vite: 3.2.5_@types+node@18.11.16
vite: 3.2.5_@types+node@18.11.18
packages:
@ -92,39 +92,39 @@ packages:
dependencies:
'@babel/highlight': 7.18.6
/@babel/compat-data/7.20.5:
resolution: {integrity: sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==}
/@babel/compat-data/7.20.10:
resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/core/7.20.5:
resolution: {integrity: sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==}
/@babel/core/7.20.7:
resolution: {integrity: sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==}
engines: {node: '>=6.9.0'}
dependencies:
'@ampproject/remapping': 2.2.0
'@babel/code-frame': 7.18.6
'@babel/generator': 7.20.5
'@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.5
'@babel/helper-module-transforms': 7.20.2
'@babel/helpers': 7.20.6
'@babel/parser': 7.20.5
'@babel/template': 7.18.10
'@babel/traverse': 7.20.5
'@babel/types': 7.20.5
'@babel/generator': 7.20.7
'@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7
'@babel/helper-module-transforms': 7.20.11
'@babel/helpers': 7.20.7
'@babel/parser': 7.20.7
'@babel/template': 7.20.7
'@babel/traverse': 7.20.10
'@babel/types': 7.20.7
convert-source-map: 1.9.0
debug: 4.3.4
gensync: 1.0.0-beta.2
json5: 2.2.2
json5: 2.2.3
semver: 6.3.0
transitivePeerDependencies:
- supports-color
dev: true
/@babel/generator/7.20.5:
resolution: {integrity: sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==}
/@babel/generator/7.20.7:
resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.20.5
'@babel/types': 7.20.7
'@jridgewell/gen-mapping': 0.3.2
jsesc: 2.5.2
dev: true
@ -133,19 +133,20 @@ packages:
resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.20.5
'@babel/types': 7.20.7
dev: true
/@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.5:
resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==}
/@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.7:
resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0
dependencies:
'@babel/compat-data': 7.20.5
'@babel/core': 7.20.5
'@babel/compat-data': 7.20.10
'@babel/core': 7.20.7
'@babel/helper-validator-option': 7.18.6
browserslist: 4.21.4
lru-cache: 5.1.1
semver: 6.3.0
dev: true
@ -158,25 +159,25 @@ packages:
resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/template': 7.18.10
'@babel/types': 7.20.5
'@babel/template': 7.20.7
'@babel/types': 7.20.7
dev: true
/@babel/helper-hoist-variables/7.18.6:
resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.20.5
'@babel/types': 7.20.7
dev: true
/@babel/helper-module-imports/7.18.6:
resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.20.5
'@babel/types': 7.20.7
/@babel/helper-module-transforms/7.20.2:
resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==}
/@babel/helper-module-transforms/7.20.11:
resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/helper-environment-visitor': 7.18.9
@ -184,9 +185,9 @@ packages:
'@babel/helper-simple-access': 7.20.2
'@babel/helper-split-export-declaration': 7.18.6
'@babel/helper-validator-identifier': 7.19.1
'@babel/template': 7.18.10
'@babel/traverse': 7.20.5
'@babel/types': 7.20.5
'@babel/template': 7.20.7
'@babel/traverse': 7.20.10
'@babel/types': 7.20.7
transitivePeerDependencies:
- supports-color
dev: true
@ -199,14 +200,14 @@ packages:
resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.20.5
'@babel/types': 7.20.7
dev: true
/@babel/helper-split-export-declaration/7.18.6:
resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/types': 7.20.5
'@babel/types': 7.20.7
dev: true
/@babel/helper-string-parser/7.19.4:
@ -222,13 +223,13 @@ packages:
engines: {node: '>=6.9.0'}
dev: true
/@babel/helpers/7.20.6:
resolution: {integrity: sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==}
/@babel/helpers/7.20.7:
resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/template': 7.18.10
'@babel/traverse': 7.20.5
'@babel/types': 7.20.5
'@babel/template': 7.20.7
'@babel/traverse': 7.20.10
'@babel/types': 7.20.7
transitivePeerDependencies:
- supports-color
dev: true
@ -241,12 +242,12 @@ packages:
chalk: 2.4.2
js-tokens: 4.0.0
/@babel/parser/7.20.5:
resolution: {integrity: sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==}
/@babel/parser/7.20.7:
resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==}
engines: {node: '>=6.0.0'}
hasBin: true
dependencies:
'@babel/types': 7.20.5
'@babel/types': 7.20.7
dev: true
/@babel/plugin-syntax-jsx/7.18.6:
@ -257,48 +258,48 @@ packages:
dependencies:
'@babel/helper-plugin-utils': 7.20.2
/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.5:
/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.7:
resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.20.5
'@babel/core': 7.20.7
'@babel/helper-plugin-utils': 7.20.2
dev: true
/@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.5:
/@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.7:
resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.20.5
'@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5
'@babel/core': 7.20.7
'@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.7
dev: true
/@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.5:
/@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.20.7:
resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.20.5
'@babel/core': 7.20.7
'@babel/helper-plugin-utils': 7.20.2
dev: true
/@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.5:
/@babel/plugin-transform-react-jsx-source/7.19.6_@babel+core@7.20.7:
resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.20.5
'@babel/core': 7.20.7
'@babel/helper-plugin-utils': 7.20.2
dev: true
/@babel/plugin-transform-react-jsx/7.19.0:
resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==}
/@babel/plugin-transform-react-jsx/7.20.7:
resolution: {integrity: sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@ -307,66 +308,66 @@ packages:
'@babel/helper-module-imports': 7.18.6
'@babel/helper-plugin-utils': 7.20.2
'@babel/plugin-syntax-jsx': 7.18.6
'@babel/types': 7.20.5
'@babel/types': 7.20.7
dev: true
/@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.20.5:
resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==}
/@babel/plugin-transform-react-jsx/7.20.7_@babel+core@7.20.7:
resolution: {integrity: sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
dependencies:
'@babel/core': 7.20.5
'@babel/core': 7.20.7
'@babel/helper-annotate-as-pure': 7.18.6
'@babel/helper-module-imports': 7.18.6
'@babel/helper-plugin-utils': 7.20.2
'@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.5
'@babel/types': 7.20.5
'@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.7
'@babel/types': 7.20.7
dev: true
/@babel/runtime-corejs3/7.20.6:
resolution: {integrity: sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==}
/@babel/runtime-corejs3/7.20.7:
resolution: {integrity: sha512-jr9lCZ4RbRQmCR28Q8U8Fu49zvFqLxTY9AMOUz+iyMohMoAgpEcVxY+wJNay99oXOpOcCTODkk70NDN2aaJEeg==}
engines: {node: '>=6.9.0'}
dependencies:
core-js-pure: 3.26.1
core-js-pure: 3.27.1
regenerator-runtime: 0.13.11
dev: true
/@babel/runtime/7.20.6:
resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==}
/@babel/runtime/7.20.7:
resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.13.11
/@babel/template/7.18.10:
resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==}
/@babel/template/7.20.7:
resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/code-frame': 7.18.6
'@babel/parser': 7.20.5
'@babel/types': 7.20.5
'@babel/parser': 7.20.7
'@babel/types': 7.20.7
dev: true
/@babel/traverse/7.20.5:
resolution: {integrity: sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==}
/@babel/traverse/7.20.10:
resolution: {integrity: sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/code-frame': 7.18.6
'@babel/generator': 7.20.5
'@babel/generator': 7.20.7
'@babel/helper-environment-visitor': 7.18.9
'@babel/helper-function-name': 7.19.0
'@babel/helper-hoist-variables': 7.18.6
'@babel/helper-split-export-declaration': 7.18.6
'@babel/parser': 7.20.5
'@babel/types': 7.20.5
'@babel/parser': 7.20.7
'@babel/types': 7.20.7
debug: 4.3.4
globals: 11.12.0
transitivePeerDependencies:
- supports-color
dev: true
/@babel/types/7.20.5:
resolution: {integrity: sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==}
/@babel/types/7.20.7:
resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==}
engines: {node: '>=6.9.0'}
dependencies:
'@babel/helper-string-parser': 7.19.4
@ -388,7 +389,7 @@ packages:
dependencies:
'@babel/helper-module-imports': 7.18.6
'@babel/plugin-syntax-jsx': 7.18.6
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@emotion/hash': 0.9.0
'@emotion/memoize': 0.8.0
'@emotion/serialize': 1.1.1
@ -434,7 +435,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@emotion/babel-plugin': 11.10.5
'@emotion/cache': 11.10.5
'@emotion/serialize': 1.1.1
@ -472,7 +473,7 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@emotion/babel-plugin': 11.10.5
'@emotion/is-prop-valid': 1.2.0
'@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4
@ -598,8 +599,8 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.14
dev: true
/@mui/base/5.0.0-alpha.111_ib3m5ricvtkl2cll7qpr2f6lvq:
resolution: {integrity: sha512-2wfIPpl97S4dPzD0QOM3UIzQ/EuXCYQvHmXxTpfKxev/cfkzOe7Ik/McoYUBbtM1bSOqH3W276R/L2LF9cyXqQ==}
/@mui/base/5.0.0-alpha.112_ib3m5ricvtkl2cll7qpr2f6lvq:
resolution: {integrity: sha512-KPwb1iYPXsV/P8uu0SNQrj7v7YU6wdN4Eccc2lZQyRDW+f6PJYjHBuFUTYKc408B98Jvs1XbC/z5MN45a2DWrQ==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0
@ -609,10 +610,10 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@emotion/is-prop-valid': 1.2.0
'@mui/types': 7.2.3_@types+react@18.0.26
'@mui/utils': 5.11.1_react@18.2.0
'@mui/utils': 5.11.2_react@18.2.0
'@popperjs/core': 2.11.6
'@types/react': 18.0.26
clsx: 1.2.1
@ -622,12 +623,12 @@ packages:
react-is: 18.2.0
dev: false
/@mui/core-downloads-tracker/5.11.1:
resolution: {integrity: sha512-QVqVNlZ2K+LqUDE5kFgYd0r4KekR/dv2cNYbAutQWbfOA8VPVUVrDz0ELrEcoe8TjM/CwnsmGvaDh/YSNl/ALA==}
/@mui/core-downloads-tracker/5.11.2:
resolution: {integrity: sha512-ztLQELdSSuJFXezng8g5eCzy8mogtzMM8JcfG3HIGgUJ2RlAiBXI2Qe0adKmrJlF4FMat8vTaTeoiRNBZH4t1Q==}
dev: false
/@mui/material/5.11.1_lskpmcsdi7ipu6qpuapyu56ihm:
resolution: {integrity: sha512-yaZiXvcrl2vgUK+VO24780BWRgwdAMmAyuMVZnRTts1Yu0tWd6PjIYq2ZtaOlpj6/LbaSS+Q2kSfxYnDQ20CEQ==}
/@mui/material/5.11.2_lskpmcsdi7ipu6qpuapyu56ihm:
resolution: {integrity: sha512-PeraRDsghnDLzejorfe9ps1syxlB8UrGs+UKwg9GGlndv5Tghm+9nwuibrP2TCDC14mlryF+u2WlAOYaPPMwGA==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@ -643,14 +644,14 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4
'@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu
'@mui/base': 5.0.0-alpha.111_ib3m5ricvtkl2cll7qpr2f6lvq
'@mui/core-downloads-tracker': 5.11.1
'@mui/system': 5.11.1_ogriz7mfahdh34qnfautfro5yu
'@mui/base': 5.0.0-alpha.112_ib3m5ricvtkl2cll7qpr2f6lvq
'@mui/core-downloads-tracker': 5.11.2
'@mui/system': 5.11.2_ogriz7mfahdh34qnfautfro5yu
'@mui/types': 7.2.3_@types+react@18.0.26
'@mui/utils': 5.11.1_react@18.2.0
'@mui/utils': 5.11.2_react@18.2.0
'@types/react': 18.0.26
'@types/react-transition-group': 4.4.5
clsx: 1.2.1
@ -662,8 +663,8 @@ packages:
react-transition-group: 4.4.5_biqbaboplfbrettd7655fr4n2y
dev: false
/@mui/private-theming/5.11.1_kzbn2opkn2327fwg5yzwzya5o4:
resolution: {integrity: sha512-nnHg7kA5RwFRhy0wiDYe59sLCVGORpPypL1JcEdhv0+N0Zbmc2E/y4z2zqMRZ62MAEscpro7cQbvv244ThA84A==}
/@mui/private-theming/5.11.2_kzbn2opkn2327fwg5yzwzya5o4:
resolution: {integrity: sha512-qZwMaqRFPwlYmqwVKblKBGKtIjJRAj3nsvX93pOmatsXyorW7N/0IPE/swPgz1VwChXhHO75DwBEx8tB+aRMNg==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@types/react': ^17.0.0 || ^18.0.0
@ -672,8 +673,8 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.20.6
'@mui/utils': 5.11.1_react@18.2.0
'@babel/runtime': 7.20.7
'@mui/utils': 5.11.2_react@18.2.0
'@types/react': 18.0.26
prop-types: 15.8.1
react: 18.2.0
@ -692,7 +693,7 @@ packages:
'@emotion/styled':
optional: true
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@emotion/cache': 11.10.5
'@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4
'@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu
@ -701,8 +702,8 @@ packages:
react: 18.2.0
dev: false
/@mui/system/5.11.1_ogriz7mfahdh34qnfautfro5yu:
resolution: {integrity: sha512-BEA2S0hay8n8CcZftkeAVsi0nsb5ZjdnZRCahv5lX7QJYwDjO4ucJ6lnvxHe2v/9Te1LLjTO7ojxu/qM6CE5Cg==}
/@mui/system/5.11.2_ogriz7mfahdh34qnfautfro5yu:
resolution: {integrity: sha512-PPkYhrcP2MkhscX6SauIl0wPgra0w1LGPtll+hIKc2Z2JbGRSrUCFif93kxejB7I1cAoCay9jWW4mnNhsOqF/g==}
engines: {node: '>=12.0.0'}
peerDependencies:
'@emotion/react': ^11.5.0
@ -717,13 +718,13 @@ packages:
'@types/react':
optional: true
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@emotion/react': 11.10.5_kzbn2opkn2327fwg5yzwzya5o4
'@emotion/styled': 11.10.5_qvatmowesywn4ye42qoh247szu
'@mui/private-theming': 5.11.1_kzbn2opkn2327fwg5yzwzya5o4
'@mui/private-theming': 5.11.2_kzbn2opkn2327fwg5yzwzya5o4
'@mui/styled-engine': 5.11.0_dovxhg2tvkkxkdnqyoum6wzcxm
'@mui/types': 7.2.3_@types+react@18.0.26
'@mui/utils': 5.11.1_react@18.2.0
'@mui/utils': 5.11.2_react@18.2.0
'@types/react': 18.0.26
clsx: 1.2.1
csstype: 3.1.1
@ -742,13 +743,13 @@ packages:
'@types/react': 18.0.26
dev: false
/@mui/utils/5.11.1_react@18.2.0:
resolution: {integrity: sha512-lMAPgIJoil8V9ZxsMbEflMsvZmWcHbRVMc4JDY9jPO9V4welpF43h/O267b1RqlcRnC5MEbVQV605GYkTZY29Q==}
/@mui/utils/5.11.2_react@18.2.0:
resolution: {integrity: sha512-AyizuHHlGdAtH5hOOXBW3kriuIwUIKUIgg0P7LzMvzf6jPhoQbENYqY6zJqfoZ7fAWMNNYT8mgN5EftNGzwE2w==}
engines: {node: '>=12.0.0'}
peerDependencies:
react: ^17.0.0 || ^18.0.0
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
'@types/prop-types': 15.7.5
'@types/react-is': 17.0.3
prop-types: 15.8.1
@ -774,7 +775,7 @@ packages:
engines: {node: '>= 8'}
dependencies:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.14.0
fastq: 1.15.0
dev: true
/@popperjs/core/2.11.6:
@ -887,8 +888,8 @@ packages:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
dev: true
/@types/node/18.11.16:
resolution: {integrity: sha512-6T7P5bDkRhqRxrQtwj7vru+bWTpelgtcETAZEUSdq0YISKz8WKdoBukQLYQQ6DFHvU9JRsbFq0JH5C51X2ZdnA==}
/@types/node/18.11.18:
resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==}
dev: true
/@types/parse-json/4.0.0:
@ -903,8 +904,8 @@ packages:
ts-toolbelt: 6.15.5
dev: true
/@types/react-dom/18.0.9:
resolution: {integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==}
/@types/react-dom/18.0.10:
resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==}
dependencies:
'@types/react': 18.0.26
dev: true
@ -937,14 +938,14 @@ packages:
peerDependencies:
vite: ^3.0.0
dependencies:
'@babel/core': 7.20.5
'@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.20.5
'@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.5
'@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.5
'@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.5
'@babel/core': 7.20.7
'@babel/plugin-transform-react-jsx': 7.20.7_@babel+core@7.20.7
'@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.7
'@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.20.7
'@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.7
magic-string: 0.26.7
react-refresh: 0.14.0
vite: 3.2.5_@types+node@18.11.16
vite: 3.2.5_@types+node@18.11.18
transitivePeerDependencies:
- supports-color
dev: true
@ -997,8 +998,8 @@ packages:
resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
engines: {node: '>=6.0'}
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime-corejs3': 7.20.6
'@babel/runtime': 7.20.7
'@babel/runtime-corejs3': 7.20.7
dev: true
/array-includes/3.1.6:
@ -1034,7 +1035,7 @@ packages:
postcss: ^8.1.0
dependencies:
browserslist: 4.21.4
caniuse-lite: 1.0.30001439
caniuse-lite: 1.0.30001441
fraction.js: 4.2.0
normalize-range: 0.1.2
picocolors: 1.0.0
@ -1055,7 +1056,7 @@ packages:
resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
engines: {node: '>=10', npm: '>=6'}
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
cosmiconfig: 7.1.0
resolve: 1.22.1
@ -1087,7 +1088,7 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
dependencies:
caniuse-lite: 1.0.30001439
caniuse-lite: 1.0.30001441
electron-to-chromium: 1.4.284
node-releases: 2.0.8
update-browserslist-db: 1.0.10_browserslist@4.21.4
@ -1109,8 +1110,8 @@ packages:
engines: {node: '>= 6'}
dev: true
/caniuse-lite/1.0.30001439:
resolution: {integrity: sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==}
/caniuse-lite/1.0.30001441:
resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==}
dev: true
/chalk/2.4.2:
@ -1175,8 +1176,8 @@ packages:
/convert-source-map/1.9.0:
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
/core-js-pure/3.26.1:
resolution: {integrity: sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==}
/core-js-pure/3.27.1:
resolution: {integrity: sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw==}
requiresBuild: true
dev: true
@ -1277,7 +1278,7 @@ packages:
/dom-helpers/5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
csstype: 3.1.1
dev: false
@ -1642,7 +1643,7 @@ packages:
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
aria-query: 4.2.2
array-includes: 3.1.6
ast-types-flow: 0.0.7
@ -1699,8 +1700,8 @@ packages:
micromatch: 4.0.5
dev: true
/fastq/1.14.0:
resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==}
/fastq/1.15.0:
resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
dependencies:
reusify: 1.0.4
dev: true
@ -1966,15 +1967,15 @@ packages:
/json-parse-even-better-errors/2.3.1:
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
/json5/1.0.1:
resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
/json5/1.0.2:
resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
hasBin: true
dependencies:
minimist: 1.2.7
dev: true
/json5/2.2.2:
resolution: {integrity: sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==}
/json5/2.2.3:
resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
engines: {node: '>=6'}
hasBin: true
dev: true
@ -2020,6 +2021,12 @@ packages:
js-tokens: 4.0.0
dev: false
/lru-cache/5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
dependencies:
yallist: 3.1.1
dev: true
/magic-string/0.26.7:
resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==}
engines: {node: '>=12'}
@ -2298,7 +2305,7 @@ packages:
react: '>=16.6.0'
react-dom: '>=16.6.0'
dependencies:
'@babel/runtime': 7.20.6
'@babel/runtime': 7.20.7
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
@ -2506,7 +2513,7 @@ packages:
resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==}
dependencies:
'@types/json5': 0.0.29
json5: 1.0.1
json5: 1.0.2
minimist: 1.2.7
strip-bom: 3.0.0
dev: true
@ -2517,7 +2524,7 @@ packages:
peerDependencies:
tailwindcss: ^3.2.4
dependencies:
'@babel/template': 7.18.10
'@babel/template': 7.20.7
babel-plugin-macros: 3.1.0
chalk: 4.1.2
lodash.get: 4.4.2
@ -2556,7 +2563,7 @@ packages:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
dev: true
/vite/3.2.5_@types+node@18.11.16:
/vite/3.2.5_@types+node@18.11.18:
resolution: {integrity: sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==}
engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true
@ -2581,7 +2588,7 @@ packages:
terser:
optional: true
dependencies:
'@types/node': 18.11.16
'@types/node': 18.11.18
esbuild: 0.15.18
postcss: 8.4.20
resolve: 1.22.1
@ -2605,6 +2612,10 @@ packages:
engines: {node: '>=0.4'}
dev: true
/yallist/3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
dev: true
/yaml/1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}

521
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -33,6 +33,7 @@ time = { version = "0.3.17", features = ["formatting"] }
color_space = "0.5.3"
futures = "0.3.25"
either = "1.8.0"
image = "0.24.5"
[features]
# by default Tauri runs in production mode

View File

@ -46,7 +46,6 @@ async fn get_screenshot_by_config(config: DisplayConfig) -> Result<ScreenshotDto
info!("截图耗时 {} s", start.elapsed().as_seconds_f32());
match screenshot_dto {
Ok(screenshot_dto) => {
info!("截图耗时 {} s", start.elapsed().as_seconds_f32());
Ok(screenshot_dto)
}
Err(error) => {

View File

@ -1,13 +1,10 @@
use image::ImageBuffer;
use image::{ImageOutputFormat, Rgb};
use paris::error;
use serde::{Deserialize, Serialize};
use std::iter;
use color_space::{Hsv, Rgb};
use either::Either;
use serde::{Deserialize, Serialize};
use super::{
config::{DisplayConfig, LedStripConfig},
led_color::LedColor,
};
use super::{config::DisplayConfig, led_color::LedColor};
type Point = (usize, usize);
type LedSamplePoints = Vec<Point>;
@ -233,24 +230,38 @@ impl Screenshot {
pub async fn to_webp_base64(&self) -> String {
let bitmap = &self.bitmap;
let mut bitflipped =
Vec::with_capacity(self.config.display_width * self.config.display_height * 3);
let stride = bitmap.len() / self.config.display_height;
for y in 0..self.config.display_height {
for x in 0..self.config.display_width {
let i = stride * y + 4 * x;
bitflipped.extend_from_slice(&[bitmap[i + 2], bitmap[i + 1], bitmap[i]]);
let mut image_buffer = ImageBuffer::new(
self.config.display_width as u32 / 3,
self.config.display_height as u32 / 3,
);
for y in 0..self.config.display_height / 3 {
for x in 0..self.config.display_width / 3 {
let i = stride * y * 3 + 4 * x * 3;
image_buffer.put_pixel(
x as u32,
y as u32,
Rgb::<u8>([bitmap[i + 2], bitmap[i + 1], bitmap[i]]),
);
}
}
let webp_memory = webp::Encoder::from_rgb(
bitflipped.as_slice(),
self.config.display_width as u32,
self.config.display_height as u32,
)
.encode(100.0);
return base64::encode(&*webp_memory);
// let webp_memory =
// webp::Encoder::from_rgb(bitflipped.as_slice(), size_x, size_y).encode(50.0);
// return base64::encode(&*webp_memory);
let mut cursor = std::io::Cursor::new(vec![]);
match image_buffer.write_to(&mut cursor, ImageOutputFormat::Tiff) {
Ok(_) => {
return base64::encode(cursor.into_inner());
}
Err(err) => {
error!("can not encode image. {:?}", err);
return String::from("");
}
}
}
pub async fn to_dto(&self) -> ScreenshotDto {

View File

@ -31,7 +31,7 @@ export const DisplayWithLedStrips: FC<DisplayWithLedStripsProps> = ({
...htmlAttrs
}) => {
const screenshotUrl = useMemo(
() => `data:image/png;base64,${screenshot.encode_image}`,
() => `data:image/ico;base64,${screenshot.encode_image}`,
[screenshot.encode_image],
);

View File

@ -1,7 +1,7 @@
import { HTMLAttributes, useMemo } from 'react';
import { FC } from 'react';
import { LedStripConfig } from '../models/led-strip-config';
import tw, { css, styled, theme } from 'twin.macro';
import tw, { css, styled } from 'twin.macro';
import { splitEvery } from 'ramda';
export interface LedStripProps extends HTMLAttributes<HTMLElement> {