E-Paper-Calendar/Calendar/WeatherColumnDesign.py
2019-04-08 15:42:30 +02:00

105 lines
No EOL
3.7 KiB
Python

from DesignEntity import DesignEntity
from TextDesign import TextDesign
from TableTextDesign import TableTextDesign
from Assets import wpath, weathericons, tempicon, humicon, windicon, no_response, colors, defaultfontsize
from PIL import Image
from settings import hours
icon_xpos = 0.1
icon_x_ypos = 0
icon_width = 1 - 2 * icon_xpos
info_x_height = icon_width * 0.3
info_x_ypos = icon_x_ypos + icon_width
fontsize_static = defaultfontsize
numbers_x_ypos = icon_x_ypos + icon_width + info_x_height + 0.2
numbers_x_ypadding = 0.05
max_symbol_y_width = 0.15
class WeatherColumnDesign (DesignEntity):
"""Displays weather information in a column"""
def __init__ (self, size, forecast):
super().__init__(size)
self.forecast = forecast
def __finish_image__ (self):
if self.forecast is None:
self.__draw_no_response__()
return
self.__draw_icon__(self.forecast.icon)
self.__draw_info__(self.forecast.short_description)
self.__draw_numbers_text__(self.forecast)
def __draw_info__ (self, info):
height = info_x_height * self.size[0]
ypos = info_x_ypos * self.size[0]
size = (self.size[0], height)
pos = (0, ypos)
txt = TextDesign(size, text=info, fontsize=fontsize_static, horizontalalignment="center")
txt.pos = pos
self.draw_design(txt)
def __draw_numbers_text__ (self, forecast):
temperature = forecast.air_temperature + " " + self.__get_unit__(("°C", "°F"))
humidity = forecast.air_humidity + "%"
windspeed = forecast.wind_speed + " " + self.__get_unit__(("km/h", "mph"))
sunrise = self.__get_time__(forecast.sunrise)
sunset = self.__get_time__(forecast.sunset)
numbers_list = [ [ temperature ],
[ humidity ],
[ windspeed ] ]
fontsize = fontsize_static
ypos = numbers_x_ypos * self.size[0]
pos = (0, ypos)
size = (self.size[0], self.size[1] - pos[1])
line_spacing = (size[1] - len(numbers_list) * fontsize) / len(numbers_list) / 1.3
table = TableTextDesign(size, numbers_list, fontsize=fontsize, line_spacing=line_spacing, column_horizontal_alignments=[ "center" ], max_col_size=[ size[0] ], truncate_rows=False, truncate_text=False)
table.pos = pos
self.draw_design(table)
def __draw_icon__ (self, icon_id):
width = int(icon_width * self.size[0])
size = (width, width)
xpos = icon_xpos * self.size[0]
ypos = icon_x_ypos * self.size[0]
pos = (xpos, ypos)
self.__draw_resized_path_at__(wpath + weathericons[icon_id] + ".jpeg", pos, size)
def __draw_no_response__ (self):
width = int(icon_width * self.size[0])
size = (width, width)
xpos = icon_xpos * self.size[0]
ypos = icon_x_ypos * self.size[0]
pos = (xpos, ypos)
self.__draw_resized_image_at__(no_response, pos, size)
def __draw_resized_path_at__ (self, path, pos, size):
img = Image.open(path)
self.__draw_resized_image_at__(img, pos, size)
def __draw_resized_image_at__ (self, img, pos, size):
size = (int(size[0]), int(size[1]))
resized_img = img.resize(size, resample=Image.LANCZOS)
self.draw(resized_img, pos)
def __get_unit__ (self, tuple):
if self.forecast.units == "metric":
return tuple[0]
else:
return tuple[1]
def __abs_co__ (self, coordinates):
return (coordinates[0] * self.size[0], coordinates[1] * self.size[1])
def __get_time__ (self, time):
if hours == "24":
return time.strftime('%H:%M')
else:
return time.strftime('%I:%M')