@@ -1399,6 +1399,43 @@ Rectangle {
13991399 property var initialValue: 0
14001400 property real minScaleX: 0
14011401
1402+ function wheelDelta (pixelDelta , angleDelta ) {
1403+ return pixelDelta !== 0 ? pixelDelta : angleDelta
1404+ }
1405+
1406+ function scrollTimelineHorizontally (deltaX ) {
1407+ let stackItem = list_view .itemAtIndex (0 )
1408+ if (
1409+ ! stackItem ||
1410+ Math .abs (deltaX) < 1 ||
1411+ stackItem .scrollbar .size >= 1.0 ||
1412+ stackItem .scrollbar .width <= 0
1413+ ) {
1414+ return false
1415+ }
1416+
1417+ let positionDelta = (stackItem .scrollbar .size / stackItem .scrollbar .width ) * deltaX
1418+ stackItem .jumpToPosition (stackItem .currentPosition () + positionDelta)
1419+ return true
1420+ }
1421+
1422+ function scrollTimelineVertically (deltaY ) {
1423+ if (
1424+ hovered == null ||
1425+ Math .abs (deltaY) < 1 ||
1426+ ! [" Video Track" , " Audio Track" , " Gap" , " Clip" ].includes (hovered .itemTypeRole )
1427+ ) {
1428+ return false
1429+ }
1430+
1431+ if ([" Video Track" , " Audio Track" ].includes (hovered .itemTypeRole ))
1432+ hovered .parentLV .flick (0 , deltaY > 0 ? 500 : - 500 )
1433+ else if ([" Gap" , " Clip" ].includes (hovered .itemTypeRole ))
1434+ hovered .parentLV .parentLV .flick (0 , deltaY > 0 ? 500 : - 500 )
1435+
1436+ return true
1437+ }
1438+
14021439 Rectangle {
14031440 id: region
14041441 visible: ma .isRegionSelection
@@ -1608,36 +1645,37 @@ Rectangle {
16081645 }
16091646
16101647 onWheel : wheel => {
1648+ let deltaX = wheelDelta (wheel .pixelDelta .x , wheel .angleDelta .x )
1649+ let deltaY = wheelDelta (wheel .pixelDelta .y , wheel .angleDelta .y )
16111650
16121651 // maintain position as we zoom..
16131652 if (wheel .modifiers == Qt .ShiftModifier ) {
16141653 // wheel.angleDelta.y always return 0 on MacOS laptops
16151654 // when SHIFT is pressed and a mouse wheel is used, but in
16161655 // that case the x component is updating and usable.
1617- let deltaY = wheel . angleDelta . y == 0 ? wheel . angleDelta . x : wheel . angleDelta . y
1656+ let zoomDelta = deltaY == 0 ? deltaX : deltaY
16181657 // Limit the scale to keep it within a usable range and
16191658 // avoid a negative scaleY value.
1620- if (deltaY > 1 ) {
1659+ if (zoomDelta > 1 ) {
16211660 scaleY = Math .min (2.0 , scaleY + 0.2 )
16221661 } else {
16231662 scaleY = Math .max (0.6 , scaleY - 0.2 )
16241663 }
16251664 wheel .accepted = true
16261665 } else if (wheel .modifiers == Qt .ControlModifier ) {
16271666 let tmp = scaleX
1628- if (wheel .angleDelta .y > 1 ) {
1667+ let zoomDelta = deltaY == 0 ? deltaX : deltaY
1668+ if (zoomDelta > 1 ) {
16291669 tmp += 0.2
16301670 } else {
16311671 tmp -= 0.2
16321672 }
16331673 scaleX = Math .max ((list_view .width - trackHeaderWidth) / theSessionData .timelineRect ([timeline_items .rootIndex ]).width , tmp)
16341674 list_view .itemAtIndex (0 ).jumpToFrame (timelinePlayhead .logicalFrame , ListView .Center )
16351675 wheel .accepted = true
1636- } else if (hovered != null && [" Video Track" , " Audio Track" ," Gap" ," Clip" ].includes (hovered .itemTypeRole )) {
1637- if ([" Video Track" , " Audio Track" ].includes (hovered .itemTypeRole ))
1638- hovered .parentLV .flick (0 , wheel .angleDelta .y > 1 ? 500 : - 500 )
1639- else if ([" Gap" , " Clip" ].includes (hovered .itemTypeRole ))
1640- hovered .parentLV .parentLV .flick (0 , wheel .angleDelta .y > 1 ? 500 : - 500 )
1676+ } else if (Math .abs (deltaX) > Math .abs (deltaY)) {
1677+ wheel .accepted = scrollTimelineHorizontally (deltaX)
1678+ } else if (scrollTimelineVertically (deltaY)) {
16411679 wheel .accepted = true
16421680 } else {
16431681 wheel .accepted = false
@@ -2232,4 +2270,4 @@ Rectangle {
22322270 // }
22332271 // }
22342272
2235- }
2273+ }
0 commit comments