Pith - whittle
#pragma once
#include "core/Comparator.h"
#include "core/FilterSettings.h"
#include "model/FileRecord.h"
#include <atomic>
#include <QHash>
#include <QMetaType>
#include <QSet>
#include <QStringList>
#include <QThread>

namespace whittle {

	using FileMap = QHash<QString, FileRecord>;

	class ScanController : public QThread {
		Q_OBJECT
	public:
		ScanController(QStringList sourceRoots, QSet<QString> excluded,
			bool recursive,
			QString usbMount, FilterSettings filter,
			QObject* parent = nullptr);
		void cancel() { m_cancel.store(true, std::memory_order_relaxed); }

		signals:
		void progress(int folders, int files, qint64 bytes);
		void resultsReady(whittle::DiffResult result,
			whittle::FileMap sourceMap, whittle::FileMap usbMap);
		void canceled();

	protected:
		void run() override;

	private:
		QStringList m_roots;
		QSet<QString> m_excluded;
		bool        m_recursive;
		QString     m_usb;
		FilterSettings m_filter;
		std::atomic<bool> m_cancel{false};
	};

} 

Q_DECLARE_METATYPE(whittle::FileMap)
Q_DECLARE_METATYPE(whittle::DiffResult)