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"