<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">>I can merge the new plugin
      installer tonight if your happy with that<br>
      <br>
      Perfect, thanks.<br>
      <br>
      Marco<br>
      <br>
      On 05.06.2013 09:12, Nathan Woodrow wrote:<br>
    </div>
    <blockquote
cite="mid:CAAi8Yg_GNdP8Um9NbouDqg=ncnPexh7cOnaV5z9ZyPa65w=KSw@mail.gmail.com"
      type="cite">
      <div dir="ltr">Marco,
        <div><br>
        </div>
        <div style="">I can merge the new plugin installer tonight if
          your happy with that.  I'm not sure I will merge the SIP stuff
          in just yet but I will review and see where to go from there.</div>
        <div style=""><br>
        </div>
        <div style="">Regards,</div>
        <div style="">Nathan</div>
      </div>
      <div class="gmail_extra"><br>
        <br>
        <div class="gmail_quote">On Wed, Jun 5, 2013 at 5:09 PM, Marco
          Hugentobler <span dir="ltr"><<a moz-do-not-send="true"
              href="mailto:marco.hugentobler@sourcepole.ch"
              target="_blank">marco.hugentobler@sourcepole.ch</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div text="#000000" bgcolor="#FFFFFF">
              <div>Hi Nathan<br>
                <br>
                I'm away today and can merge earliest late evening or
                probably in the morning.<br>
                Alternatively, to not block your progress with the new
                API, you could do the plugin manager merge / SIP update
                / python part update and the const things can be easily
                added later.<br>
                <br>
                Regards,<br>
                Marco  <br>
                <div>
                  <div class="h5"> <br>
                    On 05.06.2013 08:53, Nathan Woodrow wrote:<br>
                  </div>
                </div>
              </div>
              <div>
                <div class="h5">
                  <blockquote type="cite">
                    <div dir="ltr">Marco, 
                      <div><br>
                      </div>
                      <div>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.</div>
                      <div><br>
                      </div>
                      <div>Regards,</div>
                      <div>Nathan</div>
                    </div>
                    <div class="gmail_extra"><br>
                      <br>
                      <div class="gmail_quote">On Wed, Jun 5, 2013 at
                        4:48 PM, Marco Hugentobler <span dir="ltr"><<a
                            moz-do-not-send="true"
                            href="mailto:marco.hugentobler@sourcepole.ch"
                            target="_blank">marco.hugentobler@sourcepole.ch</a>></span>
                        wrote:<br>
                        <blockquote class="gmail_quote" style="margin:0
                          0 0 .8ex;border-left:1px #ccc
                          solid;padding-left:1ex">Hi Borys<br>
                          <br>
                          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).<br>
                          Codewise, I have few suggestion on detail
                          level:<br>
                          <br>
                          QgsPluginRegistry: isLoaded(),
                          isPythonPlugin(), isPluginCompatible() can be
                          const<br>
                          <br>
                          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)<br>
                          <br>
                          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)?<br>
                          <br>
                          All in all great work. I'm proposing that you
                          merge the branch to master.<br>
                          <br>
                          Regards,<br>
                          Marco
                          <div>
                            <div><br>
                              <br>
                              On 27.05.2013 14:23, Borys Jurgiel wrote:<br>
                              <blockquote class="gmail_quote"
                                style="margin:0 0 0 .8ex;border-left:1px
                                #ccc solid;padding-left:1ex"> Hi All,<br>
                                <br>
                                The new manager is ready. Here is a
                                screenshot for impatient ones :)<br>
                                <a moz-do-not-send="true"
                                  href="http://tmp.borysjurgiel.pl/manager4.png"
                                  target="_blank">http://tmp.borysjurgiel.pl/manager4.png</a><br>
                                <br>
                                The code is in a branch "newmanager":<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771</a><br>
                                <br>
                                As it affects a number of classes,
                                please review the architecture summary<br>
                                below and if there is no veto, it's
                                ready to be merged to master. Otherewise
                                I'll<br>
                                make requested changes before merging.<br>
                                <br>
                                <br>
                                *QgsPluginItem*<br>
                                ==========<br>
                                Removed. It only used in the old manager
                                and wasn't usefull anymore.<br>
                                <br>
                                <br>
                                <br>
                                *QgsDetailedItemData,
                                QgsDetailedItemDelegate and
                                QgsDetailedItemWidget*<br>
                                ==========<br>
                                Untouched. It was used in the old
                                manager and Grass Plugin, now it's used<br>
                                exclusively by Grass Plugin.<br>
                                <br>
                                <br>
                                <br>
                                *QgsPluginMedatadata*<br>
                                ==========<br>
                                Untouched, however I propose to rename
                                it to QgsPluginItem or
                                QgsPluginRegistryItem<br>
                                for consistency. It's only used in
                                QgsPluginRegistry and it mainly
                                conatains<br>
                                pointers to loaded plugins instances,
                                while its name may imply a rich metadata<br>
                                map. If some day during QGIS 2.x
                                lifetime the Manager will need a
                                separate class<br>
                                for storing rich metadata (now QMap is
                                enough), and it would be nice to use
                                this name.<br>
                                <br>
                                <br>
                                <br>
                                *QgsPluginRegistry*<br>
                                ==========<br>
                                Info: This class is a registry for
                                instances of lodaded plugins. It has
                                nothing to to<br>
                                with metadata and it works independently
                                from the manager, just by restoring<br>
                                session plugins from QSettings. Manager
                                only calls its method to load and unload
                                plugins.<br>
                                <br>
                                Small change: as it already had methods
                                loadCppPlugin() and loadPythonPlugin(),<br>
                                I've added also unloadCppPlugin() and
                                unloadPythonPlugin() too keep the<br>
                                loading/unloading stuff in one place.<br>
                                <br>
                                Diff:<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgspluginregistry.h"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgspluginregistry.h</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgspluginregistry.cpp"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgspluginregistry.cpp</a><br>
                                <br>
                                <br>
                                <br>
                                *QgsPluginManager*<br>
                                ==========<br>
                                Completely rewritten and moved to
                                src/app/pluginmanager/ subdirectory<br>
                                class for the dialog window. Important
                                facts:<br>
                                <br>
                                1) It keeps plugin metadata registry
                                just in nested QMap:<br>
                                QMap< QString,
                                QMap<QString,QString> >  
                                mPlugins;<br>
                                <br>
                                where the first key is library/module
                                basename, and the second one is
                                attribute<br>
                                name. There was no need to create a
                                separate class for storing metadata,<br>
                                however, some day it may become
                                convinient to create a class called
                                QgsPluginMedatadata.<br>
                                For this reason I propose to rename the
                                current QgsPluginMedatadata<br>
                                (what actually has nothing to do with
                                metadata) before releasing QGIS 2.0.<br>
                                The list of used attributes is provided
                                in the "metadata" file and it's an
                                unification<br>
                                of existing fields from repository xml,
                                metadata.txt, the old installer and c++
                                plugins.<br>
                                QgsPluginManager populates this field
                                (let's call it metadata registry) with<br>
                                c++ plugins when the window is opened.
                                On the contrary, Python plugins<br>
                                are handled on Python's side and they
                                are appended to mPlugins by API.<br>
                                <br>
                                2) The plugin list view uses
                                QStandardItemModel populated from
                                mPlugins<br>
                                and also QgsPluginSortFilterProxyModel
                                for filtering and sorting.<br>
                                <br>
                                3) The html metadata browser is quite
                                simple, and we can extend it in QGIS
                                2.1.<br>
                                For example, some tags can be clickable
                                and set a new filter (filter by clicked<br>
                                author/tag/status). Also the separate
                                buttons Install/Uninstall can be<br>
                                implemented by html "buttonsm", and the
                                popup dialog with installation progress<br>
                                can be replaced by animated image (this
                                way we don't freeze the gui when
                                installing).<br>
                                <br>
                                Code:<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginmanager.h"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginmanager.h</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginmanager.cpp"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginmanager.cpp</a><br>
                                <br>
                                <br>
                                <br>
                                *QgsPluginSortFilterProxyModel*<br>
                                ==========<br>
                                New class: just a sort-filter proxy for
                                the metadata. Filtering is done by
                                status<br>
                                in the left list as well as
                                name/description/tags/author in the
                                filter input line.<br>
                                Sorting is done by rightclicking on the
                                list. Foltering and sorting is based<br>
                                on a few user data roles. I tried to
                                read necessary data from mPlugins
                                everytime,<br>
                                but it affected the performance too
                                much.<br>
                                <br>
                                Code:<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginsortfilterproxymodel.h"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginsortfilterproxymodel.h</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginsortfilterproxymodel.cpp"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgspluginsortfilterproxymodel.cpp</a><br>
                                <br>
                                <br>
                                <br>
                                *QgsAppPluginManagerInterface,
                                QgsPluginManagerInterface and SIP
                                binding*<br>
                                ==========<br>
                                New classes: just the interface to
                                QgsPluginManager. Is's exactly based<br>
                                on the existing Qgs(App)LegendInterface<br>
                                <br>
                                Code:<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/python/gui/qgspluginmanagerinterface.sip"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/python/gui/qgspluginmanagerinterface.sip</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/gui/qgspluginmanagerinterface.h"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/gui/qgspluginmanagerinterface.h</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/gui/qgspluginmanagerinterface.cpp"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/gui/qgspluginmanagerinterface.cpp</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgsapppluginmanagerinterface.h"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgsapppluginmanagerinterface.h</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgsapppluginmanagerinterface.cpp"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/entry/src/app/pluginmanager/qgsapppluginmanagerinterface.cpp</a><br>
                                <br>
                                <br>
                                <br>
                                QgisApp<br>
                                ==========<br>
                                Small change: initialize the
                                QgsPluginManager and Python module<br>
                                pyplugin_installer in the constructor.
                                Only open the QgsPluginManager window<br>
                                when called from the main menu.<br>
                                <br>
                                Diff:<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisapp.h"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisapp.h</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisapp.cpp"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisapp.cpp</a><br>
                                <br>
                                <br>
                                QgisAppInterface and QgisInterface and
                                SIP binding<br>
                                ==========<br>
                                Small change: instantiate
                                Qgs(App)PluginManagerInterface<br>
                                exactly the same way as
                                Qgs(App)LegendInterface<br>
                                <br>
                                Diff:<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisappinterface.h"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisappinterface.h</a><br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisappinterface.cpp"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/diff/src/app/qgisappinterface.cpp</a><br>
                                <br>
                                <br>
                                <br>
                                pyplugin_installer Python module<br>
                                ==========<br>
                                New python module in
                                python/pyplugin_installer. It contains
                                just slightly refactored<br>
                                code of the old plugin_installer plugin
                                and provides backend for handling Python<br>
                                plugis, e.g.: fetching remote
                                repositories, loading installed plugin
                                metadata, finding<br>
                                upgradeable plugins, (un)installing
                                python plugins etc. It's methods are
                                called from<br>
                                QgsPluginManager and it calls
                                QgsPluginManager methods via
                                QgsPluginManagerInterface.<br>
                                <br>
                                Code:<br>
                                <a moz-do-not-send="true"
href="http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/show/python/pyplugin_installer"
                                  target="_blank">http://hub.qgis.org/projects/quantum-gis/repository/revisions/5ee09d362148c411047a0fc7bc22679d9989f771/show/python/pyplugin_installer</a><br>
                                <br>
                                <br>
_______________________________________________<br>
                                Qgis-developer mailing list<br>
                                <a moz-do-not-send="true"
                                  href="mailto:Qgis-developer@lists.osgeo.org"
                                  target="_blank">Qgis-developer@lists.osgeo.org</a><br>
                                <a moz-do-not-send="true"
                                  href="http://lists.osgeo.org/mailman/listinfo/qgis-developer"
                                  target="_blank">http://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
                              </blockquote>
                              <br>
                              <br>
                            </div>
                          </div>
                          <span><font color="#888888"> -- <br>
                              Dr. Marco Hugentobler<br>
                              Sourcepole -  Linux & Open Source
                              Solutions<br>
                              Weberstrasse 5, CH-8004 Zürich,
                              Switzerland<br>
                              <a moz-do-not-send="true"
                                href="mailto:marco.hugentobler@sourcepole.ch"
                                target="_blank">marco.hugentobler@sourcepole.ch</a>
                              <a moz-do-not-send="true"
                                href="http://www.sourcepole.ch"
                                target="_blank">http://www.sourcepole.ch</a><br>
                              Technical Advisor QGIS Project Steering
                              Committee</font></span>
                          <div>
                            <div><br>
                              <br>
_______________________________________________<br>
                              Qgis-developer mailing list<br>
                              <a moz-do-not-send="true"
                                href="mailto:Qgis-developer@lists.osgeo.org"
                                target="_blank">Qgis-developer@lists.osgeo.org</a><br>
                              <a moz-do-not-send="true"
                                href="http://lists.osgeo.org/mailman/listinfo/qgis-developer"
                                target="_blank">http://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
                            </div>
                          </div>
                        </blockquote>
                      </div>
                      <br>
                    </div>
                  </blockquote>
                </div>
              </div>
            </div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
Dr. Marco Hugentobler
Sourcepole -  Linux & Open Source Solutions
Weberstrasse 5, CH-8004 Zürich, Switzerland
<a class="moz-txt-link-abbreviated" href="mailto:marco.hugentobler@sourcepole.ch">marco.hugentobler@sourcepole.ch</a> <a class="moz-txt-link-freetext" href="http://www.sourcepole.ch">http://www.sourcepole.ch</a>
Technical Advisor QGIS Project Steering Committee </pre>
  </body>
</html>