File indexing completed on 2025-10-26 05:07:40

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     if (!word.isEmpty()) {
0053         // Look up new definition
0054         Q_EMIT searchInProgress();
0055         m_engine.requestDefinition(word, m_selectedDict.toUtf8());
0056     }
0057 }
0058 
0059 QString DictObject::selectedDictionary() const
0060 {
0061     return m_selectedDict;
0062 }
0063 
0064 void DictObject::setSelectedDictionary(const QString &dict)
0065 {
0066     m_selectedDict = dict;
0067 }
0068 
0069 QQuickWebEngineProfile *DictObject::webProfile() const
0070 {
0071     return m_webProfile;
0072 }
0073 
0074 bool DictObject::hasError() const
0075 {
0076     return m_hasError;
0077 }
0078 
0079 QAbstractSocket::SocketError DictObject::errorCode() const
0080 {
0081     return m_errorCode;
0082 }
0083 
0084 QString DictObject::errorString() const
0085 {
0086     return m_errorString;
0087 }
0088 
0089 void DictObject::slotDictErrorOccurred(QAbstractSocket::SocketError socketError, const QString &errorString)
0090 {
0091     m_hasError = true;
0092     m_errorCode = socketError;
0093     m_errorString = errorString;
0094 
0095     Q_EMIT errorCodeChanged();
0096     Q_EMIT errorStringChanged();
0097     Q_EMIT hasErrorChanged();
0098 }
0099 
0100 #include "dict_object.moc"