summaryrefslogtreecommitdiff
path: root/src/frontend/displaywindow/btmodulechooserbutton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/displaywindow/btmodulechooserbutton.cpp')
-rw-r--r--src/frontend/displaywindow/btmodulechooserbutton.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/frontend/displaywindow/btmodulechooserbutton.cpp b/src/frontend/displaywindow/btmodulechooserbutton.cpp
new file mode 100644
index 0000000..549123f
--- /dev/null
+++ b/src/frontend/displaywindow/btmodulechooserbutton.cpp
@@ -0,0 +1,166 @@
+/*********
+*
+* This file is part of BibleTime's source code, http://www.bibletime.info/.
+*
+* Copyright 1999-2008 by the BibleTime developers.
+* The BibleTime source code is licensed under the GNU General Public License version 2.0.
+*
+**********/
+
+#include "frontend/displaywindow/btmodulechooserbutton.h"
+
+#include <QDebug>
+#include <QHash>
+#include <QMenu>
+#include <QString>
+#include <QToolButton>
+#include <QToolTip>
+#include "backend/config/cbtconfig.h"
+#include "backend/managers/cswordbackend.h"
+#include "frontend/displaywindow/btmodulechooserbar.h"
+#include "util/cresmgr.h"
+#include "util/directory.h"
+#include "util/cpointers.h"
+
+
+BtModuleChooserButton::BtModuleChooserButton(BtModuleChooserBar *parent, CSwordModuleInfo::ModuleType mtype)
+ : QToolButton(parent),
+ m_moduleType(mtype),
+ m_popup(0) {
+ //qDebug()<<"BtModuleChooserButton::BtModuleChooserButton";
+ setPopupMode(QToolButton::InstantPopup);
+}
+
+BtModuleChooserButton::~BtModuleChooserButton() {}
+
+void BtModuleChooserButton::recreateMenu(QStringList newModulesToUse, QString thisModule, int newIndex) {
+ populateMenu();
+ updateMenu(newModulesToUse, thisModule, newIndex);
+}
+
+const QString BtModuleChooserButton::iconName() {
+ qDebug() << "BtModuleChooserButton::iconName, has module:" << m_hasModule;
+ switch (m_moduleType) {
+ case CSwordModuleInfo::Bible:
+ return (m_hasModule) ? CResMgr::modules::bible::icon_unlocked : CResMgr::modules::bible::icon_add;
+ case CSwordModuleInfo::Commentary:
+ return (m_hasModule) ? CResMgr::modules::commentary::icon_unlocked : CResMgr::modules::commentary::icon_add;
+ case CSwordModuleInfo::Lexicon:
+ return m_hasModule ? CResMgr::modules::lexicon::icon_unlocked : CResMgr::modules::lexicon::icon_add;
+ case CSwordModuleInfo::GenericBook:
+ return m_hasModule ? CResMgr::modules::book::icon_unlocked : CResMgr::modules::book::icon_add;
+ default: //return as default the bible icon
+ return CResMgr::modules::bible::icon_unlocked;
+ }
+}
+
+void BtModuleChooserButton::updateMenu(QStringList newModulesToUse, QString thisModule, int newIndex) {
+ //qDebug() << "BtModuleChooserButton::updateMenu" << newModulesToUse << thisModule << newIndex << this;
+ // create the menu if it doesn't exist
+ if (!m_popup) populateMenu();
+
+ m_id = newIndex;
+ m_module = thisModule;
+ m_hasModule = thisModule.isEmpty() ? false : true;
+ namespace DU = util::directory;
+
+ //All items are iterated and the state is changed properly
+ QListIterator<QMenu*> it(m_submenus);
+ while (it.hasNext()) {
+ QMenu* popup = it.next();
+ foreach (QAction* a, popup->actions()) {
+ a->setChecked( (a->text() == thisModule) ? true : false );
+ a->setDisabled( newModulesToUse.contains(a->text()) ? true : false );
+ }
+ }
+ m_noneAction->setChecked(m_hasModule ? false : true);
+ setIcon(DU::getIcon(iconName()));
+
+ if (m_hasModule) {
+ setToolTip( QString(tr("Select a work [%1]")).arg(m_module) );
+ }
+ else {
+ setToolTip( tr("Select an additional work") );
+ }
+ m_noneAction->setDisabled((newModulesToUse.count() == 1) ? true : false);
+ //qDebug()<<"BtModuleChooserButton::modulesChanged end";
+}
+
+/** Is called after a module was selected in the popup */
+void BtModuleChooserButton::moduleChosen( QAction* action ) {
+ //qDebug() << "BtModuleChooserButton::moduleChosen";
+
+ if (action->text() == tr("NONE")) { // note: this is for m_popup, the toplevel!
+ if (m_hasModule) {
+ qDebug() << "remove module" << m_id;
+ emit sigModuleRemove(m_id);
+ return;
+ }
+ else {
+ // nothing else is done but the item must be set to checked
+ // lest it change to unchecked
+ action->setChecked(true);
+ }
+ }
+ else {
+ if (!m_hasModule) {
+ emit sigModuleAdd(m_id + 1, action->text());
+ return;
+ }
+ emit sigModuleReplace(m_id, action->text());
+ }
+}
+
+
+void BtModuleChooserButton::populateMenu() {
+ //qDebug()<<"BtModuleChooserButton::populateMenu";
+ qDeleteAll(m_submenus);
+ m_submenus.clear();
+ delete m_popup;
+ m_popup = new QMenu(this);
+
+ m_noneAction = m_popup->addAction(tr("NONE"));
+ m_noneAction->setCheckable(true);
+ if (m_module.isEmpty()) m_noneAction->setChecked(true);
+
+ m_popup->addSeparator();
+ connect(m_popup, SIGNAL(triggered(QAction*)), this, SLOT(moduleChosen(QAction*)));
+ setMenu(m_popup);
+
+
+ // ******* Add languages and modules ********
+
+ // Filters: add only non-hidden and right type
+ BTModuleTreeItem::HiddenOff hiddenFilter;
+ TypeFilter typeFilter(m_moduleType);
+ QList<BTModuleTreeItem::Filter*> filters;
+ if (!CBTConfig::get(CBTConfig::bookshelfShowHidden)) {
+ filters.append(&hiddenFilter);
+ }
+ filters.append(&typeFilter);
+ BTModuleTreeItem root(filters, BTModuleTreeItem::LangMod);
+ // add all items recursively
+ addItemToMenu(&root, m_popup);
+}
+
+void BtModuleChooserButton::addItemToMenu(BTModuleTreeItem* item, QMenu* menu) {
+ qDebug() << "BtModuleChooserButton::addItemToMenu";
+ foreach (BTModuleTreeItem* i, item->children()) {
+
+ if (i->type() == BTModuleTreeItem::Language) {
+ // argument menu was m_popup, create and add a new lang menu to it
+ QMenu* langMenu = new QMenu(i->text(), this);
+ menu->addMenu(langMenu);
+ m_submenus.append(langMenu);
+ // add the module items to the lang menu
+ addItemToMenu(i, langMenu);
+ }
+ else {
+ // item must be module, create and add it to the lang menu
+ QString name(i->text());
+ QAction* modItem = new QAction(name, menu);
+ modItem->setCheckable(true);
+ menu->addAction(modItem);
+ }
+ }
+}