fix missing translation
add material-icons font use icon for all-day events
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								fonts/MaterialIcons/MaterialIcons.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								fonts/MaterialIcons/MaterialIcons.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -41,18 +41,9 @@ def get_json_from_url(request_url): | ||||
|  | ||||
|  | ||||
| class OpenWeatherMap: | ||||
|     def __init__( | ||||
|         self, | ||||
|         api_key: str, | ||||
|         city_id: int = None, | ||||
|         lat: float = None, | ||||
|         lon: float = None, | ||||
|         api_version: API_VERSIONS = "2.5", | ||||
|         temp_unit: TEMP_UNITS = "celsius", | ||||
|         wind_unit: WIND_UNITS = "meters_sec", | ||||
|         language: str = "en", | ||||
|         tz_name: str = "UTC", | ||||
|     ) -> None: | ||||
|     def __init__(self, api_key: str, city_id: int = None, lat: float = None, lon: float = None, | ||||
|                  api_version: API_VERSIONS = "2.5", temp_unit: TEMP_UNITS = "celsius", | ||||
|                  wind_unit: WIND_UNITS = "meters_sec", language: str = "en", tz_name: str = "UTC") -> None: | ||||
|         self.api_key = api_key | ||||
|         self.temp_unit = temp_unit | ||||
|         self.wind_unit = wind_unit | ||||
| @@ -187,7 +178,7 @@ class OpenWeatherMap: | ||||
|         :return: | ||||
|             Forecast dictionary | ||||
|         """ | ||||
|         # Make sure hourly forecasts are up to date | ||||
|         # Make sure hourly forecasts are up-to-date | ||||
|         _ = self.get_weather_forecast() | ||||
|  | ||||
|         # Calculate the start and end times for the specified number of days from now | ||||
| @@ -207,7 +198,7 @@ class OpenWeatherMap: | ||||
|         ] | ||||
|  | ||||
|         # In case the next available forecast is already for the next day, use that one for the less than 3 remaining hours of today | ||||
|         if forecasts == []: | ||||
|         if not forecasts: | ||||
|             forecasts.append(self.hourly_forecasts[0]) | ||||
|  | ||||
|         # Get rain and temperatures for that day | ||||
|   | ||||
| @@ -77,6 +77,8 @@ class Agenda(inkycal_module): | ||||
|         # Additional config | ||||
|         self.timezone = get_system_tz() | ||||
|  | ||||
|         self.icon_font = ImageFont.truetype(fonts['MaterialIcons'], size=self.fontsize) | ||||
|  | ||||
|         # give an OK message | ||||
|         print(f'{__name__} loaded') | ||||
|  | ||||
| @@ -203,10 +205,10 @@ class Agenda(inkycal_module): | ||||
|                         write(im_black, (x_time, line_pos[cursor][1]), | ||||
|                               (time_width, line_height), time, | ||||
|                               font=self.font, alignment='right') | ||||
|                     if parser.all_day(_): | ||||
|                     else: | ||||
|                         write(im_black, (x_time, line_pos[cursor][1]), | ||||
|                               (time_width, line_height), "all day", | ||||
|                               font=self.font, alignment='right') | ||||
|                               (time_width, line_height), "\ue878", | ||||
|                               font=self.icon_font, alignment='right') | ||||
|  | ||||
|                     write(im_black, (x_event, line_pos[cursor][1]), | ||||
|                           (event_width, line_height), | ||||
|   | ||||
| @@ -2,12 +2,12 @@ | ||||
| Inkycal weather module | ||||
| Copyright by aceinnolab | ||||
| """ | ||||
|  | ||||
| import arrow | ||||
| import decimal | ||||
| import logging | ||||
| import math | ||||
| from typing import Tuple | ||||
|  | ||||
| import arrow | ||||
| from PIL import Image | ||||
| from PIL import ImageDraw | ||||
| from PIL import ImageFont | ||||
| @@ -51,7 +51,7 @@ class Weather(inkycal_module): | ||||
|             "options": [True, False], | ||||
|         }, | ||||
|  | ||||
|         "round_windspeed": { | ||||
|         "round_wind_speed": { | ||||
|             "label": "Round windspeed?", | ||||
|             "options": [True, False], | ||||
|         }, | ||||
| @@ -89,7 +89,7 @@ class Weather(inkycal_module): | ||||
|  | ||||
|         # Check if all required parameters are present | ||||
|         for param in self.requires: | ||||
|             if not param in config: | ||||
|             if param not in config: | ||||
|                 raise Exception(f'config is missing {param}') | ||||
|  | ||||
|         # required parameters | ||||
| @@ -98,7 +98,7 @@ class Weather(inkycal_module): | ||||
|  | ||||
|         # optional parameters | ||||
|         self.round_temperature = config['round_temperature'] | ||||
|         self.round_windspeed = config['round_windspeed'] | ||||
|         self.round_wind_speed = config['round_windspeed'] | ||||
|         self.forecast_interval = config['forecast_interval'] | ||||
|         self.hour_format = int(config['hour_format']) | ||||
|         if config['units'] == "imperial": | ||||
| @@ -106,7 +106,7 @@ class Weather(inkycal_module): | ||||
|         else: | ||||
|             self.temp_unit = "celsius" | ||||
|  | ||||
|         if config['use_beaufort'] == True: | ||||
|         if config['use_beaufort']: | ||||
|             self.wind_unit = "beaufort" | ||||
|         elif config['units'] == "imperial": | ||||
|             self.wind_unit = "miles_hour" | ||||
| @@ -145,8 +145,6 @@ class Weather(inkycal_module): | ||||
|         # give an OK message | ||||
|         print(f"{__name__} loaded") | ||||
|  | ||||
|      | ||||
|  | ||||
|     def generate_image(self): | ||||
|         """Generate image for this module""" | ||||
|  | ||||
| @@ -190,7 +188,7 @@ class Weather(inkycal_module): | ||||
|                 7: '\uf0ae' | ||||
|             }[int(index) & 7] | ||||
|  | ||||
|         def is_negative(temp:str): | ||||
|         def is_negative(temp: str): | ||||
|             """Check if temp is below freezing point of water (0°C/32°F) | ||||
|             returns True if temp below freezing point, else False""" | ||||
|             answer = False | ||||
| @@ -223,12 +221,19 @@ class Weather(inkycal_module): | ||||
|             '50n': '\uf023' | ||||
|         } | ||||
|  | ||||
|         def draw_icon(image, xy, box_size, icon, rotation=None): | ||||
|             """Custom function to add icons of weather font on image | ||||
|             image = on which image should the text be added? | ||||
|             xy = xy-coordinates as tuple -> (x,y) | ||||
|             box_size = size of text-box -> (width,height) | ||||
|             icon = icon-unicode, looks this up in weathericons dictionary | ||||
|         def draw_icon(image: Image, xy: Tuple[int, int], box_size: Tuple[int, int], icon: str, rotation=None): | ||||
|             """Custom function to add icons of weather font on the image. | ||||
|  | ||||
|             Args: | ||||
|                 - image: | ||||
|                     the image on which image should the text be added | ||||
|                 - xy: | ||||
|                     coordinates as tuple -> (x,y) | ||||
|                 - box_size: | ||||
|                     size of text-box -> (width,height) | ||||
|                 - icon: | ||||
|                     icon-unicode, looks this up in weather-icons dictionary | ||||
|  | ||||
|             """ | ||||
|  | ||||
|             icon_size_correction = { | ||||
| @@ -263,7 +268,6 @@ class Weather(inkycal_module): | ||||
|                 '\uf0a0': 0, | ||||
|                 '\uf0a3': 0, | ||||
|                 '\uf0a7': 0, | ||||
|                 '\uf0aa': 0, | ||||
|                 '\uf0ae': 0 | ||||
|             } | ||||
|  | ||||
| @@ -277,8 +281,7 @@ class Weather(inkycal_module): | ||||
|             font = ImageFont.truetype(font.path, size) | ||||
|             text_width, text_height = font.getbbox(text)[2:] | ||||
|  | ||||
|             while (text_width < int(box_width * 0.9) and | ||||
|                    text_height < int(box_height * 0.9)): | ||||
|             while text_width < int(box_width * 0.9) and text_height < int(box_height * 0.9): | ||||
|                 size += 1 | ||||
|                 font = ImageFont.truetype(font.path, size) | ||||
|                 text_width, text_height = font.getbbox(text)[2:] | ||||
| @@ -289,8 +292,6 @@ class Weather(inkycal_module): | ||||
|             x = int((box_width / 2) - (text_width / 2)) | ||||
|             y = int((box_height / 2) - (text_height / 2)) | ||||
|  | ||||
|             # Draw the text in the text-box | ||||
|             draw = ImageDraw.Draw(image) | ||||
|             space = Image.new('RGBA', (box_width, box_height)) | ||||
|             ImageDraw.Draw(space).text((x, y), text, fill='black', font=font) | ||||
|  | ||||
| @@ -349,17 +350,17 @@ class Weather(inkycal_module): | ||||
|         row3 = row2 + line_gap + row_height | ||||
|  | ||||
|         # Draw lines on each row and border | ||||
|         ############################################################################ | ||||
|         ##    draw = ImageDraw.Draw(im_black) | ||||
|         ##    draw.line((0, 0, im_width, 0), fill='red') | ||||
|         ##    draw.line((0, im_height-1, im_width, im_height-1), fill='red') | ||||
|         ##    draw.line((0, row1, im_width, row1), fill='black') | ||||
|         ##    draw.line((0, row1+row_height, im_width, row1+row_height), fill='black') | ||||
|         ##    draw.line((0, row2, im_width, row2), fill='black') | ||||
|         ##    draw.line((0, row2+row_height, im_width, row2+row_height), fill='black') | ||||
|         ##    draw.line((0, row3, im_width, row3), fill='black') | ||||
|         ##    draw.line((0, row3+row_height, im_width, row3+row_height), fill='black') | ||||
|         ############################################################################ | ||||
|         ########################################################################### | ||||
|         #    draw = ImageDraw.Draw(im_black) | ||||
|         #    draw.line((0, 0, im_width, 0), fill='red') | ||||
|         #    draw.line((0, im_height-1, im_width, im_height-1), fill='red') | ||||
|         #    draw.line((0, row1, im_width, row1), fill='black') | ||||
|         #    draw.line((0, row1+row_height, im_width, row1+row_height), fill='black') | ||||
|         #    draw.line((0, row2, im_width, row2), fill='black') | ||||
|         #    draw.line((0, row2+row_height, im_width, row2+row_height), fill='black') | ||||
|         #    draw.line((0, row3, im_width, row3), fill='black') | ||||
|         #    draw.line((0, row3+row_height, im_width, row3+row_height), fill='black') | ||||
|         ########################################################################### | ||||
|  | ||||
|         # Positions for current weather details | ||||
|         weather_icon_pos = (col1, 0) | ||||
| @@ -378,24 +379,24 @@ class Weather(inkycal_module): | ||||
|         sunset_time_pos = (col3 + icon_small, row3) | ||||
|  | ||||
|         # Positions for forecast 1 | ||||
|         stamp_fc1 = (col4, row1) | ||||
|         icon_fc1 = (col4, row1 + row_height) | ||||
|         temp_fc1 = (col4, row3) | ||||
|         stamp_fc1 = (col4, row1) # noqa | ||||
|         icon_fc1 = (col4, row1 + row_height) # noqa | ||||
|         temp_fc1 = (col4, row3) # noqa | ||||
|  | ||||
|         # Positions for forecast 2 | ||||
|         stamp_fc2 = (col5, row1) | ||||
|         icon_fc2 = (col5, row1 + row_height) | ||||
|         temp_fc2 = (col5, row3) | ||||
|         stamp_fc2 = (col5, row1) # noqa | ||||
|         icon_fc2 = (col5, row1 + row_height) # noqa | ||||
|         temp_fc2 = (col5, row3) # noqa | ||||
|  | ||||
|         # Positions for forecast 3 | ||||
|         stamp_fc3 = (col6, row1) | ||||
|         icon_fc3 = (col6, row1 + row_height) | ||||
|         temp_fc3 = (col6, row3) | ||||
|         stamp_fc3 = (col6, row1) # noqa | ||||
|         icon_fc3 = (col6, row1 + row_height) # noqa | ||||
|         temp_fc3 = (col6, row3) # noqa | ||||
|  | ||||
|         # Positions for forecast 4 | ||||
|         stamp_fc4 = (col7, row1) | ||||
|         icon_fc4 = (col7, row1 + row_height) | ||||
|         temp_fc4 = (col7, row3) | ||||
|         stamp_fc4 = (col7, row1) # noqa | ||||
|         icon_fc4 = (col7, row1 + row_height) # noqa | ||||
|         temp_fc4 = (col7, row3) # noqa | ||||
|  | ||||
|         # Create current-weather and weather-forecast objects | ||||
|         logging.debug('looking up location by ID') | ||||
| @@ -404,7 +405,7 @@ class Weather(inkycal_module): | ||||
|  | ||||
|         # Set decimals | ||||
|         dec_temp = 0 if self.round_temperature == True else 1 | ||||
|         dec_wind = 0 if self.round_windspeed == True else 1 | ||||
|         dec_wind = 0 if self.round_wind_speed == True else 1 | ||||
|  | ||||
|         logging.debug(f'temperature unit: {self.temp_unit}') | ||||
|         logging.debug(f'decimals temperature: {dec_temp} | decimals wind: {dec_wind}') | ||||
| @@ -424,7 +425,8 @@ class Weather(inkycal_module): | ||||
|                 fc_data['fc' + str(index + 1)] = { | ||||
|                     'temp': f"{forecast['temp']:.{dec_temp}f}{self.tempDispUnit}", | ||||
|                     'icon': forecast["icon"], | ||||
|                     'stamp': forecast["datetime"].strftime("%I %p" if self.hour_format == 12 else "%H:%M")} | ||||
|                     'stamp': forecast["datetime"].strftime("%I %p" if self.hour_format == 12 else "%H:%M") | ||||
|                 } | ||||
|  | ||||
|         elif self.forecast_interval == 'daily': | ||||
|  | ||||
| @@ -433,7 +435,7 @@ class Weather(inkycal_module): | ||||
|             daily_forecasts = [self.owm.get_forecast_for_day(days) for days in range(1, 5)] | ||||
|  | ||||
|             for index, forecast in enumerate(daily_forecasts): | ||||
|                 fc_data['fc' + str(index +1)] = { | ||||
|                 fc_data['fc' + str(index + 1)] = { | ||||
|                     'temp': f'{forecast["temp_min"]:.{dec_temp}f}{self.tempDispUnit}/{forecast["temp_max"]:.{dec_temp}f}{self.tempDispUnit}', | ||||
|                     'icon': forecast['icon'], | ||||
|                     'stamp': forecast['datetime'].strftime("%A") | ||||
| @@ -513,6 +515,9 @@ class Weather(inkycal_module): | ||||
|         # Add the forecast data to the correct places | ||||
|         for pos in range(1, len(fc_data) + 1): | ||||
|             stamp = fc_data[f'fc{pos}']['stamp'] | ||||
|             # check if we're using daily forecasts | ||||
|             if "day" in stamp: | ||||
|                 stamp = arrow.get(fc_data[f'fc{pos}']['stamp'], "dddd").format("dddd", locale="de") | ||||
|  | ||||
|             icon = weather_icons[fc_data[f'fc{pos}']['icon']] | ||||
|             temp = fc_data[f'fc{pos}']['temp'] | ||||
|   | ||||
| @@ -37,7 +37,7 @@ tests = [ | ||||
|             "size": [500, 800], | ||||
|             "ical_urls": sample_url, | ||||
|             "ical_files": None, | ||||
|             "date_format": "ddd D MMM", | ||||
|             "date_format": "DD.MMMM YYYY", | ||||
|             "time_format": "HH:mm", | ||||
|             "padding_x": 10, | ||||
|             "padding_y": 10, | ||||
|   | ||||
| @@ -34,7 +34,7 @@ tests = [ | ||||
|             "padding_x": 10, | ||||
|             "padding_y": 10, | ||||
|             "fontsize": 12, | ||||
|             "language": "en" | ||||
|             "language": "de" | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user