# Curve demo 2

    import numpy as np
    from qtpy.QtCore import QSize, Qt
    from qtpy.QtGui import QBrush, QColor, QPainter, QPalette, QPen
    from qtpy.QtWidgets import QFrame

    from qwt import QwtPlotCurve, QwtScaleMap, QwtSymbol
    from qwt.tests import utils

    Size = 15
    USize = 13

    class CurveDemo2(QFrame):
        def __init__(self, *args):
            QFrame.__init__(self, *args)

            self.setFrameStyle(QFrame.Box | QFrame.Raised)
            self.setLineWidth(2)
            self.setMidLineWidth(3)

            p = QPalette()
            p.setColor(self.backgroundRole(), QColor(30, 30, 50))
            self.setPalette(p)
            # make curves and maps
            self.tuples = []
            # curve 1
            curve = QwtPlotCurve()
            curve.setPen(QPen(QColor(150, 150, 200), 2))
            curve.setStyle(QwtPlotCurve.Lines)
            curve.setSymbol(
                QwtSymbol(QwtSymbol.XCross, QBrush(), QPen(Qt.yellow, 2), QSize(7, 7))
            )
            self.tuples.append(
                (curve, QwtScaleMap(0, 100, -1.5, 1.5), QwtScaleMap(0, 100, 0.0, 2 * np.pi))
            )
            # curve 2
            curve = QwtPlotCurve()
            curve.setPen(QPen(QColor(200, 150, 50), 1, Qt.DashDotDotLine))
            curve.setStyle(QwtPlotCurve.Sticks)
            curve.setSymbol(
                QwtSymbol(QwtSymbol.Ellipse, QBrush(Qt.blue), QPen(Qt.yellow), QSize(5, 5))
            )
            self.tuples.append(
                (curve, QwtScaleMap(0, 100, 0.0, 2 * np.pi), QwtScaleMap(0, 100, -3.0, 1.1))
            )
            # curve 3
            curve = QwtPlotCurve()
            curve.setPen(QPen(QColor(100, 200, 150)))
            curve.setStyle(QwtPlotCurve.Lines)
            self.tuples.append(
                (curve, QwtScaleMap(0, 100, -1.1, 3.0), QwtScaleMap(0, 100, -1.1, 3.0))
            )
            # curve 4
            curve = QwtPlotCurve()
            curve.setPen(QPen(Qt.red))
            curve.setStyle(QwtPlotCurve.Lines)
            self.tuples.append(
                (curve, QwtScaleMap(0, 100, -5.0, 1.1), QwtScaleMap(0, 100, -1.1, 5.0))
            )
            # data
            self.phase = 0.0
            self.base = np.arange(0.0, 2.01 * np.pi, 2 * np.pi / (USize - 1))
            self.uval = np.cos(self.base)
            self.vval = np.sin(self.base)
            self.uval[1::2] *= 0.5
            self.vval[1::2] *= 0.5
            self.newValues()
            # start timer
            self.tid = self.startTimer(250)

        def paintEvent(self, event):
            QFrame.paintEvent(self, event)
            painter = QPainter(self)
            painter.setClipRect(self.contentsRect())
            self.drawContents(painter)

        def drawContents(self, painter):
            r = self.contentsRect()
            for curve, xMap, yMap in self.tuples:
                xMap.setPaintInterval(r.left(), r.right())
                yMap.setPaintInterval(r.top(), r.bottom())
                curve.draw(painter, xMap, yMap, r)

        def timerEvent(self, event):
            self.newValues()
            self.repaint()

        def newValues(self):
            phase = self.phase

            self.xval = np.arange(0, 2.01 * np.pi, 2 * np.pi / (Size - 1))
            self.yval = np.sin(self.xval - phase)
            self.zval = np.cos(3 * (self.xval + phase))

            s = 0.25 * np.sin(phase)
            c = np.sqrt(1.0 - s * s)
            u = self.uval
            self.uval = c * self.uval - s * self.vval
            self.vval = c * self.vval + s * u

            self.tuples[0][0].setData(self.yval, self.xval)
            self.tuples[1][0].setData(self.xval, self.zval)
            self.tuples[2][0].setData(self.yval, self.zval)
            self.tuples[3][0].setData(self.uval, self.vval)

            self.phase += 2 * np.pi / 100
            if self.phase > 2 * np.pi:
                self.phase = 0.0

    def test_curvedemo2():
        """Curve demo 2"""
        utils.test_widget(CurveDemo2, options=False)

    if __name__ == "__main__":
        test_curvedemo2()