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 <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"
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
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:329
FontSettingsPair getFontForLanguage(Language const &language)
Get font for a language.
Definition btconfig.cpp:355
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