I faced the same problem too. So I have downloaded the latest snapshot and studied samples. One in particular is very helpful : dynamicpage
I didn't succeed to show a popup warning to the user when he's choosing an existing location, so I have found a work around: instead, a red label is shown under the selected directory.
This is not really a solution for updating component by component, but you will be able to continue installation process.
First of all, we need to replace the default page "TargetDirectory".
In file installerscript.qs
, this is what you need to add:
// Constructor
function Component()
{
component.loaded.connect(this, Component.prototype.installerLoaded);
installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
}
// Utility function like QString QDir::toNativeSeparators(const QString & pathName) [static]
var Dir = new function () {
this.toNativeSparator = function (path) {
if (installer.value("os") == "win")
return path.replace(/\//g, '\\');
return path;
}
};
// Called as soon as the component was loaded
Component.prototype.installerLoaded = function()
{
if (installer.addWizardPage(component, "TargetWidget", QInstaller.TargetDirectory)) {
var widget = gui.pageWidgetByObjectName("DynamicTargetWidget");
if (widget != null) {
widget.targetDirectory.textChanged.connect(this, Component.prototype.targetChanged);
widget.targetChooser.clicked.connect(this, Component.prototype.chooseTarget);
widget.windowTitle = "Installation Folder";
widget.targetDirectory.text = Dir.toNativeSparator(installer.value("TargetDir"));
}
}
}
// Callback when one is clicking on the button to select where to install your application
Component.prototype.chooseTarget = function () {
var widget = gui.pageWidgetByObjectName("DynamicTargetWidget");
if (widget != null) {
var newTarget = QFileDialog.getExistingDirectory("Choose your target directory.", widget.targetDirectory.text);
if (newTarget != "") {
widget.targetDirectory.text = Dir.toNativeSparator(newTarget);
}
}
}
Component.prototype.targetChanged = function (text) {
var widget = gui.pageWidgetByObjectName("DynamicTargetWidget");
if (widget != null) {
if (text != "") {
widget.complete = true;
installer.setValue("TargetDir", text);
if (installer.fileExists(text + "/components.xml")) {
var warning = "<font color='red'>" + qsTr("A previous installation exists in this folder. If you wish to continue, everything will be overwritten.") + "</font>";
widget.labelOverwrite.text = warning;
} else {
widget.labelOverwrite.text = "";
}
return;
}
widget.complete = false;
}
}
In file targetwidget.ui
This is actually not the real .ui file, just for explanation purpose. In the end of this file, I have added an empty QLabel called labelOverwrite
. The text is filled with red message in targetChanged
callback.
<widget class="QWidget" name="TargetWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Please specify the folder where Miam-Player will be installed.</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLineEdit" name="targetDirectory"/>
</item>
<item>
<widget class="QToolButton" name="targetChooser"/>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="labelOverwrite"/>
</item>
</layout>
</widget>
Finally, don't forget to modify your existing file package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package>
<DisplayName>Miam-Player</DisplayName>
<Description>Miam-Player is the main program. It is required and cannot be unselected.</Description>
<Name>org.miamplayer.core</Name>
<Script>installscript.qs</Script>
...
<UserInterfaces>
<UserInterface>targetwidget.ui</UserInterface>
</UserInterfaces>
</Package>