File indexing completed on 2024-05-19 16:31:38

0001 /*
0002  * SPDX-FileCopyrightText: 2017 David Faure <faure@kde.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #include "dict_object.h"
0008 #include <KLocalizedString>
0009 #include <QDebug>
0010 #include <QQuickWebEngineProfile>
0011 #include <QWebEngineUrlRequestJob>
0012 #include <QWebEngineUrlSchemeHandler>
0013 
0014 class DictSchemeHandler : public QWebEngineUrlSchemeHandler
0015 {
0016     Q_OBJECT
0017 public:
0018     DictSchemeHandler(QObject *parent)
0019         : QWebEngineUrlSchemeHandler(parent)
0020     {
0021     }
0022     void requestStarted(QWebEngineUrlRequestJob *job) override
0023     {
0024         job->fail(QWebEngineUrlRequestJob::UrlInvalid);
0025         const QString word = job->requestUrl().path();
0026         Q_EMIT wordClicked(word);
0027     }
0028 
0029 Q_SIGNALS:
0030     void wordClicked(const QString &word);
0031 };
0032 
0033 DictObject::DictObject(QObject *parent)
0034     : QObject(parent)
0035     , m_selectedDict(QStringLiteral("wn"))
0036 {
0037     m_webProfile = new QQuickWebEngineProfile(this);
0038     auto *schemeHandler = new DictSchemeHandler(this);
0039     connect(schemeHandler, &DictSchemeHandler::wordClicked, this, &DictObject::lookup);
0040     connect(&m_engine, &DictEngine::definitionRecieved, this, [this](const QString &html) {
0041         Q_EMIT definitionFound(html);
0042     });
0043     connect(&m_engine, &DictEngine::dictErrorOccurred, this, &DictObject::slotDictErrorOccurred);
0044     m_webProfile->installUrlSchemeHandler("dict", schemeHandler);
0045 }
0046 
0047 void DictObject::lookup(const QString &word)
0048 {
0049     m_hasError = false;
0050     Q_EMIT hasErrorChanged();
0051 
0052     const QString newSource = m_selectedDict + QLatin1Char(':') + word;
0053 
0054     if (!newSource.isEmpty()) {
0055         // Look up new definition
0056         Q_EMIT searchInProgress();
0057         m_source = newSource;
0058         m_engine.requestDefinition(newSource);
0059     }
0060 }
0061 
0062 QString DictObject::selectedDictionary() const
0063 {
0064     return m_selectedDict;
0065 }
0066 
0067 void DictObject::setSelectedDictionary(const QString &dict)
0068 {
0069     m_selectedDict = dict;
0070 }
0071 
0072 QQuickWebEngineProfile *DictObject::webProfile() const
0073 {
0074     return m_webProfile;
0075 }
0076 
0077 bool DictObject::hasError() const
0078 {
0079     return m_hasError;
0080 }
0081 
0082 QAbstractSocket::SocketError DictObject::errorCode() const
0083 {
0084     return m_errorCode;
0085 }
0086 
0087 QString DictObject::errorString() const
0088 {
0089     return m_errorString;
0090 }
0091 
0092 void DictObject::slotDictErrorOccurred(QAbstractSocket::SocketError socketError, const QString &errorString)
0093 {
0094     m_hasError = true;
0095     m_errorCode = socketError;
0096     m_errorString = errorString;
0097 
0098     Q_EMIT errorCodeChanged();
0099     Q_EMIT errorStringChanged();
0100     Q_EMIT hasErrorChanged();
0101 }
0102 
0103 #include "dict_object.moc"