summaryrefslogtreecommitdiffstats
path: root/logic/resources/ResourceProxyModel.h
blob: 9db09545a8adee397286a41b89d6bfe8fdb0b151 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#pragma once

#include <QIdentityProxyModel>
#include <memory>

/// Convenience proxy model that transforms resource identifiers (strings) for Qt::DecorationRole into other types.
class ResourceProxyModel : public QIdentityProxyModel
{
	Q_OBJECT
public:
	// resultTypeId is found using qMetaTypeId<T>()
	explicit ResourceProxyModel(const int resultTypeId, QObject *parent = nullptr);

	enum
	{
		// provide this role from your model if you want to show a placeholder
		PlaceholderRole = Qt::UserRole + 0xabc // some random offset to not collide with other stuff
	};

	QVariant data(const QModelIndex &proxyIndex, int role) const override;
	void setSourceModel(QAbstractItemModel *model) override;

	template <typename T>
	static QAbstractItemModel *mixin(QAbstractItemModel *model)
	{
		ResourceProxyModel *proxy = new ResourceProxyModel(qMetaTypeId<T>(), model);
		proxy->setSourceModel(model);
		return proxy;
	}

private:
	// mutable because it needs to be available from the const data()
	mutable QMap<QPersistentModelIndex, std::shared_ptr<class Resource>> m_resources;

	const int m_resultTypeId;
};