3
* In the name of the Father, and of the Son, and of the Holy Spirit.
5
* This file is part of BibleTime's source code, http://www.bibletime.info/.
7
* Copyright 1999-2009 by the BibleTime developers.
8
* The BibleTime source code is licensed under the GNU General Public License
13
#include "frontend/btmenuview.h"
15
#include <QActionGroup>
18
BtMenuView::BtMenuView(QWidget *parent)
19
: QMenu(parent), m_model(0), m_actions(0)
21
connect(this, SIGNAL(aboutToShow()),
22
this, SLOT(slotAboutToShow()));
23
connect(this, SIGNAL(aboutToHide()),
24
this, SLOT(slotAboutToHide()));
27
BtMenuView::~BtMenuView() {
33
void BtMenuView::setModel(QAbstractItemModel *model) {
37
void BtMenuView::buildMenu(QMenu *parentMenu, const QModelIndex &parent) {
38
Q_ASSERT(m_model != 0);
40
int children = m_model->rowCount(parent);
41
for (int i = 0; i < children; i++) {
42
QModelIndex child(m_model->index(i, 0, parent));
43
QVariant displayData(m_model->data(child, Qt::DisplayRole));
44
QVariant iconData(m_model->data(child, Qt::DecorationRole));
45
QVariant toolTipData(m_model->data(child, Qt::ToolTipRole));
46
QVariant statusTipData(m_model->data(child, Qt::StatusTipRole));
47
QVariant whatsThisData(m_model->data(child, Qt::WhatsThisRole));
49
if (m_model->rowCount(child) > 0) {
50
QMenu *childMenu = new QMenu(parentMenu);
53
if (qVariantCanConvert<QString>(displayData)) {
54
childMenu->setTitle(displayData.toString());
58
if (qVariantCanConvert<QIcon>(iconData)) {
59
childMenu->setIcon(iconData.value<QIcon>());
63
if (qVariantCanConvert<QString>(toolTipData)) {
64
childMenu->setToolTip(toolTipData.toString());
68
if (qVariantCanConvert<QString>(statusTipData)) {
69
childMenu->setStatusTip(statusTipData.toString());
73
if (qVariantCanConvert<QString>(whatsThisData)) {
74
childMenu->setWhatsThis(whatsThisData.toString());
77
parentMenu->addMenu(childMenu);
78
buildMenu(childMenu, child);
80
QAction *childAction = new QAction(m_actions);
83
if (qVariantCanConvert<QString>(displayData)) {
84
childAction->setText(displayData.toString());
88
if (qVariantCanConvert<QIcon>(iconData)) {
89
childAction->setIcon(iconData.value<QIcon>());
93
if (qVariantCanConvert<QString>(toolTipData)) {
94
childAction->setToolTip(toolTipData.toString());
98
if (qVariantCanConvert<QString>(statusTipData)) {
99
childAction->setStatusTip(statusTipData.toString());
103
if (qVariantCanConvert<QString>(whatsThisData)) {
104
childAction->setWhatsThis(whatsThisData.toString());
108
if (m_model->flags(child).testFlag(Qt::ItemIsUserCheckable)) {
109
childAction->setCheckable(true);
113
QVariant checkData(m_model->data(child, Qt::CheckStateRole));
115
Qt::CheckState state = (Qt::CheckState) checkData.toInt(&ok);
117
childAction->setChecked(state == Qt::Checked);
122
m_indexMap[childAction] = QPersistentModelIndex(child);
124
// Add action to action group:
125
m_actions->addAction(childAction);
127
// Add action to menu:
128
parentMenu->addAction(childAction);
133
void BtMenuView::slotAboutToShow() {
134
if (m_actions != 0) {
140
if (m_model == 0) return;
142
m_actions = new QActionGroup(this);
143
connect(m_actions, SIGNAL(triggered(QAction*)),
144
this, SLOT(slotActionTriggered(QAction*)));
146
QModelIndex parentIndex;
147
buildMenu(this, parentIndex);
150
void BtMenuView::slotAboutToHide() {
154
void BtMenuView::slotActionTriggered(QAction *action) {
155
Q_ASSERT(m_indexMap.contains(action));
156
QPersistentModelIndex itemIndex(m_indexMap.value(action));
157
if (itemIndex.isValid()) {
158
emit triggered(itemIndex);