()
| 149 | } |
| 150 | |
| 151 | function syncLabelScaleControls() { |
| 152 | let min = Number(state.mapping.labelScaleMin); |
| 153 | let max = Number(state.mapping.labelScaleMax); |
| 154 | if (!Number.isFinite(min)) min = 0; |
| 155 | if (!Number.isFinite(max)) max = min + 1; |
| 156 | if (min < 0) min = 0; |
| 157 | if (max < min) { |
| 158 | max = min; |
| 159 | } |
| 160 | state.mapping.labelScaleMin = min; |
| 161 | state.mapping.labelScaleMax = max; |
| 162 | if (dom.labelScaleMin) dom.labelScaleMin.value = String(min); |
| 163 | if (dom.labelScaleMax) dom.labelScaleMax.value = String(max); |
| 164 | if (dom.labelScale) { |
| 165 | dom.labelScale.min = String(min); |
| 166 | dom.labelScale.max = String(Math.max(max, min)); |
| 167 | const span = Math.max(Math.abs(max - min), 0); |
| 168 | const step = span > 0 ? span / 100 : 0.01; |
| 169 | dom.labelScale.step = step.toFixed(6); |
| 170 | state.mapping.labelScale = clamp( |
| 171 | Number(state.mapping.labelScale), |
| 172 | min, |
| 173 | Math.max(max, min) |
| 174 | ); |
| 175 | dom.labelScale.value = String(state.mapping.labelScale); |
| 176 | scene.setLabelScaleFactor(state.mapping.labelScale); |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | const state = { |
| 181 | dataset: null, |
no test coverage detected