"""Clock: Uhrzeit + Datum. Responsive fuer alle Slot-Groessen.""" import os, sys from datetime import datetime sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..")) from plugins.base import Widget from palette import FG, INFO, ACCENT, measure, fit_font, centered_text, is_small, is_wide class Widget(Widget): name = "clock" label = "Uhrzeit / Datum" description = "Aktuelle Uhrzeit und Datum. Responsives Layout fuer 1x1 bis 4x4." category = "info" config_schema = [ {"key": "format_24h", "label": "24-Stunden-Format", "type": "bool", "default": True}, {"key": "show_seconds", "label": "Sekunden anzeigen", "type": "bool", "default": False}, {"key": "show_date", "label": "Datum anzeigen", "type": "bool", "default": True}, {"key": "show_weekday", "label": "Wochentag anzeigen", "type": "bool", "default": True}, {"key": "accent_color", "label": "Akzentfarbe", "type": "select", "choices": ["fg", "info", "accent", "ok", "warn", "alert"], "default": "fg"}, ] default_config = {"format_24h": True, "show_seconds": False, "show_date": True, "show_weekday": True, "accent_color": "fg"} def fetch(self): return {} def render(self, draw, fonts, x, y, w, h): from palette import fill_for, measure now = datetime.now() pad = 8 accent = fill_for(self.cfg("accent_color", "fg")) time_str = now.strftime("%H:%M:%S" if self.cfg("show_seconds") else "%H:%M") date_str = now.strftime("%d %b %Y") day_str = now.strftime("%A").upper() if is_small(w, h): # mini: nur Uhr, zentriert font = fit_font(draw, time_str, fonts, w - 2 * pad, h - 2 * pad) centered_text(draw, time_str, x, y, w, h, font, FG) return if is_wide(w, h): # Wide strip: Uhrzeit links gross, Datum rechts klein font_time = fit_font(draw, time_str, fonts, w // 2 - 2 * pad, h - 2 * pad) centered_text(draw, time_str, x, y, w // 2, h, font_time, FG) if self.cfg("show_date"): font_date = fit_font(draw, date_str, fonts, w // 2 - 2 * pad, h // 2) centered_text(draw, date_str, x + w // 2, y, w // 2, h // 2, font_date, accent) if self.cfg("show_weekday"): font_day = fit_font(draw, day_str, fonts, w // 2 - 2 * pad, h // 2) centered_text(draw, day_str, x + w // 2, y + h // 2, w // 2, h // 2, font_day, INFO) return # Standard: Header (Datum), Big Time, Day unten # Big Time zentriert font_time = fit_font(draw, time_str, fonts, w - 2 * pad, int(h * 0.55)) centered_text(draw, time_str, x, y + pad, w, int(h * 0.55), font_time, FG) # Datum darunter if self.cfg("show_date"): font_date = fit_font(draw, date_str, fonts, w - 2 * pad, h // 5) centered_text(draw, date_str, x, y + int(h * 0.55), w, h // 5, font_date, accent) # Wochentag if self.cfg("show_weekday"): font_day = fit_font(draw, day_str, fonts, w - 2 * pad, h // 6) centered_text(draw, day_str, x, y + int(h * 0.78), w, h // 6, font_day, INFO)