diff options
-rw-r--r-- | src/plugins/git/gitsubmiteditor.cpp | 56 | ||||
-rw-r--r-- | src/plugins/vcsbase/submitfilemodel.cpp | 24 | ||||
-rw-r--r-- | src/plugins/vcsbase/submitfilemodel.h | 2 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbasesubmiteditor.cpp | 5 |
4 files changed, 62 insertions, 25 deletions
diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp index c5e9a6a1e1..51e9121364 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -45,6 +45,36 @@ namespace Git { namespace Internal { +class GitSubmitFileModel : public VcsBase::SubmitFileModel +{ +public: + GitSubmitFileModel(QObject *parent = 0) : VcsBase::SubmitFileModel(parent) + { } + + virtual void updateSelections(SubmitFileModel *source) + { + int j = 0; + for (int i = 0; i < rowCount() && j < source->rowCount(); ++i) { + CommitData::StateFilePair stateFile = stateFilePair(i); + for (; j < source->rowCount(); ++j) { + CommitData::StateFilePair sourceStateFile = stateFilePair(j); + if (stateFile == sourceStateFile) { + setChecked(i, source->checked(j)); + break; + } else if (stateFile < sourceStateFile) { + break; + } + } + } + } + +private: + CommitData::StateFilePair stateFilePair(int row) + { + return CommitData::StateFilePair(static_cast<FileStates>(extraData(row).toInt()), file(row)); + } +}; + /* The problem with git is that no diff can be obtained to for a random * multiselection of staged/unstaged files; it requires the --cached * option for staged files. So, we sort apart the diff file lists @@ -63,25 +93,6 @@ GitSubmitEditorWidget *GitSubmitEditor::submitEditorWidget() return static_cast<GitSubmitEditorWidget *>(widget()); } -static void mergeFileModels(VcsBase::SubmitFileModel *model, const VcsBase::SubmitFileModel *source) -{ - int j = 0; - for (int i = 0; i < model->rowCount() && j < source->rowCount(); ++i) { - CommitData::StateFilePair stateFile( - static_cast<FileStates>(model->extraData(i).toInt()), model->file(i)); - for (; j < source->rowCount(); ++j) { - CommitData::StateFilePair sourceStateFile( - static_cast<FileStates>(source->extraData(j).toInt()), source->file(j)); - if (stateFile == sourceStateFile) { - model->setChecked(i, source->checked(j)); - break; - } else if (stateFile < sourceStateFile) { - break; - } - } - } -} - void GitSubmitEditor::setCommitData(const CommitData &d) { GitSubmitEditorWidget *w = submitEditorWidget(); @@ -92,8 +103,7 @@ void GitSubmitEditor::setCommitData(const CommitData &d) m_commitEncoding = d.commitEncoding; m_workingDirectory = d.panelInfo.repository; - VcsBase::SubmitFileModel *oldModel = m_model; - m_model = new VcsBase::SubmitFileModel(this); + m_model = new GitSubmitFileModel(this); if (!d.files.isEmpty()) { for (QList<CommitData::StateFilePair>::const_iterator it = d.files.constBegin(); it != d.files.constEnd(); ++it) { @@ -112,10 +122,6 @@ void GitSubmitEditor::setCommitData(const CommitData &d) QVariant(static_cast<int>(state))); } } - if (oldModel) { - mergeFileModels(m_model, oldModel); - delete oldModel; - } setFileModel(m_model, d.panelInfo.repository); } diff --git a/src/plugins/vcsbase/submitfilemodel.cpp b/src/plugins/vcsbase/submitfilemodel.cpp index ef5973c2a5..4056bfa55f 100644 --- a/src/plugins/vcsbase/submitfilemodel.cpp +++ b/src/plugins/vcsbase/submitfilemodel.cpp @@ -150,4 +150,28 @@ unsigned int SubmitFileModel::filterFiles(const QStringList &filter) return rc; } +/*! Updates user selections from \a source model. + * + * Assumption: Both model are sorted with the same order, and there + * are no duplicate entries. + */ +void SubmitFileModel::updateSelections(SubmitFileModel *source) +{ + Q_ASSERT(source); + int rows = rowCount(); + int sourceRows = source->rowCount(); + int lastMatched = 0; + for (int i = 0; i < rows; ++i) { + // Since both models are sorted with the same order, there is no need + // to test rows earlier than latest match found + for (int j = lastMatched; j < sourceRows; ++j) { + if (file(i) == source->file(j) && state(i) == source->state(j)) { + setChecked(i, source->checked(j)); + lastMatched = j + 1; // No duplicates, start on next entry + break; + } + } + } +} + } // namespace VcsBase diff --git a/src/plugins/vcsbase/submitfilemodel.h b/src/plugins/vcsbase/submitfilemodel.h index c5bd70383c..a1ff161977 100644 --- a/src/plugins/vcsbase/submitfilemodel.h +++ b/src/plugins/vcsbase/submitfilemodel.h @@ -65,6 +65,8 @@ public: // Filter for entries contained in the filter list. Returns the // number of deleted entries. unsigned int filterFiles(const QStringList &filter); + + virtual void updateSelections(SubmitFileModel *source); }; } // namespace VcsBase diff --git a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp index 94afcad584..0ac56720fd 100644 --- a/src/plugins/vcsbase/vcsbasesubmiteditor.cpp +++ b/src/plugins/vcsbase/vcsbasesubmiteditor.cpp @@ -479,6 +479,11 @@ QStringList VcsBaseSubmitEditor::checkedFiles() const void VcsBaseSubmitEditor::setFileModel(SubmitFileModel *m, const QString &repositoryDirectory) { + Q_ASSERT(m); + if (SubmitFileModel *oldModel = d->m_widget->fileModel()) { + m->updateSelections(oldModel); + delete oldModel; + } d->m_widget->setFileModel(m); QSet<QString> uniqueSymbols; |