#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;
};
}