]> Skullheadx's Git Forge - PygameGUIEngine.git/commitdiff
Slider
authorSkullheadx <admonty1@gmail.com>
Fri, 14 Apr 2023 21:18:30 +0000 (17:18 -0400)
committerSkullheadx <admonty1@gmail.com>
Fri, 14 Apr 2023 21:18:30 +0000 (17:18 -0400)
container.py
main.py
slider.py [new file with mode: 0644]

index a3cca9e21aff11ccaaf96291a37b76fadfacb7d4..c4f066c6c897bc6ab2075cfdab0e007a10953784 100644 (file)
@@ -61,6 +61,7 @@ class VBoxContainer:
         for child in self.children:
             if hasattr(child, 'update'):
                 child.update()
+        self.update_children_position()
 
     def get_width(self):
         return self.width
diff --git a/main.py b/main.py
index 79ae235db247ed41126cb9ea5c07a1b07d3b8593..fd177b4fa6519b43154486df3b919a294db7a887 100644 (file)
--- a/main.py
+++ b/main.py
@@ -5,6 +5,8 @@ from text import Text, Label
 from button import Button
 from container import VBoxContainer, HBoxContainer, GridContainer
 from image import Image
+from slider import Slider
+
 
 pygame.init()
 
@@ -13,31 +15,9 @@ pygame.display.set_caption("My Game")
 clock = pygame.time.Clock()
 delta = 0
 
-# Testing Text
-# a = Text(100, 100, "Hello World", "Arial", 20, color=Color.RED)
-# b = Label(100, 200, "Word hunt", "Imprint Shadow", 20, Color.RED, Color.BLACK, Color.BLACK, 1, 15)
-# c = Rectangle(100, 300, 100, 100, (255, 0, 0))
-# d = Button(100, 200, "Play", "Imprint Shadow", 40, Color.BLUE, Color.BLACK, Color.BLACK, 1, 15, 20,
-#            lambda: print("Hello World"))
-# e = Button(100, 300, "Quit", "Imprint Shadow", 40, Color.BLUE, Color.BLACK, Color.BLACK, 1, 15, 20,
-#            lambda: print("Goodbye World"))
-# f = HBoxContainer(400, 25, Color.WHITE, Color.BLACK, 1, 15, 20, 10, True, [d, e])
-# f.add_child(a)
-#
-# g = Image(0, 0, "image.PNG", Color.BLACK, 5)
-# g.resize(200, 200)
-# f.add_child(c)
-
-p = Rectangle(0, 0, 100, 100, Color.WHITE, Color.BLACK, 1, 0)
-q = Text(0, 0, "Hello World", "Arial", 20, color=Color.RED)
-r = Button(0, 0, "Play", "Imprint Shadow", 40, Color.BLUE, Color.BLACK, Color.BLACK, 1, 15, 20,
-           lambda: print("Hello World"))
-# s = Rectangle(0, 0, 100, 100, Color.BLUE, Color.BLACK, 1, 0)
-s = Image(0, 0, "image.PNG", Color.BLACK, 5)
-# s.resize(300, 200)
-s.resize(100, 100)
-t = GridContainer(100, 100, 2, 2,Color.LIGHT_GRAY,Color.BLACK, 1,15,10,20, children=[[p, q], [r, s]])
-# t = VBoxContainer(100, 100, Color.LIGHT_GRAY, Color.BLACK, 1, 15, 10, 10, True, [p, q, r, s])
+a = Slider(100, 100, 100, 20, 0, 100, 50, Color.LIGHT_GRAY, Color.DARK_GRAY, 4, 5, 10)
+b = Text(100, 100, "Slider", "Arial", 20, Color.BLACK)
+c = VBoxContainer(100, 100, Color.LIGHT_GRAY, Color.DARK_GRAY, 4, 5, 10, 0, True,[b,a])
 
 is_running = True
 while is_running:
@@ -45,30 +25,11 @@ while is_running:
         if event.type == pygame.QUIT:
             is_running = False
 
-    screen.fill((255, 255, 255))
-
-    # a.draw(screen)
-    # b.move(delta * 10, delta * 10)
-    # b.set_text(str(round(clock.get_fps())) + " FPS")
-    # b.draw(screen)
-    # c.draw(screen)
-    #
-    # d.update()
-    # d.draw(screen)
-    #
-    # e.update()
-    # e.draw(screen)
-    #
-    # f.update()
-    # f.move(delta * -40, 0)
-    # f.draw(screen)
-    #
-    # g.move(0, delta * 25)
-    # g.draw(screen)
+    screen.fill(Color.WHITE)
+    b.set_text(f"Slider: {round(a.get_value())}")
 
-    t.update()
-    t.move(delta * 20, 0)
-    t.draw(screen)
+    c.update()
+    c.draw(screen)
 
     pygame.display.update()
     delta = clock.tick(60) / 1000  # Seconds since last frame
diff --git a/slider.py b/slider.py
new file mode 100644 (file)
index 0000000..600fe14
--- /dev/null
+++ b/slider.py
@@ -0,0 +1,101 @@
+import pygame
+from color import Color
+from rectangle import Rectangle
+
+
+class Slider:
+    slider_thickness = 4
+    def __init__(self, x, y, width, height, min_val=0, max_val=100, default=0, background_color=Color.WHITE,
+                 slider_color=Color.BLACK, border_color=Color.BLACK, border_width=1, border_radius=0, padding=15):
+        self.x = x
+        self.y = y
+        self.background_color = background_color
+        self.slider_color = slider_color
+        self.border_color = border_color
+        self.border_width = border_width
+        self.border_radius = border_radius
+        self.padding = padding
+        self.width = width + 2 * self.padding
+        self.height = height + 2 * self.padding
+
+        self.value = default
+        self.min_value = min_val
+        self.max_value = max_val
+
+        self.rect = Rectangle(self.x - self.padding, self.y - self.padding, self.width, self.height,
+                              self.background_color,
+                              self.border_color, self.border_width, self.border_radius)
+        self.is_hover = False
+        self.is_pressed = False
+        self.is_clicked = False
+
+        self.hover_color = Color.darken(self.background_color, 20)
+        self.pressed_color = Color.darken(self.background_color, 40)
+
+        self.last_click = 0
+        self.still_pressed = False
+        self.click_disabled = False
+
+    def get_value(self):
+        return self.value
+
+    def set_value(self, value):
+        self.value = max(min(value, self.max_value), self.min_value)
+
+    def get_width(self):
+        return self.width
+
+    def get_height(self):
+        return self.height
+
+    def set_position(self, x, y):
+        self.x = x
+        self.y = y
+        self.rect.set_position(x - self.padding, y - self.padding)
+
+    def move(self, dx, dy):
+        self.x += dx
+        self.y += dy
+        self.rect.move(dx, dy)
+
+    def set_background_color(self, background_color):
+        self.background_color = background_color
+
+    def set_slider_color(self, slider_color):
+        self.slider_color = slider_color
+
+    def update(self):
+        mouse_pressed = pygame.mouse.get_pressed()[0]
+        mouse_pos = pygame.mouse.get_pos()
+
+        self.is_hover = self.rect.collidepoint(mouse_pos)
+        if mouse_pressed and not self.is_hover:
+            self.click_disabled = True
+        if self.click_disabled:
+            if not mouse_pressed:
+                self.click_disabled = False
+            else:
+                if self.is_hover:
+                    self.rect.set_background_color(self.hover_color)
+                else:
+                    self.rect.set_background_color(self.background_color)
+                return
+        self.is_clicked = self.is_hover and not mouse_pressed and self.is_pressed
+        self.is_pressed = self.is_hover and mouse_pressed
+
+        if self.is_pressed:
+            self.rect.set_background_color(self.pressed_color)
+            self.set_value(self.min_value + (self.max_value - self.min_value) * (
+                    mouse_pos[0] - self.x) / (self.width - 2 * self.padding))
+        elif self.is_hover:
+            self.rect.set_background_color(self.hover_color)
+        else:
+            self.rect.set_background_color(self.background_color)
+
+    def draw(self, screen):
+        self.rect.draw(screen)
+        pygame.draw.line(screen, self.border_color, (self.x, self.y + (self.height - 2 * self.padding) // 2),
+                         (self.x + self.width - 2 * self.padding, self.y + (self.height - 2 * self.padding) // 2), 3)
+        pygame.draw.rect(screen, self.slider_color,
+                         (self.x + (self.width - 2 * self.padding) * (self.value - self.min_value) / (self.max_value - self.min_value) - self.slider_thickness//2,
+                          self.y, self.slider_thickness, self.height - 2 * self.padding))