WIP: fix: correct display of the timetable #13

Draft
Anri wants to merge 4 commits from display-timetable into main
3 changed files with 5 additions and 156 deletions
Showing only changes of commit 51f0657c13 - Show all commits

View file

@ -27,10 +27,6 @@ struct Args {
#[clap(short, long, value_name = "FILE NAME")]
export: Option<String>,
/// Size of cell of the timetable (irrelevant when exporting)
#[clap(short, long, value_name = "CELL LENGTH", default_value_t = 35)]
cl: usize,
/// Doesn't distinguish TD from TP
#[clap(short, long)]
td_are_tp: bool,
@ -90,6 +86,6 @@ async fn main() {
} else {
// Show the calendar
println!("Affichage...");
timetable::display(&timetable, args.cl);
timetable::display(&timetable);
}
}

View file

@ -6,8 +6,8 @@ use scraper::Selector;
use std::{collections::HashMap, sync::Arc};
use crate::utils::{
self, get_hours, get_semester, get_webpage, get_year,
models::{Info, InfoList, Position, TabChar},
get_hours, get_semester, get_webpage, get_year,
models::{Info, InfoList},
Capitalize,
};
@ -271,101 +271,6 @@ fn add_courses(
}
/// Display the timetable
pub fn display(timetable: &(Arc<[String]>, (usize, Vec<models::Day>)), cell_length: usize) {
// Cell length for hours
let clh = 11;
// Cell number
let cn = 6;
// 3/4 of cell length
let quarter = (3 * cell_length) / 4;
let sep = TabChar::Bv.val();
// Top of the tab
utils::line_table(clh, cell_length, cn, &Position::Top, &HashMap::new());
// First empty case
print!("{}{:^clh$}{}", sep, "", sep);
// Print day's of the week
let mut days = HashMap::new();
for (i, data) in timetable.1 .1.iter().enumerate() {
days.insert(i, &data.name);
print!("{:^cell_length$}{}", &data.name, sep);
}
// Store the data of the course for utils::line_table
let mut next_skip = HashMap::new();
// For each hours -- i the hour's number
for (i, hour) in timetable.0.iter().enumerate() {
// Draw separator line
utils::line_table(clh, cell_length, cn, &Position::Middle, &next_skip);
// Reset
next_skip = HashMap::new();
// Print hour
print!("{sep}{hour:^clh$}");
// For all the days - `j` the day's number
for (j, day) in timetable.1 .1.iter().enumerate() {
// True if we found something about the slot we are looking for
let mut info_slot = false;
// For all the courses of each days - `k` the possible course.start
for (k, course_opt) in day.courses.iter().enumerate() {
match course_opt {
// If there is a course
Some(course) => {
// Check the course's hour
if i == course.start {
// If the course uses more than one time slot
if course.size > 1 {
// If the data is too long
if course.name.len() > quarter {
let data = utils::split_half(&course.name);
next_skip.insert(j, data.1.trim());
print!("{}{:^cell_length$}", sep, data.0.trim());
} else {
next_skip.insert(j, &course.name);
print!("{}{:^cell_length$}", sep, "");
}
info_slot = true;
break;
}
// Else simply print the course
// If the data is too long
if course.name.len() > quarter {
print!("{}{:^cell_length$}", sep, utils::etc_str(&course.name));
} else {
print!("{}{:^cell_length$}", sep, &course.name);
}
info_slot = true;
break;
}
}
// If no course was found
None => {
// Verify the "no course" is in the correct day and hour
if *days.get(&j).unwrap() == &day.name.to_string() && k == i {
// If yes print empty row because there is no course
print!("{}{:^cell_length$}", sep, "");
info_slot = true;
break;
}
// Else it was a course of another day/time
}
};
}
if !info_slot {
// We found nothing about the slot because the precedent course
// takes more place than one slot
print!("{}{:^cell_length$}", sep, "");
}
}
print!("{sep}");
}
// Bottom of the table
utils::line_table(clh, cell_length, cn, &Position::Bottom, &HashMap::new());
pub fn display(timetable: &(Arc<[String]>, (usize, Vec<models::Day>))) {
todo!("{:#?}", timetable)
}

View file

@ -2,58 +2,6 @@ use std::collections::HashMap;
use chrono::Utc;
/// Collection of char for the table
pub enum TabChar {
/// Vertical bar
Bv,
/// Horizontal bar
Bh,
/// Joint left
Jl,
/// Joint right
Jr,
/// Joint bottom left
Jbl,
/// Joint bottom right
Jbr,
/// Joint top left
Jtl,
/// Joint top right
Jtr,
/// Joint to top
Jtt,
/// Joint to bottom
Jtb,
/// Joint of the middle
Jm,
}
impl TabChar {
/// Value of the element
pub fn val(&self) -> char {
match *self {
Self::Bv => '│',
Self::Bh => '─',
Self::Jl => '├',
Self::Jr => '┤',
Self::Jbl => '└',
Self::Jbr => '┘',
Self::Jtl => '┌',
Self::Jtr => '┐',
Self::Jtt => '┴',
Self::Jtb => '┬',
Self::Jm => '┼',
}
}
}
/// Position for lines inside the table
pub enum Position {
Top,
Middle,
Bottom,
}
pub type InfoList = Vec<(chrono::DateTime<Utc>, i64)>;
pub struct InfoType {