From 64f0e74105be6a082a4b66f7d85c374a7e18d2f3 Mon Sep 17 00:00:00 2001 From: Stu Leak Date: Mon, 3 Nov 2025 11:11:26 -0500 Subject: [PATCH] =?UTF-8?q?v0.1.2=20=E2=80=94=20Header=20finalized=20with?= =?UTF-8?q?=20background=20color=20and=20live=20clock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 6 ++++ src/core/telefact_footer.py | 71 +++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/main.py b/main.py index 5c7ce73..8f24d67 100644 --- a/main.py +++ b/main.py @@ -7,11 +7,13 @@ # ============================================================ import tkinter as tk + from src.config_manager import ConfigManager from src.telefact_renderer import TelefactRenderer from src.core.telefact_frame import TelefactFrame from src.core.telefact_formatter import TelefactFormatter from src.core.telefact_header import TelefactHeader +from src.core.telefact_footer import TelefactFooter def main(): @@ -39,6 +41,10 @@ def main(): header.render() header.update_time(root, renderer) + # --- Initialize footer --- + footer = TelefactFooter(frame, config) + footer.render_test_footer() + # --- Body & footer test content --- formatter = TelefactFormatter(frame) formatter.add_body_line(1, "Welcome to the Telefact Broadcaster base.", align="center", color="white") diff --git a/src/core/telefact_footer.py b/src/core/telefact_footer.py index e69de29..1374e97 100644 --- a/src/core/telefact_footer.py +++ b/src/core/telefact_footer.py @@ -0,0 +1,71 @@ +# ============================================================ +# File: /home/stu/Projects/Local REPO/telefact/src/core/telefact_footer.py +# Description: +# Dynamic Telefact footer renderer for broadcaster mode. +# Draws a single bottom-row text band with background color +# and per-page contextual support. +# ============================================================ + +from src.core.telefact_frame import TelefactFrame + + +class TelefactFooter: + """ + Ceefax-style footer (bottom band). + Example: + ┌────────────────────────────────────────────────────────┐ + │ Telefact: The world at your fingertips │ + └────────────────────────────────────────────────────────┘ + """ + + def __init__(self, frame: TelefactFrame, config: dict): + self.frame = frame + self.config = config + + # default colors from global config + colours = config.get("Colours", {}) + self.default_bg = colours.get("Footer", "blue") + self.default_fg = colours.get("TextPrimary", "white") + + # reserved footer row (last visible line) + self.row = frame.rows - 1 + + # -------------------------------------------------------- + def clear_footer(self, bg: str | None = None): + """Clears the footer line with background fill.""" + bg_color = bg or self.default_bg + for c in range(self.frame.cols): + self.frame.set_cell(c, self.row, " ", self.default_fg, bg_color) + + # -------------------------------------------------------- + def set_footer(self, text: str, align: str = "left", fg: str | None = None, bg: str | None = None): + """Draw a footer message with color and alignment control.""" + fg_color = fg or self.default_fg + bg_color = bg or self.default_bg + self.clear_footer(bg_color) + + text = text.strip() + text_len = len(text) + + # --- Alignment handling --- + if align == "center": + start_col = (self.frame.cols - text_len) // 2 + elif align == "right": + start_col = max(self.frame.cols - text_len - 1, 0) + else: + start_col = 1 + + # --- Background fill --- + for c in range(self.frame.cols): + self.frame.set_cell(c, self.row, " ", fg_color, bg_color) + + # --- Text overlay --- + for i, ch in enumerate(text): + pos = start_col + i + if 0 <= pos < self.frame.cols: + self.frame.set_cell(pos, self.row, ch, fg_color) + + # -------------------------------------------------------- + def render_test_footer(self): + """Temporary demo for testing footer display.""" + self.set_footer("Telefact: The world at your fingertips", align="left", fg="yellow", bg="blue")