summaryrefslogtreecommitdiff
path: root/src/directoryrefresher.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/directoryrefresher.h')
-rw-r--r--src/directoryrefresher.h124
1 files changed, 95 insertions, 29 deletions
diff --git a/src/directoryrefresher.h b/src/directoryrefresher.h
index a4fc5dbc..bd08dad6 100644
--- a/src/directoryrefresher.h
+++ b/src/directoryrefresher.h
@@ -20,15 +20,14 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#ifndef DIRECTORYREFRESHER_H
#define DIRECTORYREFRESHER_H
-#include <directoryentry.h>
+#include "fileregisterfwd.h"
+#include "profile.h"
#include <QObject>
#include <QMutex>
#include <QStringList>
#include <vector>
#include <set>
#include <tuple>
-#include "profile.h"
-
/**
* @brief used to asynchronously generate the virtual view of the combined data directory
@@ -39,24 +38,37 @@ class DirectoryRefresher : public QObject
Q_OBJECT
public:
+ struct EntryInfo
+ {
+ EntryInfo(const QString &modName, const QString &absolutePath,
+ const QStringList &stealFiles, const QStringList &archives, int priority)
+ : modName(modName), absolutePath(absolutePath), stealFiles(stealFiles)
+ , archives(archives), priority(priority)
+ {
+ }
- /**
- * @brief constructor
- *
- **/
- DirectoryRefresher();
+ QString modName;
+ QString absolutePath;
+ QStringList stealFiles;
+ QStringList archives;
+ int priority;
+ };
+
+ DirectoryRefresher(std::size_t threadCount);
- ~DirectoryRefresher();
+ // noncopyable
+ DirectoryRefresher(const DirectoryRefresher&) = delete;
+ DirectoryRefresher& operator=(const DirectoryRefresher&) = delete;
/**
* @brief retrieve the updated directory structure
*
* returns a pointer to the updated directory structure. DirectoryRefresher
* deletes its own pointer and the caller takes custody of the pointer
- *
+ *
* @return updated directory structure
**/
- MOShared::DirectoryEntry *getDirectoryStructure();
+ MOShared::DirectoryEntry* stealDirectoryStructure();
/**
* @brief sets up the mods to be included in the directory structure
@@ -107,7 +119,16 @@ public:
* @param directory
* @param stealFiles
*/
- void addModFilesToStructure(MOShared::DirectoryEntry *directoryStructure, const QString &modName, int priority, const QString &directory, const QStringList &stealFiles);
+ void addModFilesToStructure(
+ MOShared::DirectoryEntry *directoryStructure, const QString &modName,
+ int priority, const QString &directory, const QStringList &stealFiles);
+
+ void addMultipleModsFilesToStructure(
+ MOShared::DirectoryEntry *directoryStructure,
+ const std::vector<EntryInfo>& entries,
+ DirectoryRefreshProgress* progress=nullptr);
+
+ void updateProgress(const DirectoryRefreshProgress* p);
public slots:
@@ -118,31 +139,76 @@ public slots:
signals:
- void progress(int progress);
+ void progress(const DirectoryRefreshProgress* p);
void error(const QString &error);
void refreshed();
private:
-
- struct EntryInfo {
- EntryInfo(const QString &modName, const QString &absolutePath,
- const QStringList &stealFiles, const QStringList &archives, int priority)
- : modName(modName), absolutePath(absolutePath), stealFiles(stealFiles)
- , archives(archives), priority(priority) {}
- QString modName;
- QString absolutePath;
- QStringList stealFiles;
- QStringList archives;
- int priority;
- };
-
-private:
-
std::vector<EntryInfo> m_Mods;
std::set<QString> m_EnabledArchives;
- MOShared::DirectoryEntry *m_DirectoryStructure;
+ std::unique_ptr<MOShared::DirectoryEntry> m_Root;
QMutex m_RefreshLock;
+ std::size_t m_threadCount;
+ std::size_t m_lastFileCount;
+ void stealModFilesIntoStructure(
+ MOShared::DirectoryEntry *directoryStructure, const QString &modName,
+ int priority, const QString &directory, const QStringList &stealFiles);
+};
+
+
+class DirectoryRefreshProgress : QObject
+{
+ Q_OBJECT;
+
+public:
+ DirectoryRefreshProgress(DirectoryRefresher* r) :
+ QObject(r), m_refresher(r), m_modCount(0), m_modDone(0), m_finished(false)
+ {
+ }
+
+ void start(std::size_t modCount)
+ {
+ m_modCount = modCount;
+ m_modDone = 0;
+ m_finished = false;
+ }
+
+
+ bool finished() const
+ {
+ return m_finished;
+ }
+
+ int percentDone() const
+ {
+ int percent = 100;
+
+ if (m_modCount > 0) {
+ const double d = static_cast<double>(m_modDone) / m_modCount;
+ percent = static_cast<int>(d * 100);
+ }
+
+ return percent;
+ }
+
+
+ void finish()
+ {
+ m_finished = true;
+ }
+
+ void addDone()
+ {
+ ++m_modDone;
+ m_refresher->updateProgress(this);
+ }
+
+private:
+ DirectoryRefresher* m_refresher;
+ std::size_t m_modCount;
+ std::atomic<std::size_t> m_modDone;
+ bool m_finished;
};
#endif // DIRECTORYREFRESHER_H