Compare commits

...

2 Commits

Author SHA1 Message Date
Fabrizio Iannetti 0d528bd961 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>
2024-04-21 09:48:26 +02:00
Fabrizio Iannetti 5760873a86 Smaller event bar height and font
Signed-off-by: Fabrizio Iannetti <fabrizio.iannetti@gmail.com>
2024-04-21 08:43:02 +02:00
5 changed files with 145 additions and 133 deletions

12
src/app.rs Normal file
View 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),
}

View File

@ -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,
Alignment,
Command,
Element,
Length,
Element,
Length,
widget::{
Column,
Row,
Column,
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()
};
@ -188,29 +97,25 @@ impl CalendarApp {
app
}
fn title(&self) -> String {
String::from("Calendar")
}
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);
@ -222,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)

View File

@ -1,3 +1,4 @@
pub mod calendar;
pub mod basics;
pub mod calendar;
pub mod controls;
mod row;

View File

@ -80,10 +80,10 @@ impl CalendarParams {
day_other_month_fg: Color::from_rgb8(220, 220, 220),
day_weekend_bg: Color::from_rgb8(245, 245, 245),
day_text_margin: 5.0,
ev_height: 20.0,
ev_height: 18.0,
ev_margin: 2.0,
ev_bg: Color::from_rgb8(200, 245, 200),
ev_fontsize: 16.0,
ev_fontsize: 14.0,
}
}
@ -218,8 +218,8 @@ fn render_events_in_row<Renderer>(
width: ev_bar.bounds.width,
};
let ev_text_position = Point {
x: ev_bar.bounds.x,
y: ev_bar.bounds.y + 1.0,
x: ev_bar.bounds.x + 1.0,
y: ev_bar.bounds.y,
};
renderer.fill_text(
Text {

108
src/ui/controls.rs Normal file
View 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!(),
}
}
}