E-Paper-Calendar/Calendar/DayHeaderDesign.py

124 lines
No EOL
5.1 KiB
Python

from DesignEntity import DesignEntity
from PIL import ImageDraw
from TextDesign import TextDesign
from WeatherColumnDesign import WeatherColumnDesign
from datetime import date, timedelta, datetime
from SingelDayEventListDesign import SingelDayEventListDesign
from Assets import fonts, colors
from settings import general_settings
numberbox_ypos = 0.15
numberbox_height = 1 - 2 * numberbox_ypos
number_height = numberbox_height * 0.83
month_height = numberbox_height / 4
monthbox_xpadding = 0.013
monthbox_width = 1 - numberbox_ypos - monthbox_xpadding
weekday_height = numberbox_height * 0.19
weekday_ypadding = 0.02
weathercolumn_y_size = (0.4, 1)
eventlist_y_fontsize = 0.093
eventlist_padding = monthbox_xpadding
numberbox_font_color = colors["bg"]
numberbox_background_color = colors["hl"]
weekday_font = fonts["bold"]
class DayHeaderDesign (DesignEntity):
"""Detailed and big view of a given date."""
def __init__ (self, size, date):
super(DayHeaderDesign, self).__init__(size)
self.weather_column_width = 0
self.date = date
def add_weather (self, weather):
if general_settings["weather-info"] == False:
return
forecast = weather.get_forecast_in_days(self.date.day - date.today().day)
self.weather_column_width = weathercolumn_y_size[0] * self.size[1]
size = (self.weather_column_width, weathercolumn_y_size[1] * self.size[1])
pos = (self.size[0] - size[0], 0)
design = WeatherColumnDesign(size, forecast)
design.pos = pos
self.draw_design(design)
def add_calendar (self, calendar):
now = datetime.now()
time_until_tomorrow = (datetime(now.year, now.month, now.day) + timedelta(1)) - now
self.__draw_event_list__(calendar.get_upcoming_events(time_until_tomorrow))
def add_events (self, events):
self.__draw_event_list__(events)
def add_rssfeed (self, rss):
pass
def __finish_image__ (self):
self.__draw_number_square__()
self.__draw_month__()
self.__draw_weekday__()
def __draw_event_list__ (self, events):
box_ypos = numberbox_ypos * self.size[1]
box_xpos = numberbox_ypos * self.size[1]
box_height = numberbox_height * self.size[1]
padding = eventlist_padding * self.size[0]
monthbox_height = month_height * self.size[1]
pos = (box_xpos + box_height + padding, box_ypos + monthbox_height + padding)
size = (self.size[0] - pos[0] - self.weather_column_width, self.size[1] - pos[1] - box_ypos)
fontsize = eventlist_y_fontsize * self.size[1]
rel_dates = [self.date for _ in range(len(events))]
event_list = SingelDayEventListDesign(size, events, fontsize, event_prefix_rel_dates = rel_dates)
event_list.pos = pos
self.draw_design(event_list)
def __draw_weekday__ (self):
font_size = int(weekday_height * self.size[1])
padding = int(weekday_ypadding * self.size[1])
box_ypos = int((numberbox_ypos) * self.size[1]) + padding
box_xpos = int(numberbox_ypos * self.size[1])
box_height = numberbox_height * self.size[1]
box_pos = (box_xpos, box_ypos)
box_size = (int(numberbox_height * self.size[1]), box_height)
week_day_name = self.date.strftime("%A")
week_day = TextDesign(box_size, text=week_day_name, background_color=numberbox_background_color, color=numberbox_font_color, fontsize=font_size, horizontalalignment="center", font=weekday_font)
week_day.pos = box_pos
self.draw_design(week_day)
def __draw_month__ (self):
font_size = int(month_height * self.size[1])
padding = int(monthbox_xpadding * self.size[0])
box_ypos = int(numberbox_ypos * self.size[1])
box_height = int(numberbox_height * self.size[1])
box_pos = (box_ypos + box_height + padding, box_ypos)
box_size = (int(monthbox_width * self.size[0]), box_height)
month_name = self.date.strftime("%B")
month = TextDesign(box_size, text=month_name, fontsize=font_size)
month.pos = box_pos
self.draw_design(month)
def __draw_number_square__ (self):
box_ypos = int(numberbox_ypos * self.size[1])
box_height = int(numberbox_height * self.size[1])
box_topleft = (box_ypos,box_ypos)
box_bottomright = (box_topleft[0] + box_height, box_topleft[1] + box_height)
ImageDraw.Draw(self.__image__).rectangle([ box_topleft, box_bottomright ], fill=numberbox_background_color)
font_size = int(number_height * self.size[1])
box_size = (box_height, box_height)
day_text = self.__get_day_text__()
number = TextDesign(box_size, text=day_text, background_color=numberbox_background_color, color=numberbox_font_color, fontsize=font_size, horizontalalignment="center", verticalalignment="center")
number.pos = box_topleft
self.draw_design(number)
def __abs_co__ (self, coordinates):
return (int(coordinates[0] * self.size[0]),int(coordinates[1] * self.size[1]))
def __get_day_text__ (self):
if self.date.day is 14 and self.date.month is 3: #PI-Day
return "π"
return str(self.date.day)