112 lines
4 KiB
Python
112 lines
4 KiB
Python
from DesignEntity import DesignEntity
|
|
from TextDesign import TextDesign
|
|
from TableDesign import TableDesign
|
|
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_ypos = icon_x_ypos + icon_width
|
|
info_yresize = -0.05
|
|
fontsize_static = defaultfontsize
|
|
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_infos__(self.forecast)
|
|
|
|
def __draw_infos__(self, forecast):
|
|
temperature = forecast.air_temperature + \
|
|
" " + self.__get_unit__(("°C", "°F"))
|
|
humidity = forecast.air_humidity + "%"
|
|
if forecast.units == "aviation":
|
|
if forecast.wind_deg == None:
|
|
forecast.wind_deg = ""
|
|
elif len(forecast.wind_deg) == 1:
|
|
forecast.wind_deg = "00" + forecast.wind_deg
|
|
elif len(forecast.wind_deg) == 2:
|
|
forecast.wind_deg = "0" + forecast.wind_deg
|
|
if int(forecast.wind_speed) < 10:
|
|
windspeed = forecast.wind_deg + "@" + "0" + forecast.wind_speed + \
|
|
self.__get_unit__(
|
|
("", "")) # added degrees, if wind<10 add a 0 to make two digit
|
|
else:
|
|
windspeed = forecast.wind_deg + "@" + forecast.wind_speed + \
|
|
self.__get_unit__(("", "")) # added degrees
|
|
else:
|
|
windspeed = forecast.wind_speed + " " + \
|
|
self.__get_unit__(("km/h", "mph"))
|
|
|
|
numbers_list = [[forecast.short_description],
|
|
[temperature],
|
|
[humidity],
|
|
[windspeed]]
|
|
|
|
ypos = info_x_ypos * self.size[0]
|
|
pos = (0, ypos)
|
|
size = (self.size[0], self.size[1] +
|
|
info_yresize * self.size[1] - pos[1])
|
|
line_spacing = (size[1] - len(numbers_list) *
|
|
fontsize_static) / (len(numbers_list) + 1)
|
|
|
|
table = TableDesign(size, numbers_list, fontsize=fontsize_static, line_spacing=line_spacing, column_horizontal_alignments=[
|
|
"center"], max_col_size=[size[0]], truncate_text=False, truncate_rows=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" or self.forecast.units == "aviation":
|
|
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')
|