@@ -225,8 +225,8 @@ def changed(self, action):
225
225
# Reset the scale when loading new JSON
226
226
if action .type == "load" :
227
227
# Set the scale again (to project setting)
228
- initial_scale = get_app ().project .get ("scale" ) or 15
229
- self .window .sliderZoom . setValue ( secondsToZoom ( initial_scale ) )
228
+ initial_scale = get_app ().project .get ("scale" ) or 15.0
229
+ self .window .sliderZoomWidget . setZoomFactor ( initial_scale )
230
230
231
231
# The setValue() above doesn't trigger update_zoom when a project file is
232
232
# loaded on the command line (too early?), so also call the JS directly
@@ -436,7 +436,7 @@ def ShowEffectMenu(self, effect_id=None):
436
436
log .debug ('ShowEffectMenu: %s' % effect_id )
437
437
438
438
# Set the selected clip (if needed)
439
- self .window . addSelection (effect_id , 'effect' , True )
439
+ self .addSelection (effect_id , 'effect' , True )
440
440
441
441
menu = QMenu (self )
442
442
# Properties
@@ -492,7 +492,7 @@ def ShowClipMenu(self, clip_id=None):
492
492
493
493
# Set the selected clip (if needed)
494
494
if clip_id not in self .window .selected_clips :
495
- self .window . addSelection (clip_id , 'clip' )
495
+ self .addSelection (clip_id , 'clip' )
496
496
# Get list of selected clips
497
497
clip_ids = self .window .selected_clips
498
498
tran_ids = self .window .selected_transitions
@@ -2529,7 +2529,7 @@ def ShowTransitionMenu(self, tran_id=None):
2529
2529
2530
2530
# Set the selected transition (if needed)
2531
2531
if tran_id not in self .window .selected_transitions :
2532
- self .window . addSelection (tran_id , 'transition' )
2532
+ self .addSelection (tran_id , 'transition' )
2533
2533
# Get list of all selected transitions
2534
2534
tran_ids = self .window .selected_transitions
2535
2535
clip_ids = self .window .selected_clips
@@ -2733,16 +2733,12 @@ def SetPlayheadFollow(self, enable_follow):
2733
2733
@pyqtSlot (str , str , bool )
2734
2734
def addSelection (self , item_id , item_type , clear_existing = False ):
2735
2735
""" Add the selected item to the current selection """
2736
-
2737
- # Add to main window
2738
- self .window .addSelection (item_id , item_type , clear_existing )
2736
+ self .window .SelectionAdded .emit (item_id , item_type , clear_existing )
2739
2737
2740
2738
@pyqtSlot (str , str )
2741
2739
def removeSelection (self , item_id , item_type ):
2742
2740
""" Remove the selected clip from the selection """
2743
-
2744
- # Remove from main window
2745
- self .window .removeSelection (item_id , item_type )
2741
+ self .window .SelectionRemoved .emit (item_id , item_type )
2746
2742
2747
2743
@pyqtSlot (str , str )
2748
2744
def qt_log (self , level = "INFO" , message = None ):
@@ -2759,16 +2755,15 @@ def qt_log(self, level="INFO", message=None):
2759
2755
level = levels .get (level , logging .INFO )
2760
2756
self .log_fn (level , message )
2761
2757
2758
+ def update_scroll (self , newScroll ):
2759
+ """Force a scroll event on the timeline (i.e. the zoom slider is moving, so we need to scroll the timeline)"""
2760
+ # Get access to timeline scope and set scale to new computed value
2761
+ self .run_js (JS_SCOPE_SELECTOR + ".setScroll(" + str (newScroll ) + ");" )
2762
+
2762
2763
# Handle changes to zoom level, update js
2763
- def update_zoom (self , newValue ):
2764
+ def update_zoom (self , newScale ):
2764
2765
_ = get_app ()._tr
2765
2766
2766
- # Convert slider value (passed in) to a scale (in seconds)
2767
- newScale = zoomToSeconds (newValue )
2768
-
2769
- # Set zoom label
2770
- self .window .zoomScaleLabel .setText (_ ("{} seconds" ).format (newScale ))
2771
-
2772
2767
# Determine X coordinate of cursor (to center zoom on)
2773
2768
cursor_y = self .mapFromGlobal (self .cursor ().pos ()).y ()
2774
2769
if cursor_y >= 0 :
@@ -2795,13 +2790,13 @@ def update_zoom(self, newValue):
2795
2790
def wheelEvent (self , event ):
2796
2791
if event .modifiers () & Qt .ControlModifier :
2797
2792
event .accept ()
2798
- zoom = self . window . sliderZoom
2799
- # For each 120 (standard scroll unit) adjust the zoom slider
2800
- tick_scale = 120
2801
- steps = int ( event . angleDelta (). y () / tick_scale )
2802
- delta = zoom . pageStep () * steps
2803
- log . debug ( "Zooming by %d steps" , - steps )
2804
- zoom . setValue ( zoom . value () - delta )
2793
+
2794
+ # Modify zooms factor
2795
+ if event . angleDelta (). y () > 0 :
2796
+ get_app (). window . sliderZoomWidget . zoomIn ( )
2797
+ else :
2798
+ get_app (). window . sliderZoomWidget . zoomOut ( )
2799
+
2805
2800
else :
2806
2801
super ().wheelEvent (event )
2807
2802
@@ -2911,6 +2906,11 @@ def callback(self, data, callback_data):
2911
2906
self .run_js (JS_SCOPE_SELECTOR + ".getJavaScriptPosition({}, {});"
2912
2907
.format (event_position .x (), event_position .y ()), partial (callback , self , data ))
2913
2908
2909
+ @pyqtSlot (list )
2910
+ def ScrollbarChanged (self , new_positions ):
2911
+ """Timeline scrollbars changed"""
2912
+ get_app ().window .TimelineScrolled .emit (new_positions )
2913
+
2914
2914
# Resize timeline
2915
2915
@pyqtSlot (float )
2916
2916
def resizeTimeline (self , new_duration ):
@@ -3180,7 +3180,9 @@ def __init__(self, window):
3180
3180
app .updates .add_listener (self )
3181
3181
3182
3182
# Connect zoom functionality
3183
- window .sliderZoom .valueChanged .connect (self .update_zoom )
3183
+ window .TimelineZoom .connect (self .update_zoom )
3184
+ window .TimelineScroll .connect (self .update_scroll )
3185
+ window .TimelineCenter .connect (self .centerOnPlayhead )
3184
3186
3185
3187
# Connect waveform generation signal
3186
3188
window .WaveformReady .connect (self .Waveform_Ready )
0 commit comments