gled 2.1.0

gled is an application for creating animations and effects on artnet or wled light installations
use super::App;
use crate::{
    storage::{
        action::StorageAction, asset::curve::polynomial::polynomials_fitting, staged_files, working,
    },
    ui::temperature::temperature,
};
use egui::{Button, Context, Label, Layout, Margin, Rangef, Spinner, TextEdit, Ui, ViewportId};
use egui_extras::StripBuilder;

impl App {
    pub fn status_bar(&mut self, ctx: &Context, viewport_id: Option<ViewportId>) {
        egui::TopBottomPanel::bottom(format!("{viewport_id:?} status bar")).show(ctx, |ui| {
            egui::Frame::none()
                .inner_margin(Margin::from(1.0))
                .show(ui, |ui| {
                    ui.horizontal(|ui| {
                        if let Some(framerate) = self.timing.framerate() {
                            ui.add(Label::new(format!("{framerate:.0} fps")));
                        }

                        #[cfg(not(debug_assertions))]
                        if let Some(version) = crate::ui::update_check::Update::update_available() {
                            if ui.button(format!("Update available: {version}")).clicked() {
                                if let Some(url) = crate::ui::update_check::Update::download_url() {
                                    ui.ctx().open_url(egui::OpenUrl::new_tab(url));
                                }
                            }
                        }

                        ui.with_layout(Layout::right_to_left(egui::Align::Center), |ui| {
                            ui.add(Label::new(temperature()));
                            ui.add_space(4.0);
                            self.git_button(ui);
                            ui.add_space(4.0);
                            match polynomials_fitting() {
                                0 => (),
                                n => {
                                    ui.label(if n == 1 {
                                        "Fitting one polynomial".to_owned()
                                    } else {
                                        format!("Fitting {n} polynomials")
                                    });
                                    ui.add(Spinner::new());
                                    ui.add_space(4.0);
                                }
                            }
                        });
                    });
                });
        });
    }

    fn git_button(&mut self, ui: &mut Ui) {
        ui.menu_button(
            format!("{}", if staged_files() > 0 { "*" } else { "" }),
            |ui| {
                self.git_menu(ui);
            },
        );
    }

    fn git_menu(&mut self, ui: &mut Ui) {
        ui.set_max_width(300.0);
        ui.horizontal(|ui| {
            ui.heading("Assets ");
            if working() {
                ui.add(Spinner::new());
            }
        });

        let staged_files = staged_files();
        egui::Frame::none()
            .inner_margin(Margin::from(6.0))
            .show(ui, |ui| {
                let mut commit = false;
                ui.add_enabled_ui(staged_files > 0 && !working(), |ui| {
                    ui.label(if staged_files == 1 {
                        "Commit message for 1 change:".to_owned()
                    } else {
                        format!("Commit message for {staged_files} files:")
                    });
                    commit = ui
                        .add(
                            TextEdit::singleline(&mut self.git_commit_message)
                                .hint_text("Please enter a commit message"),
                        )
                        .lost_focus()
                        && ui.ctx().input(|input| input.key_pressed(egui::Key::Enter));
                });

                StripBuilder::new(ui)
                    .sizes(
                        egui_extras::Size::Remainder {
                            range: Rangef::new(0.0, f32::INFINITY),
                        },
                        3,
                    )
                    .horizontal(|mut strip| {
                        strip.cell(|ui| {
                            ui.with_layout(Layout::top_down_justified(egui::Align::Center), |ui| {
                                if ui.add(Button::new("Commit")).clicked() {
                                    commit = true;
                                }
                            });
                        });
                        strip.cell(|ui| {
                            ui.with_layout(Layout::top_down_justified(egui::Align::Center), |ui| {
                                if ui.add(Button::new("⬆Push")).clicked() {
                                    StorageAction::Push.enqueue();
                                }
                            });
                        });
                        strip.cell(|ui| {
                            ui.with_layout(Layout::top_down_justified(egui::Align::Center), |ui| {
                                if ui.add(Button::new("⬇Pull")).clicked() {
                                    StorageAction::Pull.enqueue();
                                }
                            });
                        });
                    });

                if commit {
                    StorageAction::Commit {
                        message: self.git_commit_message.clone(),
                    }
                    .enqueue();
                    self.git_commit_message.clear();
                }
            });
    }
}