BibleTime
bibletime_slots.cpp
Go to the documentation of this file.
1 /*********
2 *
3 * In the name of the Father, and of the Son, and of the Holy Spirit.
4 *
5 * This file is part of BibleTime's source code, https://bibletime.info/
6 *
7 * Copyright 1999-2021 by the BibleTime developers.
8 * The BibleTime source code is licensed under the GNU General Public License
9 * version 2.0.
10 *
11 **********/
12 
13 #include "bibletime.h"
14 
15 #include <QAction>
16 #include <QApplication>
17 #include <QClipboard>
18 #include <QCursor>
19 #include <QDesktopServices>
20 #include <QInputDialog>
21 #include <QMdiSubWindow>
22 #include <QMenu>
23 #include <QMetaObject>
24 #include <QProcess>
25 #include <QtGlobal>
26 #include <QTextEdit>
27 #include <QTimerEvent>
28 #include <QToolBar>
29 #include <QUrl>
30 #include "../backend/config/btconfig.h"
31 #include "../backend/managers/cswordbackend.h"
32 #include "../util/btassert.h"
33 #include "../util/btconnect.h"
34 #include "../util/directory.h"
35 #include "btaboutdialog.h"
36 #include "cinfodisplay.h"
37 #include "cmdiarea.h"
39 #include "display/btfindwidget.h"
43 #include "messagedialog.h"
45 #include "tips/bttipdialog.h"
46 
47 
48 namespace {
49 
50 class DebugWindow : public QTextEdit {
51 
52 public: // methods:
53 
55  : QTextEdit(nullptr)
56  , m_updateTimerId(startTimer(100))
57  {
58  setWindowFlags(Qt::Dialog);
59  setAttribute(Qt::WA_DeleteOnClose);
60  setReadOnly(true);
61  retranslateUi();
62  show();
63  }
64 
66  { setWindowTitle(tr("What's this widget?")); }
67 
68  void timerEvent(QTimerEvent * const event) override {
69  if (event->timerId() == m_updateTimerId) {
70  if (QObject const * w = QApplication::widgetAt(QCursor::pos())) {
71  QString objectHierarchy;
72  do {
73  QMetaObject const * m = w->metaObject();
74  QString classHierarchy;
75  do {
76  if (!classHierarchy.isEmpty())
77  classHierarchy += QStringLiteral(": ");
78  classHierarchy += m->className();
79  m = m->superClass();
80  } while (m);
81  if (!objectHierarchy.isEmpty()) {
82  objectHierarchy
83  .append(QStringLiteral("<br/>"))
84  .append(tr("<b>child of:</b> %1").arg(
85  classHierarchy));
86  } else {
87  objectHierarchy.append(
88  tr("<b>This widget is:</b> %1").arg(
89  classHierarchy));
90  }
91  w = w->parent();
92  } while (w);
93  setHtml(objectHierarchy);
94  } else {
95  setText(tr("No widget"));
96  }
97  } else {
98  QTextEdit::timerEvent(event);
99  }
100  }
101 
102 private: // fields:
103 
104  int const m_updateTimerId;
105 
106 }; // class DebugWindow
107 
108 } // anonymous namespace
109 
110 /** Opens the optionsdialog of BibleTime. */
114  [this]{
116  btConfig().booknameLanguage());
117 
118  /** \todo update the bookmarks after Bible bookname language
119  has been changed. */
120  /* for (QTreeWidgetItemIterator it = m_mainIndex; *it; ++it)
121  if (auto * citem = dynamic_cast<CIndexItemBase*>(*it))
122  citem->update(); */
123 
125  QStringLiteral("Application shortcuts"));
129  });
130 
131  dlg->show();
132 }
133 
134 /** Save the settings, used when no settings have been saved before **/
136 { CConfigurationDialog(this).save(); }
137 
138 /** Opens the bookshelf wizard. */
140 { BtBookshelfWizard(this).exec(); }
141 
142 /** Is called just before the window menu is shown. */
145 
146  const int numSubWindows = m_mdi->subWindowList().count();
147  m_windowCloseAction->setEnabled(numSubWindows);
148  m_windowCloseAllAction->setEnabled(numSubWindows);
149  m_openWindowsMenu->setEnabled(numSubWindows);
150 
151  const bool enableManualArrangeActions = numSubWindows > 1;
152  m_windowCascadeAction->setEnabled(enableManualArrangeActions);
153  m_windowTileAction->setEnabled(enableManualArrangeActions);
154  m_windowTileVerticalAction->setEnabled(enableManualArrangeActions);
155  m_windowTileHorizontalAction->setEnabled(enableManualArrangeActions);
156 }
157 
158 /** Is called just before the open windows menu is shown. */
161 
162  m_openWindowsMenu->clear();
163  for (auto * const window : m_mdi->usableWindowList()) {
164  QAction *openWindowAction = m_openWindowsMenu->addAction(window->windowTitle());
165  openWindowAction->setCheckable(true);
166  openWindowAction->setChecked(window == m_mdi->activeSubWindow());
167  BT_CONNECT(openWindowAction, &QAction::triggered,
168  [this, window]{ slotSetActiveSubWindow(window); });
169  }
170 }
171 
172 /** This slot is connected with the windowAutoTileAction object */
174  BT_ASSERT(trigerredAction);
175 
176  auto guiConfig = btConfig().session().group(QStringLiteral("GUI"));
177  if (trigerredAction == m_windowAutoTileVerticalAction) {
179  guiConfig.setValue(QStringLiteral("alignmentMode"), autoTileVertical);
180  }
181  else if (trigerredAction == m_windowAutoTileHorizontalAction) {
183  guiConfig.setValue(QStringLiteral("alignmentMode"), autoTileHorizontal);
184  }
185  else if (trigerredAction == m_windowAutoTileAction) {
187  guiConfig.setValue(QStringLiteral("alignmentMode"), autoTile);
188  }
189  else if (trigerredAction == m_windowAutoTabbedAction) {
191  guiConfig.setValue(QStringLiteral("alignmentMode"), autoTabbed);
192  }
193  else if (trigerredAction == m_windowAutoCascadeAction) {
195  guiConfig.setValue(QStringLiteral("alignmentMode"), autoCascade);
196  }
197  else {
198  BT_ASSERT(trigerredAction == m_windowManualModeAction
199  || trigerredAction == m_windowTileAction
200  || trigerredAction == m_windowCascadeAction
201  || trigerredAction == m_windowTileVerticalAction
202  || trigerredAction == m_windowTileHorizontalAction);
203 
204  if (trigerredAction != m_windowManualModeAction)
205  m_windowManualModeAction->setChecked(true);
206 
209  guiConfig.setValue(QStringLiteral("alignmentMode"), manual);
210 
211  if (trigerredAction == m_windowTileAction)
212  m_mdi->myTile();
213  else if (trigerredAction == m_windowCascadeAction)
214  m_mdi->myCascade();
215  else if (trigerredAction == m_windowTileVerticalAction)
217  else if (trigerredAction == m_windowTileHorizontalAction)
219 
220  return;
221  }
222 
224 }
225 
228 }
229 
232 }
233 
236 }
237 
240 }
241 
242 /** Shows/hides the toolbar */
245  auto guiConf = btConfig().session().group(QStringLiteral("GUI"));
246  bool const currentState =
247  guiConf.value<bool>(QStringLiteral("showMainToolbar"), true);
248  guiConf.setValue(QStringLiteral("showMainToolbar"), !currentState);
249  if ( m_showMainWindowToolbarAction->isChecked()) {
250  m_mainToolBar->show();
251  }
252  else {
253  m_mainToolBar->hide();
254  }
255 }
256 
258  auto guiConfig = btConfig().session().group(QStringLiteral("GUI"));
259  bool const currentState =
260  guiConfig.value<bool>(QStringLiteral("showTextWindowHeaders"),
261  true);
262  guiConfig.setValue(QStringLiteral("showTextWindowHeaders"), !currentState);
263  Q_EMIT toggledTextWindowHeader(!currentState);
264 }
265 
267  auto guiConfig = btConfig().session().group(QStringLiteral("GUI"));
268  bool const currentState =
269  guiConfig.value<bool>(QStringLiteral("showTextWindowNavigator"),
270  true);
271  guiConfig.setValue(QStringLiteral("showTextWindowNavigator"),
272  !currentState);
273  if (guiConfig.value<bool>(QStringLiteral("showToolbarsInEachWindow"), true))
274  {
275  Q_EMIT toggledTextWindowNavigator(!currentState);
276  } else {
277  m_navToolBar->setVisible(
278  guiConfig.value<bool>(
279  QStringLiteral("showTextWindowNavigator"),
280  true));
281  }
282 }
283 
285  auto guiConfig = btConfig().session().group(QStringLiteral("GUI"));
286  bool const currentState =
287  guiConfig.value<bool>(QStringLiteral("showTextWindowToolButtons"),
288  true);
289  guiConfig.setValue(QStringLiteral("showTextWindowToolButtons"),
290  !currentState);
291  if (guiConfig.value<bool>(QStringLiteral("showToolbarsInEachWindow"), true))
292  {
293  Q_EMIT toggledTextWindowToolButtons(!currentState);
294  } else {
295  m_toolsToolBar->setVisible(
296  guiConfig.value<bool>(
297  QStringLiteral("showTextWindowToolButtons"),
298  true));
299  }
300 }
301 
303  auto guiConfig = btConfig().session().group(QStringLiteral("GUI"));
304  bool const currentState =
305  guiConfig.value<bool>(
306  QStringLiteral("showTextWindowModuleSelectorButtons"),
307  true);
308  guiConfig.setValue(QStringLiteral("showTextWindowModuleSelectorButtons"),
309  !currentState);
310  if (guiConfig.value<bool>(QStringLiteral("showToolbarsInEachWindow"), true))
311  {
312  Q_EMIT toggledTextWindowModuleChooser(!currentState);
313  } else {
314  m_worksToolBar->setVisible(
315  guiConfig.value<bool>(
316  QStringLiteral("showTextWindowModuleSelectorButtons"),
317  true));
318  }
319 }
320 
322  auto guiConfig = btConfig().session().group(QStringLiteral("GUI"));
323  bool const currentState =
324  guiConfig.value<bool>(QStringLiteral("showToolbarsInEachWindow"),
325  true);
326  guiConfig.setValue(QStringLiteral("showToolbarsInEachWindow"),
327  !currentState);
329 }
330 
332  auto const guiConfig = btConfig().session().group(QStringLiteral("GUI"));
333  if (guiConfig.value<bool>(QStringLiteral("showToolbarsInEachWindow"), true))
334  {
335  // set main window widgets invisible
336  m_navToolBar->setVisible(false);
337  m_worksToolBar->setVisible(false);
338  m_toolsToolBar->setVisible(false);
339  // set state of sub window widets
341  guiConfig.value<bool>(
342  QStringLiteral("showTextWindowNavigator"),
343  true));
345  guiConfig.value<bool>(
346  QStringLiteral("showTextWindowModuleSelectorButtons"),
347  true));
349  guiConfig.value<bool>(
350  QStringLiteral("showTextWindowToolButtons"),
351  true));
352  } else {
353  // set state of main window widgets
354  m_navToolBar->setVisible(
355  guiConfig.value<bool>(
356  QStringLiteral("showTextWindowNavigator"),
357  true));
358  m_worksToolBar->setVisible(
359  guiConfig.value<bool>(
360  QStringLiteral("showTextWindowModuleSelectorButtons"),
361  true));
362  m_toolsToolBar->setVisible(
363  guiConfig.value<bool>(
364  QStringLiteral("showTextWindowToolButtons"),
365  true));
366  //set sub window widgets invisible
367  Q_EMIT toggledTextWindowNavigator(false);
368  Q_EMIT toggledTextWindowToolButtons(false);
369  Q_EMIT toggledTextWindowModuleChooser(false);
370  }
371 }
372 
373 /** Sets the active window. */
375  if (!window)
376  return;
377  m_mdi->setActiveSubWindow(dynamic_cast<QMdiSubWindow*>(window));
378 }
379 
381  //get the modules of the open windows
382  BtConstModuleList modules;
383 
384  for (auto const * const subWindow : m_mdi->subWindowList()) {
385  const CDisplayWindow * const w = dynamic_cast<CDisplayWindow*>(subWindow->widget());
386  if (w != nullptr) {
387  modules << w->constModules();
388  }
389  }
390  openSearchDialog(std::move(modules));
391 }
392 
393 void BibleTime::slotActiveWindowChanged(QMdiSubWindow* window)
394 {
395  if (window == nullptr)
396  m_findWidget->setVisible(false);
397  autoScrollStop();
398 }
399 
400 /* Search default Bible slot
401  * Call CSearchDialog::openDialog with only the default bible module
402  */
404  BtConstModuleList module;
405  if (auto const * const bible =
406  btConfig().getDefaultSwordModuleByType(
407  QStringLiteral("standardBible")))
408  module.append(bible);
409  openSearchDialog(std::move(module));
410 }
411 
413  auto url(util::directory::getHandbook());
414  if (url.isEmpty()) {
416  this,
417  tr("Error locating handbook!"),
418  tr("A suitable installed handbook could not be found!"));
419  return;
420  }
421  if (!QDesktopServices::openUrl(QUrl::fromLocalFile(url)))
423  this,
424  tr("Error opening handbook!"),
425  tr("The installed handbook could not be opened!"));
426 }
427 
429  auto url(util::directory::getHowto());
430  if (url.isEmpty()) {
432  this,
433  tr("Error locating howto!"),
434  tr("A suitable installed howto could not be found!"));
435  return;
436  }
437  if (!QDesktopServices::openUrl(QUrl::fromLocalFile(url)))
439  this,
440  tr("Error opening howto!"),
441  tr("The installed howto could not be opened!"));
442 }
443 
445  BtAboutDialog* dlg = new BtAboutDialog(this);
446  dlg->show();
447 }
448 
450  BtTipDialog* dlg = new BtTipDialog(this);
451  dlg->show();
452 }
453 
455  // Save main window settings:
456  auto conf = btConfig().session();
457  conf.setValue(QStringLiteral("MainWindow/geometry"), saveGeometry());
458  conf.setValue(QStringLiteral("MainWindow/state"), saveState());
459  conf.setValue(QStringLiteral("MainWindow/MDIArrangementMode"),
460  static_cast<int>(m_mdi->getMDIArrangementMode()));
461 
462  conf.setValue(QStringLiteral("FindIsVisible"),
463  m_findWidget->isVisible());
464 
465  QStringList windowsList;
466  for (auto const * const w : m_mdi->subWindowList(QMdiArea::StackingOrder)) {
467  CDisplayWindow * const displayWindow = dynamic_cast<CDisplayWindow*>(w->widget());
468  if (!displayWindow)
469  continue;
470 
471  const QString windowKey = QString::number(windowsList.size());
472  windowsList.append(windowKey);
473  auto windowConf = conf.group(QStringLiteral("window/") + windowKey);
474  displayWindow->storeProfileSettings(windowConf);
475  }
476  conf.setValue(QStringLiteral("windowsList"), windowsList);
477 }
478 
480  BT_ASSERT(action);
481  QVariant keyProperty = action->property("ProfileKey");
482  #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
483  BT_ASSERT(keyProperty.type() == QVariant::String);
484  #else
485  BT_ASSERT(keyProperty.typeId() == QMetaType::QString);
486  #endif
487  BT_ASSERT(btConfig().sessionNames().contains(keyProperty.toString()));
488  loadProfile(keyProperty.toString());
489 }
490 
491 void BibleTime::loadProfile(const QString & profileKey) {
492  auto & conf = btConfig();
493  BT_ASSERT(conf.sessionNames().contains(profileKey));
494 
495  // do nothing if requested session is the current session
496  if (profileKey == conf.currentSessionKey())
497  return;
498 
499  // Save old profile:
500  saveProfile();
501 
502  // Close all open windows BEFORE switching profile:
503  m_mdi->closeAllSubWindows();
504 
505  // Switch profile Activate profile:
506  conf.setCurrentSession(profileKey);
507  reloadProfile();
509 }
510 
513 
514  // Disable updates while doing big changes:
515  setUpdatesEnabled(false);
516 
517  // Close all open windows:
518  m_mdi->closeAllSubWindows();
519 
520  // Reload main window settings:
521  auto const sessionConf = btConfig().session();
522  auto const mwConf = sessionConf.group(QStringLiteral("MainWindow"));
523  restoreGeometry(mwConf.value<QByteArray>(QStringLiteral("geometry")));
524  restoreState(mwConf.value<QByteArray>(QStringLiteral("state")));
525 
526  /*
527  * restoreState includes visibility of child widgets, the manually added
528  * qactions (so not including bookmark, bookshelf and mag) are not restored
529  * though, so we restore their state here.
530  */
531  auto const guiConf = sessionConf.group(QStringLiteral("GUI"));
535  guiConf.value<bool>(QStringLiteral("showTextWindowHeaders"),
536  true));
539  guiConf.value<bool>(QStringLiteral("showMainToolbar"), true));
542  guiConf.value<bool>(QStringLiteral("showTextWindowNavigator"),
543  true));
546  guiConf.value<bool>(
547  QStringLiteral("showTextWindowModuleSelectorButtons"),
548  true));
551  guiConf.value<bool>(QStringLiteral("showTextWindowToolButtons"),
552  true));
555  guiConf.value<bool>(QStringLiteral("showToolbarsInEachWindow"),
556  true));
557 
559  static_cast<CMDIArea::MDIArrangementMode>(
560  mwConf.value<int>(QStringLiteral("MDIArrangementMode"),
562 
563  m_findWidget->setVisible(
564  sessionConf.value<bool>(QStringLiteral("FindIsVisible"),
565  false));
566 
567  QWidget * focusWindow = nullptr;
568  struct WindowLoadStatus {
569  QStringList failedModules;
570  QList<CSwordModuleInfo *> okModules;
571  };
572  QMap<QString, WindowLoadStatus> failedWindows;
573  for (auto const & w
574  : sessionConf.value<QStringList>(QStringLiteral("windowsList")))
575  {
576  BT_ASSERT(!w.endsWith('/'));
577  auto const windowConf =
578  sessionConf.group(QStringLiteral("window/") + w);
579 
580  // Try to determine window modules:
581  WindowLoadStatus wls;
582  for (auto const & moduleName
583  : windowConf.value<QStringList>(QStringLiteral("modules")))
584  {
585  if (auto * const m =
586  CSwordBackend::instance().findModuleByName(moduleName))
587  {
588  wls.okModules.append(m);
589  } else {
590  wls.failedModules.append(moduleName);
591  }
592  }
593 
594  // Check whether the window totally failed (no modules can be loaded):
595  if (wls.okModules.isEmpty()) {
596  failedWindows.insert(w, wls);
597  continue;
598  }
599 
600  // Check whether the window partially failed:
601  if (!wls.failedModules.isEmpty())
602  failedWindows.insert(w, wls);
603 
604  // Try to respawn the window:
605  auto const key = windowConf.value<QString>(QStringLiteral("key"));
606  if (auto * const window = createReadDisplayWindow(wls.okModules, key)) {
607  window->applyProfileSettings(windowConf);
608  if (windowConf.value<bool>(QStringLiteral("hasFocus"), false))
609  focusWindow = window;
610  } else {
611  failedWindows.insert(w, wls);
612  }
613  }
614 
615  /* This call is necessary to restore the visibility of the toolbars in the child
616  * windows, since their state is not saved automatically.
617  */
619 
620  // Re-arrange MDI:
622 
623  // Activate focused window:
624  if (focusWindow)
625  focusWindow->setFocus();
626 
627  // Re-enable updates and repaint:
628  setUpdatesEnabled(true);
629  repaint(); /// \bug The main window (except decors) is all black without this (not even hover over toolbar buttons work)
630  raise(); /// \bug The main window would not refresh at all. A call to this function or adjustSize() seems to fix this
631 
632  /// \todo For windows in failedWindows ask whether to keep the settings / close windows etc
633 }
634 
636  BT_ASSERT(action);
637  QVariant keyProperty = action->property("ProfileKey");
638  #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
639  BT_ASSERT(keyProperty.type() == QVariant::String);
640  #else
641  BT_ASSERT(keyProperty.typeId() == QMetaType::QString);
642  #endif
643  BT_ASSERT(btConfig().sessionNames().contains(keyProperty.toString()));
644 
645  /// \todo Ask for confirmation
646  btConfig().deleteSession(keyProperty.toString());
648 }
649 
651  setWindowState(windowState() ^ Qt::WindowFullScreen);
653 }
654 
655 template <bool goingUp>
657  setDisplayFocus();
658 
659  static constexpr int const intervals[21] = {
660  1, 2, 3, 5, 9, 15, 25, 43, 72, 120, 200,
661  120, 72, 43, 25, 15, 9, 5, 3, 2, 1
662  };
663 
664  static constexpr int const nudgeSpeed = goingUp ? 1 : -1;
665  if (m_autoScrollSpeed == 0
666  || ((m_autoScrollSpeed > 0) != goingUp // going in the opposite when
667  && !m_autoScrollTimer.isActive())) // resuming from pause
668  {
669  m_autoScrollSpeed = nudgeSpeed; // start safe at slow speed
670  m_autoScrollTimer.setInterval(intervals[m_autoScrollSpeed + 10]);
671  } else if (m_autoScrollSpeed != nudgeSpeed * 10) { // Stay in [-10, 10]
672  m_autoScrollSpeed += nudgeSpeed;
673  if (m_autoScrollSpeed == 0) {
674  m_autoScrollTimer.stop();
675  m_autoScrollPauseAction->setEnabled(false);
676  return;
677  }
678  m_autoScrollTimer.setInterval(intervals[m_autoScrollSpeed + 10]);
679  }
680 
681  m_autoScrollTimer.start();
682  m_autoScrollPauseAction->setEnabled(true);
683 }
684 
685 template void BibleTime::autoScroll<true>();
686 template void BibleTime::autoScroll<false>();
687 
689  if (!m_autoScrollSpeed)
690  return;
691  setDisplayFocus();
692  if (m_autoScrollTimer.isActive()) {
693  m_autoScrollTimer.stop();
694  } else {
695  m_autoScrollTimer.start();
696  }
697 }
698 
700  if (!m_autoScrollSpeed)
701  return false;
702  autoScrollStop();
703  return true;
704 }
705 
707  m_autoScrollTimer.stop();
708  m_autoScrollSpeed = 0;
709  m_autoScrollPauseAction->setEnabled(false);
710 }
711 
713  auto * display = getCurrentDisplay();
714  if (display) {
715  display->scroll(m_autoScrollSpeed > 0 ? -1 : 1);
716  display->updateReferenceText();
717  }
718 }
719 
720 /** Saves current settings into a new profile. */
722  BtConfig & conf = btConfig();
723 
724  // Get new unique name:
725  QString name;
726  for (;;) {
727  bool ok;
728  name = QInputDialog::getText(
729  this, tr("New Session"),
730  tr("Please enter a name for the new session."),
731  QLineEdit::Normal, name, &ok);
732  if (!ok)
733  return;
734 
735  if (!name.isEmpty()) {
736  // Check whether name already exists:
737  if (conf.sessionNames().values().contains(name)) {
738  message::showInformation(this, tr("Session already exists"),
739  tr("Session with the name \"%1\" "
740  "already exists. Please provide a "
741  "different name.").arg(name));
742  } else {
743  break;
744  }
745  }
746  }
747 
748  // Also save old profile:
749  saveProfile();
750 
751  // Save new profile:
752  conf.setCurrentSession(conf.addSession(name));
753  saveProfile();
754 
755  // Refresh profile menus:
757 }
758 
759 /** Slot to refresh the saved profile and load profile menus. */
761  m_windowLoadProfileMenu->clear();
762  m_windowDeleteProfileMenu->clear();
763 
764  BtConfig & conf = btConfig();
765  auto const & sessions = conf.sessionNames();
766 
767  const bool enableActions = sessions.size() > 1;
768  m_windowLoadProfileMenu->setEnabled(enableActions);
769  m_windowDeleteProfileMenu->setEnabled(enableActions);
770 
771 
772  if (enableActions) {
773  for (auto it = sessions.constBegin(); it != sessions.constEnd(); ++it) {
774  QAction * a;
775 
776  a = m_windowLoadProfileMenu->addAction(it.value());
777  a->setProperty("ProfileKey", it.key());
778  a->setActionGroup(m_windowLoadProfileActionGroup);
779  a->setCheckable(true);
780  if (it.key() == conf.currentSessionKey())
781  a->setChecked(true);
782 
783  a = m_windowDeleteProfileMenu->addAction(it.value());
784  a->setProperty("ProfileKey", it.key());
785  if (it.key() == conf.currentSessionKey())
786  a->setDisabled(true);
787  }
788  }
789 }
790 
792  if (show) {
794  m_debugWindow = new DebugWindow();
795  BT_CONNECT(m_debugWindow, &QObject::destroyed, m_debugWidgetAction,
796  [action=m_debugWidgetAction] { action->setChecked(false); },
797  Qt::DirectConnection);
798  } else {
799  delete m_debugWindow;
800  }
801 }
#define BT_ASSERT(...)
Definition: btassert.h:17
BtConfig & btConfig()
This is a shortchand for BtConfig::getInstance().
Definition: btconfig.h:305
#define BT_CONNECT(...)
Definition: btconnect.h:20
@ autoTabbed
Definition: btglobal.h:74
@ autoTileHorizontal
Definition: btglobal.h:72
@ autoCascade
Definition: btglobal.h:75
@ autoTile
Definition: btglobal.h:73
@ autoTileVertical
Definition: btglobal.h:71
@ manual
Definition: btglobal.h:76
QList< CSwordModuleInfo const * > BtConstModuleList
Definition: btmodulelist.h:21
QAction * m_windowCloseAction
Definition: bibletime.h:419
void loadProfile(QAction *action)
QPointer< QWidget > m_debugWindow
Definition: bibletime.h:455
BtModuleChooserBar * m_worksToolBar
Definition: bibletime.h:377
QAction * m_autoScrollPauseAction
Definition: bibletime.h:443
void slotCascade()
void slotBookshelfWizard()
void slotOpenTipDialog()
QAction * m_windowTileVerticalAction
Definition: bibletime.h:410
QAction * m_windowAutoTileVerticalAction
Definition: bibletime.h:417
QAction * m_windowCascadeAction
Definition: bibletime.h:407
void slotSearchModules()
void slotShowDebugWindow(bool)
int m_autoScrollSpeed
Definition: bibletime.h:450
QToolBar * m_mainToolBar
Definition: bibletime.h:375
QAction * m_debugWidgetAction
Definition: bibletime.h:454
void slotActiveWindowChanged(QMdiSubWindow *window)
QAction * m_windowTileAction
Definition: bibletime.h:408
void reloadProfile()
QAction * m_windowAutoCascadeAction
Definition: bibletime.h:414
QAction * m_showTextWindowNavigationAction
Definition: bibletime.h:394
void deleteProfile(QAction *action)
QAction * m_windowAutoTileHorizontalAction
Definition: bibletime.h:418
void slotTileHorizontal()
CMDIArea * m_mdi
Definition: bibletime.h:447
InfoDisplay::CInfoDisplay * m_infoDisplay
Definition: bibletime.h:373
void slotUpdateWindowArrangementActions(QAction *trigerredAction)
void toggledTextWindowToolButtons(bool newState)
void slotToggleWorksToolbar()
void slotOpenAboutDialog()
void toggledTextWindowHeader(bool newState)
void openSearchDialog(BtConstModuleList modules, QString const &searchText={})
Definition: bibletime.cpp:327
void slotSearchDefaultBible()
void slotSettingsOptions()
void slotToggleMainToolbar()
QAction * m_showTextAreaHeadersAction
Definition: bibletime.h:393
void autoScrollPause()
void saveProfile()
void slotToggleTextWindowHeader()
void showOrHideToolBars()
void setDisplayFocus()
Definition: bibletime.cpp:322
void slotAutoScroll()
void toggledTextWindowNavigator(bool newState)
void slotOpenWindowsMenuAboutToShow()
void openOnlineHelp_Handbook()
QAction * m_windowAutoTileAction
Definition: bibletime.h:415
QAction * m_showTextWindowModuleChooserAction
Definition: bibletime.h:395
QAction * m_windowTileHorizontalAction
Definition: bibletime.h:409
QAction * m_showMainWindowToolbarAction
Definition: bibletime.h:392
QMenu * m_windowDeleteProfileMenu
Definition: bibletime.h:424
void refreshProfileMenus()
QAction * m_showTextWindowToolButtonsAction
Definition: bibletime.h:396
void slotToggleToolsToolbar()
QToolBar * m_toolsToolBar
Definition: bibletime.h:378
void slotToggleToolBarsInEachWindow()
void toggledTextWindowModuleChooser(bool newState)
QToolBar * m_navToolBar
Definition: bibletime.h:376
QAction * m_windowManualModeAction
Definition: bibletime.h:411
BtFindWidget * m_findWidget
Definition: bibletime.h:448
void saveToNewProfile()
void slotTileVertical()
BtModelViewReadDisplay * getCurrentDisplay()
Definition: bibletime.cpp:314
void openOnlineHelp_Howto()
void slotWindowMenuAboutToShow()
QMenu * m_windowMenu
Definition: bibletime.h:405
QAction * m_windowAutoTabbedAction
Definition: bibletime.h:416
void autoScrollStop()
QAction * m_windowFullscreenAction
Definition: bibletime.h:445
void saveConfigSettings()
QMenu * m_windowLoadProfileMenu
Definition: bibletime.h:422
QActionGroup * m_windowLoadProfileActionGroup
Definition: bibletime.h:423
CDisplayWindow * createReadDisplayWindow(QList< CSwordModuleInfo * > modules, QString const &key)
Creates a new presenter in the MDI area according to the type of the module.
Definition: bibletime.cpp:145
void refreshDisplayWindows() const
Definition: bibletime.cpp:241
QAction * m_toolbarsInEachWindow
Definition: bibletime.h:397
void slotToggleNavigatorToolbar()
QTimer m_autoScrollTimer
Definition: bibletime.h:451
QAction * m_windowCloseAllAction
Definition: bibletime.h:420
BtActionCollection * m_actionCollection
Definition: bibletime.h:439
QMenu * m_openWindowsMenu
Definition: bibletime.h:406
void slotSetActiveSubWindow(QWidget *window)
void toggleFullscreen()
bool autoScrollAnyKey()
void readShortcuts(QString const &group)
Read shortcuts from config.
The Bookshelf Manager wizard.
BtConfigCore group(Prefix &&prefix) const &
Definition: btconfigcore.h:93
T value(QString const &key, T const &defaultValue=T()) const
Returns the settings value for the given global key.
Definition: btconfigcore.h:50
void setValue(QString const &key, T const &value)
Sets a value for a key.
Definition: btconfigcore.h:73
void signalSettingsChanged()
BtConfigCore session() const
Definition: btconfig.cpp:213
QHash< QString, QString > sessionNames() const
Definition: btconfig.h:78
QString addSession(const QString &name)
Creates a new session with the given name.
Definition: btconfig.cpp:177
void setCurrentSession(const QString &key)
Notifies the configuration system that the session settings should be read from and saved to the give...
Definition: btconfig.cpp:169
QString const & currentSessionKey() const
Definition: btconfig.h:66
void deleteSession(const QString &key)
Deletes the session with the given key.
Definition: btconfig.cpp:205
The base class for all display windows of BibleTime.
virtual void storeProfileSettings(BtConfigCore &windowConf) const
Stores the settings of this window to configuration.
BtConstModuleList constModules() const
MDIArrangementMode
Definition: cmdiarea.h:41
@ ArrangementModeTileVertical
Definition: cmdiarea.h:42
@ ArrangementModeCascade
Definition: cmdiarea.h:44
@ ArrangementModeManual
Definition: cmdiarea.h:45
@ ArrangementModeTabbed
Definition: cmdiarea.h:47
@ ArrangementModeTileHorizontal
Definition: cmdiarea.h:43
@ ArrangementModeTile
Definition: cmdiarea.h:46
void myCascade()
Definition: cmdiarea.cpp:286
void myTileVertical()
Definition: cmdiarea.cpp:163
void setMDIArrangementMode(const MDIArrangementMode mode)
Definition: cmdiarea.cpp:135
void enableWindowMinMaxFlags(bool enable)
Definition: cmdiarea.cpp:448
void triggerWindowUpdate()
Definition: cmdiarea.cpp:427
void myTile()
Definition: cmdiarea.cpp:231
QList< QMdiSubWindow * > usableWindowList() const
Definition: cmdiarea.cpp:341
void myTileHorizontal()
Definition: cmdiarea.cpp:197
MDIArrangementMode getMDIArrangementMode() const
Definition: cmdiarea.h:79
static CSwordBackend & instance() noexcept
Definition: cswordbackend.h:98
void setBooknameLanguage(QString const &langName)
Sets the language for the international booknames of Sword.
void timerEvent(QTimerEvent *const event) override
void setQActionCheckedNoTrigger(QAction *const action, const bool checked)
QMessageBox::StandardButton showInformation(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
QMessageBox::StandardButton showCritical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
QString getHandbook()
Definition: directory.cpp:326
QString getHowto()
Definition: directory.cpp:328