Files
QIDIStudio/resources/web/flush/NozzleListTable.html
2025-12-20 17:45:44 +08:00

275 lines
7.6 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>喷嘴选择表格</title>
<style>
html, body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
background-color: #ffffff;
transition: background-color 0.3s ease;
}
table {
border-collapse: collapse;
width: 100%;
max-width: 100%;
font-size: 14px;
table-layout: fixed;
margin: 0 auto;
color: #333333;
transition: color 0.3s ease;
border: 1px solid #ddd; /* 表格外边框 */
}
th, td {
padding: 10px;
vertical-align: middle;
transition: border-color 0.3s ease, background-color 0.3s ease;
border: 1px solid #ddd; /* 所有单元格边框 */
}
th {
text-align: center; /* 表头居中 */
}
td {
text-align: center; /* 数据单元格居中对齐 */
word-wrap: break-word;
}
thead th {
background-color: #f2f2f2;
}
input[type="radio"] {
position: relative;
width: 16px;
height: 16px;
margin-right: 8px;
appearance: none;
border: 1px solid #ccc;
border-radius: 50%;
cursor: pointer;
transition: border-color 0.3s ease;
}
input[type="radio"]:checked {
background-color: #4479fb;
border-color: #4479fb;
}
input[type="radio"]:checked::after {
content: '';
position: absolute;
width: 8px;
height: 8px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
background-color: white;
}
label {
cursor: pointer;
transition: color 0.3s ease;
}
.recommended {
color: #28a745;
font-weight: bold;
}
/* 暗黑模式样式 */
html.darkmode {
background-color: #1a1a1a;
}
html.darkmode table {
color: #e0e0e0;
border-color: #555555; /* 表格外边框 */
}
html.darkmode th,
html.darkmode td {
border-color: #555555; /* 所有单元格边框 */
}
html.darkmode thead th {
background-color: #2d2d2d;
}
html.darkmode tbody tr {
background-color: #222222;
}
html.darkmode tbody tr:nth-child(even) {
background-color: #282828;
}
html.darkmode input[type="radio"] {
border-color: #777777;
}
html.darkmode label {
color: #e0e0e0;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th id="nozzle-selection" rowspan="2">选用的喷嘴直径</th>
<th id="available-nozzles"colspan="2">可用喷嘴</th>
</tr>
<tr>
<th id="left-extruder">左边</th>
<th id="right-extruder">右边</th>
</tr>
</thead>
<tbody id="tableBody">
<tr>
<td>
<input type="radio" name="nozzle" id="nozzle02" />
<label for="nozzle02">0.2 mm</label>
</td>
<td>不可用</td>
<td>2个</td>
</tr>
<tr>
<td>
<input type="radio" name="nozzle" id="nozzle04" checked />
<label for="nozzle04">0.4 mm推荐</label>
</td>
<td>✔️</td>
<td>3个</td>
</tr>
<tr>
<td>
<input type="radio" name="nozzle" id="nozzle06" />
<label for="nozzle06">0.6 mm</label>
</td>
<td>不可用</td>
<td>1个</td>
</tr>
</tbody>
</table>
<script>
let highflow_label = 'high flow'
let standard_label = 'standard'
let language = 'en'
window.addEventListener("DOMContentLoaded",function(){
var data = JSON.stringify({
msg: 'init',
})
window.nozzleListTable.postMessage(data);
});
function sendLayoutMessage() {
const table = document.querySelector('table');
const tableWidth = table.offsetWidth; // 表格可见宽度
const tableHeight = table.offsetHeight; // 表格可见高度
const layoutMsg = JSON.stringify({
msg: 'layout',
height:tableHeight,
width: tableWidth
});
console.log('发送layout消息:', layoutMsg);
window.nozzleListTable.postMessage(layoutMsg);
}
function initText(data){
document.getElementById("nozzle-selection").innerText = data.nozzle_selection_label
document.getElementById("available-nozzles").innerText = data.nozzle_list_label
document.getElementById("left-extruder").innerText = data.left_label
document.getElementById("right-extruder").innerText = data.right_label
highflow_label = data.highflow_label
standard_label = data.standard_label
language =data.language
}
// 初始化表格
function initTable(data) {
if(data.darkmode == true)
document.documentElement.classList.add('darkmode');
else
document.documentElement.classList.remove('darkmode');
updateTable(data);
// 监听单选按钮变化通知C++
document.getElementById('tableBody').addEventListener('change', function(e) {
if (e.target.type === 'radio' && e.target.name === 'nozzle') {
const selectedIdx = e.target.getAttribute('data-index');
// 通过wxWebView的消息机制发送给C++
window.nozzleListTable.postMessage({
msg: 'onSelect',
index: parseInt(selectedIdx)
});
}
});
}
// 更新表格内容的方法
function updateTable(nozzleOptions) {
console.log('更新表格数据:', nozzleOptions);
const tableBody = document.getElementById('tableBody');
// 清空现有内容
tableBody.innerHTML = '';
tabledata = nozzleOptions.data
// 遍历所有喷嘴选项,生成表格行
tabledata.forEach((option, index) => {
const row = document.createElement('tr');
// 喷嘴直径单元格(带单选按钮)
const diameterCell = document.createElement('td');
const radioId = `nozzle${index}`;
// 构建单选按钮和标签
let labelText = option.diameter +' mm';
// 如果是推荐项,添加标识
const isRecommended = false
if (isRecommended) {
labelText += '(推荐)';
}
diameterCell.innerHTML = `
<input type="radio" name="nozzle" id="${radioId}" data-index="${index}" ${option.is_selected ? 'checked' : ''}>
<label for="${radioId}" class="${isRecommended ? 'recommended' : ''}">${labelText}</label>
`;
const leftCell = document.createElement('td');
const leftExtruder = option.extruders['0'] || { type: 'standard', count: 0 };
leftCell.textContent = `${leftExtruder.count}${language === "zh-cn" ? "个" : ""}`;
const rightCell = document.createElement('td');
const rightExtruder = option.extruders['1'] || { type: 'standard', count: 0 };
rightCell.textContent = `${rightExtruder.count}${language === "zh-cn" ? "个" : ""}`;
// 添加单元格到行
row.appendChild(diameterCell);
row.appendChild(leftCell);
row.appendChild(rightCell);
// 添加行到表格
tableBody.appendChild(row);
});
sendLayoutMessage()
}
</script>
</body>
</html>