Vcs: fix missing icons in SubmitFileModel

In SubmitFileModel, filetype icons are missing for not "overlaid" icons in
Core::FileIconProvider. This is fixed by ensuring valid file paths are passed
to QFileInfo. VcsBase::SubmitFileModel has now a "repositoryRoot" property
so it can constructs absolute file paths.

VcsBaseSubmitEditor::setFileModel() now relies on SubmitFileModel::repositoryRoot()
instead of passing this info as annex parameter.

Change-Id: Ie045c3a7b247a5b5d48d10aaaf67cb3fdcf9fa7e
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
Hugues Delorme
2015-03-09 17:10:25 +01:00
parent b1a71f7b96
commit 20a0b97e82
9 changed files with 43 additions and 16 deletions

View File

@@ -61,8 +61,9 @@ void CommitEditor::setFields(const QString &repositoryRoot,
bazaarWidget->setFields(branch, userName, email); bazaarWidget->setFields(branch, userName, email);
m_fileModel = new VcsBase::SubmitFileModel(this); m_fileModel = new VcsBase::SubmitFileModel(this);
m_fileModel->setRepositoryRoot(repositoryRoot);
foreach (const VcsBase::VcsBaseClient::StatusItem &item, repoStatus) foreach (const VcsBase::VcsBaseClient::StatusItem &item, repoStatus)
if (item.flags != QLatin1String("Unknown")) if (item.flags != QLatin1String("Unknown"))
m_fileModel->addFile(item.file, item.flags); m_fileModel->addFile(item.file, item.flags);
setFileModel(m_fileModel, repositoryRoot); setFileModel(m_fileModel);
} }

View File

@@ -58,11 +58,12 @@ void ClearCaseSubmitEditor::setStatusList(const QStringList &statusOutput)
{ {
typedef QStringList::const_iterator ConstIterator; typedef QStringList::const_iterator ConstIterator;
auto model = new VcsBase::SubmitFileModel(this); auto model = new VcsBase::SubmitFileModel(this);
model->setRepositoryRoot(checkScriptWorkingDirectory());
const ConstIterator cend = statusOutput.constEnd(); const ConstIterator cend = statusOutput.constEnd();
for (ConstIterator it = statusOutput.constBegin(); it != cend; ++it) for (ConstIterator it = statusOutput.constBegin(); it != cend; ++it)
model->addFile(*it, QLatin1String("C")); model->addFile(*it, QLatin1String("C"));
setFileModel(model, checkScriptWorkingDirectory()); setFileModel(model);
if (statusOutput.count() > 1) if (statusOutput.count() > 1)
submitEditorWidget()->addKeep(); submitEditorWidget()->addKeep();
} }

View File

@@ -174,6 +174,7 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
setEmptyFileListEnabled(m_commitType == AmendCommit); // Allow for just correcting the message setEmptyFileListEnabled(m_commitType == AmendCommit); // Allow for just correcting the message
m_model = new GitSubmitFileModel(this); m_model = new GitSubmitFileModel(this);
m_model->setRepositoryRoot(d.panelInfo.repository);
if (!d.files.isEmpty()) { if (!d.files.isEmpty()) {
for (QList<CommitData::StateFilePair>::const_iterator it = d.files.constBegin(); for (QList<CommitData::StateFilePair>::const_iterator it = d.files.constBegin();
it != d.files.constEnd(); ++it) { it != d.files.constEnd(); ++it) {
@@ -192,7 +193,7 @@ void GitSubmitEditor::setCommitData(const CommitData &d)
QVariant(static_cast<int>(state))); QVariant(static_cast<int>(state)));
} }
} }
setFileModel(m_model, d.panelInfo.repository); setFileModel(m_model);
} }
void GitSubmitEditor::slotDiffSelected(const QList<int> &rows) void GitSubmitEditor::slotDiffSelected(const QList<int> &rows)

View File

@@ -64,6 +64,7 @@ void CommitEditor::setFields(const QFileInfo &repositoryRoot, const QString &bra
mercurialWidget->setFields(repositoryRoot.absoluteFilePath(), branch, userName, email); mercurialWidget->setFields(repositoryRoot.absoluteFilePath(), branch, userName, email);
fileModel = new SubmitFileModel(this); fileModel = new SubmitFileModel(this);
fileModel->setRepositoryRoot(repositoryRoot.absoluteFilePath());
QStringList shouldTrack; QStringList shouldTrack;
@@ -74,8 +75,7 @@ void CommitEditor::setFields(const QFileInfo &repositoryRoot, const QString &bra
fileModel->addFile(item.file, item.flags, Unchecked); fileModel->addFile(item.file, item.flags, Unchecked);
} }
VcsBaseSubmitEditor::filterUntrackedFilesOfProject(repositoryRoot.absoluteFilePath(), VcsBaseSubmitEditor::filterUntrackedFilesOfProject(fileModel->repositoryRoot(), &shouldTrack);
&shouldTrack);
foreach (const QString &track, shouldTrack) { foreach (const QString &track, shouldTrack) {
foreach (const VcsBaseClient::StatusItem &item, repoStatus) { foreach (const VcsBaseClient::StatusItem &item, repoStatus) {
@@ -84,7 +84,7 @@ void CommitEditor::setFields(const QFileInfo &repositoryRoot, const QString &bra
} }
} }
setFileModel(fileModel, repositoryRoot.absoluteFilePath()); setFileModel(fileModel);
} }
QString CommitEditor::committerInfo() QString CommitEditor::committerInfo()

View File

@@ -47,13 +47,14 @@ void SubversionSubmitEditor::setStatusList(const QList<StatusFilePair> &statusOu
{ {
typedef QList<StatusFilePair>::const_iterator ConstIterator; typedef QList<StatusFilePair>::const_iterator ConstIterator;
auto model = new VcsBase::SubmitFileModel(this); auto model = new VcsBase::SubmitFileModel(this);
// Hack to allow completion in "description" field : completion needs a root repository, the
// checkScriptWorkingDirectory property is fine (at this point it was set by SubversionPlugin)
model->setRepositoryRoot(checkScriptWorkingDirectory());
const ConstIterator cend = statusOutput.constEnd(); const ConstIterator cend = statusOutput.constEnd();
for (ConstIterator it = statusOutput.constBegin(); it != cend; ++it) for (ConstIterator it = statusOutput.constBegin(); it != cend; ++it)
model->addFile(it->second, it->first); model->addFile(it->second, it->first);
// Hack to allow completion in "description" field : completion needs a root repository, the setFileModel(model);
// checkScriptWorkingDirectory property is fine (at this point it was set by SubversionPlugin)
setFileModel(model, this->checkScriptWorkingDirectory());
} }
QByteArray SubversionSubmitEditor::fileContents() const QByteArray SubversionSubmitEditor::fileContents() const

View File

@@ -45,8 +45,11 @@ namespace VcsBase {
enum { fileColumn = 1 }; enum { fileColumn = 1 };
static QList<QStandardItem *> createFileRow(const QString &fileName, const QString &status, static QList<QStandardItem *> createFileRow(const QString &repositoryRoot,
CheckMode checked, const QVariant &v) const QString &fileName,
const QString &status,
CheckMode checked,
const QVariant &v)
{ {
auto statusItem = new QStandardItem(status); auto statusItem = new QStandardItem(status);
Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled; Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
@@ -58,7 +61,11 @@ static QList<QStandardItem *> createFileRow(const QString &fileName, const QStri
statusItem->setData(v); statusItem->setData(v);
auto fileItem = new QStandardItem(fileName); auto fileItem = new QStandardItem(fileName);
fileItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); fileItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
fileItem->setIcon(Core::FileIconProvider::icon(fileName)); // For some reason, Windows (at least) requires a valid (existing) file path to the icon, so
// the repository root is needed here.
// Note: for "overlaid" icons in Core::FileIconProvider a valid file path is not required
const QFileInfo fi(repositoryRoot + QLatin1Char('/') + fileName);
fileItem->setIcon(Core::FileIconProvider::icon(fi));
QList<QStandardItem *> row; QList<QStandardItem *> row;
row << statusItem << fileItem; row << statusItem << fileItem;
return row; return row;
@@ -86,10 +93,20 @@ SubmitFileModel::SubmitFileModel(QObject *parent) :
setHorizontalHeaderLabels(headerLabels); setHorizontalHeaderLabels(headerLabels);
} }
const QString &SubmitFileModel::repositoryRoot() const
{
return m_repositoryRoot;
}
void SubmitFileModel::setRepositoryRoot(const QString &repoRoot)
{
m_repositoryRoot = repoRoot;
}
QList<QStandardItem *> SubmitFileModel::addFile(const QString &fileName, const QString &status, CheckMode checkMode, QList<QStandardItem *> SubmitFileModel::addFile(const QString &fileName, const QString &status, CheckMode checkMode,
const QVariant &v) const QVariant &v)
{ {
const QList<QStandardItem *> row = createFileRow(fileName, status, checkMode, v); const QList<QStandardItem *> row = createFileRow(m_repositoryRoot, fileName, status, checkMode, v);
appendRow(row); appendRow(row);
return row; return row;
} }

View File

@@ -50,6 +50,9 @@ class VCSBASE_EXPORT SubmitFileModel : public QStandardItemModel
public: public:
explicit SubmitFileModel(QObject *parent = 0); explicit SubmitFileModel(QObject *parent = 0);
const QString &repositoryRoot() const;
void setRepositoryRoot(const QString &repoRoot);
// Convenience to create and add rows containing a file plus status text. // Convenience to create and add rows containing a file plus status text.
QList<QStandardItem *> addFile(const QString &fileName, const QString &status = QString(), QList<QStandardItem *> addFile(const QString &fileName, const QString &status = QString(),
CheckMode checkMode = Checked, const QVariant &data = QVariant()); CheckMode checkMode = Checked, const QVariant &data = QVariant());
@@ -69,6 +72,9 @@ public:
unsigned int filterFiles(const QStringList &filter); unsigned int filterFiles(const QStringList &filter);
virtual void updateSelections(SubmitFileModel *source); virtual void updateSelections(SubmitFileModel *source);
private:
QString m_repositoryRoot;
}; };
} // namespace VcsBase } // namespace VcsBase

View File

@@ -432,7 +432,7 @@ QStringList VcsBaseSubmitEditor::checkedFiles() const
return d->m_widget->checkedFiles(); return d->m_widget->checkedFiles();
} }
void VcsBaseSubmitEditor::setFileModel(SubmitFileModel *model, const QString &repositoryDirectory) void VcsBaseSubmitEditor::setFileModel(SubmitFileModel *model)
{ {
QTC_ASSERT(model, return); QTC_ASSERT(model, return);
if (SubmitFileModel *oldModel = d->m_widget->fileModel()) { if (SubmitFileModel *oldModel = d->m_widget->fileModel()) {
@@ -446,7 +446,7 @@ void VcsBaseSubmitEditor::setFileModel(SubmitFileModel *model, const QString &re
// Iterate over the files and get interesting symbols // Iterate over the files and get interesting symbols
for (int row = 0; row < model->rowCount(); ++row) { for (int row = 0; row < model->rowCount(); ++row) {
const QFileInfo fileInfo(repositoryDirectory, model->file(row)); const QFileInfo fileInfo(model->repositoryRoot(), model->file(row));
// Add file name // Add file name
uniqueSymbols.insert(fileInfo.fileName()); uniqueSymbols.insert(fileInfo.fileName());

View File

@@ -121,7 +121,7 @@ public:
QStringList checkedFiles() const; QStringList checkedFiles() const;
void setFileModel(SubmitFileModel *m, const QString &repositoryDirectory = QString()); void setFileModel(SubmitFileModel *m);
SubmitFileModel *fileModel() const; SubmitFileModel *fileModel() const;
virtual void updateFileModel() { } virtual void updateFileModel() { }
QStringList rowsToFiles(const QList<int> &rows) const; QStringList rowsToFiles(const QList<int> &rows) const;