110 lines
No EOL
3.9 KiB
Python
110 lines
No EOL
3.9 KiB
Python
from PanelDesign import PanelDesign
|
|
from Assets import colors
|
|
from settings import general_settings
|
|
import calendar as callib
|
|
from datetime import datetime, timedelta, date
|
|
from PIL import ImageDraw
|
|
from TextDesign import TextDesign
|
|
from DayHeaderDesign import DayHeaderDesign
|
|
from DayRowDesign import DayRowDesign
|
|
from RssPostListDesign import RssPostListDesign
|
|
|
|
todayheader_pos = (0,0)
|
|
todayheader_size = (1,0.25)
|
|
lines_thickness = 1
|
|
infoarea_replacedrowscount = 3
|
|
|
|
dayrowsarea_ypos = todayheader_size[1]
|
|
dayrowsarea_height = 1 - todayheader_size[1]
|
|
dayrow_min_format = 50 / 384
|
|
dayrow_max_format = 70 / 384
|
|
rss_y_padding = 5
|
|
|
|
class DayListPanel (PanelDesign):
|
|
"""Overview that focuses on the current day and
|
|
lists following days in a list below."""
|
|
def __init__ (self, size):
|
|
super(DayListPanel, self).__init__(size)
|
|
self.__day_rows__ = []
|
|
self.__calc_dayrow_size__()
|
|
self.__first_render__()
|
|
|
|
def __first_render__ (self):
|
|
self.__draw_today_header__()
|
|
self.__draw_day_rows__()
|
|
|
|
def add_weather (self, weather):
|
|
for row in self.__day_rows__:
|
|
row.add_weather(weather)
|
|
|
|
def add_calendar (self, calendar):
|
|
for row in self.__day_rows__:
|
|
row.add_calendar(calendar)
|
|
|
|
def add_rssfeed (self, rss):
|
|
for row in self.__day_rows__:
|
|
row.add_rssfeed(rss)
|
|
if general_settings["info-area"] is "rss":
|
|
self.__draw_rss_infoarea__(rss)
|
|
|
|
def __draw_rss_infoarea__ (self, rss):
|
|
height = infoarea_replacedrowscount * self.dayrow_size[1] * self.size[1] - rss_y_padding
|
|
ypos = self.size[1] - height
|
|
size = (self.size[0], height)
|
|
pos = (0, ypos)
|
|
|
|
design = RssPostListDesign(size, rss)
|
|
design.pos = pos
|
|
self.draw_design(design)
|
|
|
|
def __draw_day_rows__ (self):
|
|
following_days = self.__get_following_days__()
|
|
for i, date in enumerate(following_days):
|
|
row = DayRowDesign(self.__abs_co__(self.dayrow_size), date)
|
|
row.pos = self.__get_day_row_pos__(i)
|
|
self.__day_rows__.append(row)
|
|
|
|
def __get_day_row_pos__ (self, i):
|
|
ypos = self.size[1] * dayrowsarea_ypos
|
|
down_shift = i * self.dayrow_size[1] * self.size[1]
|
|
return (0, int(ypos + down_shift))
|
|
|
|
def __calc_dayrow_size__ (self):
|
|
max_area_height = dayrowsarea_height * self.size[1]
|
|
max_row_number = max_area_height / (dayrow_min_format * self.size[0])
|
|
min_row_number = max_area_height / (dayrow_max_format * self.size[0])
|
|
average_row_number = (max_row_number + min_row_number) / 2
|
|
self.dayrow_count = round(average_row_number)
|
|
row_height = max_area_height / self.dayrow_count
|
|
self.dayrow_size = (1, row_height / self.size[1])
|
|
|
|
if general_settings["info-area"] in ["rss"]:
|
|
self.dayrow_count -= infoarea_replacedrowscount
|
|
|
|
def __get_following_days__(self):
|
|
following_days = []
|
|
for i in range(self.dayrow_count):
|
|
following_days.append(date.today() + timedelta(days=i + 1))
|
|
return following_days
|
|
|
|
def __draw_today_header__ (self):
|
|
header = DayHeaderDesign(self.__abs_co__(todayheader_size), date.today())
|
|
header.pos = self.__abs_co__(todayheader_pos)
|
|
self.__day_rows__.append(header)
|
|
|
|
def __draw_lines__(self):
|
|
positions = []
|
|
for i in range(self.dayrow_count + 1):
|
|
positions.append(self.__get_day_row_pos__(i)[1])
|
|
for ypos in positions:
|
|
line_start = (0, ypos)
|
|
line_end = (self.size[0], ypos)
|
|
ImageDraw.Draw(self.__image__).line([line_start, line_end], fill=colors["fg"], width=lines_thickness)
|
|
|
|
def __finish_panel__(self):
|
|
for design in self.__day_rows__:
|
|
self.draw_design(design)
|
|
self.__draw_lines__()
|
|
|
|
def __abs_co__(self, coordinates):
|
|
return (int(coordinates[0] * self.size[0]),int(coordinates[1] * self.size[1])) |