QmlDesigner: Show warning icons for each file

Task-number: QDS-3797
Change-Id: Ibcbed1a221e762e0e6a3b4f9f538b8e4b1f144d3
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Tapani Mattila
2021-08-20 16:20:20 +03:00
committed by Thomas Hartmann
parent 0588161edd
commit 4c50ec85b7
5 changed files with 110 additions and 2 deletions

View File

@@ -228,7 +228,7 @@ QVariant FlatModel::data(const QModelIndex &index, int role) const
} }
case Qt::DecorationRole: { case Qt::DecorationRole: {
if (!folderNode) if (!folderNode)
return Core::FileIconProvider::icon(node->filePath()); return node->asFileNode()->icon();
if (!project) if (!project)
return folderNode->icon(); return folderNode->icon();
static QIcon warnIcon = Utils::Icons::WARNING.icon(); static QIcon warnIcon = Utils::Icons::WARNING.icon();

View File

@@ -44,6 +44,7 @@
#include <utils/pointeralgorithm.h> #include <utils/pointeralgorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <utils/utilsicons.h>
#include <QDir> #include <QDir>
#include <QFileInfo> #include <QFileInfo>
@@ -252,6 +253,35 @@ bool Node::isEnabled() const
return parent ? parent->isEnabled() : true; return parent ? parent->isEnabled() : true;
} }
QIcon FileNode::icon() const
{
if (hasError())
return Utils::Icons::WARNING.icon();
if (m_icon.isNull())
m_icon = Core::FileIconProvider::icon(filePath());
return m_icon;
}
void FileNode::setIcon(const QIcon icon)
{
m_icon = icon;
}
bool FileNode::hasError() const
{
return m_hasError;
}
void FileNode::setHasError(bool error)
{
m_hasError = error;
}
void FileNode::setHasError(bool error) const
{
m_hasError = error;
}
/*! /*!
Returns \c true if the file is automatically generated by a compile step. Returns \c true if the file is automatically generated by a compile step.
*/ */

View File

@@ -218,8 +218,17 @@ public:
bool supportsAction(ProjectAction action, const Node *node) const override; bool supportsAction(ProjectAction action, const Node *node) const override;
QString displayName() const override; QString displayName() const override;
bool hasError() const;
void setHasError(const bool error);
void setHasError(const bool error) const;
QIcon icon() const;
void setIcon(const QIcon icon);
private: private:
FileType m_fileType; FileType m_fileType;
mutable QIcon m_icon;
mutable bool m_hasError = false;
}; };
// Documentation inside. // Documentation inside.

View File

@@ -46,6 +46,10 @@
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <projectexplorer/project.h>
#include <projectexplorer/session.h>
#include <projectexplorer/projectnodes.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/icon.h> #include <utils/icon.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
@@ -169,6 +173,28 @@ void NavigatorView::modelAttached(Model *model)
} }
} }
}); });
clearExplorerWarnings();
}
void NavigatorView::clearExplorerWarnings()
{
QList<ModelNode> allNodes;
addNodeAndSubModelNodesToList(rootModelNode(), allNodes);
for (ModelNode node : allNodes) {
if (node.metaInfo().isFileComponent()) {
const ProjectExplorer::FileNode *fnode = fileNodeForModelNode(node);
fnode->setHasError(false);
}
}
}
void NavigatorView::addNodeAndSubModelNodesToList(const ModelNode &node, QList<ModelNode> &nodes)
{
nodes.append(node);
for (ModelNode subNode : node.allSubModelNodes()) {
addNodeAndSubModelNodesToList(subNode, nodes);
}
} }
void NavigatorView::modelAboutToBeDetached(Model *model) void NavigatorView::modelAboutToBeDetached(Model *model)
@@ -342,8 +368,10 @@ void NavigatorView::auxiliaryDataChanged(const ModelNode &modelNode,
void NavigatorView::instanceErrorChanged(const QVector<ModelNode> &errorNodeList) void NavigatorView::instanceErrorChanged(const QVector<ModelNode> &errorNodeList)
{ {
for (const ModelNode &modelNode : errorNodeList) for (const ModelNode &modelNode : errorNodeList) {
m_currentModelInterface->notifyDataChanged(modelNode); m_currentModelInterface->notifyDataChanged(modelNode);
propagateInstanceErrorToExplorer(modelNode);
}
} }
void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty) void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty)
@@ -374,6 +402,41 @@ QAbstractItemModel *NavigatorView::currentModel() const
return treeWidget()->model(); return treeWidget()->model();
} }
const ProjectExplorer::FileNode *NavigatorView::fileNodeForModelNode(const ModelNode &node) const
{
QString filename = node.metaInfo().componentFileName();
Utils::FilePath filePath = Utils::FilePath::fromString(filename);
ProjectExplorer::Project *currentProject = ProjectExplorer::SessionManager::projectForFile(filePath);
return currentProject->nodeForFilePath(filePath)->asFileNode();
}
const ProjectExplorer::FileNode *NavigatorView::fileNodeForIndex(const QModelIndex &index) const
{
if (index.isValid() && currentModel()->data(index, Qt::UserRole).isValid()) {
ModelNode node = modelNodeForIndex(index);
if (node.metaInfo().isFileComponent()) {
return fileNodeForModelNode(node);
}
}
return nullptr;
}
void NavigatorView::propagateInstanceErrorToExplorer(const ModelNode &modelNode) {
QModelIndex index = indexForModelNode(modelNode);;
do {
const ProjectExplorer::FileNode *fnode = fileNodeForIndex(index);
if (fnode) {
fnode->setHasError(true);
return;
}
else {
index = index.parent();
}
} while (index.isValid());
}
void NavigatorView::leftButtonClicked() void NavigatorView::leftButtonClicked()
{ {
if (selectedModelNodes().count() > 1) if (selectedModelNodes().count() > 1)

View File

@@ -28,6 +28,7 @@
#include "navigatormodelinterface.h" #include "navigatormodelinterface.h"
#include <abstractview.h> #include <abstractview.h>
#include <projectexplorer/projectnodes.h>
#include <QPointer> #include <QPointer>
#include <QHash> #include <QHash>
@@ -108,6 +109,7 @@ private:
void changeToComponent(const QModelIndex &index); void changeToComponent(const QModelIndex &index);
QModelIndex indexForModelNode(const ModelNode &modelNode) const; QModelIndex indexForModelNode(const ModelNode &modelNode) const;
QAbstractItemModel *currentModel() const; QAbstractItemModel *currentModel() const;
void propagateInstanceErrorToExplorer(const ModelNode &modelNode);
void leftButtonClicked(); void leftButtonClicked();
void rightButtonClicked(); void rightButtonClicked();
@@ -123,6 +125,10 @@ protected: //functions
void expandAncestors(const QModelIndex &index); void expandAncestors(const QModelIndex &index);
void reparentAndCatch(NodeAbstractProperty property, const ModelNode &modelNode); void reparentAndCatch(NodeAbstractProperty property, const ModelNode &modelNode);
void setupWidget(); void setupWidget();
void addNodeAndSubModelNodesToList(const ModelNode &node, QList<ModelNode> &nodes);
void clearExplorerWarnings();
const ProjectExplorer::FileNode *fileNodeForModelNode(const ModelNode &node) const;
const ProjectExplorer::FileNode *fileNodeForIndex(const QModelIndex &index) const;
private: private:
bool m_blockSelectionChangedSignal; bool m_blockSelectionChangedSignal;