summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/component_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/component_p.cpp')
-rw-r--r--src/libs/installer/component_p.cpp359
1 files changed, 359 insertions, 0 deletions
diff --git a/src/libs/installer/component_p.cpp b/src/libs/installer/component_p.cpp
new file mode 100644
index 000000000..4294ac8a8
--- /dev/null
+++ b/src/libs/installer/component_p.cpp
@@ -0,0 +1,359 @@
+/**************************************************************************
+**
+** This file is part of Installer Framework
+**
+** Copyright (c) 2011-2012 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+**
+** GNU Lesser General Public License Usage
+**
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this file.
+** Please review the following information to ensure the GNU Lesser General
+** Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** Other Usage
+**
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**************************************************************************/
+
+#include "component_p.h"
+
+#include "component.h"
+#include "messageboxhandler.h"
+#include "packagemanagercore.h"
+
+#include <QtGui/QApplication>
+#include <QtGui/QDesktopServices>
+
+
+namespace QInstaller {
+
+// -- ComponentPrivate
+
+ComponentPrivate::ComponentPrivate(PackageManagerCore *core, Component *qq)
+ : q(qq),
+ m_core(core),
+ m_parentComponent(0),
+ m_licenseOperation(0),
+ m_minimumProgressOperation(0),
+ m_newlyInstalled (false),
+ m_operationsCreated(false),
+ m_removeBeforeUpdate(true),
+ m_autoCreateOperations(true),
+ m_operationsCreatedSuccessfully(true),
+ m_updateIsAvailable(false),
+ m_scriptEngine(0)
+{
+}
+
+ComponentPrivate::~ComponentPrivate()
+{
+ // Before we can delete the added widgets, they need to be removed from the wizard first.
+ QMap<QString, QPointer<QWidget> >::const_iterator it;
+ foreach (const QString &widgetName, m_userInterfaces.keys()) {
+ m_core->removeWizardPage(q, widgetName);
+ m_core->removeWizardPageItem(q, widgetName);
+ }
+
+ // Use QPointer here instead of raw pointers. This is a requirement that needs to be met cause possible
+ // Ui elements get added during component script run and might be destroyed by the package manager gui
+ // before the actual component gets destroyed. Avoids a possible delete call on a dangling pointer.
+ foreach (const QPointer<QWidget> widget, m_userInterfaces)
+ delete widget.data();
+}
+
+QScriptEngine *ComponentPrivate::scriptEngine()
+{
+ if (m_scriptEngine != 0)
+ return m_scriptEngine;
+
+
+ m_scriptEngine = new QScriptEngine(q);
+
+ // register translation stuff
+ m_scriptEngine->installTranslatorFunctions();
+
+ // register QMessageBox::StandardButton enum in the script connection
+ registerMessageBox(m_scriptEngine);
+
+ // register QDesktopServices in the script connection
+ QScriptValue desktopServices = m_scriptEngine->newArray();
+ setProperty(desktopServices, QLatin1String("DesktopLocation"), QDesktopServices::DesktopLocation);
+ setProperty(desktopServices, QLatin1String("DocumentsLocation"), QDesktopServices::DocumentsLocation);
+ setProperty(desktopServices, QLatin1String("FontsLocation"), QDesktopServices::FontsLocation);
+ setProperty(desktopServices, QLatin1String("ApplicationsLocation"), QDesktopServices::ApplicationsLocation);
+ setProperty(desktopServices, QLatin1String("MusicLocation"), QDesktopServices::MusicLocation);
+ setProperty(desktopServices, QLatin1String("MoviesLocation"), QDesktopServices::MoviesLocation);
+ setProperty(desktopServices, QLatin1String("PicturesLocation"), QDesktopServices::PicturesLocation);
+ setProperty(desktopServices, QLatin1String("TempLocation"), QDesktopServices::TempLocation);
+ setProperty(desktopServices, QLatin1String("HomeLocation"), QDesktopServices::HomeLocation);
+ setProperty(desktopServices, QLatin1String("DataLocation"), QDesktopServices::DataLocation);
+ setProperty(desktopServices, QLatin1String("CacheLocation"), QDesktopServices::CacheLocation);
+
+ desktopServices.setProperty(QLatin1String("openUrl"), m_scriptEngine->newFunction(qDesktopServicesOpenUrl));
+ desktopServices.setProperty(QLatin1String("displayName"),
+ m_scriptEngine->newFunction(qDesktopServicesDisplayName));
+ desktopServices.setProperty(QLatin1String("storageLocation"),
+ m_scriptEngine->newFunction(qDesktopServicesStorageLocation));
+
+ // register ::WizardPage enum in the script connection
+ QScriptValue qinstaller = m_scriptEngine->newArray();
+ setProperty(qinstaller, QLatin1String("Introduction"), PackageManagerCore::Introduction);
+ setProperty(qinstaller, QLatin1String("LicenseCheck"), PackageManagerCore::LicenseCheck);
+ setProperty(qinstaller, QLatin1String("TargetDirectory"), PackageManagerCore::TargetDirectory);
+ setProperty(qinstaller, QLatin1String("ComponentSelection"), PackageManagerCore::ComponentSelection);
+ setProperty(qinstaller, QLatin1String("StartMenuSelection"), PackageManagerCore::StartMenuSelection);
+ setProperty(qinstaller, QLatin1String("ReadyForInstallation"), PackageManagerCore::ReadyForInstallation);
+ setProperty(qinstaller, QLatin1String("PerformInstallation"), PackageManagerCore::PerformInstallation);
+ setProperty(qinstaller, QLatin1String("InstallationFinished"), PackageManagerCore::InstallationFinished);
+ setProperty(qinstaller, QLatin1String("End"), PackageManagerCore::End);
+
+ // register ::Status enum in the script connection
+ setProperty(qinstaller, QLatin1String("Success"), PackageManagerCore::Success);
+ setProperty(qinstaller, QLatin1String("Failure"), PackageManagerCore::Failure);
+ setProperty(qinstaller, QLatin1String("Running"), PackageManagerCore::Running);
+ setProperty(qinstaller, QLatin1String("Canceled"), PackageManagerCore::Canceled);
+
+ // maybe used by old scripts
+ setProperty(qinstaller, QLatin1String("InstallerFailed"), PackageManagerCore::Failure);
+ setProperty(qinstaller, QLatin1String("InstallerSucceeded"), PackageManagerCore::Success);
+ setProperty(qinstaller, QLatin1String("InstallerUnfinished"), PackageManagerCore::Unfinished);
+ setProperty(qinstaller, QLatin1String("InstallerCanceledByUser"), PackageManagerCore::Canceled);
+
+ QScriptValue installerObject = m_scriptEngine->newQObject(m_core);
+ installerObject.setProperty(QLatin1String("componentByName"), m_scriptEngine
+ ->newFunction(qInstallerComponentByName, 1));
+
+ m_scriptEngine->globalObject().setProperty(QLatin1String("QInstaller"), qinstaller);
+ m_scriptEngine->globalObject().setProperty(QLatin1String("installer"), installerObject);
+ m_scriptEngine->globalObject().setProperty(QLatin1String("QDesktopServices"), desktopServices);
+ m_scriptEngine->globalObject().setProperty(QLatin1String("component"), m_scriptEngine->newQObject(q));
+
+ return m_scriptEngine;
+}
+
+void ComponentPrivate::setProperty(QScriptValue &scriptValue, const QString &propertyName, int value)
+{
+ scriptValue.setProperty(propertyName, m_scriptEngine->newVariant(value));
+}
+
+
+// -- ComponentModelHelper
+
+ComponentModelHelper::ComponentModelHelper()
+{
+ setCheckState(Qt::Unchecked);
+ setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
+}
+
+/*!
+ Returns the number of child components. Depending if virtual components are visible or not the count might
+ differ from what one will get if calling Component::childComponents(...).count().
+*/
+int ComponentModelHelper::childCount() const
+{
+ if (m_componentPrivate->m_core->virtualComponentsVisible())
+ return m_componentPrivate->m_allChildComponents.count();
+ return m_componentPrivate->m_childComponents.count();
+}
+
+/*!
+ Returns the index of this component as seen from it's parent.
+*/
+int ComponentModelHelper::indexInParent() const
+{
+ int index = 0;
+ if (Component *parent = m_componentPrivate->m_parentComponent->parentComponent())
+ index = parent->childComponents(false, AllMode).indexOf(m_componentPrivate->m_parentComponent);
+ return (index >= 0 ? index : 0);
+}
+
+/*!
+ Returns all children and whose children depending if virtual components are visible or not.
+*/
+QList<Component*> ComponentModelHelper::childs() const
+{
+ QList<Component*> *components = &m_componentPrivate->m_childComponents;
+ if (m_componentPrivate->m_core->virtualComponentsVisible())
+ components = &m_componentPrivate->m_allChildComponents;
+
+ QList<Component*> result;
+ foreach (Component *component, *components) {
+ result.append(component);
+ result += component->childs();
+ }
+ return result;
+}
+
+/*!
+ Returns the component at index position in the list. Index must be a valid position in
+ the list (i.e., index >= 0 && index < childCount()). Otherwise it returns 0.
+*/
+Component *ComponentModelHelper::childAt(int index) const
+{
+ if (index >= 0 && index < childCount()) {
+ if (m_componentPrivate->m_core->virtualComponentsVisible())
+ return m_componentPrivate->m_allChildComponents.value(index, 0);
+ return m_componentPrivate->m_childComponents.value(index, 0);
+ }
+ return 0;
+}
+
+/*!
+ Determines if the components installations status can be changed. The default value is true.
+*/
+bool ComponentModelHelper::isEnabled() const
+{
+ return (flags() & Qt::ItemIsEnabled) != 0;
+}
+
+/*!
+ Enables oder disables ability to change the components installations status.
+*/
+void ComponentModelHelper::setEnabled(bool enabled)
+{
+ changeFlags(enabled, Qt::ItemIsEnabled);
+}
+
+/*!
+ Returns whether the component is tristate; that is, if it's checkable with three separate states.
+ The default value is false.
+*/
+bool ComponentModelHelper::isTristate() const
+{
+ return (flags() & Qt::ItemIsTristate) != 0;
+}
+
+/*!
+ Sets whether the component is tristate. If tristate is true, the component is checkable with three
+ separate states; otherwise, the component is checkable with two states.
+
+ (Note that this also requires that the component is checkable; see isCheckable().)
+*/
+void ComponentModelHelper::setTristate(bool tristate)
+{
+ changeFlags(tristate, Qt::ItemIsTristate);
+}
+
+/*!
+ Returns whether the component is user-checkable. The default value is true.
+*/
+bool ComponentModelHelper::isCheckable() const
+{
+ return (flags() & Qt::ItemIsUserCheckable) != 0;
+}
+
+/*!
+ Sets whether the component is user-checkable. If checkable is true, the component can be checked by the
+ user; otherwise, the user cannot check the component. The delegate will render a checkable component
+ with a check box next to the component's text.
+*/
+void ComponentModelHelper::setCheckable(bool checkable)
+{
+ if (checkable && !isCheckable()) {
+ // make sure there's data for the check state role
+ if (!data(Qt::CheckStateRole).isValid())
+ setData(Qt::Unchecked, Qt::CheckStateRole);
+ }
+ changeFlags(checkable, Qt::ItemIsUserCheckable);
+}
+
+/*!
+ Returns whether the component is selectable by the user. The default value is true.
+*/
+bool ComponentModelHelper::isSelectable() const
+{
+ return (flags() & Qt::ItemIsSelectable) != 0;
+}
+
+/*!
+ Sets whether the component is selectable. If selectable is true, the component can be selected by the
+ user; otherwise, the user cannot select the component.
+*/
+void ComponentModelHelper::setSelectable(bool selectable)
+{
+ changeFlags(selectable, Qt::ItemIsSelectable);
+}
+
+/*!
+ Returns the item flags for the component. The item flags determine how the user can interact with the
+ component.
+*/
+Qt::ItemFlags ComponentModelHelper::flags() const
+{
+ QVariant variant = data(Qt::UserRole - 1);
+ if (!variant.isValid())
+ return (Qt::ItemIsEnabled | Qt::ItemIsSelectable| Qt::ItemIsUserCheckable);
+ return Qt::ItemFlags(variant.toInt());
+}
+
+/*!
+ Sets the item flags for the component to flags. The item flags determine how the user can interact with
+ the component. This is often used to disable an component.
+*/
+void ComponentModelHelper::setFlags(Qt::ItemFlags flags)
+{
+ setData(int(flags), Qt::UserRole - 1);
+}
+
+/*!
+ Returns the checked state of the component.
+*/
+Qt::CheckState ComponentModelHelper::checkState() const
+{
+ return Qt::CheckState(qvariant_cast<int>(data(Qt::CheckStateRole)));
+}
+
+/*!
+ Sets the check state of the component to be state.
+*/
+void ComponentModelHelper::setCheckState(Qt::CheckState state)
+{
+ setData(state, Qt::CheckStateRole);
+}
+
+/*!
+ Returns the component's data for the given role, or an invalid QVariant if there is no data for role.
+*/
+QVariant ComponentModelHelper::data(int role) const
+{
+ return m_values.value((role == Qt::EditRole ? Qt::DisplayRole : role), QVariant());
+}
+
+/*!
+ Sets the component's data for the given role to the specified value.
+*/
+void ComponentModelHelper::setData(const QVariant &value, int role)
+{
+ m_values.insert((role == Qt::EditRole ? Qt::DisplayRole : role), value);
+}
+
+// -- protected
+
+void ComponentModelHelper::setPrivate(ComponentPrivate *componentPrivate)
+{
+ m_componentPrivate = componentPrivate;
+}
+
+// -- private
+
+void ComponentModelHelper::changeFlags(bool enable, Qt::ItemFlags itemFlags)
+{
+ setFlags(enable ? flags() |= itemFlags : flags() &= ~itemFlags);
+}
+
+} // namespace QInstaller