egui_tracing 0.3.0

Integrates tracing and logging with egui for event collection/visualization
Documentation
use egui::{PopupCloseBehavior, Ui};
use globset::Glob;

use super::target_menu_item::TargetMenuItem;
use crate::ui::labels::Labels;
use crate::ui::state::TargetFilter;

pub struct TargetMenuButton<'a> {
    state: Option<&'a mut TargetFilter>,
    labels: &'a Labels,
}

impl<'a> TargetMenuButton<'a> {
    pub fn new(labels: &'a Labels) -> Self {
        Self {
            state: None,
            labels,
        }
    }

    pub fn state(mut self, v: &'a mut TargetFilter) -> Self {
        self.state = Some(v);
        self
    }

    pub fn show(self, ui: &mut Ui) {
        let state = self.state.unwrap();
        let button = ui.button(self.labels.target.as_ref());

        egui::Popup::menu(&button)
            .close_behavior(PopupCloseBehavior::CloseOnClickOutside)
            .show(|ui| {
                ui.label(self.labels.target_filter.as_ref());

                let (input, add_button) = ui
                    .horizontal(|ui| {
                        let input = ui.add(
                            egui::TextEdit::singleline(&mut state.input)
                                .hint_text(self.labels.target_placeholder.as_ref()),
                        );
                        let add = ui.button(self.labels.add.as_ref());
                        (input, add)
                    })
                    .inner;

                if add_button.clicked()
                    || (input.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter)))
                {
                    state.targets.push(Glob::new(&state.input).unwrap());
                    state.input = "".to_owned();
                }

                let delete_label = self.labels.delete.as_ref();
                for (i, target) in state.targets.clone().iter().enumerate() {
                    TargetMenuItem::new(target, delete_label)
                        .on_clicked(|| {
                            state.targets.remove(i);
                        })
                        .show(ui);
                }
            });
    }
}