gled-ui 2.34.0

gled's egui interface, shared by the desktop app and the browser
Documentation
//! The definition's modes: which pixels share a colour. "individual", the
//! first, gives every pixel its own; the others are made by grouping the
//! selection.

use crate::fixture_definition_editor::edit::{DefinitionEdit, Edit, EditorAction};
use crate::fixture_definition_editor::state::EditorState;
use egui::{Button, Ui};

pub(crate) fn show(ui: &mut Ui, edit: &mut Edit<'_>, state: &mut EditorState) {
    for (index, mode) in edit.value.modes.iter().enumerate() {
        let label = format!("{}  ยท  {} groups", mode.name, mode.group_count());
        if ui.selectable_label(state.mode == index, label).clicked() {
            state.mode = index;
        }
    }

    ui.horizontal(|ui| {
        if ui.button("Add mode").clicked() {
            let name = format!("Mode {}", edit.value.modes.len());
            state.mode = edit.change(state, |definition| definition.add_mode(name));
        }
        let editable = state.mode > 0;
        if ui.add_enabled(editable, Button::new("Remove")).clicked() {
            let mode = state.mode;
            // a mode the definition refused to remove stays selected
            if edit.try_change(state, |definition| definition.remove_mode(mode)) {
                state.mode = mode.saturating_sub(1);
            }
        }
    });

    if state.mode == 0 {
        ui.weak("\"individual\" gives every pixel its own group. Add a mode to group pixels.");
        return;
    }

    ui.horizontal(|ui| {
        ui.label("Name");
        let mode = state.mode;
        let mut name = edit
            .value
            .modes
            .get(mode)
            .map(|mode| mode.name.clone())
            .unwrap_or_default();
        let response = ui.text_edit_singleline(&mut name);
        edit.tracked(&response, |definition| {
            if let Some(mode) = definition.modes.get_mut(mode) {
                mode.name = name;
            }
        });
    });

    let selected = !state.selection.is_empty();
    ui.horizontal_wrapped(|ui| {
        let shortcut = ui.ctx().format_shortcut(&egui::KeyboardShortcut::new(
            egui::Modifiers::COMMAND,
            egui::Key::G,
        ));
        let group = Button::new("Group selection").shortcut_text(shortcut);
        if ui.add_enabled(selected, group).clicked() {
            EditorAction::Group.apply(edit, state);
        }
        if ui
            .add_enabled(selected, Button::new("Ungroup selection"))
            .clicked()
        {
            EditorAction::Ungroup.apply(edit, state);
        }
        if ui.button("Each its own group").clicked() {
            EditorAction::EachOwnGroup.apply(edit, state);
        }
    });
}