Core: Convert promptoverwritedialog to FilePath

Change-Id: I4c1fc7b8c8956f671a3beef8834fe8039333482e
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
hjk
2023-01-03 16:35:37 +01:00
parent a3d1ef4e89
commit ba42169e8a
4 changed files with 55 additions and 51 deletions

View File

@@ -243,18 +243,18 @@ BaseFileWizardFactory::OverwriteResult BaseFileWizardFactory::promptOverwrite(Ge
// Prompt to overwrite existing files.
PromptOverwriteDialog overwriteDialog;
// Scripts cannot handle overwrite
overwriteDialog.setFiles(Utils::transform(existingFiles, &FilePath::toString));
overwriteDialog.setFiles(existingFiles);
for (const GeneratedFile &file : std::as_const(*files))
if (file.attributes() & GeneratedFile::CustomGeneratorAttribute)
overwriteDialog.setFileEnabled(file.filePath().toString(), false);
overwriteDialog.setFileEnabled(file.filePath(), false);
if (overwriteDialog.exec() != QDialog::Accepted)
return OverwriteCanceled;
const QStringList existingFilesToKeep = overwriteDialog.uncheckedFiles();
const FilePaths existingFilesToKeep = overwriteDialog.uncheckedFiles();
if (existingFilesToKeep.size() == files->size()) // All exist & all unchecked->Cancel.
return OverwriteCanceled;
// Set 'keep' attribute in files
for (const QString &keepFile : std::as_const(existingFilesToKeep)) {
const int i = indexOfFile(*files, FilePath::fromString(keepFile).cleanPath());
for (const FilePath &keepFile : existingFilesToKeep) {
const int i = indexOfFile(*files, keepFile.cleanPath());
QTC_ASSERT(i != -1, return OverwriteCanceled);
GeneratedFile &file = (*files)[i];
file.setAttributes(file.attributes() | GeneratedFile::KeepExistingFileAttribute);

View File

@@ -3,6 +3,7 @@
#include "promptoverwritedialog.h"
#include <utils/fileutils.h>
#include <utils/stringutils.h>
#include <QTreeView>
@@ -16,6 +17,15 @@
enum { FileNameRole = Qt::UserRole + 1 };
using namespace Utils;
namespace Core {
static FilePath fileNameOfItem(const QStandardItem *item)
{
return FilePath::fromString(item->data(FileNameRole).toString());
}
/*!
\class Core::PromptOverwriteDialog
\inmodule QtCreator
@@ -27,13 +37,6 @@ enum { FileNameRole = Qt::UserRole + 1 };
can select the files to overwrite.
*/
static inline QString fileNameOfItem(const QStandardItem *item)
{
return item->data(FileNameRole).toString();
}
namespace Core {
PromptOverwriteDialog::PromptOverwriteDialog(QWidget *parent) :
QDialog(parent),
m_label(new QLabel),
@@ -56,15 +59,15 @@ PromptOverwriteDialog::PromptOverwriteDialog(QWidget *parent) :
mainLayout->addWidget(bb);
}
void PromptOverwriteDialog::setFiles(const QStringList &l)
void PromptOverwriteDialog::setFiles(const FilePaths &l)
{
// Format checkable list excluding common path
const QString nativeCommonPath = QDir::toNativeSeparators(Utils::commonPath(l));
for (const QString &fileName : l) {
const QString nativeFileName = QDir::toNativeSeparators(fileName);
const QString nativeCommonPath = FileUtils::commonPath(l).toUserOutput();
for (const FilePath &fileName : l) {
const QString nativeFileName = fileName.toUserOutput();
const int length = nativeFileName.size() - nativeCommonPath.size() - 1;
QStandardItem *item = new QStandardItem(nativeFileName.right(length));
item->setData(QVariant(fileName), FileNameRole);
item->setData(QVariant(fileName.toString()), FileNameRole);
item->setFlags(Qt::ItemIsEnabled);
item->setCheckable(true);
item->setCheckState(Qt::Checked);
@@ -76,7 +79,7 @@ void PromptOverwriteDialog::setFiles(const QStringList &l)
m_label->setText(message);
}
QStandardItem *PromptOverwriteDialog::itemForFile(const QString &f) const
QStandardItem *PromptOverwriteDialog::itemForFile(const FilePath &f) const
{
const int rowCount = m_model->rowCount();
for (int r = 0; r < rowCount; ++r) {
@@ -87,9 +90,9 @@ QStandardItem *PromptOverwriteDialog::itemForFile(const QString &f) const
return nullptr;
}
QStringList PromptOverwriteDialog::files(Qt::CheckState cs) const
FilePaths PromptOverwriteDialog::files(Qt::CheckState cs) const
{
QStringList result;
FilePaths result;
const int rowCount = m_model->rowCount();
for (int r = 0; r < rowCount; ++r) {
const QStandardItem *item = m_model->item(r, 0);
@@ -99,7 +102,7 @@ QStringList PromptOverwriteDialog::files(Qt::CheckState cs) const
return result;
}
void PromptOverwriteDialog::setFileEnabled(const QString &f, bool e)
void PromptOverwriteDialog::setFileEnabled(const FilePath &f, bool e)
{
if (QStandardItem *item = itemForFile(f)) {
Qt::ItemFlags flags = item->flags();
@@ -111,24 +114,24 @@ void PromptOverwriteDialog::setFileEnabled(const QString &f, bool e)
}
}
bool PromptOverwriteDialog::isFileEnabled(const QString &f) const
bool PromptOverwriteDialog::isFileEnabled(const FilePath &f) const
{
if (const QStandardItem *item = itemForFile(f))
return (item->flags() & Qt::ItemIsEnabled);
return false;
}
void PromptOverwriteDialog::setFileChecked(const QString &f, bool e)
void PromptOverwriteDialog::setFileChecked(const FilePath &f, bool e)
{
if (QStandardItem *item = itemForFile(f))
item->setCheckState(e ? Qt::Checked : Qt::Unchecked);
}
bool PromptOverwriteDialog::isFileChecked(const QString &f) const
bool PromptOverwriteDialog::isFileChecked(const FilePath &f) const
{
if (const QStandardItem *item = itemForFile(f))
return item->checkState() == Qt::Checked;
return false;
}
} // namespace Core
} // Core

View File

@@ -5,6 +5,8 @@
#include "../core_global.h"
#include <utils/filepath.h>
#include <QDialog>
QT_BEGIN_NAMESPACE
@@ -16,8 +18,6 @@ QT_END_NAMESPACE
namespace Core {
// TODO: Port to Utils::FilePaths
// Documentation inside.
class CORE_EXPORT PromptOverwriteDialog : public QDialog
{
@@ -25,24 +25,24 @@ class CORE_EXPORT PromptOverwriteDialog : public QDialog
public:
explicit PromptOverwriteDialog(QWidget *parent = nullptr);
void setFiles(const QStringList &);
void setFiles(const Utils::FilePaths &);
void setFileEnabled(const QString &f, bool e);
bool isFileEnabled(const QString &f) const;
void setFileEnabled(const Utils::FilePath &f, bool e);
bool isFileEnabled(const Utils::FilePath &f) const;
void setFileChecked(const QString &f, bool e);
bool isFileChecked(const QString &f) const;
void setFileChecked(const Utils::FilePath &f, bool e);
bool isFileChecked(const Utils::FilePath &f) const;
QStringList checkedFiles() const { return files(Qt::Checked); }
QStringList uncheckedFiles() const { return files(Qt::Unchecked); }
Utils::FilePaths checkedFiles() const { return files(Qt::Checked); }
Utils::FilePaths uncheckedFiles() const { return files(Qt::Unchecked); }
private:
QStandardItem *itemForFile(const QString &f) const;
QStringList files(Qt::CheckState cs) const;
QStandardItem *itemForFile(const Utils::FilePath &f) const;
Utils::FilePaths files(Qt::CheckState cs) const;
QLabel *m_label;
QTreeView *m_view;
QStandardItemModel *m_model;
};
} // namespace Core
} // Core

View File

@@ -20,6 +20,7 @@
#include <texteditor/textindenter.h>
#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <utils/mimeutils.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
@@ -136,14 +137,14 @@ bool JsonWizardGenerator::allDone(const JsonWizard *wizard, GeneratedFile *file,
JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(JsonWizard::GeneratorFiles *files,
QString *errorMessage)
{
QStringList existingFiles;
FilePaths existingFiles;
bool oddStuffFound = false;
for (const JsonWizard::GeneratorFile &f : std::as_const(*files)) {
if (f.file.filePath().exists()
&& !(f.file.attributes() & GeneratedFile::ForceOverwrite)
&& !(f.file.attributes() & GeneratedFile::KeepExistingFileAttribute))
existingFiles.append(f.file.filePath().toString());
existingFiles.append(f.file.filePath());
}
if (existingFiles.isEmpty())
return OverwriteOk;
@@ -151,23 +152,23 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso
// Before prompting to overwrite existing files, loop over files and check
// if there is anything blocking overwriting them (like them being links or folders).
// Format a file list message as ( "<file1> [readonly], <file2> [folder]").
const QString commonExistingPath = Utils::commonPath(existingFiles);
const QString commonExistingPath = FileUtils::commonPath(existingFiles).toUserOutput();
const int commonPathSize = commonExistingPath.size();
QString fileNamesMsgPart;
for (const QString &fileName : std::as_const(existingFiles)) {
const QFileInfo fi(fileName);
if (fi.exists()) {
for (const FilePath &filePath : std::as_const(existingFiles)) {
if (filePath.exists()) {
if (!fileNamesMsgPart.isEmpty())
fileNamesMsgPart += QLatin1String(", ");
const QString namePart = QDir::toNativeSeparators(fileName.mid(commonExistingPath.size() + 1));
if (fi.isDir()) {
const QString namePart = filePath.toUserOutput().mid(commonPathSize);
if (filePath.isDir()) {
oddStuffFound = true;
fileNamesMsgPart += QCoreApplication::translate("ProjectExplorer::JsonWizardGenerator", "%1 [folder]")
.arg(namePart);
} else if (fi.isSymLink()) {
} else if (filePath.isSymLink()) {
oddStuffFound = true;
fileNamesMsgPart += QCoreApplication::translate("ProjectExplorer::JsonWizardGenerator", "%1 [symbolic link]")
.arg(namePart);
} else if (!fi.isWritable()) {
} else if (!filePath.isWritableDir() && !filePath.isWritableFile()) {
oddStuffFound = true;
fileNamesMsgPart += QCoreApplication::translate("ProjectExplorer::JsonWizardGenerator", "%1 [read only]")
.arg(namePart);
@@ -178,7 +179,7 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso
if (oddStuffFound) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizardGenerator",
"The directory %1 contains files which cannot be overwritten:\n%2.")
.arg(QDir::toNativeSeparators(commonExistingPath)).arg(fileNamesMsgPart);
.arg(commonExistingPath).arg(fileNamesMsgPart);
return OverwriteError;
}
@@ -189,17 +190,17 @@ JsonWizardGenerator::OverwriteResult JsonWizardGenerator::promptForOverwrite(Jso
overwriteDialog.setFiles(existingFiles);
for (const JsonWizard::GeneratorFile &file : std::as_const(*files))
if (!file.generator->canKeepExistingFiles())
overwriteDialog.setFileEnabled(file.file.filePath().toString(), false);
overwriteDialog.setFileEnabled(file.file.filePath(), false);
if (overwriteDialog.exec() != QDialog::Accepted)
return OverwriteCanceled;
const QSet<QString> existingFilesToKeep = Utils::toSet(overwriteDialog.uncheckedFiles());
const QSet<FilePath> existingFilesToKeep = Utils::toSet(overwriteDialog.uncheckedFiles());
if (existingFilesToKeep.size() == files->size()) // All exist & all unchecked->Cancel.
return OverwriteCanceled;
// Set 'keep' attribute in files
for (JsonWizard::GeneratorFile &file : *files) {
if (!existingFilesToKeep.contains(file.file.filePath().toString()))
if (!existingFilesToKeep.contains(file.file.filePath()))
continue;
file.file.setAttributes(file.file.attributes() | GeneratedFile::KeepExistingFileAttribute);