From 4f3c19ffb54db603528280e9aa941f719c764185 Mon Sep 17 00:00:00 2001 From: James Vecellio Date: Wed, 19 Nov 2025 20:28:59 -0800 Subject: [PATCH] save the trees we got icons --- .../ui/sunnypilot/widgets/helpers/__init__.py | 0 .../ui/sunnypilot/widgets/helpers/star_icon.py | 18 ++++++++++++++++++ system/ui/sunnypilot/widgets/tree_dialog.py | 18 +++++++----------- 3 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 system/ui/sunnypilot/widgets/helpers/__init__.py create mode 100644 system/ui/sunnypilot/widgets/helpers/star_icon.py diff --git a/system/ui/sunnypilot/widgets/helpers/__init__.py b/system/ui/sunnypilot/widgets/helpers/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/system/ui/sunnypilot/widgets/helpers/star_icon.py b/system/ui/sunnypilot/widgets/helpers/star_icon.py new file mode 100644 index 0000000000..6d13e119af --- /dev/null +++ b/system/ui/sunnypilot/widgets/helpers/star_icon.py @@ -0,0 +1,18 @@ +import math +import pyray as rl + +def draw_star(center_x, center_y, radius, is_filled, color): + center = rl.Vector2(center_x, center_y) + points = [] + + for i in range(10): + angle = -(i * 36 + 18) * math.pi / 180 + r = radius if i % 2 == 0 else radius / 2 + x = center_x + r * math.cos(angle) + y = center_y + r * math.sin(angle) + points.append(rl.Vector2(x, y)) + + for i in range(10): + if is_filled: + rl.draw_triangle(center, points[i], points[(i + 1) % 10], color) + rl.draw_line_ex(points[i], points[(i + 1) % 10], 2, color) diff --git a/system/ui/sunnypilot/widgets/tree_dialog.py b/system/ui/sunnypilot/widgets/tree_dialog.py index bad44f9a6c..bdcc146649 100644 --- a/system/ui/sunnypilot/widgets/tree_dialog.py +++ b/system/ui/sunnypilot/widgets/tree_dialog.py @@ -4,10 +4,10 @@ from dataclasses import dataclass from openpilot.common.params import Params from openpilot.system.ui.lib.application import FontWeight from openpilot.system.ui.widgets.button import Button, ButtonStyle -from openpilot.system.ui.widgets.label import gui_label from openpilot.system.ui.widgets.option_dialog import MultiOptionDialog from openpilot.system.ui.sunnypilot.lib.styles import style +from openpilot.system.ui.sunnypilot.widgets.helpers.star_icon import draw_star @dataclass class TreeNode: @@ -36,12 +36,13 @@ class TreeItemWidget(Button): @property def _star_rect(self): - return rl.Rectangle(self._rect.x + self._rect.width - 50, self._rect.y + (self._rect.height - 40) / 2, 40, 40) + return rl.Rectangle(self._rect.x + self._rect.width - 65, self._rect.y + (self._rect.height - 40) / 2, 40, 40) def _render(self, rect): super()._render(rect) if not self.is_folder and self._favorite_callback: - gui_label(self._star_rect, "☆", 70, style.ITEM_TEXT_COLOR if self.is_favorite else style.ITEM_DISABLED_TEXT_COLOR) + draw_star(self._star_rect.x + self._star_rect.width / 2, self._star_rect.y + self._star_rect.height / 2, + 25, self.is_favorite, style.ON_BG_COLOR if self.is_favorite else rl.GRAY) def _handle_mouse_release(self, mouse_pos): if not self.is_folder and self._favorite_callback and rl.check_collision_point_rec(mouse_pos, self._star_rect): @@ -95,19 +96,14 @@ class TreeOptionDialog(MultiOptionDialog): self.selection_ref = node.ref def _toggle_favorite(self, node): - if node.ref in self.favorites: - self.favorites.remove(node.ref) - else: - self.favorites.add(node.ref) - + self.favorites.remove(node.ref) if node.ref in self.favorites else self.favorites.add(node.ref) if self.fav_param: self.params.put(self.fav_param, ';'.join(self.favorites)) self.folders = [f for f in self.folders if f.folder != "Favorites"] if self.favorites: - all_nodes = [n for f in self.folders for n in f.nodes] - fav_nodes = [TreeNode("", n.display_name, n.ref, n.index) for n in all_nodes if n.ref in self.favorites] - fav_nodes.sort(key=lambda n: n.index, reverse=True) + fav_nodes = sorted([TreeNode("", n.display_name, n.ref, n.index) for f in self.folders for n in f.nodes if n.ref in self.favorites], + key=lambda n: n.index, reverse=True) if fav_nodes: self.folders.insert(1 if len(self.folders) > 0 else 0, TreeFolder("Favorites", fav_nodes))