[Kde-imaging] New KIPI plugins category identification based on KAction detection.

Caulier Gilles caulier.gilles at free.fr
Tue Jun 15 19:43:12 CEST 2004


Hi all,

In according with Jersper, I have implemented a new plugins category detection 
based on KAction declared in the plugins.

A new method is available for the plugins  implementation :

KIPI::Category KIPI::Plugin::category( KAction* action )

It must be re-implemented in your plugins for to define to the host 
application the category associate with the KAction declared in the plugins.

In this case, the standard plugins category detection method :

KIPI::Category KIPI::Plugin::category() const

don't must re-implemented in the plugin. This base method return now a new 
value name UNDEFINEDPLUGIN.

A plugin category detection method based on KAction is very easy to use for a 
best integration of KAction the the host application menus, especialy when a 
plugin have more than one plugin part embeded in the same module, like 
RAWConverter plugin (single and batch).

This plugin return the category value by this fonction :

KIPI::Category Plugin_RawConverter::category( KAction* action )
{
    if ( action == singleAction_ )
       return KIPI::TOOLSPLUGIN;
    else if ( action == batchAction_ )
       return KIPI::BATCHPLUGIN;
    else 
       return KIPI::UNDEFINEDPLUGIN;
}

Digikam use now this category detection method and the KIPI plugins 
integration is available in digikamapp.cpp :

void DigikamApp::slotKipiPluginPlug()
{ 
    unplugActionList( QString::fromLatin1("file_actions_export") );
    unplugActionList( QString::fromLatin1("file_actions_import") );
    unplugActionList( QString::fromLatin1("image_actions") );
    unplugActionList( QString::fromLatin1("tool_actions") );
    unplugActionList( QString::fromLatin1("batch_actions") );
    unplugActionList( QString::fromLatin1("album_actions") );
    
    m_kipiImageActions.clear();
    m_kipiFileActionsExport.clear();
    m_kipiFileActionsImport.clear();
    m_kipiToolsActions.clear();
    m_kipiBatchActions.clear();
    m_kipiAlbumActions.clear();
       
    KIPI::PluginLoader::PluginList list = KipiPluginLoader_->pluginList();
    
    for( KIPI::PluginLoader::PluginList::Iterator it = list.begin() ; it != 
list.end() ; ++it ) 
        {
        KIPI::Plugin* plugin = (*it)->plugin;
        
        if ( !plugin || !(*it)->shouldLoad )
            continue;

        plugin->setup( this );
        QPtrList<KAction>* popup = 0;
        
        // Plugin category identification using standard method.
        
        if ( plugin->category() == KIPI::IMAGESPLUGIN )
            popup = &m_kipiImageActions;

        else if ( plugin->category() == KIPI::EXPORTPLUGIN )
            popup = &m_kipiFileActionsExport;
        
        else if ( plugin->category() == KIPI::IMPORTPLUGIN )
            popup = &m_kipiFileActionsImport;

        else if ( plugin->category() == KIPI::TOOLSPLUGIN )
            popup = &m_kipiToolsActions;

        else if ( plugin->category() == KIPI::BATCHPLUGIN )
            popup = &m_kipiBatchActions;
        
        else if ( plugin->category() == KIPI::COLLECTIONSPLUGIN )
            popup = &m_kipiAlbumActions;
                            
        else if ( plugin->category() == KIPI::UNDEFINEDPLUGIN )
            {
            // Plugin category identification using KAction method based.
        
            KActionPtrList actions = plugin->actions();
            
            for( KActionPtrList::Iterator it2 = actions.begin(); it2 != 
actions.end(); ++it2 ) 
                {
                if ( plugin->category(*it2) == KIPI::IMAGESPLUGIN )
                   popup = &m_kipiImageActions;

                else if ( plugin->category(*it2) == KIPI::EXPORTPLUGIN )
                   popup = &m_kipiFileActionsExport;
        
                else if ( plugin->category(*it2) == KIPI::IMPORTPLUGIN )
                   popup = &m_kipiFileActionsImport;

                else if ( plugin->category(*it2) == KIPI::TOOLSPLUGIN )
                   popup = &m_kipiToolsActions;

                else if ( plugin->category(*it2) == KIPI::BATCHPLUGIN )
                   popup = &m_kipiBatchActions;
        
                else if ( plugin->category(*it2) == KIPI::COLLECTIONSPLUGIN )
                   popup = &m_kipiAlbumActions;
                
                // Plug the KIPI plugins actions in according with the KAction 
method.   
                
                if ( popup )            
                   {             
                   popup->append( *it2 );
                   }
                else 
                   {
                   kdDebug() << "No menu found for a plugin (by KAction 
identification method)!!!" << endl;
                   }
                }
            
            continue;
            }
        
        // Plug the KIPI plugins actions in according with the standard 
method.   
            
        if ( popup ) 
            {
            KActionPtrList actions = plugin->actions();
            
            for( KActionPtrList::Iterator it3 = actions.begin(); it3 != 
actions.end(); ++it3 ) 
                {
                popup->append( *it3 );
                }
            }
        else 
            {
            kdDebug() << "No menu found for a plugin (by standard 
identification method)!!!" << endl;
            }
            
        plugin->actionCollection()->readShortcutSettings();
        }
        
    // Create GUI menu in according with plugins.
    
    plugActionList( QString::fromLatin1("file_actions_export"), 
m_kipiFileActionsExport );
    plugActionList( QString::fromLatin1("file_actions_import"), 
m_kipiFileActionsImport );
    plugActionList( QString::fromLatin1("image_actions"), 
m_kipiImageActions );
    plugActionList( QString::fromLatin1("tool_actions"), m_kipiToolsActions );
    plugActionList( QString::fromLatin1("batch_actions"), 
m_kipiBatchActions );
    plugActionList( QString::fromLatin1("album_actions"), 
m_kipiAlbumActions );
}

This implementation work fine and is ready for all future plugins 
implementations. You can use that for Kimdaba, Gwenview, and Showimg program.

Let's me hear your remarks and comments (:=)))

regards

Gilles Caulier



More information about the Kde-imaging mailing list