Browse Source

Fixes #14 Listen for directory updates

isundil 9 months ago
parent
commit
337b417f63
2 changed files with 20 additions and 5 deletions
  1. 16 4
      fakeRaid/mainWindow.cpp
  2. 4 1
      fakeRaid/mainWindow.h

+ 16 - 4
fakeRaid/mainWindow.cpp

@@ -13,7 +13,8 @@ using namespace craftlab::fakeraid::ui;
 
 MainWindow::MainWindow(const std::vector<std::string>& dirList)
 	: fileListItemModel(std::make_unique<QStandardItemModel>(this)),
-	ui(std::make_unique<Ui_MainWindow>())
+	ui(std::make_unique<Ui_MainWindow>()),
+	fileWatcher(new QFileSystemWatcher())
 {
 	window = std::make_unique<QMainWindow>();
 
@@ -39,6 +40,7 @@ MainWindow::MainWindow(const std::vector<std::string>& dirList)
 
 MainWindow::~MainWindow()
 {
+	fileWatcher->deleteLater();
 }
 
 void MainWindow::FileListItemEntered(const QModelIndex& index)
@@ -122,15 +124,14 @@ void MainWindow::UpdateFileList()
 	std::sort(allFilenames.begin(), allFilenames.end());
 	for (const std::string& file : allFilenames)
 		fileListItemModel->appendRow(new FileItem(*ui->listView, engine->GetRootPaths(), currentDiffResult->FileList[file], false));
-	UpdateBreadcrumb();
 }
 
-void MainWindow::ListFiles()
+void MainWindow::ListFiles(bool ignoreAll)
 {
 	if (!engine)
 		return;
 	currentDiffResult = std::make_unique<DiffResult>(FileDiff().Process(engine->ListFiles()));
-	if (!currentDiffResult->differentFiles.empty() || !currentDiffResult->missingDirs.empty() || !currentDiffResult->missingFiles.empty())
+	if (!ignoreAll && (!currentDiffResult->differentFiles.empty() || !currentDiffResult->missingDirs.empty() || !currentDiffResult->missingFiles.empty()))
 		currentDiffResult = std::make_unique<DiffResult>(ConflictModal::Display(*engine, *currentDiffResult));
 	std::sort(currentDiffResult->correctFiles.begin(), currentDiffResult->correctFiles.end(), [](const File& a, const File& b) { return a.fileName < b.fileName; });
 
@@ -203,10 +204,21 @@ void MainWindow::OnListViewDoubleClick(const FileAndSum& file)
 	}
 }
 
+void MainWindow::OnFileWatcherTrigger(const QString& path)
+{
+	ListFiles(true);
+}
+
 void MainWindow::OnEngineUpdated()
 {
 	window->setEnabled(false);
+	fileWatcher->deleteLater();
+	fileWatcher = new QFileSystemWatcher();
+	fileWatcher->connect(fileWatcher, &QFileSystemWatcher::directoryChanged, this, &MainWindow::OnFileWatcherTrigger);
+	for (const std::string& path: engine->GetPaths())
+		fileWatcher->addPath(path.c_str());
 	ListFiles();
+	UpdateBreadcrumb();
 	window->setEnabled(true);
 }
 

+ 4 - 1
fakeRaid/mainWindow.h

@@ -1,6 +1,7 @@
 #pragma once
 
 #include <QStandardItemModel>
+#include <QFileSystemWatcher>
 #include <QStandardItem>
 #include <QMainWindow>
 #include <QObject>
@@ -31,11 +32,12 @@ namespace craftlab::fakeraid::ui
 		void OnBreadcrumbSelection(int index);
 		void FileListItemEntered(const QModelIndex& index);
 		void OpenContainingFolders(const QModelIndex& index);
+		void OnFileWatcherTrigger(const QString& path);
 
 	private:
 		bool PathExists(const IEngine& engine) const;
 		void OnEngineUpdated();
-		void ListFiles();
+		void ListFiles(bool ignoreAll =false);
 		void OnListViewDoubleClick(const FileAndSum& filename);
 		void OpenContainingFolders(const File& filename);
 		void FileEdit(const File& f);
@@ -49,5 +51,6 @@ namespace craftlab::fakeraid::ui
 		std::unique_ptr<IEngine> engine;
 		std::unique_ptr<DiffResult> currentDiffResult;
 		std::unique_ptr<Ui_MainWindow> ui;
+		QFileSystemWatcher* fileWatcher;
 	};
 }