[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [falkon] src/lib/adblock: AdBlockIcon: Indicate AdBlock state on current page with icon state
From: David Rosca <null () kde ! org>
Date: 2018-01-11 18:38:31
Message-ID: E1eZhkF-0007QH-BV () code ! kde ! org
[Download RAW message or body]
Git commit 3d171275d241f2883b1ae26abd4f608957b786a3 by David Rosca.
Committed on 11/01/2018 at 18:33.
Pushed by drosca into branch 'master'.
AdBlockIcon: Indicate AdBlock state on current page with icon state
Icon is inactive when AdBlock is disabled or can't run on current page.
M +62 -105 src/lib/adblock/adblockicon.cpp
M +5 -15 src/lib/adblock/adblockicon.h
https://commits.kde.org/falkon/3d171275d241f2883b1ae26abd4f608957b786a3
diff --git a/src/lib/adblock/adblockicon.cpp b/src/lib/adblock/adblockicon.cpp
index 6b0f388b..043e9e09 100644
--- a/src/lib/adblock/adblockicon.cpp
+++ b/src/lib/adblock/adblockicon.cpp
@@ -28,22 +28,18 @@
#include "qztools.h"
#include <QMenu>
-#include <QTimer>
AdBlockIcon::AdBlockIcon(QObject *parent)
: AbstractButtonInterface(parent)
- , m_menuAction(0)
- , m_flashTimer(0)
- , m_timerTicks(0)
- , m_enabled(false)
{
setTitle(tr("AdBlock"));
- setToolTip(tr("AdBlock lets you block unwanted content on web pages"));
+ setIcon(QIcon(QSL(":icons/other/adblock.png")));
- connect(this, &AbstractButtonInterface::clicked, this, &AdBlockIcon::clicked);
+ updateState();
- setEnabled(AdBlockManager::instance()->isEnabled());
- connect(AdBlockManager::instance(), SIGNAL(enabledChanged(bool)), this, \
SLOT(setEnabled(bool))); + connect(this, &AbstractButtonInterface::clicked, this, \
&AdBlockIcon::clicked); + connect(this, &AbstractButtonInterface::webPageChanged, \
this, &AdBlockIcon::webPageChanged); + connect(AdBlockManager::instance(), \
&AdBlockManager::enabledChanged, this, &AdBlockIcon::updateState); }
AdBlockIcon::~AdBlockIcon()
@@ -79,46 +75,68 @@ void AdBlockIcon::popupBlocked(const QString &ruleString, const \
QUrl &url) m_blockedPopups.append(pair);
mApp->desktopNotifications()->showNotification(QPixmap(":html/adblock_big.png"), \
tr("Blocked popup window"), tr("AdBlock blocked unwanted popup window.")); +}
- if (!m_flashTimer) {
- m_flashTimer = new QTimer(this);
- }
-
- if (m_flashTimer->isActive()) {
- stopAnimation();
+void AdBlockIcon::toggleCustomFilter()
+{
+ QAction* action = qobject_cast<QAction*>(sender());
+ if (!action) {
+ return;
}
- m_flashTimer->setInterval(500);
- m_flashTimer->start();
+ const QString filter = action->data().toString();
+ AdBlockManager* manager = AdBlockManager::instance();
+ AdBlockCustomList* customList = manager->customList();
- connect(m_flashTimer, SIGNAL(timeout()), this, SLOT(animateIcon()));
+ if (customList->containsFilter(filter)) {
+ customList->removeFilter(filter);
+ }
+ else {
+ AdBlockRule* rule = new AdBlockRule(filter, customList);
+ customList->addRule(rule);
+ }
}
-QAction* AdBlockIcon::menuAction()
+void AdBlockIcon::updateState()
{
- if (!m_menuAction) {
- m_menuAction = new QAction(tr("AdBlock"), this);
- m_menuAction->setMenu(new QMenu);
- connect(m_menuAction->menu(), SIGNAL(aboutToShow()), this, \
SLOT(createMenu())); + WebPage *page = webPage();
+ if (!page) {
+ setActive(false);
+ setToolTip(name());
+ return;
}
-
- m_menuAction->setIcon(QIcon(m_enabled ? ":icons/other/adblock.png" : \
":icons/other/adblock-disabled.png"));
-
- return m_menuAction;
+ if (!AdBlockManager::instance()->isEnabled()) {
+ setActive(false);
+ setToolTip(tr("AdBlock is disabled"));
+ return;
+ }
+ if (!AdBlockManager::instance()->canRunOnScheme(page->url().scheme())) {
+ setActive(false);
+ setToolTip(tr("AdBlock is disabled on this site "));
+ return;
+ }
+ setActive(true);
+ setToolTip(tr("AdBlock is active"));
}
-void AdBlockIcon::createMenu(QMenu* menu)
+void AdBlockIcon::webPageChanged(WebPage *page)
{
- if (!menu) {
- menu = qobject_cast<QMenu*>(sender());
- if (!menu) {
- return;
- }
+ updateState();
+
+ if (m_page) {
+ disconnect(m_page, &QWebEnginePage::urlChanged, this, \
&AdBlockIcon::updateState); }
- menu->clear();
+ m_page = page;
- WebPage* page = webPage();
+ if (m_page) {
+ connect(m_page, &QWebEnginePage::urlChanged, this, \
&AdBlockIcon::updateState); + }
+}
+
+void AdBlockIcon::clicked(ClickController *controller)
+{
+ WebPage *page = webPage();
if (!page) {
return;
}
@@ -128,103 +146,42 @@ void AdBlockIcon::createMenu(QMenu* menu)
const QUrl pageUrl = page->url();
- menu->addAction(tr("Show AdBlock &Settings"), manager, SLOT(showDialog()));
- menu->addSeparator();
+ QMenu menu;
+ menu.addAction(tr("Show AdBlock &Settings"), manager, SLOT(showDialog()));
+ menu.addSeparator();
- if (!pageUrl.host().isEmpty() && m_enabled && \
manager->canRunOnScheme(pageUrl.scheme())) { + if (!pageUrl.host().isEmpty() && \
manager->isEnabled() && manager->canRunOnScheme(pageUrl.scheme())) {
const QString host = page->url().host().contains(QLatin1String("www.")) ? \
pageUrl.host().mid(4) : pageUrl.host(); const QString hostFilter = \
QString("@@||%1^$document").arg(host);
const QString pageFilter = \
QString("@@|%1|$document").arg(pageUrl.toString());
- QAction* act = menu->addAction(tr("Disable on %1").arg(host));
+ QAction* act = menu.addAction(tr("Disable on %1").arg(host));
act->setCheckable(true);
act->setChecked(customList->containsFilter(hostFilter));
act->setData(hostFilter);
connect(act, SIGNAL(triggered()), this, SLOT(toggleCustomFilter()));
- act = menu->addAction(tr("Disable only on this page"));
+ act = menu.addAction(tr("Disable only on this page"));
act->setCheckable(true);
act->setChecked(customList->containsFilter(pageFilter));
act->setData(pageFilter);
connect(act, SIGNAL(triggered()), this, SLOT(toggleCustomFilter()));
- menu->addSeparator();
+ menu.addSeparator();
}
if (!m_blockedPopups.isEmpty()) {
- menu->addAction(tr("Blocked Popup Windows"))->setEnabled(false);
+ menu.addAction(tr("Blocked Popup Windows"))->setEnabled(false);
for (int i = 0; i < m_blockedPopups.count(); i++) {
const QPair<AdBlockRule*, QUrl> &pair = m_blockedPopups.at(i);
QString address = pair.second.toString().right(55);
QString actionText = tr("%1 with (%2)").arg(address, \
pair.first->filter()).replace(QLatin1Char('&'), QLatin1String("&&"));
- QAction* action = menu->addAction(actionText, manager, \
SLOT(showRule())); + QAction* action = menu.addAction(actionText, manager, \
SLOT(showRule())); action->setData(QVariant::fromValue((void*)pair.first));
}
}
-}
-
-void AdBlockIcon::toggleCustomFilter()
-{
- QAction* action = qobject_cast<QAction*>(sender());
- if (!action) {
- return;
- }
-
- const QString filter = action->data().toString();
- AdBlockManager* manager = AdBlockManager::instance();
- AdBlockCustomList* customList = manager->customList();
-
- if (customList->containsFilter(filter)) {
- customList->removeFilter(filter);
- }
- else {
- AdBlockRule* rule = new AdBlockRule(filter, customList);
- customList->addRule(rule);
- }
-}
-
-void AdBlockIcon::animateIcon()
-{
- ++m_timerTicks;
- if (m_timerTicks > 10) {
- stopAnimation();
- return;
- }
-
- if (icon().isNull()) {
- setIcon(QIcon(QSL(":icons/other/adblock.png")));
- }
- else {
- setIcon(QIcon());
- }
-}
-
-void AdBlockIcon::stopAnimation()
-{
- m_timerTicks = 0;
- m_flashTimer->stop();
- disconnect(m_flashTimer, SIGNAL(timeout()), this, SLOT(animateIcon()));
-
- setEnabled(m_enabled);
-}
-void AdBlockIcon::clicked(ClickController *controller)
-{
- QMenu menu;
- createMenu(&menu);
menu.exec(controller->popupPosition(menu.sizeHint()));
}
-
-void AdBlockIcon::setEnabled(bool enabled)
-{
- if (enabled) {
- setIcon(QIcon(QSL(":icons/other/adblock.png")));
- }
- else {
- setIcon(QIcon(QSL(":icons/other/adblock-disabled.png")));
- }
-
- m_enabled = enabled;
-}
diff --git a/src/lib/adblock/adblockicon.h b/src/lib/adblock/adblockicon.h
index 8f2bb65a..e794cb2c 100644
--- a/src/lib/adblock/adblockicon.h
+++ b/src/lib/adblock/adblockicon.h
@@ -18,12 +18,12 @@
#ifndef ADBLOCKICON_H
#define ADBLOCKICON_H
+#include <QPointer>
+
#include "qzcommon.h"
#include "abstractbuttoninterface.h"
class QUrl;
-class QMenu;
-class QAction;
class AdBlockRule;
@@ -45,27 +45,17 @@ public:
QString name() const override;
void popupBlocked(const QString &ruleString, const QUrl &url);
- QAction* menuAction();
-
-public slots:
- void setEnabled(bool enabled);
- void createMenu(QMenu* menu = 0);
private slots:
void toggleCustomFilter();
- void animateIcon();
- void stopAnimation();
private:
+ void updateState();
+ void webPageChanged(WebPage *page);
void clicked(ClickController *controller);
- QAction* m_menuAction;
-
+ QPointer<WebPage> m_page;
QVector<QPair<AdBlockRule*, QUrl> > m_blockedPopups;
- QTimer* m_flashTimer;
-
- int m_timerTicks;
- bool m_enabled;
};
#endif // ADBLOCKICON_H
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic