diff --git a/fitnesstrax/app/src/main.rs b/fitnesstrax/app/src/main.rs index ad2c6d5..dcb3748 100644 --- a/fitnesstrax/app/src/main.rs +++ b/fitnesstrax/app/src/main.rs @@ -18,7 +18,7 @@ use emseries::Series; use ft_core::TraxRecord; use gio::resources_lookup_data; use glib::Object; -use gtk::{prelude::*, subclass::prelude::*, STYLE_PROVIDER_PRIORITY_USER}; +use gtk::{subclass::prelude::*, STYLE_PROVIDER_PRIORITY_USER}; use std::{ cell::RefCell, env, @@ -117,22 +117,13 @@ impl HistoricalView { } } -/// These are the possible states of the main application view. -enum MainView { - /// The application is not configured yet. This is a basic background widget to take up the - /// space when there is no data to be shown. - Unconfigured(UnconfiguredView), - - /// The Historical view shows a history of records and whatnot. - Historical(HistoricalView), -} - /// The application window, or the main window, is the main user interface for the app. Almost /// everything occurs here. struct AppWindow { app: App, window: adw::ApplicationWindow, - current_view: RefCell, + layout: gtk::Box, + current_view: RefCell, } impl AppWindow { @@ -150,9 +141,9 @@ impl AppWindow { .build(); let current_view = if app.database.read().unwrap().is_none() { - MainView::Unconfigured(UnconfiguredView::new()) + UnconfiguredView::new().upcast() } else { - MainView::Historical(HistoricalView::new()) + HistoricalView::new().upcast() }; let stylesheet = String::from_utf8( @@ -171,26 +162,38 @@ impl AppWindow { let context = window.style_context(); context.add_provider(&provider, STYLE_PROVIDER_PRIORITY_USER); + let header = adw::HeaderBar::builder() + .title_widget(>k::Label::new(Some("FitnessTrax"))) + .build(); + + let layout = gtk::Box::builder() + .orientation(gtk::Orientation::Vertical) + .build(); + layout.append(&header); + layout.append(¤t_view); + + window.set_content(Some(&layout)); window.present(); let s = Self { app, window, + layout, current_view: RefCell::new(current_view), }; - s.redraw(); s } // Switch views. // // This function only replaces the old view with the one which matches the current view state. - // If there is any other setup/teardown to do, it will handle that as well. - fn redraw(&self) { - match *self.current_view.borrow() { - MainView::Unconfigured(ref view) => self.window.set_content(Some(view)), - MainView::Historical(ref view) => self.window.set_content(Some(view)), - } + // It is responsible for ensuring that the new view goes into the layout in the correct + // position. + fn change_view(&self, view: gtk::Widget) { + let mut current_view = self.current_view.borrow_mut(); + self.layout.remove(&*current_view); + *current_view = view; + self.layout.append(&*current_view); } }