Pith - whittle
#pragma once
#include <QFileSystemModel>
#include <QSet>
#include <QString>
#include <QStringList>

namespace whittle {

	class FolderTreeModel : public QFileSystemModel {
		Q_OBJECT
	public:
		explicit FolderTreeModel(QObject* parent = nullptr);

		void setRecursive(bool on);
		bool recursive() const { return m_recursive; }
		QStringList scanRoots() const { return QStringList(m_checked.values()); }
		QStringList excludedPaths() const { return QStringList(m_excluded.values()); }
		void setCheckedRoots(const QStringList& roots,
			const QStringList& excluded = {});
		void clearChecks();

		Qt::ItemFlags flags(const QModelIndex&) const override;
		QVariant data(const QModelIndex&, int role) const override;
		bool setData(const QModelIndex&, const QVariant&, int role) override;

		signals:
		void selectionChanged();

	private:
		Qt::CheckState stateFor(const QString& path) const;
		bool effectivelyChecked(const QString& path) const;
		void check(const QString& path);
		void uncheck(const QString& path);
		void emitSubtree(const QModelIndex&);
		void emitAncestors(const QModelIndex&);

		QSet<QString> m_checked;
		QSet<QString> m_excluded;
		bool m_recursive = true;
	};

}