generated from luke-else/egui-template
	Fixed build error. Generic TabStates are now functional
This commit is contained in:
		@@ -1,5 +1,3 @@
 | 
			
		||||
use tabs::Tab;
 | 
			
		||||
 | 
			
		||||
use crate::app::App;
 | 
			
		||||
use crate::theme::onedark::ONE_DARK;
 | 
			
		||||
 | 
			
		||||
@@ -7,12 +5,16 @@ pub mod tabs;
 | 
			
		||||
 | 
			
		||||
impl<'a> eframe::App for App<'a> {
 | 
			
		||||
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
 | 
			
		||||
        let _background_frame = egui::Frame::default().fill(ONE_DARK.bg);
 | 
			
		||||
        let frame = egui::Frame::default().fill(ONE_DARK.bg);
 | 
			
		||||
 | 
			
		||||
        tabs::display_tabs(self, ctx);
 | 
			
		||||
        // Display the top bar of tabs
 | 
			
		||||
        tabs::display_tabs(&mut self.tab_state, ctx, &frame);
 | 
			
		||||
 | 
			
		||||
        match &mut self.tab_state.current_tab {
 | 
			
		||||
            tabs::TabTypes::METAR(tab) => tab.display_tab(ctx),
 | 
			
		||||
        // Display tabs for main UI
 | 
			
		||||
        match self.tab_state.get_current_tab() {
 | 
			
		||||
            Some(tab) => tab.display_tab(ctx, &frame),
 | 
			
		||||
 | 
			
		||||
            // What to do if the tab is not available
 | 
			
		||||
            _ => (),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,8 @@ pub struct MetarTab {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Tab for MetarTab {
 | 
			
		||||
    fn display_tab(&mut self, ctx: &egui::Context) {
 | 
			
		||||
        egui::CentralPanel::default().show(ctx, |ui| {
 | 
			
		||||
    fn display_tab(&mut self, ctx: &egui::Context, frame: &egui::Frame) {
 | 
			
		||||
        egui::CentralPanel::default().frame(*frame).show(ctx, |ui| {
 | 
			
		||||
            for icao in self.icaos.iter_mut() {
 | 
			
		||||
                ui.text_edit_singleline(icao);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,9 +6,9 @@ use std::collections::HashMap;
 | 
			
		||||
use strum::EnumIter;
 | 
			
		||||
use strum::IntoEnumIterator;
 | 
			
		||||
 | 
			
		||||
use crate::App;
 | 
			
		||||
use self::metar_tab::MetarTab;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Default, EnumIter, PartialEq, Eq, Hash)]
 | 
			
		||||
#[derive(Clone, Copy, Debug, Default, EnumIter, Eq, Hash, PartialEq)]
 | 
			
		||||
pub enum TabTypes {
 | 
			
		||||
    #[default]
 | 
			
		||||
    Home,
 | 
			
		||||
@@ -18,32 +18,43 @@ pub enum TabTypes {
 | 
			
		||||
    Routing,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Default)]
 | 
			
		||||
pub struct TabState {
 | 
			
		||||
    current_tab: TabTypes,
 | 
			
		||||
    tabs: HashMap<TabTypes, Box<dyn Tab>>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for TabState {
 | 
			
		||||
    fn default() -> Self {
 | 
			
		||||
        let mut ts = Self {
 | 
			
		||||
            current_tab: TabTypes::default(),
 | 
			
		||||
            tabs: HashMap::new(),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        // Add each tab to the map
 | 
			
		||||
        ts.tabs
 | 
			
		||||
            .insert(TabTypes::METAR, Box::new(MetarTab::default()));
 | 
			
		||||
 | 
			
		||||
        ts
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl TabState {
 | 
			
		||||
    /// Get the Tab based on a given Tab Type
 | 
			
		||||
    pub fn get_tab_state(&self, tab_type: &TabTypes) -> Option<&Box<dyn Tab>> {
 | 
			
		||||
        match self.tabs.get(tab_type) {
 | 
			
		||||
    pub fn get_tab_state(&mut self, tab_type: TabTypes) -> Option<&mut Box<dyn Tab>> {
 | 
			
		||||
        match self.tabs.get_mut(&tab_type) {
 | 
			
		||||
            Some(tab) => Some(tab),
 | 
			
		||||
            None => None,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Set the state of a given tab
 | 
			
		||||
    pub fn set_tab_state(&mut self, tab_type: &TabTypes) {}
 | 
			
		||||
 | 
			
		||||
    /// Get the currently selected Tab
 | 
			
		||||
    pub fn get_current_tab(&self) -> Option<&Box<dyn Tab>> {
 | 
			
		||||
        self.get_tab_state(&self.current_tab)
 | 
			
		||||
    pub fn get_current_tab(&mut self) -> Option<&mut Box<dyn Tab>> {
 | 
			
		||||
        self.get_tab_state(self.current_tab)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Get the type of the current Tab
 | 
			
		||||
    pub fn get_current_tab_type(&self) -> &TabTypes {
 | 
			
		||||
        return &self.current_tab;
 | 
			
		||||
    pub fn get_current_tab_type(&self) -> TabTypes {
 | 
			
		||||
        return self.current_tab;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Change the current tab to a different tab type, saving the state of the current tab
 | 
			
		||||
@@ -54,24 +65,28 @@ impl TabState {
 | 
			
		||||
 | 
			
		||||
/// Tab traits that allow tab display on the main application window
 | 
			
		||||
pub trait Tab {
 | 
			
		||||
    fn display_tab(&mut self, ctx: &egui::Context);
 | 
			
		||||
    fn display_tab(&mut self, ctx: &egui::Context, frame: &egui::Frame);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Function to draw main set of tabs on the window
 | 
			
		||||
pub fn display_tabs(app: &mut App, ctx: &egui::Context) {
 | 
			
		||||
    egui::TopBottomPanel::top("app_top_bar").show(ctx, |ui| {
 | 
			
		||||
        ui.horizontal_wrapped(|ui| {
 | 
			
		||||
            ui.visuals_mut().button_frame = false;
 | 
			
		||||
pub fn display_tabs(tab_state: &mut TabState, ctx: &egui::Context, frame: &egui::Frame) {
 | 
			
		||||
    egui::TopBottomPanel::top("app_top_bar")
 | 
			
		||||
        .frame(*frame)
 | 
			
		||||
        .show(ctx, |ui| {
 | 
			
		||||
            ui.horizontal_wrapped(|ui| {
 | 
			
		||||
                ui.visuals_mut().button_frame = false;
 | 
			
		||||
 | 
			
		||||
            // Insert Tabs
 | 
			
		||||
            for tab in TabTypes::iter() {
 | 
			
		||||
                let tab_label =
 | 
			
		||||
                    ui.selectable_label(tab == app.tab_state.current_tab, format!("{:?}", tab));
 | 
			
		||||
                // Insert Tabs
 | 
			
		||||
                for tab in TabTypes::iter() {
 | 
			
		||||
                    let tab_label = ui.selectable_label(
 | 
			
		||||
                        tab == tab_state.get_current_tab_type(),
 | 
			
		||||
                        format!("{:?}", tab),
 | 
			
		||||
                    );
 | 
			
		||||
 | 
			
		||||
                if tab_label.clicked() {
 | 
			
		||||
                    app.tab_state.current_tab = tab
 | 
			
		||||
                    if tab_label.clicked() {
 | 
			
		||||
                        tab_state.change_tab(&tab);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user