Rex Dieter 41c443
From 6566e8d25e41eed5bf03124740320bc92caaca93 Mon Sep 17 00:00:00 2001
Rex Dieter 41c443
From: David Rosca <nowrep@gmail.com>
Rex Dieter 41c443
Date: Thu, 25 Dec 2014 18:04:10 +0100
Rex Dieter 41c443
Subject: [PATCH 02/20] KCM SystemCheck: Add NoUsableAdapter error
Rex Dieter 41c443
Rex Dieter 41c443
Show "Your Bluetooth adapter is powered off" instead of
Rex Dieter 41c443
"No Bluetooth adapters found" when there are adapters
Rex Dieter 41c443
in system, but all of them powered off.
Rex Dieter 41c443
Rex Dieter 41c443
Also drop support to build with kdelibs < 4.7
Rex Dieter 41c443
---
Rex Dieter 41c443
 src/kcmodule/systemcheck.cpp | 143 ++++++++-----------------------------------
Rex Dieter 41c443
 src/kcmodule/systemcheck.h   |  31 ++--------
Rex Dieter 41c443
 2 files changed, 29 insertions(+), 145 deletions(-)
Rex Dieter 41c443
Rex Dieter 41c443
diff --git a/src/kcmodule/systemcheck.cpp b/src/kcmodule/systemcheck.cpp
Rex Dieter 41c443
index 44c47e5..6ad75d2 100644
Rex Dieter 41c443
--- a/src/kcmodule/systemcheck.cpp
Rex Dieter 41c443
+++ b/src/kcmodule/systemcheck.cpp
Rex Dieter 41c443
@@ -32,6 +32,7 @@
Rex Dieter 41c443
 #include <kcolorscheme.h>
Rex Dieter 41c443
 #include <kstandarddirs.h>
Rex Dieter 41c443
 #include <klocalizedstring.h>
Rex Dieter 41c443
+#include <kmessagewidget.h>
Rex Dieter 41c443
 
Rex Dieter 41c443
 #include <QtGui/QLabel>
Rex Dieter 41c443
 #include <QtGui/QWidget>
Rex Dieter 41c443
@@ -39,93 +40,12 @@
Rex Dieter 41c443
 #include <QtGui/QBoxLayout>
Rex Dieter 41c443
 #include <QtGui/QPaintEvent>
Rex Dieter 41c443
 
Rex Dieter 41c443
-#if KDE_IS_VERSION(4,6,41)
Rex Dieter 41c443
-#include <kmessagewidget.h>
Rex Dieter 41c443
-#else
Rex Dieter 41c443
-
Rex Dieter 41c443
-class ErrorWidget
Rex Dieter 41c443
-    : public QWidget
Rex Dieter 41c443
-{
Rex Dieter 41c443
-public:
Rex Dieter 41c443
-    ErrorWidget(QWidget *parent = 0);
Rex Dieter 41c443
-    virtual ~ErrorWidget();
Rex Dieter 41c443
-
Rex Dieter 41c443
-    void setIcon(const QString &icon);
Rex Dieter 41c443
-    void setText(const QString &reason);
Rex Dieter 41c443
-    void addAction(KPushButton *action);
Rex Dieter 41c443
-
Rex Dieter 41c443
-protected:
Rex Dieter 41c443
-    virtual void paintEvent(QPaintEvent *event);
Rex Dieter 41c443
-
Rex Dieter 41c443
-private:
Rex Dieter 41c443
-    QLabel      *m_icon;
Rex Dieter 41c443
-    QLabel      *m_reason;
Rex Dieter 41c443
-    QHBoxLayout *m_actions;
Rex Dieter 41c443
-};
Rex Dieter 41c443
-
Rex Dieter 41c443
-ErrorWidget::ErrorWidget(QWidget *parent)
Rex Dieter 41c443
-    : QWidget(parent)
Rex Dieter 41c443
-    , m_icon(new QLabel(this))
Rex Dieter 41c443
-    , m_reason(new QLabel(this))
Rex Dieter 41c443
-    , m_actions(new QHBoxLayout)
Rex Dieter 41c443
-{
Rex Dieter 41c443
-    setAutoFillBackground(false);
Rex Dieter 41c443
-
Rex Dieter 41c443
-    m_actions->addStretch();
Rex Dieter 41c443
-
Rex Dieter 41c443
-    QHBoxLayout *layout = new QHBoxLayout;
Rex Dieter 41c443
-    layout->addWidget(m_icon);
Rex Dieter 41c443
-    layout->addWidget(m_reason, 1);
Rex Dieter 41c443
-
Rex Dieter 41c443
-    QVBoxLayout *outter = new QVBoxLayout;
Rex Dieter 41c443
-    outter->addLayout(layout);
Rex Dieter 41c443
-    outter->addLayout(m_actions);
Rex Dieter 41c443
-
Rex Dieter 41c443
-    setLayout(outter);
Rex Dieter 41c443
-}
Rex Dieter 41c443
-
Rex Dieter 41c443
-ErrorWidget::~ErrorWidget()
Rex Dieter 41c443
-{
Rex Dieter 41c443
-}
Rex Dieter 41c443
-
Rex Dieter 41c443
-void ErrorWidget::setIcon(const QString &icon)
Rex Dieter 41c443
-{
Rex Dieter 41c443
-    m_icon->setPixmap(KIconLoader::global()->loadIcon(icon, KIconLoader::Dialog));
Rex Dieter 41c443
-}
Rex Dieter 41c443
-
Rex Dieter 41c443
-void ErrorWidget::setText(const QString &reason)
Rex Dieter 41c443
-{
Rex Dieter 41c443
-    m_reason->setText(reason);
Rex Dieter 41c443
-}
Rex Dieter 41c443
-
Rex Dieter 41c443
-void ErrorWidget::addAction(KPushButton *action)
Rex Dieter 41c443
-{
Rex Dieter 41c443
-    action->setAutoFillBackground(false);
Rex Dieter 41c443
-    m_actions->addWidget(action);
Rex Dieter 41c443
-}
Rex Dieter 41c443
-
Rex Dieter 41c443
-void ErrorWidget::paintEvent(QPaintEvent *event)
Rex Dieter 41c443
-{
Rex Dieter 41c443
-    const QRect r = event->rect();
Rex Dieter 41c443
-    const KColorScheme colorScheme(QPalette::Active, KColorScheme::Window);
Rex Dieter 41c443
-
Rex Dieter 41c443
-    QPainter p(this);
Rex Dieter 41c443
-    p.setRenderHint(QPainter::Antialiasing);
Rex Dieter 41c443
-
Rex Dieter 41c443
-    QPainterPath path;
Rex Dieter 41c443
-    path.addRoundedRect(0, 0, r.width(), r.height(), 10, 10);
Rex Dieter 41c443
-    p.fillPath(path, colorScheme.background(KColorScheme::NegativeBackground));
Rex Dieter 41c443
-
Rex Dieter 41c443
-    QWidget::paintEvent(event);
Rex Dieter 41c443
-}
Rex Dieter 41c443
-#endif
Rex Dieter 41c443
-////////////////////////////////////////////////////////////////////////////////////////////////////
Rex Dieter 41c443
-
Rex Dieter 41c443
 SystemCheck::SystemCheck(QWidget *parent)
Rex Dieter 41c443
     : QObject(parent)
Rex Dieter 41c443
     , m_kded(new KDED("org.kde.kded", "/kded", QDBusConnection::sessionBus()))
Rex Dieter 41c443
     , m_parent(parent)
Rex Dieter 41c443
     , m_noAdaptersError(0)
Rex Dieter 41c443
+    , m_noUsableAdapterError(0)
Rex Dieter 41c443
     , m_notDiscoverableAdapterError(0)
Rex Dieter 41c443
     , m_disabledNotificationsError(0)
Rex Dieter 41c443
 {
Rex Dieter 41c443
@@ -133,9 +53,6 @@ SystemCheck::SystemCheck(QWidget *parent)
Rex Dieter 41c443
 
Rex Dieter 41c443
 SystemCheck::~SystemCheck()
Rex Dieter 41c443
 {
Rex Dieter 41c443
-    m_noAdaptersError = 0;
Rex Dieter 41c443
-    m_notDiscoverableAdapterError = 0;
Rex Dieter 41c443
-    m_disabledNotificationsError = 0;
Rex Dieter 41c443
     delete m_kded;
Rex Dieter 41c443
 }
Rex Dieter 41c443
 
Rex Dieter 41c443
@@ -145,18 +62,22 @@ void SystemCheck::createWarnings(QVBoxLayout *layout)
Rex Dieter 41c443
         return;
Rex Dieter 41c443
     }
Rex Dieter 41c443
 
Rex Dieter 41c443
-#if KDE_IS_VERSION(4,6,41)
Rex Dieter 41c443
     m_noAdaptersError = new KMessageWidget(m_parent);
Rex Dieter 41c443
     m_noAdaptersError->setMessageType(KMessageWidget::Error);
Rex Dieter 41c443
     m_noAdaptersError->setCloseButtonVisible(false);
Rex Dieter 41c443
-#else
Rex Dieter 41c443
-    m_noAdaptersError = new ErrorWidget(m_parent);
Rex Dieter 41c443
-    m_noAdaptersError->setIcon("window-close");
Rex Dieter 41c443
-#endif
Rex Dieter 41c443
     m_noAdaptersError->setText(i18n("No Bluetooth adapters have been found."));
Rex Dieter 41c443
     layout->addWidget(m_noAdaptersError);
Rex Dieter 41c443
 
Rex Dieter 41c443
-#if KDE_IS_VERSION(4,6,41)
Rex Dieter 41c443
+    m_noUsableAdapterError = new KMessageWidget(m_parent);
Rex Dieter 41c443
+    m_noUsableAdapterError->setMessageType(KMessageWidget::Warning);
Rex Dieter 41c443
+    m_noUsableAdapterError->setCloseButtonVisible(false);
Rex Dieter 41c443
+    m_noUsableAdapterError->setText(i18n("Your Bluetooth adapter is powered off."));
Rex Dieter 41c443
+
Rex Dieter 41c443
+    KAction *fixNoUsableAdapter = new KAction(KIcon("dialog-ok-apply"), i18nc("Action to fix a problem", "Fix it"), m_noUsableAdapterError);
Rex Dieter 41c443
+    connect(fixNoUsableAdapter, SIGNAL(triggered(bool)), this, SLOT(fixNoUsableAdapterError()));
Rex Dieter 41c443
+    m_noUsableAdapterError->addAction(fixNoUsableAdapter);
Rex Dieter 41c443
+    layout->addWidget(m_noUsableAdapterError);
Rex Dieter 41c443
+
Rex Dieter 41c443
     m_notDiscoverableAdapterError = new KMessageWidget(m_parent);
Rex Dieter 41c443
     m_notDiscoverableAdapterError->setMessageType(KMessageWidget::Warning);
Rex Dieter 41c443
     m_notDiscoverableAdapterError->setCloseButtonVisible(false);
Rex Dieter 41c443
@@ -164,19 +85,10 @@ void SystemCheck::createWarnings(QVBoxLayout *layout)
Rex Dieter 41c443
     KAction *fixNotDiscoverableAdapter = new KAction(KIcon("dialog-ok-apply"), i18nc("Action to fix a problem", "Fix it"), m_notDiscoverableAdapterError);
Rex Dieter 41c443
     connect(fixNotDiscoverableAdapter, SIGNAL(triggered(bool)), this, SLOT(fixNotDiscoverableAdapterError()));
Rex Dieter 41c443
     m_notDiscoverableAdapterError->addAction(fixNotDiscoverableAdapter);
Rex Dieter 41c443
-#else
Rex Dieter 41c443
-    m_notDiscoverableAdapterError = new ErrorWidget(m_parent);
Rex Dieter 41c443
-    m_notDiscoverableAdapterError->setIcon("edit-find");
Rex Dieter 41c443
-
Rex Dieter 41c443
-    KPushButton *fixNotDiscoverableAdapter = new KPushButton(KIcon("dialog-ok-apply"), i18nc("Action to fix a problem", "Fix it"), m_notDiscoverableAdapterError);
Rex Dieter 41c443
-    connect(fixNotDiscoverableAdapter, SIGNAL(clicked()), this, SLOT(fixNotDiscoverableAdapterError()));
Rex Dieter 41c443
-    m_notDiscoverableAdapterError->addAction(fixNotDiscoverableAdapter);
Rex Dieter 41c443
-#endif
Rex Dieter 41c443
     m_notDiscoverableAdapterError->setText(i18n("Your default Bluetooth adapter is not visible for remote devices."));
Rex Dieter 41c443
 
Rex Dieter 41c443
     layout->addWidget(m_notDiscoverableAdapterError);
Rex Dieter 41c443
 
Rex Dieter 41c443
-#if KDE_IS_VERSION(4,6,41)
Rex Dieter 41c443
     m_disabledNotificationsError = new KMessageWidget(m_parent);
Rex Dieter 41c443
     m_disabledNotificationsError->setMessageType(KMessageWidget::Warning);
Rex Dieter 41c443
     m_disabledNotificationsError->setCloseButtonVisible(false);
Rex Dieter 41c443
@@ -184,19 +96,10 @@ void SystemCheck::createWarnings(QVBoxLayout *layout)
Rex Dieter 41c443
     KAction *fixDisabledNotifications = new KAction(KIcon("dialog-ok-apply"), i18nc("Action to fix a problem", "Fix it"), m_disabledNotificationsError);
Rex Dieter 41c443
     connect(fixDisabledNotifications, SIGNAL(triggered(bool)), this, SLOT(fixDisabledNotificationsError()));
Rex Dieter 41c443
     m_disabledNotificationsError->addAction(fixDisabledNotifications);
Rex Dieter 41c443
-#else
Rex Dieter 41c443
-    m_disabledNotificationsError = new ErrorWidget(m_parent);
Rex Dieter 41c443
-    m_disabledNotificationsError->setIcon("preferences-desktop-notification");
Rex Dieter 41c443
-
Rex Dieter 41c443
-    KPushButton *fixDisabledNotifications = new KPushButton(KIcon("dialog-ok-apply"), i18nc("Action to fix a problem", "Fix it"), m_disabledNotificationsError);
Rex Dieter 41c443
-    connect(fixDisabledNotifications, SIGNAL(clicked()), this, SLOT(fixDisabledNotificationsError()));
Rex Dieter 41c443
-    m_disabledNotificationsError->addAction(fixDisabledNotifications);
Rex Dieter 41c443
-#endif
Rex Dieter 41c443
     m_disabledNotificationsError->setText(i18n("Interaction with Bluetooth system is not optimal."));
Rex Dieter 41c443
 
Rex Dieter 41c443
     layout->addWidget(m_disabledNotificationsError);
Rex Dieter 41c443
 
Rex Dieter 41c443
-#if KDE_IS_VERSION(4,6,41)
Rex Dieter 41c443
     m_noKDEDRunning = new KMessageWidget(m_parent);
Rex Dieter 41c443
     m_noKDEDRunning ->setMessageType(KMessageWidget::Warning);
Rex Dieter 41c443
     m_noKDEDRunning->setCloseButtonVisible(false);
Rex Dieter 41c443
@@ -204,14 +107,6 @@ void SystemCheck::createWarnings(QVBoxLayout *layout)
Rex Dieter 41c443
     KAction *fixNoKDEDRunning = new KAction(KIcon("dialog-ok-apply"), i18nc("Action to fix a problem", "Fix it"), m_noKDEDRunning);
Rex Dieter 41c443
     connect(fixNoKDEDRunning, SIGNAL(triggered(bool)), this, SLOT(fixNoKDEDRunning()));
Rex Dieter 41c443
     m_noKDEDRunning->addAction(fixNoKDEDRunning);
Rex Dieter 41c443
-#else
Rex Dieter 41c443
-    m_noKDEDRunning = new ErrorWidget(m_parent);
Rex Dieter 41c443
-    m_noKDEDRunning->setIcon("dialog-warning");
Rex Dieter 41c443
-
Rex Dieter 41c443
-    KPushButton *fixNoKDEDRunning = new KPushButton(KIcon("dialog-ok-apply"), i18nc("Action to fix a problem", "Fix it"), m_noKDEDRunning);
Rex Dieter 41c443
-    connect(fixNoKDEDRunning, SIGNAL(clicked()), this, SLOT(fixNoKDEDRunning()));
Rex Dieter 41c443
-    m_noKDEDRunning->addAction(fixNoKDEDRunning);
Rex Dieter 41c443
-#endif
Rex Dieter 41c443
     m_noKDEDRunning->setText(i18n("Bluetooth is not completely enabled."));
Rex Dieter 41c443
 
Rex Dieter 41c443
     layout->addWidget(m_noKDEDRunning);
Rex Dieter 41c443
@@ -259,6 +154,7 @@ void SystemCheck::updateInformationState()
Rex Dieter 41c443
 {
Rex Dieter 41c443
     m_noAdaptersError->setEnabled(true);
Rex Dieter 41c443
     m_noAdaptersError->setVisible(false);
Rex Dieter 41c443
+    m_noUsableAdapterError->setVisible(false);
Rex Dieter 41c443
     m_notDiscoverableAdapterError->setVisible(false);
Rex Dieter 41c443
     m_disabledNotificationsError->setVisible(false);
Rex Dieter 41c443
     m_noKDEDRunning->setVisible(false);
Rex Dieter 41c443
@@ -268,9 +164,14 @@ void SystemCheck::updateInformationState()
Rex Dieter 41c443
         return;
Rex Dieter 41c443
     }
Rex Dieter 41c443
 
Rex Dieter 41c443
+    if (BlueDevil::Manager::self()->adapters().isEmpty()) {
Rex Dieter 41c443
+        m_noAdaptersError->setVisible(true);
Rex Dieter 41c443
+        return;
Rex Dieter 41c443
+    }
Rex Dieter 41c443
+
Rex Dieter 41c443
     BlueDevil::Adapter *const usableAdapter = BlueDevil::Manager::self()->usableAdapter();
Rex Dieter 41c443
     if (!usableAdapter) {
Rex Dieter 41c443
-        m_noAdaptersError->setVisible(true);
Rex Dieter 41c443
+        m_noUsableAdapterError->setVisible(true);
Rex Dieter 41c443
         return;
Rex Dieter 41c443
     }
Rex Dieter 41c443
     if (!usableAdapter->isDiscoverable()) {
Rex Dieter 41c443
@@ -293,6 +194,12 @@ void SystemCheck::fixNoKDEDRunning()
Rex Dieter 41c443
     m_kded->loadModule("bluedevil");
Rex Dieter 41c443
 }
Rex Dieter 41c443
 
Rex Dieter 41c443
+void SystemCheck::fixNoUsableAdapterError()
Rex Dieter 41c443
+{
Rex Dieter 41c443
+    m_noUsableAdapterError->setVisible(false);
Rex Dieter 41c443
+    BlueDevil::Manager::self()->adapters().first()->setPowered(true);
Rex Dieter 41c443
+}
Rex Dieter 41c443
+
Rex Dieter 41c443
 void SystemCheck::fixNotDiscoverableAdapterError()
Rex Dieter 41c443
 {
Rex Dieter 41c443
     m_notDiscoverableAdapterError->setVisible(false);
Rex Dieter 41c443
diff --git a/src/kcmodule/systemcheck.h b/src/kcmodule/systemcheck.h
Rex Dieter 41c443
index e03daf9..ee94f7e 100644
Rex Dieter 41c443
--- a/src/kcmodule/systemcheck.h
Rex Dieter 41c443
+++ b/src/kcmodule/systemcheck.h
Rex Dieter 41c443
@@ -22,19 +22,12 @@
Rex Dieter 41c443
 #define BLUEDEVIL_SYSTEM_CHECK_H
Rex Dieter 41c443
 #include <QtCore/QObject>
Rex Dieter 41c443
 
Rex Dieter 41c443
-#include <kdeversion.h>
Rex Dieter 41c443
-
Rex Dieter 41c443
 class QVBoxLayout;
Rex Dieter 41c443
 
Rex Dieter 41c443
 class KDED;
Rex Dieter 41c443
-#if KDE_IS_VERSION(4,6,41)
Rex Dieter 41c443
 class KMessageWidget;
Rex Dieter 41c443
-#else
Rex Dieter 41c443
-class ErrorWidget;
Rex Dieter 41c443
-#endif
Rex Dieter 41c443
 
Rex Dieter 41c443
-class SystemCheck
Rex Dieter 41c443
-    : public QObject
Rex Dieter 41c443
+class SystemCheck : public QObject
Rex Dieter 41c443
 {
Rex Dieter 41c443
     Q_OBJECT
Rex Dieter 41c443
 
Rex Dieter 41c443
@@ -42,17 +35,6 @@ public:
Rex Dieter 41c443
     SystemCheck(QWidget *parent);
Rex Dieter 41c443
     virtual ~SystemCheck();
Rex Dieter 41c443
 
Rex Dieter 41c443
-    struct SystemCheckResult {
Rex Dieter 41c443
-        enum Result {
Rex Dieter 41c443
-            NoWarnings = 0,
Rex Dieter 41c443
-            BluetoothDisabled,
Rex Dieter 41c443
-            NoAdapters,
Rex Dieter 41c443
-            NotificationsDisabled,
Rex Dieter 41c443
-            DefaultAdapterHidden
Rex Dieter 41c443
-        } result;
Rex Dieter 41c443
-        QWidget *warningWidget;
Rex Dieter 41c443
-    };
Rex Dieter 41c443
-
Rex Dieter 41c443
     void createWarnings(QVBoxLayout *layout);
Rex Dieter 41c443
 
Rex Dieter 41c443
     bool checkKDEDModuleLoaded();
Rex Dieter 41c443
@@ -67,23 +49,18 @@ public Q_SLOTS:
Rex Dieter 41c443
 
Rex Dieter 41c443
 private Q_SLOTS:
Rex Dieter 41c443
     void fixNoKDEDRunning();
Rex Dieter 41c443
+    void fixNoUsableAdapterError();
Rex Dieter 41c443
     void fixNotDiscoverableAdapterError();
Rex Dieter 41c443
     void fixDisabledNotificationsError();
Rex Dieter 41c443
 
Rex Dieter 41c443
 private:
Rex Dieter 41c443
     KDED        *m_kded;
Rex Dieter 41c443
     QWidget     *m_parent;
Rex Dieter 41c443
-#if KDE_IS_VERSION(4,6,41)
Rex Dieter 41c443
     KMessageWidget *m_noAdaptersError;
Rex Dieter 41c443
+    KMessageWidget *m_noUsableAdapterError;
Rex Dieter 41c443
     KMessageWidget *m_noKDEDRunning;
Rex Dieter 41c443
     KMessageWidget *m_notDiscoverableAdapterError;
Rex Dieter 41c443
     KMessageWidget *m_disabledNotificationsError;
Rex Dieter 41c443
-#else
Rex Dieter 41c443
-    ErrorWidget *m_noAdaptersError;
Rex Dieter 41c443
-    ErrorWidget *m_noKDEDRunning;
Rex Dieter 41c443
-    ErrorWidget *m_notDiscoverableAdapterError;
Rex Dieter 41c443
-    ErrorWidget *m_disabledNotificationsError;
Rex Dieter 41c443
-#endif
Rex Dieter 41c443
 };
Rex Dieter 41c443
 
Rex Dieter 41c443
-#endif //BLUEDEVIL_SYSTEM_CHECK_H
Rex Dieter 41c443
\ No newline at end of file
Rex Dieter 41c443
+#endif //BLUEDEVIL_SYSTEM_CHECK_H
Rex Dieter 41c443
-- 
Rex Dieter 41c443
2.1.0
Rex Dieter 41c443