Browse Source

Fixes #9 Multiple directories inputs in UI

isundil 7 months ago
parent
commit
92437e73fd

+ 2 - 2
fakeRaid.vcxproj.user

@@ -2,10 +2,10 @@
 <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
-    <LocalDebuggerCommandArguments>C:\Users\isund\AppData\Roaming C:\Users\isund\AppData\Roaming</LocalDebuggerCommandArguments>
+    <LocalDebuggerCommandArguments>C:/Users/isund/projects/fakeRaid/test/A C:/Users/isund/projects/fakeRaid/test/B C:/Users/isund/projects/fakeRaid/test/C</LocalDebuggerCommandArguments>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <LocalDebuggerCommandArguments>C:\Users\isund\AppData\Roaming C:\Users\isund\AppData\Roaming</LocalDebuggerCommandArguments>
+    <LocalDebuggerCommandArguments>C:/Users/isund/projects/fakeRaid/test/A C:/Users/isund/projects/fakeRaid/test/B C:/Users/isund/projects/fakeRaid/test/C</LocalDebuggerCommandArguments>
     <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
   </PropertyGroup>
   <PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

+ 14 - 1
fakeRaid/BrowseModal.ui

@@ -52,13 +52,26 @@
      </layout>
     </widget>
    </item>
+   <item>
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
    <item>
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+      <set>QDialogButtonBox::Open</set>
      </property>
     </widget>
    </item>

+ 7 - 0
fakeRaid/ConflictModal.ui

@@ -20,6 +20,13 @@
    <string>Dialog</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="labelRepoList">
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+    </widget>
+   </item>
    <item>
     <widget class="QListWidget" name="listWidget">
      <property name="sizePolicy">

+ 81 - 8
fakeRaid/browseModal.cpp

@@ -17,18 +17,92 @@ BrowseModal::BrowseModal(bool _cancellable, const std::vector<std::string>& prev
 		ui->buttonBox->setStandardButtons(QDialogButtonBox::StandardButton::Open | QDialogButtonBox::StandardButton::Cancel);
 		connect(ui->buttonBox, &QDialogButtonBox::rejected, this, [this]() { rejected = true; });
 	}
-	connect(ui->pushButton, &QPushButton::clicked, this, [this]() { BrowseForInput(*ui->lineEdit); });
-	connect(ui->pushButton_2, &QPushButton::clicked, this, [this]() { BrowseForInput(*ui->lineEdit_2); });
-	if (previous.size() > 0)
-		ui->lineEdit->setText(previous[0].c_str());
-	if (previous.size() > 1)
-		ui->lineEdit_2->setText(previous[1].c_str());
+
+	// Initialize Inputs
+	{
+		InitializeBrowseInput(ui->groupBox, ui->lineEdit, ui->pushButton, previous.size() > 0 ? previous[0].c_str() : nullptr);
+		InitializeBrowseInput(ui->groupBox_2, ui->lineEdit_2, ui->pushButton_2, previous.size() > 1 ? previous[1].c_str() : nullptr);
+
+		for (int i = 2; i < previous.size(); ++i)
+			ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 2, CreateBrowseInput(previous[i].c_str()));
+		CheckValidationPossible();
+	}
+
+	// AddInput Button
+	{
+		QAbstractButton* addInputButton = CreateAddButton();
+		ui->buttonBox->addButton(addInputButton, QDialogButtonBox::ButtonRole::NoRole);
+		connect(addInputButton, &QAbstractButton::clicked, this, [this](){ ui->verticalLayout->insertWidget(ui->verticalLayout->count() -2, CreateBrowseInput()); CheckValidationPossible(); });
+	}
+
 	setModal(this);
 }
 
+QWidget* BrowseModal::CreateBrowseInput(const char* text)
+{
+	QGroupBox* groupBox = new QGroupBox(this);
+	QHBoxLayout* horizontalLayout_2 = new QHBoxLayout(groupBox);
+	QLineEdit* lineEdit = new QLineEdit(groupBox);
+	horizontalLayout_2->addWidget(lineEdit);
+	QPushButton* pushButton = new QPushButton(groupBox);
+	pushButton->setText(QCoreApplication::translate("BrowseModal", "Parcourir", nullptr));
+	horizontalLayout_2->addWidget(pushButton);
+	InitializeBrowseInput(groupBox, lineEdit, pushButton, text);
+	return groupBox;
+}
+
+void BrowseModal::UpdateGroupTitle(const QLineEdit& lineEdit, QGroupBox& groupBox)
+{
+	QString newUrl(lineEdit.text());
+	while (newUrl.endsWith("/"))
+		newUrl.removeLast();
+	if (newUrl.isEmpty())
+		return;
+
+	QFileInfo dir(newUrl);
+	if (!dir.exists())
+		groupBox.setTitle("File not found");
+	else if (!dir.isDir())
+		groupBox.setTitle("File is not a directory");
+	else
+		groupBox.setTitle(dir.fileName());
+}
+
+void BrowseModal::CheckValidationPossible()
+{
+	auto isInputInvalid = [](const QLineEdit* input) {
+		if (input->text().isEmpty())
+			return true;
+		QFileInfo dir(input->text());
+		if (!dir.exists() || !dir.isDir())
+			return true;
+		return false;
+	};
+
+	ui->buttonBox->button(QDialogButtonBox::StandardButton::Open)->setEnabled(!std::any_of(inputs.begin(), inputs.end(), isInputInvalid));
+}
+
+void BrowseModal::InitializeBrowseInput(QGroupBox* groupBox, QLineEdit* input, QAbstractButton* browseButton, const char* text)
+{
+	if (text)
+		input->setText(text);
+	groupBox->setTitle("");
+	UpdateGroupTitle(*input, *groupBox);
+	connect(browseButton, &QPushButton::clicked, this, [this, input, groupBox]() { BrowseForInput(*input); UpdateGroupTitle(*input, *groupBox); CheckValidationPossible(); });
+	connect(input, &QLineEdit::editingFinished, this, [this, groupBox, input]() { UpdateGroupTitle(*input, *groupBox); CheckValidationPossible(); });
+	inputs.push_back(input);
+}
+
 BrowseModal::~BrowseModal()
 {}
 
+QAbstractButton* BrowseModal::CreateAddButton()
+{
+	QPushButton* result = new QPushButton(this);
+	result->setText("Ajouter");
+	return result;
+}
+
 void BrowseModal::reject()
 {
 	if (cancellable)
@@ -49,7 +123,6 @@ std::vector<std::string> BrowseModal::Display(bool cancellable, const std::vecto
 	if (dialog.rejected)
 		return std::vector<std::string> {};
 	std::vector<std::string> result;
-	result.push_back(dialog.ui->lineEdit->text().toStdString());
-	result.push_back(dialog.ui->lineEdit_2->text().toStdString());
+	std::transform(dialog.inputs.begin(), dialog.inputs.end(), std::back_inserter(result), [](const QLineEdit* input) { return input->text().toStdString(); });
 	return result;
 }

+ 11 - 1
fakeRaid/browseModal.h

@@ -1,8 +1,11 @@
 #pragma once
 
-#include <QLineEdit>
 #include <QDialog>
 
+class QLineEdit;
+class QAbstractButton;
+class QGroupBox;
+
 class Ui_BrowseModal;
 
 namespace craftlab::fakeraid
@@ -19,10 +22,17 @@ namespace craftlab::fakeraid
 		BrowseModal() =delete;
 		BrowseModal(bool cancellable, const std::vector<std::string>& previous);
 
+		QAbstractButton* CreateAddButton();
+
 		void BrowseForInput(QLineEdit& input);
+		void InitializeBrowseInput(QGroupBox* groupBox, QLineEdit* input, QAbstractButton* browseButton, const char* text);
+		QWidget* CreateBrowseInput(const char* text =nullptr);
+		void UpdateGroupTitle(const QLineEdit& lineEdit, QGroupBox& groupBox);
+		void CheckValidationPossible();
 
 		bool rejected = false;
 		bool cancellable;
+		std::vector<QLineEdit*> inputs;
 		std::unique_ptr<Ui_BrowseModal> ui;
 	};
 }

+ 1 - 1
fakeRaid/conflictItemWidget.cpp

@@ -75,7 +75,7 @@ std::map<int, std::vector<int>> ConflictItemWidget::groupFileByVersion(const std
 }
 
 const char* FILE_STYLE = "style=\"color:green\"";
-const char* REPO_STYLE = "style=\"color:blue\"";
+const char* REPO_STYLE = "style=\"color:#4287f5\"";
 const char* VERSION_STYLE = "style=\"color:red\"";
 
 void ConflictItemWidget::listRepositories(const std::vector<int>& repo, std::stringstream& stream)

+ 1 - 0
fakeRaid/conflictModal.cpp

@@ -13,6 +13,7 @@ ConflictModal::ConflictModal(const std::vector<std::string>& _rootPaths, const D
 {
 	ui->setupUi(this);
 
+	ui->labelRepoList->setText(""); // FIXME
 	for (const std::pair<std::string, std::vector<bool>>& i : diffResult->missingFiles)
 		AddConflictingFile(ConflictItemWidget::FromMissingFile(ui->listWidget, rootPaths, diffResult->FileList[i.first].fileName, i.first, displayFullPath, i.second));
 	for (const std::pair<std::string, std::vector<bool>>& i : diffResult->missingDirs)

+ 1 - 0
fakeRaid/mainWindow.cpp

@@ -2,6 +2,7 @@
 #include <QDesktopServices>
 #include <QFile>
 #include <QDir>
+#include <QUrl>
 #include <QProgressDialog>
 #include "ui_MainWindow.h"
 #include "mainWindow.h"