(blaster: &BlasterXG6, ui: &mut egui::Ui)
| 271 | } |
| 272 | |
| 273 | fn sbx_features(blaster: &BlasterXG6, ui: &mut egui::Ui) { |
| 274 | let eq_enabled = blaster.feature(FeatureId::EqToggle).as_bool(); |
| 275 | |
| 276 | ui.vertical_centered_justified(|ui| { |
| 277 | ui.horizontal(|ui| { |
| 278 | ui.label(RichText::new("SBX Features").color(Color32::GRAY)); |
| 279 | }); |
| 280 | ui.separator(); |
| 281 | |
| 282 | Grid::new("sbx_grid").show(ui, |ui| { |
| 283 | for &toggle_id in FeatureId::SBX_TOGGLES { |
| 284 | let toggle_feature = blaster.feature(toggle_id); |
| 285 | let slider_id = toggle_id |
| 286 | .paired_slider() |
| 287 | .expect("SBX toggle must have a paired slider"); |
| 288 | let slider_feature = blaster.feature(slider_id); |
| 289 | let is_percentage = matches!(slider_id.value_kind(), ValueKind::Percentage); |
| 290 | let mut slider_value = if is_percentage { |
| 291 | slider_feature.value() * 100.0 |
| 292 | } else { |
| 293 | slider_feature.value() |
| 294 | }; |
| 295 | |
| 296 | let toggle = toggle_button!( |
| 297 | ui, |
| 298 | toggle_feature.as_bool(), |
| 299 | toggle_feature.id.display_name(), |
| 300 | width = full |
| 301 | ); |
| 302 | |
| 303 | let drag_value = ui.add(drag_value!( |
| 304 | &mut slider_value |
| 305 | )); |
| 306 | let slider = ui.add(slider!( |
| 307 | &mut slider_value, |
| 308 | vertical = false, |
| 309 | )); |
| 310 | if toggle.clicked() { |
| 311 | let _ = blaster.set_feature(toggle_id, None); |
| 312 | } |
| 313 | // do not simplify this. |
| 314 | // only `.changed()` will trigger even when the slider modifies itself |
| 315 | // for example when it rounds the number (which is necessary for the GUI) |
| 316 | if (drag_value.changed() || slider.changed()) |
| 317 | // to get the behavior I want, this is sadly necessary |
| 318 | && (drag_value.dragged() |
| 319 | || drag_value.drag_stopped() |
| 320 | || drag_value.lost_focus() |
| 321 | || slider.dragged() |
| 322 | || slider.drag_stopped()) |
| 323 | { |
| 324 | let write_value = if is_percentage { |
| 325 | slider_value / 100.0 |
| 326 | } else { |
| 327 | slider_value |
| 328 | }; |
| 329 | let _ = blaster.set_feature(slider_id, Some(write_value)); |
| 330 | } |
no test coverage detected