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

View File

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

View File

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

View File

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