Exemplo n.º 1
0
class TextButton(HoverButton):
    'A HoverButton which has text rather than images.'

    def __init__(self,
                 app,
                 pos,
                 text,
                 font,
                 stdColour,
                 hvrColour,
                 hotkey=None,
                 backColour=None,
                 onClick=None):
        self.stdImage = TextImage(text, font, stdColour, backColour)
        self.hvrImage = TextImage(text, font, hvrColour, backColour)

        super(TextButton, self).__init__(app, pos, self.stdImage,
                                         self.hvrImage, hotkey, onClick)

        self.app.screenManager.onResize.addListener(self.appResized)

    def appResized(self):
        # The font may be scaled, so refresh the images
        self.stdImage.refresh()
        self.hvrImage.refresh()

    def setText(self, text):
        self.stdImage.text = text
        self.hvrImage.text = text

    def setFont(self, font):
        self.stdImage.setFont(font)
        self.hvrImage.setFont(font)

    def setColour(self, colour):
        self.stdImage.setColour(colour)

    def setHoverColour(self, colour):
        self.hvrImage.setColour(colour)

    def setBackColour(self, colour):
        self.hvrImage.setBackColour(colour)
        self.stdImage.setBackColour(colour)
Exemplo n.º 2
0
class TextElement(Element):
    '''Shows text at a specified screen location.
    @param pos: should be an instance of trosnoth.ui.common.Location'''
    def __init__(self,
                 app,
                 text,
                 font,
                 pos,
                 colour=(0, 128, 0),
                 anchor='topleft',
                 shadow=False,
                 backColour=None,
                 antialias=True):
        super(TextElement, self).__init__(app)

        self.pos = pos
        self.anchor = anchor
        self.image = TextImage(text, font, colour, backColour, antialias)
        self.__shadow = None
        self.setShadow(shadow)
        self._surface = None
        self.rect = None

        app.screenManager.onResize.addListener(self.appResized)

    def appResized(self):
        self.rect = None
        self._surface = None

    def _getImage(self):
        if self._surface is None:
            self.image.refresh()
            self._surface = self.image.getImage(self.app)
        return self._surface

    def getRect(self, app):
        assert app is self.app
        return self._getRect()

    def _getRect(self):
        if self.rect is not None:
            return self.rect

        rect = self._getImage().get_rect()
        pos = self.pos
        if hasattr(pos, 'apply'):
            pos.apply(self.app, rect)
        else:
            setattr(rect, defaultAnchor, pos)

        self.rect = rect
        return rect

    def getText(self):
        return self.image.text

    def setColour(self, colour):
        self.image.colour = colour
        self._surface = None

    def setText(self, text):
        if self.image.text != text:
            self._surface = None
            self.image.text = text
            if self.__shadow is not None:
                self.__shadow.setText(text)

    def setFont(self, font):
        if self.image.font != font:
            self.image.font = font
            if self.__shadow is not None:
                self.__shadow.setFont(font)
            self._surface = None

    def setPos(self, pos):
        if self.pos != pos:
            self.pos = pos
            if self.__shadow is not None:
                self.__shadow.setPos(self.__getShadowPos())
            self._surface = None
            self.rect = None

    def __getShadowPos(self):
        x = self._shadowOffset
        pos = RelativeLocation(self.pos, (x, x))
        return pos

    def setShadow(self, shadow, offset=None):
        if shadow:
            if self.__shadow is None:
                if offset is None:
                    height = self.image.font.getHeight(self.app)
                    self._shadowOffset = (height / 45) + 1
                else:
                    self._shadowOffset = offset

                self.__shadow = TextElement(self.app, self.image.text,
                                            self.image.font,
                                            self.__getShadowPos(),
                                            colours.shadowDefault, self.anchor,
                                            False)
                self._surface = None
        else:
            if self.__shadow is not None:
                self.__shadow = None
                self._surface = None

    def setShadowOffset(self, offset):
        if self.__shadow is not None:
            self.setShadow(False)
            self.setShadow(True, offset)

    def setShadowColour(self, colour):
        if self.__shadow is not None:
            self.__shadow.setColour(colour)
            self._surface = None

    def draw(self, screen):
        if self.__shadow is not None:
            assert self.__shadow.__shadow is None
            self.__shadow.draw(screen)

        rect = self._getRect()

        # Adjust text position based on anchor.
        image = self._getImage()

        rectPos = getattr(rect, self.anchor)
        imagePos = getattr(image.get_rect(), self.anchor)
        pos = (rectPos[0] - imagePos[0], rectPos[1] - imagePos[1])

        screen.blit(image, pos)