diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-04-15 11:27:15 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-04-15 11:29:07 +0200 |
commit | 3543eefc8cdee090761e373a435b8ba1dc9f48f6 (patch) | |
tree | 367d850057285caff9d10ac80156058d6f304c19 /src/plugins/coreplugin/dialogs | |
parent | ea266e33d66459e2332e2714ee197c5e385f3720 (diff) | |
download | qt-creator-3543eefc8cdee090761e373a435b8ba1dc9f48f6.tar.gz |
Wizards: Make it possible to check existing files to overwrite.
Present a checkable list of files to be overwritten,
enabling re-generating a part of the project or class.
Task-number: QTCREATORBUG-4538
Diffstat (limited to 'src/plugins/coreplugin/dialogs')
-rw-r--r-- | src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp | 163 | ||||
-rw-r--r-- | src/plugins/coreplugin/dialogs/promptoverwritedialog.h | 78 |
2 files changed, 241 insertions, 0 deletions
diff --git a/src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp b/src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp new file mode 100644 index 0000000000..c5ce87f8b1 --- /dev/null +++ b/src/plugins/coreplugin/dialogs/promptoverwritedialog.cpp @@ -0,0 +1,163 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (info@qt.nokia.com) +** +** +** GNU Lesser General Public License Usage +** +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this file. +** Please review the following information to ensure the GNU Lesser General +** Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** Other Usage +** +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +**************************************************************************/ + +#include "promptoverwritedialog.h" + +#include <utils/stringutils.h> + +#include <QtGui/QTreeView> +#include <QtGui/QLabel> +#include <QtGui/QStandardItemModel> +#include <QtGui/QStandardItem> +#include <QtGui/QDialogButtonBox> +#include <QtGui/QVBoxLayout> + +#include <QtCore/QDir> + +enum { FileNameRole = Qt::UserRole + 1 }; + +/*! + \class Core::Internal::PromptOverwriteDialog + \brief Prompts the user to overwrite a list of files, which he can check. + + Displays the common folder and the files in a checkable list. +*/ + +static inline QString fileNameOfItem(const QStandardItem *item) +{ + return item->data(FileNameRole).toString(); +} + +namespace Core { +namespace Internal { + +PromptOverwriteDialog::PromptOverwriteDialog(QWidget *parent) : + QDialog(parent), + m_label(new QLabel), + m_view(new QTreeView), + m_model(new QStandardItemModel(0, 1, this)) +{ + setWindowTitle(tr("Overwrite Existing Files")); + setModal(true); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->addWidget(m_label); + m_view->setRootIsDecorated(false); + m_view->setUniformRowHeights(true); + m_view->setHeaderHidden(true); + m_view->setSelectionMode(QAbstractItemView::NoSelection); + m_view->setModel(m_model); + mainLayout->addWidget(m_view); + QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); + connect(bb, SIGNAL(accepted()), this, SLOT(accept())); + connect(bb, SIGNAL(rejected()), this, SLOT(reject())); + mainLayout->addWidget(bb); +} + +void PromptOverwriteDialog::setFiles(const QStringList &l) +{ + // Format checkable list excluding common path + const QString nativeCommonPath = QDir::toNativeSeparators(Utils::commonPath(l)); + foreach (const QString &fileName, l) { + const QString nativeFileName = QDir::toNativeSeparators(fileName); + const int length = nativeFileName.size() - nativeCommonPath.size() - 1; + QStandardItem *item = new QStandardItem(nativeFileName.right(length)); + item->setData(QVariant(fileName), FileNameRole); + item->setFlags(Qt::ItemIsEnabled); + item->setCheckable(true); + item->setCheckState(Qt::Checked); + m_model->appendRow(item); + } + const QString message = + tr("The following files already exist in the folder\n%1.\n" + "Would you like to overwrite them?").arg(nativeCommonPath); + m_label->setText(message); +} + +QStandardItem *PromptOverwriteDialog::itemForFile(const QString &f) const +{ + const int rowCount = m_model->rowCount(); + for (int r = 0; r < rowCount; ++r) { + QStandardItem *item = m_model->item(r, 0); + if (fileNameOfItem(item) == f) + return item; + } + return 0; +} + +QStringList PromptOverwriteDialog::files(Qt::CheckState cs) const +{ + QStringList result; + const int rowCount = m_model->rowCount(); + for (int r = 0; r < rowCount; ++r) { + const QStandardItem *item = m_model->item(r, 0); + if (item->checkState() == cs) + result.push_back(fileNameOfItem(item)); + } + return result; +} + +void PromptOverwriteDialog::setFileEnabled(const QString &f, bool e) +{ + if (QStandardItem *item = itemForFile(f)) { + Qt::ItemFlags flags = item->flags(); + if (e) { + flags |= Qt::ItemIsEnabled; + } else { + flags &= ~Qt::ItemIsEnabled; + } + item->setFlags(flags); + } +} + +bool PromptOverwriteDialog::isFileEnabled(const QString &f) const +{ + if (const QStandardItem *item = itemForFile(f)) + return (item->flags() & Qt::ItemIsEnabled); + return false; +} + +void PromptOverwriteDialog::setFileChecked(const QString &f, bool e) +{ + if (QStandardItem *item = itemForFile(f)) + item->setCheckState(e ? Qt::Checked : Qt::Unchecked); +} + +bool PromptOverwriteDialog::isFileChecked(const QString &f) const +{ + if (const QStandardItem *item = itemForFile(f)) + return item->checkState() == Qt::Checked; + return false; +} + +} // namespace Internal +} // namespace Core diff --git a/src/plugins/coreplugin/dialogs/promptoverwritedialog.h b/src/plugins/coreplugin/dialogs/promptoverwritedialog.h new file mode 100644 index 0000000000..17b3736b0d --- /dev/null +++ b/src/plugins/coreplugin/dialogs/promptoverwritedialog.h @@ -0,0 +1,78 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (info@qt.nokia.com) +** +** +** GNU Lesser General Public License Usage +** +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this file. +** Please review the following information to ensure the GNU Lesser General +** Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** Other Usage +** +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef PROMPTOVERWRITEDIALOG_H +#define PROMPTOVERWRITEDIALOG_H + +#include <QtGui/QDialog> + +QT_BEGIN_NAMESPACE +class QTreeView; +class QStandardItemModel; +class QStandardItem; +class QLabel; +QT_END_NAMESPACE + +namespace Core { +namespace Internal { + +// Documentation inside. +class PromptOverwriteDialog : public QDialog +{ + Q_OBJECT +public: + explicit PromptOverwriteDialog(QWidget *parent = 0); + + void setFiles(const QStringList &); + + void setFileEnabled(const QString &f, bool e); + bool isFileEnabled(const QString &f) const; + + void setFileChecked(const QString &f, bool e); + bool isFileChecked(const QString &f) const; + + QStringList checkedFiles() const { return files(Qt::Checked); } + QStringList uncheckedFiles() const { return files(Qt::Unchecked); } + +private: + QStandardItem *itemForFile(const QString &f) const; + QStringList files(Qt::CheckState cs) const; + + QLabel *m_label; + QTreeView *m_view; + QStandardItemModel *m_model; +}; + +} // namespace Internal +} // namespace Core + +#endif // PROMPTOVERWRITEDIALOG_H |