@ -176,7 +176,8 @@ class SongEditor(QtWidgets.QGraphicsScene):
self . setSceneRect ( 0 , 0 , requestAmountOfMeasures * SIZE_UNIT , self . cachedCombinedTrackHeight + 3 * SIZE_TOP_OFFSET ) #no empty space on top without a scene rect
for track in self . tracks . values ( ) :
track . updateSwitchVisibility ( requestAmountOfMeasures = requestAmountOfMeasures - 1 )
factor = track . exportDict [ " patternLengthMultiplicator " ]
track . updateSwitchVisibility ( requestAmountOfMeasures = ( requestAmountOfMeasures - 1 ) / / factor )
track . updateStaffLines ( requestAmountOfMeasures - 1 )
def callback_scoreChanged ( self , exportDictScore ) :
@ -226,9 +227,10 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
self . _mousePressOn = None #to remember the position of a mouse click
#self._markerLine = QtWidgets.QGraphicsLineItem(0,0,10,0) #only updated, never replaced
self . _markerLine = QtWidgets . QGraphicsRectItem ( 0 , 0 , 10 , SIZE_UNIT ) #only updated, never replaced
self . _markerLine . setParentItem ( self )
self . _markerLine . setY ( 0 ) #x is set in mousePressEvent
self . _markerLine . setZValue ( _zValuesRelativeToScene [ " playhead " ] )
#self._markerLine.setParentItem(self) #incompatible with zValues. We need this relative to the scene
self . parentScene . addItem ( self . _markerLine )
#self._markerLine.setY(self.pos().y()) #won't work yet. We are not in the scene ourselves. We set it in mousePressEvent, before show()
self . _markerLine . setZValue ( _zValuesRelativeToScene [ " switch " ] )
self . _markerLine . hide ( )
#Semitransparent hover-switch to show which one would be activated/deactivated
@ -237,6 +239,7 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
self . _highlightSwitch = QtWidgets . QGraphicsRectItem ( 0 , 0 , SIZE_UNIT , SIZE_UNIT )
self . _highlightSwitch . setParentItem ( self )
self . _highlightSwitch . setOpacity ( 0.2 )
self . _highlightSwitch . hide ( )
def _setColors ( self , exportDict ) :
""" Called from various callbacks like updateSwitches and updateMetadata """
@ -325,6 +328,8 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
whichPatternsAreHalftoneTransposed = self . exportDict [ " whichPatternsAreHalftoneTransposed " ]
factor = self . exportDict [ " patternLengthMultiplicator " ]
#requestAmountOfMeasures = requestAmountOfMeasures // factor #already is.
#Adjust highlight mouse hover to new stretch factor
r = self . _highlightSwitch . rect ( )
r . setRight ( SIZE_UNIT * factor )
@ -335,10 +340,11 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
switch . stretch ( factor )
switch . setPos ( position * SIZE_UNIT * factor , self . y ( ) )
#both position and requestAmountOfMeasures below are adjusted with scale factors
if not position in structure :
switch . hide ( ) #Not delete because this may be just a temporary reduction of measures
switch . scaleTransposeOff ( )
elif position > requestAmountOfMeasures : #switch end is out of bounds. For factor 1 this is the same as not in the score-area
elif position > = requestAmountOfMeasures : #switch is out of bounds. For factor 1 this is the same as not in the score-area
switch . hide ( )
switch . scaleTransposeOff ( )
else :
@ -354,36 +360,6 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
else :
switch . halftoneTransposeOff ( )
def scenePos2switchPosition ( self , x ) :
""" Map scene coordinates to counted switch engine position """
factor = self . exportDict [ " patternLengthMultiplicator " ]
return int ( x / SIZE_UNIT / factor )
def mousePressEvent ( self , event ) :
#First we need to find the mouse clicks position. self.switches only holds pos that were at least activated once.
#The track is only the area where the rectangles and lines meet. it is impossible to click below or right of the tracks.
#we always get a valid position this way.
if event . button ( ) == QtCore . Qt . MiddleButton and not self . _mousePressOn :
self . parentScene . parentView . parentMainWindow . patternGrid . createShadow ( self . exportDict )
else :
self . parentScene . parentView . parentMainWindow . chooseCurrentTrack ( self . exportDict )
if event . button ( ) == QtCore . Qt . LeftButton :
assert not self . _mousePressOn
position = self . scenePos2switchPosition ( event . scenePos ( ) . x ( ) ) #measure number 0 based
self . _markerLine . setX ( position * SIZE_UNIT )
newBool = not position in self . switches or not self . switches [ position ] . isVisible ( )
if newBool :
self . _markerLine . setBrush ( self . currentColor )
else :
self . _markerLine . setBrush ( self . parentScene . parentView . parentMainWindow . fPalBlue . color ( QtGui . QPalette . AlternateBase ) ) #we are always the active track so this is our color
self . _mousePressOn = ( time ( ) , self , position , newBool ) #Reset to None in mouseReleaseEvent
result = api . setSwitch ( self . exportDict [ " id " ] , position , newBool ) #returns True if a switch happend
#elif event.button() == QtCore.Qt.RightButton and not self._mousePressOn:
#no, this is done with contextMenuEvent directly so it also reacts to the context menu keyboard key.
def contextMenuEvent ( self , event ) :
if self . _mousePressOn : #Right click can happen while the left button is still pressed down, which we don't want.
@ -415,10 +391,47 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
self . parentScene . parentView . parentMainWindow . setFocus ( )
menu . exec_ ( pos )
def scenePos2switchPosition ( self , x ) :
""" Map scene coordinates to counted switch engine position """
factor = self . exportDict [ " patternLengthMultiplicator " ]
return int ( x / SIZE_UNIT / factor )
def mousePressEvent ( self , event ) :
#First we need to find the mouse clicks position. self.switches only holds pos that were at least activated once.
#The track is only the area where the rectangles and lines meet. it is impossible to click below or right of the tracks.
#we always get a valid position this way.
if event . button ( ) == QtCore . Qt . MiddleButton and not self . _mousePressOn :
self . parentScene . parentView . parentMainWindow . patternGrid . createShadow ( self . exportDict )
else :
self . parentScene . parentView . parentMainWindow . chooseCurrentTrack ( self . exportDict )
if event . button ( ) == QtCore . Qt . LeftButton : #Create a switch or continue to hold down mouse button and drag to draw -> mouseMoveEvent
assert not self . _mousePressOn
position = self . scenePos2switchPosition ( event . scenePos ( ) . x ( ) ) #measure number 0 based
self . _markerLine . setX ( position * SIZE_UNIT * self . exportDict [ " patternLengthMultiplicator " ] )
self . _markerLine . setY ( self . pos ( ) . y ( ) ) #we can't do that in init because self is not in the scene by then. markerLine is a child directly to the scene, no magic reparenting.
newBool = not position in self . switches or not self . switches [ position ] . isVisible ( )
if newBool :
self . _markerLine . setBrush ( self . currentColor )
else :
self . _markerLine . setBrush ( self . parentScene . parentView . parentMainWindow . fPalBlue . color ( QtGui . QPalette . AlternateBase ) ) #we are always the active track so this is our color
self . _mousePressOn = ( time ( ) , self , position , newBool ) #Reset to None in mouseReleaseEvent
result = api . setSwitch ( self . exportDict [ " id " ] , position , newBool ) #returns True if a switch happend
#elif event.button() == QtCore.Qt.RightButton and not self._mousePressOn:
#no, this is done with contextMenuEvent directly so it also reacts to the context menu keyboard key.
def mouseMoveEvent ( self , event ) :
""" In Patroneo this is only triggered when left mouse button is down.
""" Draw new switches by holding and dragging the mouse
This is only the visual aspect . Actual calcuation and insert is in mouseReleaseEvent
The initial _markerLine is setup in mousePressEvent , where the first switch is already set as well
In Patroneo this is only triggered when left mouse button is down .
We don ' t set the Qt flag to always react " " "
position = self . scenePos2switchPosition ( event . scenePos ( ) . x ( ) ) #measure number 0 based
factor = self . exportDict [ " patternLengthMultiplicator " ]
if self . _mousePressOn and position != self . _mousePressOn [ 2 ] :
#self._markerLine.setLine(0,0, (position - self._mousePressOn[2])*SIZE_UNIT + SIZE_UNIT/2, 0)
rect = self . _markerLine . rect ( )
@ -429,11 +442,11 @@ class TrackStructure(QtWidgets.QGraphicsRectItem):
if position < self . _mousePressOn [ 2 ] :
left = ( position - self . _mousePressOn [ 2 ] ) * SIZE_UNIT
rect . setLeft ( left )
rect . setLeft ( left * factor )
rect . setRight ( SIZE_UNIT )
else :
right = ( position - self . _mousePressOn [ 2 ] ) * SIZE_UNIT + SIZE_UNIT
rect . setRight ( right )
rect . setRight ( right * factor )
rect . setLeft ( 0 )
self . _markerLine . setRect ( rect )