Created basic day rows

This commit is contained in:
Maximilian Giller 2019-03-08 21:37:54 +01:00
parent 545657ecbb
commit bd119bb8f9
2 changed files with 121 additions and 16 deletions

View file

@ -1,34 +1,37 @@
from PanelDesign import PanelDesign from PanelDesign import PanelDesign
from Assets import * from Assets import *
from settings import * from settings import *
import calendar import calendar as callib
from datetime import datetime, timedelta from datetime import datetime, timedelta, date
from PIL import ImageDraw from PIL import ImageDraw
from TextDesign import TextDesign from TextDesign import TextDesign
from BoxDesign import BoxDesign from BoxDesign import BoxDesign
from EllipseDesign import EllipseDesign from EllipseDesign import EllipseDesign
from DayHeaderDesign import DayHeaderDesign from DayHeaderDesign import DayHeaderDesign
from DayRowDesign import DayRowDesign
todayheader_pos = (0,0) todayheader_pos = (0,0)
todayheader_size = (1,0.25) todayheader_size = (1,0.25)
headerline_color = "black" line_color = "black"
lines_thickness = 1 lines_thickness = 1
dayrowsarea_ypos = todayheader_size[1]
dayrowsarea_height = 1 - todayheader_size[1]
dayrow_min_format = 55 / 680
dayrow_max_format = 85 / 680
class DayListPanel (PanelDesign): class DayListPanel (PanelDesign):
"""Overview that focuses on the current day and """Overview that focuses on the current day and
lists following days in a list below.""" lists following days in a list below."""
def __init__ (self, size): def __init__ (self, size):
super(DayListPanel, self).__init__(size) super(DayListPanel, self).__init__(size)
self.__first_render__()
self.__day_rows__ = [] self.__day_rows__ = []
self.__calc_dayrow_size__()
self.__first_render__()
def __first_render__ (self): def __first_render__ (self):
if week_starts_on == "Monday":
calendar.setfirstweekday(calendar.MONDAY)
elif week_starts_on == "Sunday":
calendar.setfirstweekday(calendar.SUNDAY)
self.__draw_today_header__() self.__draw_today_header__()
self.__draw_day_rows__()
def add_weather (self, weather): def add_weather (self, weather):
pass pass
@ -39,14 +42,51 @@ class DayListPanel (PanelDesign):
def add_rssfeed (self, rss): def add_rssfeed (self, rss):
pass pass
def __draw_today_header__ (self): def __draw_day_rows__ (self):
header = DayHeaderDesign(self.__abs_co__(todayheader_size), datetime.now()) following_days = self.__get_following_days__()
header.pos = self.__abs_co__(todayheader_pos) for i, date in enumerate(following_days):
self.draw_design(header) row = DayRowDesign(self.__abs_co__(self.dayrow_size), date)
row.pos = self.__get_day_row_pos__(i)
self.__day_rows__.append(row)
line_start = (0, self.__abs_co__(todayheader_size)[1]) def __get_day_row_pos__ (self, i):
line_end = self.__abs_co__(todayheader_size) ypos = self.size[1] * dayrowsarea_ypos
ImageDraw.Draw(self.__image__).line([line_start, line_end], fill=headerline_color, width=lines_thickness) 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[1])
min_row_number = max_area_height / (dayrow_max_format * self.size[1])
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])
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):
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=line_color, width=lines_thickness)
def __finish_image__(self):
for design in self.__day_rows__:
self.draw_design(design)
self.__draw_lines__()
def __abs_co__(self, coordinates): def __abs_co__(self, coordinates):
return (int(coordinates[0] * self.size[0]),int(coordinates[1] * self.size[1])) return (int(coordinates[0] * self.size[0]),int(coordinates[1] * self.size[1]))

65
Calendar/DayRowDesign.py Normal file
View file

@ -0,0 +1,65 @@
from PIL import ImageDraw
from TextDesign import TextDesign
from settings import week_starts_on
from DesignEntity import DesignEntity
daynumber_y_size = (1, 0.65)
weekday_y_size = (daynumber_y_size[0], 1 - daynumber_y_size[1])
weekday_ypos = daynumber_y_size[1]
daynumber_fontsize = daynumber_y_size[1] * 0.8
weekday_fontsize = weekday_y_size[1] * 0.75
general_text_color = "black"
highlight_text_color = "red"
background_color = "white"
class DayRowDesign (DesignEntity):
"""Detailed view of a given date."""
def __init__ (self, size, date):
super(DayRowDesign, self).__init__(size)
self.__init_image__(color=background_color)
self.date = date
def __finish_image__ (self):
self.__draw_day_number__()
self.__draw_weekday__()
def __draw_weekday__ (self):
font_size = int(weekday_fontsize * self.size[1])
size = (weekday_y_size[0] * self.size[1], weekday_y_size[1] * self.size[1])
ypos = weekday_ypos * self.size[1]
pos = (0, ypos)
color = self.__get_day_color__()
week_day_name = self.date.strftime("%a")
week_day = TextDesign(size, text=week_day_name, background_color=background_color, color=color, fontsize=font_size, horizontalalignment="center", verticalalignment="top")
week_day.pos = pos
self.draw_design(week_day)
def __draw_day_number__ (self):
font_size = int(daynumber_fontsize * self.size[1])
size = (daynumber_y_size[0] * self.size[1], daynumber_y_size[1] * self.size[1])
pos = (0, 0)
day_text = self.__get_day_text__()
color = self.__get_day_color__()
number = TextDesign(size, text=day_text, background_color=background_color, color=color, fontsize=font_size, horizontalalignment="center", verticalalignment="bottom")
number.pos = pos
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):
return str(self.date.day)
def __get_day_color__ (self):
"""Depending on week_starts_on"""
if week_starts_on == "Monday" and self.date.strftime("%w") == "0":
return highlight_text_color
elif week_starts_on == "Sunday" and self.date.strftime("%w") == "6":
return highlight_text_color
else:
return general_text_color