#include #include #include namespace { /// Index of the 'name' value in the item const auto NAME_INDEX = 0; } // namespace struct DataSourceItem::DataSourceItemPrivate { explicit DataSourceItemPrivate(DataSourceItemType type, QVector data) : m_Parent{nullptr}, m_Children{}, m_Type{type}, m_Data{std::move(data)}, m_Actions{} { } DataSourceItem *m_Parent; std::vector > m_Children; DataSourceItemType m_Type; QVector m_Data; std::vector > m_Actions; }; DataSourceItem::DataSourceItem(DataSourceItemType type, QVector data) : impl{spimpl::make_unique_impl(type, std::move(data))} { } QVector DataSourceItem::actions() const noexcept { QVector result{}; std::transform(std::cbegin(impl->m_Actions), std::cend(impl->m_Actions), std::back_inserter(result), [](const auto &action) { return action.get(); }); return result; } void DataSourceItem::addAction(std::unique_ptr action) noexcept { action->setDataSourceItem(this); impl->m_Actions.push_back(std::move(action)); } void DataSourceItem::appendChild(std::unique_ptr child) noexcept { child->impl->m_Parent = this; impl->m_Children.push_back(std::move(child)); } DataSourceItem *DataSourceItem::child(int childIndex) const noexcept { if (childIndex < 0 || childIndex >= childCount()) { return nullptr; } else { return impl->m_Children.at(childIndex).get(); } } int DataSourceItem::childCount() const noexcept { return impl->m_Children.size(); } QVariant DataSourceItem::data(int dataIndex) const noexcept { return impl->m_Data.value(dataIndex); } QString DataSourceItem::name() const noexcept { return data(NAME_INDEX).toString(); } DataSourceItem *DataSourceItem::parentItem() const noexcept { return impl->m_Parent; } DataSourceItemType DataSourceItem::type() const noexcept { return impl->m_Type; }