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