]> git.mar77i.info Git - elevator/commitdiff
clean up the code another bit
authormar77i <mar77i@protonmail.ch>
Mon, 19 Aug 2024 23:12:54 +0000 (01:12 +0200)
committermar77i <mar77i@protonmail.ch>
Mon, 19 Aug 2024 23:12:54 +0000 (01:12 +0200)
elevator.py

index ef7458f9507367ab00031bba188b6c0a63703c85..b938b61b3eeacde3c0972a7edf4950908df87d2a 100755 (executable)
@@ -34,26 +34,23 @@ class Circle:
     center: Vec
     radius: float
 
+    def draw(self, surf, rect):
+        pygame.draw.circle(
+            surf,
+            self.color,
+            rect.topleft + self.center * rect.size,
+            self.radius * rect.width,
+        )
+
 
 @dataclass
 class Polygon:
     color: str
     points: list[Vec]
 
-
-def vector_draw(surf, rect, item):
-    if isinstance(item, Circle):
-        pygame.draw.circle(
-            surf,
-            item.color,
-            rect.topleft + item.center * rect.size,
-            item.radius * rect.width,
-        )
-    elif isinstance(item, Polygon):
-        points = [rect.topleft + point * rect.size for point in item.points]
-        pygame.draw.polygon(surf, item.color, points)
-    else:
-        raise ValueError(f"item: {item}")
+    def draw(self, surf, rect):
+        points = [rect.topleft + point * rect.size for point in self.points]
+        pygame.draw.polygon(surf, self.color, points)
 
 
 BELL = [
@@ -303,6 +300,11 @@ class Elevator:
             surf, self.CABLE_COLOR, rect.midtop, (rect.centerx, cabin_rect.top)
         )
 
+    def get_current_dest(self):
+        if self.queued_dest is not None:
+            return self.queued_dest
+        return self.destination
+
     def goto(self, level):
         """
         Set a queued_dest if no destination or queued_dest is set.
@@ -358,6 +360,7 @@ class ElevatorPanel:
     ALARM_COLOR = "goldenrod"
     GLOW_COLOR = "red"
     BUTTON_SIZE = 0.9
+    OPEN_CLOSE_STR = ("<|>", ">|<")
 
     def __init__(self, elevator, surf_size, num_levels):
         self.elevator = elevator
@@ -406,26 +409,17 @@ class ElevatorPanel:
             if i == 0 or i > self.num_levels:
                 continue
             fs = self.font.render(str(i - 1), True, self.LABEL_COLOR)
-            fs_size = fs.get_size()
-            surf.blit(
-                fs,
-                (button.centerx - fs_size[0] // 2, button.centery - fs_size[1] // 2)
-            )
-            if (
-                self.elevator.queued_dest is None and self.elevator.destination == i - 1
-            ) or self.elevator.queued_dest == i - 1:
+            fs_size = Vec(fs.get_size())
+            surf.blit(fs, button.center - fs_size // 2)
+            if self.elevator.get_current_dest() == i - 1:
                 pygame.draw.rect(surf, self.GLOW_COLOR, button, 2)
 
         for shape in BELL:
-            vector_draw(surf, self.buttons[0], shape)
+            shape.draw(surf, self.buttons[0])
 
-        for button, s in zip(self.buttons[self.num_levels + 1:], ("<|>", ">|<")):
+        for button, s in zip(self.buttons[self.num_levels + 1:], self.OPEN_CLOSE_STR):
             fs = self.font.render(s, True, self.LABEL_COLOR)
-            fs_size = fs.get_size()
-            surf.blit(
-                fs,
-                (button.centerx - fs_size[0] // 2, button.centery - fs_size[1] // 2)
-            )
+            surf.blit(fs, button.center - Vec(fs.get_size()) // 2)
 
 
 class ElevatorApp:
@@ -449,6 +443,24 @@ class ElevatorApp:
         self.elevator_panel = ElevatorPanel(self.elevator, surf_size, self.num_levels)
         self.last_pos = None
 
+    def left_click(self, pos):
+        for i, door in enumerate(self.elevator.doors):
+            if door.button_rect.collidepoint(pos):
+                self.elevator.call_from(i)
+                return
+        for i, button in enumerate(self.elevator_panel.buttons):
+            if button.collidepoint(pos):
+                if i == 0:
+                    beep()
+                elif i - 1 < self.num_levels:
+                    self.elevator.goto(i - 1)
+                    self.dirty = True
+                elif i == self.num_levels + 1:
+                    self.elevator.open()
+                elif i == self.num_levels + 2:
+                    self.elevator.close()
+                return
+
     def handle_event(self, ev):
         if ev.type == pygame.QUIT:
             self.running = False
@@ -457,22 +469,7 @@ class ElevatorApp:
                 self.running = False
         elif ev.type == pygame.MOUSEBUTTONDOWN:
             if ev.button == 1:
-                for i, door in enumerate(self.elevator.doors):
-                    if door.button_rect.collidepoint(ev.pos):
-                        self.elevator.call_from(i)
-                        break
-                for i, button in enumerate(self.elevator_panel.buttons):
-                    if button.collidepoint(ev.pos):
-                        if i == 0:
-                            beep()
-                        elif i - 1 < self.num_levels:
-                            self.elevator.goto(i - 1)
-                            self.dirty = True
-                        elif i == self.num_levels + 1:
-                            self.elevator.open()
-                        elif i == self.num_levels + 2:
-                            self.elevator.close()
-                        break
+                self.left_click(ev.pos)
             self.last_pos = ev.pos
         elif ev.type == pygame.MOUSEBUTTONUP:
             self.last_pos = ev.pos