File indexing completed on 2024-12-22 04:28:12
0001 /* 0002 SPDX-FileCopyrightText: 2023-2024 Laurent Montel <montel.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "richtextbrowserwidget.h" 0008 #include "richtextbrowser.h" 0009 #include "richtextbrowserfindbar.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::RichTextBrowserWidgetPrivate 0022 { 0023 public: 0024 RichTextBrowserWidgetPrivate() = default; 0025 0026 TextCustomEditor::RichTextBrowserFindBar *mFindBar = nullptr; 0027 RichTextBrowser *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 RichTextBrowserWidget::RichTextBrowserWidget(RichTextBrowser *customEditor, QWidget *parent) 0035 : QWidget(parent) 0036 , d(new TextCustomEditor::RichTextBrowserWidgetPrivate) 0037 { 0038 init(customEditor); 0039 } 0040 0041 RichTextBrowserWidget::RichTextBrowserWidget(QWidget *parent) 0042 : QWidget(parent) 0043 , d(new TextCustomEditor::RichTextBrowserWidgetPrivate) 0044 { 0045 init(); 0046 } 0047 0048 RichTextBrowserWidget::~RichTextBrowserWidget() = default; 0049 0050 void RichTextBrowserWidget::clear() 0051 { 0052 d->mEditor->clear(); 0053 } 0054 0055 RichTextBrowser *RichTextBrowserWidget::editor() const 0056 { 0057 return d->mEditor; 0058 } 0059 0060 void RichTextBrowserWidget::setAcceptRichText(bool b) 0061 { 0062 d->mEditor->setAcceptRichText(b); 0063 } 0064 0065 bool RichTextBrowserWidget::acceptRichText() const 0066 { 0067 return d->mEditor->acceptRichText(); 0068 } 0069 0070 void RichTextBrowserWidget::setHtml(const QString &html) 0071 { 0072 d->mEditor->setHtml(html); 0073 } 0074 0075 QString RichTextBrowserWidget::toHtml() const 0076 { 0077 return d->mEditor->toHtml(); 0078 } 0079 0080 void RichTextBrowserWidget::setPlainText(const QString &text) 0081 { 0082 d->mEditor->setPlainText(text); 0083 } 0084 0085 bool RichTextBrowserWidget::isEmpty() const 0086 { 0087 return d->mEditor->document()->isEmpty(); 0088 } 0089 0090 QString RichTextBrowserWidget::toPlainText() const 0091 { 0092 return d->mEditor->toPlainText(); 0093 } 0094 0095 void RichTextBrowserWidget::init(RichTextBrowser *customEditor) 0096 { 0097 auto lay = new QVBoxLayout(this); 0098 lay->setContentsMargins({}); 0099 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT 0100 d->mTextToSpeechWidget = new TextEditTextToSpeech::TextToSpeechContainerWidget(this); 0101 lay->addWidget(d->mTextToSpeechWidget); 0102 #endif 0103 if (customEditor) { 0104 d->mEditor = customEditor; 0105 } else { 0106 d->mEditor = new RichTextBrowser; 0107 } 0108 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT 0109 connect(d->mEditor, &RichTextBrowser::say, d->mTextToSpeechWidget, &TextEditTextToSpeech::TextToSpeechContainerWidget::say); 0110 #endif 0111 lay->addWidget(d->mEditor); 0112 0113 d->mSliderContainer = new TextAddonsWidgets::SlideContainer(this); 0114 0115 d->mFindBar = new TextCustomEditor::RichTextBrowserFindBar(d->mEditor, this); 0116 d->mFindBar->setHideWhenClose(false); 0117 connect(d->mFindBar, &TextCustomEditor::RichTextBrowserFindBar::displayMessageIndicator, d->mEditor, &RichTextBrowser::slotDisplayMessageIndicator); 0118 0119 connect(d->mFindBar, &TextCustomEditor::RichTextBrowserFindBar::hideFindBar, this, &RichTextBrowserWidget::slotHideFindBar); 0120 d->mSliderContainer->setContent(d->mFindBar); 0121 lay->addWidget(d->mSliderContainer); 0122 0123 connect(d->mEditor, &RichTextBrowser::findText, this, &RichTextBrowserWidget::slotFind); 0124 } 0125 0126 void RichTextBrowserWidget::slotHideFindBar() 0127 { 0128 d->mSliderContainer->slideOut(); 0129 d->mEditor->setFocus(); 0130 } 0131 0132 void RichTextBrowserWidget::slotFindNext() 0133 { 0134 if (d->mEditor->searchSupport()) { 0135 if (d->mFindBar->isVisible()) { 0136 d->mFindBar->findNext(); 0137 } else { 0138 slotFind(); 0139 } 0140 } 0141 } 0142 0143 void RichTextBrowserWidget::slotFind() 0144 { 0145 if (d->mEditor->searchSupport()) { 0146 if (d->mEditor->textCursor().hasSelection()) { 0147 d->mFindBar->setText(d->mEditor->textCursor().selectedText()); 0148 } 0149 d->mEditor->moveCursor(QTextCursor::Start); 0150 0151 d->mFindBar->showFind(); 0152 d->mSliderContainer->slideIn(); 0153 d->mFindBar->focusAndSetCursor(); 0154 } 0155 } 0156 0157 #include "moc_richtextbrowserwidget.cpp"