<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.slicer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mneugebauer</id>
	<title>Slicer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.slicer.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mneugebauer"/>
	<link rel="alternate" type="text/html" href="https://www.slicer.org/wiki/Special:Contributions/Mneugebauer"/>
	<updated>2026-04-13T04:00:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=50726</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=50726"/>
		<updated>2017-04-04T11:47:48Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC {{done}} '''Completed'''&lt;br /&gt;
* Adapt solution accordingly {{done}} '''Completed'''&lt;br /&gt;
* Submit solution {{done}} '''Completed'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
* First (not final) version: [[File:0001-ENH-working-version-of-extension-restore-functionali.zip|thumb|First patch]]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders? (yes)&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? (yes)&lt;br /&gt;
* How could settings of previous Slicer installations be accessed under MacOS? (same way as for other platforms)&lt;br /&gt;
&lt;br /&gt;
== Feedback from JC on first version (12/08/2016) ==&lt;br /&gt;
&lt;br /&gt;
* Generally agrees to current solution&lt;br /&gt;
* Solution should be compatible to all platforms (there is a central config/extension folder also on MacOS)&lt;br /&gt;
* Suggested Changes:&lt;br /&gt;
** add a legend to explain color coding (green, gray, black, marked - unmarked) of the presented extensions&lt;br /&gt;
** check for extension compatibility currently deactivated, because model functionality used local information to check compatibility&lt;br /&gt;
*** JC added patch to add server-side information to the compatibility check&lt;br /&gt;
*** commit d448b1c9634c71a61b3476a98bfccffba6bcedb5&lt;br /&gt;
** would be better to track previously installed extensions in the central, not revision-dependent slicer.ini&lt;br /&gt;
*** thus, no (possibly error-prone) parsing of the file names is necessary&lt;br /&gt;
*** also, we would no long have to rely on a central saving location for all extension related information (currently the NA-MIC folder = Extension install path)&lt;br /&gt;
*** Structure could be:&lt;br /&gt;
**** [installedExtensionsHistory] → [Revision] → [ExtensionID]&lt;br /&gt;
*** To enable access to slicer.ini the SlicerCoreApp needs to be extened (e.g. getHistoryFilePath, see. line 319, qSlicerCoreApp.cxx)&lt;br /&gt;
* Additional Information:&lt;br /&gt;
** Q: Why are extensions not removed after uninstalling Slicer?&lt;br /&gt;
** A: related to NSIS installer setup, could be changed if installation setup is changed&lt;br /&gt;
** Q: How could an semi-/automatic update be realized?&lt;br /&gt;
** A: &lt;br /&gt;
*** Change of the underlying QT framework (would mean fundamental changes to the current setup)&lt;br /&gt;
*** or: use an approach similar to the installation of extensions, by having a central store for new slicer version&lt;br /&gt;
*** no auto-uninstall but auto-install / maybe just a popup on start, with a link to the new version&lt;br /&gt;
*** since extension information is saved in central slicer.ini the installation of extensions could be triggered on the first start of the new version &lt;br /&gt;
* General vision (this addition to the extension manager is the first step):&lt;br /&gt;
** core Slicer application + profiles (e.g. using the same set of extensions / setup / layout that was used for a paper) :&lt;br /&gt;
** pre-packed Slicer versions available for downloads&lt;br /&gt;
** can be extended with downloadable profiles&lt;br /&gt;
&lt;br /&gt;
== Adaptations (March) according to input from JC (December) and Ron (January) ==&lt;br /&gt;
After the disclaimer is shown, the slicer.ini is parsed for previously installed extensions, if candidates are found (and the configuration is set to check on startup) a pop-up is shown for instantaneous installation:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension check on startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Dialogs and progress dialogs are provided by the headless mode of the extension restore widget:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension installation progress startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
A restart is requested after installation. If the configuration is set to auto-restart and silent extension check on startup, you get an automatic installation of previous extensions after installing a new Slicer build as requested by Ron:&lt;br /&gt;
&lt;br /&gt;
[[File:Restart confirm after extension installation on startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
An improved widget interface gives detailed information about the state of previously installed extensions, including the auto selection of installation candidates. It also allows to de/activate check on startup and silent installation:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension restore widget interface.png|500px]]&lt;br /&gt;
&lt;br /&gt;
The extension history is now centrally tracked in the slicer settings file (&amp;lt;code&amp;gt; model-&amp;gt;setExtensionsHistorySettingsFilePath(q-&amp;gt;slicerUserSettingsFilePath());&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
//SLICER.INI&lt;br /&gt;
...&lt;br /&gt;
[ExtensionsHistory]&lt;br /&gt;
Revisions\25844=ChangeTracker, SlicerToKiwiExporter, CleaverExtension&lt;br /&gt;
Revisions\25843=AnglePlanesExtension, ABC, CurveMaker, SlicerToKiwiExporter&lt;br /&gt;
Revisions\25842=AnglePlanesExtension, CurveMaker, CMFreg&lt;br /&gt;
Revisions\25895=SlicerToKiwiExporter&lt;br /&gt;
ScheduledForRemoval=&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A set of new functions in the extension manager model help to reflect the current extension installation state (important for future installation):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='c++'&amp;gt;&lt;br /&gt;
//saves the currently installed extension to the [ExtensionsHistory] Revisions\XXXXX=ExtensionName setting&lt;br /&gt;
void saveExtensionToHistorySettings(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata);&lt;br /&gt;
 &lt;br /&gt;
//track info that an extension should be removed (will be removed from history with respect to current slicer version - [ExtensionsHistory] ScheduledForRemoval=ExtensionName)&lt;br /&gt;
void scheduleExtensionHistorySettingRemoval(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata);&lt;br /&gt;
 &lt;br /&gt;
//helper function to add a history setting to a specific setting task (scheduled for removal or adding)&lt;br /&gt;
void addExtensionHistorySetting(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata, const QString&amp;amp; settingsPath);&lt;br /&gt;
 &lt;br /&gt;
//removes scheduled removal&lt;br /&gt;
void cancelExtensionHistorySettingRemoval(const QString&amp;amp; extensionsHistorySettingsFile, const QString&amp;amp; extensionName);&lt;br /&gt;
 &lt;br /&gt;
//remove the extensions from the history settings with respect to the current slicer revision&lt;br /&gt;
void removeScheduledExtensionHistorySettings(const QString&amp;amp; extensionsHistorySettingsFile);&lt;br /&gt;
 &lt;br /&gt;
//core function to parse the settings and create a list with extensionName keys --&amp;gt; extension_id, is_installed, is_compatible, last_revision, was_previously_installed&lt;br /&gt;
QVariantMap getExtensionsInfoFromPreviousInstallations(const QString&amp;amp; extensionsHistorySettingsFile);&lt;br /&gt;
 &lt;br /&gt;
//gathers information and emits extensionHistoryGatheredOnStartup&lt;br /&gt;
void gatherExtensionsHistoryInformationOnStartup();&lt;br /&gt;
&lt;br /&gt;
//PUBLIC:&lt;br /&gt;
void gatherExtensionsHistoryInformationOnStartup();&lt;br /&gt;
QVariantMap getExtensionHistoryInformation();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the extension history information map (&amp;lt;code&amp;gt;QVariantMap getExtensionHistoryInformation()&amp;lt;/code&amp;gt;) that can look like this (shortened - based on the settings shown above):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
QMap(&lt;br /&gt;
(&amp;quot;ABC&amp;quot;,&lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155791&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25843&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;AnglePlanesExtension&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155785&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25843&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;CMFreg&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155788&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25842&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;ChangeTracker&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155789&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25895&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, true) ) )  ) )         //would be a preselected install candidate if it wasn't already installed&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The compatibility is now checked correctly for non installed extensions and the current extension id is retrieved:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
//SlicerExtensionsManagerModelPrivate::getExtensionsInfoFromPreviousInstallations&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
parameters[&amp;quot;productname&amp;quot;] = extensionName; &lt;br /&gt;
parameters[&amp;quot;slicer_revision&amp;quot;] = q-&amp;gt;slicerRevision();&lt;br /&gt;
parameters[&amp;quot;os&amp;quot;] = q-&amp;gt;slicerOs();&lt;br /&gt;
parameters[&amp;quot;arch&amp;quot;] = q-&amp;gt;slicerArch();&lt;br /&gt;
const ExtensionMetadataType&amp;amp; metaData = retrieveExtensionMetadata(parameters);&lt;br /&gt;
extensionId = metaData.value(&amp;quot;extension_id&amp;quot;).toString();     //retrieve updated extension id for not installed extensions&lt;br /&gt;
...&lt;br /&gt;
isCompatible = (this-&amp;gt;isExtensionCompatible(metaData,&lt;br /&gt;
this-&amp;gt;SlicerRevision, this-&amp;gt;SlicerOs, this-&amp;gt;SlicerArch).length() == 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=50723</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=50723"/>
		<updated>2017-04-04T11:17:05Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: /* Adaptations (March) according to input from JC (December) and Ron (January) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC {{done}} '''Completed'''&lt;br /&gt;
* Adapt solution accordingly {{done}} '''Completed'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
* First (not final) version: [[File:0001-ENH-working-version-of-extension-restore-functionali.zip|thumb|First patch]]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders? (yes)&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? (yes)&lt;br /&gt;
* How could settings of previous Slicer installations be accessed under MacOS? (same way as for other platforms)&lt;br /&gt;
&lt;br /&gt;
== Feedback from JC on first version (12/08/2016) ==&lt;br /&gt;
&lt;br /&gt;
* Generally agrees to current solution&lt;br /&gt;
* Solution should be compatible to all platforms (there is a central config/extension folder also on MacOS)&lt;br /&gt;
* Suggested Changes:&lt;br /&gt;
** add a legend to explain color coding (green, gray, black, marked - unmarked) of the presented extensions&lt;br /&gt;
** check for extension compatibility currently deactivated, because model functionality used local information to check compatibility&lt;br /&gt;
*** JC added patch to add server-side information to the compatibility check&lt;br /&gt;
*** commit d448b1c9634c71a61b3476a98bfccffba6bcedb5&lt;br /&gt;
** would be better to track previously installed extensions in the central, not revision-dependent slicer.ini&lt;br /&gt;
*** thus, no (possibly error-prone) parsing of the file names is necessary&lt;br /&gt;
*** also, we would no long have to rely on a central saving location for all extension related information (currently the NA-MIC folder = Extension install path)&lt;br /&gt;
*** Structure could be:&lt;br /&gt;
**** [installedExtensionsHistory] → [Revision] → [ExtensionID]&lt;br /&gt;
*** To enable access to slicer.ini the SlicerCoreApp needs to be extened (e.g. getHistoryFilePath, see. line 319, qSlicerCoreApp.cxx)&lt;br /&gt;
* Additional Information:&lt;br /&gt;
** Q: Why are extensions not removed after uninstalling Slicer?&lt;br /&gt;
** A: related to NSIS installer setup, could be changed if installation setup is changed&lt;br /&gt;
** Q: How could an semi-/automatic update be realized?&lt;br /&gt;
** A: &lt;br /&gt;
*** Change of the underlying QT framework (would mean fundamental changes to the current setup)&lt;br /&gt;
*** or: use an approach similar to the installation of extensions, by having a central store for new slicer version&lt;br /&gt;
*** no auto-uninstall but auto-install / maybe just a popup on start, with a link to the new version&lt;br /&gt;
*** since extension information is saved in central slicer.ini the installation of extensions could be triggered on the first start of the new version &lt;br /&gt;
* General vision (this addition to the extension manager is the first step):&lt;br /&gt;
** core Slicer application + profiles (e.g. using the same set of extensions / setup / layout that was used for a paper) :&lt;br /&gt;
** pre-packed Slicer versions available for downloads&lt;br /&gt;
** can be extended with downloadable profiles&lt;br /&gt;
&lt;br /&gt;
== Adaptations (March) according to input from JC (December) and Ron (January) ==&lt;br /&gt;
After the disclaimer is shown, the slicer.ini is parsed for previously installed extensions, if candidates are found (and the configuration is set to check on startup) a pop-up is shown for instantaneous installation:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension check on startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Dialogs and progress dialogs are provided by the headless mode of the extension restore widget:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension installation progress startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
A restart is requested after installation. If the configuration is set to auto-restart and silent extension check on startup, you get an automatic installation of previous extensions after installing a new Slicer build as requested by Ron:&lt;br /&gt;
&lt;br /&gt;
[[File:Restart confirm after extension installation on startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
An improved widget interface gives detailed information about the state of previously installed extensions, including the auto selection of installation candidates. It also allows to de/activate check on startup and silent installation:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension restore widget interface.png|500px]]&lt;br /&gt;
&lt;br /&gt;
The extension history is now centrally tracked in the slicer settings file (&amp;lt;code&amp;gt; model-&amp;gt;setExtensionsHistorySettingsFilePath(q-&amp;gt;slicerUserSettingsFilePath());&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
//SLICER.INI&lt;br /&gt;
...&lt;br /&gt;
[ExtensionsHistory]&lt;br /&gt;
Revisions\25844=ChangeTracker, SlicerToKiwiExporter, CleaverExtension&lt;br /&gt;
Revisions\25843=AnglePlanesExtension, ABC, CurveMaker, SlicerToKiwiExporter&lt;br /&gt;
Revisions\25842=AnglePlanesExtension, CurveMaker, CMFreg&lt;br /&gt;
Revisions\25895=SlicerToKiwiExporter&lt;br /&gt;
ScheduledForRemoval=&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A set of new functions in the extension manager model help to reflect the current extension installation state (important for future installation):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='c++'&amp;gt;&lt;br /&gt;
//saves the currently installed extension to the [ExtensionsHistory] Revisions\XXXXX=ExtensionName setting&lt;br /&gt;
void saveExtensionToHistorySettings(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata);&lt;br /&gt;
 &lt;br /&gt;
//track info that an extension should be removed (will be removed from history with respect to current slicer version - [ExtensionsHistory] ScheduledForRemoval=ExtensionName)&lt;br /&gt;
void scheduleExtensionHistorySettingRemoval(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata);&lt;br /&gt;
 &lt;br /&gt;
//helper function to add a history setting to a specific setting task (scheduled for removal or adding)&lt;br /&gt;
void addExtensionHistorySetting(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata, const QString&amp;amp; settingsPath);&lt;br /&gt;
 &lt;br /&gt;
//removes scheduled removal&lt;br /&gt;
void cancelExtensionHistorySettingRemoval(const QString&amp;amp; extensionsHistorySettingsFile, const QString&amp;amp; extensionName);&lt;br /&gt;
 &lt;br /&gt;
//remove the extensions from the history settings with respect to the current slicer revision&lt;br /&gt;
void removeScheduledExtensionHistorySettings(const QString&amp;amp; extensionsHistorySettingsFile);&lt;br /&gt;
 &lt;br /&gt;
//core function to parse the settings and create a list with extensionName keys --&amp;gt; extension_id, is_installed, is_compatible, last_revision, was_previously_installed&lt;br /&gt;
QVariantMap getExtensionsInfoFromPreviousInstallations(const QString&amp;amp; extensionsHistorySettingsFile);&lt;br /&gt;
 &lt;br /&gt;
//gathers information and emits extensionHistoryGatheredOnStartup&lt;br /&gt;
void gatherExtensionsHistoryInformationOnStartup();&lt;br /&gt;
&lt;br /&gt;
//PUBLIC:&lt;br /&gt;
void gatherExtensionsHistoryInformationOnStartup();&lt;br /&gt;
QVariantMap getExtensionHistoryInformation();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the extension history information map (&amp;lt;code&amp;gt;QVariantMap getExtensionHistoryInformation()&amp;lt;/code&amp;gt;) that can look like this (shortened - based on the settings shown above):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
QMap(&lt;br /&gt;
(&amp;quot;ABC&amp;quot;,&lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155791&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25843&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;AnglePlanesExtension&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155785&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25843&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;CMFreg&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155788&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25842&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;ChangeTracker&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155789&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25895&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, true) ) )  ) )         //would be a preselected install candidate if it wasn't already installed&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The compatibility is now checked correctly for non installed extensions and the current extension id is retrieved:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
//SlicerExtensionsManagerModelPrivate::getExtensionsInfoFromPreviousInstallations&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
parameters[&amp;quot;productname&amp;quot;] = extensionName; &lt;br /&gt;
parameters[&amp;quot;slicer_revision&amp;quot;] = q-&amp;gt;slicerRevision();&lt;br /&gt;
parameters[&amp;quot;os&amp;quot;] = q-&amp;gt;slicerOs();&lt;br /&gt;
parameters[&amp;quot;arch&amp;quot;] = q-&amp;gt;slicerArch();&lt;br /&gt;
const ExtensionMetadataType&amp;amp; metaData = retrieveExtensionMetadata(parameters);&lt;br /&gt;
extensionId = metaData.value(&amp;quot;extension_id&amp;quot;).toString();     //retrieve updated extension id for not installed extensions&lt;br /&gt;
...&lt;br /&gt;
isCompatible = (this-&amp;gt;isExtensionCompatible(metaData,&lt;br /&gt;
this-&amp;gt;SlicerRevision, this-&amp;gt;SlicerOs, this-&amp;gt;SlicerArch).length() == 0);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=50720</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=50720"/>
		<updated>2017-04-04T10:08:06Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: Added screenshots and explanation for the adaption based on feedback from ron and jc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC {{done}} '''Completed'''&lt;br /&gt;
* Adapt solution accordingly {{done}} '''Completed'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
* First (not final) version: [[File:0001-ENH-working-version-of-extension-restore-functionali.zip|thumb|First patch]]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders? (yes)&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? (yes)&lt;br /&gt;
* How could settings of previous Slicer installations be accessed under MacOS? (same way as for other platforms)&lt;br /&gt;
&lt;br /&gt;
== Feedback from JC on first version (12/08/2016) ==&lt;br /&gt;
&lt;br /&gt;
* Generally agrees to current solution&lt;br /&gt;
* Solution should be compatible to all platforms (there is a central config/extension folder also on MacOS)&lt;br /&gt;
* Suggested Changes:&lt;br /&gt;
** add a legend to explain color coding (green, gray, black, marked - unmarked) of the presented extensions&lt;br /&gt;
** check for extension compatibility currently deactivated, because model functionality used local information to check compatibility&lt;br /&gt;
*** JC added patch to add server-side information to the compatibility check&lt;br /&gt;
*** commit d448b1c9634c71a61b3476a98bfccffba6bcedb5&lt;br /&gt;
** would be better to track previously installed extensions in the central, not revision-dependent slicer.ini&lt;br /&gt;
*** thus, no (possibly error-prone) parsing of the file names is necessary&lt;br /&gt;
*** also, we would no long have to rely on a central saving location for all extension related information (currently the NA-MIC folder = Extension install path)&lt;br /&gt;
*** Structure could be:&lt;br /&gt;
**** [installedExtensionsHistory] → [Revision] → [ExtensionID]&lt;br /&gt;
*** To enable access to slicer.ini the SlicerCoreApp needs to be extened (e.g. getHistoryFilePath, see. line 319, qSlicerCoreApp.cxx)&lt;br /&gt;
* Additional Information:&lt;br /&gt;
** Q: Why are extensions not removed after uninstalling Slicer?&lt;br /&gt;
** A: related to NSIS installer setup, could be changed if installation setup is changed&lt;br /&gt;
** Q: How could an semi-/automatic update be realized?&lt;br /&gt;
** A: &lt;br /&gt;
*** Change of the underlying QT framework (would mean fundamental changes to the current setup)&lt;br /&gt;
*** or: use an approach similar to the installation of extensions, by having a central store for new slicer version&lt;br /&gt;
*** no auto-uninstall but auto-install / maybe just a popup on start, with a link to the new version&lt;br /&gt;
*** since extension information is saved in central slicer.ini the installation of extensions could be triggered on the first start of the new version &lt;br /&gt;
* General vision (this addition to the extension manager is the first step):&lt;br /&gt;
** core Slicer application + profiles (e.g. using the same set of extensions / setup / layout that was used for a paper) :&lt;br /&gt;
** pre-packed Slicer versions available for downloads&lt;br /&gt;
** can be extended with downloadable profiles&lt;br /&gt;
&lt;br /&gt;
== Adaptations (March) according to input from JC (December) and Ron (January) ==&lt;br /&gt;
After the disclaimer is shown, the slicer.ini is parsed for previously installed extensions, if candidates are found (and the configuration is set to check on startup) a pop-up is shown for instantaneous installation:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension check on startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Dialogs and progress dialogs are provided by the headless mode of the extension restore widget:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension installation progress startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
A restart is requested after installation. If the configuration is set to auto-restart and silent extension check on startup, you get an automatic installation of previous extensions after installing a new Slicer build as requested by Ron:&lt;br /&gt;
&lt;br /&gt;
[[File:Restart confirm after extension installation on startup.png|500px]]&lt;br /&gt;
&lt;br /&gt;
An improved widget interface gives detailed information about the state of previously installed extensions, including the auto selection of installation candidates. It also allows to de/activate check on startup and silent installation:&lt;br /&gt;
&lt;br /&gt;
[[File:Extension restore widget interface.png|500px]]&lt;br /&gt;
&lt;br /&gt;
The extension history is now centrally tracked in the slicer settings file (&amp;lt;code&amp;gt; model-&amp;gt;setExtensionsHistorySettingsFilePath(q-&amp;gt;slicerUserSettingsFilePath());&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
//SLICER.INI&lt;br /&gt;
...&lt;br /&gt;
[ExtensionsHistory]&lt;br /&gt;
Revisions\25844=ChangeTracker, SlicerToKiwiExporter, CleaverExtension&lt;br /&gt;
Revisions\25843=AnglePlanesExtension, ABC, CurveMaker, SlicerToKiwiExporter&lt;br /&gt;
Revisions\25842=AnglePlanesExtension, CurveMaker, CMFreg&lt;br /&gt;
Revisions\25895=SlicerToKiwiExporter&lt;br /&gt;
ScheduledForRemoval=&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A set of new functions in the extension manager model help to reflect the current extension installation state (important for future installation):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='c++'&amp;gt;&lt;br /&gt;
//saves the currently installed extension to the [ExtensionsHistory] Revisions\XXXXX=ExtensionName setting&lt;br /&gt;
void saveExtensionToHistorySettings(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata);&lt;br /&gt;
 &lt;br /&gt;
//track info that an extension should be removed (will be removed from history with respect to current slicer version - [ExtensionsHistory] ScheduledForRemoval=ExtensionName)&lt;br /&gt;
void scheduleExtensionHistorySettingRemoval(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata);&lt;br /&gt;
 &lt;br /&gt;
//helper function to add a history setting to a specific setting task (scheduled for removal or adding)&lt;br /&gt;
void addExtensionHistorySetting(const QString&amp;amp; extensionsHistorySettingsFile, const ExtensionMetadataType &amp;amp;extensionMetadata, const QString&amp;amp; settingsPath);&lt;br /&gt;
 &lt;br /&gt;
//removes scheduled removal&lt;br /&gt;
void cancelExtensionHistorySettingRemoval(const QString&amp;amp; extensionsHistorySettingsFile, const QString&amp;amp; extensionName);&lt;br /&gt;
 &lt;br /&gt;
//remove the extensions from the history settings with respect to the current slicer revision&lt;br /&gt;
void removeScheduledExtensionHistorySettings(const QString&amp;amp; extensionsHistorySettingsFile);&lt;br /&gt;
 &lt;br /&gt;
//core function to parse the settings and create a list with extensionName keys --&amp;gt; extension_id, is_installed, is_compatible, last_revision, was_previously_installed&lt;br /&gt;
QVariantMap getExtensionsInfoFromPreviousInstallations(const QString&amp;amp; extensionsHistorySettingsFile);&lt;br /&gt;
 &lt;br /&gt;
//gathers information and emits extensionHistoryGatheredOnStartup&lt;br /&gt;
void gatherExtensionsHistoryInformationOnStartup();&lt;br /&gt;
&lt;br /&gt;
//PUBLIC:&lt;br /&gt;
void gatherExtensionsHistoryInformationOnStartup();&lt;br /&gt;
QVariantMap getExtensionHistoryInformation();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the extension history information map (&amp;lt;code&amp;gt;QVariantMap getExtensionHistoryInformation()&amp;lt;/code&amp;gt;) that can look like this (shortened - based on the settings shown above):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
QMap(&lt;br /&gt;
(&amp;quot;ABC&amp;quot;,&lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155791&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25843&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;AnglePlanesExtension&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155785&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25843&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;CMFreg&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155788&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, false) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25842&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, false) ) )  ) )&lt;br /&gt;
( &amp;quot;ChangeTracker&amp;quot; , &lt;br /&gt;
QVariant(QVariantMap, QMap(&lt;br /&gt;
(&amp;quot;ExtensionId&amp;quot;, QVariant(QString, &amp;quot;155789&amp;quot;) )&lt;br /&gt;
( &amp;quot;IsCompatible&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;IsInstalled&amp;quot; ,  QVariant(bool, true) )&lt;br /&gt;
( &amp;quot;UsedLastInRevision&amp;quot; ,  QVariant(QString, &amp;quot;25895&amp;quot;) )&lt;br /&gt;
( &amp;quot;WasInstalledInLastRevision&amp;quot; ,  QVariant(bool, true) ) )  ) )         //would be a preselected install candidate if it wasn't already installed&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=File:Extension_restore_widget_interface.png&amp;diff=50719</id>
		<title>File:Extension restore widget interface.png</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=File:Extension_restore_widget_interface.png&amp;diff=50719"/>
		<updated>2017-04-04T09:27:14Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The new extensions restore widget interface gives detailed, color-coded information about the state of each extension installed in previous / current slicer versions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=File:Restart_confirm_after_extension_installation_on_startup.png&amp;diff=50718</id>
		<title>File:Restart confirm after extension installation on startup.png</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=File:Restart_confirm_after_extension_installation_on_startup.png&amp;diff=50718"/>
		<updated>2017-04-04T09:18:33Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The headless mode of the extension restore widget triggers a restart request when the extension installation on startup is finished&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=File:Extension_installation_progress_startup.png&amp;diff=50717</id>
		<title>File:Extension installation progress startup.png</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=File:Extension_installation_progress_startup.png&amp;diff=50717"/>
		<updated>2017-04-04T09:17:05Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The headless mode of the extension restore widget shows installation progress with a progress dialog&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=File:Extension_check_on_startup.png&amp;diff=50716</id>
		<title>File:Extension check on startup.png</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=File:Extension_check_on_startup.png&amp;diff=50716"/>
		<updated>2017-04-04T09:15:00Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A dialog that pops up if extension checking is enabled on startup and previously installed extensions were found&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49373</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49373"/>
		<updated>2017-01-17T09:49:21Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: added feedback from JC from the hangout in december&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC {{done}} '''Completed'''&lt;br /&gt;
* Adapt solution accordingly '''ToBeDone'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
* First (not final) version: [[File:0001-ENH-working-version-of-extension-restore-functionali.zip|thumb|First patch]]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders? (yes)&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? (yes)&lt;br /&gt;
* How could settings of previous Slicer installations be accessed under MacOS? (same way as for other platforms)&lt;br /&gt;
&lt;br /&gt;
== Feedback from JC on first version (12/08/2016) ==&lt;br /&gt;
&lt;br /&gt;
* Generally agrees to current solution&lt;br /&gt;
* Solution should be compatible to all platforms (there is a central config/extension folder also on MacOS)&lt;br /&gt;
* Suggested Changes:&lt;br /&gt;
** add a legend to explain color coding (green, gray, black, marked - unmarked) of the presented extensions&lt;br /&gt;
** check for extension compatibility currently deactivated, because model functionality used local information to check compatibility&lt;br /&gt;
*** JC added patch to add server-side information to the compatibility check&lt;br /&gt;
*** commit d448b1c9634c71a61b3476a98bfccffba6bcedb5&lt;br /&gt;
** would be better to track previously installed extensions in the central, not revision-dependent slicer.ini&lt;br /&gt;
*** thus, no (possibly error-prone) parsing of the file names is necessary&lt;br /&gt;
*** also, we would no long have to rely on a central saving location for all extension related information (currently the NA-MIC folder = Extension install path)&lt;br /&gt;
*** Structure could be:&lt;br /&gt;
**** [installedExtensionsHistory] → [Revision] → [ExtensionID]&lt;br /&gt;
*** To enable access to slicer.ini the SlicerCoreApp needs to be extened (e.g. getHistoryFilePath, see. line 319, qSlicerCoreApp.cxx)&lt;br /&gt;
* Additional Information:&lt;br /&gt;
** Q: Why are extensions not removed after uninstalling Slicer?&lt;br /&gt;
** A: related to NSIS installer setup, could be changed if installation setup is changed&lt;br /&gt;
** Q: How could an semi-/automatic update be realized?&lt;br /&gt;
** A: &lt;br /&gt;
*** Change of the underlying QT framework (would mean fundamental changes to the current setup)&lt;br /&gt;
*** or: use an approach similar to the installation of extensions, by having a central store for new slicer version&lt;br /&gt;
*** no auto-uninstall but auto-install / maybe just a popup on start, with a link to the new version&lt;br /&gt;
*** since extension information is saved in central slicer.ini the installation of extensions could be triggered on the first start of the new version &lt;br /&gt;
* General vision (this addition to the extension manager is the first step):&lt;br /&gt;
** core Slicer application + profiles (e.g. using the same set of extensions / setup / layout that was used for a paper) :&lt;br /&gt;
** pre-packed Slicer versions available for downloads&lt;br /&gt;
** can be extended with downloadable profiles&lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49046</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49046"/>
		<updated>2016-12-07T12:40:49Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC '''ToBeDone'''&lt;br /&gt;
* Adapt solution accordingly '''ToBeDone'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
* First (not final) version: [[File:0001-ENH-working-version-of-extension-restore-functionali.zip|thumb|First patch]]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders?&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS?&lt;br /&gt;
* How could settings of previous Slicer installations be accessed under MacOS?&lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49043</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49043"/>
		<updated>2016-12-07T11:32:11Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC '''ToBeDone'''&lt;br /&gt;
* Adapt solution accordingly '''ToBeDone'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
* First (not final) version: [[File:0001-ENH-working-version-of-extension-restore-functionali.zip|thumb|First patch]]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders?&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? &lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49040</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49040"/>
		<updated>2016-12-07T11:31:33Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: added a link to a patch file&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC '''ToBeDone'''&lt;br /&gt;
* Adapt solution accordingly '''ToBeDone'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
* [[File:0001-ENH-working-version-of-extension-restore-functionali.zip|thumb|First patch]]&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders?&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? &lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=File:0001-ENH-working-version-of-extension-restore-functionali.zip&amp;diff=49039</id>
		<title>File:0001-ENH-working-version-of-extension-restore-functionali.zip</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=File:0001-ENH-working-version-of-extension-restore-functionali.zip&amp;diff=49039"/>
		<updated>2016-12-07T11:30:34Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;first patch of the proposed extension&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49036</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49036"/>
		<updated>2016-12-07T10:46:28Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: /* Use case: Keep track of the installed extensions across version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information {{done}} '''Completed'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) {{done}} '''Completed'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions {{done}} '''Completed'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions {{done}} '''Completed'''&lt;br /&gt;
* Discuss the proposed solution with JC '''ToBeDone'''&lt;br /&gt;
* Adapt solution accordingly '''ToBeDone'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders?&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? &lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49033</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49033"/>
		<updated>2016-12-07T10:45:47Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: /* Use case: Keep track of the installed extensions across version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
* Meta issue: [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version&lt;br /&gt;
&lt;br /&gt;
== Idea ==&lt;br /&gt;
* After installing a new version of Slicer, the user can select from all previously installed extensions and batch-install them&lt;br /&gt;
* extensions installed in the last (previous) Slicer versions are marked and preselected (one click-solution for getting the previous setup)&lt;br /&gt;
* extensions that where previously installed but are not compatible for some reason, are shown but not selectable&lt;br /&gt;
* UI: a third tab (&amp;quot;Restore Extensions&amp;quot;) should be added to the Extension Manager and provide at least a list view for selection / a button button for installing the selected extensions&lt;br /&gt;
&lt;br /&gt;
== Gathering information about previous extensions == &lt;br /&gt;
* extensions information  / subfolders containing the extensions are available in the &amp;quot;NA-MIC&amp;quot; folder&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* folder contains and Slicer-[Revision].ini file that points to paths relevant for extensions (modules/libraries/dependencies)&lt;br /&gt;
* however, no explicit information about installed extensions are stored there, information about installed extension is gathered at runtime by parsing the extension subfolders&lt;br /&gt;
* '''PROPOSAL:''' added the extension IDs of all currently installed extensions in an additional setting information &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;, thus, no folders need to be parsed and only the .ini files are needed&lt;br /&gt;
&lt;br /&gt;
== Changes ==&lt;br /&gt;
* &amp;lt;code&amp;gt;Base/QTGUI/Resources/UI/qSlicerExtensionsManagerWidget.ui&amp;lt;/code&amp;gt; &lt;br /&gt;
** a new tab (&amp;quot;Restore Extensions&amp;quot;) was added&lt;br /&gt;
** this tab contains a placeholder-widget for the &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsManagerModel&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a function that provides informations about previous extensions: &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt;&lt;br /&gt;
** add a callback for tracking the progress during non-update related updates: &amp;lt;code&amp;gt;onInstallDownloadProgress&amp;lt;/code&amp;gt; (used in: &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt;)&lt;br /&gt;
** extend &amp;lt;code&amp;gt;installExtension&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;scheduleExtensionForUninstall&amp;lt;/code&amp;gt; to add (remove) ids of installed extensions to a new parameter &amp;lt;code&amp;gt;[Extensions]/InstalledExtension&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Addition ==&lt;br /&gt;
* &amp;lt;code&amp;gt;qSlicerExtensionsRestoreWidget&amp;lt;/code&amp;gt;&lt;br /&gt;
** a new widget that renders a list of available extension that were previously installed&lt;br /&gt;
** on initialization it calls &amp;lt;code&amp;gt;getExtensionRestoreInformation()&amp;lt;/code&amp;gt; and builds a ListItemWidget&lt;br /&gt;
** if &amp;quot;Install selected&amp;quot; is triggered, &amp;lt;code&amp;gt;downloadAndInstallExtension&amp;lt;/code&amp;gt; is called sequentially for each selected extension&lt;br /&gt;
** after installation of all extensions, the list is updated&lt;br /&gt;
[[File:Image2016-11-25 15-26-52.png|thumb|Screenshot of the &amp;quot;restore extension&amp;quot; widget]]&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
* Adapt extensions manager model to provide neccessary information '''Done'''&lt;br /&gt;
* Extend the UI of the extensions manager (new tab, new widget) '''Done'''&lt;br /&gt;
* Add a widget that provides a selectable list of previously installed extensions '''Done'''&lt;br /&gt;
* Install procedure (with feedback) for selected extensions '''Done'''&lt;br /&gt;
* Discuss the proposed solution with JC '''ToBeDone'''&lt;br /&gt;
* Adapt solution accordingly '''ToBeDone'''&lt;br /&gt;
* Submit solution '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Patch ==&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* Does the uninstall progress also remove the extension-subfolders?&lt;br /&gt;
* Is the proposed solution (accessing the .ini file) suitable for all OS? &lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=File:Image2016-11-25_15-26-52.png&amp;diff=49032</id>
		<title>File:Image2016-11-25 15-26-52.png</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=File:Image2016-11-25_15-26-52.png&amp;diff=49032"/>
		<updated>2016-12-07T10:12:50Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A screenshot of the proposed &amp;quot;Restore Extension&amp;quot; Widget&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework/PreviousEfforts&amp;diff=49029</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework/PreviousEfforts</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework/PreviousEfforts&amp;diff=49029"/>
		<updated>2016-12-07T08:15:32Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: a page describing the previous efforts from Dennis concerning the easier installation of previous extensions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Current Process ==&lt;br /&gt;
* Dennis added a third tab in the extension manager, using Qt Designer&lt;br /&gt;
* extensionsInstallPath() returns platform-specific path to &amp;quot;NA-MIC&amp;quot; folder which has &amp;quot;Extensions-2456&amp;quot; subfolders for all installed Slicer versions&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* Dennis' idea: look for all Extensions-* subfolders – how to do that on OS X properly?&lt;br /&gt;
** just found [Extensions]/InstallPath setting in .ini files -&amp;gt; by parsing all ini files, that could work cross-platform&lt;br /&gt;
** on OS X, the inis are in ~/.config//www.na-mic.org&lt;br /&gt;
* Dennis' plan was to use Python scripting, but using C++/Qt would also be a good option&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
* a new (third) tab in the extension manager, which should list all previously installed extensions&lt;br /&gt;
* view should have columns:&lt;br /&gt;
** extension name&lt;br /&gt;
** Slicer revisions / last revision in which the extension was installed&lt;br /&gt;
** checkbox for batch installation, pre-checked from latest previous Slicer revision&lt;br /&gt;
** rows with installed extensions could be grayed out&lt;br /&gt;
* below that, a button for installing the checked extensions&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
&lt;br /&gt;
* Extract list of extensions installed. Look at npm for the format. '''ToBeDone'''&lt;br /&gt;
* Extension manager:&lt;br /&gt;
** Update ExtensionManageModel API so that &amp;quot;list&amp;quot; can be processed '''ToBeDone'''&lt;br /&gt;
** Update entry &amp;quot;Install Extension from file&amp;quot; to &amp;quot;Install Extensions from file&amp;quot; and support &amp;quot;tar.gz&amp;quot;, &amp;quot;.json&amp;quot; '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
Meta issue:&lt;br /&gt;
* [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version '''ToBeDone'''&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49026</id>
		<title>Documentation/Labs/AutomaticUpdateAndInstallationFramework</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/Labs/AutomaticUpdateAndInstallationFramework&amp;diff=49026"/>
		<updated>2016-12-07T08:12:33Z</updated>

		<summary type="html">&lt;p&gt;Mneugebauer: added link to my user page, created link for subpage to shift previous effort information to&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This page serves as roadmap for the Slicer Automatic Update and Installation framework.&lt;br /&gt;
&lt;br /&gt;
Use cases:&lt;br /&gt;
* New Slicer version installed locally should be updated with the list of extensions previously installed.&lt;br /&gt;
* Self update of Slicer&lt;br /&gt;
&lt;br /&gt;
= Terminology =&lt;br /&gt;
&lt;br /&gt;
* User Interface&lt;br /&gt;
** [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] is a Slicer dialog allowing the user to Search, Install, Remove and disable extensions.&lt;br /&gt;
** [[Documentation/Nightly/Modules/ExtensionWizard|ExtensionWizard module]]: This is a Slicer module providing a graphical interface within Slicer to aid in the creation of Slicer extensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Command line&lt;br /&gt;
** [[Documentation/Nightly/Developers/ExtensionWizard|ExtensionWizard]] is a command line tool to simplify the process of creating and contributing extensions.&lt;br /&gt;
*** See also [[Documentation/Nightly/Developers/Tutorials/Contribute_Extension_Description_File_using_Extension_Wizard|Contribute Extension Description File using Extension Wizard]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* API&lt;br /&gt;
** [https://github.com/Slicer/Slicer/blob/master/Base/QTCore/qSlicerExtensionsManagerModel.h ExtensionsManagerModel]: This is the backend of the [[Documentation/4.5/SlicerApplication/ExtensionsManager|Extensions Manager]] displayed to the user&lt;br /&gt;
** [https://github.com/Slicer/Slicer/tree/master/Utilities/Scripts/SlicerWizard Utilities/Scripts/SlicerWizard]: This is a python package used in the ExtensionWizard&lt;br /&gt;
&lt;br /&gt;
= Convention =&lt;br /&gt;
&lt;br /&gt;
Tasks listed in this page can be associated with any of these state:&lt;br /&gt;
* '''ToBeDone'''&lt;br /&gt;
*  {{done}} '''Completed'''&lt;br /&gt;
* '''In progress'''&lt;br /&gt;
&lt;br /&gt;
= Use case: Keep track of the installed extensions across version =&lt;br /&gt;
&lt;br /&gt;
The goal here is to simplify the number of steps allowing people to reinstall extensions that were used in a previous installation.&lt;br /&gt;
&lt;br /&gt;
* Update: [[User:Mneugebauer|Mathias]] is currently working on this task ([[{{FULLPAGENAME}}/PreviousEfforts|Previous Efforts by Dennis]])&lt;br /&gt;
&lt;br /&gt;
== Current Process ==&lt;br /&gt;
* Dennis added a third tab in the extension manager, using Qt Designer&lt;br /&gt;
* extensionsInstallPath() returns platform-specific path to &amp;quot;NA-MIC&amp;quot; folder which has &amp;quot;Extensions-2456&amp;quot; subfolders for all installed Slicer versions&lt;br /&gt;
** on Linux, that's in ~/.config/NA-MIC&lt;br /&gt;
** on Windows, in AppData/Roaming&lt;br /&gt;
** on OS X, seems to be a subdirectory of the application bundle&lt;br /&gt;
* Dennis' idea: look for all Extensions-* subfolders – how to do that on OS X properly?&lt;br /&gt;
** just found [Extensions]/InstallPath setting in .ini files -&amp;gt; by parsing all ini files, that could work cross-platform&lt;br /&gt;
** on OS X, the inis are in ~/.config//www.na-mic.org&lt;br /&gt;
* Dennis' plan was to use Python scripting, but using C++/Qt would also be a good option&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
* a new (third) tab in the extension manager, which should list all previously installed extensions&lt;br /&gt;
* view should have columns:&lt;br /&gt;
** extension name&lt;br /&gt;
** Slicer revisions / last revision in which the extension was installed&lt;br /&gt;
** checkbox for batch installation, pre-checked from latest previous Slicer revision&lt;br /&gt;
** rows with installed extensions could be grayed out&lt;br /&gt;
* below that, a button for installing the checked extensions&lt;br /&gt;
&lt;br /&gt;
== Progress ==&lt;br /&gt;
&lt;br /&gt;
* Extract list of extensions installed. Look at npm for the format. '''ToBeDone'''&lt;br /&gt;
* Extension manager:&lt;br /&gt;
** Update ExtensionManageModel API so that &amp;quot;list&amp;quot; can be processed '''ToBeDone'''&lt;br /&gt;
** Update entry &amp;quot;Install Extension from file&amp;quot; to &amp;quot;Install Extensions from file&amp;quot; and support &amp;quot;tar.gz&amp;quot;, &amp;quot;.json&amp;quot; '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
Meta issue:&lt;br /&gt;
* [http://www.na-mic.org/Bug/view.php?id=2779 2779]: Mechanism to keep track of the installed extensions across version '''ToBeDone'''&lt;br /&gt;
&lt;br /&gt;
== Completed ==&lt;br /&gt;
&lt;br /&gt;
NA&lt;br /&gt;
&lt;br /&gt;
= Use case: Self update of Slicer =&lt;br /&gt;
&lt;br /&gt;
== Proposed Changes ==&lt;br /&gt;
&lt;br /&gt;
* Display list of nightly builds in a web view&lt;br /&gt;
* Selecting a new version should automate:&lt;br /&gt;
** download&lt;br /&gt;
** auto-start installer, with extra information for the next steps&lt;br /&gt;
** auto-start new Slicer&lt;br /&gt;
** possibly, directly going to the above extensions-reinstallation tab (maybe not even showing the main window before)&lt;br /&gt;
* stuff that is there, or might be useful&lt;br /&gt;
** cross-platform re-start functionality is there (as part of extension installation)&lt;br /&gt;
** probably, at least on Win/Linux, &amp;quot;start Slicer after installation&amp;quot; is possible&lt;br /&gt;
** unattended installation on any platform(s)?&lt;br /&gt;
&lt;br /&gt;
= Notes =&lt;br /&gt;
&lt;br /&gt;
== 2016.05.03 ==&lt;br /&gt;
&lt;br /&gt;
* See also [[Documentation/Labs/ExtensionsFrameworkRoadmap]]&lt;br /&gt;
&lt;br /&gt;
* Ability to ask the installer (or Slicer) to install other extensions&lt;br /&gt;
** Would it make sense to transition to http://doc.qt.io/qtinstallerframework/ ?&lt;br /&gt;
&lt;br /&gt;
* Serialize what is installed in you current Slicer&lt;br /&gt;
&lt;br /&gt;
* Update of installed extensions:&lt;br /&gt;
** See https://www.slicer.org/slicerWiki/index.php/Documentation/4.5/SlicerApplication/ExtensionsManager#Updating_installed_extensions&lt;/div&gt;</summary>
		<author><name>Mneugebauer</name></author>
		
	</entry>
</feed>