summaryrefslogtreecommitdiffstats
path: root/logic/resources/ResourceProxyModel.h
blob: 98a3dbd169f441b860b54df07397024ad4c7e6f8 (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
37
38
39
#pragma once

#include <QIdentityProxyModel>
#include <memory>

#include "multimc_logic_export.h"

/// Convenience proxy model that transforms resource identifiers (strings) for Qt::DecorationRole into other types.
class MULTIMC_LOGIC_EXPORT 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;

	/// Helper function, usage: m_view->setModel(ResourceProxyModel::mixin<QIcon>(m_model));
	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;
};