Marco,
As Borys is away would you be able to merge it tonight. I can
then merge the SIP update once that is done, just need to check
the status. I'll take care of updating the python part of the
installer to the new API once it's merged into master.
Regards,
Nathan
On Wed, Jun 5, 2013 at 4:48 PM, Marco Hugentobler
<[email protected]
<mailto:[email protected]>> wrote:
Hi Borys
I tested the newpluginmanager branch and I must say the new
plugin manager / installer is really a great user experience.
And it is good that the plugin manager also works without the
python bindings (handy e.g. in the server case).
Codewise, I have few suggestion on detail level:
QgsPluginRegistry: isLoaded(), isPythonPlugin(),
isPluginCompatible() can be const
QgsPluginManager: pluginMetadata() returns a pointer to the
map. This function should be const and return either const
pointer or a copy (kind of similar issue like recently with
the layer registry)
It might be worth thinking if QgsPluginRegistry should be in
core and accessible by third party apps / plugins. Like that
it would e.g. be possible to use functions from one plugin in
another and load the required plugin if not already there.
The plugin registry could also emit an unload signal to
notify the dependent plugin. I'm not 100% sure it is a good
idea, but maybe it would be handy for sextante (e.g. WPS
plugin requires a loaded sextante)?
All in all great work. I'm proposing that you merge the
branch to master.
Regards,
Marco
On 27.05.2013 14:23, Borys Jurgiel wrote:
Hi All,
The new manager is ready. Here is a screenshot for
impatient ones :)
http://tmp.borysjurgiel.pl/manager4.png
The code is in a branch "newmanager":
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771
As it affects a number of classes, please review the
architecture summary
below and if there is no veto, it's ready to be merged to
master. Otherewise I'll
make requested changes before merging.
*QgsPluginItem*
==========
Removed. It only used in the old manager and wasn't
usefull anymore.
*QgsDetailedItemData, QgsDetailedItemDelegate and
QgsDetailedItemWidget*
==========
Untouched. It was used in the old manager and Grass
Plugin, now it's used
exclusively by Grass Plugin.
*QgsPluginMedatadata*
==========
Untouched, however I propose to rename it to
QgsPluginItem or QgsPluginRegistryItem
for consistency. It's only used in QgsPluginRegistry and
it mainly conatains
pointers to loaded plugins instances, while its name may
imply a rich metadata
map. If some day during QGIS 2.x lifetime the Manager
will need a separate class
for storing rich metadata (now QMap is enough), and it
would be nice to use this name.
*QgsPluginRegistry*
==========
Info: This class is a registry for instances of lodaded
plugins. It has nothing to to
with metadata and it works independently from the
manager, just by restoring
session plugins from QSettings. Manager only calls its
method to load and unload plugins.
Small change: as it already had methods loadCppPlugin()
and loadPythonPlugin(),
I've added also unloadCppPlugin() and
unloadPythonPlugin() too keep the
loading/unloading stuff in one place.
Diff:
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgspluginregistry.h
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgspluginregistry.cpp
*QgsPluginManager*
==========
Completely rewritten and moved to src/app/pluginmanager/
subdirectory
class for the dialog window. Important facts:
1) It keeps plugin metadata registry just in nested QMap:
QMap< QString, QMap<QString,QString> > mPlugins;
where the first key is library/module basename, and the
second one is attribute
name. There was no need to create a separate class for
storing metadata,
however, some day it may become convinient to create a
class called QgsPluginMedatadata.
For this reason I propose to rename the current
QgsPluginMedatadata
(what actually has nothing to do with metadata) before
releasing QGIS 2.0.
The list of used attributes is provided in the "metadata"
file and it's an unification
of existing fields from repository xml, metadata.txt, the
old installer and c++ plugins.
QgsPluginManager populates this field (let's call it
metadata registry) with
c++ plugins when the window is opened. On the contrary,
Python plugins
are handled on Python's side and they are appended to
mPlugins by API.
2) The plugin list view uses QStandardItemModel populated
from mPlugins
and also QgsPluginSortFilterProxyModel for filtering and
sorting.
3) The html metadata browser is quite simple, and we can
extend it in QGIS 2.1.
For example, some tags can be clickable and set a new
filter (filter by clicked
author/tag/status). Also the separate buttons
Install/Uninstall can be
implemented by html "buttonsm", and the popup dialog with
installation progress
can be replaced by animated image (this way we don't
freeze the gui when installing).
Code:
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginmanager.h
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginmanager.cpp
*QgsPluginSortFilterProxyModel*
==========
New class: just a sort-filter proxy for the metadata.
Filtering is done by status
in the left list as well as name/description/tags/author
in the filter input line.
Sorting is done by rightclicking on the list. Foltering
and sorting is based
on a few user data roles. I tried to read necessary data
from mPlugins everytime,
but it affected the performance too much.
Code:
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginsortfilterproxymodel.h
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginsortfilterproxymodel.cpp
*QgsAppPluginManagerInterface, QgsPluginManagerInterface
and SIP binding*
==========
New classes: just the interface to QgsPluginManager. Is's
exactly based
on the existing Qgs(App)LegendInterface
Code:
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/python/gui/qgspluginmanagerinterface.sip
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/gui/qgspluginmanagerinterface.h
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/gui/qgspluginmanagerinterface.cpp
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgsapppluginmanagerinterface.h
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgsapppluginmanagerinterface.cpp
QgisApp
==========
Small change: initialize the QgsPluginManager and Python
module
pyplugin_installer in the constructor. Only open the
QgsPluginManager window
when called from the main menu.
Diff:
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisapp.h
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisapp.cpp
QgisAppInterface and QgisInterface and SIP binding
==========
Small change: instantiate Qgs(App)PluginManagerInterface
exactly the same way as Qgs(App)LegendInterface
Diff:
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisappinterface.h
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisappinterface.cpp
pyplugin_installer Python module
==========
New python module in python/pyplugin_installer. It
contains just slightly refactored
code of the old plugin_installer plugin and provides
backend for handling Python
plugis, e.g.: fetching remote repositories, loading
installed plugin metadata, finding
upgradeable plugins, (un)installing python plugins etc.
It's methods are called from
QgsPluginManager and it calls QgsPluginManager methods
via QgsPluginManagerInterface.
Code:
http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/show/python/pyplugin_installer
_______________________________________________
Qgis-developer mailing list
[email protected]
<mailto:[email protected]>
http://lists.osgeo.org/mailman/listinfo/qgis-developer
--
Dr. Marco Hugentobler
Sourcepole - Linux & Open Source Solutions
Weberstrasse 5, CH-8004 Zürich, Switzerland
[email protected]
<mailto:[email protected]> http://www.sourcepole.ch
Technical Advisor QGIS Project Steering Committee
_______________________________________________
Qgis-developer mailing list
[email protected]
<mailto:[email protected]>
http://lists.osgeo.org/mailman/listinfo/qgis-developer