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"