gled-ui 2.31.0

gled's egui interface, shared by the desktop app and the browser
Documentation
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 {
            // added where it is asked for, without a form
            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();
            }
        }
    });
}