From: Skullheadx Date: Fri, 14 Apr 2023 21:18:30 +0000 (-0400) Subject: Slider X-Git-Url: http://git.skullheadx.com/nixos/static/banner.webp?a=commitdiff_plain;h=6b91183cdc21c3f415b504951c9ec3f7d34a5bc2;p=PygameGUIEngine.git Slider --- diff --git a/container.py b/container.py index a3cca9e..c4f066c 100644 --- a/container.py +++ b/container.py @@ -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 79ae235..fd177b4 100644 --- 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 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))