Lines Matching +full:in +full:- +full:tree
2 # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
18 from textual.widgets import Button, Footer, Header, Input, Label, Sparkline, Static, Tree
19 from textual.widgets.tree import TreeNode
23 return (info[key] + "\n") if key in info else ""
27 """Abstraction for the data of value in the tree."""
30 def name(self) -> str:
34 def description(self) -> str:
38 def matches(self, query: str) -> bool:
42 def parse(self) -> perf.evlist:
46 def value(self, evlist: perf.evlist, evsel: perf.evsel, cpu: int, thread: int) -> float:
52 """A metric in the tree."""
55 def name(self) -> str:
58 def description(self) -> str:
60 for metric in perf.metrics():
70 def matches(self, query: str) -> bool:
71 return query in self.metric_name
73 def parse(self) -> perf.evlist:
76 def value(self, evlist: perf.evlist, evsel: perf.evsel, cpu: int, thread: int) -> float:
83 """A PMU and event within the tree."""
87 def name(self) -> str:
88 if self.event.startswith(self.pmu) or ':' in self.event:
93 def description(self) -> str:
95 for p in perf.pmus():
98 for info in p.events():
99 if "name" not in info or info["name"] != self.event:
110 def matches(self, query: str) -> bool:
111 return query in self.pmu or query in self.event
113 def parse(self) -> perf.evlist:
116 def value(self, evlist: perf.evlist, evsel: perf.evsel, cpu: int, thread: int) -> float:
133 def compose(self) -> ComposeResult:
136 def on_button_pressed(self, event: Button.Pressed) -> None:
146 margin-top: 1;
153 def compose(self) -> ComposeResult:
156 def on_input_submitted(self, event: Input.Submitted) -> None:
157 """Handle the user pressing Enter in the input field."""
170 def __init__(self, cpu: int) -> None:
174 def compose(self) -> ComposeResult:
183 def __init__(self, cpu: int) -> None:
187 def compose(self) -> ComposeResult:
211 #sparkline_total > .sparkline--min-color {
214 #sparkline_total > .sparkline--max-color {
218 * Make the active_search initially not displayed with the text in
224 text-align: center;
228 def __init__(self, interval: float) -> None:
236 def expand_and_select(self, node: TreeNode[Any]) -> None:
237 """Expand select a node in the tree."""
243 node.tree.select_node(node)
244 node.tree.scroll_to_node(node)
246 def set_searched_tree_node(self, previous: bool) -> None:
251 tree: Tree[TreeValue] = self.query_one("#root", Tree)
253 tree.action_cursor_up()
255 tree.action_cursor_down()
261 idx = idx - 1 if idx > 0 else l - 1
263 idx = idx + 1 if idx < l - 1 else 0
265 idx = l - 1 if previous else 0
274 def action_search(self) -> None:
276 def set_initial_focus(event: str | None) -> None:
286 tree: Tree[str] = self.query_one("#root", Tree)
291 ) -> Tuple[bool, Optional[TreeNode[str]]]:
293 if not cursor_seen and node == tree.cursor_node:
301 for child in node.children:
307 (_, self.cur_search_result) = find_search_results(event, tree.root)
318 def action_next(self) -> None:
322 def action_prev(self) -> None:
326 def action_collapse(self) -> None:
327 """Collapse the part of the tree currently on."""
328 tree: Tree[str] = self.query_one("#root", Tree)
329 node = tree.cursor_node
332 node.tree.scroll_to_node(node.parent)
334 def update_counts(self) -> None:
361 for evsel in self.evlist:
362 for cpu in evsel.cpus():
364 for thread in evsel.threads():
368 update_count(-1, total)
371 def on_mount(self) -> None:
376 def set_selected(self, value: TreeValue) -> None:
394 for line in old_lines:
397 for counter in old_counters:
420 line = CounterSparkline(cpu=-1)
422 for cpu in self.evlist.all_cpus():
425 line = Counter(cpu=-1)
427 for cpu in self.evlist.all_cpus():
431 def compose(self) -> ComposeResult:
433 def metric_event_tree() -> Tree:
434 """Create tree of PMUs and metricgroups with events or metrics under."""
435 tree: Tree[TreeValue] = Tree("Root", id="root")
436 pmus = tree.root.add("PMUs")
437 for pmu in perf.pmus():
441 for event in sorted(pmu.events(), key=lambda x: x["name"]):
442 if "name" in event:
444 if "alias" in event:
452 metrics = tree.root.add("Metrics")
454 for metric in perf.metrics():
458 for metric in sorted(perf.metrics(), key=lambda x: x["MetricName"]):
459 if parent in metric["MetricGroup"]:
463 if child_group_name in groups:
466 for group in sorted(groups):
471 tree.root.expand()
472 return tree
483 @on(Tree.NodeSelected)
484 def on_tree_node_selected(self, event: Tree.NodeSelected[TreeValue]) -> None:
485 """Called when a tree node is selected, selecting the event."""
492 ap.add_argument('-I', '--interval', help="Counter update interval in seconds", default=0.1)