File indexing completed on 2024-05-26 04:46:49
0001 /* 0002 SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "richtexteditorwidget.h" 0008 #include "richtexteditfindbar.h" 0009 #include "richtexteditor.h" 0010 0011 #include "config-textcustomeditor.h" 0012 #include <QTextCursor> 0013 #include <QVBoxLayout> 0014 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT 0015 #include <TextEditTextToSpeech/TextToSpeechContainerWidget> 0016 #endif 0017 #include <TextAddonsWidgets/SlideContainer> 0018 0019 using namespace TextCustomEditor; 0020 0021 class Q_DECL_HIDDEN TextCustomEditor::RichTextEditorWidgetPrivate 0022 { 0023 public: 0024 RichTextEditorWidgetPrivate() = default; 0025 0026 TextCustomEditor::RichTextEditFindBar *mFindBar = nullptr; 0027 RichTextEditor *mEditor = nullptr; 0028 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT 0029 TextEditTextToSpeech::TextToSpeechContainerWidget *mTextToSpeechWidget = nullptr; 0030 #endif 0031 TextAddonsWidgets::SlideContainer *mSliderContainer = nullptr; 0032 }; 0033 0034 RichTextEditorWidget::RichTextEditorWidget(RichTextEditor *customEditor, QWidget *parent) 0035 : QWidget(parent) 0036 , d(new TextCustomEditor::RichTextEditorWidgetPrivate) 0037 { 0038 init(customEditor); 0039 } 0040 0041 RichTextEditorWidget::RichTextEditorWidget(QWidget *parent) 0042 : QWidget(parent) 0043 , d(new TextCustomEditor::RichTextEditorWidgetPrivate) 0044 { 0045 init(); 0046 } 0047 0048 RichTextEditorWidget::~RichTextEditorWidget() = default; 0049 0050 void RichTextEditorWidget::clear() 0051 { 0052 d->mEditor->clear(); 0053 } 0054 0055 RichTextEditor *RichTextEditorWidget::editor() const 0056 { 0057 return d->mEditor; 0058 } 0059 0060 void RichTextEditorWidget::setAcceptRichText(bool b) 0061 { 0062 d->mEditor->setAcceptRichText(b); 0063 } 0064 0065 bool RichTextEditorWidget::acceptRichText() const 0066 { 0067 return d->mEditor->acceptRichText(); 0068 } 0069 0070 void RichTextEditorWidget::setSpellCheckingConfigFileName(const QString &_fileName) 0071 { 0072 d->mEditor->setSpellCheckingConfigFileName(_fileName); 0073 } 0074 0075 void RichTextEditorWidget::setHtml(const QString &html) 0076 { 0077 d->mEditor->setHtml(html); 0078 } 0079 0080 QString RichTextEditorWidget::toHtml() const 0081 { 0082 return d->mEditor->toHtml(); 0083 } 0084 0085 void RichTextEditorWidget::setPlainText(const QString &text) 0086 { 0087 d->mEditor->setPlainText(text); 0088 } 0089 0090 bool RichTextEditorWidget::isEmpty() const 0091 { 0092 return d->mEditor->document()->isEmpty(); 0093 } 0094 0095 QString RichTextEditorWidget::toPlainText() const 0096 { 0097 return d->mEditor->toPlainText(); 0098 } 0099 0100 void RichTextEditorWidget::init(RichTextEditor *customEditor) 0101 { 0102 auto lay = new QVBoxLayout(this); 0103 lay->setContentsMargins({}); 0104 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT 0105 d->mTextToSpeechWidget = new TextEditTextToSpeech::TextToSpeechContainerWidget(this); 0106 lay->addWidget(d->mTextToSpeechWidget); 0107 #endif 0108 if (customEditor) { 0109 d->mEditor = customEditor; 0110 } else { 0111 d->mEditor = new RichTextEditor; 0112 } 0113 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT 0114 connect(d->mEditor, &RichTextEditor::say, d->mTextToSpeechWidget, &TextEditTextToSpeech::TextToSpeechContainerWidget::say); 0115 #endif 0116 lay->addWidget(d->mEditor); 0117 0118 d->mSliderContainer = new TextAddonsWidgets::SlideContainer(this); 0119 0120 d->mFindBar = new TextCustomEditor::RichTextEditFindBar(d->mEditor, this); 0121 d->mFindBar->setHideWhenClose(false); 0122 connect(d->mFindBar, &TextCustomEditor::RichTextEditFindBar::displayMessageIndicator, d->mEditor, &RichTextEditor::slotDisplayMessageIndicator); 0123 0124 connect(d->mFindBar, &TextCustomEditor::RichTextEditFindBar::hideFindBar, this, &RichTextEditorWidget::slotHideFindBar); 0125 d->mSliderContainer->setContent(d->mFindBar); 0126 lay->addWidget(d->mSliderContainer); 0127 0128 connect(d->mEditor, &RichTextEditor::findText, this, &RichTextEditorWidget::slotFind); 0129 connect(d->mEditor, &RichTextEditor::replaceText, this, &RichTextEditorWidget::slotReplace); 0130 } 0131 0132 void RichTextEditorWidget::slotHideFindBar() 0133 { 0134 d->mSliderContainer->slideOut(); 0135 d->mEditor->setFocus(); 0136 } 0137 0138 bool RichTextEditorWidget::isReadOnly() const 0139 { 0140 return d->mEditor->isReadOnly(); 0141 } 0142 0143 void RichTextEditorWidget::setReadOnly(bool readOnly) 0144 { 0145 d->mEditor->setReadOnly(readOnly); 0146 } 0147 0148 void RichTextEditorWidget::slotReplace() 0149 { 0150 if (d->mEditor->searchSupport()) { 0151 if (d->mEditor->textCursor().hasSelection()) { 0152 d->mFindBar->setText(d->mEditor->textCursor().selectedText()); 0153 } 0154 d->mFindBar->showReplace(); 0155 d->mSliderContainer->slideIn(); 0156 d->mFindBar->focusAndSetCursor(); 0157 } 0158 } 0159 0160 void RichTextEditorWidget::slotFindNext() 0161 { 0162 if (d->mEditor->searchSupport()) { 0163 if (d->mFindBar->isVisible()) { 0164 d->mFindBar->findNext(); 0165 } else { 0166 slotFind(); 0167 } 0168 } 0169 } 0170 0171 void RichTextEditorWidget::slotFind() 0172 { 0173 if (d->mEditor->searchSupport()) { 0174 if (d->mEditor->textCursor().hasSelection()) { 0175 d->mFindBar->setText(d->mEditor->textCursor().selectedText()); 0176 } 0177 d->mEditor->moveCursor(QTextCursor::Start); 0178 0179 d->mFindBar->showFind(); 0180 d->mSliderContainer->slideIn(); 0181 d->mFindBar->focusAndSetCursor(); 0182 } 0183 } 0184 0185 #include "moc_richtexteditorwidget.cpp"