diff options
Diffstat (limited to 'src/bibletime_init.cpp')
-rw-r--r-- | src/bibletime_init.cpp | 800 |
1 files changed, 555 insertions, 245 deletions
diff --git a/src/bibletime_init.cpp b/src/bibletime_init.cpp index cbff79f..4ac6350 100644 --- a/src/bibletime_init.cpp +++ b/src/bibletime_init.cpp @@ -2,7 +2,7 @@ * * This file is part of BibleTime's source code, http://www.bibletime.info/. * -* Copyright 1999-2008 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. * **********/ @@ -18,53 +18,65 @@ #include <QPointer> #include <QSplitter> #include <QToolBar> +#include <QToolButton> #include <QVBoxLayout> #include "backend/config/cbtconfig.h" #include "backend/managers/btstringmgr.h" #include "backend/managers/clanguagemgr.h" #include "backend/managers/cswordbackend.h" #include "frontend/btbookshelfdockwidget.h" +#include "frontend/btopenworkaction.h" #include "frontend/cinfodisplay.h" #include "frontend/cmdiarea.h" #include "frontend/cprinter.h" #include "frontend/displaywindow/btactioncollection.h" -#include "frontend/mainindex/bookmarks/cbookmarkindex.h" +#include "frontend/displaywindow/btmodulechooserbar.h" +#include "frontend/bookmarks/cbookmarkindex.h" #include "frontend/profile/cprofile.h" #include "frontend/profile/cprofilemgr.h" -#include "util/cpointers.h" #include "util/cresmgr.h" #include "util/directory.h" // Sword includes: #include <swlog.h> +#ifdef BT_DEBUG +#include <QLabel> +#include <QMetaObject> +#include <QMutexLocker> +#include <QTimer> +#endif + using namespace InfoDisplay; using namespace Profile; /**Initializes the view of this widget*/ void BibleTime::initView() { + + // Create menu and toolbar before the mdi area + createMenuAndToolBar(); + m_mdi = new CMDIArea(this); setCentralWidget(m_mdi); m_bookshelfDock = new BtBookshelfDockWidget(this); addDockWidget(Qt::LeftDockWidgetArea, m_bookshelfDock); - m_bookmarksDock = new QDockWidget(tr("Bookmarks"), this); + m_bookmarksDock = new QDockWidget(this); m_bookmarksDock->setObjectName("BookmarksDock"); m_bookmarksPage = new CBookmarkIndex(0); m_bookmarksDock->setWidget(m_bookmarksPage); addDockWidget(Qt::LeftDockWidgetArea, m_bookmarksDock); tabifyDockWidget(m_bookmarksDock, m_bookshelfDock); - m_magDock = new QDockWidget(tr("Mag"), this); + m_magDock = new QDockWidget(this); m_magDock->setObjectName("MagDock"); m_infoDisplay = new CInfoDisplay(this); m_infoDisplay->resize(150, 150); m_magDock->setWidget(m_infoDisplay); addDockWidget(Qt::LeftDockWidgetArea, m_magDock); - CPointers::setInfoDisplay(m_infoDisplay); m_mdi->setMinimumSize(100, 100); m_mdi->setFocusPolicy(Qt::ClickFocus); } @@ -158,6 +170,13 @@ void BibleTime::insertKeyboardActions( BtActionCollection* const a ) { a->addAction("autoTile", action); action = new QAction(a); + action->setText(tr("Ta&bbed")); + action->setIcon(DU::getIcon(CResMgr::mainMenu::window::arrangementMode::autoTabbed::icon)); + action->setShortcut(QKeySequence(CResMgr::mainMenu::window::arrangementMode::autoTabbed::accel)); + action->setToolTip(tr("Automatically tab the open windows")); + a->addAction("autoTabbed", action); + + action = new QAction(a); action->setText(tr("Auto-&cascade")); action->setIcon(DU::getIcon(CResMgr::mainMenu::window::arrangementMode::autoCascade::icon)); action->setShortcut(QKeySequence(CResMgr::mainMenu::window::arrangementMode::autoCascade::accel)); @@ -237,241 +256,431 @@ void BibleTime::insertKeyboardActions( BtActionCollection* const a ) { action->setText(tr("&About BibleTime")); action->setToolTip(tr("Information about the BibleTime program")); a->addAction("aboutBibleTime", action); -} -/** Initializes the action objects of the GUI */ -void BibleTime::initActions() { - m_actionCollection = new BtActionCollection(this); + action = new QAction(a); + action->setText(tr("&Tip of the day...")); + action->setIcon(DU::getIcon(CResMgr::mainMenu::help::tipOfTheDay::icon)); + action->setShortcut(QKeySequence(CResMgr::mainMenu::help::tipOfTheDay::accel)); + action->setToolTip(tr("Show tips about BibleTime")); + a->addAction("tipOfTheDay", action); - /** - * Create the window to signal mapper and connect it up. - */ - m_windowMapper = new QSignalMapper(this); - connect(m_windowMapper, SIGNAL(mapped(QWidget*)), - this, SLOT(slotSetActiveSubWindow(QWidget*))); + action = new QAction(a); + a->addAction("showToolbarsInTextWindows", action); - insertKeyboardActions(m_actionCollection); + action = new QAction(a); + a->addAction("showNavigation", action); - // Main menus - QMenu* fileMenu = menuBar()->addMenu(tr("&File")); - QMenu* viewMenu = menuBar()->addMenu(tr("&View")); - QMenu* searchMenu = menuBar()->addMenu(tr("&Search")); - m_windowMenu = menuBar()->addMenu(tr("&Window")); - QMenu* settingsMenu = menuBar()->addMenu(tr("Se&ttings")); - QMenu* helpMenu = menuBar()->addMenu(tr("&Help")); - - // Name of the main toolbar - m_mainToolBar = addToolBar(tr("Main Toolbar")); - m_mainToolBar->setObjectName("MainToolBar"); - m_mainToolBar->setFloatable(false); - m_mainToolBar->setMovable(false); - - QAction* tmp = m_actionCollection->action("quit"); - fileMenu->addAction(tmp); - connect(tmp, SIGNAL(triggered()), this, SLOT(quit()) ); - - - // ********** View menu ********************* - - m_windowFullscreen_action = m_actionCollection->action("toggleFullscreen"); - m_windowFullscreen_action->setCheckable(true); - viewMenu->addAction(m_windowFullscreen_action); - m_mainToolBar->addAction(m_windowFullscreen_action); - connect(m_windowFullscreen_action, SIGNAL(triggered()), this, SLOT(toggleFullscreen()) ); - - m_viewToolbar_action = m_actionCollection->action("showToolbar"); - m_viewToolbar_action->setCheckable(true); - m_viewToolbar_action->setChecked(true); - viewMenu->addAction(m_viewToolbar_action); - connect(m_viewToolbar_action, SIGNAL(triggered()), this, SLOT(slotToggleToolbar()) ); - - QAction* action = m_bookshelfDock->toggleViewAction(); - action->setText(tr("Show Bookshelf")); - viewMenu->addAction(action); - - action = m_bookmarksDock->toggleViewAction(); - action->setText(tr("Show Bookmarks")); - viewMenu->addAction(action); - - action = m_magDock->toggleViewAction(); - action->setText(tr("Show Mag")); - viewMenu->addAction(action); - - viewMenu->addSeparator(); - QMenu* textWindowsMenu = new QMenu(tr("Text windows")); - viewMenu->addMenu(textWindowsMenu); - - action = new QAction(tr("Show text area headers"), this); - action->setCheckable(true); - action->setChecked(CBTConfig::get(CBTConfig::showTextWindowHeaders)); - connect(action, SIGNAL(toggled(bool)), SLOT(slotToggleTextWindowHeader())); - textWindowsMenu->addAction(action); - - action = new QAction(tr("Show navigation"), this); - action->setCheckable(true); - action->setChecked(CBTConfig::get(CBTConfig::showTextWindowNavigator)); - connect(action, SIGNAL(toggled(bool)), SLOT(slotToggleTextWindowNavigator())); - textWindowsMenu->addAction(action); - - action = new QAction(tr("Show work chooser buttons"), this); - action->setCheckable(true); - action->setChecked(CBTConfig::get(CBTConfig::showTextWindowModuleSelectorButtons)); - connect(action, SIGNAL(toggled(bool)), SLOT(slotToggleTextWindowModuleChooser())); - textWindowsMenu->addAction(action); - - action = new QAction(tr("Show tools"), this); - action->setCheckable(true); - action->setChecked(CBTConfig::get(CBTConfig::showTextWindowToolButtons)); - connect(action, SIGNAL(toggled(bool)), SLOT(slotToggleTextWindowToolButtons())); - textWindowsMenu->addAction(action); - - // ************************************* - m_mainToolBar->addSeparator(); + action = new QAction(a); + a->addAction("showWorks", action); - tmp = m_actionCollection->action("searchOpenWorks"); - searchMenu->addAction(tmp); - m_mainToolBar->addAction(tmp); - m_mainToolBar->addSeparator(); - connect(tmp, SIGNAL(triggered()), this, SLOT(slotSearchModules()) ); + action = new QAction(a); + a->addAction("showTools", action); - tmp = m_actionCollection->action("searchStdBible"); - searchMenu->addAction(tmp); - connect(tmp, SIGNAL(triggered()), this, SLOT(slotSearchDefaultBible()) ); + action = new QAction(a); + a->addAction("showFormat", action); - /** - * Window Menu - */ - m_openWindowsMenu = new QMenu(tr("O&pen Windows"), m_windowMenu); - m_windowMenu->addMenu(m_openWindowsMenu); + action = new QAction(a); + a->addAction("showParallelTextHeaders", action); - m_windowClose_action = m_actionCollection->action("closeWindow"); - m_windowMenu->addAction(m_windowClose_action); - connect(m_windowClose_action, SIGNAL(triggered()), m_mdi, SLOT(closeActiveSubWindow())); + action = new QAction(a); + a->addAction("showBookshelf", action); - m_windowCloseAll_action = m_actionCollection->action("closeAllWindows"); - m_windowMenu->addAction(m_windowCloseAll_action); - connect(m_windowCloseAll_action, SIGNAL(triggered()), m_mdi, SLOT(closeAllSubWindows())); + action = new QAction(a); + a->addAction("showBookmarks", action); - m_windowMenu->addSeparator(); + action = new QAction(a); + a->addAction("showMag", action); - // *** Window arrangement actions *** + retranslateUiActions(a); +} - m_windowCascade_action = m_actionCollection->action("cascade"); - m_windowMenu->addAction(m_windowCascade_action); - connect(m_windowCascade_action, SIGNAL(triggered()), this, SLOT(slotCascade()) ); +static QToolBar* createToolBar(const QString& name, QWidget* parent, bool visible) { + QToolBar* bar = new QToolBar(parent); + bar->setObjectName(name); + bar->setFloatable(false); + bar->setMovable(true); + bar->setVisible(visible); + return bar; +} - m_windowTile_action = m_actionCollection->action("tile"); - m_windowMenu->addAction(m_windowTile_action); - connect(m_windowTile_action, SIGNAL(triggered()), this, SLOT(slotTile()) ); +void BibleTime::clearMdiToolBars() { + // Clear main window toolbars + m_navToolBar->clear(); + m_worksToolBar->clear(); + m_toolsToolBar->clear(); + m_formatToolBar->clear(); +} - m_windowTileVertical_action = m_actionCollection->action("tileVertically"); - m_windowMenu->addAction(m_windowTileVertical_action); - connect(m_windowTileVertical_action, SIGNAL(triggered()), this, SLOT(slotTileVertical()) ); +void BibleTime::createMenuAndToolBar() +{ + // Create menubar + menuBar(); - m_windowTileHorizontal_action = m_actionCollection->action("tileHorizontally"); - m_windowMenu->addAction(m_windowTileHorizontal_action); - connect(m_windowTileHorizontal_action, SIGNAL(triggered()), this, SLOT(slotTileHorizontal()) ); + m_mainToolBar = createToolBar("MainToolBar", this, true); + addToolBar(m_mainToolBar); - QMenu* arrangementMenu = new QMenu(tr("&Arrangement mode")); - m_windowMenu->addMenu(arrangementMenu); + // Set visibility of main window toolbars based on config + bool visible = ! CBTConfig::get(CBTConfig::showToolbarsInEachWindow); - m_windowManualMode_action = m_actionCollection->action("manualArrangement"); - m_windowManualMode_action->setCheckable(true); - arrangementMenu->addAction(m_windowManualMode_action); - connect(m_windowManualMode_action, SIGNAL(triggered()), this, SLOT(slotManualArrangementMode()) ); + m_navToolBar = createToolBar("NavToolBar", this, visible); + addToolBar(m_navToolBar); - //: Vertical tiling means that windows are vertical, placed side by side - m_windowAutoTileVertical_action = m_actionCollection->action("autoVertical"); - m_windowAutoTileVertical_action->setCheckable(true); - arrangementMenu->addAction(m_windowAutoTileVertical_action); - connect(m_windowAutoTileVertical_action, SIGNAL(triggered()), this, SLOT(slotAutoTileVertical()) ); + m_worksToolBar = new BtModuleChooserBar(this); + m_worksToolBar->setObjectName("WorksToolBar"); + m_worksToolBar->setVisible(visible); + addToolBar(m_worksToolBar); - //: Horizontal tiling means that windows are horizontal, placed on top of each other - m_windowAutoTileHorizontal_action = m_actionCollection->action("autoHorizontal"); - m_windowAutoTileHorizontal_action->setCheckable(true); - arrangementMenu->addAction(m_windowAutoTileHorizontal_action); - connect(m_windowAutoTileHorizontal_action, SIGNAL(triggered()), this, SLOT(slotAutoTileHorizontal()) ); + m_toolsToolBar = createToolBar("ToolsToolBar", this, visible); + addToolBar(m_toolsToolBar); - m_windowAutoTile_action = m_actionCollection->action("autoTile"); - m_windowAutoTile_action->setCheckable(true); - arrangementMenu->addAction(m_windowAutoTile_action); - connect(m_windowAutoTile_action, SIGNAL(triggered()), this, SLOT(slotAutoTile()) ); + m_formatToolBar = createToolBar("FormatToolBar", this, visible); + addToolBar(m_formatToolBar); +} - m_windowAutoCascade_action = m_actionCollection->action("autoCascade"); - m_windowAutoCascade_action->setCheckable(true); - arrangementMenu->addAction(m_windowAutoCascade_action); - connect(m_windowAutoCascade_action, SIGNAL(triggered()), this, SLOT(slotAutoCascade()) ); +/** Initializes the action objects of the GUI */ +void BibleTime::initActions() { + m_actionCollection = new BtActionCollection(this); + insertKeyboardActions(m_actionCollection); - m_windowMenu->addSeparator(); + // Create the window to signal mapper and connect it up: + m_windowMapper = new QSignalMapper(this); + connect(m_windowMapper, SIGNAL(mapped(QWidget*)), + this, SLOT(slotSetActiveSubWindow(QWidget*))); + + // File menu actions: + m_openWorkAction = new BtOpenWorkAction("GUI/MainWindow/OpenWorkAction/grouping", this); + connect(m_openWorkAction, SIGNAL(triggered(CSwordModuleInfo*)), + this, SLOT(createReadDisplayWindow(CSwordModuleInfo*))); + + m_quitAction = m_actionCollection->action("quit"); + connect(m_quitAction, SIGNAL(triggered()), + this, SLOT(quit())); + + + // View menu actions: + m_windowFullscreenAction = m_actionCollection->action("toggleFullscreen"); + m_windowFullscreenAction->setCheckable(true); + connect(m_windowFullscreenAction, SIGNAL(triggered()), + this, SLOT(toggleFullscreen())); + + m_viewToolbarAction = m_actionCollection->action("showToolbar"); + m_viewToolbarAction->setCheckable(true); + m_viewToolbarAction->setChecked(true); + connect(m_viewToolbarAction, SIGNAL(triggered()), + this, SLOT(slotToggleMainToolbar())); + + // Special case these actions, overwrite those already in collection + m_showBookshelfAction = m_bookshelfDock->toggleViewAction(); + m_actionCollection->addAction("showBookshelf", m_showBookshelfAction); + m_showBookmarksAction = m_bookmarksDock->toggleViewAction(); + m_actionCollection->addAction("showBookmarks", m_showBookmarksAction); + m_showMagAction = m_magDock->toggleViewAction(); + m_actionCollection->addAction("showMag", m_showMagAction); + + m_showTextAreaHeadersAction = m_actionCollection->action("showParallelTextHeaders"); + m_showTextAreaHeadersAction->setCheckable(true); + m_showTextAreaHeadersAction->setChecked(CBTConfig::get(CBTConfig::showTextWindowHeaders)); + connect(m_showTextAreaHeadersAction, SIGNAL(toggled(bool)), + this, SLOT(slotToggleTextWindowHeader())); + + m_showTextWindowNavigationAction = m_actionCollection->action("showNavigation"); + m_showTextWindowNavigationAction->setCheckable(true); + m_showTextWindowNavigationAction->setChecked(CBTConfig::get(CBTConfig::showTextWindowNavigator)); + connect(m_showTextWindowNavigationAction, SIGNAL(toggled(bool)), + this, SLOT(slotToggleNavigatorToolbar())); + + m_showTextWindowModuleChooserAction = m_actionCollection->action("showWorks"); + m_showTextWindowModuleChooserAction->setCheckable(true); + m_showTextWindowModuleChooserAction->setChecked(CBTConfig::get(CBTConfig::showTextWindowModuleSelectorButtons)); + connect(m_showTextWindowModuleChooserAction, SIGNAL(toggled(bool)), + this, SLOT(slotToggleWorksToolbar())); + + m_showTextWindowToolButtonsAction = m_actionCollection->action("showTools"); + m_showTextWindowToolButtonsAction->setCheckable(true); + m_showTextWindowToolButtonsAction->setChecked(CBTConfig::get(CBTConfig::showTextWindowToolButtons)); + connect(m_showTextWindowToolButtonsAction, SIGNAL(toggled(bool)), + this, SLOT(slotToggleToolsToolbar())); + + m_showFormatToolbarAction = m_actionCollection->action("showFormat"); + m_showFormatToolbarAction->setCheckable(true); + m_showFormatToolbarAction->setChecked(CBTConfig::get(CBTConfig::showFormatToolbarButtons)); + bool ok = connect(m_showFormatToolbarAction, SIGNAL(toggled(bool)), + this, SLOT(slotToggleFormatToolbar())); + + m_toolbarsInEachWindow = m_actionCollection->action("showToolbarsInTextWindows"); + m_toolbarsInEachWindow->setCheckable(true); + m_toolbarsInEachWindow->setChecked(CBTConfig::get(CBTConfig::showToolbarsInEachWindow)); + ok = connect(m_toolbarsInEachWindow, SIGNAL(toggled(bool)), + this, SLOT(slotToggleToolBarsInEachWindow())); + Q_ASSERT(ok); - m_windowSaveProfileMenu = new QMenu(tr("&Save session")); - m_windowMenu->addMenu(m_windowSaveProfileMenu); + // Search menu actions: + m_searchOpenWorksAction = m_actionCollection->action("searchOpenWorks"); + connect(m_searchOpenWorksAction, SIGNAL(triggered()), + this, SLOT(slotSearchModules())); - m_windowSaveToNewProfile_action = m_actionCollection->action("saveNewSession"); - m_windowMenu->addAction(m_windowSaveToNewProfile_action); - connect(m_windowSaveToNewProfile_action, SIGNAL(triggered()), this, SLOT(saveToNewProfile()) ); + m_searchStandardBibleAction = m_actionCollection->action("searchStdBible"); + connect(m_searchStandardBibleAction, SIGNAL(triggered()), + this, SLOT(slotSearchDefaultBible())); - m_windowLoadProfileMenu = new QMenu(tr("&Load session")); - m_windowMenu->addMenu(m_windowLoadProfileMenu); + // Window menu actions: + m_windowCloseAction = m_actionCollection->action("closeWindow"); + connect(m_windowCloseAction, SIGNAL(triggered()), + m_mdi, SLOT(closeActiveSubWindow())); - m_windowDeleteProfileMenu = new QMenu(tr("&Delete session")); - m_windowMenu->addMenu(m_windowDeleteProfileMenu); + m_windowCloseAllAction = m_actionCollection->action("closeAllWindows"); + connect(m_windowCloseAllAction, SIGNAL(triggered()), + m_mdi, SLOT(closeAllSubWindows())); - QObject::connect(m_windowLoadProfileMenu, SIGNAL(triggered(QAction*)), SLOT(loadProfile(QAction*))); - QObject::connect(m_windowSaveProfileMenu, SIGNAL(triggered(QAction*)), SLOT(saveProfile(QAction*))); - QObject::connect(m_windowDeleteProfileMenu, SIGNAL(triggered(QAction*)), SLOT(deleteProfile(QAction*))); + m_windowCascadeAction = m_actionCollection->action("cascade"); + connect(m_windowCascadeAction, SIGNAL(triggered()), + this, SLOT(slotCascade())); - refreshProfileMenus(); + m_windowTileAction = m_actionCollection->action("tile"); + connect(m_windowTileAction, SIGNAL(triggered()), + this, SLOT(slotTile())); + + m_windowTileVerticalAction = m_actionCollection->action("tileVertically"); + connect(m_windowTileVerticalAction, SIGNAL(triggered()), + this, SLOT(slotTileVertical())); + + m_windowTileHorizontalAction = m_actionCollection->action("tileHorizontally"); + connect(m_windowTileHorizontalAction, SIGNAL(triggered()), + this, SLOT(slotTileHorizontal())); - tmp = m_actionCollection->action("setPreferences"); - settingsMenu->addAction(tmp); - connect(tmp, SIGNAL(triggered()), this, SLOT(slotSettingsOptions()) ); + m_windowManualModeAction = m_actionCollection->action("manualArrangement"); + m_windowManualModeAction->setCheckable(true); + connect(m_windowManualModeAction, SIGNAL(triggered()), + this, SLOT(slotManualArrangementMode())); - settingsMenu->addSeparator(); + m_windowAutoTabbedAction = m_actionCollection->action("autoTabbed"); + m_windowAutoTabbedAction->setCheckable(true); + connect(m_windowAutoTabbedAction, SIGNAL(triggered()), + this, SLOT(slotAutoTabbed())); - tmp = m_actionCollection->action("bookshelfManager"); - settingsMenu->addAction(tmp); - connect(tmp, SIGNAL(triggered()), this, SLOT(slotSwordSetupDialog()) ); + //: Vertical tiling means that windows are vertical, placed side by side + m_windowAutoTileVerticalAction = m_actionCollection->action("autoVertical"); + m_windowAutoTileVerticalAction->setCheckable(true); + connect(m_windowAutoTileVerticalAction, SIGNAL(triggered()), + this, SLOT(slotAutoTileVertical())); + + //: Horizontal tiling means that windows are horizontal, placed on top of each other + m_windowAutoTileHorizontalAction = m_actionCollection->action("autoHorizontal"); + m_windowAutoTileHorizontalAction->setCheckable(true); + connect(m_windowAutoTileHorizontalAction, SIGNAL(triggered()), + this, SLOT(slotAutoTileHorizontal())); + + m_windowAutoTileAction = m_actionCollection->action("autoTile"); + m_windowAutoTileAction->setCheckable(true); + connect(m_windowAutoTileAction, SIGNAL(triggered()), + this, SLOT(slotAutoTile())); + + m_windowAutoCascadeAction = m_actionCollection->action("autoCascade"); + m_windowAutoCascadeAction->setCheckable(true); + connect(m_windowAutoCascadeAction, SIGNAL(triggered()), + this, SLOT(slotAutoCascade())); + + m_windowSaveToNewProfileAction = m_actionCollection->action("saveNewSession"); + connect(m_windowSaveToNewProfileAction, SIGNAL(triggered()), + this, SLOT(saveToNewProfile())); + + m_setPreferencesAction = m_actionCollection->action("setPreferences"); + connect(m_setPreferencesAction, SIGNAL(triggered()), + this, SLOT(slotSettingsOptions())); + + m_bookshelfManagerAction = m_actionCollection->action("bookshelfManager"); + connect(m_bookshelfManagerAction, SIGNAL(triggered()), + this, SLOT(slotSwordSetupDialog())); + + m_openHandbookAction = m_actionCollection->action("openHandbook"); + connect(m_openHandbookAction, SIGNAL(triggered()), + this, SLOT(openOnlineHelp_Handbook())); + + m_bibleStudyHowtoAction = m_actionCollection->action("bibleStudyHowto"); + connect(m_bibleStudyHowtoAction, SIGNAL(triggered()), + this, SLOT(openOnlineHelp_Howto())); + + m_aboutBibleTimeAction = m_actionCollection->action("aboutBibleTime"); + connect(m_aboutBibleTimeAction, SIGNAL(triggered()), + this, SLOT(slotOpenAboutDialog()) ); + + m_tipOfTheDayAction = m_actionCollection->action("tipOfTheDay"); + connect(m_tipOfTheDayAction, SIGNAL(triggered()), + this, SLOT(slotOpenTipDialog()) ); + + #ifdef BT_DEBUG + m_debugWidgetAction = new QAction(this); + m_debugWidgetAction->setCheckable(true); + connect(m_debugWidgetAction, SIGNAL(triggered(bool)), + this, SLOT(slotShowDebugWindow(bool))); + #endif + + retranslateUiActions(m_actionCollection); +} + +void BibleTime::initMenubar() { + // File menu: + m_fileMenu = new QMenu(this); + m_fileMenu->addAction(m_openWorkAction); + m_fileMenu->addSeparator(); + m_fileMenu->addAction(m_quitAction); + menuBar()->addMenu(m_fileMenu); + + // View menu: + m_viewMenu = new QMenu(this); + m_viewMenu->addAction(m_windowFullscreenAction); + m_viewMenu->addAction(m_showBookshelfAction); + m_viewMenu->addAction(m_showBookmarksAction); + m_viewMenu->addAction(m_showMagAction); + m_viewMenu->addAction(m_showTextAreaHeadersAction); + m_viewMenu->addSeparator(); + m_toolBarsMenu = new QMenu(this); + m_toolBarsMenu->addAction(m_viewToolbarAction); + m_toolBarsMenu->addAction(m_showTextWindowNavigationAction); + m_toolBarsMenu->addAction(m_showTextWindowModuleChooserAction); + m_toolBarsMenu->addAction(m_showTextWindowToolButtonsAction); + m_toolBarsMenu->addAction(m_showFormatToolbarAction); + m_toolBarsMenu->addSeparator(); + m_toolBarsMenu->addAction(m_toolbarsInEachWindow); + m_viewMenu->addMenu(m_toolBarsMenu); + menuBar()->addMenu(m_viewMenu); + + // Search menu: + m_searchMenu = new QMenu(this); + m_searchMenu->addAction(m_searchOpenWorksAction); + m_searchMenu->addAction(m_searchStandardBibleAction); + menuBar()->addMenu(m_searchMenu); + + // Window menu: + m_windowMenu = new QMenu(this); + m_openWindowsMenu = new QMenu(this); + QObject::connect(m_openWindowsMenu, SIGNAL(aboutToShow()), + this, SLOT(slotOpenWindowsMenuAboutToShow())); + m_windowMenu->addMenu(m_openWindowsMenu); + m_windowMenu->addAction(m_windowCloseAction); + m_windowMenu->addAction(m_windowCloseAllAction); + m_windowMenu->addSeparator(); + m_windowMenu->addAction(m_windowCascadeAction); + m_windowMenu->addAction(m_windowTileAction); + m_windowMenu->addAction(m_windowTileVerticalAction); + m_windowMenu->addAction(m_windowTileHorizontalAction); + m_windowArrangementMenu = new QMenu(this); + m_windowArrangementMenu->addAction(m_windowManualModeAction); + m_windowArrangementMenu->addAction(m_windowAutoTabbedAction); + m_windowArrangementMenu->addAction(m_windowAutoTileVerticalAction); + m_windowArrangementMenu->addAction(m_windowAutoTileHorizontalAction); + m_windowArrangementMenu->addAction(m_windowAutoTileAction); + m_windowArrangementMenu->addAction(m_windowAutoCascadeAction); + m_windowMenu->addMenu(m_windowArrangementMenu); + m_windowMenu->addSeparator(); + m_windowSaveProfileMenu = new QMenu(this); + m_windowMenu->addMenu(m_windowSaveProfileMenu); + m_windowMenu->addAction(m_windowSaveToNewProfileAction); + m_windowLoadProfileMenu = new QMenu(this); + m_windowMenu->addMenu(m_windowLoadProfileMenu); + m_windowDeleteProfileMenu = new QMenu(this); + m_windowMenu->addMenu(m_windowDeleteProfileMenu); + connect(m_windowLoadProfileMenu, SIGNAL(triggered(QAction*)), + this, SLOT(loadProfile(QAction*))); + connect(m_windowSaveProfileMenu, SIGNAL(triggered(QAction*)), + this, SLOT(saveProfile(QAction*))); + connect(m_windowDeleteProfileMenu, SIGNAL(triggered(QAction*)), + this, SLOT(deleteProfile(QAction*))); + refreshProfileMenus(); + menuBar()->addMenu(m_windowMenu); + connect(m_windowMenu, SIGNAL(aboutToShow()), + this, SLOT(slotWindowMenuAboutToShow())); + + // Settings menu: + m_settingsMenu = new QMenu(this); + m_settingsMenu->addAction(m_setPreferencesAction); + m_settingsMenu->addSeparator(); + m_settingsMenu->addAction(m_bookshelfManagerAction); + menuBar()->addMenu(m_settingsMenu); + + // Help menu: + m_helpMenu = new QMenu(this); + m_helpMenu->addAction(m_openHandbookAction); + m_helpMenu->addAction(m_bibleStudyHowtoAction); + m_helpMenu->addAction(m_tipOfTheDayAction); + m_helpMenu->addSeparator(); + m_helpMenu->addAction(m_aboutBibleTimeAction); + #ifdef BT_DEBUG + m_helpMenu->addSeparator(); + m_helpMenu->addAction(m_debugWidgetAction); + #endif + menuBar()->addMenu(m_helpMenu); +} - tmp = m_actionCollection->action("openHandbook"); - helpMenu->addAction(tmp); - m_mainToolBar->addAction(tmp); - connect(tmp, SIGNAL(triggered()), this, SLOT(openOnlineHelp_Handbook()) ); +void BibleTime::initToolbars() { + QToolButton *openWorkButton = new QToolButton(this); + openWorkButton->setDefaultAction(m_openWorkAction); + openWorkButton->setPopupMode(QToolButton::InstantPopup); + m_mainToolBar->addWidget(openWorkButton); - tmp = m_actionCollection->action("bibleStudyHowto"); - helpMenu->addAction(tmp); - connect(tmp, SIGNAL(triggered()), this, SLOT(openOnlineHelp_Howto()) ); + m_mainToolBar->addSeparator(); + m_mainToolBar->addAction(m_windowFullscreenAction); + m_mainToolBar->addSeparator(); + m_mainToolBar->addAction(m_searchOpenWorksAction); + m_mainToolBar->addSeparator(); + m_mainToolBar->addAction(m_openHandbookAction); +} - helpMenu->addSeparator(); +void BibleTime::retranslateUi() { + m_bookmarksDock->setWindowTitle(tr("Bookmarks")); + m_magDock->setWindowTitle(tr("Mag")); + m_mainToolBar->setWindowTitle(tr("Main toolbar")); + m_navToolBar->setWindowTitle(tr("Navigation toolbar")); + m_worksToolBar->setWindowTitle(tr("Works toolbar")); + m_toolsToolBar->setWindowTitle(tr("Tools toolbar")); + m_formatToolBar->setWindowTitle(tr("Format toolbar")); + + m_fileMenu->setTitle(tr("&File")); + m_viewMenu->setTitle(tr("&View")); + m_toolBarsMenu->setTitle(tr("Toolbars")); + + m_searchMenu->setTitle(tr("&Search")); + m_windowMenu->setTitle(tr("&Window")); + m_openWindowsMenu->setTitle(tr("O&pen windows")); + m_windowArrangementMenu->setTitle(tr("&Arrangement mode")); + m_windowSaveProfileMenu->setTitle(tr("&Save session")); + m_windowLoadProfileMenu->setTitle(tr("&Load session")); + m_windowDeleteProfileMenu->setTitle(tr("&Delete session")); + m_settingsMenu->setTitle(tr("Se&ttings")); + m_helpMenu->setTitle(tr("&Help")); + + #ifdef BT_DEBUG + m_debugWidgetAction->setText(tr("Show \"Whats this widget\" dialog")); + #endif + + retranslateUiActions(m_actionCollection); +} - tmp = m_actionCollection->action("aboutBibleTime"); - helpMenu->addAction(tmp); - connect(tmp, SIGNAL(triggered()), this, SLOT(slotOpenAboutDialog()) ); +/** retranslation for actions used in this class +* This is called for two different collections of actions +* One set is for the actual use in the menus, etc +* The second is used during the use of the configuration shortcut editor +*/ +void BibleTime::retranslateUiActions(BtActionCollection* ac) { + ac->action("showToolbarsInTextWindows")->setText(tr("Show toolbars in text windows")); + ac->action("showToolbar")->setText(tr("Show main toolbar")); + ac->action("showNavigation")->setText(tr("Show navigation bar")); + ac->action("showWorks")->setText(tr("Show works toolbar")); + ac->action("showTools")->setText(tr("Show tools toolbar")); + ac->action("showFormat")->setText(tr("Show formatting toolbar")); + ac->action("showBookshelf")->setText(tr("Show bookshelf")); + ac->action("showBookmarks")->setText(tr("Show bookmarks")); + ac->action("showMag")->setText(tr("Show mag")); + ac->action("showParallelTextHeaders")->setText(tr("Show parallel text headers")); } /** Initializes the SIGNAL / SLOT connections */ void BibleTime::initConnections() { - if (m_windowMenu) { - QObject::connect(m_windowMenu, SIGNAL(aboutToShow()), this, SLOT(slotWindowMenuAboutToShow())); - } - else { - qWarning() << "Main window: can't find window menu"; - } + // Bookmarks page connections: + connect(m_bookmarksPage, SIGNAL(createReadDisplayWindow(QList<CSwordModuleInfo*>, const QString&)), + this, SLOT(createReadDisplayWindow(QList<CSwordModuleInfo*>, const QString&))); - if (m_openWindowsMenu) { - QObject::connect(m_openWindowsMenu, SIGNAL(aboutToShow()), - this, SLOT(slotOpenWindowsMenuAboutToShow())); - } - else { - qWarning() << "Main window: can't find open windows menu"; - } - - bool ok; - ok = connect(m_bookmarksPage, - SIGNAL(createReadDisplayWindow(QList<CSwordModuleInfo*>, const QString&)), - this, - SLOT(createReadDisplayWindow(QList<CSwordModuleInfo*>, const QString&))); - Q_ASSERT(ok); + // Bookshelf dock connections: connect(m_bookshelfDock, SIGNAL(moduleOpenTriggered(CSwordModuleInfo*)), this, SLOT(createReadDisplayWindow(CSwordModuleInfo*))); connect(m_bookshelfDock, SIGNAL(moduleSearchTriggered(CSwordModuleInfo*)), @@ -481,11 +690,9 @@ void BibleTime::initConnections() { connect(m_bookshelfDock, SIGNAL(moduleEditHtmlTriggered(CSwordModuleInfo*)), this, SLOT(moduleEditHtml(CSwordModuleInfo*))); connect(m_bookshelfDock, SIGNAL(moduleUnlockTriggered(CSwordModuleInfo*)), - this, SLOT(moduleUnlock(CSwordModuleInfo*))); + this, SLOT(slotModuleUnlock(CSwordModuleInfo*))); connect(m_bookshelfDock, SIGNAL(moduleAboutTriggered(CSwordModuleInfo*)), this, SLOT(moduleAbout(CSwordModuleInfo*))); - - connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(slot_aboutToQuit())); } void BibleTime::initSwordConfigFile() { @@ -511,6 +718,24 @@ void BibleTime::initSwordConfigFile() { out << "\n"; file.close(); #endif + +#ifdef Q_WS_MAC + namespace DU = util::directory; + QString configFile = util::directory::getUserHomeSwordDir().filePath("sword.conf"); + QFile file(configFile); + if (file.exists()) { + return; + } + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + return; + } + QTextStream out(&file); + out << "\n"; + out << "[Install]\n"; + out << "DataPath=" << DU::convertDirSeparators( DU::getUserHomeSwordDir().absolutePath()) << "\n"; + out << "\n"; + file.close(); +#endif } /** Initializes the backend */ @@ -520,55 +745,64 @@ void BibleTime::initBackends() { initSwordConfigFile(); sword::StringMgr::setSystemStringMgr( new BTStringMgr() ); - sword::SWLog::getSystemLog()->setLogLevel(1); + sword::SWLog::getSystemLog()->setLogLevel(sword::SWLog::LOG_ERROR); + + if (qApp->property("--debug").toBool()) { + sword::SWLog::getSystemLog()->setLogLevel(sword::SWLog::LOG_DEBUG); + } - CSwordBackend* backend = new CSwordBackend(); +#ifdef Q_WS_MAC + // set a LocaleMgr with a fixed path to the locales.d of the DMG image on MacOS + // note: this must be done after setting the BTStringMgr, because this will reset the LocaleMgr + qDebug() << "Using sword locales dir: " << util::directory::getSwordLocalesDir().absolutePath().toUtf8(); + sword::LocaleMgr::setSystemLocaleMgr(new sword::LocaleMgr(util::directory::getSwordLocalesDir().absolutePath().toUtf8())); +#endif + + CSwordBackend *backend = CSwordBackend::createInstance(); backend->booknameLanguage(CBTConfig::get(CBTConfig::language) ); - CPointers::setBackend(backend); - const CSwordBackend::LoadError errorCode = CPointers::backend()->initModules(CSwordBackend::OtherChange); + const CSwordBackend::LoadError errorCode = CSwordBackend::instance()->initModules(CSwordBackend::OtherChange); if (errorCode != CSwordBackend::NoError) { //show error message that initBackend failed /// \todo -// switch (errorCode) { -// case CSwordBackend::NoSwordConfig: //mods.d or mods.conf missing -// { -// KStartupLogo::hideSplash(); -// qDebug() << "case CSwordBackend::NoSwordConfig"; -// BookshelfManager::CSwordSetupDialog dlg; -// dlg.showPart( BookshelfManager::CSwordSetupDialog::Sword ); -// dlg.exec(); -// break; -// } +// switch (errorCode) { +// case CSwordBackend::NoSwordConfig: //mods.d or mods.conf missing +// { +// KStartupLogo::hideSplash(); +// qDebug() << "case CSwordBackend::NoSwordConfig"; +// BookshelfManager::CSwordSetupDialog dlg; +// dlg.showPart( BookshelfManager::CSwordSetupDialog::Sword ); +// dlg.exec(); +// break; +// } // -// case CSwordBackend::NoModules: //no modules installed, but config exists -// { -// KStartupLogo::hideSplash(); -// qDebug() << "case CSwordBackend::NoModules"; -// BookshelfManager::CSwordSetupDialog dlg; -// dlg.showPart( BookshelfManager::CSwordSetupDialog::Install ); -// dlg.exec(); -// break; -// } +// case CSwordBackend::NoModules: //no modules installed, but config exists +// { +// KStartupLogo::hideSplash(); +// qDebug() << "case CSwordBackend::NoModules"; +// BookshelfManager::CSwordSetupDialog dlg; +// dlg.showPart( BookshelfManager::CSwordSetupDialog::Install ); +// dlg.exec(); +// break; +// } // -// default: //unknown error -// { -// KStartupLogo::hideSplash(); -// qDebug() << "unknown error"; -// BookshelfManager::CSwordSetupDialog dlg; -// dlg.showPart( BookshelfManager::CSwordSetupDialog::Sword ); -// dlg.exec(); -// break; -// } -// } +// default: //unknown error +// { +// KStartupLogo::hideSplash(); +// qDebug() << "unknown error"; +// BookshelfManager::CSwordSetupDialog dlg; +// dlg.showPart( BookshelfManager::CSwordSetupDialog::Sword ); +// dlg.exec(); +// break; +// } +// } } - //This function will + // This function will // - delete all orphaned indexes (no module present) if autoDeleteOrphanedIndices is true // - delete all indices of modules where hasIndex() returns false - //BookshelfManager::CManageIndicesWidget::deleteOrphanedIndices(); - /// \todo //backend::deleteOrphanedIndices(); + backend->deleteOrphanedIndices(); } @@ -577,10 +811,10 @@ void BibleTime::applyProfileSettings( CProfile* p ) { Q_ASSERT(p); if (!p) return; - //first Main Window state - restoreState(p->getMainwindowState()); + //first Main Window geometry restoreGeometry(p->getMainwindowGeometry()); - m_windowFullscreen_action->setChecked(isFullScreen()); + restoreState(p->getMainwindowState()); + m_windowFullscreenAction->setChecked(isFullScreen()); const CMDIArea::MDIArrangementMode newArrangementMode = p->getMDIArrangementMode(); //make sure actions are updated by calling the slot functions @@ -598,6 +832,9 @@ void BibleTime::applyProfileSettings( CProfile* p ) { case CMDIArea::ArrangementModeTile: slotAutoTile(); break; + case CMDIArea::ArrangementModeTabbed: + slotAutoTabbed(); + break; case CMDIArea::ArrangementModeManual: slotManualArrangementMode(); break; @@ -605,14 +842,87 @@ void BibleTime::applyProfileSettings( CProfile* p ) { slotAutoTileVertical(); break; } + layout()->invalidate(); } void BibleTime::storeProfileSettings( CProfile* p ) { - Q_ASSERT(p && m_windowFullscreen_action); - if (!p || !m_windowFullscreen_action) return; + Q_ASSERT(p && m_windowFullscreenAction); + if (!p || !m_windowFullscreenAction) return; p->setMainwindowState(saveState()); p->setMainwindowGeometry(saveGeometry()); p->setMDIArrangementMode(m_mdi->getMDIArrangementMode()); } +#if BT_DEBUG + +QLabel *BibleTime::m_debugWindow = 0; +QMutex BibleTime::m_debugWindowLock; + +void BibleTime::slotShowDebugWindow(bool show) { + if (show) { + QMutexLocker lock(&m_debugWindowLock); + if (m_debugWindow == 0) { + m_debugWindow = new QLabel(0, Qt::Dialog); + m_debugWindow->setAttribute(Qt::WA_DeleteOnClose); + m_debugWindow->setTextFormat(Qt::RichText); + m_debugWindow->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + m_debugWindow->setWindowTitle(tr("Whats this widget?")); + } + m_debugWindow->show(); + connect(m_debugWindow, SIGNAL(destroyed()), + this, SLOT(slotDebugWindowClosing()), Qt::DirectConnection); + QTimer::singleShot(0, this, SLOT(slotDebugTimeout())); + } else { + deleteDebugWindow(); + } +} + +void BibleTime::deleteDebugWindow() { + QMutexLocker lock(&m_debugWindowLock); + if (m_debugWindow != 0) { + m_debugWindow->disconnect(SIGNAL(destroyed()), this, SLOT(slotDebugWindowClosing())); + delete m_debugWindow; + m_debugWindow = 0; + } +} + +void BibleTime::slotDebugWindowClosing() { + QMutexLocker lock(&m_debugWindowLock); + m_debugWindow = 0; + m_debugWidgetAction->setChecked(false); +} + +void BibleTime::slotDebugTimeout() { + QMutexLocker lock(&m_debugWindowLock); + if (m_debugWindow == 0 || m_debugWindow->isVisible() == false) return; + + QTimer::singleShot(0, this, SLOT(slotDebugTimeout())); + QObject *w = QApplication::widgetAt(QCursor::pos()); + if (w != 0) { + QString objectHierarchy; + do { + const QMetaObject *m = w->metaObject(); + QString classHierarchy; + do { + if (!classHierarchy.isEmpty()) classHierarchy += ": "; + classHierarchy += m->className(); + + m = m->superClass(); + } while (m != 0); + if (!objectHierarchy.isEmpty()) { + objectHierarchy += "<br/><b>child of:</b> "; + } else { + objectHierarchy += "<b>This widget is:</b> "; + } + objectHierarchy += classHierarchy; + w = w->parent(); + } while (w != 0); + m_debugWindow->setText(objectHierarchy); + } else { + m_debugWindow->setText("No widget"); + } + m_debugWindow->resize(m_debugWindow->minimumSizeHint()); +} + +#endif |