diff options
Diffstat (limited to 'src/frontend/btmenuview.cpp')
-rw-r--r-- | src/frontend/btmenuview.cpp | 227 |
1 files changed, 135 insertions, 92 deletions
diff --git a/src/frontend/btmenuview.cpp b/src/frontend/btmenuview.cpp index ab9fdd1..b7ce9b4 100644 --- a/src/frontend/btmenuview.cpp +++ b/src/frontend/btmenuview.cpp @@ -4,7 +4,7 @@ * * This file is part of BibleTime's source code, http://www.bibletime.info/. * -* Copyright 1999-2009 by the BibleTime developers. +* Copyright 1999-2011 by the BibleTime developers. * The BibleTime source code is licensed under the GNU General Public License * version 2.0. * @@ -16,135 +16,179 @@ BtMenuView::BtMenuView(QWidget *parent) - : QMenu(parent), m_model(0), m_actions(0) + : QMenu(parent), m_model(0), m_parentIndex(QModelIndex()), m_actions(0) { connect(this, SIGNAL(aboutToShow()), this, SLOT(slotAboutToShow())); connect(this, SIGNAL(aboutToHide()), this, SLOT(slotAboutToHide())); + connect(this, SIGNAL(triggered(QAction*)), + this, SLOT(slotActionTriggered(QAction*))); } BtMenuView::~BtMenuView() { - if (m_actions != 0) { - delete m_actions; - } + delete m_actions; } void BtMenuView::setModel(QAbstractItemModel *model) { m_model = model; + delete m_actions; + m_actions = 0; + m_indexMap.clear(); + m_parentIndex = QModelIndex(); } -void BtMenuView::buildMenu(QMenu *parentMenu, const QModelIndex &parent) { - Q_ASSERT(m_model != 0); +void BtMenuView::setParentIndex(const QModelIndex &parentIndex) { + if (parentIndex.isValid() && parentIndex.model() != m_model) return; + m_parentIndex = parentIndex; +} - int children = m_model->rowCount(parent); - for (int i = 0; i < children; i++) { - QModelIndex child(m_model->index(i, 0, parent)); - QVariant displayData(m_model->data(child, Qt::DisplayRole)); - QVariant iconData(m_model->data(child, Qt::DecorationRole)); - QVariant toolTipData(m_model->data(child, Qt::ToolTipRole)); - QVariant statusTipData(m_model->data(child, Qt::StatusTipRole)); - QVariant whatsThisData(m_model->data(child, Qt::WhatsThisRole)); - - if (m_model->rowCount(child) > 0) { - QMenu *childMenu = new QMenu(parentMenu); - - // Set text: - if (qVariantCanConvert<QString>(displayData)) { - childMenu->setTitle(displayData.toString()); - } +void BtMenuView::preBuildMenu() { + // Intentionally empty. Reimplement in subclass if needed. +} - // Set icon: - if (qVariantCanConvert<QIcon>(iconData)) { - childMenu->setIcon(iconData.value<QIcon>()); - } +void BtMenuView::postBuildMenu() { + // Intentionally empty. Reimplement in subclass if needed. +} - // Set tooltip: - if (qVariantCanConvert<QString>(toolTipData)) { - childMenu->setToolTip(toolTipData.toString()); - } +QAction *BtMenuView::newAction(QMenu *parentMenu, const QModelIndex &itemIndex) { + QVariant displayData(m_model->data(itemIndex, Qt::DisplayRole)); + QVariant iconData(m_model->data(itemIndex, Qt::DecorationRole)); + QVariant toolTipData(m_model->data(itemIndex, Qt::ToolTipRole)); + QVariant statusTipData(m_model->data(itemIndex, Qt::StatusTipRole)); + QVariant whatsThisData(m_model->data(itemIndex, Qt::WhatsThisRole)); - // Set status tip: - if (qVariantCanConvert<QString>(statusTipData)) { - childMenu->setStatusTip(statusTipData.toString()); - } + QAction *childAction = new QAction(parentMenu); - // Set whatsthis: - if (qVariantCanConvert<QString>(whatsThisData)) { - childMenu->setWhatsThis(whatsThisData.toString()); - } + // Set text: + if (qVariantCanConvert<QString>(displayData)) { + childAction->setText(displayData.toString()); + } - parentMenu->addMenu(childMenu); - buildMenu(childMenu, child); - } else { - QAction *childAction = new QAction(m_actions); + // Set icon: + if (qVariantCanConvert<QIcon>(iconData)) { + childAction->setIcon(iconData.value<QIcon>()); + } - // Set text: - if (qVariantCanConvert<QString>(displayData)) { - childAction->setText(displayData.toString()); - } + // Set tooltip: + if (qVariantCanConvert<QString>(toolTipData)) { + childAction->setToolTip(toolTipData.toString()); + } - // Set icon: - if (qVariantCanConvert<QIcon>(iconData)) { - childAction->setIcon(iconData.value<QIcon>()); - } + // Set status tip: + if (qVariantCanConvert<QString>(statusTipData)) { + childAction->setStatusTip(statusTipData.toString()); + } - // Set tooltip: - if (qVariantCanConvert<QString>(toolTipData)) { - childAction->setToolTip(toolTipData.toString()); - } + // Set whatsthis: + if (qVariantCanConvert<QString>(whatsThisData)) { + childAction->setWhatsThis(whatsThisData.toString()); + } - // Set status tip: - if (qVariantCanConvert<QString>(statusTipData)) { - childAction->setStatusTip(statusTipData.toString()); - } + // Set checkable: + if (m_model->flags(itemIndex).testFlag(Qt::ItemIsUserCheckable)) { + childAction->setCheckable(true); + } - // Set whatsthis: - if (qVariantCanConvert<QString>(whatsThisData)) { - childAction->setWhatsThis(whatsThisData.toString()); - } + // Set checked: + QVariant checkData(m_model->data(itemIndex, Qt::CheckStateRole)); + bool ok; + Qt::CheckState state = (Qt::CheckState) checkData.toInt(&ok); + if (ok) { + childAction->setChecked(state == Qt::Checked); + } - // Set checkable: - if (m_model->flags(child).testFlag(Qt::ItemIsUserCheckable)) { - childAction->setCheckable(true); - } + return childAction; +} - // Set checked: - QVariant checkData(m_model->data(child, Qt::CheckStateRole)); - bool ok; - Qt::CheckState state = (Qt::CheckState) checkData.toInt(&ok); - if (ok) { - childAction->setChecked(state == Qt::Checked); - } +QMenu *BtMenuView::newMenu(QMenu *parentMenu, const QModelIndex &itemIndex) { + QVariant displayData(m_model->data(itemIndex, Qt::DisplayRole)); + QVariant iconData(m_model->data(itemIndex, Qt::DecorationRole)); + QVariant toolTipData(m_model->data(itemIndex, Qt::ToolTipRole)); + QVariant statusTipData(m_model->data(itemIndex, Qt::StatusTipRole)); + QVariant whatsThisData(m_model->data(itemIndex, Qt::WhatsThisRole)); + + QMenu *childMenu = new QMenu(parentMenu); + + // Set text: + if (qVariantCanConvert<QString>(displayData)) { + childMenu->setTitle(displayData.toString()); + } + + // Set icon: + if (qVariantCanConvert<QIcon>(iconData)) { + childMenu->setIcon(iconData.value<QIcon>()); + } + + // Set tooltip: + if (qVariantCanConvert<QString>(toolTipData)) { + childMenu->setToolTip(toolTipData.toString()); + } + // Set status tip: + if (qVariantCanConvert<QString>(statusTipData)) { + childMenu->setStatusTip(statusTipData.toString()); + } - // Map index - m_indexMap[childAction] = QPersistentModelIndex(child); + // Set whatsthis: + if (qVariantCanConvert<QString>(whatsThisData)) { + childMenu->setWhatsThis(whatsThisData.toString()); + } - // Add action to action group: - m_actions->addAction(childAction); + return childMenu; +} - // Add action to menu: - parentMenu->addAction(childAction); +void BtMenuView::buildMenu(QMenu *parentMenu, const QModelIndex &parentIndex) { + Q_ASSERT(m_model != 0); + Q_ASSERT(m_actions != 0); + + int children = m_model->rowCount(parentIndex); + for (int i = 0; i < children; i++) { + QModelIndex childIndex(m_model->index(i, 0, parentIndex)); + + if (m_model->rowCount(childIndex) > 0) { + QMenu *childMenu = newMenu(parentMenu, childIndex); + + if (childMenu != 0) { + // Add to menu: + parentMenu->addMenu(childMenu); + + // Populate the menu if not prohibited: + QVariant populate(childMenu->property("BtMenuView_NoPopulate")); + if (!populate.isValid() || populate.toBool()) { + buildMenu(childMenu, childIndex); + } + } + } else { + QAction *childAction = newAction(parentMenu, childIndex); + + if (childAction != 0) { + // Map index + m_indexMap.insert(childAction, childIndex); + + // Add action to action group: + childAction->setActionGroup(m_actions); + + // Add action to menu: + parentMenu->addAction(childAction); + } } } } void BtMenuView::slotAboutToShow() { - if (m_actions != 0) { - delete m_actions; - m_actions = 0; - } + delete m_actions; + m_actions = 0; m_indexMap.clear(); - if (m_model == 0) return; + preBuildMenu(); - m_actions = new QActionGroup(this); - connect(m_actions, SIGNAL(triggered(QAction*)), - this, SLOT(slotActionTriggered(QAction*))); + if (m_model != 0) { + m_actions = new QActionGroup(this); - QModelIndex parentIndex; - buildMenu(this, parentIndex); + buildMenu(this, m_parentIndex); + } + postBuildMenu(); } void BtMenuView::slotAboutToHide() { @@ -152,10 +196,9 @@ void BtMenuView::slotAboutToHide() { } void BtMenuView::slotActionTriggered(QAction *action) { - Q_ASSERT(m_indexMap.contains(action)); + if (!m_indexMap.contains(action)) return; QPersistentModelIndex itemIndex(m_indexMap.value(action)); if (itemIndex.isValid()) { emit triggered(itemIndex); } } - |