"""Shared visual helpers for data grids.""" from __future__ import annotations from tkinter import ttk from typing import Any TABLE_ROW_EVEN = "#FFFFFF" TABLE_ROW_ODD = "#F4F6F8" TABLE_HEADER_BG = "#D1D5DB" TABLE_HEADER_FG = "#111827" TABLE_SELECTED_BG = "#DCEBFF" TABLE_SELECTED_FG = "#111827" def style_treeview( tree: ttk.Treeview, *, style_name: str, rowheight: int = 24, font: Any = ("Segoe UI", 9), heading_font: Any = ("Segoe UI", 9, "bold"), ) -> ttk.Style: """Apply a consistent high-contrast header and zebra-ready style.""" style = ttk.Style(tree) style.configure(style_name, rowheight=rowheight, font=font) style.configure( f"{style_name}.Heading", font=heading_font, background=TABLE_HEADER_BG, foreground=TABLE_HEADER_FG, relief="flat", ) style.map( f"{style_name}.Heading", background=[("active", TABLE_HEADER_BG), ("pressed", TABLE_HEADER_BG)], foreground=[("active", TABLE_HEADER_FG), ("pressed", TABLE_HEADER_FG)], ) style.map( style_name, background=[("selected", TABLE_SELECTED_BG)], foreground=[("selected", TABLE_SELECTED_FG)], ) tree.configure(style=style_name) configure_treeview_zebra_tags(tree) return style def configure_treeview_zebra_tags(tree: ttk.Treeview) -> None: """Register alternating row color tags on a Treeview.""" tree.tag_configure("even", background=TABLE_ROW_EVEN) tree.tag_configure("odd", background=TABLE_ROW_ODD) def zebra_tag(index: int) -> str: """Return the alternating row tag for the given zero-based index.""" return "even" if index % 2 == 0 else "odd" def merge_tags(*tags: str) -> tuple[str, ...]: """Return non-empty tags preserving order.""" return tuple(tag for tag in tags if tag) def apply_tksheet_visual_style(sheet: Any) -> None: """Apply best-effort header contrast and zebra rows to a tksheet widget.""" try: sheet.set_options( header_bg=TABLE_HEADER_BG, header_fg=TABLE_HEADER_FG, header_selected_cells_bg=TABLE_HEADER_BG, header_selected_cells_fg=TABLE_HEADER_FG, table_bg=TABLE_ROW_EVEN, table_fg="#111827", selected_rows_bg=TABLE_SELECTED_BG, selected_rows_fg=TABLE_SELECTED_FG, selected_cells_bg=TABLE_SELECTED_BG, selected_cells_fg=TABLE_SELECTED_FG, ) except Exception: pass def apply_tksheet_zebra(sheet: Any, row_count: int) -> None: """Apply alternating row colors to a tksheet widget when supported.""" try: sheet.dehighlight_rows(redraw=False) except Exception: pass for row_index in range(row_count): try: sheet.highlight_rows( rows=[row_index], bg=TABLE_ROW_EVEN if row_index % 2 == 0 else TABLE_ROW_ODD, redraw=False, ) except Exception: break try: sheet.redraw() except Exception: pass