Skip to main content
6 of 6
deleted 32 characters in body
tintwotin
  • 2.5k
  • 10
  • 24

How to detect updates in Sequencer by comparing to a global variable?

This may be a two-fold question, but I think I got an answer on the first:

In order to keep the strain of running an "detect updates" function, as low as possible, I would like to make it as streamlined as possible. But there doesn't seem to be an equivalent to ex. "bpy.data.movieclips.is_updated" (for the motion tracker clip) for the sequencer?https://docs.blender.org/api/blender_python_api_2_76_0/bpy.types.BlendData.html

So I guess the only way is to compare the currently active strip's data with the data of a previous active strip, on scene updates, but how do I do that?

import bpy 
from bpy.app.handlers import persistent

oldStrip = bpy.context.scene.sequence_editor.active_strip  
 
def sequencer_update(context):
    #if bpy.data.movieclips.is_updated: # Updates on tracker file updates, but no sequencer .is_updated function? 
    
        global oldStrip
        activeStrip = bpy.context.scene.sequence_editor.active_strip
        print("Active strip: "+str(activeStrip.name))
        if oldStrip != activeStrip: # 
            if oldStrip.name == activeStrip.name:
                if oldStrip.frame_final_start == activeStrip.frame_final_start and oldStrip.frame_final_end == activeStrip.frame_final_end:
                    print("Strip not moved, maybe a rename or other property changes?")
                if oldStrip.frame_final_start != activeStrip.frame_final_start and oldStrip.frame_final_end != activeStrip.frame_final_end:
                    print("Entire strip moved")
                if oldStrip.frame_final_start != activeStrip.frame_final_start and oldStrip.frame_final_end == activeStrip.frame_final_end: 
                    print("Start handle moved")
                    bpy.context.scene.frame_set(sequence.frame_final_start) # move time cursor
                if oldStrip.frame_final_start == activeStrip.frame_final_start and oldStrip.frame_final_end != activeStrip.frame_final_end:
                    print("End handle moved")
                    bpy.context.scene.frame_set(sequence.frame_final_start)# move time cursor                        
            else:
                print("New strip selected")    
        oldStrip = activeStrip
#Register 
def register():
    
    handlers = bpy.app.handlers.scene_update_pre
    for handler in handlers:
        if ("sequencer_update" in str(handler)):
            handlers.remove(handler)
    handlers.append(sequencer_update)

def unregister():
    handlers = bpy.app.handlers.scene_update_pre
    for handler in handlers:
        if ("sequencer_update" in str(handler)):
            handlers.remove(handler)

    #Unregister operators
    bpy.utils.unregister_module(__name__)

if __name__ == "__main__":
    register()

unregister()
tintwotin
  • 2.5k
  • 10
  • 24