BibleTime
btedittextpage.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 "btedittextpage.h"
14
15#include <QAction>
16#include <QDebug>
17#include <QFontComboBox>
18#include <Qt>
19#include <QtGlobal>
20#include <QTextEdit>
21#include <QToolBar>
22#include <QVBoxLayout>
23#include "../../backend/config/btconfig.h"
24#include "../../backend/config/btconfigcore.h"
25#include "../../util/btassert.h"
26#include "../../util/btconnect.h"
27#include "../../util/cresmgr.h"
28#include "../display/btcolorwidget.h"
29#include "../display/btfontsizewidget.h"
30#include "btedittextwizard.h"
31
32
33class QTextCharFormat;
34
35namespace {
36auto const CHTMLWriteDisplayGroup = QStringLiteral("HtmlWriteDisplay");
37auto const CHTMLWriteDisplayFontKey = QStringLiteral("font");
38auto const CHTMLWriteDisplayFontColorKey = QStringLiteral("fontColor");
39}
40
41
43 : QWizardPage(&parent)
44 , m_wizard(parent)
45 , m_plainTextEdit(new QTextEdit(this))
46 , m_htmlTextEdit(new QTextEdit(this))
47 , m_toolBar(new QToolBar(this))
48 , m_handingFormatChangeFromEditor(false)
49{
50 QVBoxLayout * verticalLayout = new QVBoxLayout(this);
51 verticalLayout->addWidget(m_toolBar);
52 verticalLayout->addWidget(m_plainTextEdit);
53 verticalLayout->addWidget(m_htmlTextEdit);
54
55 setMinimumWidth(560);
58
59 m_plainTextEdit->setAcceptDrops(true);
60 m_htmlTextEdit->setAcceptDrops(true);
61 m_plainTextEdit->setAutoFormatting(QTextEdit::AutoNone);
62 m_htmlTextEdit->setAutoFormatting(QTextEdit::AutoAll);
63
64 BT_CONNECT(m_htmlTextEdit, &QTextEdit::currentCharFormatChanged,
65 [this](QTextCharFormat const &) {
68 QFont f = m_htmlTextEdit->currentFont();
69 Q_EMIT signalFontChanged(f);
70 Q_EMIT signalFontSizeChanged(f.pointSize());
71 Q_EMIT signalFontColorChanged(m_htmlTextEdit->textColor());
72
73 m_actions.bold->setChecked(f.bold());
74 m_actions.italic->setChecked(f.italic());
75 m_actions.underline->setChecked(f.underline());
77
78 auto conf = btConfig().session().group(
79 CHTMLWriteDisplayGroup);
80 conf.setValue(CHTMLWriteDisplayFontKey,
81 m_htmlTextEdit->currentFont());
82 conf.setValue(CHTMLWriteDisplayFontColorKey,
83 m_htmlTextEdit->textColor());
84 });
85
87}
88
90 if (m_htmlTextEdit->isVisible())
91 m_text = m_htmlTextEdit->toHtml();
92 else
93 m_text = m_plainTextEdit->toPlainText();
94}
95
97 auto const htmlMode = m_wizard.htmlMode();
98 if (htmlMode) {
100 m_htmlTextEdit->setHtml(m_text);
101 m_plainTextEdit->clear();
102 }
103 else {
105 m_plainTextEdit->setText(m_text);
106
107 { // Needed to strip html when switching to plain text.
108 QString tmp = m_plainTextEdit->toPlainText();
109 m_plainTextEdit->setText(tmp);
110 }
111
112 m_htmlTextEdit->clear();
113 }
114 m_plainTextEdit->setAcceptRichText(false);
115 m_htmlTextEdit->setAcceptRichText(true);
116
117 m_plainTextEdit->setVisible(!htmlMode);
118 m_htmlTextEdit->setVisible(htmlMode);
119 m_toolBar->setVisible(htmlMode);
120}
121
123 if (m_htmlTextEdit->isVisible())
124 m_text = m_htmlTextEdit->toHtml();
125 else
126 m_text = m_plainTextEdit->toPlainText();
127 return true;
128}
129
130QString BtEditTextPage::text() const {
131 return m_text;
132}
133
134void BtEditTextPage::setText(const QString& text) {
135 m_text = text;
136}
137
138void BtEditTextPage::setFont(const QFont& font) {
139 m_plainTextFont = font;
140}
141
143 m_actions.bold->setText(tr("Bold"));
144 m_actions.bold->setToolTip(tr("Bold"));
145 m_actions.italic->setText(tr("Italic"));
146 m_actions.italic->setToolTip(tr("Italic"));
147 m_actions.underline->setText(tr("Underline"));
148 m_actions.underline->setToolTip(tr("Underline"));
149 m_actions.alignLeft->setText(tr("Left"));
150 m_actions.alignLeft->setToolTip(tr("Align left"));
151 m_actions.alignCenter->setText(tr("Center"));
152 m_actions.alignCenter->setToolTip(tr("Align center"));
153 m_actions.alignRight->setText(tr("Right"));
154 m_actions.alignRight->setToolTip(tr("Align right"));
155
156 m_fontFamilyComboBox->setToolTip(tr("Font"));
157 m_fontSizeWidget->setToolTip(tr("Font size"));
158 m_fontColorChooser->setToolTip(tr("Font color"));
159}
160
162 auto const conf = btConfig().session().group(CHTMLWriteDisplayGroup);
163 m_htmlTextEdit->setTextColor(conf.value(CHTMLWriteDisplayFontColorKey, m_htmlTextEdit->textColor()));
164 QFont f = conf.value(CHTMLWriteDisplayFontKey, m_htmlTextEdit->currentFont());
165 m_htmlTextEdit->setCurrentFont(f);
166 return f;
167}
168
170 QFont f = initHtmlFont();
171
172 //--------------------bold toggle-------------------------
173 m_actions.bold = new QAction(this);
174 m_actions.bold->setIcon(
175 CResMgr::displaywindows::writeWindow::boldText::icon());
176 m_actions.bold->setCheckable(true);
177 m_actions.bold->setChecked(f.bold());
179 BT_CONNECT(m_actions.bold, &QAction::toggled,
180 [this](bool const checked) {
181 if (!m_handingFormatChangeFromEditor)
182 m_htmlTextEdit->setFontWeight(
183 checked ? QFont::Bold : QFont::Normal);
184 });
185
186 //--------------------italic toggle-------------------------
187 m_actions.italic = new QAction(this);
188 m_actions.italic->setIcon(
189 CResMgr::displaywindows::writeWindow::italicText::icon());
190 m_actions.italic->setCheckable(true);
191 m_actions.italic->setChecked(f.italic());
193 BT_CONNECT(m_actions.italic, &QAction::toggled,
194 [this](bool const checked) {
195 if (!m_handingFormatChangeFromEditor)
196 m_htmlTextEdit->setFontItalic(checked);
197 });
198
199 //--------------------underline toggle-------------------------
200 m_actions.underline = new QAction(this);
201 m_actions.underline->setIcon(
202 CResMgr::displaywindows::writeWindow::underlinedText::icon());
203 m_actions.underline->setCheckable(true);
204 m_actions.underline->setChecked(f.underline());
206 BT_CONNECT(m_actions.underline, &QAction::toggled,
207 [this](bool const checked) {
208 if (!m_handingFormatChangeFromEditor)
209 m_htmlTextEdit->setFontUnderline(checked);
210 });
211
212 //--------------------align left toggle-------------------------
213 m_actions.alignLeft = new QAction(this);
214 m_actions.alignLeft->setIcon(
215 CResMgr::displaywindows::writeWindow::alignLeft::icon());
216 m_actions.alignLeft->setCheckable(true);
218 BT_CONNECT(m_actions.alignLeft, &QAction::toggled,
219 [this](bool const set) {
220 if (!m_handingFormatChangeFromEditor
221 && set
222 && (m_htmlTextEdit->alignment() != Qt::AlignLeft))
223 {
224 m_htmlTextEdit->setAlignment(Qt::AlignLeft);
225 alignmentChanged(Qt::AlignLeft);
226 }
227 });
228
229 //--------------------align center toggle-------------------------
230 m_actions.alignCenter = new QAction(this);
231 m_actions.alignCenter->setIcon(
232 CResMgr::displaywindows::writeWindow::alignCenter::icon());
233 m_actions.alignCenter->setCheckable(true);
234 m_actions.alignCenter->setShortcut(CResMgr::displaywindows::writeWindow::alignCenter::accel);
235 BT_CONNECT(m_actions.alignCenter, &QAction::toggled,
236 [this](bool const set) {
237 if (!m_handingFormatChangeFromEditor
238 && set
239 && (m_htmlTextEdit->alignment() != Qt::AlignHCenter))
240 {
241 m_htmlTextEdit->setAlignment(Qt::AlignHCenter);
242 alignmentChanged(Qt::AlignHCenter);
243 }
244 });
245
246 //--------------------align right toggle-------------------------
247 m_actions.alignRight = new QAction(this);
248 m_actions.alignRight->setIcon(
249 CResMgr::displaywindows::writeWindow::alignRight::icon());
250 m_actions.alignRight->setCheckable(true);
251 m_actions.alignRight->setShortcut(CResMgr::displaywindows::writeWindow::alignRight::accel);
252 BT_CONNECT(m_actions.alignRight, &QAction::toggled,
253 [this](bool const set) {
254 if (!m_handingFormatChangeFromEditor
255 && set
256 && (m_htmlTextEdit->alignment() != Qt::AlignRight))
257 {
258 m_htmlTextEdit->setAlignment(Qt::AlignRight);
259 alignmentChanged(Qt::AlignRight);
260 }
261 });
262}
263
264/** The text's alignment changed. Enable the right buttons. */
267 bool alignLeft = false;
268 bool alignCenter = false;
269 bool alignRight = false;
270
271 if (a & Qt::AlignLeft) {
272 alignLeft = true;
273 }
274 else if ((a & Qt::AlignHCenter) || (a & Qt::AlignCenter)) {
275 alignCenter = true;
276 }
277 else if (a & Qt::AlignRight) {
278 alignRight = true;
279 }
280 else {
281 alignLeft = true;
282 qWarning("unknown alignment %i", a);
283 }
284
285 m_actions.alignLeft->setChecked( alignLeft );
286 m_actions.alignCenter->setChecked( alignCenter );
287 m_actions.alignRight->setChecked( alignRight );
288}
289
290
292
293 QFont f = m_htmlTextEdit->currentFont();
294
295 //--------------------font chooser-------------------------
296 m_fontFamilyComboBox = new QFontComboBox(this);
297 m_fontFamilyComboBox->setCurrentFont(f);
299 BT_CONNECT(m_fontFamilyComboBox, &QFontComboBox::currentFontChanged,
300 [this](QFont const & font) {
302 m_htmlTextEdit->setFontFamily(font.family());
303 });
305 m_fontFamilyComboBox, &QFontComboBox::setCurrentFont,
306 Qt::DirectConnection);
307
308 //--------------------font size chooser-------------------------
310 m_fontSizeWidget->setFontSize(f.pointSize());
311 m_toolBar->addWidget(m_fontSizeWidget);
313 [this](int const newSize) {
315 m_htmlTextEdit->setFontPointSize(
316 static_cast<qreal>(newSize));
317 });
320 Qt::DirectConnection);
321
322 //--------------------color button-------------------------
325 m_toolBar->addWidget(m_fontColorChooser);
327 m_htmlTextEdit, &QTextEdit::setTextColor,
328 Qt::DirectConnection);
331 Qt::DirectConnection);
332
333 m_toolBar->addSeparator();
334
335 m_toolBar->addAction(m_actions.bold);
336 m_toolBar->addAction(m_actions.italic);
337 m_toolBar->addAction(m_actions.underline);
338
339 //seperate formatting from alignment buttons
340 m_toolBar->addSeparator();
341
342 m_toolBar->addAction(m_actions.alignLeft);
343 m_toolBar->addAction(m_actions.alignCenter);
344 m_toolBar->addAction(m_actions.alignRight);
345}
#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 setColor(QColor const &color)
void changed(QColor const &color)
BtConfigCore group(Prefix &&prefix) const &
void setValue(QString const &key, T const &value)
Sets a value for a key.
BtConfigCore session() const
Definition btconfig.cpp:213
BtEditTextPage(BtEditTextWizard &parent)
BtEditTextWizard & m_wizard
QAction * alignLeft
QAction * alignCenter
QTextEdit * m_plainTextEdit
void cleanupPage() final override
bool validatePage() final override
BtFontSizeWidget * m_fontSizeWidget
BtColorWidget * m_fontColorChooser
void setText(const QString &text)
void alignmentChanged(int)
QFontComboBox * m_fontFamilyComboBox
void signalFontColorChanged(const QColor &)
void signalFontChanged(const QFont &)
QToolBar * m_toolBar
void initializePage() final override
struct BtEditTextPage::@16 m_actions
bool m_handingFormatChangeFromEditor
void setFont(const QFont &font)
QTextEdit * m_htmlTextEdit
void signalFontSizeChanged(int)
QAction * alignRight
QString text() const
The Edit Text wizard for editing the personal commentary.
void setFontSize(int size)
void fontSizeChanged(int)