E-Paper-Calendar/Calendar/DayViewPanel.py

156 lines
5.1 KiB
Python
Raw Normal View History

from PanelDesign import PanelDesign
from datetime import datetime, timedelta, date
from DayHeaderDesign import DayHeaderDesign
2019-03-17 22:05:49 +01:00
from HourListDesign import HourListDesign
2019-05-18 09:28:29 +02:00
from settings import general_settings
from RssPostListDesign import RssPostListDesign
from PIL import ImageDraw
from Assets import colors
from EventListDesign import EventListDesign
2019-05-18 09:28:29 +02:00
from CryptoListDesign import CryptoListDesign
header_size = (1, 0.2)
2019-03-17 22:05:49 +01:00
hourlist_size = (1, 1 - header_size[1])
default_shownhours_count = 12
infoarea_replaced_hours = 4
2019-05-18 09:28:29 +02:00
infoarea_borderline_width = 1
infoarea_padding = 5
2019-07-13 08:05:35 +02:00
class DayViewPanel (PanelDesign):
"""Overview that focuses on the current day and
shows a timeline split into hours."""
2019-07-13 08:05:35 +02:00
def __init__(self, size):
super(DayViewPanel, self).__init__(size)
self.shownhours_count = default_shownhours_count
if general_settings["info-area"] not in ["", "empty"]:
self.shownhours_count -= infoarea_replaced_hours
self.__first_render__()
2019-07-13 08:05:35 +02:00
def __first_render__(self):
self.__init_header__()
2019-03-17 22:05:49 +01:00
self.__init_hourlist__()
2019-07-13 08:05:35 +02:00
def add_weather(self, weather):
self.__header__.add_weather(weather)
2019-07-13 08:05:35 +02:00
def add_calendar(self, calendar):
allday_ev, timed_ev = self.__split_events__(
calendar.get_today_events())
2019-04-08 15:42:55 +02:00
self.__header__.add_events(allday_ev)
self.__hourlist__.add_events(timed_ev)
if general_settings["info-area"] == "events":
self.__draw_event_list__(calendar)
self.__draw_infoarea_line__()
2019-07-13 08:05:35 +02:00
def add_rssfeed(self, rss):
if general_settings["info-area"] == "rss":
self.__draw_rss_feed__(rss)
self.__draw_infoarea_line__()
2019-07-13 08:05:35 +02:00
def add_crypto(self, crypto):
2019-05-18 09:28:29 +02:00
if general_settings["info-area"] == "crypto":
self.__draw_crypto_feed__(crypto)
self.__draw_infoarea_line__()
def __draw_infoarea_line__(self):
height = infoarea_replaced_hours * self.__hourlist__.row_size[1]
ypos = self.size[1] - height
line_start = (0, ypos)
line_end = (self.size[0], ypos)
2019-07-13 08:05:35 +02:00
ImageDraw.Draw(self.__image__).line(
[line_start, line_end], fill=colors["fg"], width=infoarea_borderline_width)
def __draw_rss_feed__(self, rss):
2019-07-13 08:05:35 +02:00
height = infoarea_replaced_hours * \
self.__hourlist__.row_size[1] - infoarea_padding
size = (self.size[0], height)
pos = (0, self.size[1] - size[1])
rss = RssPostListDesign(size, rss)
rss.pos = pos
self.draw_design(rss)
2019-05-18 09:28:29 +02:00
def __draw_crypto_feed__(self, crypto):
2019-07-13 08:05:35 +02:00
height = infoarea_replaced_hours * \
self.__hourlist__.row_size[1] - infoarea_padding
2019-05-18 09:28:29 +02:00
size = (self.size[0], height)
pos = (0, self.size[1] - size[1])
crypto = CryptoListDesign(size, crypto)
acutal_height = crypto.get_estimated_height()
crypto.pos = (pos[0], pos[1] + (height - acutal_height))
2019-05-18 09:28:29 +02:00
self.draw_design(crypto)
def __draw_event_list__(self, calendar):
2019-07-13 08:05:35 +02:00
height = infoarea_replaced_hours * \
self.__hourlist__.row_size[1] - infoarea_padding
size = (self.size[0], height)
pos = (0, self.size[1] - size[1])
events = EventListDesign(size, calendar.get_upcoming_events())
events.pos = pos
self.draw_design(events)
2019-07-13 08:05:35 +02:00
def add_tasks(self, tasks):
pass
2019-07-13 08:05:35 +02:00
def __finish_panel__(self):
self.draw_design(self.__header__)
2019-03-17 22:05:49 +01:00
self.draw_design(self.__hourlist__)
2019-07-13 08:05:35 +02:00
def __init_header__(self):
self.__header__ = DayHeaderDesign(
self.__abs_co__(header_size), date.today())
self.__header__.pos = (0, 0)
2019-07-13 08:05:35 +02:00
def __init_hourlist__(self):
2019-04-09 12:17:12 +02:00
start, end = self.__get_current_hour_range__()
size = self.__abs_co__(hourlist_size)
2019-07-13 08:05:35 +02:00
size = (size[0], size[1] * self.shownhours_count /
default_shownhours_count)
2019-05-18 09:28:29 +02:00
self.__hourlist__ = HourListDesign(size, start, end)
2019-03-17 22:05:49 +01:00
self.__hourlist__.pos = (0, self.__header__.size[1])
2019-04-09 12:17:12 +02:00
def __get_current_hour_range__(self):
start_hour = datetime.now().hour
2019-04-09 13:37:39 +02:00
additional_hours = self.shownhours_count - 1
2019-05-18 09:28:29 +02:00
2019-04-09 13:37:39 +02:00
if start_hour + additional_hours > 23:
start_hour = 23 - additional_hours
2019-04-09 12:17:12 +02:00
2019-04-09 13:37:39 +02:00
return start_hour, start_hour + additional_hours
2019-04-09 12:17:12 +02:00
2019-07-13 08:05:35 +02:00
def __abs_co__(self, coordinates):
return (int(coordinates[0] * self.size[0]), int(coordinates[1] * self.size[1]))
2019-07-13 08:05:35 +02:00
def __split_events__(self, events):
2019-04-08 15:42:55 +02:00
allday_ev = []
timed_ev = []
2019-03-17 22:05:49 +01:00
2019-04-08 15:42:55 +02:00
for event in events:
if event.allday:
allday_ev.append(event)
elif event.multiday:
if self.__is_today__(event.begin_datetime):
2019-04-08 16:21:06 +02:00
timed_ev.append(event)
2019-04-08 15:42:55 +02:00
elif self.__is_today__(event.end_datetime):
2019-04-08 16:21:06 +02:00
timed_ev.append(event)
2019-04-08 15:42:55 +02:00
else:
allday_ev.append(event)
else:
timed_ev.append(event)
return allday_ev, timed_ev
2019-07-13 08:05:35 +02:00
def __is_today__(self, dt):
2019-04-08 15:42:55 +02:00
today = date.today()
return dt.day == today.day and \
dt.month == today.month and \
2019-05-18 09:28:29 +02:00
dt.year == today.year