From 01084aaa38e3ce413e0d365e13ceaba75c8d7f17 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh <orgad.shaneh@audiocodes.com> Date: Wed, 2 Jan 2013 22:19:04 +0200 Subject: [PATCH] VCS: Use SubmitFileModel in SubmitEditorWidget Much cleaner Change-Id: I090e5d04e5afae1023fa58eca1ef416ddc069165 Reviewed-by: Tobias Hunger <tobias.hunger@digia.com> --- src/plugins/git/gitsubmiteditor.cpp | 3 +- src/plugins/perforce/perforcesubmiteditor.cpp | 2 +- src/plugins/vcsbase/submiteditorwidget.cpp | 80 +++++-------------- src/plugins/vcsbase/submiteditorwidget.h | 12 +-- src/plugins/vcsbase/submitfilemodel.cpp | 43 ++++------ src/plugins/vcsbase/submitfilemodel.h | 9 +-- src/plugins/vcsbase/vcsbasesubmiteditor.cpp | 18 +---- src/plugins/vcsbase/vcsbasesubmiteditor.h | 10 +-- 8 files changed, 50 insertions(+), 127 deletions(-) diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp index 606ca9fb05f..c5e9a6a1e12 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -131,10 +131,9 @@ void GitSubmitEditor::slotDiffSelected(const QStringList &files) QStringList unmergedFiles; QStringList unstagedFiles; QStringList stagedFiles; - const int fileColumn = fileNameColumn(); const int rowCount = m_model->rowCount(); for (int r = 0; r < rowCount; r++) { - const QString fileName = m_model->item(r, fileColumn)->text(); + const QString fileName = m_model->file(r); if (files.contains(fileName)) { const FileStates state = static_cast<FileStates>(m_model->extraData(r).toInt()); if (state & UnmergedFile) diff --git a/src/plugins/perforce/perforcesubmiteditor.cpp b/src/plugins/perforce/perforcesubmiteditor.cpp index 46dfed20543..50832f12a3f 100644 --- a/src/plugins/perforce/perforcesubmiteditor.cpp +++ b/src/plugins/perforce/perforcesubmiteditor.cpp @@ -114,7 +114,7 @@ bool PerforceSubmitEditor::parseText(QString text) void PerforceSubmitEditor::restrictToProjectFiles(const QStringList &knownProjectFiles) { - m_fileModel->filter(knownProjectFiles, fileNameColumn()); + m_fileModel->filterFiles(knownProjectFiles); } void PerforceSubmitEditor::updateFields() diff --git a/src/plugins/vcsbase/submiteditorwidget.cpp b/src/plugins/vcsbase/submiteditorwidget.cpp index 9ad7bfaee1e..0286402fae9 100644 --- a/src/plugins/vcsbase/submiteditorwidget.cpp +++ b/src/plugins/vcsbase/submiteditorwidget.cpp @@ -29,6 +29,7 @@ #include "submiteditorwidget.h" #include "submitfieldwidget.h" +#include "submitfilemodel.h" #include "ui_submiteditorwidget.h" #include <QDebug> @@ -46,8 +47,6 @@ enum { debug = 0 }; enum { defaultLineWidth = 72 }; -enum { checkableColumn = 0 }; - /*! \class VcsBase::SubmitEditorWidget @@ -55,8 +54,8 @@ enum { checkableColumn = 0 }; checkable list of modified files in a list window. The user can delete files from the list by unchecking them or diff the selection - by doubleclicking. A list model which contains the file in a column - specified by fileNameColumn should be set using setFileModel(). + by doubleclicking. A list model which contains state and file columns should be + set using setFileModel(). Additionally, standard creator actions can be registered: Undo/redo will be set up to work with the description editor. @@ -117,28 +116,6 @@ public slots: }; // Helpers to retrieve model data -static inline bool listModelChecked(const QAbstractItemModel *model, int row, int column = 0) -{ - const QModelIndex checkableIndex = model->index(row, column, QModelIndex()); - return model->data(checkableIndex, Qt::CheckStateRole).toInt() == Qt::Checked; -} - -static void setListModelChecked(QAbstractItemModel *model, bool checked, int column = 0) -{ - const QVariant data = QVariant(int(checked ? Qt::Checked : Qt::Unchecked)); - const int count = model->rowCount(); - for (int i = 0; i < count; i++) { - const QModelIndex checkableIndex = model->index(i, column, QModelIndex()); - model->setData(checkableIndex, data, Qt::CheckStateRole); - } -} - -static inline QString listModelText(const QAbstractItemModel *model, int row, int column) -{ - const QModelIndex index = model->index(row, column, QModelIndex()); - return model->data(index, Qt::DisplayRole).toString(); -} - // Convenience to extract a list of selected indexes QList<int> selectedRows(const QAbstractItemView *view) { @@ -163,7 +140,6 @@ struct SubmitEditorWidgetPrivate Ui::SubmitEditorWidget m_ui; bool m_filesSelected; - int m_fileNameColumn; int m_activatedRow; bool m_emptyFileListEnabled; @@ -180,7 +156,6 @@ struct SubmitEditorWidgetPrivate SubmitEditorWidgetPrivate::SubmitEditorWidgetPrivate() : m_filesSelected(false), - m_fileNameColumn(1), m_activatedRow(-1), m_emptyFileListEnabled(false), m_fieldLayout(0), @@ -242,9 +217,8 @@ void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *edi if (submitAction) { if (debug) { - int count = 0; - if (const QAbstractItemModel *model = d->m_ui.fileView->model()) - count = model->rowCount(); + const SubmitFileModel *model = fileModel(); + int count = model ? model->rowCount() : 0; qDebug() << Q_FUNC_INFO << submitAction << count << "items"; } d->m_commitEnabled = !canSubmit(); @@ -385,16 +359,6 @@ void SubmitEditorWidget::setDescriptionMandatory(bool v) d->m_descriptionMandatory = v; } -int SubmitEditorWidget::fileNameColumn() const -{ - return d->m_fileNameColumn; -} - -void SubmitEditorWidget::setFileNameColumn(int c) -{ - d->m_fileNameColumn = c; -} - QAbstractItemView::SelectionMode SubmitEditorWidget::fileListSelectionMode() const { return d->m_ui.fileView->selectionMode(); @@ -405,7 +369,7 @@ void SubmitEditorWidget::setFileListSelectionMode(QAbstractItemView::SelectionMo d->m_ui.fileView->setSelectionMode(sm); } -void SubmitEditorWidget::setFileModel(QAbstractItemModel *model) +void SubmitEditorWidget::setFileModel(SubmitFileModel *model) { d->m_ui.fileView->clearSelection(); // trigger the change signals @@ -434,9 +398,9 @@ void SubmitEditorWidget::setFileModel(QAbstractItemModel *model) updateActions(); } -QAbstractItemModel *SubmitEditorWidget::fileModel() const +SubmitFileModel *SubmitEditorWidget::fileModel() const { - return d->m_ui.fileView->model(); + return static_cast<SubmitFileModel *>(d->m_ui.fileView->model()); } QStringList SubmitEditorWidget::selectedFiles() const @@ -446,23 +410,23 @@ QStringList SubmitEditorWidget::selectedFiles() const return QStringList(); QStringList rc; - const QAbstractItemModel *model = d->m_ui.fileView->model(); + const SubmitFileModel *model = fileModel(); const int count = selection.size(); for (int i = 0; i < count; i++) - rc.push_back(listModelText(model, selection.at(i), fileNameColumn())); + rc.push_back(model->file(selection.at(i))); return rc; } QStringList SubmitEditorWidget::checkedFiles() const { QStringList rc; - const QAbstractItemModel *model = d->m_ui.fileView->model(); + const SubmitFileModel *model = fileModel(); if (!model) return rc; const int count = model->rowCount(); for (int i = 0; i < count; i++) - if (listModelChecked(model, i, checkableColumn)) - rc.push_back(listModelText(model, i, fileNameColumn())); + if (model->checked(i)) + rc.push_back(model->file(i)); return rc; } @@ -480,7 +444,7 @@ void SubmitEditorWidget::triggerDiffSelected() void SubmitEditorWidget::diffActivatedDelayed() { - const QStringList files = QStringList(listModelText(d->m_ui.fileView->model(), d->m_activatedRow, fileNameColumn())); + const QStringList files = QStringList(fileModel()->file(d->m_activatedRow)); emit diffSelected(files); } @@ -554,10 +518,10 @@ bool SubmitEditorWidget::hasSelection() const int SubmitEditorWidget::checkedFilesCount() const { int checkedCount = 0; - if (const QAbstractItemModel *model = d->m_ui.fileView->model()) { + if (const SubmitFileModel *model = fileModel()) { const int count = model->rowCount(); for (int i = 0; i < count; ++i) - if (listModelChecked(model, i, checkableColumn)) + if (model->checked(i)) ++checkedCount; } return checkedCount; @@ -662,24 +626,20 @@ void SubmitEditorWidget::checkAllToggled() { if (d->m_ignoreChange) return; - if (d->m_ui.checkAllCheckBox->checkState() == Qt::Checked - || d->m_ui.checkAllCheckBox->checkState() == Qt::PartiallyChecked) { - setListModelChecked(d->m_ui.fileView->model(), true, checkableColumn); - } else { - setListModelChecked(d->m_ui.fileView->model(), false, checkableColumn); - } + Qt::CheckState checkState = d->m_ui.checkAllCheckBox->checkState(); + fileModel()->setAllChecked(checkState == Qt::Checked || checkState == Qt::PartiallyChecked); // Reset that again, so that the user can't do it d->m_ui.checkAllCheckBox->setTristate(false); } void SubmitEditorWidget::checkAll() { - setListModelChecked(d->m_ui.fileView->model(), true, checkableColumn); + fileModel()->setAllChecked(true); } void SubmitEditorWidget::uncheckAll() { - setListModelChecked(d->m_ui.fileView->model(), false, checkableColumn); + fileModel()->setAllChecked(false); } void SubmitEditorWidget::fileListCustomContextMenuRequested(const QPoint & pos) diff --git a/src/plugins/vcsbase/submiteditorwidget.h b/src/plugins/vcsbase/submiteditorwidget.h index bec7e45a4bb..da09173df7c 100644 --- a/src/plugins/vcsbase/submiteditorwidget.h +++ b/src/plugins/vcsbase/submiteditorwidget.h @@ -38,23 +38,20 @@ #include <QAbstractItemView> QT_BEGIN_NAMESPACE -class QListWidgetItem; class QAction; -class QAbstractItemModel; class QModelIndex; -class QLineEdit; QT_END_NAMESPACE namespace VcsBase { class SubmitFieldWidget; struct SubmitEditorWidgetPrivate; +class SubmitFileModel; class VCSBASE_EXPORT SubmitEditorWidget : public QWidget { Q_OBJECT Q_PROPERTY(QString descriptionText READ descriptionText WRITE setDescriptionText DESIGNABLE true) - Q_PROPERTY(int fileNameColumn READ fileNameColumn WRITE setFileNameColumn DESIGNABLE false) Q_PROPERTY(QAbstractItemView::SelectionMode fileListSelectionMode READ fileListSelectionMode WRITE setFileListSelectionMode DESIGNABLE true) Q_PROPERTY(bool lineWrap READ lineWrap WRITE setLineWrap DESIGNABLE true) Q_PROPERTY(int lineWrapWidth READ lineWrapWidth WRITE setLineWrapWidth DESIGNABLE true) @@ -80,9 +77,6 @@ public: bool isEmptyFileListEnabled() const; void setEmptyFileListEnabled(bool e); - int fileNameColumn() const; - void setFileNameColumn(int c); - bool lineWrap() const; void setLineWrap(bool); @@ -95,8 +89,8 @@ public: QAbstractItemView::SelectionMode fileListSelectionMode() const; void setFileListSelectionMode(QAbstractItemView::SelectionMode sm); - void setFileModel(QAbstractItemModel *model); - QAbstractItemModel *fileModel() const; + void setFileModel(SubmitFileModel *model); + SubmitFileModel *fileModel() const; // Files to be included in submit QStringList checkedFiles() const; diff --git a/src/plugins/vcsbase/submitfilemodel.cpp b/src/plugins/vcsbase/submitfilemodel.cpp index 40454075138..ef5973c2a52 100644 --- a/src/plugins/vcsbase/submitfilemodel.cpp +++ b/src/plugins/vcsbase/submitfilemodel.cpp @@ -42,6 +42,8 @@ namespace VcsBase { // Helpers: // -------------------------------------------------------------------------- +enum { fileColumn = 1 }; + static QList<QStandardItem *> createFileRow(const QString &fileName, const QString &status, CheckMode checked, const QVariant &v) { @@ -87,15 +89,6 @@ QList<QStandardItem *> SubmitFileModel::addFile(const QString &fileName, const Q return row; } -QList<QStandardItem *> SubmitFileModel::rowAt(int row) const -{ - const int colCount = columnCount(); - QList<QStandardItem *> rc; - for (int c = 0; c < colCount; c++) - rc.push_back(item(row, c)); - return rc; -} - QString SubmitFileModel::state(int row) const { if (row < 0 || row >= rowCount()) @@ -107,7 +100,7 @@ QString SubmitFileModel::file(int row) const { if (row < 0 || row >= rowCount()) return QString(); - return item(row, 1)->text(); + return item(row, fileColumn)->text(); } bool SubmitFileModel::checked(int row) const @@ -123,6 +116,13 @@ void SubmitFileModel::setChecked(int row, bool check) item(row)->setCheckState(check ? Qt::Checked : Qt::Unchecked); } +void SubmitFileModel::setAllChecked(bool check) +{ + int rows = rowCount(); + for (int row = 0; row < rows; ++row) + item(row)->setCheckState(check ? Qt::Checked : Qt::Unchecked); +} + QVariant SubmitFileModel::extraData(int row) const { if (row < 0 || row >= rowCount()) @@ -139,25 +139,14 @@ bool SubmitFileModel::hasCheckedFiles() const return false; } -QList<QStandardItem *> SubmitFileModel::findRow(const QString &text, int column) const -{ - // Single item - const QList<QStandardItem *> items = findItems(text, Qt::MatchExactly, column); - if (items.empty()) - return items; - // Compile row - return rowAt(items.front()->row()); - } - -unsigned SubmitFileModel::filter(const QStringList &filter, int column) +unsigned int SubmitFileModel::filterFiles(const QStringList &filter) { - unsigned rc = 0; + unsigned int rc = 0; for (int r = rowCount() - 1; r >= 0; r--) - if (const QStandardItem *i = item(r, column)) - if (!filter.contains(i->text())) { - qDeleteAll(takeRow(r)); - rc++; - } + if (!filter.contains(file(r))) { + removeRow(r); + rc++; + } return rc; } diff --git a/src/plugins/vcsbase/submitfilemodel.h b/src/plugins/vcsbase/submitfilemodel.h index 8d3e03e6947..c5bd70383cc 100644 --- a/src/plugins/vcsbase/submitfilemodel.h +++ b/src/plugins/vcsbase/submitfilemodel.h @@ -53,23 +53,18 @@ public: QList<QStandardItem *> addFile(const QString &fileName, const QString &status = QString(), CheckMode checkMode = Checked, const QVariant &data = QVariant()); - // Find convenience that returns the whole row (as opposed to QStandardItemModel::find). - QList<QStandardItem *> findRow(const QString &text, int column = 0) const; - - // Convenience to obtain a row - QList<QStandardItem *> rowAt(int row) const; - QString state(int row) const; QString file(int row) const; bool checked(int row) const; void setChecked(int row, bool check); + void setAllChecked(bool check); QVariant extraData(int row) const; bool hasCheckedFiles() const; // Filter for entries contained in the filter list. Returns the // number of deleted entries. - unsigned filter(const QStringList &filter, int column); + unsigned int filterFiles(const QStringList &filter); }; } // namespace VcsBase diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index 7eafda69ec4..94afcad5846 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -34,6 +34,7 @@ #include "submiteditorfile.h" #include "submiteditorwidget.h" #include "submitfieldwidget.h" +#include "submitfilemodel.h" #include "vcsbaseoutputwindow.h" #include "vcsplugin.h" @@ -318,16 +319,6 @@ void VcsBaseSubmitEditor::unregisterActions(QAction *editorUndoAction, QAction d->m_diffAction = d->m_submitAction = 0; } -int VcsBaseSubmitEditor::fileNameColumn() const -{ - return d->m_widget->fileNameColumn(); -} - -void VcsBaseSubmitEditor::setFileNameColumn(int c) -{ - d->m_widget->setFileNameColumn(c); -} - QAbstractItemView::SelectionMode VcsBaseSubmitEditor::fileListSelectionMode() const { return d->m_widget->fileListSelectionMode(); @@ -486,7 +477,7 @@ QStringList VcsBaseSubmitEditor::checkedFiles() const return d->m_widget->checkedFiles(); } -void VcsBaseSubmitEditor::setFileModel(QAbstractItemModel *m, const QString &repositoryDirectory) +void VcsBaseSubmitEditor::setFileModel(SubmitFileModel *m, const QString &repositoryDirectory) { d->m_widget->setFileModel(m); @@ -495,8 +486,7 @@ void VcsBaseSubmitEditor::setFileModel(QAbstractItemModel *m, const QString &rep // Iterate over the files and get interesting symbols for (int row = 0; row < m->rowCount(); ++row) { - const QString fileName = m->data(m->index(row, d->m_widget->fileNameColumn())).toString(); - const QFileInfo fileInfo(repositoryDirectory, fileName); + const QFileInfo fileInfo(repositoryDirectory, m->file(row)); // Add file name uniqueSymbols.insert(fileInfo.fileName()); @@ -539,7 +529,7 @@ void VcsBaseSubmitEditor::setFileModel(QAbstractItemModel *m, const QString &rep } } -QAbstractItemModel *VcsBaseSubmitEditor::fileModel() const +SubmitFileModel *VcsBaseSubmitEditor::fileModel() const { return d->m_widget->fileModel(); } diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.h b/src/plugins/vcsbase/vcsbasesubmiteditor.h index 75f8615f86b..eaeba204288 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.h +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.h @@ -38,7 +38,6 @@ QT_BEGIN_NAMESPACE class QIcon; -class QAbstractItemModel; class QAction; QT_END_NAMESPACE @@ -48,6 +47,7 @@ namespace Internal { } struct VcsBaseSubmitEditorPrivate; class SubmitEditorWidget; +class SubmitFileModel; class VCSBASE_EXPORT VcsBaseSubmitEditorParameters { @@ -61,7 +61,6 @@ public: class VCSBASE_EXPORT VcsBaseSubmitEditor : public Core::IEditor { Q_OBJECT - Q_PROPERTY(int fileNameColumn READ fileNameColumn WRITE setFileNameColumn DESIGNABLE false) Q_PROPERTY(QAbstractItemView::SelectionMode fileListSelectionMode READ fileListSelectionMode WRITE setFileListSelectionMode DESIGNABLE true) Q_PROPERTY(bool lineWrap READ lineWrap WRITE setLineWrap DESIGNABLE true) Q_PROPERTY(int lineWrapWidth READ lineWrapWidth WRITE setLineWrapWidth DESIGNABLE true) @@ -94,9 +93,6 @@ public: bool forcePrompt = false, bool canCommitOnFailure = true) const; - int fileNameColumn() const; - void setFileNameColumn(int c); - QAbstractItemView::SelectionMode fileListSelectionMode() const; void setFileListSelectionMode(QAbstractItemView::SelectionMode sm); @@ -131,8 +127,8 @@ public: QStringList checkedFiles() const; - void setFileModel(QAbstractItemModel *m, const QString &repositoryDirectory = QString()); - QAbstractItemModel *fileModel() const; + void setFileModel(SubmitFileModel *m, const QString &repositoryDirectory = QString()); + SubmitFileModel *fileModel() const; virtual void updateFileModel() { } // Utilities returning some predefined icons for actions -- GitLab