Subversion Repositories Scribus

Rev

Rev 18194 | Rev 18446 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
12295 fschmid 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
/***************************************************************************
8
                          sctreewidget.cpp  -  description
9
                             -------------------
10
    begin                : Wed Jun 18 2008
11
    copyright            : (C) 2008 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
23
 
24
#include <QAbstractItemModel>
25
#include <QStyle>
26
#include <QPainter>
27
#include <QHeaderView>
12296 fschmid 28
#include <QLayout>
17383 fschmid 29
#include <QShortcutEvent>
12295 fschmid 30
 
13650 cbradney 31
#include "sctreewidget.h"
12295 fschmid 32
 
33
 
34
ScTreeWidgetDelegate::ScTreeWidgetDelegate(QTreeWidget *view, QWidget *parent) : QItemDelegate(parent), m_view(view)
35
{
36
}
37
 
38
void ScTreeWidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
39
{
40
        const QAbstractItemModel *model = index.model();
41
        Q_ASSERT(model);
42
        if (!model->parent(index).isValid())
43
        {
44
        // this is a top-level item.
45
                QStyleOptionButton buttonOption;
46
                buttonOption.state = option.state;
18204 fschmid 47
#if defined(Q_OS_MAC) || defined(Q_OS_WIN)
12295 fschmid 48
                buttonOption.state |= QStyle::State_Raised;
49
#endif
50
                buttonOption.state &= ~QStyle::State_HasFocus;
51
                buttonOption.rect = option.rect;
52
                buttonOption.palette = option.palette;
53
                m_view->style()->drawControl(QStyle::CE_PushButton, &buttonOption, painter, m_view);
54
                static const int i = 9; // ### hardcoded in qcommonstyle.cpp
55
                QRect r = option.rect;
56
                painter->save();
17386 fschmid 57
                if (option.state & QStyle::State_Enabled)
58
                        painter->setBrush(Qt::black);
59
                else
60
                        painter->setBrush(Qt::gray);
12295 fschmid 61
                painter->setPen(Qt::NoPen);
17383 fschmid 62
                QRect rect = QRect(r.left()+6, r.top()+6, r.height()-12, r.height()-12);
12295 fschmid 63
                QPolygon pa(3);
64
                if (m_view->isExpanded(index))
65
                {
66
                        pa.setPoint(0, rect.left(), rect.top());
67
                        pa.setPoint(1, rect.right(), rect.top());
68
                        pa.setPoint(2, rect.center().x(), rect.bottom());
69
                }
70
                else
71
                {
72
                        pa.setPoint(0, rect.left(), rect.top());
73
                        pa.setPoint(1, rect.left(), rect.bottom());
74
                        pa.setPoint(2, rect.right(), rect.center().y());
75
                }
76
                painter->setRenderHint(QPainter::Antialiasing, true);
77
                painter->drawPolygon(pa);
78
                painter->restore();
79
                        // draw text
80
                QRect textrect = QRect(r.left() + i*2, r.top(), r.width() - ((5*i)/2), r.height());
17383 fschmid 81
                QString text = option.fontMetrics.elidedText(model->data(index, Qt::DisplayRole).toString(), Qt::ElideMiddle, textrect.width(), Qt::TextShowMnemonic);
82
                m_view->style()->drawItemText(painter, textrect, Qt::AlignCenter | Qt::TextShowMnemonic, option.palette, (option.state & QStyle::State_Enabled), text, QPalette::Text);
12295 fschmid 83
        }
84
        else
85
                QItemDelegate::paint(painter, option, index);
86
}
87
 
88
QSize ScTreeWidgetDelegate::sizeHint(const QStyleOptionViewItem &opt, const QModelIndex &index) const
89
{
17383 fschmid 90
        QSize sz = QItemDelegate::sizeHint(opt, index) + QSize(2, 6);
12295 fschmid 91
        return sz;
92
}
93
 
94
ScTreeWidget::ScTreeWidget(QWidget* pa) : QTreeWidget(pa)
95
{
12296 fschmid 96
        setFocusPolicy(Qt::NoFocus);
12295 fschmid 97
        setColumnCount(1);
98
        setItemDelegate(new ScTreeWidgetDelegate(this, this));
99
        setRootIsDecorated(false);
100
        setIndentation(0);
101
        header()->hide();
18194 fschmid 102
#ifdef USE_QT5
103
        header()->setSectionResizeMode(QHeaderView::Stretch);
104
#else
12296 fschmid 105
        header()->setResizeMode(QHeaderView::Stretch);
18194 fschmid 106
#endif
12295 fschmid 107
        viewport()->setBackgroundRole(QPalette::Window);
17389 fschmid 108
        setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
17383 fschmid 109
        m_toolbox_mode = false;
12308 fschmid 110
    connect(this, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(handleMousePress(QTreeWidgetItem*)));
12295 fschmid 111
}
112
 
17383 fschmid 113
bool ScTreeWidget::event(QEvent *e)
114
{
115
        if (e->type() == QEvent::Shortcut)
116
        {
117
                QShortcutEvent *se = static_cast<QShortcutEvent *>(e);
118
                if (se != NULL)
119
                {
120
                        int k = se->shortcutId();
121
                        QTreeWidgetItem *item1 = keySList.value(k);
122
                        handleMousePress(item1);
123
                        return true;
124
                }
125
        }
126
        return QTreeWidget::event(e);
127
}
128
 
12295 fschmid 129
QTreeWidgetItem* ScTreeWidget::addWidget(QString title, QWidget* widget)
130
{
131
        QTreeWidgetItem *item1 = new QTreeWidgetItem(this);
132
        item1->setText(0, title);
133
        item1->setFlags(Qt::ItemIsEnabled);
134
        QTreeWidgetItem *item2 = new QTreeWidgetItem(item1);
135
        item2->setFlags(Qt::ItemIsEnabled);
12296 fschmid 136
// hack to work around a bug in Qt-4.3.4
137
        widget->layout()->activate();
138
        widget->setMinimumSize(widget->layout()->minimumSize());
12298 fschmid 139
        item2->setSizeHint(0, widget->layout()->minimumSize());
12296 fschmid 140
// end hack
12295 fschmid 141
        setItemWidget(item2, 0, widget);
17383 fschmid 142
        QKeySequence newMnemonic = QKeySequence::mnemonic(title);
143
//      grabShortcut(newMnemonic);
144
        keySList.insert(grabShortcut(newMnemonic), item1);
12295 fschmid 145
        return item1;
146
}
147
 
17383 fschmid 148
void ScTreeWidget::setToolBoxMode(bool enable)
149
{
150
        m_toolbox_mode = enable;
151
}
152
 
153
int ScTreeWidget::addItem(QWidget* widget, QString title)
154
{
155
        QTreeWidgetItem *top = addWidget(title, widget);
156
        return indexOfTopLevelItem(top);
157
}
158
 
159
QWidget* ScTreeWidget::widget(int index)
160
{
161
        if ((index < 0) || (index >= topLevelItemCount()))
162
                return NULL;
163
        QTreeWidgetItem *top = topLevelItem(index);
164
        if (top->childCount() == 0)
165
                return NULL;
166
        QTreeWidgetItem *child = top->child(0);
167
        return itemWidget(child, 0);
168
}
169
 
170
void ScTreeWidget::setItemEnabled(int index, bool enable)
171
{
172
        if ((index < 0) || (index >= topLevelItemCount()))
173
                return;
174
        if (enable)
175
                topLevelItem(index)->setFlags(Qt::ItemIsEnabled);
176
        else
177
                topLevelItem(index)->setFlags(0);
17387 fschmid 178
        QTreeWidgetItem *child = topLevelItem(index)->child(0);
179
        if (child != NULL)
180
                itemWidget(child, 0)->setEnabled(enable);
17383 fschmid 181
}
182
 
183
bool ScTreeWidget::isItemEnabled(int index)
184
{
185
        if ((index < 0) || (index >= topLevelItemCount()))
186
                return false;
187
        return !topLevelItem(index)->isDisabled();
188
}
189
 
190
void ScTreeWidget::setCurrentIndex(int index)
191
{
192
        if ((index < 0) || (index >= topLevelItemCount()))
193
                return;
194
        int tops = topLevelItemCount();
195
        for (int t = 0; t < tops; t++)
196
        {
197
                setItemExpanded(topLevelItem(t), false);
198
        }
199
        QTreeWidgetItem *top = topLevelItem(index);
200
        setCurrentItem(top);
201
        setItemExpanded(top, true);
202
        int wide = 0;
203
        if (top->childCount() != 0)
204
        {
205
                QTreeWidgetItem *child = top->child(0);
206
                if (child != 0)
207
                        wide = itemWidget(child, 0)->minimumSizeHint().width()+5;
208
        }
209
        if (wide != 0)
210
                setColumnWidth(0, wide);
211
        else
212
                resizeColumnToContents(0);
213
}
214
 
215
int ScTreeWidget::currentIndex()
216
{
217
        int index = -1;
218
        QTreeWidgetItem* item = currentItem();
219
        if (item->parent() == 0)
220
                index = indexOfTopLevelItem(item);
221
        else
222
                index = indexOfTopLevelItem(item->parent());
223
        return index;
224
}
225
 
226
void ScTreeWidget::setItemText(int index, QString text)
227
{
228
        if ((index < 0) || (index >= topLevelItemCount()))
229
                return;
230
        topLevelItem(index)->setText(0, text);
231
}
232
 
12295 fschmid 233
void ScTreeWidget::handleMousePress(QTreeWidgetItem *item)
234
{
235
        if (item == 0)
236
                return;
237
        if (item->parent() == 0)
238
        {
17383 fschmid 239
                if (item->isDisabled())
240
                {
241
                        setItemExpanded(item, false);
242
                        return;
243
                }
244
                int wide = 0;
12295 fschmid 245
                int tops = topLevelItemCount();
17383 fschmid 246
                if (m_toolbox_mode)
12295 fschmid 247
                {
17383 fschmid 248
                        for (int t = 0; t < tops; t++)
12295 fschmid 249
                        {
17383 fschmid 250
                                setItemExpanded(topLevelItem(t), false);
251
                        }
252
                        setCurrentItem(item);
253
                        setItemExpanded(item, true);
254
                        if (item->childCount() != 0)
255
                        {
256
                                QTreeWidgetItem *child = item->child(0);
257
                                if (child != 0)
258
                                        wide = itemWidget(child, 0)->minimumSizeHint().width()+5;
259
                        }
260
                        if (wide != 0)
261
                                setColumnWidth(0, wide);
262
                        else
263
                                resizeColumnToContents(0);
264
                }
265
                else
266
                {
267
                        setItemExpanded(item, !isItemExpanded(item));
268
                        for (int t = 0; t < tops; t++)
269
                        {
270
                                QTreeWidgetItem *top = topLevelItem(t);
271
                                if (isItemExpanded(top))
12295 fschmid 272
                                {
17383 fschmid 273
                                        if (top->childCount() != 0)
274
                                        {
275
                                                QTreeWidgetItem *child = top->child(0);
276
                                                if (child != 0)
277
                                                        wide = qMax(wide, itemWidget(child, 0)->minimumSizeHint().width()+5);
278
                                        }
12295 fschmid 279
                                }
280
                        }
281
                }
282
                if (wide != 0)
283
                        setColumnWidth(0, wide);
284
                else
285
                        resizeColumnToContents(0);
17936 craig 286
                emit currentChanged2(indexOfTopLevelItem(item));
12295 fschmid 287
        }
288
}