1 /*
2 SPDX-FileCopyrightText: 2016-2021 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "webengineframe.h"
8 #include "akrwebengineviewer.h"
9 #include "articleviewer-ng/webengine/articleviewerwebenginewidgetng.h"
10
11 #include <KIO/FavIconRequestJob>
12
13 #include <QVBoxLayout>
14
15 using namespace Akregator;
16
WebEngineFrame(KActionCollection * ac,QWidget * parent)17 WebEngineFrame::WebEngineFrame(KActionCollection *ac, QWidget *parent)
18 : Frame(parent)
19 {
20 auto layout = new QVBoxLayout(this);
21 layout->setContentsMargins({});
22 setRemovable(true);
23 auto viewer = new Akregator::AkrWebEngineViewer(ac, this);
24 mArticleViewerWidgetNg = new Akregator::ArticleViewerWebEngineWidgetNg(viewer, ac, this);
25
26 connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::titleChanged, this, &WebEngineFrame::slotTitleChanged);
27
28 connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::loadProgress, this, &WebEngineFrame::slotProgressChanged);
29
30 connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::signalOpenUrlRequest, this, &WebEngineFrame::signalOpenUrlRequest);
31
32 connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::loadStarted, this, &WebEngineFrame::slotLoadStarted);
33
34 connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::loadFinished, this, &WebEngineFrame::slotLoadFinished);
35
36 connect(mArticleViewerWidgetNg->articleViewerNg(), &ArticleViewerWebEngine::showStatusBarMessage, this, &WebEngineFrame::showStatusBarMessage);
37
38 connect(mArticleViewerWidgetNg->articleViewerNg(),
39 &ArticleViewerWebEngine::webPageMutedOrAudibleChanged,
40 this,
41 &WebEngineFrame::slotWebPageMutedOrAudibleChanged);
42
43 layout->addWidget(mArticleViewerWidgetNg);
44 }
45
~WebEngineFrame()46 WebEngineFrame::~WebEngineFrame()
47 {
48 }
49
slotWebPageMutedOrAudibleChanged(bool isAudioMuted,bool wasRecentlyAudible)50 void WebEngineFrame::slotWebPageMutedOrAudibleChanged(bool isAudioMuted, bool wasRecentlyAudible)
51 {
52 Q_EMIT webPageMutedOrAudibleChanged(this, isAudioMuted, wasRecentlyAudible);
53 }
54
slotLoadFinished()55 void WebEngineFrame::slotLoadFinished()
56 {
57 Q_EMIT signalCompleted(this);
58 }
59
slotLoadStarted()60 void WebEngineFrame::slotLoadStarted()
61 {
62 Q_EMIT signalStarted(this);
63 }
64
slotProgressChanged(int progress)65 void WebEngineFrame::slotProgressChanged(int progress)
66 {
67 Q_EMIT signalLoadingProgress(this, progress);
68 }
69
slotTitleChanged(const QString & title)70 void WebEngineFrame::slotTitleChanged(const QString &title)
71 {
72 slotSetTitle(title);
73 }
74
url() const75 QUrl WebEngineFrame::url() const
76 {
77 return mArticleViewerWidgetNg->articleViewerNg()->url();
78 }
79
loadUrl(const QUrl & url)80 void WebEngineFrame::loadUrl(const QUrl &url)
81 {
82 auto job = new KIO::FavIconRequestJob(url);
83 connect(job, &KIO::FavIconRequestJob::result, this, [job, this](KJob *) {
84 if (!job->error()) {
85 Q_EMIT signalIconChanged(this, QIcon(job->iconFile()));
86 }
87 });
88
89 mArticleViewerWidgetNg->articleViewerNg()->load(url);
90 }
91
openUrl(const OpenUrlRequest & request)92 bool WebEngineFrame::openUrl(const OpenUrlRequest &request)
93 {
94 const QUrl url = request.url();
95 loadUrl(url);
96 return true;
97 }
98
loadConfig(const KConfigGroup & config,const QString & prefix)99 void WebEngineFrame::loadConfig(const KConfigGroup &config, const QString &prefix)
100 {
101 const QString url = config.readEntry(QStringLiteral("url").prepend(prefix), QString());
102 const qreal zf = config.readEntry(QStringLiteral("zoom").prepend(prefix), 1.0);
103 mArticleViewerWidgetNg->articleViewerNg()->setZoomFactor(zf);
104 loadUrl(QUrl(url));
105 }
106
saveConfig(KConfigGroup & config,const QString & prefix)107 bool WebEngineFrame::saveConfig(KConfigGroup &config, const QString &prefix)
108 {
109 const QString urlPath(url().url());
110 if (urlPath != QLatin1String("about:blank")) {
111 config.writeEntry(QStringLiteral("url").prepend(prefix), urlPath);
112 config.writeEntry(QStringLiteral("zoom").prepend(prefix), zoomFactor());
113 return true;
114 } else {
115 return false;
116 }
117 }
118
slotCopyInFrame(int frameId)119 void WebEngineFrame::slotCopyInFrame(int frameId)
120 {
121 if (frameId != id()) {
122 return;
123 }
124 mArticleViewerWidgetNg->articleViewerNg()->slotCopy();
125 }
126
slotPrintInFrame(int frameId)127 void WebEngineFrame::slotPrintInFrame(int frameId)
128 {
129 if (frameId != id()) {
130 return;
131 }
132 mArticleViewerWidgetNg->slotPrint();
133 }
134
slotPrintPreviewInFrame(int frameId)135 void WebEngineFrame::slotPrintPreviewInFrame(int frameId)
136 {
137 if (frameId != id()) {
138 return;
139 }
140 mArticleViewerWidgetNg->slotPrintPreview();
141 }
142
slotFindTextInFrame(int frameId)143 void WebEngineFrame::slotFindTextInFrame(int frameId)
144 {
145 if (frameId != id()) {
146 return;
147 }
148 mArticleViewerWidgetNg->slotFind();
149 }
150
slotTextToSpeechInFrame(int frameId)151 void WebEngineFrame::slotTextToSpeechInFrame(int frameId)
152 {
153 if (frameId != id()) {
154 return;
155 }
156 mArticleViewerWidgetNg->slotSpeakText();
157 }
158
slotZoomChangeInFrame(int frameId,qreal value)159 void WebEngineFrame::slotZoomChangeInFrame(int frameId, qreal value)
160 {
161 if (frameId != id()) {
162 return;
163 }
164 mArticleViewerWidgetNg->articleViewerNg()->setZoomFactor(value);
165 }
166
slotReload()167 void WebEngineFrame::slotReload()
168 {
169 mArticleViewerWidgetNg->articleViewerNg()->reload();
170 }
171
slotStop()172 void WebEngineFrame::slotStop()
173 {
174 mArticleViewerWidgetNg->articleViewerNg()->stop();
175 }
176
zoomFactor() const177 qreal WebEngineFrame::zoomFactor() const
178 {
179 return mArticleViewerWidgetNg->articleViewerNg()->zoomFactor();
180 }
181
slotSaveLinkAsInFrame(int frameId)182 void WebEngineFrame::slotSaveLinkAsInFrame(int frameId)
183 {
184 if (frameId != id()) {
185 return;
186 }
187 mArticleViewerWidgetNg->articleViewerNg()->slotSaveLinkAs();
188 }
189
slotCopyLinkAsInFrame(int frameId)190 void WebEngineFrame::slotCopyLinkAsInFrame(int frameId)
191 {
192 if (frameId != id()) {
193 return;
194 }
195 mArticleViewerWidgetNg->articleViewerNg()->slotCopyLinkAddress();
196 }
197
slotSaveImageOnDiskInFrame(int frameId)198 void WebEngineFrame::slotSaveImageOnDiskInFrame(int frameId)
199 {
200 if (frameId != id()) {
201 return;
202 }
203 mArticleViewerWidgetNg->articleViewerNg()->slotSaveImageOnDiskInFrame();
204 }
205
slotCopyImageLocationInFrame(int frameId)206 void WebEngineFrame::slotCopyImageLocationInFrame(int frameId)
207 {
208 if (frameId != id()) {
209 return;
210 }
211 mArticleViewerWidgetNg->articleViewerNg()->slotCopyImageLocationInFrame();
212 }
213
slotMute(int frameId,bool mute)214 void WebEngineFrame::slotMute(int frameId, bool mute)
215 {
216 if (frameId != id()) {
217 return;
218 }
219 mArticleViewerWidgetNg->articleViewerNg()->slotMute(mute);
220 }
221