BibleTime
btfontsettings.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 "btfontsettings.h"
14 
15 #include <algorithm>
16 #include <cstddef>
17 #include <memory>
18 #include <QCheckBox>
19 #include <QComboBox>
20 #include <QFont>
21 #include <QFontDialog>
22 #include <QGroupBox>
23 #include <QHBoxLayout>
24 #include <QIcon>
25 #include <QLabel>
26 #include <QNonConstOverload>
27 #include <QPair>
28 #include <Qt>
29 #include <QVBoxLayout>
30 #include <set>
31 #include "../../backend/config/btconfig.h"
32 #include "../../backend/language.h"
33 #include "../../backend/managers/cswordbackend.h"
34 #include "../../util/btassert.h"
35 #include "../../util/btconnect.h"
36 #include "../../util/cresmgr.h"
37 #include "cconfigurationdialog.h"
38 
39 
41  : BtConfigDialog::Page(CResMgr::settings::fonts::icon(), parent)
42 {
43  m_languageLabel = new QLabel(this);
44  m_languageComboBox = new QComboBox(this);
46  m_languageCheckBox = new QCheckBox(this);
47  BT_CONNECT(m_languageCheckBox, &QCheckBox::toggled,
49 
50 
51  QHBoxLayout *hLayout = new QHBoxLayout;
52  hLayout->setContentsMargins(0, 0, 0, 0);
53  hLayout->addWidget(m_languageLabel, 0, Qt::AlignRight);
54  hLayout->addWidget(m_languageComboBox, 1);
55  hLayout->addWidget(m_languageCheckBox);
56 
57  struct Comp {
58  bool operator()(std::shared_ptr<Language const> const & lhs,
59  std::shared_ptr<Language const> const & rhs) const
60  {
61  int cmp = lhs->translatedName().compare(rhs->translatedName());
62  if (cmp == 0) {
63  cmp = lhs->abbrev().compare(rhs->abbrev());
64  BT_ASSERT(cmp != 0);
65  }
66  return cmp < 0;
67  }
68  };
69  std::set<std::shared_ptr<Language const>, Comp> languages;
70  {
71  auto const availableLanguages =
73  BT_ASSERT(availableLanguages);
74  for (auto const & language : *availableLanguages)
75  languages.emplace(language);
76  }
77 
78  for (auto const & l : languages) {
79  m_workSettings.emplace_back(
81  auto const & k = l->translatedName().isEmpty()
82  ? l->abbrev()
83  : l->translatedName();
84  if (m_workSettings.back().settings.first) { // show font icon
85  m_languageComboBox->addItem(CResMgr::settings::fonts::icon(), k);
86  } else { // don't show icon for font
87  m_languageComboBox->addItem(k);
88  }
89  }
90 
91  /// \todo remember the last selected font and jump there.
92 
93  m_fontChooser = new QFontDialog(this);
94  m_fontChooser->setOptions(QFontDialog::NoButtons
95  | QFontDialog::DontUseNativeDialog);
96  /**
97  \todo Eeli's wishlist: why not show something relevant here, like a Bible
98  verse in chosen (not tr()'ed!) language?
99  */
100  // m_fontChooser->setSampleText("SOMETHING");
101 
102  if (m_languageComboBox->count() > 0) {
103  BT_CONNECT(m_fontChooser, &QFontDialog::currentFontChanged,
104  [this](QFont const & newFont) {
105  auto & work =
106  m_workSettings[m_languageComboBox->currentIndex()];
107  work.settings.second = newFont;
108  });
110  qOverload<int>(&QComboBox::currentIndexChanged),
111  [this](int const newIndex) {
112  auto const i = static_cast<std::size_t>(newIndex);
113  auto const & p = m_workSettings[i].settings;
114  useOwnFontClicked(p.first);
115  m_languageCheckBox->setChecked(p.first);
116  m_fontChooser->setCurrentFont(p.second);
117  });
118 
119  auto const & v =
120  m_workSettings[m_languageComboBox->currentIndex()].settings;
121  m_fontChooser->setCurrentFont(v.second);
122  useOwnFontClicked(v.first);
123  m_languageCheckBox->setChecked(v.first);
124  }
125 
126  m_fontChooser->setMinimumSize(m_fontChooser->sizeHint());
127 
128  QVBoxLayout *fLayout = new QVBoxLayout;
129  fLayout->setContentsMargins(0, 0, 0, 0);
130  fLayout->addLayout(hLayout);
131  fLayout->addWidget(m_fontChooser);
132 
133  m_fontsGroupBox = new QGroupBox(this);
134  m_fontsGroupBox->setFlat(true);
135  m_fontsGroupBox->setLayout(fLayout);
136 
137  QVBoxLayout *mainLayout = new QVBoxLayout(this);
138  mainLayout->addWidget(m_fontsGroupBox);
139 
140  retranslateUi();
141 }
142 
144  for (auto const & work : m_workSettings)
145  btConfig().setFontForLanguage(work.language, work.settings);
146 }
147 
149  m_fontChooser->setEnabled(isOn);
150  m_workSettings[m_languageComboBox->currentIndex()].settings.first = isOn;
151  m_languageComboBox->setItemIcon(m_languageComboBox->currentIndex(),
152  isOn
153  ? CResMgr::settings::fonts::icon()
154  : QIcon());
155 }
156 
158  setHeaderText(tr("Fonts"));
159  m_languageLabel->setText(tr("&Language:"));
160  m_languageComboBox->setToolTip(tr("The font selection below will apply to all texts in this language"));
161  m_languageCheckBox->setText(tr("Use custom font"));
162 }
#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
void setHeaderText(QString const &headerText)
void setFontForLanguage(Language const &language, FontSettingsPair const &fontSettings)
Set font for a language.
Definition: btconfig.cpp:338
FontSettingsPair getFontForLanguage(Language const &language)
Get font for a language.
Definition: btconfig.cpp:364
BtFontSettingsPage(CConfigurationDialog *parent=nullptr)
QGroupBox * m_fontsGroupBox
std::vector< WorkSetting > m_workSettings
void useOwnFontClicked(bool)
QComboBox * m_languageComboBox
QCheckBox * m_languageCheckBox
QLabel * m_languageLabel
QFontDialog * m_fontChooser
void save() const final override
std::shared_ptr< AvailableLanguagesCacheContainer const > availableLanguages() noexcept
static CSwordBackend & instance() noexcept
Definition: cswordbackend.h:98