def createLowLeftButton(self, label, type, movieIn, movieOut, movieShake, menuString=""): button = TextButton(label, TextButton.RIGHT, type, self.window.scene, self.window.mainSceneRoot, TextButton.PANEL) if menuString: button.setMenuString(menuString) button.setRecursiveVisible(False) button.setZValue(10) iw = button.sceneBoundingRect().width() xOffset = 15 # Create in-animation. buttonIn = DemoItemAnimation(button, DemoItemAnimation.ANIM_IN) buttonIn.setDuration(1800 * Colors.animSpeedButtons) buttonIn.setStartPos(QtCore.QPointF(-iw, Colors.contentStartY + Colors.contentHeight - 35)) buttonIn.setPosAt(0.5, QtCore.QPointF(-iw, Colors.contentStartY + Colors.contentHeight - 35)) buttonIn.setPosAt(0.7, QtCore.QPointF(xOffset, Colors.contentStartY + Colors.contentHeight - 35)) buttonIn.setPosAt(1.0, QtCore.QPointF(xOffset, Colors.contentStartY + Colors.contentHeight - 26)) movieIn.append(buttonIn) # Create out-animation. buttonOut = DemoItemAnimation(button, DemoItemAnimation.ANIM_OUT) buttonOut.hideOnFinished = True buttonOut.setDuration(400 * Colors.animSpeedButtons) buttonOut.setStartPos(QtCore.QPointF(xOffset, Colors.contentStartY + Colors.contentHeight - 26)) buttonOut.setPosAt(1.0, QtCore.QPointF(-iw, Colors.contentStartY + Colors.contentHeight - 26)) movieOut.append(buttonOut) if movieShake is not None: shakeAnim = DemoItemAnimation(button, DemoItemAnimation.ANIM_UNSPECIFIED) shakeAnim.timeline.setCurveShape(QtCore.QTimeLine.LinearCurve) shakeAnim.setDuration(650) shakeAnim.setStartPos(buttonIn.posAt(1.0)) shakeAnim.setPosAt(0.60, buttonIn.posAt(1.0)) shakeAnim.setPosAt(0.70, buttonIn.posAt(1.0) + QtCore.QPointF(-3, 0)) shakeAnim.setPosAt(0.80, buttonIn.posAt(1.0) + QtCore.QPointF(2, 0)) shakeAnim.setPosAt(0.90, buttonIn.posAt(1.0) + QtCore.QPointF(-1, 0)) shakeAnim.setPosAt(1.00, buttonIn.posAt(1.0)) movieShake.append(shakeAnim)
def createLowLeftButton(self, label, type, movieIn, movieOut, movieShake, menuString=""): button = TextButton(label, TextButton.RIGHT, type, self.window.scene, None, TextButton.PANEL) if menuString: button.setMenuString(menuString) button.setRecursiveVisible(False) button.setZValue(10) iw = button.sceneBoundingRect().width() xOffset = 15 # Create in-animation. buttonIn = DemoItemAnimation(button, DemoItemAnimation.ANIM_IN) buttonIn.setDuration(1800 * Colors.animSpeedButtons) buttonIn.setStartPos(QtCore.QPointF(-iw, Colors.contentStartY + Colors.contentHeight - 35)) buttonIn.setPosAt(0.5, QtCore.QPointF(-iw, Colors.contentStartY + Colors.contentHeight - 35)) buttonIn.setPosAt(0.7, QtCore.QPointF(xOffset, Colors.contentStartY + Colors.contentHeight - 35)) buttonIn.setPosAt(1.0, QtCore.QPointF(xOffset, Colors.contentStartY + Colors.contentHeight - 26)) movieIn.append(buttonIn) # Create out-animation. buttonOut = DemoItemAnimation(button, DemoItemAnimation.ANIM_OUT) buttonOut.hideOnFinished = True buttonOut.setDuration(400 * Colors.animSpeedButtons) buttonOut.setStartPos(QtCore.QPointF(xOffset, Colors.contentStartY + Colors.contentHeight - 26)) buttonOut.setPosAt(1.0, QtCore.QPointF(-iw, Colors.contentStartY + Colors.contentHeight - 26)) movieOut.append(buttonOut) if movieShake is not None: shakeAnim = DemoItemAnimation(button, DemoItemAnimation.ANIM_UNSPECIFIED) shakeAnim.timeline.setCurveShape(QtCore.QTimeLine.LinearCurve) shakeAnim.setDuration(650) shakeAnim.setStartPos(buttonIn.posAt(1.0)) shakeAnim.setPosAt(0.60, buttonIn.posAt(1.0)) shakeAnim.setPosAt(0.70, buttonIn.posAt(1.0) + QtCore.QPointF(-3, 0)) shakeAnim.setPosAt(0.80, buttonIn.posAt(1.0) + QtCore.QPointF(2, 0)) shakeAnim.setPosAt(0.90, buttonIn.posAt(1.0) + QtCore.QPointF(-1, 0)) shakeAnim.setPosAt(1.00, buttonIn.posAt(1.0)) movieShake.append(shakeAnim)
class TextButton(DemoItem): BUTTON_WIDTH = 180 BUTTON_HEIGHT = 19 LEFT, RIGHT = range(2) SIDEBAR, PANEL, UP, DOWN = range(4) ON, OFF, HIGHLIGHT, DISABLED = range(4) def __init__(self, text, align=LEFT, userCode=0, parent=None, type=SIDEBAR): super(TextButton, self).__init__(parent) # Prevent a circular import. from menumanager import MenuManager self._menu_manager = MenuManager.instance() self.menuString = text self.buttonLabel = text self.alignment = align self.buttonType = type self.userCode = userCode self.scanAnim = None self.bgOn = None self.bgOff = None self.bgHighlight = None self.bgDisabled = None self.state = TextButton.OFF self.setAcceptHoverEvents(True) self.setCursor(Qt.PointingHandCursor) # Calculate the button size. if type in (TextButton.SIDEBAR, TextButton.PANEL): self.logicalSize = QSize(TextButton.BUTTON_WIDTH, TextButton.BUTTON_HEIGHT) else: self.logicalSize = QSize(int((TextButton.BUTTON_WIDTH / 2.0) - 5), int(TextButton.BUTTON_HEIGHT * 1.5)) self._prepared = False def setMenuString(self, menu): self.menuString = menu def prepare(self): if not self._prepared: self.setupHoverText() self.setupScanItem() self.setupButtonBg() self._prepared = True def boundingRect(self): return QRectF(0, 0, self.logicalSize.width(), self.logicalSize.height()) def setupHoverText(self): if not self.buttonLabel: return textItem = DemoTextItem(self.buttonLabel, Colors.buttonFont(), Colors.buttonText, -1, self) textItem.setZValue(self.zValue() + 2) textItem.setPos(16, 0) def setupScanItem(self): if Colors.useButtonBalls: scanItem = ScanItem(self) scanItem.setZValue(self.zValue() + 1) self.scanAnim = DemoItemAnimation(scanItem) x = 1.0 y = 1.5 stop = TextButton.BUTTON_WIDTH - scanItem.boundingRect().width() - x if self.alignment == TextButton.LEFT: self.scanAnim.setDuration(2500) self.scanAnim.setKeyValueAt(0.0, QPointF(x, y)) self.scanAnim.setKeyValueAt(0.5, QPointF(x, y)) self.scanAnim.setKeyValueAt(0.7, QPointF(stop, y)) self.scanAnim.setKeyValueAt(1.0, QPointF(x, y)) scanItem.setPos(QPointF(x, y)) else: self.scanAnim.setKeyValueAt(0.0, QPointF(stop, y)) self.scanAnim.setKeyValueAt(0.5, QPointF(x, y)) self.scanAnim.setKeyValueAt(1.0, QPointF(stop, y)) scanItem.setPos(QPointF(stop, y)) def setState(self, state): self.state = state self.bgOn.setRecursiveVisible(state == TextButton.ON) self.bgOff.setRecursiveVisible(state == TextButton.OFF) self.bgHighlight.setRecursiveVisible(state == TextButton.HIGHLIGHT) self.bgDisabled.setRecursiveVisible(state == TextButton.DISABLED) if state == TextButton.DISABLED: self.setCursor(Qt.ArrowCursor) else: self.setCursor(Qt.PointingHandCursor) def setupButtonBg(self): self.bgOn = ButtonBackground(self.buttonType, True, True, self.logicalSize, self) self.bgOff = ButtonBackground(self.buttonType, False, False, self.logicalSize, self) self.bgHighlight = ButtonBackground(self.buttonType, True, False, self.logicalSize, self) self.bgDisabled = ButtonBackground(self.buttonType, True, True, self.logicalSize, self) self.setState(TextButton.OFF) def hoverEnterEvent(self, event): if not self.isEnabled() or self.state == TextButton.DISABLED: return if self.state == TextButton.OFF: self.setState(TextButton.HIGHLIGHT) if Colors.noAnimations and Colors.useButtonBalls: # Wait a bit in the beginning to enhance the effect. We have # to do this here so that the adaption can be dynamic. self.scanAnim.setDuration(1000) self.scanAnim.setKeyValueAt(0.2, self.scanAnim.posAt(0)) if (self._menu_manager.window.fpsMedian > 10 or Colors.noAdapt or Colors.noTimerUpdate): if Colors.useButtonBalls: self.scanAnim.play(True, True) def hoverLeaveEvent(self, event): if self.state == TextButton.DISABLED: return self.setState(TextButton.OFF) if Colors.noAnimations and Colors.useButtonBalls: self.scanAnim.stop() def mousePressEvent(self, event): if self.state == TextButton.DISABLED: return if self.state == TextButton.HIGHLIGHT or self.state == TextButton.OFF: self.setState(TextButton.ON) def mouseReleaseEvent(self, event): if self.state == TextButton.ON: self.setState(TextButton.OFF) if self.isEnabled() and self.boundingRect().contains(event.pos()): self._menu_manager.itemSelected(self.userCode, self.menuString) def animationStarted(self, _): if self.state == TextButton.DISABLED: return self.setState(TextButton.OFF)
class TextButton(DemoItem): BUTTON_WIDTH = 180 BUTTON_HEIGHT = 19 LEFT, RIGHT = range(2) SIDEBAR, PANEL, UP, DOWN = range(4) ON, OFF, HIGHLIGHT, DISABLED = range(4) def __init__(self, text, align=LEFT, userCode=0, parent=None, type=SIDEBAR): super(TextButton, self).__init__(parent) # Prevent a circular import. from menumanager import MenuManager self._menu_manager = MenuManager.instance() self.menuString = text self.buttonLabel = text self.alignment = align self.buttonType = type self.userCode = userCode self.scanAnim = None self.bgOn = None self.bgOff = None self.bgHighlight = None self.bgDisabled = None self.state = TextButton.OFF self.setAcceptHoverEvents(True) self.setCursor(Qt.PointingHandCursor) # Calculate the button size. if type in (TextButton.SIDEBAR, TextButton.PANEL): self.logicalSize = QSize(TextButton.BUTTON_WIDTH, TextButton.BUTTON_HEIGHT) else: self.logicalSize = QSize(int((TextButton.BUTTON_WIDTH / 2.0) - 5), int(TextButton.BUTTON_HEIGHT * 1.5)) self._prepared = False def setMenuString(self, menu): self.menuString = menu def prepare(self): if not self._prepared: self.setupHoverText() self.setupScanItem() self.setupButtonBg() self._prepared = True def boundingRect(self): return QRectF(0, 0, self.logicalSize.width(), self.logicalSize.height()) def setupHoverText(self): if not self.buttonLabel: return textItem = DemoTextItem(self.buttonLabel, Colors.buttonFont(), Colors.buttonText, -1, self) textItem.setZValue(self.zValue() + 2) textItem.setPos(16, 0) def setupScanItem(self): if Colors.useButtonBalls: scanItem = ScanItem(self) scanItem.setZValue(self.zValue() + 1) self.scanAnim = DemoItemAnimation(scanItem) x = 1.0 y = 1.5 stop = TextButton.BUTTON_WIDTH - scanItem.boundingRect().width( ) - x if self.alignment == TextButton.LEFT: self.scanAnim.setDuration(2500) self.scanAnim.setKeyValueAt(0.0, QPointF(x, y)) self.scanAnim.setKeyValueAt(0.5, QPointF(x, y)) self.scanAnim.setKeyValueAt(0.7, QPointF(stop, y)) self.scanAnim.setKeyValueAt(1.0, QPointF(x, y)) scanItem.setPos(QPointF(x, y)) else: self.scanAnim.setKeyValueAt(0.0, QPointF(stop, y)) self.scanAnim.setKeyValueAt(0.5, QPointF(x, y)) self.scanAnim.setKeyValueAt(1.0, QPointF(stop, y)) scanItem.setPos(QPointF(stop, y)) def setState(self, state): self.state = state self.bgOn.setRecursiveVisible(state == TextButton.ON) self.bgOff.setRecursiveVisible(state == TextButton.OFF) self.bgHighlight.setRecursiveVisible(state == TextButton.HIGHLIGHT) self.bgDisabled.setRecursiveVisible(state == TextButton.DISABLED) if state == TextButton.DISABLED: self.setCursor(Qt.ArrowCursor) else: self.setCursor(Qt.PointingHandCursor) def setupButtonBg(self): self.bgOn = ButtonBackground(self.buttonType, True, True, self.logicalSize, self) self.bgOff = ButtonBackground(self.buttonType, False, False, self.logicalSize, self) self.bgHighlight = ButtonBackground(self.buttonType, True, False, self.logicalSize, self) self.bgDisabled = ButtonBackground(self.buttonType, True, True, self.logicalSize, self) self.setState(TextButton.OFF) def hoverEnterEvent(self, event): if not self.isEnabled() or self.state == TextButton.DISABLED: return if self.state == TextButton.OFF: self.setState(TextButton.HIGHLIGHT) if Colors.noAnimations and Colors.useButtonBalls: # Wait a bit in the beginning to enhance the effect. We have # to do this here so that the adaption can be dynamic. self.scanAnim.setDuration(1000) self.scanAnim.setKeyValueAt(0.2, self.scanAnim.posAt(0)) if (self._menu_manager.window.fpsMedian > 10 or Colors.noAdapt or Colors.noTimerUpdate): if Colors.useButtonBalls: self.scanAnim.play(True, True) def hoverLeaveEvent(self, event): if self.state == TextButton.DISABLED: return self.setState(TextButton.OFF) if Colors.noAnimations and Colors.useButtonBalls: self.scanAnim.stop() def mousePressEvent(self, event): if self.state == TextButton.DISABLED: return if self.state == TextButton.HIGHLIGHT or self.state == TextButton.OFF: self.setState(TextButton.ON) def mouseReleaseEvent(self, event): if self.state == TextButton.ON: self.setState(TextButton.OFF) if self.isEnabled() and self.boundingRect().contains(event.pos()): self._menu_manager.itemSelected(self.userCode, self.menuString) def animationStarted(self, _): if self.state == TextButton.DISABLED: return self.setState(TextButton.OFF)