diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 14855097b90a728a2341f5ae3b611c3dcc312746..e8aa4cd757cf3372e7d815bb45e020760a56f488 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -1301,10 +1301,6 @@ void PluginManagerPrivate::resolveDependencies() spec->d->resolveDependencies(pluginSpecs); } - // Reset disabledIndirectly flag - foreach (PluginSpec *spec, loadQueue()) - spec->d->disabledIndirectly = false; - foreach (PluginSpec *spec, loadQueue()) { spec->d->disableIndirectlyIfDependencyDisabled(); } @@ -1329,11 +1325,6 @@ PluginSpec *PluginManagerPrivate::pluginForOption(const QString &option, bool *r return 0; } -void PluginManagerPrivate::disablePluginIndirectly(PluginSpec *spec) -{ - spec->d->disabledIndirectly = true; -} - PluginSpec *PluginManagerPrivate::pluginByName(const QString &name) const { foreach (PluginSpec *spec, pluginSpecs) diff --git a/src/libs/extensionsystem/pluginmanager_p.h b/src/libs/extensionsystem/pluginmanager_p.h index 6a7a1bbb647faf4658de1921a8a92c2d9ebd22fa..f0a60e45581c99be0ece22d67fa25d08d58b6385 100644 --- a/src/libs/extensionsystem/pluginmanager_p.h +++ b/src/libs/extensionsystem/pluginmanager_p.h @@ -80,7 +80,6 @@ public: void setGlobalSettings(QSettings *settings); void readSettings(); void writeSettings(); - void disablePluginIndirectly(PluginSpec *spec); class TestSpec { public: diff --git a/src/libs/extensionsystem/pluginspec.cpp b/src/libs/extensionsystem/pluginspec.cpp index fe36a3c9116f298aa517c3963ffa9043dcc28638..7e4bf6098530b37410a29ca81aeca4c8dfd4c0da 100644 --- a/src/libs/extensionsystem/pluginspec.cpp +++ b/src/libs/extensionsystem/pluginspec.cpp @@ -542,11 +542,6 @@ void PluginSpec::setDisabledByDefault(bool value) d->disabledByDefault = value; } -void PluginSpec::setDisabledIndirectly(bool value) -{ - d->disabledIndirectly = value; -} - void PluginSpec::setForceEnabled(bool value) { d->forceEnabled = value; diff --git a/src/libs/extensionsystem/pluginspec.h b/src/libs/extensionsystem/pluginspec.h index bc38ac69cc2e5bc6b3eaab592ecce549b6189c4a..c29aede6a9e203018bea90c76f3000fbfe801a99 100644 --- a/src/libs/extensionsystem/pluginspec.h +++ b/src/libs/extensionsystem/pluginspec.h @@ -113,7 +113,6 @@ public: void setEnabled(bool value); void setDisabledByDefault(bool value); - void setDisabledIndirectly(bool value); void setForceEnabled(bool value); void setForceDisabled(bool value); diff --git a/src/libs/extensionsystem/pluginview.cpp b/src/libs/extensionsystem/pluginview.cpp index 68990b8f2938d23d0d4280265de195055cca3c50..d1c9f9dced5960f4f7ffd20017ac86537ae8693a 100644 --- a/src/libs/extensionsystem/pluginview.cpp +++ b/src/libs/extensionsystem/pluginview.cpp @@ -32,14 +32,17 @@ #include "pluginmanager.h" #include "pluginspec.h" #include "plugincollection.h" + +#include #include +#include #include #include #include #include -#include -#include +#include +#include /*! \class ExtensionSystem::PluginView @@ -66,317 +69,321 @@ for example by a double-click. */ -using namespace ExtensionSystem; - Q_DECLARE_METATYPE(ExtensionSystem::PluginSpec*) Q_DECLARE_METATYPE(ExtensionSystem::PluginCollection*) -/*! - Constructs a PluginView that gets the list of plugins from the - given plugin \a manager with a given \a parent widget. -*/ -PluginView::PluginView(QWidget *parent) - : QWidget(parent), - m_allowCheckStateUpdate(true), - C_LOAD(1) -{ - m_categoryWidget = new Utils::TreeWidget(this); - m_categoryWidget->setAlternatingRowColors(true); - m_categoryWidget->setIndentation(20); - m_categoryWidget->setUniformRowHeights(true); - m_categoryWidget->setSortingEnabled(true); - m_categoryWidget->setColumnCount(4); - m_categoryWidget->setColumnWidth(C_LOAD, 40); - m_categoryWidget->header()->setDefaultSectionSize(120); - m_categoryWidget->header()->setMinimumSectionSize(35); - m_categoryWidget->setActivationMode(Utils::DoubleClickActivation); - - QTreeWidgetItem *headerItem = m_categoryWidget->headerItem(); - headerItem->setText(0, tr("Name")); - headerItem->setText(1, tr("Load")); - headerItem->setText(2, tr("Version")); - headerItem->setText(3, tr("Vendor")); - - QGridLayout *gridLayout = new QGridLayout(this); - gridLayout->setContentsMargins(2, 2, 2, 2); - gridLayout->addWidget(m_categoryWidget, 1, 0, 1, 1); - - QHeaderView *header = m_categoryWidget->header(); - header->setSectionResizeMode(0, QHeaderView::ResizeToContents); - header->setSectionResizeMode(2, QHeaderView::ResizeToContents); +using namespace Utils; - m_okIcon = QIcon(QLatin1String(":/extensionsystem/images/ok.png")); - m_errorIcon = QIcon(QLatin1String(":/extensionsystem/images/error.png")); - m_notLoadedIcon = QIcon(QLatin1String(":/extensionsystem/images/notloaded.png")); +namespace ExtensionSystem { - connect(PluginManager::instance(), SIGNAL(pluginsChanged()), this, SLOT(updateList())); - connect(m_categoryWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), - this, SLOT(selectPlugin(QTreeWidgetItem*))); - connect(m_categoryWidget, SIGNAL(itemActivated(QTreeWidgetItem*,int)), - this, SLOT(activatePlugin(QTreeWidgetItem*))); +enum Columns { NameColumn, LoadedColumn, VersionColumn, VendorColumn, }; - updateList(); -} +enum IconIndex { OkIcon, ErrorIcon, NotLoadedIcon }; -/*! - \internal -*/ -PluginView::~PluginView() +static const QIcon &icon(int num) { + static QIcon icons[] = { + QIcon(QLatin1String(":/extensionsystem/images/ok.png")), + QIcon(QLatin1String(":/extensionsystem/images/error.png")), + QIcon(QLatin1String(":/extensionsystem/images/notloaded.png")), + }; + return icons[num]; } -/*! - Returns the current selection in the list of plugins. -*/ -PluginSpec *PluginView::currentPlugin() const +class PluginItem : public TreeItem { - if (!m_categoryWidget->currentItem()) - return 0; - if (!m_categoryWidget->currentItem()->data(0, Qt::UserRole).isNull()) - return m_categoryWidget->currentItem()->data(0, Qt::UserRole).value(); - return 0; -} +public: + PluginItem(PluginSpec *spec, PluginView *view) + : m_spec(spec), m_view(view) + {} + + int columnCount() const { return 4; } + + QVariant data(int column, int role) const + { + switch (column) { + case NameColumn: + if (role == Qt::DisplayRole) + return m_spec->name(); + if (role == Qt::ToolTipRole) + return QDir::toNativeSeparators(m_spec->filePath()); + if (role == Qt::DecorationRole) { + bool ok = !m_spec->hasError(); + QIcon i = icon(ok ? OkIcon : ErrorIcon); + if (ok && m_spec->state() != PluginSpec::Running) + i = icon(NotLoadedIcon); + return i; + } + break; + + case LoadedColumn: + if (!m_spec->isAvailableForHostPlatform()) { + if (role == Qt::CheckStateRole) + return Qt::Unchecked; + if (role == Qt::ToolTipRole) + return PluginView::tr("Plugin is not available on this platform."); + } else if (m_spec->isRequired()) { + if (role == Qt::CheckStateRole) + return Qt::Checked; + if (role == Qt::ToolTipRole) + return PluginView::tr("Plugin is required."); + } else { + if (role == Qt::CheckStateRole) + return m_spec->isEnabledInSettings() ? Qt::Checked : Qt::Unchecked; + if (role == Qt::ToolTipRole) + return PluginView::tr("Load on startup"); + } + break; -void PluginView::updateList() -{ - connect(m_categoryWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), - this, SLOT(updatePluginSettings(QTreeWidgetItem*,int))); + case VersionColumn: + if (role == Qt::DisplayRole) + return QString::fromLatin1("%1 (%2)").arg(m_spec->version(), m_spec->compatVersion()); + break; - PluginCollection *defaultCollection = 0; - foreach (PluginCollection *collection, PluginManager::pluginCollections()) { - if (collection->name().isEmpty() || collection->plugins().isEmpty()) { - defaultCollection = collection; - continue; + case VendorColumn: + if (role == Qt::DisplayRole) + return m_spec->vendor(); + break; } - // State, name, load, version, vendor. - QTreeWidgetItem *collectionItem = new QTreeWidgetItem(QStringList() - << collection->name() - << QString() // state - << QString() // load - << QString() // version - << QString()); // vendor - m_items.append(collectionItem); - - Qt::CheckState groupState = Qt::Unchecked; - int state = parsePluginSpecs(collectionItem, groupState, collection->plugins()); - - collectionItem->setIcon(0, iconForState(state)); - collectionItem->setData(C_LOAD, Qt::CheckStateRole, QVariant(groupState)); - collectionItem->setToolTip(C_LOAD, tr("Load on Startup")); - collectionItem->setData(0, Qt::UserRole, qVariantFromValue(collection)); - } - QList plugins = defaultCollection ? defaultCollection->plugins() : QList(); - if (!plugins.isEmpty()) { - // add all non-categorized plugins into utilities. could also be added as root items - // but that makes the tree ugly. - QTreeWidgetItem *defaultCollectionItem = new QTreeWidgetItem(QStringList() - << QString(tr("Utilities")) - << QString() - << QString() - << QString() - << QString()); - - m_items.append(defaultCollectionItem); - Qt::CheckState groupState = Qt::Unchecked; - int state = parsePluginSpecs(defaultCollectionItem, groupState, plugins); - - defaultCollectionItem->setIcon(0, iconForState(state)); - defaultCollectionItem->setData(C_LOAD, Qt::CheckStateRole, QVariant(groupState)); - defaultCollectionItem->setToolTip(C_LOAD, tr("Load on Startup")); - defaultCollectionItem->setData(0, Qt::UserRole, qVariantFromValue(defaultCollection)); + return QVariant(); } - updatePluginDependencies(); + bool setData(int column, const QVariant &data, int role) + { + if (column == LoadedColumn && role == Qt::CheckStateRole) { + m_spec->setEnabled(data.toBool()); + update(); + parent()->update(); + emit m_view->pluginSettingsChanged(m_spec); + return true; + } + return false; + } - m_categoryWidget->clear(); - if (!m_items.isEmpty()) { - m_categoryWidget->addTopLevelItems(m_items); - m_categoryWidget->expandAll(); + bool isEnabled() const + { + if (m_spec->isRequired() || !m_spec->isAvailableForHostPlatform()) + return false; + foreach (PluginSpec *spec, m_view->m_pluginDependencies.value(m_spec)) + if (!spec->isEnabledInSettings()) + return false; + return true; } - m_categoryWidget->sortItems(0, Qt::AscendingOrder); - if (m_categoryWidget->topLevelItemCount()) - m_categoryWidget->setCurrentItem(m_categoryWidget->topLevelItem(0)); -} + Qt::ItemFlags flags(int column) const + { + Qt::ItemFlags ret = Qt::ItemIsSelectable; -int PluginView::parsePluginSpecs(QTreeWidgetItem *parentItem, Qt::CheckState &groupState, QList plugins) -{ - int ret = 0; - int checkedCount = 0; - - for (int i = 0; i < plugins.length(); ++i) { - PluginSpec *spec = plugins[i]; - if (spec->hasError()) - ret |= ParsedWithErrors; - - QTreeWidgetItem *pluginItem = new QTreeWidgetItem(QStringList() - << spec->name() - << QString() // load on startup - << QString::fromLatin1("%1 (%2)").arg(spec->version(), spec->compatVersion()) - << spec->vendor()); - - pluginItem->setToolTip(0, QDir::toNativeSeparators(spec->filePath())); - bool ok = !spec->hasError(); - QIcon icon = ok ? m_okIcon : m_errorIcon; - if (ok && (spec->state() != PluginSpec::Running)) - icon = m_notLoadedIcon; - - pluginItem->setIcon(0, icon); - pluginItem->setData(0, Qt::UserRole, qVariantFromValue(spec)); - - Qt::CheckState state = Qt::Unchecked; - if (spec->isEnabledInSettings()) { - state = Qt::Checked; - ++checkedCount; - } + if (isEnabled()) + ret |= Qt::ItemIsEnabled; - if (!spec->isAvailableForHostPlatform()) { - pluginItem->setData(C_LOAD, Qt::CheckStateRole, Qt::Unchecked); - pluginItem->setFlags(Qt::ItemIsSelectable); - pluginItem->setToolTip(C_LOAD, tr("Plugin is not available on this platform.")); - } else if (spec->isRequired()){ - pluginItem->setData(C_LOAD, Qt::CheckStateRole, Qt::Checked); - pluginItem->setFlags(Qt::ItemIsSelectable); - pluginItem->setToolTip(C_LOAD, tr("Plugin is required.")); - } else { - pluginItem->setData(C_LOAD, Qt::CheckStateRole, state); - pluginItem->setToolTip(C_LOAD, tr("Load on startup")); + if (column == LoadedColumn) { + if (m_spec->isAvailableForHostPlatform() && !m_spec->isRequired()) + ret |= Qt::ItemIsEditable | Qt ::ItemIsUserCheckable; } - m_specToItem.insert(spec, pluginItem); - - if (parentItem) - parentItem->addChild(pluginItem); - else - m_items.append(pluginItem); + return ret; } - if (checkedCount == 0) { - groupState = Qt::Unchecked; - ret |= ParsedNone; - } else if (checkedCount == plugins.length()) { - groupState = Qt::Checked; - ret |= ParsedAll; - } else { - groupState = Qt::PartiallyChecked; - ret = ret | ParsedPartial; - } - return ret; -} +public: + PluginSpec *m_spec; // Not owned. + PluginView *m_view; // Not owned. +}; -QIcon PluginView::iconForState(int state) +class CollectionItem : public TreeItem { - if (state & ParsedWithErrors) - return m_errorIcon; +public: + CollectionItem(const QString &name, QList plugins, PluginView *view) + : m_name(name), m_plugins(plugins), m_view(view) + { + foreach (PluginSpec *spec, plugins) + appendChild(new PluginItem(spec, view)); + } - if (state & ParsedNone || state & ParsedPartial) - return m_notLoadedIcon; + int columnCount() const { return 4; } + + QVariant data(int column, int role) const + { + if (column == NameColumn) { + if (role == Qt::DisplayRole) + return m_name; + if (role == Qt::DecorationRole) { + foreach (PluginSpec *spec, m_plugins) { + if (spec->hasError()) + return icon(ErrorIcon); + if (!spec->isEnabledInSettings()) + return icon(NotLoadedIcon); + } + return icon(OkIcon); + } + } - return m_okIcon; -} + if (column == LoadedColumn) { + if (role == Qt::ToolTipRole) + return PluginView::tr("Load on Startup"); + if (role == Qt::CheckStateRole) { + int checkedCount = 0; + foreach (PluginSpec *spec, m_plugins) { + if (spec->isEnabledInSettings()) + ++checkedCount; + } -void PluginView::selectPlugin(QTreeWidgetItem *current) -{ - if (!current) - emit currentPluginChanged(0); - else if (current->data(0, Qt::UserRole).canConvert()) - emit currentPluginChanged(current->data(0, Qt::UserRole).value()); - else - emit currentPluginChanged(0); + if (checkedCount == 0) + return Qt::Unchecked; + if (checkedCount == m_plugins.length()) + return Qt::Checked; + return Qt::PartiallyChecked; + } + } -} + return QVariant(); + } -void PluginView::activatePlugin(QTreeWidgetItem *item) -{ - if (item->data(0, Qt::UserRole).canConvert()) { - emit pluginActivated(item->data(0, Qt::UserRole).value()); - } else - emit pluginActivated(0); -} + bool setData(int column, const QVariant &data, int role) + { + if (column == LoadedColumn && role == Qt::CheckStateRole) { + foreach (TreeItem *item, children()) + static_cast(item)->setData(column, data, role); + update(); + return true; + } + return false; + } + + Qt::ItemFlags flags(int column) const + { + Qt::ItemFlags ret = Qt::ItemIsSelectable | Qt::ItemIsEnabled; + if (column == LoadedColumn) + ret |= Qt::ItemIsEditable | Qt::ItemIsUserCheckable; + return ret; + } + +public: + QString m_name; + QList m_plugins; + PluginView *m_view; // Not owned. +}; -void PluginView::updatePluginSettings(QTreeWidgetItem *item, int column) +/*! + Constructs a PluginView that gets the list of plugins from the + given plugin \a manager with a given \a parent widget. +*/ +PluginView::PluginView(QWidget *parent) + : QWidget(parent) { - if (!m_allowCheckStateUpdate) - return; + m_categoryView = new TreeView(this); + m_categoryView->setAlternatingRowColors(true); + m_categoryView->setIndentation(20); + m_categoryView->setUniformRowHeights(true); + m_categoryView->setSortingEnabled(true); + m_categoryView->setColumnWidth(LoadedColumn, 40); + m_categoryView->header()->setDefaultSectionSize(120); + m_categoryView->header()->setMinimumSectionSize(35); + m_categoryView->setActivationMode(Utils::DoubleClickActivation); + m_categoryView->setSelectionMode(QAbstractItemView::SingleSelection); + m_categoryView->setSelectionBehavior(QAbstractItemView::SelectRows); + + m_model = new TreeModel(this); + m_model->setRootItem(new TreeItem(QStringList() + << tr("Name") << tr("Load") << tr("Version") << tr("Vendor"))); + m_categoryView->setModel(m_model); - m_allowCheckStateUpdate = false; + QGridLayout *gridLayout = new QGridLayout(this); + gridLayout->setContentsMargins(2, 2, 2, 2); + gridLayout->addWidget(m_categoryView, 1, 0, 1, 1); - bool loadOnStartup = item->data(C_LOAD, Qt::CheckStateRole).toBool(); + QHeaderView *header = m_categoryView->header(); + header->setSectionResizeMode(0, QHeaderView::ResizeToContents); + header->setSectionResizeMode(2, QHeaderView::ResizeToContents); - if (item->data(0, Qt::UserRole).canConvert()) { - PluginSpec *spec = item->data(0, Qt::UserRole).value(); + connect(PluginManager::instance(), &PluginManager::pluginsChanged, + this, &PluginView::updatePlugins); - if (column == C_LOAD) { + connect(m_categoryView, &QAbstractItemView::activated, + [this](const QModelIndex &idx) { pluginActivated(pluginForIndex(idx)); }); - spec->setEnabled(loadOnStartup); - updatePluginDependencies(); + connect(m_categoryView->selectionModel(), &QItemSelectionModel::currentChanged, + [this](const QModelIndex &idx) { currentPluginChanged(pluginForIndex(idx)); }); - if (item->parent()) { - PluginCollection *collection = item->parent()->data(0, Qt::UserRole).value(); - Qt::CheckState state = Qt::PartiallyChecked; - int loadCount = 0; - for (int i = 0; i < collection->plugins().length(); ++i) { - if (collection->plugins().at(i)->isEnabledInSettings()) - ++loadCount; - } - if (loadCount == collection->plugins().length()) - state = Qt::Checked; - else if (loadCount == 0) - state = Qt::Unchecked; + updatePlugins(); +} - item->parent()->setData(C_LOAD, Qt::CheckStateRole, state); - } +/*! + \internal +*/ +PluginView::~PluginView() +{ +} - emit pluginSettingsChanged(spec); - } +/*! + Returns the current selection in the list of plugins. +*/ +PluginSpec *PluginView::currentPlugin() const +{ + return pluginForIndex(m_categoryView->currentIndex()); +} - } else { - PluginCollection *collection = item->data(0, Qt::UserRole).value(); - for (int i = 0; i < collection->plugins().length(); ++i) { - PluginSpec *spec = collection->plugins().at(i); - QTreeWidgetItem *child = m_specToItem.value(spec); +PluginSpec *PluginView::pluginForIndex(const QModelIndex &index) const +{ + auto item = dynamic_cast(m_model->itemFromIndex(index)); + return item ? item->m_spec: 0; +} - if (spec->isAvailableForHostPlatform() && !spec->isRequired()) { - spec->setEnabled(loadOnStartup); - Qt::CheckState state = (loadOnStartup ? Qt::Checked : Qt::Unchecked); - child->setData(C_LOAD, Qt::CheckStateRole, state); - } +static void queryDependendPlugins(PluginSpec *spec, QSet *dependencies) +{ + QHashIterator it(spec->dependencySpecs()); + while (it.hasNext()) { + it.next(); + PluginSpec *dep = it.value(); + if (!dependencies->contains(dep)) { + dependencies->insert(dep); + queryDependendPlugins(dep, dependencies); } - updatePluginDependencies(); - if (!collection->plugins().isEmpty()) - emit pluginSettingsChanged(collection->plugins().first()); } - - m_allowCheckStateUpdate = true; } -void PluginView::updatePluginDependencies() +void PluginView::updatePlugins() { + // Dependencies. + m_pluginDependencies.clear(); foreach (PluginSpec *spec, PluginManager::loadQueue()) { - bool disableIndirectly = false; - if (spec->isRequired()) - continue; + QSet deps; + queryDependendPlugins(spec, &deps); + m_pluginDependencies[spec] = deps; + } - QHashIterator it(spec->dependencySpecs()); - while (it.hasNext()) { - it.next(); - if (it.key().type == PluginDependency::Optional) - continue; - PluginSpec *depSpec = it.value(); - if (!depSpec->isEnabledInSettings() || depSpec->isDisabledIndirectly()) { - disableIndirectly = true; - break; - } - } - QTreeWidgetItem *childItem = m_specToItem.value(spec); - childItem->setDisabled(disableIndirectly || !spec->isAvailableForHostPlatform()); + // Model. + m_model->removeItems(); - if (disableIndirectly == spec->isDisabledIndirectly()) + PluginCollection *defaultCollection = 0; + QList collections; + foreach (PluginCollection *collection, PluginManager::pluginCollections()) { + if (collection->name().isEmpty() || collection->plugins().isEmpty()) { + defaultCollection = collection; continue; - spec->setDisabledIndirectly(disableIndirectly); + } + collections.append(new CollectionItem(collection->name(), collection->plugins(), this)); + } + + QList plugins; + if (defaultCollection) + plugins = defaultCollection->plugins(); - if (childItem->parent() && !childItem->parent()->isExpanded()) - childItem->parent()->setExpanded(true); + if (!plugins.isEmpty()) { + // add all non-categorized plugins into utilities. could also be added as root items + // but that makes the tree ugly. + collections.append(new CollectionItem(tr("Utilities"), plugins, this)); } + + Utils::sort(collections, [](CollectionItem *a, CollectionItem *b) -> bool + { return a->m_name < b->m_name; }); + + foreach (CollectionItem *collection, collections) + m_model->rootItem()->appendChild(collection); + + m_model->layoutChanged(); + m_categoryView->expandAll(); } + +} // namespace ExtensionSystem diff --git a/src/libs/extensionsystem/pluginview.h b/src/libs/extensionsystem/pluginview.h index 32ec6e3104f82d7b0be336d57390540d2cbfccfa..957f7eeb3465c289798685ca1fcbb65eb625cf52 100644 --- a/src/libs/extensionsystem/pluginview.h +++ b/src/libs/extensionsystem/pluginview.h @@ -33,21 +33,22 @@ #include "extensionsystem_global.h" -#include #include -#include - -QT_BEGIN_NAMESPACE -class QTreeWidgetItem; -QT_END_NAMESPACE +#include +#include -namespace Utils { class TreeWidget; } +namespace Utils { +class TreeItem; +class TreeModel; +class TreeView; +} // namespace Utils namespace ExtensionSystem { class PluginManager; class PluginSpec; -class PluginCollection; +class PluginItem; +class CollectionItem; class EXTENSIONSYSTEM_EXPORT PluginView : public QWidget { @@ -64,28 +65,16 @@ signals: void pluginActivated(ExtensionSystem::PluginSpec *spec); void pluginSettingsChanged(ExtensionSystem::PluginSpec *spec); -private slots: - void updatePluginSettings(QTreeWidgetItem *item, int column); - void updateList(); - void selectPlugin(QTreeWidgetItem *current); - void activatePlugin(QTreeWidgetItem *item); - private: - enum ParsedState { ParsedNone = 1, ParsedPartial = 2, ParsedAll = 4, ParsedWithErrors = 8}; - QIcon iconForState(int state); - void updatePluginDependencies(); - int parsePluginSpecs(QTreeWidgetItem *parentItem, Qt::CheckState &groupState, QList plugins); - - Utils::TreeWidget *m_categoryWidget; - QList m_items; - QHash m_specToItem; + PluginSpec *pluginForIndex(const QModelIndex &index) const; + void updatePlugins(); - QIcon m_okIcon; - QIcon m_errorIcon; - QIcon m_notLoadedIcon; - bool m_allowCheckStateUpdate; + Utils::TreeView *m_categoryView; + Utils::TreeModel *m_model; - const int C_LOAD; + friend class CollectionItem; + friend class PluginItem; + QHash> m_pluginDependencies; }; } // namespae ExtensionSystem