forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user