"""Windows tree renderer.""" from __future__ import annotations from collections.abc import Iterable, Mapping from rich.console import Console from rich.tree import Tree from browser_cli.commands.rendering.common import Row, int_value, item_value, text_value, tree_title_limit, tree_url_limit from browser_cli.commands.rendering.labels import tab_tree_label WindowRow = Mapping[str, object] def build_windows_tree(windows: Iterable[WindowRow], tabs: Iterable[Row], *, console: Console) -> Tree: """Build a window → tab tree from window and tab responses.""" windows = list(windows) tabs = list(tabs) title_limit = tree_title_limit(console=console, show_browser=any("browser" in w for w in windows), show_urls=True) url_limit = tree_url_limit(title_limit, console=console) root = Tree("[bold]Windows[/bold]") for window in sorted(windows, key=lambda item: (text_value(item.get("browser")), int_value(item.get("id")))): window_id = int_value(window.get("id")) label = f"Window {window_id}" alias = text_value(window.get("alias")) browser = text_value(window.get("browser")) if alias: label += f" ({alias})" if browser: label = f"{browser}: " + label node = root.add(label) window_tabs = [ tab for tab in tabs if int_value(item_value(tab, "window_id", item_value(tab, "windowId"))) == window_id and (not browser or text_value(item_value(tab, "browser")) == browser) ] for tab in sorted(window_tabs, key=lambda item: int_value(item_value(item, "index", 0))): node.add(tab_tree_label(tab, title_limit=title_limit, show_urls=True, url_limit=url_limit)) return root