diff --git a/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp b/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp index bd1e22a94ce80409a2945b3a4586c0908a524c5f..23aaa208b9defd65c3a4aedbf7b122298b222e0f 100644 --- a/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp +++ b/src/plugins/qmljseditor/qmljsoutlinetreeview.cpp @@ -1,8 +1,69 @@ #include "qmljsoutlinetreeview.h" +#include "qmloutlinemodel.h" + +#include <QtCore/QDebug> +#include <QtGui/QApplication> +#include <QtGui/QPainter> namespace QmlJSEditor { namespace Internal { +QmlJSOutlineItemDelegate::QmlJSOutlineItemDelegate(QObject *parent) : + QStyledItemDelegate(parent) +{ +} + +QSize QmlJSOutlineItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QStyleOptionViewItemV4 opt = option; + initStyleOption(&opt, index); + + const QString annotation = index.data(QmlOutlineModel::AnnotationRole).toString(); + if (!annotation.isEmpty()) + opt.text += " " + annotation; + + QStyle *style = QApplication::style(); + return style->sizeFromContents(QStyle::CT_ItemViewItem, &opt, QSize(), 0); +} + +void QmlJSOutlineItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + QStyleOptionViewItemV4 opt = option; + initStyleOption(&opt, index); + + if (opt.state & QStyle::State_Selected) + painter->fillRect(opt.rect, option.palette.highlight()); + + const QString typeString = index.data(Qt::DisplayRole).toString(); + const QString annotationString = index.data(QmlOutlineModel::AnnotationRole).toString(); + + QStyle *style = QApplication::style(); + + // paint type name + QRect typeRect = style->itemTextRect(opt.fontMetrics, opt.rect, Qt::AlignLeft, true, typeString); + + QPalette::ColorRole textColorRole = QPalette::Text; + if (option.state & QStyle::State_Selected) { + textColorRole = QPalette::HighlightedText; + } + + style->drawItemText(painter, typeRect, Qt::AlignLeft, opt.palette, true, typeString, textColorRole); + + // paint annotation (e.g. id) + if (!annotationString.isEmpty()) { + QRect annotationRect = style->itemTextRect(opt.fontMetrics, opt.rect, Qt::AlignLeft, true, + annotationString); + static int space = opt.fontMetrics.width(" "); + annotationRect.adjust(typeRect.width() + space, 0, typeRect.width() + space, 0); + + QPalette disabledPalette(opt.palette); + disabledPalette.setCurrentColorGroup(QPalette::Disabled); + style->drawItemText(painter, annotationRect, Qt::AlignLeft, disabledPalette, true, + annotationString, textColorRole); + } +} + QmlJSOutlineTreeView::QmlJSOutlineTreeView(QWidget *parent) : Utils::NavigationTreeView(parent) { @@ -14,6 +75,9 @@ QmlJSOutlineTreeView::QmlJSOutlineTreeView(QWidget *parent) : viewport()->setAcceptDrops(true); setDropIndicatorShown(true); setDragDropMode(InternalMove); + + QmlJSOutlineItemDelegate *itemDelegate = new QmlJSOutlineItemDelegate(this); + setItemDelegateForColumn(0, itemDelegate); } } // namespace Internal diff --git a/src/plugins/qmljseditor/qmljsoutlinetreeview.h b/src/plugins/qmljseditor/qmljsoutlinetreeview.h index abbeb75b76081e14edf4bb7b28cb6338acff209e..23fb29ca375abb04e96071a2b5a9eeddef81639a 100644 --- a/src/plugins/qmljseditor/qmljsoutlinetreeview.h +++ b/src/plugins/qmljseditor/qmljsoutlinetreeview.h @@ -2,15 +2,26 @@ #define QMLJSOUTLINETREEVIEW_H #include <utils/navigationtreeview.h> +#include <QtGui/QStyledItemDelegate> namespace QmlJSEditor { namespace Internal { +class QmlJSOutlineItemDelegate : public QStyledItemDelegate +{ +public: + explicit QmlJSOutlineItemDelegate(QObject *parent = 0); + + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const; +}; + class QmlJSOutlineTreeView : public Utils::NavigationTreeView { Q_OBJECT public: - QmlJSOutlineTreeView(QWidget *parent = 0); + explicit QmlJSOutlineTreeView(QWidget *parent = 0); }; } // namespace Internal diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp index 81919094bac880f300e51847b5d427fd5156deff..2bc0357bba1c38567d0e26b1a9f3b7a7ca20a7e1 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.cpp +++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp @@ -59,6 +59,16 @@ int QmlOutlineItem::type() const return UserType; } +QString QmlOutlineItem::annotation() const +{ + return data(QmlOutlineModel::AnnotationRole).value<QString>(); +} + +void QmlOutlineItem::setAnnotation(const QString &id) +{ + setData(QVariant::fromValue(id), QmlOutlineModel::AnnotationRole); +} + QmlJS::AST::SourceLocation QmlOutlineItem::sourceLocation() const { return data(QmlOutlineModel::SourceLocationRole).value<QmlJS::AST::SourceLocation>(); @@ -362,12 +372,8 @@ QModelIndex QmlOutlineModel::enterObjectDefinition(AST::UiObjectDefinition *objD const QString typeName = asString(objDef->qualifiedTypeNameId); if (typeName.at(0).isUpper()) { - const QString id = getId(objDef); - if (!id.isEmpty()) { - prototype.setText(id); - } else { - prototype.setText(typeName); - } + prototype.setText(typeName); + prototype.setAnnotation(getId(objDef)); if (!m_typeToIcon.contains(typeName)) { m_typeToIcon.insert(typeName, getIcon(objDef)); } diff --git a/src/plugins/qmljseditor/qmloutlinemodel.h b/src/plugins/qmljseditor/qmloutlinemodel.h index 6fd0c4bbf7671bd97e74cecc1e1157381d8b6f98..6da69c4c139b8bbaf7e41ef5c3c1f782cee01a70 100644 --- a/src/plugins/qmljseditor/qmloutlinemodel.h +++ b/src/plugins/qmljseditor/qmloutlinemodel.h @@ -30,9 +30,13 @@ public: QVariant data(int role = Qt::UserRole + 1) const; int type() const; + QString annotation() const; + void setAnnotation(const QString &id); + QmlJS::AST::SourceLocation sourceLocation() const; void setSourceLocation(const QmlJS::AST::SourceLocation &location); + QmlJS::AST::Node *node() const; void setNode(QmlJS::AST::Node *node); @@ -58,6 +62,7 @@ public: enum CustomRoles { SourceLocationRole = Qt::UserRole + 1, ItemTypeRole, + AnnotationRole }; enum ItemTypes {