use super::{GeneratorKind, GeneratorParams, MAX_LEDS, max_rows};
use crate::fixture_definition_editor::units::millimetres;
use egui::{ComboBox, DragValue, Grid, Ui};
use gled_model::patching::definition::ColorOrder;
use gled_model::patching::definition::generators::{Corner, GridOrder};
use strum::IntoEnumIterator;
fn length(ui: &mut Ui, label: &str, metres: &mut f32) {
ui.label(label);
ui.add(millimetres(metres));
ui.end_row();
}
fn point(ui: &mut Ui, label: &str, metres: &mut [f32; 2]) {
ui.label(label);
ui.horizontal(|ui| {
for axis in metres.iter_mut() {
ui.add(millimetres(axis));
}
});
ui.end_row();
}
fn count(ui: &mut Ui, label: &str, value: &mut usize, max: usize) {
ui.label(label);
ui.add(DragValue::new(value).range(1..=max));
ui.end_row();
}
pub(super) fn form(ui: &mut Ui, kind: GeneratorKind, params: &mut GeneratorParams) {
Grid::new("generator form").num_columns(2).show(ui, |ui| {
ui.label("Names");
ui.text_edit_singleline(&mut params.prefix);
ui.end_row();
ui.label("Channel order");
ComboBox::from_id_salt("generator order")
.selected_text(params.order.to_string())
.show_ui(ui, |ui| {
for order in ColorOrder::iter() {
ui.selectable_value(&mut params.order, order, order.to_string());
}
});
ui.end_row();
match kind {
GeneratorKind::Pixel => {}
GeneratorKind::Line => {
count(ui, "Pixels", &mut params.line_count, MAX_LEDS);
ui.label("Laid out by");
ui.horizontal(|ui| {
ui.radio_value(&mut params.line_by_pitch, false, "end points");
ui.radio_value(&mut params.line_by_pitch, true, "pitch");
});
ui.end_row();
point(ui, "From", &mut params.line_from_m);
if params.line_by_pitch {
ui.label("Direction");
ui.add(DragValue::new(&mut params.line_angle_deg).suffix("°"));
ui.end_row();
length(ui, "Pitch", &mut params.line_pitch_m);
} else {
point(ui, "To", &mut params.line_to_m);
ui.label("");
ui.checkbox(&mut params.line_inset, "half a pitch free at the ends");
ui.end_row();
}
}
GeneratorKind::Grid => {
count(ui, "Columns", &mut params.grid.columns, MAX_LEDS);
let rows = max_rows(params.grid.columns);
count(ui, "Rows", &mut params.grid.rows, rows);
length(ui, "Pitch across", &mut params.grid.pitch_m[0]);
length(ui, "Pitch down", &mut params.grid.pitch_m[1]);
point(ui, "Centre", &mut params.grid.centre_m);
ui.label("DMX order");
ComboBox::from_id_salt("grid order")
.selected_text(params.grid.order.to_string())
.show_ui(ui, |ui| {
for order in GridOrder::iter() {
ui.selectable_value(&mut params.grid.order, order, order.to_string());
}
});
ui.end_row();
ui.label("First pixel");
ComboBox::from_id_salt("grid start")
.selected_text(params.grid.start.to_string())
.show_ui(ui, |ui| {
for corner in Corner::iter() {
ui.selectable_value(&mut params.grid.start, corner, corner.to_string());
}
});
ui.end_row();
}
GeneratorKind::Ring => {
count(ui, "Pixels", &mut params.ring.count, MAX_LEDS);
length(ui, "Radius", &mut params.ring.radius_m);
point(ui, "Centre", &mut params.ring.centre_m);
ui.label("First pixel at");
ui.add(DragValue::new(&mut params.ring.start_deg).suffix("° from 12 o'clock"));
ui.end_row();
ui.label("");
ui.checkbox(&mut params.ring.clockwise, "clockwise");
ui.end_row();
ui.label("");
ui.checkbox(&mut params.ring.along_ring, "turned along the ring");
ui.end_row();
}
}
});
}