BibleTime
cacceleratorsettings.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 "cacceleratorsettings.h"
14 
15 #include <QComboBox>
16 #include <QHBoxLayout>
17 #include <QKeySequence>
18 #include <QLabel>
19 #include <QList>
20 #include <QMessageBox>
21 #include <QNonConstOverload>
22 #include <QStackedWidget>
23 #include <Qt>
24 #include <QVBoxLayout>
25 #include <utility>
26 #include "../../util/btconnect.h"
27 #include "../../util/cresmgr.h"
28 #include "../bibletime.h"
29 #include "../displaywindow/btactioncollection.h"
30 #include "../displaywindow/cbiblereadwindow.h"
31 #include "../displaywindow/cbookreadwindow.h"
32 #include "../displaywindow/ccommentaryreadwindow.h"
33 #include "../displaywindow/cdisplaywindow.h"
34 #include "../displaywindow/clexiconreadwindow.h"
35 #include "../messagedialog.h"
36 #include "btshortcutseditor.h"
37 #include "cconfigurationdialog.h"
38 
39 
41  : BtConfigDialog::Page(CResMgr::settings::keys::icon(), parent)
42 {
43  QVBoxLayout *mainLayout = new QVBoxLayout(this);
44 
45  QHBoxLayout* layoutForWindowTypeChooser = new QHBoxLayout();
46  mainLayout->addLayout(layoutForWindowTypeChooser);
47 
48  m_actionGroupLabel = new QLabel(this);
49  layoutForWindowTypeChooser->addWidget(m_actionGroupLabel);
50 
51  m_typeChooser = new QComboBox(this);
52  layoutForWindowTypeChooser->addWidget(m_typeChooser);
53 
54  BT_CONNECT(m_typeChooser, qOverload<int>(&QComboBox::activated),
55  [this](int i) { m_keyChooserStack->setCurrentIndex(i); });
56 
57  // m_*.title strings are empty here, they are filled and added to the stacked widget in the retranslateUi() function
58  m_keyChooserStack = new QStackedWidget(this);
59  retranslateUi();
60 
61  // create shortcuteditors
62  auto const initShortcutEditor =
63  [this](WindowType & windowType,
64  void (& insertKeyboardActions)(BtActionCollection * const),
65  char const * const groupName)
66  {
67  windowType.actionCollection = new BtActionCollection(this);
68  insertKeyboardActions(windowType.actionCollection);
69  windowType.actionCollection->readShortcuts(groupName);
70  windowType.keyChooser =
71  new BtShortcutsEditor(windowType.actionCollection,
73  m_keyChooserStack->addWidget(windowType.keyChooser);
74  BT_CONNECT(
75  windowType.keyChooser,
77  [this, &windowType](QString const & actionName,
78  QKeySequence const & keys)
79  {
80  /* Check the BtShortcutsEditor's for shortcut conflicts.
81  Either clear the conflicts and set the new shortcut or do
82  nothing. */
83 
84  /* Get the list of shortcuts editors that can conflict with
85  a key change in the current shortcut editor: */
86  QList<WindowType *> list;
87  list.append(&m_application);
88  list.append(&m_general);
89  if ((&windowType == &m_application)
90  || (&windowType == &m_general))
91  {
92  list.append(&m_bible);
93  list.append(&m_commentary);
94  list.append(&m_lexicon);
95  list.append(&m_book);
96  } else {
97  list.append(&windowType);
98  }
99  QStringList conflicts;
100  auto const conflictTr = tr("\"%1\" in the \"%2\" group");
101  for (auto const * const windowType2 : list)
102  if (auto conflict =
103  windowType2->keyChooser->findConflictWithKeys(
104  keys);
105  !conflict.isEmpty())
106  conflicts.append(conflictTr
107  .arg(std::move(conflict))
108  .arg(windowType2->title));
109 
110  if (!conflicts.isEmpty()) {
111  if (message::showQuestion(
112  this,
113  tr("Shortcut conflict detected"),
114  QStringLiteral("%1<ul><li>%2</li></ul>%3")
115  .arg(
116  tr("The shortcut \"%1\" you want to "
117  "assign to \"%2\" in the \"%3\" "
118  "group conflicts with the following "
119  "%n shortcut(s):",
120  nullptr,
121  conflicts.size())
122  .arg(keys.toString())
123  .arg(actionName)
124  .arg(windowType.title),
125  conflicts.join(QStringLiteral("</li><li>")),
126  tr("Do you want to clear these conflicting "
127  "shortcuts and continue?")),
128  QMessageBox::Yes | QMessageBox::No,
129  QMessageBox::Yes) == QMessageBox::Yes)
130  {
131  // Clear conflicts with keys:
132  for (auto const * const windowType2 : list)
133  windowType2->keyChooser->clearConflictWithKeys(
134  keys);
135 
136  windowType.keyChooser->changeShortcutInDialog(keys);
137  }
138  } else {
139  windowType.keyChooser->changeShortcutInDialog(keys);
140  }
141  });
142  };
143  initShortcutEditor(m_application,
145  "Application shortcuts");
146  initShortcutEditor(m_general,
148  "Displaywindow shortcuts");
149  initShortcutEditor(m_bible,
151  "Bible shortcuts");
152  initShortcutEditor(m_commentary,
154  "Commentary shortcuts");
155  initShortcutEditor(m_lexicon,
157  "Lexicon shortcuts");
158  initShortcutEditor(m_book,
160  "Book shortcuts");
161 
162  mainLayout->addWidget(m_keyChooserStack);
163  m_keyChooserStack->setCurrentIndex(m_typeChooser->currentIndex());
164 
165  m_typeChooser->setFocus(Qt::MouseFocusReason);
166 
167  retranslateUi();
168 }
169 
171  setHeaderText(tr("Shortcuts"));
172 
173  m_actionGroupLabel->setText(tr("Choose action group:"));
174 
175  m_application.title = tr("Main Window");
176  m_general.title = tr("All text windows");
177  m_bible.title = tr("Bible windows");
178  m_commentary.title = tr("Commentary windows");
179  m_lexicon.title = tr("Lexicon windows");
180  m_book.title = tr("Book windows");
181 
182  m_typeChooser->clear();
184  m_typeChooser->addItem(m_general.title);
185  m_typeChooser->addItem(m_bible.title);
186  m_typeChooser->addItem(m_commentary.title);
187  m_typeChooser->addItem(m_lexicon.title);
188  m_typeChooser->addItem(m_book.title);
189 }
190 
193  m_application.keyChooser->commitChanges();
194  if (m_general.keyChooser)
195  m_general.keyChooser->commitChanges();
196  if (m_bible.keyChooser)
197  m_bible.keyChooser->commitChanges();
199  m_commentary.keyChooser->commitChanges();
200  if (m_lexicon.keyChooser)
201  m_lexicon.keyChooser->commitChanges();
202  if (m_book.keyChooser)
203  m_book.keyChooser->commitChanges();
204 
205  m_application.actionCollection->writeShortcuts("Application shortcuts"); //application
206  m_general.actionCollection->writeShortcuts("Displaywindow shortcuts"); //read display windows
207  m_bible.actionCollection->writeShortcuts("Bible shortcuts"); //bible
208  m_commentary.actionCollection->writeShortcuts("Commentary shortcuts"); //commentary
209  m_lexicon.actionCollection->writeShortcuts("Lexicon shortcuts"); //lexicon
210  m_book.actionCollection->writeShortcuts("Book shortcuts"); //book
211 }
#define BT_CONNECT(...)
Definition: btconnect.h:20
static void insertKeyboardActions(BtActionCollection *const a)
void readShortcuts(QString const &group)
Read shortcuts from config.
void writeShortcuts(QString const &group) const
Write shortcuts to config.
void setHeaderText(QString const &headerText)
void keyChangeRequest(QString const &actionName, QKeySequence const &keys)
QStackedWidget * m_keyChooserStack
void save() const final override
CAcceleratorSettingsPage(CConfigurationDialog *parent=nullptr)
static void insertKeyboardActions(BtActionCollection *const a)
static void insertKeyboardActions(BtActionCollection *const a)
static void insertKeyboardActions(BtActionCollection *const a)
static void insertKeyboardActions(BtActionCollection *const a)
static void insertKeyboardActions(BtActionCollection *a)
if(plainSearchedText)
QPointer< BtShortcutsEditor > keyChooser