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-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 "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 
33 class QTextCharFormat;
34 
35 namespace {
36 auto const CHTMLWriteDisplayGroup = QStringLiteral("HtmlWriteDisplay");
37 auto const CHTMLWriteDisplayFontKey = QStringLiteral("font");
38 auto 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);
56  initActions();
57  setupToolBar();
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(
81  m_htmlTextEdit->currentFont());
82  conf.setValue(CHTMLWriteDisplayFontColorKey,
83  m_htmlTextEdit->textColor());
84  });
85 
86  retranslateUi();
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) {
99  initHtmlFont();
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 
130 QString BtEditTextPage::text() const {
131  return m_text;
132 }
133 
134 void BtEditTextPage::setText(const QString& text) {
135  m_text = text;
136 }
137 
138 void 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);
298  m_toolBar->addWidget(m_fontFamilyComboBox);
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 &
Definition: btconfigcore.h:93
void setValue(QString const &key, T const &value)
Sets a value for a key.
Definition: btconfigcore.h:73
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
struct BtEditTextPage::@8 m_actions
void initializePage() final override
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.
bool htmlMode() const
void setFontSize(int size)
void fontSizeChanged(int)