home · contact · privacy
Exile into-what-box recommendations from sets default view into -f to_boxes.
authorPlom Heller <plom@plomlompom.com>
Sun, 9 Aug 2026 04:06:42 +0000 (06:06 +0200)
committerPlom Heller <plom@plomlompom.com>
Sun, 9 Aug 2026 04:06:42 +0000 (06:06 +0200)
src/bricksplom/misc.py

index becb8cecafcf8dc00d154984216612d2921c0941..cbad122fedbdde46a8719303b5a34508b1e37083 100644 (file)
@@ -610,7 +610,8 @@ class BrickSet(Textfiled, WithDb, Lookupable):
         return tuple(collected)
 
     def show(
-            self
+            self,
+            to_boxes=False
             ) -> str:
         def format_line(count, brick_id, comment) -> str:
             brick = self.db.bricks[brick_id]
@@ -618,28 +619,33 @@ class BrickSet(Textfiled, WithDb, Lookupable):
             tail_comment = f' # {comment}' if comment else ''
             color = str(self.db.colors[self.db.bricks[brick_id].color_id]
                         ).lstrip().split(CHAR_SEP_TOKEN, maxsplit=1)[1]
-            box: Optional[Box] = None
-            for i_box in self.db.boxes.values():
-                for idx_in_box in [
-                        idx for idx, d_to_ls
-                        in enumerate(i_box.designs_to_listings)
-                        if brick_id in [listing[1] for listing in d_to_ls[1]]]:
-                    box = i_box
-                    break
-                if box:
-                    break
-            if not box:
+            if to_boxes:
+                box: Optional[Box] = None
                 for i_box in self.db.boxes.values():
                     for idx_in_box in [
-                            idx for idx, t
+                            idx for idx, d_to_ls
                             in enumerate(i_box.designs_to_listings)
-                            if design_id in t[0].all_ids]:
+                            if brick_id in [listing[1]
+                                            for listing in d_to_ls[1]]]:
                         box = i_box
                         break
                     if box:
                         break
-            box_listing = ((box.id_indented() if box else Box.indent_id(''))
-                           + ':' + (f'{idx_in_box:>2}' if box else '__'))
+                if not box:
+                    for i_box in self.db.boxes.values():
+                        for idx_in_box in [
+                                idx for idx, t
+                                in enumerate(i_box.designs_to_listings)
+                                if design_id in t[0].all_ids]:
+                            box = i_box
+                            break
+                        if box:
+                            break
+                box_listing = ((box.id_indented() if box
+                                else Box.indent_id(''))
+                               + ':' + (f'{idx_in_box:>2}' if box else '__'))
+            else:
+                box_listing = ''
             return (
                 f'{count:>2}× {Brick.indent_id(brick_id)}:'
                 f'{BrickDesign.indent_id(design_id)} {box_listing} {color} '
@@ -647,10 +653,21 @@ class BrickSet(Textfiled, WithDb, Lookupable):
 
         return f'{self}{CHAR_NEWLINE}{self._format_paginated(format_line)}'
 
+    @classmethod
+    def formatters(
+            cls
+            ) -> dict[str, tuple[str, Callable[[Self], str]]]:
+        return super().formatters() | {
+                'to_boxes': (
+                    ('default with additional into-what-box recommendations '
+                     'per listing'),
+                    lambda item: item.show(to_boxes=True))
+                }
+
 
 class Box(WithDb, Lookupable):
     'Order of designs.'
-    _id_indent = 4
+    _id_indent = 5
 
     def __init__(
             self,