Source code for buffalo_panel.app.gui.internal.utils

"""Internal GUI utilities for exporting and formatting."""

from __future__ import annotations

from collections.abc import Iterator
from contextlib import contextmanager
from typing import Any

import matplotlib as mpl
from matplotlib.figure import Figure
from matplotlib.text import Text


[docs] @contextmanager def latex_pgf_export_style(fig: Figure) -> Iterator[None]: """ Remove sans-serif fonts from text before exporting to PGF/TikZ. This context manager updates global matplotlib settings and specific figure text objects to ensure a consistent LaTeX-friendly serif style suitable for PGF/TikZ exports. Original settings and font families are restored upon exit. Parameters ---------- fig : Figure The matplotlib figure being prepared for export. Yields ------ None """ original_rcparams = mpl.rcParams.copy() # Save current font family for all existing text objects. text_objects = fig.findobj(match=Text) original_fontfamilies = [ (text, text.get_fontfamily()) for text in text_objects ] try: mpl.rcParams.update({ "pgf.texsystem": "pdflatex", "text.usetex": True, "pgf.rcfonts": False, "font.family": "serif", "font.serif": [], "font.sans-serif": [], "font.monospace": [], }) for text in text_objects: text.set_fontfamily("serif") yield finally: for text, fontfamily in original_fontfamilies: text.set_fontfamily(fontfamily) mpl.rcParams.update(original_rcparams)
[docs] def build_field_tooltip(meta: dict[str, Any] | None) -> str: """ Build a descriptive tooltip from schema metadata. The tooltip summarizes available field information including help text, notes, value limits, default values, and format hints. Parameters ---------- meta : dict[str, Any] | None Structured metadata for a schema field, typically containing keys such as 'short_help', 'notes', 'minimum', 'maximum', 'default', and 'format_hint'. Returns ------- str A multi-line string suitable for use as a GUI tooltip. Returns an empty string if ``meta`` is None or empty. """ if not meta: return "" parts: list[str] = [] if help_text := meta.get("short_help"): parts.append(str(help_text)) if notes := meta.get("notes"): parts.append(str(notes)) limits: list[str] = [] if (val := meta.get("minimum")) is not None: limits.append(f"min: {val}") if (val := meta.get("exclusive_minimum")) is not None: limits.append(f"min (excl): {val}") if (val := meta.get("maximum")) is not None: limits.append(f"max: {val}") if (val := meta.get("exclusive_maximum")) is not None: limits.append(f"max (excl): {val}") if limits: parts.append("Limits: " + ", ".join(limits)) if (default := meta.get("default")) is not None: parts.append(f"Default: {default}") if hint := meta.get("format_hint"): parts.append(f"Format: {hint}") return "\n".join(parts)