diff --git a/src/plugins/projectexplorer/kitaspects.cpp b/src/plugins/projectexplorer/kitaspects.cpp index 0ca1a348281..7f0deaf75a0 100644 --- a/src/plugins/projectexplorer/kitaspects.cpp +++ b/src/plugins/projectexplorer/kitaspects.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,8 @@ #include #include +#include + using namespace Utils; namespace ProjectExplorer { @@ -197,47 +200,36 @@ class DeviceTypeKitAspectImpl final : public KitAspect { public: DeviceTypeKitAspectImpl(Kit *workingCopy, const KitAspectFactory *factory) - : KitAspect(workingCopy, factory), m_comboBox(createSubWidget()) + : KitAspect(workingCopy, factory) { - for (IDeviceFactory *factory : IDeviceFactory::allDeviceFactories()) - m_comboBox->addItem(factory->displayName(), factory->deviceType().toSetting()); - m_comboBox->setToolTip(factory->description()); - refresh(); - connect(m_comboBox, &QComboBox::currentIndexChanged, - this, &DeviceTypeKitAspectImpl::currentTypeChanged); + using ItemData = std::pair; + const auto model = new ListModel(this); + model->setDataAccessor([](const ItemData &d, int column, int role) -> QVariant { + if (column != 0) + return {}; + if (role == Qt::DisplayRole) + return d.first; + if (role == Qt::UserRole) + return d.second.toSetting(); + return {}; + }); + const auto sortModel = new SortModel(this); + sortModel->setSourceModel(model); + auto getter = [](const Kit &k) { return DeviceTypeKitAspect::deviceTypeId(&k).toSetting(); }; + auto setter = [](Kit &k, const QVariant &type) { + DeviceTypeKitAspect::setDeviceTypeId(&k, Id::fromSetting(type)); + }; + auto resetModel = [](QAbstractItemModel &m) { + // FIXME: Change to parameter-less signature. + auto model = static_cast *>( + static_cast(m).sourceModel()); + model->clear(); + for (IDeviceFactory *factory : IDeviceFactory::allDeviceFactories()) + model->appendItem(std::make_pair(factory->displayName(), factory->deviceType())); + }; + setListAspectSpec( + {sortModel, std::move(getter), std::move(setter), std::move(resetModel), Qt::UserRole}); } - - ~DeviceTypeKitAspectImpl() override { delete m_comboBox; } - -private: - void addToInnerLayout(Layouting::Layout &builder) override - { - addMutableAction(m_comboBox); - builder.addItem(m_comboBox); - } - - void makeReadOnly() override { m_comboBox->setEnabled(false); } - - void refresh() override - { - Id devType = DeviceTypeKitAspect::deviceTypeId(kit()); - if (!devType.isValid()) - m_comboBox->setCurrentIndex(-1); - for (int i = 0; i < m_comboBox->count(); ++i) { - if (m_comboBox->itemData(i) == devType.toSetting()) { - m_comboBox->setCurrentIndex(i); - break; - } - } - } - - void currentTypeChanged(int idx) - { - Id type = idx < 0 ? Id() : Id::fromSetting(m_comboBox->itemData(idx)); - DeviceTypeKitAspect::setDeviceTypeId(kit(), type); - } - - QComboBox *m_comboBox; }; } // namespace Internal