Alpha4 polish griglie e login
This commit is contained in:
108
ui_tables.py
Normal file
108
ui_tables.py
Normal file
@@ -0,0 +1,108 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user