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)