diff options
author | kh1 <qt-info@nokia.com> | 2011-03-23 20:23:44 +0100 |
---|---|---|
committer | kh1 <qt-info@nokia.com> | 2011-03-23 20:23:44 +0100 |
commit | 5ee19b90c50ac188b3cf85f775e06935c5e3f3e1 (patch) | |
tree | 8eac7110eab9f8464dc87e3bec5dbcc2278599ac | |
parent | e51dcab16d9d1360c92f41c0ee083feded5fa7af (diff) |
Implement a new component model.
-rw-r--r-- | installerbuilder/libinstaller/qinstallercomponentmodel.cpp | 245 | ||||
-rw-r--r-- | installerbuilder/libinstaller/qinstallercomponentmodel.h | 54 |
2 files changed, 297 insertions, 2 deletions
diff --git a/installerbuilder/libinstaller/qinstallercomponentmodel.cpp b/installerbuilder/libinstaller/qinstallercomponentmodel.cpp index 204d4eceb..a465a44e6 100644 --- a/installerbuilder/libinstaller/qinstallercomponentmodel.cpp +++ b/installerbuilder/libinstaller/qinstallercomponentmodel.cpp @@ -43,6 +43,249 @@ using namespace QInstaller; +static QFont s_virtualComponentsFont; + +InstallerComponentModel::InstallerComponentModel(int columns, Installer *parent) + : QAbstractItemModel(parent) + , m_columns(columns) + , m_installer(parent) + , m_headerComponent(0) +{ +} + +InstallerComponentModel::~InstallerComponentModel() +{ +} + +int InstallerComponentModel::rowCount(const QModelIndex &parent) const +{ + if (Component *component = componentFromIndex(parent)) + return component->childCount(); + return 0; +} + +int InstallerComponentModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + return m_columns; +} + +QModelIndex InstallerComponentModel::parent(const QModelIndex &child) const +{ + if (!child.isValid()) + return QModelIndex(); + + if (Component *childComponent = componentFromIndex(child)) { + if (Component *parent = childComponent->parentComponent()) { + if (parent != m_headerComponent) + return createIndex(parent->childIndex(), 0, parent); + } + } + return QModelIndex(); +} + +QModelIndex InstallerComponentModel::index(int row, int column, const QModelIndex &parent) const +{ + if (parent.isValid() && column >= columnCount(parent)) + return QModelIndex(); + + if (Component *parentComponent = componentFromIndex(parent)) { + if (Component *childCmponent = parentComponent->childAt(row)) + return createIndex(row, column, childCmponent); + } + return QModelIndex(); +} + +QVariant InstallerComponentModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (Component *component = componentFromIndex(index)) { + switch (index.column()) { + case NameColumn: { + switch (role) { + case Qt::EditRole: + case Qt::DisplayRole: + return component->displayName(); + case Qt::CheckStateRole: + return component->checkState(); + case Qt::ToolTipRole: { + return component->value(QLatin1String("Description")) + + QLatin1String("<br><br> Update Info: ") + + component->value(QLatin1String ("UpdateText")); + } + case Qt::FontRole:{ + return component->value(QLatin1String("Virtual")).toLower() + == QLatin1String("true") ? virtualComponentsFont() : QFont(); + } + default: + return QVariant(); + } + } break; + + case VersionColumn: { + if (role == Qt::DisplayRole) + return component->value(QLatin1String("Version")); + } break; + + case InstalledVersionColumn: { + if (role == Qt::DisplayRole) + return component->value(QLatin1String("InstalledVersion")); + } break; + + case SizeColumn: { + if (role == Qt::DisplayRole) { + double size = component->value(QLatin1String("UncompressedSize")).toDouble(); + if (size < 10000.0) + return tr("%L1 Bytes").arg(size); + size /= 1024.0; + if (size < 10000.0) + return tr("%L1 kB").arg(size, 0, 'f', 1); + size /= 1024.0; + if (size < 10000.0) + return tr("%L1 MB").arg(size, 0, 'f', 1); + size /= 1024.0; + return tr("%L1 GB").arg(size, 0, 'f', 1); + } + } break; + } + } + return QVariant(); +} + +bool InstallerComponentModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (!index.isValid()) + return false; + + Component *component = componentFromIndex(index); + if (!component || component == m_headerComponent) + return false; + + switch (role) { + case Qt::CheckStateRole: { + component->setCheckState(Qt::CheckState(value.toInt())); + } break; + default: + return false; + } + + return true; +} + +QVariant InstallerComponentModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal && role == Qt::DisplayRole) { + switch (section) { + case NameColumn: + return tr("Name"); + case InstalledVersionColumn: + return tr("Installed Version"); + case VersionColumn: + return tr("New Version"); + case SizeColumn: + return tr("Size"); + default: + return QAbstractItemModel::headerData(section, orientation, role); + } + } + return QAbstractItemModel::headerData(section, orientation, role); +} + +bool InstallerComponentModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, + int role) +{ + // TODO: implement + return true; +} + +Qt::ItemFlags InstallerComponentModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) + return m_headerComponent->flags(); + + if (Component *component = componentFromIndex(index)) + return component->flags(); + + return Qt::ItemIsEnabled | Qt::ItemIsSelectable| Qt::ItemIsUserCheckable; +} + +void InstallerComponentModel::setRootComponents(QList<Component*> rootComponents) +{ + beginResetModel(); + + m_cache.clear(); + // delete m_headerComponent; + + m_headerComponent = new Component(0); + foreach (Component *component, rootComponents) + m_headerComponent->appendComponent(component); + + const QModelIndex &root = index(0,0, QModelIndex()); + setupCache(root); + m_cache.insert(static_cast<Component*> (root.internalPointer()), root); + + endResetModel(); +} + +void InstallerComponentModel::appendRootComponents(QList<Component*> rootComponents) +{ + // TODO: implement +} + +QModelIndex InstallerComponentModel::indexFromComponent(Component *component) const +{ + return m_cache.value(component, QModelIndex()); +} + +Component* InstallerComponentModel::componentFromIndex(const QModelIndex &index) const +{ + if (index.isValid()) + return static_cast<Component*>(index.internalPointer()); + return m_headerComponent; +} + +QFont InstallerComponentModel::virtualComponentsFont() +{ + return s_virtualComponentsFont; +} + +void InstallerComponentModel::setVirtualComponentsFont(const QFont &font) +{ + s_virtualComponentsFont = font; +} + +void InstallerComponentModel::setupCache(const QModelIndex &parent) +{ + const QModelIndexList &list = collectComponents(parent); + foreach (const QModelIndex &index, list) + m_cache.insert(componentFromIndex(index), index); +} + +QModelIndexList InstallerComponentModel::collectComponents(const QModelIndex &parent) const +{ + QModelIndexList list; + for (int i = rowCount(parent) - 1; i >= 0 ; --i) { + const QModelIndex &next = index(i, 0, parent); + if (Component *component = componentFromIndex(next)) { + verbose() << "Name: " << component->name() << ", Children: " + << component->childCount() << std::endl; + if (component->childCount() > 0) + list += collectComponents(next); + } + list.append(next); + } + return list; +} + + + + + + + + bool checkCompleteUninstallation(const Component *component) { bool nonSelected = true; @@ -507,8 +750,6 @@ void ComponentModel::setVirtualComponentsVisible(bool visible) s_virtualComponentsVisible = visible; } -static QFont s_virtualComponentsFont; - QFont ComponentModel::virtualComponentsFont() { return s_virtualComponentsFont; diff --git a/installerbuilder/libinstaller/qinstallercomponentmodel.h b/installerbuilder/libinstaller/qinstallercomponentmodel.h index d8b8ad893..e185ffa59 100644 --- a/installerbuilder/libinstaller/qinstallercomponentmodel.h +++ b/installerbuilder/libinstaller/qinstallercomponentmodel.h @@ -35,6 +35,60 @@ namespace QInstaller { class Component; class Installer; +typedef QMap<Component*, QPersistentModelIndex> ComponentModelIndexCache; + +class INSTALLER_EXPORT InstallerComponentModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + + enum Column { + NameColumn = 0, + InstalledVersionColumn, + VersionColumn, + SizeColumn + }; + + explicit InstallerComponentModel(int columns, Installer *parent = 0); + ~InstallerComponentModel(); + + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + + QModelIndex parent(const QModelIndex &child) const; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, + int role = Qt::EditRole); + + Qt::ItemFlags flags(const QModelIndex &index) const; + + void setRootComponents(QList<Component*> rootComponents); + void appendRootComponents(QList<Component*> rootComponents); + + QModelIndex indexFromComponent(Component *component) const; + Component* componentFromIndex(const QModelIndex &index) const; + + static QFont virtualComponentsFont(); + static void setVirtualComponentsFont(const QFont &font); + +private: + void setupCache(const QModelIndex &parent); + QModelIndexList collectComponents(const QModelIndex &parent) const; + +private: + int m_columns; + ComponentModelIndexCache m_cache; + + Installer *m_installer; + Component *m_headerComponent; +}; + class INSTALLER_EXPORT ComponentModel : public QAbstractItemModel { Q_OBJECT |