X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=tabakrolletjie%2Fwidgets.py;fp=tabakrolletjie%2Fwidgets.py;h=166cfc0dc84ae88dcd330fc6cdb8cf83f462b112;hb=6c66ede9945f647ab9be47dcda8f8ab3cb3fde1d;hp=4341c703d717be28ae59a4d1a6a16b056ac01061;hpb=e2d9bd69b3e6e21c432be2321e3ce81f11b0e987;p=tabakrolletjie.git diff --git a/tabakrolletjie/widgets.py b/tabakrolletjie/widgets.py index 4341c70..166cfc0 100644 --- a/tabakrolletjie/widgets.py +++ b/tabakrolletjie/widgets.py @@ -3,12 +3,40 @@ # There is no implied container / window system (yet) import pygame.locals as pgl +import pygame.mouse +import pygame.surface from .loader import loader -from .constants import FONTS +from .constants import FONTS, COLOURS from .transforms import NullTransform, Multiply +class Tooltip(object): + def __init__(self, textparts, font='sans', size=12, padding=5, distance=10): + self._font = loader.load_font(FONTS[font], size=size) + self._text = [self._font.render(text, True, COLOURS["white"]) for text in textparts] + self._padding = padding + self._distance = distance + + def render(self, surface, tool_pos, tool_width): + width = max(t.get_size()[0] for t in self._text) + 2 * self._padding + height = sum(t.get_size()[1] for t in self._text) + 2 * self._padding + + tooltip = pygame.surface.Surface( + (width, height), pgl.SWSURFACE).convert_alpha() + tooltip.fill((0, 0, 0, 172)) + + ty = 0 + for t in self._text: + tooltip.blit(t, (self._padding, self._padding + ty), None) + ty += self._font.get_height() + + x = tool_pos[0] - width/2 + tool_width/2 + y = tool_pos[1] - height - self._distance + + surface.blit(tooltip, (x, y), None) + + class Button(object): def __init__(self, size, name=None, pos=None, padding=10): @@ -17,6 +45,7 @@ class Button(object): self.position = pos self.name = name self.enabled = True + self.tooltip = None def enable(self): self.enabled = True @@ -58,6 +87,20 @@ class Button(object): return True return False + def mouseover(self): + if not self.enabled: + return False + if self._pos is None: + # Unplaced buttons can't be moused over + return False + + mpos = pygame.mouse.get_pos() + + if self._min_x < mpos[0] < self._max_x: + if self._min_y < mpos[1] < self._max_y: + return True + return False + class SpacerButton(Button): """ Add a nothing object which can be used to space other things, @@ -85,6 +128,8 @@ class TextButton(Button): def render(self, surface): if self.enabled: surface.blit(self._text, self._pos, None) + if self.mouseover() and self.tooltip: + self.tooltip.render(surface, self._pos, self.get_width()) else: surface.blit(self._disabled_text, self._pos, None) @@ -112,5 +157,7 @@ class ImageButton(Button): def render(self, surface): if self.enabled: surface.blit(self._img, self._pos, None) + if self.mouseover() and self.tooltip: + self.tooltip.render(surface, self._pos, self.get_width()) else: surface.blit(self._disabled_img, self._pos, None)