Skip to content

Commit 7fd836b

Browse files
committed
Use action-delay QTimers right
If a timer is simply meant to introduce a delay before some action, it can be set .setSingleShot(True). Then: * start() will cause it to run for interval() ms, trigger once, and then auto-reset to stop()ped. * Calls to .start() WHILE it's running will reset the timeout to interval() ms. (Technically it's stopped-and-restarted.) * It will only ever run its timeout() callback ONCE per start() from a stopped state, even if it's reset multiple times. * It never needs to be explicitly stop()ped except to cancel it.
1 parent 65e26c6 commit 7fd836b

File tree

5 files changed

+16
-26
lines changed

5 files changed

+16
-26
lines changed

src/windows/export.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434

3535
# Try to get the security-patched XML functions from defusedxml
3636
try:
37-
from defusedxml import minidom as xml
37+
from defusedxml import minidom as xml
3838
except ImportError:
39-
from xml.dom import minidom as xml
39+
from xml.dom import minidom as xml
4040

4141
from xml.parsers.expat import ExpatError
4242

@@ -101,8 +101,8 @@ def __init__(self):
101101
self.delayed_fps_timer = None
102102
self.delayed_fps_timer = QTimer()
103103
self.delayed_fps_timer.setInterval(200)
104+
self.delayed_fps_timer.setSingleShot(True)
104105
self.delayed_fps_timer.timeout.connect(self.delayed_fps_callback)
105-
self.delayed_fps_timer.stop()
106106

107107
# Pause playback (to prevent crash since we are fixing to change the timeline's max size)
108108
get_app().window.actionPlay_trigger(None, force="pause")
@@ -288,10 +288,8 @@ def __init__(self):
288288
self.updateFrameRate()
289289

290290
def delayed_fps_callback(self):
291-
"""Callback for fps/profile changed event timer (to delay the timeline mapping so we don't spam libopenshot)"""
292-
# Stop timer
293-
self.delayed_fps_timer.stop()
294-
291+
"""Callback for fps/profile changed event timer
292+
(to delay the timeline mapping so we don't spam libopenshot)"""
295293
# Calculate fps
296294
fps_double = self.timeline.info.fps.ToDouble()
297295

@@ -355,7 +353,8 @@ def updateFrameRate(self):
355353
self.timeline.info.channels = self.txtChannels.value()
356354
self.timeline.info.channel_layout = self.cboChannelLayout.currentData()
357355

358-
# Send changes to libopenshot (apply mappings to all framemappers)... after a small delay
356+
# Send changes to libopenshot (apply mappings to all framemappers)
357+
# Start or restart timer to process changes after a small delay
359358
self.delayed_fps_timer.start()
360359

361360
# Determine max frame (based on clips)

src/windows/main_window.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -2534,11 +2534,10 @@ def hideEvent(self, event):
25342534
def show_property_timeout(self):
25352535
"""Callback for show property timer"""
25362536

2537-
# Stop timer
2538-
self.show_property_timer.stop()
2539-
25402537
# Emit load properties signal
2541-
self.propertyTableView.loadProperties.emit(self.show_property_id, self.show_property_type)
2538+
self.propertyTableView.loadProperties.emit(
2539+
self.show_property_id,
2540+
self.show_property_type)
25422541

25432542
def InitKeyboardShortcuts(self):
25442543
"""Initialize all keyboard shortcuts from the settings file"""
@@ -2754,8 +2753,8 @@ def __init__(self, mode=None):
27542753
self.show_property_type = None
27552754
self.show_property_timer = QTimer()
27562755
self.show_property_timer.setInterval(100)
2756+
self.show_property_timer.setSingleShot(True)
27572757
self.show_property_timer.timeout.connect(self.show_property_timeout)
2758-
self.show_property_timer.stop()
27592758

27602759
# Setup video preview QWidget
27612760
self.videoPreview = VideoWidget()

src/windows/models/properties_model.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -549,9 +549,6 @@ def update_model(self, filter=""):
549549
app = get_app()
550550
_ = app._tr
551551

552-
# Stop QTimer
553-
self.update_timer.stop()
554-
555552
# Check for a selected clip
556553
if self.selected and self.selected[0]:
557554
c, item_type = self.selected[0]
@@ -824,8 +821,8 @@ def __init__(self, parent, *args):
824821
# to update the property model hundreds of times)
825822
self.update_timer = QTimer()
826823
self.update_timer.setInterval(100)
824+
self.update_timer.setSingleShot(True)
827825
self.update_timer.timeout.connect(self.update_item_timeout)
828-
self.update_timer.stop()
829826
self.next_item_id = None
830827
self.next_item_type = None
831828

src/windows/video_widget.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,6 @@ def resizeEvent(self, event):
717717

718718
def delayed_resize_callback(self):
719719
"""Callback for resize event timer (to delay the resize event, and prevent lots of similar resize events)"""
720-
# Stop timer
721-
self.delayed_resize_timer.stop()
722-
723720
# Ensure width & height are divisible by 2 (round decimals).
724721
# Trying to find the closest even number to the requested aspect ratio
725722
# so that both width and height are divisible by 2. This is to prevent some
@@ -838,8 +835,8 @@ def __init__(self, *args):
838835
self.delayed_size = None
839836
self.delayed_resize_timer = QTimer()
840837
self.delayed_resize_timer.setInterval(200)
838+
self.delayed_resize_timer.setSingleShot(True)
841839
self.delayed_resize_timer.timeout.connect(self.delayed_resize_callback)
842-
self.delayed_resize_timer.stop()
843840

844841
# Connect to signals
845842
self.win.TransformSignal.connect(self.transformTriggered)

src/windows/views/timeline_webview.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -1936,7 +1936,7 @@ def Slice_Triggered(self, action, clip_ids, trans_ids, playhead_position=0):
19361936
# Save changes
19371937
self.update_clip_data(clip.data, only_basic_props=False, ignore_reader=True)
19381938

1939-
# Start timer to redraw audio waveforms
1939+
# Start or restart timer to redraw audio waveforms
19401940
self.redraw_audio_timer.start()
19411941

19421942
# Loop through each transition (using the list of ids)
@@ -2737,7 +2737,7 @@ def update_zoom(self, newValue):
27372737
cmd = JS_SCOPE_SELECTOR + ".setScale(" + str(newScale) + "," + str(cursor_x) + ");"
27382738
self.eval_js(cmd)
27392739

2740-
# Start timer to redraw audio
2740+
# Start or restart timer to redraw audio
27412741
self.redraw_audio_timer.start()
27422742

27432743
# Only update scale if different
@@ -3046,9 +3046,6 @@ def redraw_audio_onTimeout(self):
30463046
"""Timer is ready to redraw audio (if any)"""
30473047
log.info('redraw_audio_onTimeout')
30483048

3049-
# Stop timer
3050-
self.redraw_audio_timer.stop()
3051-
30523049
# Pass to javascript timeline (and render)
30533050
cmd = JS_SCOPE_SELECTOR + ".reDrawAllAudioData();"
30543051
self.page().mainFrame().evaluateJavaScript(cmd)
@@ -3138,6 +3135,7 @@ def __init__(self, window):
31383135
# Delayed zoom audio redraw
31393136
self.redraw_audio_timer = QTimer(self)
31403137
self.redraw_audio_timer.setInterval(300)
3138+
self.redraw_audio_timer.setSingleShot(True)
31413139
self.redraw_audio_timer.timeout.connect(self.redraw_audio_onTimeout)
31423140

31433141
# QTimer for cache rendering

0 commit comments

Comments
 (0)