- dashboard.py: plugin-based renderer with 4x4 grid layout - admin.py: web UI with layout editor + plugin configs - layout.py: pack algorithm, item placement, grid system - plugins/: clock, weather, system, spotify, strava, gmail, minimax, hello - network_watchdog.py: WiFi AP/client mode management - waveshare_epd_init.py: vendor driver stub
71 lines
3.2 KiB
Python
71 lines
3.2 KiB
Python
"""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)
|