1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the Qt Designer of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28
29 #include "sheet_delegate_p.h"
30
31 #include <QtCore/qabstractitemmodel.h>
32 #include <QtWidgets/qtreeview.h>
33 #include <QtWidgets/qstyle.h>
34 #include <QtGui/qpainter.h>
35
36 QT_BEGIN_NAMESPACE
37
38 namespace qdesigner_internal {
39
SheetDelegate(QTreeView * view,QWidget * parent)40 SheetDelegate::SheetDelegate(QTreeView *view, QWidget *parent)
41 : QItemDelegate(parent),
42 m_view(view)
43 {
44 }
45
paint(QPainter * painter,const QStyleOptionViewItem & option,const QModelIndex & index) const46 void SheetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
47 {
48 const QAbstractItemModel *model = index.model();
49 Q_ASSERT(model);
50
51 if (!model->parent(index).isValid()) {
52 // this is a top-level item.
53 QStyleOptionButton buttonOption;
54
55 buttonOption.state = option.state;
56 #ifdef Q_OS_MACOS
57 buttonOption.state |= QStyle::State_Raised;
58 #endif
59 buttonOption.state &= ~QStyle::State_HasFocus;
60
61 buttonOption.rect = option.rect;
62 buttonOption.palette = option.palette;
63 buttonOption.features = QStyleOptionButton::None;
64
65 painter->save();
66 QColor buttonColor(230, 230, 230);
67 QBrush buttonBrush = option.palette.button();
68 if (!buttonBrush.gradient() && buttonBrush.texture().isNull())
69 buttonColor = buttonBrush.color();
70 QColor outlineColor = buttonColor.darker(150);
71 QColor highlightColor = buttonColor.lighter(130);
72
73 // Only draw topline if the previous item is expanded
74 QModelIndex previousIndex = model->index(index.row() - 1, index.column());
75 bool drawTopline = (index.row() > 0 && m_view->isExpanded(previousIndex));
76 int highlightOffset = drawTopline ? 1 : 0;
77
78 QLinearGradient gradient(option.rect.topLeft(), option.rect.bottomLeft());
79 gradient.setColorAt(0, buttonColor.lighter(102));
80 gradient.setColorAt(1, buttonColor.darker(106));
81
82 painter->setPen(Qt::NoPen);
83 painter->setBrush(gradient);
84 painter->drawRect(option.rect);
85 painter->setPen(highlightColor);
86 painter->drawLine(option.rect.topLeft() + QPoint(0, highlightOffset),
87 option.rect.topRight() + QPoint(0, highlightOffset));
88 painter->setPen(outlineColor);
89 if (drawTopline)
90 painter->drawLine(option.rect.topLeft(), option.rect.topRight());
91 painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
92 painter->restore();
93
94 QStyleOption branchOption;
95 static const int i = 9; // ### hardcoded in qcommonstyle.cpp
96 QRect r = option.rect;
97 branchOption.rect = QRect(r.left() + i/2, r.top() + (r.height() - i)/2, i, i);
98 branchOption.palette = option.palette;
99 branchOption.state = QStyle::State_Children;
100
101 if (m_view->isExpanded(index))
102 branchOption.state |= QStyle::State_Open;
103
104 m_view->style()->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, painter, m_view);
105
106 // draw text
107 QRect textrect = QRect(r.left() + i*2, r.top(), r.width() - ((5*i)/2), r.height());
108 QString text = option.fontMetrics.elidedText(model->data(index, Qt::DisplayRole).toString(),
109 Qt::ElideMiddle,
110 textrect.width());
111 m_view->style()->drawItemText(painter, textrect, Qt::AlignCenter,
112 option.palette, m_view->isEnabled(), text);
113
114 } else {
115 QItemDelegate::paint(painter, option, index);
116 }
117 }
118
sizeHint(const QStyleOptionViewItem & opt,const QModelIndex & index) const119 QSize SheetDelegate::sizeHint(const QStyleOptionViewItem &opt, const QModelIndex &index) const
120 {
121 QSize sz = QItemDelegate::sizeHint(opt, index) + QSize(2, 2);
122 return sz;
123 }
124
125 } // namespace qdesigner_internal
126
127 QT_END_NAMESPACE
128