Added event day highlights

This commit is contained in:
Maximilian Giller 2019-03-02 09:36:55 +01:00
parent 10f006b1ef
commit b7692efa35
2 changed files with 32 additions and 96 deletions

View file

@ -61,53 +61,9 @@ def main ():
owm = OwmForecasts.OwmForecasts(api_key) owm = OwmForecasts.OwmForecasts(api_key)
design.add_weather(OwmForecasts.OwmForecasts(api_key)) design.add_weather(OwmForecasts.OwmForecasts(api_key))
debug.print_line('Fetching events from your calendar' + '\n')
events_cal = IcalEvents.IcalEvents(ical_urls)
design.add_calendar(events_cal)
#"""Filter upcoming events from your iCalendar/s"""
#debug.print_line('Fetching events from your calendar' + '\n')
#events_cal = IcalEvents.IcalEvents(ical_urls)
#for event in events_cal.get_month_events():
# debug.print_event(event)
#upcoming = events_cal.get_upcoming_events()
#events_this_month = events_cal.get_month_events()
#events_this_month = [event.begin_datetime.day for event in events_this_month]
#def takeDate (elem):
# return elem.begin_datetime
#upcoming.sort(key=takeDate)
#del upcoming[4:]
## uncomment the following 2 lines to display the fetched events
## from your iCalendar
#debug.print_line('Upcoming events:')
#debug.print_line(upcoming)
#debug.print_line('Month events:')
#debug.print_line(events_this_month)
##Credit to Hubert for suggesting truncating event names ##Credit to Hubert for suggesting truncating event names
#def write_text_left (box_width, box_height, text, tuple): #def write_text_left (box_width, box_height, text, tuple):
@ -127,42 +83,6 @@ def main ():
#for events in range(len(upcoming)): #for events in range(len(upcoming)):
# write_text_left(314, 25, (upcoming[events].title), event_positions['e' + str(events + 1)]) # write_text_left(314, 25, (upcoming[events].title), event_positions['e' + str(events + 1)])
#"""Draw smaller squares on days with events"""
#for numbers in events_this_month:
# if numbers in cal[0]:
# draw(positions['a' + str(cal[0].index(numbers) + 1)], eventicon)
# if numbers in cal[1]:
# draw(positions['b' + str(cal[1].index(numbers) + 1)], eventicon)
# if numbers in cal[2]:
# draw(positions['c' + str(cal[2].index(numbers) + 1)], eventicon)
# if numbers in cal[3]:
# draw(positions['d' + str(cal[3].index(numbers) + 1)], eventicon)
# if numbers in cal[4]:
# draw(positions['e' + str(cal[4].index(numbers) + 1)], eventicon)
# try:
# if numbers in cal[5]:
# draw(positions['f' + str(cal[5].index(numbers) + 1)], eventicon)
# except IndexError:
# pass
#"""Draw a larger square on today's date"""
#today = time.day
#if today in cal[0]:
# draw(positions['a' + str(cal[0].index(today) + 1)], dateicon)
#if today in cal[1]:
# draw(positions['b' + str(cal[1].index(today) + 1)], dateicon)
#if today in cal[2]:
# draw(positions['c' + str(cal[2].index(today) + 1)], dateicon)
#if today in cal[3]:
# draw(positions['d' + str(cal[3].index(today) + 1)], dateicon)
#if today in cal[4]:
# draw(positions['e' + str(cal[4].index(today) + 1)], dateicon)
#try:
# if today in cal[5]:
# draw(positions['f' + str(cal[5].index(today) + 1)], dateicon)
#except IndexError:
# pass
for output in output_adapters: for output in output_adapters:
output.render(design) output.render(design)

View file

@ -1,7 +1,7 @@
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
from WeatherHeaderDesign import WeatherHeaderDesign from WeatherHeaderDesign import WeatherHeaderDesign
from PIL import ImageDraw from PIL import ImageDraw
@ -23,6 +23,7 @@ weekdayrowpos = (0, 0.209)
weekrowboxsize = (1, 0.044) weekrowboxsize = (1, 0.044)
weekdaytextsize = 18 weekdaytextsize = 18
weekrownameboxsize = (0.143, 0.044) weekrownameboxsize = (0.143, 0.044)
eventcirclehorizontalsize = 0.100
class MonthOvPanel (PanelDesign): class MonthOvPanel (PanelDesign):
"""Overview that focuses on the current month and """Overview that focuses on the current month and
@ -33,9 +34,10 @@ class MonthOvPanel (PanelDesign):
def __first_render__ (self): def __first_render__ (self):
if week_starts_on == "Monday": if week_starts_on == "Monday":
calendar.setfirstweekday(calendar.MONDAY) callib.setfirstweekday(callib.MONDAY)
elif week_starts_on == "Sunday": elif week_starts_on == "Sunday":
calendar.setfirstweekday(calendar.SUNDAY) callib.setfirstweekday(callib.SUNDAY)
self.__week_days__ = self.__get_week_days_ordered__()
self.__draw_month_name__() self.__draw_month_name__()
self.__draw_seperator__() self.__draw_seperator__()
@ -45,12 +47,26 @@ class MonthOvPanel (PanelDesign):
def add_weather (self, weather): def add_weather (self, weather):
self.draw_design(WeatherHeaderDesign(self.__abs_pos__(weatherheadersize), weather)) self.draw_design(WeatherHeaderDesign(self.__abs_pos__(weatherheadersize), weather))
def add_calendar (self, calendar):
raise NotImplementedError("Functions needs to be implemented")
def add_rssfeed (self, rss): def add_rssfeed (self, rss):
raise NotImplementedError("Functions needs to be implemented") raise NotImplementedError("Functions needs to be implemented")
def add_calendar (self, calendar):
month_events = list(set([ (event.begin_datetime.day, event.begin_datetime.month, event.begin_datetime.year) for event in calendar.get_month_events()]))
for event in month_events:
self.__draw_highlight_event_day__(event)
def __draw_highlight_event_day__ (self, date):
first_month_week = datetime(date[2], date[1], 1).isocalendar()[1]
cur_date = datetime(date[2], date[1], date[0])
side_length = int(eventcirclehorizontalsize * self.size[0])
circle_size = (side_length,side_length)
pos = self.__get_day_pos__(cur_date.isocalendar()[1] - first_month_week, self.__get_day_of_week__(cur_date))
place_size = self.__abs_pos__(daynumberboxsize)
pos = (int(pos[0] + (place_size[0] - circle_size[0]) / 2), int(pos[1] + (place_size[1] - circle_size[1]) / 2))
self.__draw_highlight_circle__(circle_size, pos, 'red', width=2)
def __abs_pos__ (self, pos, size = None): def __abs_pos__ (self, pos, size = None):
if size is None: if size is None:
size = self.size size = self.size
@ -84,7 +100,7 @@ class MonthOvPanel (PanelDesign):
def __draw_month_overview__ (self): def __draw_month_overview__ (self):
"""Using the built-in calendar function, draw icons for each """Using the built-in calendar function, draw icons for each
number of the month (1,2,3,...28,29,30)""" number of the month (1,2,3,...28,29,30)"""
cal = calendar.monthcalendar(datetime.now().year, datetime.now().month) cal = callib.monthcalendar(datetime.now().year, datetime.now().month)
for week in cal: for week in cal:
for numbers in week: for numbers in week:
self.__draw_day_number__(numbers, self.__get_day_pos__(cal.index(week), week.index(numbers))) self.__draw_day_number__(numbers, self.__get_day_pos__(cal.index(week), week.index(numbers)))
@ -92,14 +108,12 @@ class MonthOvPanel (PanelDesign):
self.__draw_highlight_box__(self.__abs_pos__(dayhighlightboxsize), self.__get_today_box_pos__(), width=3) self.__draw_highlight_box__(self.__abs_pos__(dayhighlightboxsize), self.__get_today_box_pos__(), width=3)
def __draw_week_row__ (self): def __draw_week_row__ (self):
week_days = self.__get_week_days_ordered__() for day_of_week, day in enumerate(self.__week_days__):
for day_of_week, day in enumerate(week_days):
txt = TextDesign(self.__abs_pos__(weekrownameboxsize), fontsize=weekdaytextsize, text=str(day), verticalalignment="center", horizontalalignment="center") txt = TextDesign(self.__abs_pos__(weekrownameboxsize), fontsize=weekdaytextsize, text=str(day), verticalalignment="center", horizontalalignment="center")
txt.pos = self.__get_week_day_pos__(day_of_week) txt.pos = self.__get_week_day_pos__(day_of_week)
self.draw_design(txt) self.draw_design(txt)
self.__draw_highlight_box__(self.__abs_pos__(weekrownameboxsize), self.__get_week_day_pos__(week_days.index(datetime.now().strftime("%a"))), width=1) self.__draw_highlight_box__(self.__abs_pos__(weekrownameboxsize), self.__get_week_day_pos__(self.__get_day_of_week__(datetime.now())), width=1)
def __get_week_day_pos__ (self, day_of_week): def __get_week_day_pos__ (self, day_of_week):
maxwidth, _ = self.__abs_pos__(monthovsize) maxwidth, _ = self.__abs_pos__(monthovsize)
@ -108,10 +122,12 @@ class MonthOvPanel (PanelDesign):
return (int(posx + day_of_week * partialwidth), int(posy)) return (int(posx + day_of_week * partialwidth), int(posy))
def __get_today_box_pos__ (self): def __get_today_box_pos__ (self):
week_days = self.__get_week_days_ordered__() x, y = self.__get_day_pos__(int(datetime.now().day / 7), self.__get_day_of_week__(datetime.now()))
x, y = self.__get_day_pos__(int(datetime.now().day / 7), week_days.index(datetime.now().strftime("%a")))
return (x, int(y + (self.__abs_pos__(daynumberboxsize)[1] - self.__abs_pos__(dayhighlightboxsize)[1]) / 2)) return (x, int(y + (self.__abs_pos__(daynumberboxsize)[1] - self.__abs_pos__(dayhighlightboxsize)[1]) / 2))
def __get_day_of_week__ (self, date):
return self.__week_days__.index(date.strftime("%a"))
def __draw_highlight_box__ (self, size, pos, color='black', width=1): def __draw_highlight_box__ (self, size, pos, color='black', width=1):
design = BoxDesign(size, outline=color, width = width) design = BoxDesign(size, outline=color, width = width)
design.pos = pos design.pos = pos