diff --git a/CHANGELOG b/CHANGELOG index ee4b2ee..0657144 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,7 @@ Add non-destructive step delay for individual measures. Shift an individual meas Add track-switch to choose step-delay wrap-around behaviour, if delayed notes end up outside the pattern Add non-destructiv pattern augmentation/scaling. Make an individual measure shorter or longer overall, with the same GUI as transpositions. Add track-switch to choose repeat-to-fill behaviour if scaling a pattern shorter, which creates empty space. +Change user input to choose above measure modifications. Everything is now accesible by shortcuts, removing the functionality from the mousewheel. Fix wrong playback cursor speed. Fix small GUI drawing issues diff --git a/engine/pattern.py b/engine/pattern.py index d625d2c..16cf198 100644 --- a/engine/pattern.py +++ b/engine/pattern.py @@ -379,7 +379,7 @@ class Pattern(object): endTick = int(endTick * augmentationFactor) #Prevent augmented notes to start and hang when exceeding the pattern-length - if startTick >= oneMeasureInTicks-1: #-1 is important!!! Without it we will get hanging notes with factor 1.333 + if startTick >= oneMeasureInTicks-1: #-1 is important!!! Without it we will get hanging notes with e.g. factor 1.333 continue #do not create a note, at all if endTick > oneMeasureInTicks: diff --git a/qtgui/mainwindow.py b/qtgui/mainwindow.py index 0c1da83..5747738 100644 --- a/qtgui/mainwindow.py +++ b/qtgui/mainwindow.py @@ -537,7 +537,7 @@ class MainWindow(TemplateMainWindow): def stretchXCoordinates(self, factor): pass - def zoomUpperHalf(self, delta): + def zoomUpperHalf(self, event): """This is called from within the parts of the combined song editor. The Song Editor consists of three graphic scenes and their views. But only the part where you can switch measures on and off calls this.""" @@ -545,6 +545,8 @@ class MainWindow(TemplateMainWindow): try: self.zoomFactor except: self.zoomFactor = 1 # no save. We don't keep a qt config. + delta = event.delta() + if delta > 0: #zoom in self.zoomFactor = min(5, round(self.zoomFactor + 0.25, 2)) else: #zoom out @@ -556,7 +558,10 @@ class MainWindow(TemplateMainWindow): self.ui.songEditorView.scale(self.zoomFactor, self.zoomFactor) self.ui.trackEditorView.scale(1, self.zoomFactor) self.ui.timelineView.scale(self.zoomFactor, 1) - #view.centerOn(event.scenePos()) + + self.ui.songEditorView.centerOn(event.scenePos()) + #self.ui.trackEditorView.verticalScrollBar().setValue(event.scenePos().y()) + #self.ui.timelineView.horizontalScrollBar().setValue(event.scenePos().x()) def _stretchXCoordinates(*args): pass #Override template function diff --git a/qtgui/songeditor.py b/qtgui/songeditor.py index 58244e4..27e6b83 100644 --- a/qtgui/songeditor.py +++ b/qtgui/songeditor.py @@ -36,7 +36,7 @@ import engine.api as api #Session is already loaded and created, no duplication. -SIZE_UNIT = 25 #this is in manual sync with timeline.py SIZE_UNIT +SIZE_UNIT = 30 #this is in manual sync with timeline.py SIZE_UNIT SIZE_TOP_OFFSET = 0 _zValuesRelativeToScene = { #Only use for objects added directly to the scene, not children. @@ -93,7 +93,7 @@ class SongEditor(QtWidgets.QGraphicsScene): def wheelEvent(self, event): """zoom, otherwise ignore event""" if QtWidgets.QApplication.keyboardModifiers() == QtCore.Qt.ControlModifier: - self.parentView.parentMainWindow.zoomUpperHalf(event.delta()) + self.parentView.parentMainWindow.zoomUpperHalf(event) event.accept() else: event.ignore() @@ -598,32 +598,32 @@ class Switch(QtWidgets.QGraphicsRectItem): self.scaleTransposeGlyph = QtWidgets.QGraphicsSimpleTextItem("") self.scaleTransposeGlyph.setParentItem(self) - self.scaleTransposeGlyph.setScale(0.80) - self.scaleTransposeGlyph.setPos(2,1) + self.scaleTransposeGlyph.setScale(0.75) + self.scaleTransposeGlyph.setPos(2,0) self.scaleTransposeGlyph.setBrush(self.parentTrackStructure.labelColor) self.scaleTransposeGlyph.hide() self.scaleTranspose = 0 #default engine value, safe to assume that it will never change as default. self.halftoneTransposeGlyph = QtWidgets.QGraphicsSimpleTextItem("") self.halftoneTransposeGlyph.setParentItem(self) - self.halftoneTransposeGlyph.setScale(0.80) - self.halftoneTransposeGlyph.setPos(1,13) + self.halftoneTransposeGlyph.setScale(0.75) + self.halftoneTransposeGlyph.setPos(2,0) #We expect that only one of the transpose variants will be used. Therefore we place them on the same coordinates, because there is not enough space for 4 mods. self.halftoneTransposeGlyph.setBrush(self.parentTrackStructure.labelColor) self.halftoneTransposeGlyph.hide() self.halftoneTranspose = 0 #default engine value, safe to assume that it will never change as default. self.stepDelayGlyph = QtWidgets.QGraphicsSimpleTextItem("") self.stepDelayGlyph.setParentItem(self) - self.stepDelayGlyph.setScale(0.80) - self.stepDelayGlyph.setPos(1,13) + self.stepDelayGlyph.setScale(0.75) + self.stepDelayGlyph.setPos(1,10) self.stepDelayGlyph.setBrush(self.parentTrackStructure.labelColor) self.stepDelayGlyph.hide() self.stepDelay = 0 #default engine value, safe to assume that it will never change as default. self.augmentationFactorGlyph = QtWidgets.QGraphicsSimpleTextItem("") self.augmentationFactorGlyph.setParentItem(self) - self.augmentationFactorGlyph.setScale(0.80) - self.augmentationFactorGlyph.setPos(1,13) + self.augmentationFactorGlyph.setScale(0.75) + self.augmentationFactorGlyph.setPos(1,20) self.augmentationFactorGlyph.setBrush(self.parentTrackStructure.labelColor) self.augmentationFactorGlyph.hide() self.augmentationFactor = 0 #default engine value, safe to assume that it will never change as default. @@ -745,7 +745,7 @@ class Switch(QtWidgets.QGraphicsRectItem): self._setAugmentationFactorLabel(Fraction(value)) def _setAugmentationFactorLabel(self, value): - text = "a" + str(value) + text = "×" + str(value) self.augmentationFactorGlyph.setText(text) self.augmentationFactorGlyph.show() @@ -777,7 +777,7 @@ class Switch(QtWidgets.QGraphicsRectItem): def hoverEnterEvent(self, event): """Only active switches""" #self.statusMessage(QtCore.QCoreApplication.translate("Statusbar", "Measure: Left click to deactivate. Middle click to show as shadows in current pattern. Shift+MouseWheel for half tone transposition. Alt+MouseWheel for in-scale transposition. Right click for measure group options.")) - self.statusMessage(QtCore.QCoreApplication.translate("Statusbar", "Measure: Left click to deactivate. Middle click to show as shadows in current pattern. Right click for measure group options. Read Edit menu for advanced modifications while hovering.")) + self.statusMessage(QtCore.QCoreApplication.translate("Statusbar", "Measure: Left click to deactivate. Middle click to show as shadows in current pattern. Right click for measure group options. Read the Edit menu for advanced modifications while hovering.")) self._bufferScaleTranspose = self.scaleTranspose self._bufferHalftoneTranspose = self.halftoneTranspose self._bufferStepDelay = self.stepDelay @@ -1089,18 +1089,18 @@ class TrackLabel(QtWidgets.QGraphicsRectItem): self.lengthMultiplicatorSpinBox = TrackLabel.lengthMultiplicatorSpinBox(parentTrackLabel=self) self.lengthMultiplicatorSpinBox.setParentItem(self) - self.lengthMultiplicatorSpinBox.setPos(SIZE_UNIT,0) + self.lengthMultiplicatorSpinBox.setPos(SIZE_UNIT,2) self.colorButton = TrackLabel.ColorPicker(parentTrackLabel=self) self.colorButton.setParentItem(self) - self.colorButton.setPos(4*SIZE_UNIT, 3) + self.colorButton.setPos(3*SIZE_UNIT, 3) self.lineEdit = TrackLabel.NameLineEdit(parentTrackLabel=self) self.label = QtWidgets.QGraphicsProxyWidget() self.label.setWidget(self.lineEdit) self.label.setParentItem(self) - self.label.setPos(5*SIZE_UNIT+3,0) + self.label.setPos(4*SIZE_UNIT+3,0) class lengthMultiplicatorSpinBox(QtWidgets.QGraphicsProxyWidget): def __init__(self, parentTrackLabel): @@ -1167,8 +1167,8 @@ class TrackLabel(QtWidgets.QGraphicsRectItem): self.arrowLabel = QtWidgets.QGraphicsSimpleTextItem("↕") self.arrowLabel.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresParentOpacity) self.arrowLabel.setParentItem(self) - self.arrowLabel.setScale(1.6) - self.arrowLabel.setPos(2,1) + self.arrowLabel.setScale(1.5) + self.arrowLabel.setPos(5,2) #try to get the center role = QtGui.QPalette.Text self.arrowLabel.setBrush(self.parentTrackLabel.parentScene.parentView.parentMainWindow.fPalBlue.color(role)) @@ -1323,7 +1323,7 @@ class GroupLabel(QtWidgets.QGraphicsRectItem): self.label = QtWidgets.QGraphicsProxyWidget() self.label.setWidget(self.qLabel) self.label.setParentItem(self) - self.label.setPos(4*SIZE_UNIT+3,0) + self.label.setPos(3*SIZE_UNIT+3,0) self.qLabel.setMinimumSize(QtCore.QSize(0, SIZE_UNIT)) self.qLabel.setStyleSheet("background-color: rgba(0,0,0,0)") #transparent so we see the RectItem color @@ -1360,8 +1360,8 @@ class GroupLabel(QtWidgets.QGraphicsRectItem): self.arrowLabel = QtWidgets.QGraphicsSimpleTextItem("↕") self.arrowLabel.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresParentOpacity) self.arrowLabel.setParentItem(self) - self.arrowLabel.setScale(1.6) - self.arrowLabel.setPos(2,1) + self.arrowLabel.setScale(1.5) + self.arrowLabel.setPos(5,2) #try to get the center role = QtGui.QPalette.Text self.arrowLabel.setBrush(self.parentGroupLabel.parentScene.parentView.parentMainWindow.fPalBlue.color(role)) diff --git a/qtgui/timeline.py b/qtgui/timeline.py index 2b720bb..b1056e9 100644 --- a/qtgui/timeline.py +++ b/qtgui/timeline.py @@ -22,7 +22,7 @@ along with this program. If not, see . import logging; logger = logging.getLogger(__name__); logger.info("import") -SIZE_UNIT = 25 #this is in manual sync with songeditor.py SIZE_UNIT +SIZE_UNIT = 30 #this is in manual sync with songeditor.py SIZE_UNIT import engine.api as api #Session is already loaded and created, no duplication. from PyQt5 import QtCore, QtGui, QtWidgets