summaryrefslogtreecommitdiff
path: root/src/plugins/qmldesigner/components/navigator
diff options
context:
space:
mode:
authorThomas Hartmann <Thomas.Hartmann@theqtcompany.com>2015-07-15 17:38:27 +0200
committerThomas Hartmann <Thomas.Hartmann@digia.com>2015-07-17 10:01:43 +0000
commit0546f805ef927ef99f7e7996b398825efa135ac1 (patch)
tree9f00a473fd4777d4bc261c23e80c5bbbf441a90f /src/plugins/qmldesigner/components/navigator
parent03aa367276a8bb88ea2845e478ffb681504e95a4 (diff)
downloadqt-creator-0546f805ef927ef99f7e7996b398825efa135ac1.tar.gz
QmlDesigner: Extending navigator
Add support for exporting items as a property of the root item. Show errors from the qml2puppet. Change-Id: Id3d05201a20fce24f20e66f101818ac2231f38ee Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
Diffstat (limited to 'src/plugins/qmldesigner/components/navigator')
-rw-r--r--src/plugins/qmldesigner/components/navigator/arrowdown.pngbin215 -> 317 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/arrowleft.pngbin273 -> 341 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/arrowright.pngbin267 -> 341 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/arrowup.pngbin194 -> 323 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/export_checked.pngbin0 -> 212 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/export_unchecked.pngbin0 -> 178 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/eye_closed.pngbin0 -> 350 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/eye_open.pngbin0 -> 501 bytes
-rw-r--r--src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp7
-rw-r--r--src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp110
-rw-r--r--src/plugins/qmldesigner/components/navigator/nameitemdelegate.h4
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigator.qrc5
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp135
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatortreemodel.h14
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.cpp30
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorview.h3
-rw-r--r--src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp8
-rw-r--r--src/plugins/qmldesigner/components/navigator/warning.pngbin0 -> 287 bytes
18 files changed, 200 insertions, 116 deletions
diff --git a/src/plugins/qmldesigner/components/navigator/arrowdown.png b/src/plugins/qmldesigner/components/navigator/arrowdown.png
index 7b25c8a783..1373966176 100644
--- a/src/plugins/qmldesigner/components/navigator/arrowdown.png
+++ b/src/plugins/qmldesigner/components/navigator/arrowdown.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/arrowleft.png b/src/plugins/qmldesigner/components/navigator/arrowleft.png
index ba12c59ff3..4a34318b3a 100644
--- a/src/plugins/qmldesigner/components/navigator/arrowleft.png
+++ b/src/plugins/qmldesigner/components/navigator/arrowleft.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/arrowright.png b/src/plugins/qmldesigner/components/navigator/arrowright.png
index 5b4cb1dfeb..b2f8bfde8b 100644
--- a/src/plugins/qmldesigner/components/navigator/arrowright.png
+++ b/src/plugins/qmldesigner/components/navigator/arrowright.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/arrowup.png b/src/plugins/qmldesigner/components/navigator/arrowup.png
index 3fd943b2f9..f9ef97a25c 100644
--- a/src/plugins/qmldesigner/components/navigator/arrowup.png
+++ b/src/plugins/qmldesigner/components/navigator/arrowup.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/export_checked.png b/src/plugins/qmldesigner/components/navigator/export_checked.png
new file mode 100644
index 0000000000..9021b7b086
--- /dev/null
+++ b/src/plugins/qmldesigner/components/navigator/export_checked.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/export_unchecked.png b/src/plugins/qmldesigner/components/navigator/export_unchecked.png
new file mode 100644
index 0000000000..36bb3d2bbc
--- /dev/null
+++ b/src/plugins/qmldesigner/components/navigator/export_unchecked.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/eye_closed.png b/src/plugins/qmldesigner/components/navigator/eye_closed.png
new file mode 100644
index 0000000000..5ba632573a
--- /dev/null
+++ b/src/plugins/qmldesigner/components/navigator/eye_closed.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/eye_open.png b/src/plugins/qmldesigner/components/navigator/eye_open.png
new file mode 100644
index 0000000000..3acdc9982a
--- /dev/null
+++ b/src/plugins/qmldesigner/components/navigator/eye_open.png
Binary files differ
diff --git a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp
index 7102c18153..cff03e70c4 100644
--- a/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp
+++ b/src/plugins/qmldesigner/components/navigator/iconcheckboxitemdelegate.cpp
@@ -79,7 +79,8 @@ void IconCheckboxItemDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &styleOption,
const QModelIndex &modelIndex) const
{
- const int offset = 2;
+ const int yOffset = (styleOption.rect.height() - onPixmap.height()) / 2;
+ const int xOffset = 2;
if (indexIsHolingModelNode(modelIndex)) {
painter->save();
if (styleOption.state & QStyle::State_Selected)
@@ -91,9 +92,9 @@ void IconCheckboxItemDelegate::paint(QPainter *painter,
painter->setOpacity(0.5);
if (isChecked(m_navigatorTreeModel, modelIndex))
- painter->drawPixmap(styleOption.rect.x() + offset, styleOption.rect.y() + offset, onPixmap);
+ painter->drawPixmap(styleOption.rect.x() + xOffset, styleOption.rect.y() + yOffset, onPixmap);
else
- painter->drawPixmap(styleOption.rect.x() + offset, styleOption.rect.y() + offset, offPixmap);
+ painter->drawPixmap(styleOption.rect.x() + xOffset, styleOption.rect.y() + yOffset, offPixmap);
}
painter->restore();
diff --git a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp
index 89346d56db..5e6c53f8fa 100644
--- a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp
+++ b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp
@@ -109,81 +109,37 @@ NameItemDelegate::NameItemDelegate(QObject *parent, NavigatorTreeModel *treeMode
{
}
-static QIcon getTypeIcon(const ModelNode &modelNode)
-{
- QIcon icon;
-
- if (modelNode.isValid()) {
- // if node has no own icon, search for it in the itemlibrary
- const ItemLibraryInfo *libraryInfo = modelNode.model()->metaInfo().itemLibraryInfo();
- QList <ItemLibraryEntry> itemLibraryEntryList = libraryInfo->entriesForType(modelNode.type(),
- modelNode.majorVersion(),
- modelNode.minorVersion());
- if (!itemLibraryEntryList.isEmpty())
- return itemLibraryEntryList.first().typeIcon();
- else if (modelNode.metaInfo().isValid())
- return QIcon(QStringLiteral(":/ItemLibrary/images/item-default-icon.png"));
- else
- return QIcon(QStringLiteral(":/ItemLibrary/images/item-invalid-icon.png"));
- }
-
- return QIcon(QStringLiteral(":/ItemLibrary/images/item-invalid-icon.png"));
-}
-
-static int drawTypeIcon(QPainter *painter,
- const QStyleOptionViewItem &styleOption,
- const QModelIndex &modelIndex,
- NavigatorTreeModel *navigatorTreeModel
- )
+static int drawIcon(QPainter *painter, const QStyleOptionViewItem &styleOption, const QModelIndex &modelIndex)
{
+ QIcon icon = modelIndex.data(Qt::DecorationRole).value<QIcon>();
int pixmapSize = 16;
- if (navigatorTreeModel->hasNodeForIndex(modelIndex)) {
- ModelNode modelNode = navigatorTreeModel->nodeForIndex(modelIndex);
-
- // If no icon is present, leave an empty space of 24 pixels anyway
- QPixmap pixmap = getTypeIcon(modelNode).pixmap(pixmapSize, pixmapSize);
- painter->drawPixmap(styleOption.rect.x() +1 , styleOption.rect.y() + 2, pixmap);
- }
+ QPixmap pixmap = icon.pixmap(pixmapSize, pixmapSize);
+ painter->drawPixmap(styleOption.rect.x() + 1 , styleOption.rect.y() + 2, pixmap);
return pixmapSize;
}
-static QString getDisplayString(const QModelIndex &modelIndex, NavigatorTreeModel *navigatorTreeModel)
-{
- ModelNode modelNode = navigatorTreeModel->nodeForIndex(modelIndex);
- if (modelNode.hasId())
- return modelNode.id();
-
- return modelNode.simplifiedTypeName();
-}
-
static QRect drawText(QPainter *painter,
const QStyleOptionViewItem &styleOption,
const QModelIndex &modelIndex,
- int iconOffset,
- NavigatorTreeModel *navigatorTreeModel)
+ int iconOffset)
{
- QString displayString;
+ QString displayString = modelIndex.data(Qt::DisplayRole).toString();
+ if (displayString.isEmpty())
+ displayString = modelIndex.data(NavigatorTreeModel::SimplifiedTypeNameRole).toString();
QPoint displayStringOffset;
int width = 0;
- if (navigatorTreeModel->hasNodeForIndex(modelIndex)) {
- if (navigatorTreeModel->isNodeInvisible( modelIndex ))
- painter->setOpacity(0.5);
-
- displayString = getDisplayString(modelIndex, navigatorTreeModel);
+ if (modelIndex.data(NavigatorTreeModel::InvisibleRole).toBool())
+ painter->setOpacity(0.5);
- // Check text length does not exceed available space
- int extraSpace = 12 + iconOffset;
+ // Check text length does not exceed available space
+ int extraSpace = 12 + iconOffset;
- displayString = styleOption.fontMetrics.elidedText(displayString, Qt::ElideMiddle, styleOption.rect.width() - extraSpace);
- displayStringOffset = QPoint(5 + iconOffset, -5);
- width = styleOption.fontMetrics.width(displayString);
- } else {
- displayString = modelIndex.data(Qt::DisplayRole).toString();
- displayStringOffset = QPoint(0, -2);
- }
+ displayString = styleOption.fontMetrics.elidedText(displayString, Qt::ElideMiddle, styleOption.rect.width() - extraSpace);
+ displayStringOffset = QPoint(5 + iconOffset, -5);
+ width = styleOption.fontMetrics.width(displayString);
QPoint textPosition = styleOption.rect.bottomLeft() + displayStringOffset;
painter->drawText(textPosition, displayString);
@@ -197,25 +153,17 @@ static QRect drawText(QPainter *painter,
static void drawRedWavyUnderLine(QPainter *painter,
const QStyleOptionViewItem &styleOption,
- const QModelIndex &modelIndex,
- const QRect &textFrame ,
- NavigatorTreeModel *navigatorTreeModel)
+ const QRect &textFrame)
{
- if (navigatorTreeModel->hasNodeForIndex(modelIndex)) {
- ModelNode modelNode = navigatorTreeModel->nodeForIndex(modelIndex);
-
- if (!modelNode.metaInfo().isValid()) {
- painter->translate(0, textFrame.y() + 1);
- QPen pen;
- pen.setColor(Qt::red);
- const qreal underlineOffset = styleOption.fontMetrics.underlinePos();
- const QPixmap wave = getWavyPixmap(qMax(underlineOffset, pen.widthF()), pen);
- const int descent = styleOption.fontMetrics.descent();
-
- painter->setBrushOrigin(painter->brushOrigin().x(), 0);
- painter->fillRect(textFrame.x(), 0, qCeil(textFrame.width()), qMin(wave.height(), descent), wave);
- }
- }
+ painter->translate(0, textFrame.y() + 1);
+ QPen pen;
+ pen.setColor(Qt::red);
+ const qreal underlineOffset = styleOption.fontMetrics.underlinePos();
+ const QPixmap wave = getWavyPixmap(qMax(underlineOffset, pen.widthF()), pen);
+ const int descent = styleOption.fontMetrics.descent();
+
+ painter->setBrushOrigin(painter->brushOrigin().x(), 0);
+ painter->fillRect(textFrame.x(), 0, qCeil(textFrame.width()), qMin(wave.height(), descent), wave);
}
void NameItemDelegate::paint(QPainter *painter,
@@ -223,15 +171,15 @@ void NameItemDelegate::paint(QPainter *painter,
const QModelIndex &modelIndex) const
{
painter->save();
-
if (styleOption.state & QStyle::State_Selected)
NavigatorTreeView::drawSelectionBackground(painter, styleOption);
- int iconOffset = drawTypeIcon(painter, styleOption, modelIndex, m_navigatorTreeModel);
+ int iconOffset = drawIcon(painter, styleOption, modelIndex);
- QRect textFrame = drawText(painter, styleOption, modelIndex, iconOffset, m_navigatorTreeModel);
+ QRect textFrame = drawText(painter, styleOption, modelIndex, iconOffset);
- drawRedWavyUnderLine(painter, styleOption, modelIndex, textFrame, m_navigatorTreeModel);
+ if (modelIndex.data(NavigatorTreeModel::ErrorRole).toBool())
+ drawRedWavyUnderLine(painter, styleOption, textFrame);
painter->restore();
}
diff --git a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h
index 2ebf616972..7471366f28 100644
--- a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h
+++ b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.h
@@ -42,8 +42,8 @@ class NameItemDelegate : public QStyledItemDelegate
public:
explicit NameItemDelegate(QObject *parent, NavigatorTreeModel *treeModel);
- void paint(QPainter *painter,
- const QStyleOptionViewItem &option, const QModelIndex &index) const;
+ void paint(QPainter *painter, const QStyleOptionViewItem &styleOption,
+ const QModelIndex &index) const;
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
diff --git a/src/plugins/qmldesigner/components/navigator/navigator.qrc b/src/plugins/qmldesigner/components/navigator/navigator.qrc
index 4b911febf9..e0ae5883bf 100644
--- a/src/plugins/qmldesigner/components/navigator/navigator.qrc
+++ b/src/plugins/qmldesigner/components/navigator/navigator.qrc
@@ -4,5 +4,10 @@
<file>arrowleft.png</file>
<file>arrowright.png</file>
<file>arrowup.png</file>
+ <file>export_checked.png</file>
+ <file>export_unchecked.png</file>
+ <file>eye_open.png</file>
+ <file>eye_closed.png</file>
+ <file>warning.png</file>
</qresource>
</RCC>
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
index b13caac130..c87d606c64 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
@@ -30,6 +30,7 @@
#include "navigatortreemodel.h"
+#include <bindingproperty.h>
#include <nodeabstractproperty.h>
#include <nodelistproperty.h>
#include <nodeproperty.h>
@@ -261,21 +262,41 @@ static inline QString msgUnknownItem(const QString &t)
return NavigatorTreeModel::tr("Unknown item: %1").arg(t);
}
-ItemRow NavigatorTreeModel::createItemRow(const ModelNode &node)
+static QIcon getTypeIcon(const ModelNode &modelNode)
{
- Q_ASSERT(node.isValid());
+ if (modelNode.isValid()) {
+ // if node has no own icon, search for it in the itemlibrary
+ const ItemLibraryInfo *libraryInfo = modelNode.model()->metaInfo().itemLibraryInfo();
+ QList <ItemLibraryEntry> itemLibraryEntryList = libraryInfo->entriesForType(
+ modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion());
+ if (!itemLibraryEntryList.isEmpty())
+ return itemLibraryEntryList.first().typeIcon();
+ else if (modelNode.metaInfo().isValid())
+ return QIcon(QStringLiteral(":/ItemLibrary/images/item-default-icon.png"));
+ }
- const bool dropEnabled = node.metaInfo().isValid();
+ return QIcon(QStringLiteral(":/ItemLibrary/images/item-invalid-icon.png"));
+}
+
+ItemRow NavigatorTreeModel::createItemRow(const ModelNode &modelNode)
+{
+ Q_ASSERT(modelNode.isValid());
+
+ const bool dropEnabled = modelNode.metaInfo().isValid();
QStandardItem *idItem = new QStandardItem;
idItem->setDragEnabled(true);
idItem->setDropEnabled(dropEnabled);
idItem->setEditable(true);
- idItem->setData(node.internalId(), InternalIdRole);
- if (node.metaInfo().isValid())
- idItem->setToolTip(node.type());
+ idItem->setData(modelNode.internalId(), InternalIdRole);
+ idItem->setData(modelNode.simplifiedTypeName(), SimplifiedTypeNameRole);
+ if (modelNode.hasId())
+ idItem->setText(modelNode.id());
+ idItem->setIcon(getTypeIcon(modelNode));
+ if (modelNode.metaInfo().isValid())
+ idItem->setToolTip(QString::fromLatin1(modelNode.type()));
else
- idItem->setToolTip(msgUnknownItem(node.type()));
+ idItem->setToolTip(msgUnknownItem(QString::fromLatin1(modelNode.type())));
# ifdef _LOCK_ITEMS_
QStandardItem *lockItem = new QStandardItem;
lockItem->setDragEnabled(true);
@@ -285,12 +306,24 @@ ItemRow NavigatorTreeModel::createItemRow(const ModelNode &node)
lockItem->setData(hash, NavigatorRole);
# endif
+ QStandardItem *exportItem = new QStandardItem;
+ exportItem->setDropEnabled(dropEnabled);
+ exportItem->setCheckable(true);
+ exportItem->setEditable(false);
+ exportItem->setData(modelNode.internalId(), InternalIdRole);
+ exportItem->setToolTip(tr("Toggles whether this item is exported as an "
+ "alias property of the root item."));
+ if (modelNode.isRootNode())
+ exportItem->setCheckable(false);
+
QStandardItem *visibilityItem = new QStandardItem;
visibilityItem->setDropEnabled(dropEnabled);
visibilityItem->setCheckable(true);
visibilityItem->setEditable(false);
- visibilityItem->setData(node.internalId(), InternalIdRole);
- if (node.isRootNode())
+ visibilityItem->setData(modelNode.internalId(), InternalIdRole);
+ visibilityItem->setToolTip(tr("Toggles the visibility of this item in the form editor.\n"
+ "This is independent of the visibility property in QML."));
+ if (modelNode.isRootNode())
visibilityItem->setCheckable(false);
QMap<QString, QStandardItem *> propertyItems;
@@ -310,25 +343,55 @@ ItemRow NavigatorTreeModel::createItemRow(const ModelNode &node)
# ifdef _LOCK_ITEMS_
ItemRow newRow = ItemRow(idItem, lockItem, visibilityItem, propertyItems);
# else
- ItemRow newRow = ItemRow(idItem, visibilityItem, propertyItems);
+ ItemRow newRow = ItemRow(idItem, exportItem, visibilityItem, propertyItems);
# endif
- m_nodeItemHash.insert(node, newRow);
- updateItemRow(node, newRow);
+ m_nodeItemHash.insert(modelNode, newRow);
+ updateItemRow(modelNode, newRow);
return newRow;
}
-void NavigatorTreeModel::updateItemRow(const ModelNode &node, ItemRow items)
+static bool isModelNodeExported(const ModelNode &modelNode)
+{
+ if (!modelNode.id().isEmpty()) {
+ PropertyName modelNodeId = modelNode.id().toLatin1();
+ ModelNode rootModelNode = modelNode.view()->rootModelNode();
+ Q_ASSERT(rootModelNode.isValid());
+ if (rootModelNode.hasBindingProperty(modelNodeId)
+ && rootModelNode.bindingProperty(modelNodeId).isDynamic()
+ && rootModelNode.bindingProperty(modelNodeId).expression().toLatin1() == modelNodeId)
+ return true;
+ }
+
+ return false;
+}
+
+void NavigatorTreeModel::updateItemRow(const ModelNode &modelNode, ItemRow items)
{
bool blockSignal = blockItemChangedSignal(true);
- items.idItem->setText(node.id());
- items.visibilityItem->setCheckState(node.auxiliaryData("invisible").toBool() ? Qt::Unchecked : Qt::Checked);
- if (node.metaInfo().isValid())
- items.idItem->setToolTip(node.type());
- else
- items.idItem->setToolTip(msgUnknownItem(node.type()));
+ items.idItem->setText(modelNode.id());
+ items.idItem->setData(modelNode.simplifiedTypeName(), SimplifiedTypeNameRole);
+
+ bool isInvisible = modelNode.auxiliaryData("invisible").toBool();
+ items.idItem->setData(isInvisible, InvisibleRole);
+
+ items.visibilityItem->setCheckState(isInvisible ? Qt::Unchecked : Qt::Checked);
+ items.exportItem->setCheckState(isModelNodeExported(modelNode) ? Qt::Checked : Qt::Unchecked);
+
+ QmlObjectNode currentQmlObjectNode(modelNode);
+ if (currentQmlObjectNode.hasError()) {
+ items.idItem->setData(true, ErrorRole);
+ items.idItem->setToolTip(currentQmlObjectNode.error());
+ items.idItem->setIcon(QIcon(":/navigator/icon/warning.png"));
+ } else {
+ items.idItem->setData(false, ErrorRole);
+ if (modelNode.metaInfo().isValid())
+ items.idItem->setToolTip(QString::fromLatin1(modelNode.type()));
+ else
+ items.idItem->setToolTip(msgUnknownItem(QString::fromLatin1(modelNode.type())));
+ }
blockItemChangedSignal(blockSignal);
}
@@ -365,6 +428,30 @@ void NavigatorTreeModel::handleChangedIdItem(QStandardItem *idItem, ModelNode &m
}
}
+void NavigatorTreeModel::handleChangedExportItem(QStandardItem *exportItem, ModelNode &modelNode)
+{
+ bool exported = (exportItem->checkState() == Qt::Checked);
+
+ ModelNode rootModelNode = m_view->rootModelNode();
+ Q_ASSERT(rootModelNode.isValid());
+ PropertyName modelNodeId = modelNode.id().toLatin1();
+ if (rootModelNode.hasProperty(modelNodeId))
+ rootModelNode.removeProperty(modelNodeId);
+ if (exported) {
+
+ try {
+ RewriterTransaction transaction =
+ m_view->beginRewriterTransaction(QByteArrayLiteral("NavigatorTreeModel:exportItem"));
+
+ modelNode.validId();
+ modelNodeId = modelNode.id().toLatin1();
+ rootModelNode.bindingProperty(modelNodeId).setDynamicTypeNameAndExpression("alias", modelNodeId);
+ } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail
+ exception.showException();
+ }
+ }
+}
+
void NavigatorTreeModel::handleChangedVisibilityItem(QStandardItem *visibilityItem, ModelNode &modelNode)
{
bool invisible = (visibilityItem->checkState() == Qt::Unchecked);
@@ -383,6 +470,8 @@ void NavigatorTreeModel::handleChangedItem(QStandardItem *item)
ItemRow itemRow = itemRowForNode(modelNode);
if (item == itemRow.idItem) {
handleChangedIdItem(item, modelNode);
+ } else if (item == itemRow.exportItem) {
+ handleChangedExportItem(item, modelNode);
} else if (item == itemRow.visibilityItem) {
handleChangedVisibilityItem(item, modelNode);
}
@@ -731,6 +820,14 @@ void NavigatorTreeModel::setVisible(const QModelIndex &index, bool visible)
itemRow.visibilityItem->setCheckState(visible ? Qt::Checked : Qt::Unchecked);
}
+void NavigatorTreeModel::setExported(const QModelIndex &index, bool exported)
+{
+ ModelNode node = nodeForIndex(index);
+ ItemRow itemRow = itemRowForNode(node);
+ itemRow.exportItem->setCheckState(exported ? Qt::Checked : Qt::Unchecked);
+}
+
+
void NavigatorTreeModel::openContextMenu(const QPoint &position)
{
ModelNodeContextMenu::showContextMenu(m_view.data(), position, QPoint(), false);
diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
index d0ac58a662..933068fc4d 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.h
@@ -64,14 +64,15 @@ class ModelNode;
struct ItemRow {
ItemRow()
: idItem(0), visibilityItem(0) {}
- ItemRow(QStandardItem *id, QStandardItem *visibility, const QMap<QString, QStandardItem *> &properties)
- : idItem(id), visibilityItem(visibility), propertyItems(properties) {}
+ ItemRow(QStandardItem *id, QStandardItem *exportI, QStandardItem *visibility, const QMap<QString, QStandardItem *> &properties)
+ : idItem(id), exportItem(exportI), visibilityItem(visibility), propertyItems(properties) {}
QList<QStandardItem*> toList() const {
- return QList<QStandardItem*>() << idItem << visibilityItem;
+ return QList<QStandardItem*>() << idItem << exportItem << visibilityItem;
}
QStandardItem *idItem;
+ QStandardItem *exportItem;
QStandardItem *visibilityItem;
QMap<QString, QStandardItem *> propertyItems;
};
@@ -83,7 +84,10 @@ class NavigatorTreeModel : public QStandardItemModel
public:
enum {
- InternalIdRole = Qt::UserRole
+ InternalIdRole = Qt::UserRole
+ ,InvisibleRole = Qt::UserRole + 1
+ ,SimplifiedTypeNameRole = Qt::UserRole + 2
+ ,ErrorRole = Qt::UserRole + 3
};
@@ -117,6 +121,7 @@ public:
void updateItemRow(const ModelNode &node);
void setId(const QModelIndex &index, const QString &id);
+ void setExported(const QModelIndex &index, bool exported);
void setVisible(const QModelIndex &index, bool visible);
void openContextMenu(const QPoint &p);
@@ -131,6 +136,7 @@ private:
ItemRow createItemRow(const ModelNode &node);
void updateItemRow(const ModelNode &node, ItemRow row);
void handleChangedIdItem(QStandardItem *idItem, ModelNode &modelNode);
+ void handleChangedExportItem(QStandardItem *exportItem, ModelNode &modelNode);
void handleChangedVisibilityItem(QStandardItem *visibilityItem, ModelNode &modelNode);
void moveNodesInteractive(NodeAbstractProperty &parentProperty, const QList<ModelNode> &modelNodes, int targetIndex);
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
index 0e25eefee8..6e5179985c 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp
@@ -37,6 +37,7 @@
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/icore.h>
+#include <bindingproperty.h>
#include <designmodecontext.h>
#include <nodeproperty.h>
#include <nodelistproperty.h>
@@ -85,8 +86,13 @@ NavigatorView::NavigatorView(QObject* parent) :
NameItemDelegate *idDelegate = new NameItemDelegate(this,
m_treeModel.data());
IconCheckboxItemDelegate *showDelegate = new IconCheckboxItemDelegate(this,
- ":/qmldesigner/images/eye_open.png",
- ":/qmldesigner/images/placeholder.png",
+ QLatin1String(":/navigator/icon/eye_open.png"),
+ QLatin1String(":/navigator/icon/eye_closed.png"),
+ m_treeModel.data());
+
+ IconCheckboxItemDelegate *exportDelegate = new IconCheckboxItemDelegate(this,
+ QLatin1String(":/navigator/icon/export_checked.png"),
+ QLatin1String(":/navigator/icon/export_unchecked.png"),
m_treeModel.data());
#ifdef _LOCK_ITEMS_
@@ -100,7 +106,8 @@ NavigatorView::NavigatorView(QObject* parent) :
treeWidget()->setItemDelegateForColumn(1,lockDelegate);
treeWidget()->setItemDelegateForColumn(2,showDelegate);
#else
- treeWidget()->setItemDelegateForColumn(1,showDelegate);
+ treeWidget()->setItemDelegateForColumn(1,exportDelegate);
+ treeWidget()->setItemDelegateForColumn(2,showDelegate);
#endif
}
@@ -155,6 +162,17 @@ void NavigatorView::importsChanged(const QList<Import> &/*addedImports*/, const
treeWidget()->update();
}
+void NavigatorView::bindingPropertiesChanged(const QList<BindingProperty> & propertyList, PropertyChangeFlags /*propertyChange*/)
+{
+ foreach (const BindingProperty &bindingProperty, propertyList) {
+ /* If a binding property that exports an item using an alias property has
+ * changed, we have to update the affected item.
+ */
+ if (bindingProperty.isAliasExport())
+ m_treeModel->updateItemRow(modelNodeForId(bindingProperty.expression()));
+ }
+}
+
void NavigatorView::nodeAboutToBeRemoved(const ModelNode &removedNode)
{
m_treeModel->removeSubTree(removedNode);
@@ -220,6 +238,12 @@ void NavigatorView::auxiliaryDataChanged(const ModelNode &modelNode, const Prope
}
}
+void NavigatorView::instanceErrorChange(const QVector<ModelNode> &errorNodeList)
+{
+ foreach (const ModelNode &currentModelNode, errorNodeList)
+ m_treeModel->updateItemRow(currentModelNode);
+}
+
void NavigatorView::nodeOrderChanged(const NodeListProperty &listProperty, const ModelNode &node, int /*oldIndex*/)
{
if (m_treeModel->isInTree(node)) {
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.h b/src/plugins/qmldesigner/components/navigator/navigatorview.h
index 49059e2872..a6d48ef01b 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorview.h
+++ b/src/plugins/qmldesigner/components/navigator/navigatorview.h
@@ -74,6 +74,9 @@ public:
void selectedNodesChanged(const QList<ModelNode> &selectedNodeList ,
const QList<ModelNode> &lastSelectedNodeList) override;
void auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) override;
+ void instanceErrorChange(const QVector<ModelNode> &errorNodeList) override;
+
+ void bindingPropertiesChanged(const QList<BindingProperty> &propertyList, PropertyChangeFlags);
private slots:
void changeSelection(const QItemSelection &selected, const QItemSelection &deselected);
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp
index e36a890010..f42bcf4cbf 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp
@@ -82,24 +82,24 @@ QList<QToolButton *> NavigatorWidget::createToolBarWidgets()
QList<QToolButton *> buttons;
buttons.append(new QToolButton());
- buttons.last()->setIcon(QIcon(":/navigator/icon/arrowleft.png"));
+ buttons.last()->setIcon(QIcon(QLatin1String(":/navigator/icon/arrowleft.png")));
buttons.last()->setToolTip(tr("Become last sibling of parent (CTRL + Left)."));
buttons.last()->setShortcut(QKeySequence(Qt::Key_Left | Qt::CTRL));
connect(buttons.last(), SIGNAL(clicked()), this, SIGNAL(leftButtonClicked()));
buttons.append(new QToolButton());
- buttons.last()->setIcon(QIcon(":/navigator/icon/arrowright.png"));
+ buttons.last()->setIcon(QIcon(QLatin1String(":/navigator/icon/arrowright.png")));
buttons.last()->setToolTip(tr("Become child of last sibling (CTRL + Right)."));
buttons.last()->setShortcut(QKeySequence(Qt::Key_Right | Qt::CTRL));
connect(buttons.last(), SIGNAL(clicked()), this, SIGNAL(rightButtonClicked()));
buttons.append(new QToolButton());
- buttons.last()->setIcon(QIcon(":/navigator/icon/arrowdown.png"));
+ buttons.last()->setIcon(QIcon(QLatin1String(":/navigator/icon/arrowdown.png")));
buttons.last()->setToolTip(tr("Move down (CTRL + Down)."));
buttons.last()->setShortcut(QKeySequence(Qt::Key_Down | Qt::CTRL));
connect(buttons.last(), SIGNAL(clicked()), this, SIGNAL(downButtonClicked()));
buttons.append(new QToolButton());
- buttons.last()->setIcon(QIcon(":/navigator/icon/arrowup.png"));
+ buttons.last()->setIcon(QIcon(QLatin1String(":/navigator/icon/arrowup.png")));
buttons.last()->setToolTip(tr("Move up (CTRL + Up)."));
buttons.last()->setShortcut(QKeySequence(Qt::Key_Up | Qt::CTRL));
connect(buttons.last(), SIGNAL(clicked()), this, SIGNAL(upButtonClicked()));
diff --git a/src/plugins/qmldesigner/components/navigator/warning.png b/src/plugins/qmldesigner/components/navigator/warning.png
new file mode 100644
index 0000000000..38a80acc1e
--- /dev/null
+++ b/src/plugins/qmldesigner/components/navigator/warning.png
Binary files differ