Refactor alerts
This commit is contained in:
parent
084dce621c
commit
606895f63b
3 changed files with 111 additions and 87 deletions
|
|
@ -1,7 +1,7 @@
|
|||
import os
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
from PIL import Image, ImageDraw
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
|
||||
class Config:
|
||||
|
||||
|
|
@ -58,6 +58,7 @@ class Config:
|
|||
|
||||
self.charts_opts = {'style': self.pygal_custom_style, 'show_legend': False, 'margin_right': 7, 'margin_left': 2, 'margin_bottom': 4, 'margin_top': 1}
|
||||
|
||||
|
||||
class RuleModule:
|
||||
|
||||
def __init__(self):
|
||||
|
|
@ -70,3 +71,86 @@ class RuleModule:
|
|||
draw.rectangle((int((1-self.coeff) * width), 0, int(self.coeff * width), height), fill="black")
|
||||
|
||||
return image
|
||||
|
||||
|
||||
class AlertsModule:
|
||||
|
||||
def __init__(self, alerts=[]):
|
||||
self.icon_size = 50
|
||||
self.alerts = alerts
|
||||
|
||||
def draw_module(self, config, width, height):
|
||||
image = Image.new('RGBA', (width, height), "#000")
|
||||
draw = ImageDraw.Draw(image)
|
||||
align = 0
|
||||
|
||||
if len(self.alerts) > 0:
|
||||
fnt_R = ImageFont.truetype(config.fnt_R_path, 16)
|
||||
fnt_B = ImageFont.truetype(config.fnt_RB_path, 16)
|
||||
|
||||
align = 9
|
||||
for alert in self.alerts:
|
||||
if alert["icon"] is not None:
|
||||
color_img = Image.new('RGB', (self.icon_size, self.icon_size), "#fff")
|
||||
icon_img = Image.open("icons/" + alert["icon"]).resize((self.icon_size, self.icon_size))
|
||||
image.paste(color_img, (0, align - 5), icon_img)
|
||||
|
||||
draw.text(
|
||||
((self.icon_size if alert["icon"] is not None else 0) - 5, align),
|
||||
alert["title"],
|
||||
fill="white", anchor="lt", font=fnt_B
|
||||
)
|
||||
if "subtitle" in alert and alert["subtitle"]:
|
||||
draw.text(
|
||||
((self.icon_size if alert["icon"] is not None else 0) + fnt_B.getsize(alert["title"])[0], align + 3),
|
||||
alert["subtitle"],
|
||||
fill="white", anchor="lt", font=fnt_R
|
||||
)
|
||||
|
||||
align += fnt_B.getsize(alert["title"])[1]
|
||||
|
||||
align += display_longtext(
|
||||
draw,
|
||||
(self.icon_size - 5, align),
|
||||
alert["description"],
|
||||
fill="white", font=fnt_R,
|
||||
maxwidth=width-self.icon_size-5
|
||||
)
|
||||
align += 7
|
||||
|
||||
image = image.crop((0,0,width, align))
|
||||
|
||||
return image
|
||||
|
||||
def display_longtext(draw, pos, text, font, anchor="lt", maxwidth=9999, **kwargs):
|
||||
x,y = pos
|
||||
lines = []
|
||||
|
||||
mainlines = text.split("\n")
|
||||
for line in mainlines:
|
||||
words = line.split(" ")
|
||||
|
||||
cur = ""
|
||||
while len(words) > 0:
|
||||
added = (" " if len(cur) > 0 else "") + words[0]
|
||||
width = font.getsize(cur + added)[0]
|
||||
if width < maxwidth:
|
||||
words.pop(0)
|
||||
cur += added
|
||||
else:
|
||||
lines.append(cur)
|
||||
cur = words.pop(0)
|
||||
|
||||
if len(cur) > 0:
|
||||
lines.append(cur)
|
||||
|
||||
line_height = font.getsize("test")[1]
|
||||
if anchor[1] == "m":
|
||||
y -= line_height * len(lines) / 2
|
||||
elif anchor[1] == "b":
|
||||
y -= line_height * len(lines)
|
||||
for line in lines:
|
||||
draw.text((x,y), line, font=font, anchor=anchor, **kwargs)
|
||||
y += line_height
|
||||
|
||||
return line_height * len(lines)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue