Ensemble plugin.py

import gobject

global model_no_animate, imol_animate, model_no_max_animate
global animate_id

if (have_coot_python):
  if coot_python.main_menubar():
    
    menu = coot_menubar_menu("Ensembles")

    def animate_model(imol):
        global animate_id, model_no_animate

        model_no_max_animate = n_models(imol)
        model_no_animate = 1
        
        def animate_single_model_func(imol, model_no_max_animate):
          while True:
            while gtk.events_pending():
              gtk.main_iteration(False)
            global model_no_animate
            single_model_view_model_number(imol, model_no_animate)
            model_no_animate += 1
            if model_no_animate > model_no_max_animate:
                model_no_animate = 1
            return True

        animate_id = gobject.timeout_add(20, animate_single_model_func,
                                         imol, model_no_max_animate)
        
    add_simple_coot_menu_menuitem(
        menu,
        "Animate a model...",
        lambda func:
        molecule_chooser_gui("Ensemble model to animate:",
                             lambda imol:
                             animate_model(imol)))

    add_simple_coot_menu_menuitem(
        menu,
        "Stop model animation",
        lambda func: gobject.source_remove(animate_id))

    
    def toolbar_model(imol):
        button_text = "Ensemble selection " + str(imol) + " " + molecule_name(imol)
        coot_toolbar_combobox(button_text, map(str, range(n_models(imol)+1)),
                              [single_model_view_model_number, imol], tooltip=button_text)
#                              [printf], tooltip=button_text)
        
    def toolbar_model_play(imol):
        global animate_id
        callback_func_str = "single_model_view_next_model_number(" + str(imol) + ")"

        coot_toolbar_button("First model",
                            "single_model_view_model_number(" + str(imol) + ", 1)",
                            icon_name="gtk-goto-first",
                            tooltip="Jump to first model")

        coot_toolbar_button("Previous model",
                            "single_model_view_prev_model_number(" + str(imol) + ")",
                            icon_name="gtk-go-back",
                            tooltip="Jump to previous model")

        coot_toolbar_button("Next model",
                            "single_model_view_next_model_number(" + str(imol) + ")",
                            icon_name="gtk-go-forward",
                            tooltip="Jump to next model")

        coot_toolbar_button("Last model",
                            "single_model_view_model_number(" + str(imol) + ","  + str(n_models(imol)) + ")",
                            icon_name="gtk-goto-last",
                            tooltip="Jump to last model")

        coot_toolbar_button("All models",
                            "single_model_view_model_number(" + str(imol) + ", 0)",
                            icon_name="gtk-home",
                            tooltip="All model")

        # we cannot add the stop button until we have the animate_id
        # so unfortunatley no button for this yet
##        coot_toolbar_button("Animate models",
##                            "animate_model(" + str(imol) + ")",
##                            icon_name="gtk-media-play",
##                            tooltip="Animate the models")

##        coot_toolbar_button("Stop animation",
##                            "gobject.source_remove(" + str(animate_id) + ")",
##                            icon_name="gtk-media-stop",
##                            tooltip="Stop animation of the models")

        
    add_simple_coot_menu_menuitem(
        menu,
        "Add model play to toolbar...",
        lambda func:
        molecule_chooser_gui("Ensemble model for toolbar selection:",
                             lambda imol:
                             toolbar_model_play(imol)))


    add_simple_coot_menu_menuitem(
        menu,
        "Add model selection toolbar...",
        lambda func:
        molecule_chooser_gui("Ensemble model for toolbar selection:",
                             lambda imol:
                             toolbar_model(imol)))

Load with:

Calculate->Run Script

Or put the file in e.g. .coot-preferences directory to make it permanent.