1
0
Эх сурвалжийг харах

Fixes #6 Breadcrumb connection

isundil 9 сар өмнө
parent
commit
f2b6206713

+ 26 - 0
Engine/Engine.cpp

@@ -17,6 +17,7 @@ namespace craftlab::fakeraid
 		std::vector<std::string> GetRootPaths() const override;
 		std::vector<std::string> GetPaths() const override;
 		std::deque<std::string> GetCurrentDir() const override;
+		bool SetWorkingDirectory(const std::vector<std::string>& path) override;
 		FileAndSumListByRepositoryIndex ListFiles() override;
 		void Cd(const std::string& dirName) override;
 
@@ -66,6 +67,31 @@ std::string Engine::BuildCurrentDirPath(const std::string& root) const
 	return ss.str();
 }
 
+bool vectorEquals(const std::vector<std::string>& a, const std::deque<std::string>& b)
+{
+	if (a.size() != b.size())
+		return false;
+	auto iterA = a.begin();
+	auto iterB = b.begin();
+	while (iterA != a.end())
+	{
+		if (*iterA != *iterB)
+			return false;
+		++iterA;
+		++iterB;
+	}
+	return true;
+}
+
+bool Engine::SetWorkingDirectory(const std::vector<std::string>& path)
+{
+	if (vectorEquals(path, currentDir))
+		return false;
+	currentDir.clear();
+	std::copy(path.begin(), path.end(), std::back_inserter(currentDir));
+	return true;
+}
+
 void Engine::Cd(const std::string& dirName)
 {
 	currentDir.push_back(dirName);

+ 1 - 0
Engine/IEngine.h

@@ -15,6 +15,7 @@ namespace craftlab::fakeraid
 		virtual std::vector<std::string> GetRootPaths() const = 0;
 		virtual std::vector<std::string> GetPaths() const = 0;
 		virtual std::deque<std::string> GetCurrentDir() const =0;
+		virtual bool SetWorkingDirectory(const std::vector<std::string>& path) =0;
 		virtual FileAndSumListByRepositoryIndex ListFiles() =0;
 		virtual void Cd(const std::string& dirName) =0;
 	};

+ 1 - 1
QtWidgets

@@ -1 +1 @@
-Subproject commit 9200d932e7d6718049086f87c378ee157c750518
+Subproject commit 3b84226f07119dc86795be18729eebf960ba7b66

+ 20 - 2
fakeRaid/mainWindow.cpp

@@ -29,6 +29,7 @@ MainWindow::MainWindow(const std::vector<std::string>& dirList)
 				OnListViewDoubleClick(fileIter->second);
 		}
 	});
+	connect(ui->breadcrumb, &craftlab::ui::Breadcrumb::SelectionChanged, this, &MainWindow::OnBreadcrumbSelection);
 	window->show();
 
 	if (dirList.empty() || !TryOpenningDir(dirList))
@@ -53,10 +54,25 @@ bool MainWindow::PathExists(const IEngine& engine) const
 	return true;
 }
 
+void MainWindow::OnBreadcrumbSelection(int index)
+{
+	std::vector<std::string> path;
+	const std::deque<std::string> currenPath = engine->GetCurrentDir();
+
+	window->setEnabled(false);
+	for (int i = 1; i <= index; ++i)
+		path.push_back(currenPath[i -1]);
+	if (engine->SetWorkingDirectory(path))
+		OnEngineUpdated();
+}
+
 void MainWindow::UpdateBreadcrumb()
 {
 	craftlab::ui::Breadcrumb* breadcrumb = ui->breadcrumb;
 	breadcrumb->clear();
+	breadcrumb->addItem("/");
+	for (const std::string& path : engine->GetCurrentDir())
+		breadcrumb->addItem(path.c_str());
 }
 
 void MainWindow::UpdateFileList()
@@ -91,7 +107,7 @@ void MainWindow::FileEdit(const File& file)
 	// FIXME
 }
 
-bool MainWindow::IsFileCorrent(const File& file) const
+bool MainWindow::IsFileCorrect(const File& file) const
 {
 	return std::find_if(
 		currentDiffResult->correctFiles.begin(),
@@ -105,7 +121,7 @@ bool MainWindow::IsFileCorrent(const File& file) const
 
 void MainWindow::OnListViewDoubleClick(const FileAndSum& file)
 {
-	if (IsFileCorrent(file))
+	if (IsFileCorrect(file))
 	{
 		if (file.isDir)
 		{
@@ -150,7 +166,9 @@ void MainWindow::OnListViewDoubleClick(const FileAndSum& file)
 
 void MainWindow::OnEngineUpdated()
 {
+	window->setEnabled(false);
 	ListFiles();
+	window->setEnabled(true);
 }
 
 bool MainWindow::TryOpenningDir(const std::vector<std::string>& folders)

+ 2 - 1
fakeRaid/mainWindow.h

@@ -28,6 +28,7 @@ namespace craftlab::fakeraid::ui
 
 	private Q_SLOTS:
 		void MenuBarActionTrigerred(bool checked =false);
+		void OnBreadcrumbSelection(int index);
 
 	private:
 		bool PathExists(const IEngine& engine) const;
@@ -35,7 +36,7 @@ namespace craftlab::fakeraid::ui
 		void ListFiles();
 		void OnListViewDoubleClick(const FileAndSum& filename);
 		void FileEdit(const File& f);
-		bool IsFileCorrent(const File& file) const;
+		bool IsFileCorrect(const File& file) const;
 		void UpdateFileList();
 		void UpdateBreadcrumb();
 		bool TryOpenningDir(const std::vector<std::string>& directories);