summaryrefslogtreecommitdiff
path: root/src/frontend/btmenuview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/btmenuview.cpp')
-rw-r--r--src/frontend/btmenuview.cpp227
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);
}
}
-