diff options
Diffstat (limited to 'src/bibletime.cpp')
-rw-r--r-- | src/bibletime.cpp | 204 |
1 files changed, 112 insertions, 92 deletions
diff --git a/src/bibletime.cpp b/src/bibletime.cpp index f2478d9..d4fa90d 100644 --- a/src/bibletime.cpp +++ b/src/bibletime.cpp @@ -2,16 +2,13 @@ * * 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. * **********/ #include "bibletime.h" -#include <cstdlib> -#include <iostream> -#include <ctime> #include <QAction> #include <QApplication> #include <QCloseEvent> @@ -19,8 +16,10 @@ #include <QDebug> #include <QInputDialog> #include <QMdiSubWindow> +#include <QMessageBox> #include <QSplashScreen> #include <QSplitter> +#include <ctime> #include "backend/config/cbtconfig.h" #include "backend/drivers/cswordbiblemoduleinfo.h" #include "backend/drivers/cswordbookmoduleinfo.h" @@ -38,17 +37,22 @@ #include "frontend/displaywindow/cwritewindow.h" #include "frontend/keychooser/ckeychooser.h" #include "frontend/searchdialog/csearchdialog.h" -#include "util/cpointers.h" #include "util/cresmgr.h" #include "util/directory.h" using namespace Profile; -BibleTime::BibleTime() - : m_WindowWasMaximizedBeforeFullScreen(false) { +BibleTime *BibleTime::m_instance = 0; + +BibleTime::BibleTime(QWidget *parent, Qt::WindowFlags flags) + : QMainWindow(parent, flags), m_WindowWasMaximizedBeforeFullScreen(false) +{ namespace DU = util::directory; + Q_ASSERT(m_instance == 0); + m_instance = this; + QSplashScreen splash; bool showSplash = CBTConfig::get(CBTConfig::logo); QString splashHtml; @@ -90,16 +94,23 @@ BibleTime::BibleTime() Qt::AlignCenter); } initActions(); + initMenubar(); + initToolbars(); initConnections(); readSettings(); setWindowTitle("BibleTime " BT_VERSION); setWindowIcon(DU::getIcon(CResMgr::mainWindow::icon)); + retranslateUi(); } BibleTime::~BibleTime() { // delete m_dcopInterface; // The backend is deleted by the BibleTimeApp instance +#ifdef BT_DEBUG + deleteDebugWindow(); +#endif + saveSettings(); } /** Saves the properties of BibleTime to the application wide configfile */ @@ -107,17 +118,18 @@ void BibleTime::saveSettings() { /// \todo how to write settings? //accel()->writeSettings(CBTConfig::getConfig()); - CBTConfig::set(CBTConfig::toolbar, m_viewToolbar_action->isChecked()); + CBTConfig::set(CBTConfig::toolbar, m_viewToolbarAction->isChecked()); // set the default to false /* CBTConfig::set(CBTConfig::autoTileVertical, false); CBTConfig::set(CBTConfig::autoTileHorizontal, false); CBTConfig::set(CBTConfig::autoCascade, false); */ - CBTConfig::set(CBTConfig::autoTileVertical, m_windowAutoTileVertical_action->isChecked()); - CBTConfig::set(CBTConfig::autoTileHorizontal, m_windowAutoTileHorizontal_action->isChecked()); - CBTConfig::set(CBTConfig::autoTile, m_windowAutoTile_action->isChecked()); - CBTConfig::set(CBTConfig::autoCascade, m_windowAutoCascade_action->isChecked()); + CBTConfig::set(CBTConfig::autoTileVertical, m_windowAutoTileVerticalAction->isChecked()); + CBTConfig::set(CBTConfig::autoTileHorizontal, m_windowAutoTileHorizontalAction->isChecked()); + CBTConfig::set(CBTConfig::autoTile, m_windowAutoTileAction->isChecked()); + CBTConfig::set(CBTConfig::autoTabbed, m_windowAutoTabbedAction->isChecked()); + CBTConfig::set(CBTConfig::autoCascade, m_windowAutoCascadeAction->isChecked()); CProfile* p = m_profileMgr.startupProfile(); if (p) { @@ -131,31 +143,36 @@ void BibleTime::readSettings() { // accel()->readSettings(CBTConfig::getConfig()); CBTConfig::setupAccelSettings(CBTConfig::application, m_actionCollection); - m_viewToolbar_action->setChecked( CBTConfig::get(CBTConfig::toolbar) ); - slotToggleToolbar(); + m_viewToolbarAction->setChecked( CBTConfig::get(CBTConfig::toolbar) ); + slotToggleMainToolbar(); if ( CBTConfig::get(CBTConfig::autoTileVertical) ) { - m_windowAutoTileVertical_action->setChecked( true ); - m_windowManualMode_action->setChecked(false); + m_windowAutoTileVerticalAction->setChecked( true ); + m_windowManualModeAction->setChecked(false); slotAutoTileVertical(); } else if ( CBTConfig::get(CBTConfig::autoTileHorizontal) ) { - m_windowAutoTileHorizontal_action->setChecked( true ); - m_windowManualMode_action->setChecked(false); + m_windowAutoTileHorizontalAction->setChecked( true ); + m_windowManualModeAction->setChecked(false); slotAutoTileHorizontal(); } else if ( CBTConfig::get(CBTConfig::autoTile) ) { - m_windowAutoTile_action->setChecked(true); - m_windowManualMode_action->setChecked(false); + m_windowAutoTileAction->setChecked(true); + m_windowManualModeAction->setChecked(false); slotAutoTile(); } + else if ( CBTConfig::get(CBTConfig::autoTabbed) ) { + m_windowAutoTabbedAction->setChecked(true); + m_windowManualModeAction->setChecked(false); + slotAutoTabbed(); + } else if ( CBTConfig::get(CBTConfig::autoCascade) ) { - m_windowAutoCascade_action->setChecked(true); - m_windowManualMode_action->setChecked(false); + m_windowAutoCascadeAction->setChecked(true); + m_windowManualModeAction->setChecked(false); slotAutoCascade(); } else { - m_windowManualMode_action->setChecked(true); + m_windowManualModeAction->setChecked(true); slotManualArrangementMode(); } } @@ -167,10 +184,8 @@ CDisplayWindow* BibleTime::createReadDisplayWindow(QList<CSwordModuleInfo*> modu CDisplayWindow* displayWindow = CDisplayWindowFactory::createReadInstance(modules, m_mdi); if ( displayWindow ) { displayWindow->init(); - if (m_mdi->subWindowList().count() == 0) - displayWindow->showMaximized(); - else - displayWindow->show(); + m_mdi->addSubWindow(displayWindow); + displayWindow->show(); // if (!key.isEmpty()) displayWindow->lookupKey(key); } @@ -192,7 +207,7 @@ CDisplayWindow* BibleTime::createReadDisplayWindow(CSwordModuleInfo* module, con return createReadDisplayWindow(list, key); } -CDisplayWindow* BibleTime::createWriteDisplayWindow(CSwordModuleInfo* module, const QString& key, const CDisplayWindow::WriteWindowType& type) { +CDisplayWindow* BibleTime::createWriteDisplayWindow(CSwordModuleInfo* module, const QString& key, const CWriteWindow::WriteWindowType& type) { qApp->setOverrideCursor( QCursor(Qt::WaitCursor) ); QList<CSwordModuleInfo*> modules; @@ -201,6 +216,7 @@ CDisplayWindow* BibleTime::createWriteDisplayWindow(CSwordModuleInfo* module, co CDisplayWindow* displayWindow = CDisplayWindowFactory::createWriteInstance(modules, m_mdi, type); if ( displayWindow ) { displayWindow->init(); + m_mdi->addSubWindow(displayWindow); if (m_mdi->subWindowList().count() == 0) displayWindow->showMaximized(); else @@ -216,45 +232,64 @@ CDisplayWindow* BibleTime::moduleEditPlain(CSwordModuleInfo *module) { /// \todo Refactor this. return createWriteDisplayWindow(module, QString::null, - CDisplayWindow::PlainTextWindow); + CWriteWindow::PlainTextWindow); } CDisplayWindow* BibleTime::moduleEditHtml(CSwordModuleInfo *module) { /// \todo Refactor this. return createWriteDisplayWindow(module, QString::null, - CDisplayWindow::HTMLWindow); + CWriteWindow::HTMLWindow); } void BibleTime::searchInModule(CSwordModuleInfo *module) { /// \todo Refactor this. - QList<CSwordModuleInfo *> modules; + QList<const CSwordModuleInfo *> modules; modules.append(module); Search::CSearchDialog::openDialog(modules, QString::null); } -void BibleTime::moduleUnlock(CSwordModuleInfo *module) { +bool BibleTime::moduleUnlock(CSwordModuleInfo *module, QWidget *parent) { + /// \todo Write a proper unlocking dialog with integrated error messages. + QString unlockKey; bool ok; - const QString unlockKey = - QInputDialog::getText( - this, - tr("Unlock Work"), - tr("Enter the unlock key for this work."), - QLineEdit::Normal, - module->config(CSwordModuleInfo::CipherKey), - &ok + for (;;) { + unlockKey = QInputDialog::getText( + parent, tr("Unlock Work"), tr("Enter the unlock key for %1.").arg(module->name()), + QLineEdit::Normal, module->config(CSwordModuleInfo::CipherKey), &ok ); - if (ok) { - /// \todo Refactor. Unlock the module via a global modules model. - if (module->unlock(unlockKey)) { - CPointers::backend()->reloadModules(CSwordBackend::OtherChange); + if (!ok) return false; + module->unlock(unlockKey); + + /// \todo refactor this module reload + /* There is currently a deficiency in sword 1.6.1 in that backend->setCipherKey() does + * not work correctly for modules from which data was already fetched. Therefore we have to + * reload the modules. + */ + { + const QString moduleName(module->name()); + CSwordBackend *backend = CSwordBackend::instance(); + backend->reloadModules(CSwordBackend::OtherChange); + module = backend->findModuleByName(moduleName); + Q_ASSERT(module != 0); } + + if (!module->isLocked()) break; + QMessageBox::warning(parent, tr("Warning: Invalid unlock key!"), + tr("The unlock key you provided did not properly unlock this " + "module. Please try again.")); } + return true; +} + +void BibleTime::slotModuleUnlock(CSwordModuleInfo *module) { + moduleUnlock(module, this); } void BibleTime::moduleAbout(CSwordModuleInfo *module) { - BTAboutModuleDialog *dialog(new BTAboutModuleDialog(this, module)); + BTAboutModuleDialog *dialog = new BTAboutModuleDialog(module, this); + dialog->setAttribute(Qt::WA_DeleteOnClose); // Destroy dialog when closed dialog->show(); dialog->raise(); } @@ -269,28 +304,25 @@ void BibleTime::refreshDisplayWindows() { } /** Refresh main window accelerators */ -void::BibleTime::refreshBibleTimeAccel() { +void BibleTime::refreshBibleTimeAccel() { CBTConfig::setupAccelSettings(CBTConfig::application, m_actionCollection); } -/** Called before quit. */ -void BibleTime::slot_aboutToQuit() { - saveSettings(); -} - -/** Called before a window is closed */ -bool BibleTime::queryClose() { - qDebug() << "BibleTime::queryClose"; - bool ret = true; - - foreach(QMdiSubWindow* subWindow, m_mdi->subWindowList()) { +void BibleTime::closeEvent(QCloseEvent *event) { + /* + Sequentially queries all open subwindows whether its fine to close them. If some sub- + window returns false, the querying is stopped and the close event is ignored. If all + subwindows return true, the close event is accepted. + */ + Q_FOREACH(QMdiSubWindow *subWindow, m_mdi->subWindowList()) { if (CDisplayWindow* window = dynamic_cast<CDisplayWindow*>(subWindow->widget())) { - ret = ret && window->queryClose(); + if (!window->queryClose()) { + event->ignore(); + return; + } } - qDebug() << "return value:" << ret; } - qDebug() << "final return value:" << ret; - return ret; + event->accept(); } /** Restores the workspace if the flag for this is set in the config. */ @@ -300,32 +332,20 @@ void BibleTime::restoreWorkspace() { } } -/** Processes the commandline options given to BibleTime. */ -void BibleTime::processCommandline() { - QStringList args = qApp->QCoreApplication::arguments(); - - if (args.contains("--help") || args.contains("-h") || args.contains("/h") || args.contains("/?")) { - std::cout << "BibleTime" << std::endl << "--help (-h, /h, /?): Show this help message and exit" - << std::endl << "--ignore-session: open a clean session" << std:: endl << "--open-default-bible <ref>: " - << "Open the default Bible with the reference <ref>" << std::endl; - std::cout << "Some Qt arguments:" << std::endl << "-reverse: reverse the UI layout direction" - << std::endl; - exit(0); - //printHelpAndExit(); +void BibleTime::processCommandline(bool ignoreSession, const QString &bibleKey) { + if (CBTConfig::get(CBTConfig::crashedTwoTimes)) { + return; } - if ( !CBTConfig::get(CBTConfig::crashedTwoTimes) && - !args.contains("--ignore-session") ) { + + if (!ignoreSession) { restoreWorkspace(); } - if ( args.contains("--open-default-bible") && - !CBTConfig::get(CBTConfig::crashedLastTime) && - !CBTConfig::get(CBTConfig::crashedTwoTimes)) { - int index = args.indexOf("--open-default-bible"); - QString bibleKey; - if (index >= 0 && (index + 1) < args.size()) { - bibleKey = args.at(index + 1); - } + if (CBTConfig::get(CBTConfig::crashedLastTime)) { + return; + } + + if (!bibleKey.isNull()) { CSwordModuleInfo* bible = CBTConfig::get(CBTConfig::standardBible); if (bibleKey == "random") { CSwordVerseKey vk(0); @@ -336,10 +356,16 @@ void BibleTime::processCommandline() { int newIndex = rand() % maxIndex; vk.setPosition(sword::TOP); vk.Index(newIndex); - bibleKey = vk.key(); + createReadDisplayWindow(bible, vk.key()); + } else { + createReadDisplayWindow(bible, bibleKey); } - createReadDisplayWindow(bible, bibleKey); - m_mdi->myTileVertical();//we are sure only one window is open, which should be displayed fullscreen in the working area + + /* + We are sure only one window is open - it should be displayed + fullscreen in the working area: + */ + m_mdi->myTileVertical(); } } @@ -348,9 +374,3 @@ bool BibleTime::event(QEvent* event) { Search::CSearchDialog::closeDialog(); return QMainWindow::event(event); } - -QAction* BibleTime::getAction(const QString& actionName) -{ - return m_actionCollection->action(actionName); -} - |