summaryrefslogtreecommitdiff
path: root/src/frontend/displaywindow/bttextwindowheaderwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/displaywindow/bttextwindowheaderwidget.cpp')
-rw-r--r--src/frontend/displaywindow/bttextwindowheaderwidget.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/frontend/displaywindow/bttextwindowheaderwidget.cpp b/src/frontend/displaywindow/bttextwindowheaderwidget.cpp
new file mode 100644
index 0000000..3858efb
--- /dev/null
+++ b/src/frontend/displaywindow/bttextwindowheaderwidget.cpp
@@ -0,0 +1,197 @@
+/*********
+*
+* 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/bttextwindowheaderwidget.h"
+
+#include <QDebug>
+//#include <QHash>
+#include <QMenu>
+#include <QString>
+#include <QToolButton>
+#include <QToolTip>
+#include <QHBoxLayout>
+#include <QSizePolicy>
+#include <QLabel>
+
+#include "backend/config/cbtconfig.h"
+#include "backend/managers/cswordbackend.h"
+#include "frontend/displaywindow/bttextwindowheader.h"
+#include "util/cresmgr.h"
+#include "util/directory.h"
+#include "util/cpointers.h"
+
+const char* ActionType = "ActionType";
+
+BtTextWindowHeaderWidget::BtTextWindowHeaderWidget(BtTextWindowHeader *parent, CSwordModuleInfo::ModuleType mtype)
+ : QWidget(parent),
+ m_moduleType(mtype),
+ m_popup(0) {
+ QHBoxLayout* layout = new QHBoxLayout(this);
+ layout->setContentsMargins(0, 0, 0, 0);
+
+ m_label = new QLabel("", this);
+ QSizePolicy sizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
+ m_label->setSizePolicy(sizePolicy);
+ m_label->setStyleSheet("QLabel{font-weight:bold}");
+ layout->addWidget(m_label, 0, Qt::AlignRight);
+
+ m_button = new QToolButton( this );
+ m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ m_button->setPopupMode( QToolButton::InstantPopup );
+ m_button->setArrowType(Qt::NoArrow);
+ m_button->setStyleSheet("QToolButton{margin:0px;}QToolButton::menu-indicator{subcontrol-position: center center;}");
+ m_button->setToolTip( tr("Add/remove/replace") );
+
+ layout->addWidget(m_button, 0, Qt::AlignLeft);
+
+ m_separator = new QFrame(this);
+ m_separator->setFrameShape(QFrame::VLine);
+ layout->addWidget(m_separator);
+}
+
+BtTextWindowHeaderWidget::~BtTextWindowHeaderWidget() {}
+
+void BtTextWindowHeaderWidget::recreateWidget(QStringList newModulesToUse, QString thisModule, int newIndex) {
+ populateMenu();
+ updateWidget(newModulesToUse, thisModule, newIndex);
+}
+
+// don't remove yet, maybe we'll add icons to buttons...
+// const QString BtTextWindowHeaderWidget::iconName() {
+// qDebug() << "BtTextWindowHeaderWidget::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 BtTextWindowHeaderWidget::updateWidget(QStringList newModulesToUse, QString thisModule, int newIndex) {
+ //qDebug() << "BtTextWindowHeaderWidget::updateMenu" << newModulesToUse << thisModule << newIndex << this;
+ m_label->setText(thisModule);
+ // create the menu if it doesn't exist
+ if (!m_popup) populateMenu();
+
+ m_id = newIndex;
+ m_module = thisModule;
+ 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 );
+ }
+ }
+
+ if (m_id == newModulesToUse.count() - 1) {
+ // this is the rightmost module, hide the separator
+ m_separator->hide();
+ }
+ else {
+ m_separator->show();
+ }
+ m_removeAction->setDisabled((newModulesToUse.count() == 1) ? true : false);
+}
+
+/** Is called after a module was selected in the popup */
+void BtTextWindowHeaderWidget::moduleChosen( QAction* action ) {
+ //qDebug() << "BtTextWindowHeaderWidget::moduleChosen";
+
+ if (action->property(ActionType).toInt() == RemoveAction) { // note: this is for m_popup, the toplevel!
+ emit sigModuleRemove(m_id);
+ return;
+ }
+ if (action->property(ActionType).toInt() == AddAction) {
+ emit sigModuleAdd(m_id + 1, action->text());
+ return;
+ }
+ if (action->property(ActionType).toInt() == ReplaceAction) {
+ emit sigModuleReplace(m_id, action->text());
+ }
+}
+
+
+void BtTextWindowHeaderWidget::populateMenu() {
+ //qDebug()<<"BtTextWindowHeaderWidget::populateMenu";
+ delete m_popup;
+ m_popup = new QMenu(m_button);
+
+ connect(m_popup, SIGNAL(triggered(QAction*)), this, SLOT(moduleChosen(QAction*)));
+ m_button->setMenu(m_popup);
+
+ m_removeAction = new QAction(tr("Remove"), m_popup);
+ m_removeAction->setProperty(ActionType, RemoveAction);
+ m_removeAction->setIcon(util::directory::getIcon(CResMgr::displaywindows::general::removemoduleicon));
+ m_popup->addAction(m_removeAction);
+
+ // Add Replace and Add menus, both have all modules in them
+ QMenu* replaceItem = new QMenu(tr("Replace"), m_popup);
+ replaceItem->setIcon(util::directory::getIcon(CResMgr::displaywindows::general::replacemoduleicon));
+ replaceItem->setProperty(ActionType, ReplaceAction);
+ m_popup->addMenu(replaceItem);
+
+ QMenu* addItem = new QMenu(tr("Add"), m_popup);
+ addItem->setProperty(ActionType, AddAction);
+ addItem->setIcon(util::directory::getIcon(CResMgr::displaywindows::general::addmoduleicon));
+ m_popup->addMenu(addItem);
+
+ QList<QMenu*> toplevelMenus;
+ toplevelMenus.append(replaceItem);
+ toplevelMenus.append(addItem);
+
+ foreach(QMenu* menu, toplevelMenus) {
+ // ******* Add languages and modules ********
+ //m_popup->addSeparator();
+
+ // Filters: add only non-hidden, non-locked and correct 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, menu, (TypeOfAction)menu->property(ActionType).toInt());
+ }
+}
+
+void BtTextWindowHeaderWidget::addItemToMenu(BTModuleTreeItem* item, QMenu* menu, TypeOfAction actionType) {
+ qDebug() << "BtTextWindowHeaderWidget::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, actionType);
+ }
+ 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);
+ modItem->setProperty(ActionType, actionType);
+ menu->addAction(modItem);
+ }
+ }
+}