1############################################################################# 2## 3## Copyright (C) 2013 Riverbank Computing Limited. 4## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 5## All rights reserved. 6## 7## This file is part of the examples of PyQt. 8## 9## $QT_BEGIN_LICENSE:LGPL$ 10## Commercial Usage 11## Licensees holding valid Qt Commercial licenses may use this file in 12## accordance with the Qt Commercial License Agreement provided with the 13## Software or, alternatively, in accordance with the terms contained in 14## a written agreement between you and Nokia. 15## 16## GNU Lesser General Public License Usage 17## Alternatively, this file may be used under the terms of the GNU Lesser 18## General Public License version 2.1 as published by the Free Software 19## Foundation and appearing in the file LICENSE.LGPL included in the 20## packaging of this file. Please review the following information to 21## ensure the GNU Lesser General Public License version 2.1 requirements 22## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. 23## 24## In addition, as a special exception, Nokia gives you certain additional 25## rights. These rights are described in the Nokia Qt LGPL Exception 26## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. 27## 28## GNU General Public License Usage 29## Alternatively, this file may be used under the terms of the GNU 30## General Public License version 3.0 as published by the Free Software 31## Foundation and appearing in the file LICENSE.GPL included in the 32## packaging of this file. Please review the following information to 33## ensure the GNU General Public License version 3.0 requirements will be 34## met: http://www.gnu.org/copyleft/gpl.html. 35## 36## If you have questions regarding the use of this file, please contact 37## Nokia at qt-info@nokia.com. 38## $QT_END_LICENSE$ 39## 40############################################################################# 41 42 43import math 44 45from PyQt5.QtCore import QPointF 46 47from guide import Guide 48 49 50PI2 = 2 * math.pi 51 52 53class GuideCircle(Guide): 54 CW = 1 55 CCW = -1 56 57 def __init__(self, rect, startAngle=0.0, span=360.0, dir=CCW, follows=None): 58 super(GuideCircle, self).__init__(follows) 59 60 self.radiusX = rect.width() / 2.0 61 self.radiusY = rect.height() / 2.0 62 self.posX = rect.topLeft().x() 63 self.posY = rect.topLeft().y() 64 self.spanRad = span * PI2 / -360.0 65 66 if dir == GuideCircle.CCW: 67 self.startAngleRad = startAngle * PI2 / -360.0 68 self.endAngleRad = self.startAngleRad + self.spanRad 69 self.stepAngleRad = self.spanRad / self.length() 70 else: 71 self.startAngleRad = self.spanRad + (startAngle * PI2 / -360.0) 72 self.endAngleRad = startAngle * PI2 / -360.0 73 self.stepAngleRad = -self.spanRad / self.length() 74 75 def length(self): 76 return abs(self.radiusX * self.spanRad) 77 78 def startPos(self): 79 return QPointF((self.posX + self.radiusX + self.radiusX * math.cos(self.startAngleRad)) * self.scaleX, 80 (self.posY + self.radiusY + self.radiusY * math.sin(self.startAngleRad)) * self.scaleY) 81 82 def endPos(self): 83 return QPointF((self.posX + self.radiusX + self.radiusX * math.cos(self.endAngleRad)) * self.scaleX, 84 (self.posY + self.radiusY + self.radiusY * math.sin(self.endAngleRad)) * self.scaleY) 85 86 def guide(self, item, moveSpeed): 87 frame = item.guideFrame - self.startLength 88 end = QPointF((self.posX + self.radiusX + self.radiusX * math.cos(self.startAngleRad + (frame * self.stepAngleRad))) * self.scaleX, 89 (self.posY + self.radiusY + self.radiusY * math.sin(self.startAngleRad + (frame * self.stepAngleRad))) * self.scaleY) 90 self.move(item, end, moveSpeed) 91