182 lines
5.3 KiB
C++
Executable File
182 lines
5.3 KiB
C++
Executable File
// This file is part of RSS Guard.
|
|
//
|
|
// Copyright (C) 2011-2017 by Martin Rotter <rotter.martinos@gmail.com>
|
|
//
|
|
// RSS Guard is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// RSS Guard is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with RSS Guard. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#include "gui/webviewer.h"
|
|
|
|
#include "miscellaneous/skinfactory.h"
|
|
#include "miscellaneous/application.h"
|
|
#include "definitions/definitions.h"
|
|
#include "network-web/webpage.h"
|
|
#include "gui/dialogs/formmain.h"
|
|
#include "gui/tabwidget.h"
|
|
#include "gui/webbrowser.h"
|
|
#include "network-web/adblock/adblockicon.h"
|
|
#include "network-web/adblock/adblockmanager.h"
|
|
|
|
#include <QWheelEvent>
|
|
|
|
|
|
WebViewer::WebViewer(QWidget* parent) : QWebEngineView(parent) {
|
|
WebPage* page = new WebPage(this);
|
|
connect(page, &WebPage::messageStatusChangeRequested, this, &WebViewer::messageStatusChangeRequested);
|
|
setPage(page);
|
|
}
|
|
|
|
bool WebViewer::canIncreaseZoom() {
|
|
return zoomFactor() <= MAX_ZOOM_FACTOR - ZOOM_FACTOR_STEP;
|
|
}
|
|
|
|
bool WebViewer::canDecreaseZoom() {
|
|
return zoomFactor() >= MIN_ZOOM_FACTOR + ZOOM_FACTOR_STEP;
|
|
}
|
|
|
|
WebPage* WebViewer::page() const {
|
|
return qobject_cast<WebPage*>(QWebEngineView::page());
|
|
}
|
|
|
|
void WebViewer::displayMessage() {
|
|
setHtml(m_messageContents, QUrl::fromUserInput(INTERNAL_URL_MESSAGE));
|
|
}
|
|
|
|
bool WebViewer::increaseWebPageZoom() {
|
|
if (canIncreaseZoom()) {
|
|
setZoomFactor(zoomFactor() + ZOOM_FACTOR_STEP);
|
|
return true;
|
|
}
|
|
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool WebViewer::decreaseWebPageZoom() {
|
|
if (canDecreaseZoom()) {
|
|
setZoomFactor(zoomFactor() - ZOOM_FACTOR_STEP);
|
|
return true;
|
|
}
|
|
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool WebViewer::resetWebPageZoom() {
|
|
const qreal new_factor = 1.0;
|
|
|
|
if (new_factor != zoomFactor()) {
|
|
setZoomFactor(new_factor);
|
|
return true;
|
|
}
|
|
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void WebViewer::loadMessages(const QList<Message>& messages) {
|
|
Skin skin = qApp->skins()->currentSkin();
|
|
QString messages_layout;
|
|
QString single_message_layout = skin.m_layoutMarkup;
|
|
|
|
foreach (const Message& message, messages) {
|
|
QString enclosures;
|
|
QString enclosure_images;
|
|
|
|
foreach (const Enclosure& enclosure, message.m_enclosures) {
|
|
enclosures += skin.m_enclosureMarkup.arg(enclosure.m_url, tr("Attachment"), enclosure.m_mimeType);
|
|
|
|
if (enclosure.m_mimeType.startsWith(QSL("image/"))) {
|
|
// Add thumbnail image.
|
|
enclosure_images += skin.m_enclosureImageMarkup.arg(
|
|
enclosure.m_url,
|
|
enclosure.m_mimeType,
|
|
qApp->settings()->value(GROUP(Messages), SETTING(Messages::MessageHeadImageHeight)).toString());
|
|
}
|
|
}
|
|
|
|
messages_layout.append(single_message_layout
|
|
.arg(message.m_title,
|
|
tr("Written by ") + (message.m_author.isEmpty() ?
|
|
tr("unknown author") :
|
|
message.m_author),
|
|
message.m_url,
|
|
message.m_contents,
|
|
message.m_created.toString(Qt::DefaultLocaleShortDate),
|
|
enclosures,
|
|
message.m_isRead ? "mark-unread" : "mark-read",
|
|
message.m_isImportant ? "mark-unstarred" : "mark-starred",
|
|
QString::number(message.m_id))
|
|
.arg(enclosure_images));
|
|
}
|
|
|
|
m_messageContents = skin.m_layoutMarkupWrapper.arg(messages.size() == 1 ? messages.at(0).m_title : tr("Newspaper view"),
|
|
messages_layout);
|
|
bool previously_enabled = isEnabled();
|
|
setEnabled(false);
|
|
displayMessage();
|
|
setEnabled(previously_enabled);
|
|
}
|
|
|
|
void WebViewer::loadMessage(const Message& message) {
|
|
loadMessages(QList<Message>() << message);
|
|
}
|
|
|
|
void WebViewer::clear() {
|
|
bool previously_enabled = isEnabled();
|
|
setEnabled(false);
|
|
setHtml("<!DOCTYPE html><html><body</body></html>", QUrl(INTERNAL_URL_BLANK));
|
|
setEnabled(previously_enabled);
|
|
}
|
|
|
|
void WebViewer::contextMenuEvent(QContextMenuEvent* event) {
|
|
event->accept();
|
|
|
|
QMenu* menu = page()->createStandardContextMenu();
|
|
menu->addAction(AdBlockManager::instance()->adblockIcon());
|
|
|
|
const QPoint pos = event->globalPos();
|
|
QPoint p(pos.x(), pos.y() + 1);
|
|
menu->popup(p);
|
|
}
|
|
|
|
QWebEngineView* WebViewer::createWindow(QWebEnginePage::WebWindowType type) {
|
|
Q_UNUSED(type)
|
|
int index = qApp->mainForm()->tabWidget()->addBrowser(false, false);
|
|
|
|
if (index >= 0) {
|
|
return qApp->mainForm()->tabWidget()->widget(index)->webBrowser()->viewer();
|
|
}
|
|
|
|
else {
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
void WebViewer::wheelEvent(QWheelEvent* event) {
|
|
QWebEngineView::wheelEvent(event);
|
|
|
|
if ((event->modifiers() & Qt::ControlModifier) > 0) {
|
|
if (event->delta() > 0) {
|
|
increaseWebPageZoom();
|
|
}
|
|
|
|
else if (event->delta() < 0) {
|
|
decreaseWebPageZoom();
|
|
}
|
|
}
|
|
}
|