Add a tab bar for different views

This commit is contained in:
traxys 2023-11-26 17:35:06 +01:00
parent 32ab584130
commit a599da6fbc
2 changed files with 77 additions and 3 deletions

View file

@ -9,7 +9,13 @@ anyhow = "1.0.75"
directories = "5.0.1"
either = "1.9.0"
iced = { version = "0.10.0", features = ["lazy"] }
iced_aw = { version = "0.7.0", default-features = false, features = ["modal", "card", "number_input", "selection_list"] }
iced_aw = { version = "0.7.0", default-features = false, features = [
"modal",
"card",
"number_input",
"selection_list",
"tab_bar",
] }
itertools = "0.11.0"
peg = "0.8.2"
serde = { version = "1.0.192", features = ["derive"] }

View file

@ -9,7 +9,12 @@ use std::{
use anyhow::anyhow;
use directories::ProjectDirs;
use edit::{EditMessage, EditState, Spendings};
use iced::{font, subscription, window, Application, Command, Event, Settings, Theme};
use iced::{
font, subscription,
widget::{column, text},
window, Application, Command, Event, Settings, Theme,
};
use iced_aw::{TabBar, TabBarStyles, TabLabel};
use serde::{Deserialize, Serialize};
type Element<'a> = iced::Element<'a, Message>;
@ -171,11 +176,62 @@ enum Message {
Load(ReportDate),
InitFrom(ReportDate),
Edit(EditMessage),
ChangeTab(CurrentView),
}
// enum CompareLoad {
// Current,
// Report(ReportDate),
// }
//
// enum CompareSide {
// Left,
// Right,
// }
//
// struct Compare<'a, F> {
// left: Option<&'a dyn Spendings>,
// right: Option<&'a dyn Spendings>,
// on_load: F,
// }
//
// #[derive(Default)]
// struct CompareState {}
//
// enum CompareMsg {
// LoadLeft(CompareLoad),
// LoadRight(CompareLoad),
// }
//
// impl<'a, M, F> iced::widget::Component<M, Renderer> for Compare<'a, F>
// where
// F: FnMut(CompareSide, CompareLoad) -> M,
// {
// type State = CompareState;
// type Event = CompareMsg;
//
// fn update(&mut self, _state: &mut Self::State, event: Self::Event) -> Option<M> {
// match event {
// CompareMsg::LoadLeft(d) => Some((self.on_load)(CompareSide::Left, d)),
// CompareMsg::LoadRight(d) => Some((self.on_load)(CompareSide::Right, d)),
// }
// }
//
// fn view(&self, _state: &Self::State) -> iced_aw::Element<'_, Self::Event, Renderer> {
// text("todo").into()
// }
// }
#[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)]
enum CurrentView {
Edit,
Compare,
}
struct Glaurung {
config: Config,
edit: EditState,
view: CurrentView,
archive: BTreeMap<ReportDate, Report>,
}
@ -191,6 +247,7 @@ impl Application for Glaurung {
config: config.config,
edit: EditState::new(config.save_file),
archive: config.save.archive,
view: CurrentView::Edit,
};
this.edit.load(None, config.save.current);
@ -237,13 +294,24 @@ impl Application for Glaurung {
}
}
Message::Edit(m) => self.edit.update(m),
Message::ChangeTab(t) => self.view = t,
}
Command::none()
}
fn view(&self) -> Element {
self.edit.view(&self.archive, &self.config)
let bar = TabBar::new(Message::ChangeTab)
.push(CurrentView::Edit, TabLabel::Text("Edit".into()))
.push(CurrentView::Compare, TabLabel::Text("Compare".into()))
.set_active_tab(&self.view)
.style(TabBarStyles::Dark);
let content = match self.view {
CurrentView::Edit => self.edit.view(&self.archive, &self.config),
CurrentView::Compare => text("todo").into(),
};
column![bar, content].into()
}
fn theme(&self) -> iced::Theme {