cloud_terrastodon_ui_egui 0.35.1

User interface for the Cloud Terrastodon project leveraging egui
use super::resource_group_checkbox::draw_resource_group_checkbox;
use crate::app::MyApp;
use crate::icons::SUBSCRIPTION_ICON;
use crate::loadable::Loadable;
use crate::workers::load_resource_groups::load_resource_groups;
use cloud_terrastodon_azure::Subscription;
use eframe::egui::Id;
use eframe::egui::Ui;
use eframe::egui::collapsing_header::CollapsingState;
use tracing::debug;

pub fn draw_subscription_checkbox(app: &mut MyApp, ui: &mut Ui, subscription: &Subscription) {
    let mut expando =
        CollapsingState::load_with_default_open(ui.ctx(), Id::new(subscription.id), false);
    let toggle_key = expando.id();
    if app.toggle_intents.remove(&toggle_key) {
        expando.toggle(ui);
    }
    let is_open = expando.is_open();
    if is_open && matches!(app.resource_groups, Loadable::NotLoaded) {
        load_resource_groups(app);
    }
    expando
        .clone()
        .show_header(ui, |ui| {
            draw_header(app, subscription, ui);
        })
        .body(|ui| draw_body(app, subscription, ui));
}

fn draw_header(app: &mut MyApp, subscription: &Subscription, ui: &mut Ui) {
    ui.horizontal(|ui| {
        let resource_group_count = app
            .resource_groups
            .as_loaded()
            .map(|resource_groups| resource_groups.get_for_subscription(&subscription.id))
            .map(|list| list.len());
        let label = match resource_group_count {
            Some(resource_group_count) => {
                format!("{subscription} ({resource_group_count})")
            }
            None => format!("{subscription}"),
        };

        let checked = app.checkbox_for(subscription.id);
        if ui.image(SUBSCRIPTION_ICON).clicked() {
            debug!("Clicked on subscription icon");
            *checked ^= true;
        }

        ui.checkbox(checked, label);
    });
}

fn draw_body(app: &mut MyApp, subscription: &Subscription, ui: &mut Ui) {
    match &app.resource_groups {
        Loadable::NotLoaded => {
            ui.label("Not loaded");
        }
        Loadable::Loading => {
            ui.label("Loading...");
        }
        Loadable::Loaded(resource_groups) => {
            let resource_groups = resource_groups.clone();
            let resource_groups = resource_groups.get_for_subscription(&subscription.id);
            ui.vertical(|ui| {
                if resource_groups.is_empty() {
                    ui.label("This subscription has no resource groups");
                } else {
                    for resource_group in resource_groups {
                        draw_resource_group_checkbox(app, ui, resource_group);
                    }
                }
            });
        }
        Loadable::Failed(err) => {
            ui.label(format!("Error: {err}"));
        }
    }
}