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"