refactor (controls and app message), fix prev/next week
* controls struct (the header above the calendar) to its own file * message into new app module * implement move to previous/next week Signed-off-by: Fabrizio Iannetti <fabrizio.iannetti@gmail.com>
This commit is contained in:
parent
5760873a86
commit
0d528bd961
12
src/app.rs
Normal file
12
src/app.rs
Normal file
@ -0,0 +1,12 @@
|
||||
use crate::calendar::CalendarViewMode as ViewMode;
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub enum Message {
|
||||
NextWeek,
|
||||
PrevWeek,
|
||||
NextMonth,
|
||||
PrevMonth,
|
||||
NextYear,
|
||||
PrevYear,
|
||||
ViewModeSelected(ViewMode),
|
||||
}
|
135
src/main.rs
135
src/main.rs
@ -1,14 +1,15 @@
|
||||
//! Simple calendar applications.
|
||||
mod app;
|
||||
mod ui;
|
||||
mod model;
|
||||
|
||||
use iced::widget::button;
|
||||
use ui::calendar;
|
||||
use ui::{calendar, controls::Controls};
|
||||
use app::Message;
|
||||
use model::{
|
||||
events::EventsCollection,
|
||||
ical_bridge::load_calendar,
|
||||
};
|
||||
use chrono::{Datelike, NaiveDate, Months, Utc};
|
||||
use chrono::{Datelike, NaiveDate, Months, Utc, Days};
|
||||
use calendar::{CalendarParams, CalendarView };
|
||||
use calendar::CalendarViewMode as ViewMode;
|
||||
use std::path;
|
||||
@ -16,18 +17,13 @@ use clap::Parser;
|
||||
use log::info;
|
||||
use simplelog::{SimpleLogger, Config};
|
||||
use iced::{
|
||||
alignment,
|
||||
Alignment,
|
||||
Command,
|
||||
Element,
|
||||
Length,
|
||||
widget::{
|
||||
Column,
|
||||
Row,
|
||||
Container,
|
||||
Button,
|
||||
Text,
|
||||
pick_list,
|
||||
},
|
||||
};
|
||||
|
||||
@ -68,35 +64,11 @@ fn set_up_logger() {
|
||||
|
||||
#[derive(Default)]
|
||||
struct CalendarApp {
|
||||
month: NaiveDate,
|
||||
view_date: NaiveDate,
|
||||
controls: Controls,
|
||||
events: EventsCollection,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum Message {
|
||||
NextWeek,
|
||||
PrevWeek,
|
||||
NextMonth,
|
||||
PrevMonth,
|
||||
NextYear,
|
||||
PrevYear,
|
||||
ViewModeSelected(ViewMode),
|
||||
}
|
||||
|
||||
//#[derive(Default)]
|
||||
struct Controls {
|
||||
mode: Option<ViewMode>,
|
||||
}
|
||||
|
||||
impl Default for Controls {
|
||||
fn default() -> Controls {
|
||||
Controls {
|
||||
mode : Some(ViewMode::Year)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for ViewMode {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(
|
||||
@ -111,74 +83,11 @@ impl std::fmt::Display for ViewMode {
|
||||
}
|
||||
}
|
||||
|
||||
impl Controls {
|
||||
const MODES : [ViewMode; 3] = [ViewMode::Week, ViewMode::Month, ViewMode::Year];
|
||||
|
||||
fn view<'a>(&'a self, month_name: &'a str, year: i32) -> Element<Message> {
|
||||
let description = match self.mode {
|
||||
Some(ViewMode::Month) => month_name,
|
||||
_ => ""
|
||||
};
|
||||
Row::new()
|
||||
.align_items(Alignment::Center)
|
||||
.padding(5)
|
||||
.spacing(10)
|
||||
.push(
|
||||
pick_list(
|
||||
&Controls::MODES[..],
|
||||
self.mode,
|
||||
Message::ViewModeSelected,
|
||||
).placeholder("mode")
|
||||
)
|
||||
.push(
|
||||
Button::new(Text::new("<"))
|
||||
.on_press(self.get_msg_prev())
|
||||
.style(button::secondary),
|
||||
)
|
||||
.push(
|
||||
Button::new(Text::new(">"))
|
||||
.on_press(self.get_msg_next())
|
||||
.style(button::secondary),
|
||||
)
|
||||
.push(
|
||||
Text::new(description)
|
||||
.width(Length::Fill)
|
||||
.horizontal_alignment(alignment::Horizontal::Left)
|
||||
.size(40),
|
||||
)
|
||||
.push(
|
||||
Text::new(year.to_string())
|
||||
.width(Length::Fill)
|
||||
.horizontal_alignment(alignment::Horizontal::Right)
|
||||
.size(40),
|
||||
)
|
||||
.into()
|
||||
}
|
||||
|
||||
fn get_msg_next(&self) -> Message {
|
||||
match self.mode {
|
||||
Some(ViewMode::Week) => Message::NextWeek,
|
||||
Some(ViewMode::Month) => Message::NextMonth,
|
||||
Some(ViewMode::Year) => Message::NextYear,
|
||||
None => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
fn get_msg_prev(&self) -> Message {
|
||||
match self.mode {
|
||||
Some(ViewMode::Week) => Message::PrevWeek,
|
||||
Some(ViewMode::Month) => Message::PrevMonth,
|
||||
Some(ViewMode::Year) => Message::PrevYear,
|
||||
None => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl CalendarApp {
|
||||
fn with_files(calendar_paths: std::vec::Vec<path::PathBuf>) -> Self {
|
||||
let month = Utc::now().date_naive();
|
||||
let view_date = Utc::now().date_naive();
|
||||
let mut app = CalendarApp {
|
||||
month,
|
||||
view_date,
|
||||
events: EventsCollection::new(),
|
||||
..CalendarApp::default()
|
||||
};
|
||||
@ -191,22 +100,22 @@ impl CalendarApp {
|
||||
fn update(&mut self, message: Message) -> Command<Message> {
|
||||
match message {
|
||||
Message::PrevWeek => {
|
||||
self.month = self.month; // TODO
|
||||
self.view_date = self.view_date - Days::new(7);
|
||||
}
|
||||
Message::NextWeek => {
|
||||
self.month = self.month; // TODO
|
||||
self.view_date = self.view_date + Days::new(7);
|
||||
}
|
||||
Message::PrevMonth => {
|
||||
self.month = self.month - Months::new(1);
|
||||
self.view_date = self.view_date - Months::new(1);
|
||||
}
|
||||
Message::NextMonth => {
|
||||
self.month = self.month + Months::new(1);
|
||||
self.view_date = self.view_date + Months::new(1);
|
||||
}
|
||||
Message::PrevYear => {
|
||||
self.month = self.month - Months::new(12);
|
||||
self.view_date = self.view_date - Months::new(12);
|
||||
}
|
||||
Message::NextYear => {
|
||||
self.month = self.month + Months::new(12);
|
||||
self.view_date = self.view_date + Months::new(12);
|
||||
}
|
||||
Message::ViewModeSelected(mode) => {
|
||||
self.controls.mode = Some(mode);
|
||||
@ -218,24 +127,10 @@ impl CalendarApp {
|
||||
fn view(&self) -> Element<Message> {
|
||||
#[cfg(feature = "tracing")]
|
||||
tracepoints::calendar::view_entry();
|
||||
const MONTH_NAMES: [&str;12] = [
|
||||
"gennaio",
|
||||
"febbraio",
|
||||
"marzo",
|
||||
"aprile",
|
||||
"maggio",
|
||||
"giugno",
|
||||
"luglio",
|
||||
"agosto",
|
||||
"settembre",
|
||||
"ottobre",
|
||||
"novembre",
|
||||
"dicembre",
|
||||
];
|
||||
let content = Column::new()
|
||||
.align_items(Alignment::Center)
|
||||
.push(self.controls.view(MONTH_NAMES[self.month.month0() as usize], self.month.year()))
|
||||
.push(CalendarView::new(self.controls.mode.unwrap_or(ViewMode::Year), &CalendarParams::new(), self.month, &self.events))
|
||||
.push(self.controls.view(self.view_date, self.view_date.year()))
|
||||
.push(CalendarView::new(self.controls.mode.unwrap_or(ViewMode::Year), &CalendarParams::new(), self.view_date, &self.events))
|
||||
;
|
||||
|
||||
let container = Container::new(content)
|
||||
|
@ -1,3 +1,4 @@
|
||||
pub mod calendar;
|
||||
pub mod basics;
|
||||
pub mod calendar;
|
||||
pub mod controls;
|
||||
mod row;
|
||||
|
108
src/ui/controls.rs
Normal file
108
src/ui/controls.rs
Normal file
@ -0,0 +1,108 @@
|
||||
use crate::{
|
||||
app::Message,
|
||||
calendar::CalendarViewMode as ViewMode
|
||||
};
|
||||
use chrono::{NaiveDate, Datelike};
|
||||
use iced::{
|
||||
alignment,
|
||||
Alignment,
|
||||
Element,
|
||||
Length,
|
||||
widget::{
|
||||
button,
|
||||
Row,
|
||||
Button,
|
||||
Text,
|
||||
pick_list,
|
||||
},
|
||||
};
|
||||
|
||||
//#[derive(Default)]
|
||||
pub struct Controls {
|
||||
pub mode: Option<ViewMode>,
|
||||
}
|
||||
|
||||
impl Default for Controls {
|
||||
fn default() -> Controls {
|
||||
Controls {
|
||||
mode : Some(ViewMode::Year)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Controls {
|
||||
const MODES : [ViewMode; 3] = [ViewMode::Week, ViewMode::Month, ViewMode::Year];
|
||||
const MONTH_NAMES: [&'static str;12] = [
|
||||
"gennaio",
|
||||
"febbraio",
|
||||
"marzo",
|
||||
"aprile",
|
||||
"maggio",
|
||||
"giugno",
|
||||
"luglio",
|
||||
"agosto",
|
||||
"settembre",
|
||||
"ottobre",
|
||||
"novembre",
|
||||
"dicembre",
|
||||
];
|
||||
|
||||
pub fn view<'a>(&'a self, view_date: NaiveDate, year: i32) -> Element<Message> {
|
||||
let description = match self.mode {
|
||||
Some(ViewMode::Month) => Controls::MONTH_NAMES[view_date.month0() as usize],
|
||||
_ => ""
|
||||
};
|
||||
Row::new()
|
||||
.align_items(Alignment::Center)
|
||||
.padding(5)
|
||||
.spacing(10)
|
||||
.push(
|
||||
pick_list(
|
||||
&Controls::MODES[..],
|
||||
self.mode,
|
||||
Message::ViewModeSelected,
|
||||
).placeholder("mode")
|
||||
)
|
||||
.push(
|
||||
Button::new(Text::new("<"))
|
||||
.on_press(self.get_msg_prev())
|
||||
.style(button::secondary),
|
||||
)
|
||||
.push(
|
||||
Button::new(Text::new(">"))
|
||||
.on_press(self.get_msg_next())
|
||||
.style(button::secondary),
|
||||
)
|
||||
.push(
|
||||
Text::new(description)
|
||||
.width(Length::Fill)
|
||||
.horizontal_alignment(alignment::Horizontal::Left)
|
||||
.size(40),
|
||||
)
|
||||
.push(
|
||||
Text::new(year.to_string())
|
||||
.width(Length::Fill)
|
||||
.horizontal_alignment(alignment::Horizontal::Right)
|
||||
.size(40),
|
||||
)
|
||||
.into()
|
||||
}
|
||||
|
||||
fn get_msg_next(&self) -> Message {
|
||||
match self.mode {
|
||||
Some(ViewMode::Week) => Message::NextWeek,
|
||||
Some(ViewMode::Month) => Message::NextMonth,
|
||||
Some(ViewMode::Year) => Message::NextYear,
|
||||
None => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
fn get_msg_prev(&self) -> Message {
|
||||
match self.mode {
|
||||
Some(ViewMode::Week) => Message::PrevWeek,
|
||||
Some(ViewMode::Month) => Message::PrevMonth,
|
||||
Some(ViewMode::Year) => Message::PrevYear,
|
||||
None => todo!(),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user