can't find update callback for CollectionProperty I'm new to python and I encounter a problem with update callback function.
I have a UiList of items, and I'm looking for a way to display a popup window when user click on one of the items in the lists. Since it looks like i have to use CollectionProperty to use UiList, i have setup one and use an EnumProperty inside.
My problem is:  I can't find a way to callback update from the CollectionProperty; and writing the update in the EnumProperty doesn't seem to do anything in this case.
class SCENE_OT_source_populate(Operator):
    bl_idname = &quot;scene.source_populate&quot;
    bl_label = &quot;Populate source&quot;
    
    def execute(self,context):
        context.scene.SMSL.collection.clear()
        preset = context.scene.StrewPresetDrop.StrewPresetDropdown
        AssetList = GetAssetList.Specie(self, context, preset)
        for Asset in AssetList:
            item = context.scene.SMSL.collection.add()
            Path = Asset.split(&quot;,&quot;)
            item.name = Path[1]
            item.description = Asset
        return {'FINISHED'}

class SMSAsset(PropertyGroup):
    type = EnumProperty(
        items=(
            ('A', &quot;Option A&quot;, &quot;&quot;),
            ('B', &quot;Option B&quot;, &quot;&quot;),
        )
    )
    #val = IntProperty()
    
class SMSList(PropertyGroup):
    collection : CollectionProperty(
        name = &quot;SMSA&quot;,
        type = SMSAsset)
    active_user_index : IntProperty()
        
class SMS_UL_List(UIList):
    def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
        if self.layout_type in {'DEFAULT', 'COMPACT'}:
            layout.prop(item, &quot;name&quot;, text=&quot;&quot;, emboss=False)
            #layout.prop(item, &quot;val&quot;, text=&quot;&quot;)
            #layout.prop(item, &quot;type&quot;, text=&quot;&quot;)
        elif self.layout_type in {'GRID'}:
            layout.alignment = 'CENTER'
            layout.label(text=&quot;&quot;, icon_value=icon)

def register():
    bpy.util.register_class(SMS_UL_Lists)
    bpy.util.register_class(SCENE_OT_source_populate)
    bpy.types.Scene.SMSL = PointerProperty(type= SMSList)

I looked in the blender doc and CollectionProperty is the only one witouth a Update callback. Is there a way to work around this please?
On the active index.

_Clicking on an item updates the index and calls splash which calls bpy.ops.wm.show_panel(...) to display the newly active item. Hovering over the &quot;Hello World&quot; throws up a panel popover which uses context pointer set in the draw_item method.

I'm looking for a way to display a popup window when user click on one
of the items in the lists.

The list UI changes the property set for active index when another index is chosen.
An update method on the index int property will be fired when list index changes.
Test with question code, draw method tacked onto Properties &gt; Scene panel.
A panel is displayed by operator, and by popover.  In hindsight the UI in popover may be best seen but disabled
import bpy
from bpy.types import Operator, PropertyGroup, UIList
from bpy.props import IntProperty, EnumProperty, CollectionProperty, PointerProperty

class HelloWorldPanel(bpy.types.Panel):
    &quot;&quot;&quot;Creates a Panel in the Object properties window&quot;&quot;&quot;
    bl_label = &quot;Hello World Panel&quot;
    bl_idname = &quot;OBJECT_PT_hello&quot;
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = &quot;object&quot;
    #bl_options = {'INSTANCED'}
        
    def draw(self, context):
        layout = self.layout
        smsl = context.scene.SMSL
        user = getattr(
                context,
                &quot;active_smms_user&quot;, 
                smsl.collection[smsl.active_user_index]
                )
        col = layout.column()

        col.label(text=f&quot; {user.name}&quot;, icon='WORLD_DATA')
        col.prop(user, &quot;val&quot;)
        col.prop(user, &quot;type&quot;)

class SCENE_OT_source_populate(Operator):
    bl_idname = &quot;scene.source_populate&quot;
    bl_label = &quot;Populate source&quot;
    
    def execute(self,context):
        context.scene.SMSL.collection.clear()
        # wtf (lol)&gt;? 
        AssetList = [&quot;Foo, foo&quot;, &quot;Bar, bar&quot;]
        for Asset in AssetList:
            item = context.scene.SMSL.collection.add()
            Path = Asset.split(&quot;,&quot;)
            item.name = Path[1]
            item.description = Asset
        return {'FINISHED'}

class SMSAsset(PropertyGroup):
    type : EnumProperty(
        items=(
            ('A', &quot;Option A&quot;, &quot;&quot;),
            ('B', &quot;Option B&quot;, &quot;&quot;),
        )
    )
    val : IntProperty()
    
def splash(self, context):
    # AFAICT context override does not get to panel
    bpy.ops.wm.call_panel(
            {&quot;active_smms_user&quot; : self.collection[self.active_user_index]},
            'INVOKE_DEFAULT',
            name=&quot;OBJECT_PT_hello&quot;,
            )
    return None
    
class SMSList(PropertyGroup):
    collection : CollectionProperty(
        name = &quot;SMSA&quot;,
        type = SMSAsset)
    active_user_index : IntProperty(update=splash)
        
class SMS_UL_List(UIList):
    def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): 
        layout.context_pointer_set(&quot;active_smms_user&quot;, item,)
        if self.layout_type in {'DEFAULT', 'COMPACT'}:
            layout.prop(item, &quot;name&quot;, text=&quot;&quot;, emboss=False)
            layout.prop(item, &quot;val&quot;, text=&quot;&quot;)
            layout.prop(item, &quot;type&quot;, text=&quot;&quot;)
            if hasattr(bpy.types, &quot;OBJECT_PT_hello&quot;):
                
                layout.popover(&quot;OBJECT_PT_hello&quot;)
        elif self.layout_type in {'GRID'}:
            layout.alignment = 'CENTER'
            layout.label(text=&quot;&quot;, icon_value=icon)
def draw(self, context):
    layout = self.layout
    smsl = context.scene.SMSL
    layout.label(text=&quot;Test&quot;)
    layout.operator(&quot;scene.source_populate&quot;)
    layout.template_list(
            &quot;SMS_UL_List&quot;, &quot;&quot;,
             smsl, &quot;collection&quot;, smsl, &quot;active_user_index&quot;)
             
classes = (
        SMSAsset, 
        SMS_UL_List,
        SMSList,
        HelloWorldPanel,
        SCENE_OT_source_populate,
        )
        
def register():
    for cls in classes:
        bpy.utils.register_class(cls)

    bpy.types.Scene.SMSL = PointerProperty(type= SMSList)
    bpy.types.SCENE_PT_scene.append(draw)

if __name__ == &quot;__main__&quot;:
    register()