Created attachment 67625 [details] showing the overwhelming variety of export capabilities Version: 2.5.0 (using KDE 4.7.3) OS: Linux at the moment, we have 34 modules where about 15 takes care of export issues (please see pic enclosed) Reproducible: Always Steps to Reproduce: just open settings Actual Results: always _too_ many items to select- this is not ergonomical, but time wasting. Because everytime, one searches a specific export function, you have to read/check _all_ possible export possibilities. This is old ergonimics... Expected Results: why don´t you arrange all export issue at one place, maybe on some type of table or so? In this case, you could in the first column the names, the second the settng for that expoort type and in the third column a checkbox.
Git commit 417dba20114529eb4a0994a4281fc67c4cd11777 by Gilles Caulier. Committed on 06/08/2012 at 23:12. Pushed by cgilles into branch 'development/2.0.0'. new libkipi plugins config widget layout to group tools by categories for a better readablility FIXED-IN: 3.0.0 M +2 -2 libkipi/configwidget.cpp M +110 -18 libkipi/configwidget_p.cpp M +21 -5 libkipi/configwidget_p.h http://commits.kde.org/libkipi/417dba20114529eb4a0994a4281fc67c4cd11777
Git commit ec9387e7daa9905c615dcf82d95f600f0b42d6b8 by Gilles Caulier. Committed on 07/08/2012 at 10:43. Pushed by cgilles into branch 'development/2.0.0'. better model/view to sort plugin list by categories M +54 -79 libkipi/configwidget_p.cpp M +1 -15 libkipi/configwidget_p.h http://commits.kde.org/libkipi/ec9387e7daa9905c615dcf82d95f600f0b42d6b8
Git commit e84a4844c9132667f493c8f1c00a226c07b591c2 by Gilles Caulier. Committed on 07/08/2012 at 11:50. Pushed by cgilles into branch 'development/2.0.0'. add capability to filter plugins list based on text search over plugin name, categories, and description M +52 -27 libkipi/configwidget.cpp M +9 -0 libkipi/configwidget.h M +37 -1 libkipi/configwidget_p.cpp M +10 -1 libkipi/configwidget_p.h M +11 -0 tests/kipisetup.cpp http://commits.kde.org/libkipi/e84a4844c9132667f493c8f1c00a226c07b591c2
with the last 2 commits digikam and kxmlkipicmd are crashing when activanting the action "Configure Digikam" and "Configure kxmlkipicmd" respectively when there are plugins that must not be loaded. The backtrace: Application: digiKam (digikam), signal: Segmentation fault Using host libthread_db library "/usr/lib/libthread_db.so.1". [Current thread is 1 (Thread 0x7facc370c980 (LWP 22012))] Thread 9 (Thread 0x7fac9c8f7700 (LWP 22013)): #0 0x00007facbb1c9954 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0 #1 0x00007facbb45ad1b in wait (time=<optimized out>, this=0x2df2e10) at thread/qwaitcondition_unix.cpp:86 #2 QWaitCondition::wait (this=<optimized out>, mutex=0x2c68d58, time=<optimized out>) at thread/qwaitcondition_unix.cpp:158 #3 0x00000000005fba49 in Digikam::ScanController::run (this=0x2da19a0) at /home/printesoi/kde/digikam/core/digikam/database/scancontroller.cpp:698 #4 0x00007facbb45a188 in QThreadPrivate::start (arg=0x2da19a0) at thread/qthread_unix.cpp:307 #5 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #6 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 8 (Thread 0x7fac97fff700 (LWP 22014)): #0 0x00007facba150ebd in poll () from /usr/lib/libc.so.6 #1 0x00007facb361e744 in ?? () from /usr/lib/libglib-2.0.so.0 #2 0x00007facb361e864 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0 #3 0x00007facbb5bfa56 in QEventDispatcherGlib::processEvents (this=0x7fac900008c0, flags=...) at kernel/qeventdispatcher_glib.cpp:426 #4 0x00007facbb58523f in QEventLoop::processEvents (this=this@entry=0x7fac97ffebe0, flags=...) at kernel/qeventloop.cpp:149 #5 0x00007facbb585498 in QEventLoop::exec (this=0x7fac97ffebe0, flags=...) at kernel/qeventloop.cpp:204 #6 0x00007facbb456afd in QThread::exec (this=<optimized out>) at thread/qthread.cpp:501 #7 0x00007facbb55f2c3 in QInotifyFileSystemWatcherEngine::run (this=0x2da0900) at io/qfilesystemwatcher_inotify.cpp:248 #8 0x00007facbb45a188 in QThreadPrivate::start (arg=0x2da0900) at thread/qthread_unix.cpp:307 #9 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #10 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 7 (Thread 0x7fac977fe700 (LWP 22016)): #0 0x00007facbb1c9954 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0 #1 0x00007facbb45ad1b in wait (time=<optimized out>, this=0x2f1a0a0) at thread/qwaitcondition_unix.cpp:86 #2 QWaitCondition::wait (this=<optimized out>, mutex=0x2f1bc98, time=<optimized out>) at thread/qwaitcondition_unix.cpp:158 #3 0x00007facc0502441 in Digikam::ParkingThread::run (this=0x2f1bc80) at /home/printesoi/kde/digikam/core/libs/threads/threadmanager.cpp:119 #4 0x00007facbb45a188 in QThreadPrivate::start (arg=0x2f1bc80) at thread/qthread_unix.cpp:307 #5 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #6 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 6 (Thread 0x7facc3665700 (LWP 22021)): #0 0x00007facbb1c9954 in pthread_cond_wait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0 #1 0x00007fac8e1eafbf in ?? () from /usr/lib/libvlccore.so.5 #2 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #3 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 5 (Thread 0x7fac8d79c700 (LWP 22026)): #0 0x00007facbb1c9cc1 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0 #1 0x00007facbb45ab1a in wait (time=<optimized out>, this=0x3033a90) at thread/qwaitcondition_unix.cpp:84 #2 QWaitCondition::wait (this=<optimized out>, mutex=0x3033a08, time=<optimized out>) at thread/qwaitcondition_unix.cpp:158 #3 0x00007facbb44cd71 in QThreadPoolThread::run (this=0x3033b70) at concurrent/qthreadpool.cpp:141 #4 0x00007facbb45a188 in QThreadPrivate::start (arg=0x3033b70) at thread/qthread_unix.cpp:307 #5 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #6 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 4 (Thread 0x7fac750bb700 (LWP 22033)): #0 0x00007facbb1c9cc1 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0 #1 0x00007facbb45ab1a in wait (time=<optimized out>, this=0x2f1dfe0) at thread/qwaitcondition_unix.cpp:84 #2 QWaitCondition::wait (this=<optimized out>, mutex=0x2f43ec8, time=<optimized out>) at thread/qwaitcondition_unix.cpp:158 #3 0x00007facbb44cd71 in QThreadPoolThread::run (this=0x66055a0) at concurrent/qthreadpool.cpp:141 #4 0x00007facbb45a188 in QThreadPrivate::start (arg=0x66055a0) at thread/qthread_unix.cpp:307 #5 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #6 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 3 (Thread 0x7fac748ba700 (LWP 22034)): #0 0x00007facbb1c9cc1 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0 #1 0x00007facbb45ab1a in wait (time=<optimized out>, this=0x2f1dfe0) at thread/qwaitcondition_unix.cpp:84 #2 QWaitCondition::wait (this=<optimized out>, mutex=0x2f43ec8, time=<optimized out>) at thread/qwaitcondition_unix.cpp:158 #3 0x00007facbb44cd71 in QThreadPoolThread::run (this=0x6450650) at concurrent/qthreadpool.cpp:141 #4 0x00007facbb45a188 in QThreadPrivate::start (arg=0x6450650) at thread/qthread_unix.cpp:307 #5 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #6 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 2 (Thread 0x7fac6ffff700 (LWP 22035)): #0 0x00007facbb1c9cc1 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /usr/lib/libpthread.so.0 #1 0x00007facbb45ab1a in wait (time=<optimized out>, this=0x2f1dfe0) at thread/qwaitcondition_unix.cpp:84 #2 QWaitCondition::wait (this=<optimized out>, mutex=0x2f43ec8, time=<optimized out>) at thread/qwaitcondition_unix.cpp:158 #3 0x00007facbb44cd71 in QThreadPoolThread::run (this=0x5d8b8f0) at concurrent/qthreadpool.cpp:141 #4 0x00007facbb45a188 in QThreadPrivate::start (arg=0x5d8b8f0) at thread/qthread_unix.cpp:307 #5 0x00007facbb1c5e0f in start_thread () from /usr/lib/libpthread.so.0 #6 0x00007facba15904d in clone () from /usr/lib/libc.so.6 Thread 1 (Thread 0x7facc370c980 (LWP 22012)): [KCrash Handler] #5 0x00007facc11ecccf in KIPI::Plugin::actions (this=0x0, widget=0x0) at /home/printesoi/kde/digikam/extra/libkipi/libkipi/plugin.cpp:196 #6 0x00007facc11f216e in KIPI::PluginCheckBox::PluginCheckBox (this=0x78c4800, info=0x3c2f660, parent=0x78bef30) at /home/printesoi/kde/digikam/extra/libkipi/libkipi/configwidget_p.cpp:61 #7 0x00007facc11f2988 in KIPI::PluginListView::PluginListView (this=0x78bef30, parent=0x78bdf40) at /home/printesoi/kde/digikam/extra/libkipi/libkipi/configwidget_p.cpp:148 #8 0x00007facc11f159f in KIPI::ConfigWidget::ConfigWidget (this=0x78935d0, parent=0x0) at /home/printesoi/kde/digikam/extra/libkipi/libkipi/configwidget.cpp:106 #9 0x00000000004de16f in Digikam::Setup::Setup (this=0x6c337c0, parent=0x2e5b200) at /home/printesoi/kde/digikam/core/utilities/setup/setup.cpp:295 #10 0x00000000004df1d0 in Digikam::Setup::exec (parent=0x2e5b200, page=Digikam::Setup::LastPageUsed) at /home/printesoi/kde/digikam/core/utilities/setup/setup.cpp:416 #11 0x00000000005b0e03 in Digikam::DigikamApp::setup (this=0x2e5b200) at /home/printesoi/kde/digikam/core/digikam/main/digikamapp.cpp:2343 #12 0x00000000005b0de4 in Digikam::DigikamApp::slotSetup (this=0x2e5b200) at /home/printesoi/kde/digikam/core/digikam/main/digikamapp.cpp:2338 #13 0x000000000059a7ff in Digikam::DigikamApp::qt_static_metacall (_o=0x2e5b200, _c=QMetaObject::InvokeMetaMethod, _id=24, _a=0x7fff6ca754a0) at /home/printesoi/kde/digikam/build/core/digikam/digikamapp.moc:182 #14 0x00007facbb59fbc7 in QMetaObject::activate (sender=0x3b6ac20, m=<optimized out>, local_signal_index=<optimized out>, argv=0x7fff6ca754a0) at kernel/qobject.cpp:3547 #15 0x00007facbc1ea8f2 in QAction::triggered (this=this@entry=0x3b6ac20, _t1=false) at .moc/debug-shared/moc_qaction.cpp:277 #16 0x00007facbc1eaadc in QAction::activate (this=0x3b6ac20, event=<optimized out>) at kernel/qaction.cpp:1257 #17 0x00007facbb5a6a7e in QObject::event (this=0x3b6ac20, e=<optimized out>) at kernel/qobject.cpp:1195 #18 0x00007facbc1eabcf in QAction::event (this=0x3b6ac20, e=0x3cacbf0) at kernel/qaction.cpp:1187 #19 0x00007facbcfd9497 in KAction::event(QEvent*) () from /usr/lib/libkdeui.so.5 #20 0x00007facbc1efda1 in QApplicationPrivate::notify_helper (this=this@entry=0x2bb7c30, receiver=receiver@entry=0x3b6ac20, e=e@entry=0x3cacbf0) at kernel/qapplication.cpp:4551 #21 0x00007facbc1f7b29 in QApplication::notify (this=0x7fff6ca76020, receiver=0x3b6ac20, e=0x3cacbf0) at kernel/qapplication.cpp:4412 #22 0x00007facbd0b2856 in KApplication::notify(QObject*, QEvent*) () from /usr/lib/libkdeui.so.5 #23 0x00007facbb58730e in QCoreApplication::notifyInternal (this=0x7fff6ca76020, receiver=receiver@entry=0x3b6ac20, event=event@entry=0x3cacbf0) at kernel/qcoreapplication.cpp:915 #24 0x00007facbb58ab58 in sendEvent (event=0x3cacbf0, receiver=0x3b6ac20) at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:231 #25 QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, data=0x2b244d0) at kernel/qcoreapplication.cpp:1539 #26 0x00007facbb5bf5a3 in sendPostedEvents () at ../../include/QtCore/../../src/corelib/kernel/qcoreapplication.h:236 #27 postEventSourceDispatch (s=0x2bb8c80) at kernel/qeventdispatcher_glib.cpp:279 #28 0x00007facb361e475 in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0 #29 0x00007facb361e7a8 in ?? () from /usr/lib/libglib-2.0.so.0 #30 0x00007facb361e864 in g_main_context_iteration () from /usr/lib/libglib-2.0.so.0 #31 0x00007facbb5bfa36 in QEventDispatcherGlib::processEvents (this=0x2b25db0, flags=...) at kernel/qeventdispatcher_glib.cpp:424 #32 0x00007facbc2afaee in QGuiEventDispatcherGlib::processEvents (this=<optimized out>, flags=...) at kernel/qguieventdispatcher_glib.cpp:204 #33 0x00007facbb58523f in QEventLoop::processEvents (this=this@entry=0x7fff6ca75ea0, flags=...) at kernel/qeventloop.cpp:149 #34 0x00007facbb585498 in QEventLoop::exec (this=0x7fff6ca75ea0, flags=...) at kernel/qeventloop.cpp:204 #35 0x00007facbb58af78 in QCoreApplication::exec () at kernel/qcoreapplication.cpp:1187 #36 0x00000000006e172a in main (argc=1, argv=0x7fff6ca76718) at /home/printesoi/kde/digikam/core/digikam/main/main.cpp:232 When a plugin is not loaded then the info->plugin() is null and you are calling actions() on it.
Git commit 479657bbf6c491b0d99caa1a9c456fb9234a89a6 by Gilles Caulier. Committed on 07/08/2012 at 12:17. Pushed by cgilles into branch 'development/2.0.0'. prevent crash if info, plugin, or KAction list are null M +40 -28 libkipi/configwidget_p.cpp http://commits.kde.org/libkipi/479657bbf6c491b0d99caa1a9c456fb9234a89a6
Git commit 0c1af110f1f384cfdf3fffe04000fc4bb15b184f by Gilles Caulier. Committed on 07/08/2012 at 12:59. Pushed by cgilles into branch 'development/2.0.0'. Active filtering of plugins list through case sensitive filter M +30 -16 libkipi/configwidget.cpp M +2 -2 libkipi/configwidget.h M +27 -16 libkipi/configwidget_p.cpp M +4 -3 libkipi/configwidget_p.h M +6 -1 tests/kipisetup.cpp M +1 -0 tests/kipisetup.h http://commits.kde.org/libkipi/0c1af110f1f384cfdf3fffe04000fc4bb15b184f
Git commit 5fccda0cdba5c07945d3824e68de783807ab7687 by Gilles Caulier. Committed on 07/08/2012 at 13:00. Pushed by cgilles into branch 'development/3.0.0'. use new plugins filtering list feature in digiKam setup dialog M +17 -1 utilities/setup/setup.cpp M +2 -0 utilities/setup/setup.h http://commits.kde.org/digikam/5fccda0cdba5c07945d3824e68de783807ab7687
Git commit ae7c379c477d016880438291dbe5a1e96cccf45e by Gilles Caulier. Committed on 07/08/2012 at 13:40. Pushed by cgilles into branch 'development/2.0.0'. add a way to extract author name from plugins deskop files. Print it to Plugins config widget. M +13 -6 libkipi/configwidget_p.cpp M +6 -0 libkipi/pluginloader.cpp M +1 -0 libkipi/pluginloader.h http://commits.kde.org/libkipi/ae7c379c477d016880438291dbe5a1e96cccf45e
Git commit 6463d5b36327a51bb0897b5a437cb9fdcde3bb83 by Gilles Caulier. Committed on 07/08/2012 at 13:58. Pushed by cgilles into branch 'development/2.0.0'. polish author info to display and fix column layout M +2 -2 libkipi/configwidget_p.cpp http://commits.kde.org/libkipi/6463d5b36327a51bb0897b5a437cb9fdcde3bb83
KIPI plugins setup page from digiKam 3.0.0 config dialog http://www.flickr.com/photos/digikam/7732407706/sizes/o/in/photostream/ Gilles Caulier
Gilles, with my last commit http://commits.kde.org/libkipi/5a0e89c7bac19a0cfe18c4d79a81fee833cf177d I changed the way we can get plugin categories. I added a new property X-KIPI-PluginCategories. All it's needed now is to patch *.desktop files of the kipi-plugins and add a line X-KIPI-PluginCategories=[categories]. What you think? This way we can get the categories for the plugins that are not loaded, impossible thing with the previous implementation..
Victor, Do you set the new properties X-KIPI-PluginCategories for each plugin actions, as it set in hard coded version ? I hope it's not a general property for the plugin as well. Anyway, yes, using desktop file instead hard-cede version is a good way. This want mean tha a category API in KIPI::Plugin class can be removed. Right? Gilles
Victor, I see you your commit. But how to know which plugin action can be considerated as Import, Export, Image, etc.. category, as current hard coded way do ? Gilles
Victor, there is a problem with libkipi/kipiplugin.desktop file that you have patched with your mast commit. I think this file is a duplicate of kipi-plugins/common/libkipiplugins/kipiplugins.desktop (note 's' at end of file name) Libkipi desktop file must be removed. file from kipi-plugins must be used instead. What do you think about ? I would to include kipi-plugins release version into desktop file, to be able to display it into kipi host application. This cannot be do through libkipi of course, only by kipi-plugins... Gilles
Victor, I'm not sure if i'm right with my last comment #14. Sound like libkipi/kipiplugin.desktop is to discribe desktop plugin template, and libkipiplugins/kipiplugins.desktop is to add the right entry in KDE help center for kipi-plugins. What do you think about ? Gilles
Gilles, they are two different things and both must be kept. Look at the places that they are installed: kipiplugin.desktop is installed in the ${SERVICETYPES_INSTALL_DIR} while kipiplugins.desktop is installed in the ${XDG_APPS_INSTALL_DIR}. This means that kipiplugin.desktop from libkipi must be kept as it makes possible the loading of the plugins through KServiceTypeTrader(try to remove the kipiplugin.desktop from /usr/share/kde4/servicetypes/ and you will see that no plugin will be loaded).
Gilles, about plugin actions: as I can see the only use of Plugin::category method is only in KipiTestPluginLoader and KipiPluginLoader(from core) the build actionCategories in the "Configure Shortcuts" dialog. In such case we can freely use info->pluginCategories() to know in wich category we need the include the plugin.. Am I wrong?
Victor, Look like each action are wrapped around category in each plugin definition through Plugin::category() method. Look in plugin_rawconverter.cpp::line 199 for ex... This is the problem : with desktop file you can identify that a plugin has Tool and Batch actions but you cannot identify which action exactly. A solution based to patch each plugin .rc file will be better; if it's possible, as each action are defined in this xml file. But i don't know if it's possible to to add xml properties which are easily suitable in libkipi through KDE API... Gilles
Am 09.01.2012 21:28, schrieb Gilles Caulier: > https://bugs.kde.org/show_bug.cgi?id=291080 > > > Gilles Caulier <caulier.gilles@gmail.com> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > CC| |caulier.gilles@gmail.com > Component|Export |libkipi > > > > Thanks for your information Gilles! ...looks great... thank you for your efforts! Axel
Gilles, look at my commit http://commits.kde.org/libkipi/7fda90dd9ea659b96eed892cb5ff83bf0c88a4d2 . This is the solution I propose with getting the category of the action. The code needs polish and it's not finished, but you need to look at and to tell what you think. Use kxmlkipicmd to test that plugin actions are added right in the "Configure shortcuts dialog". By the way, do we realy need to store more widgets in a map in Plugin class?
Victor, 1/ Instead to use a dedicated method to group KAction + Category : void addAction(KAction* const action, Category cat); ... why not to store Category in Kaction Container as extra data : http://qt-project.org/doc/qt-4.8/qaction.html#setData http://qt-project.org/doc/qt-4.8/qaction.html#data This will simplify code a lots... 2/ Your last changes include to change both code + desktop files to describe Categories used in a plugin. Do you need that ? 3/ Instead to use code or/and desktop file to assign Categories in plugin, what's about to use XML file as well to add extra data in XML Action definition ? It's possible ? If yes, no code need to be changed and recompiled to assign or change Category, if libkipi is able to manage it... Gilles
Gilles, > 1/ Instead to use a dedicated method to group KAction + Category : > > void addAction(KAction* const action, Category cat); > > ... why not to store Category in Kaction Container as extra data : > > http://qt-project.org/doc/qt-4.8/qaction.html#setData > http://qt-project.org/doc/qt-4.8/qaction.html#data > > This will simplify code a lots... I think that is more intuitive to use addAction(KAction* const, Category), and in this way, plugins will no longer need the category method as it is implemented in the Plugin class. This will also simplify the code a lot. > 2/ Your last changes include to change both code + desktop files to describe > Categories used in a plugin. Do you need that ? Changes in the desktop files were necessary to know the plugin category even when a plugin is not loaded. In the previous implementation we could not now the plugin category if the plugin is not loaded. This is how it looked when plugin were not loaded: http://img52.imageshack.us/img52/7243/shot50.png , and this is how it looks now: http://img19.imageshack.us/img19/1152/shot49.png > 3/ Instead to use code or/and desktop file to assign Categories in plugin, > what's about to use XML file as well to add extra data in XML Action > definition ? It's possible ? If yes, no code need to be changed and > recompiled to assign or change Category, if libkipi is able to manage it... As I can see from xmlgui standard http://www.kde.org/standards/kxmlgui/1.0/kxmlgui.xsd accepted atributes for Action are only: name, group, append, text, whatsThis, tooltip, iconText, shortcut, icon, priority. And I don't think is a good idea to add non-standard attributes.
1/ But internally, storing Category to KAction as extra data will simplify map container : you can use old map : QMap<QWidget*, QList<KAction*> > actions; instead new one : QMap<QWidget*, QMap<KAction*, Category> > actionsCat; 2/ ok 3/ ok
Gilles. 1. But then setData will not be available to programmers for use.
1/ Right. Note that it's not common to use extra data with QAction. At least in kipi-plugins. But as we let's action managed by KDELibs, we don't know if extra data are not add to action for rules purpose... Gilles Caulier
Git commit f7082c74e87c0861f7829eae70a0a7cb1f6145c7 by Gilles Caulier. Committed on 08/08/2012 at 13:12. Pushed by cgilles into branch 'development/2.0.0'. add new method to extract kipi-plugins version from common kipiplugins.desktop file Print libkipi and kipi-plugins version on plugins config widget M +11 -1 libkipi/configwidget.cpp M +20 -0 libkipi/pluginloader.cpp M +2 -0 libkipi/pluginloader.h http://commits.kde.org/libkipi/f7082c74e87c0861f7829eae70a0a7cb1f6145c7