File 0015-Changes-to-global-menu-applet.patch of Package plasma5-workspace

From 13bddd5e21fc9d8aca31fab621e2f1068700c177 Mon Sep 17 00:00:00 2001
From: Chinmoy Ranjan Pradhan <chinmoyrp65@gmail.com>
Date: Wed, 11 Jan 2017 20:45:24 +0530
Subject: [PATCH 15/44]     Changes to global menu applet

    Some changes made to global menu applet:
    1. Use "application-menu" icon in compact view.
    2. Show a warning sign when global menu style is not set to "Widget".
    3. When in a vertical panel force use compact view.
    4. And some minor changes and cleanup.

    Differential Revision: https://phabricator.kde.org/D4070
---
 applets/appmenu/lib/CMakeLists.txt                 |  1 +
 applets/appmenu/lib/appmenuapplet.cpp              | 25 +++++++++++++++++++
 applets/appmenu/lib/appmenuapplet.h                | 10 +++++++-
 .../appmenu/package/contents/ui/configGeneral.qml  | 12 ++++++---
 applets/appmenu/package/contents/ui/main.qml       | 29 ++++++++++++++++------
 applets/appmenu/plugin/appmenumodel.cpp            | 19 +++++++++++---
 applets/appmenu/plugin/appmenumodel.h              |  9 +++++--
 7 files changed, 88 insertions(+), 17 deletions(-)

diff --git a/applets/appmenu/lib/CMakeLists.txt b/applets/appmenu/lib/CMakeLists.txt
index 2947b04b..5b310e7c 100644
--- a/applets/appmenu/lib/CMakeLists.txt
+++ b/applets/appmenu/lib/CMakeLists.txt
@@ -9,6 +9,7 @@ kcoreaddons_desktop_to_json(plasma_applet_appmenu ../package/metadata.desktop)
 target_link_libraries(plasma_applet_appmenu
                       Qt5::Widgets
                       Qt5::Quick
+                      Qt5::DBus
                       KF5::Plasma
                       KF5::WindowSystem)
 
diff --git a/applets/appmenu/lib/appmenuapplet.cpp b/applets/appmenu/lib/appmenuapplet.cpp
index d70af0d7..51fd3a6c 100644
--- a/applets/appmenu/lib/appmenuapplet.cpp
+++ b/applets/appmenu/lib/appmenuapplet.cpp
@@ -29,6 +29,7 @@
 #include <QQuickItem>
 #include <QQuickWindow>
 #include <QScreen>
+#include <QDBusConnection>
 
 AppMenuApplet::AppMenuApplet(QObject *parent, const QVariantList &data)
     : Plasma::Applet(parent, data)
@@ -40,6 +41,12 @@ AppMenuApplet::~AppMenuApplet() = default;
 void AppMenuApplet::init()
 {
     // TODO Wayland PlasmaShellSurface stuff
+    QDBusConnection::sessionBus().connect(QStringLiteral("org.kde.kappmenu"),
+                                          QStringLiteral("/KAppMenu"),
+                                          QStringLiteral("org.kde.kappmenu"),
+                                          QStringLiteral("reconfigured"),
+                                          this, SLOT(updateAppletEnabled()));
+    updateAppletEnabled();
 }
 
 AppMenuModel *AppMenuApplet::model() const
@@ -94,6 +101,24 @@ void AppMenuApplet::setButtonGrid(QQuickItem *buttonGrid)
     }
 }
 
+bool AppMenuApplet::appletEnabled() const
+{
+    return m_appletEnabled;
+}
+
+void AppMenuApplet::updateAppletEnabled()
+{
+    KConfigGroup config(KSharedConfig::openConfig(QStringLiteral("kdeglobals")), QStringLiteral("Appmenu Style"));
+    const QString &menuStyle = config.readEntry(QStringLiteral("Style"));
+
+    const bool enabled = (menuStyle == QLatin1String("Widget"));
+
+    if (m_appletEnabled != enabled) {
+        m_appletEnabled = enabled;
+        emit appletEnabledChanged();
+    }
+}
+
 QMenu *AppMenuApplet::createMenu(int idx) const
 {
     QMenu *menu = nullptr;
diff --git a/applets/appmenu/lib/appmenuapplet.h b/applets/appmenu/lib/appmenuapplet.h
index 85296720..d08013f6 100644
--- a/applets/appmenu/lib/appmenuapplet.h
+++ b/applets/appmenu/lib/appmenuapplet.h
@@ -33,6 +33,8 @@ class AppMenuApplet : public Plasma::Applet
 {
     Q_OBJECT
 
+    Q_PROPERTY(bool appletEnabled READ appletEnabled NOTIFY appletEnabledChanged)
+
     Q_PROPERTY(AppMenuModel* model READ model WRITE setModel NOTIFY modelChanged)
 
     Q_PROPERTY(int view READ view WRITE setView NOTIFY viewChanged)
@@ -63,15 +65,20 @@ public:
     int view() const;
     void setView(int type);
 
-    Q_INVOKABLE void trigger(QQuickItem *ctx, int idx);
+    bool appletEnabled() const;
 
 signals:
     void modelChanged();
     void viewChanged();
     void currentIndexChanged();
     void buttonGridChanged();
+    void appletEnabledChanged();
     void requestActivateIndex(int index);
 
+public slots:
+    void updateAppletEnabled();
+    void trigger(QQuickItem *ctx, int idx);
+
 protected:
     bool eventFilter(QObject *watched, QEvent *event);
 
@@ -83,6 +90,7 @@ private:
 
     int m_currentIndex = -1;
     int m_viewType = FullView;
+    bool m_appletEnabled = true;
     QPointer<QMenu> m_currentMenu;
     QPointer<QQuickItem> m_buttonGrid;
     QPointer<AppMenuModel> m_model;
diff --git a/applets/appmenu/package/contents/ui/configGeneral.qml b/applets/appmenu/package/contents/ui/configGeneral.qml
index 93de158b..5dc618e4 100644
--- a/applets/appmenu/package/contents/ui/configGeneral.qml
+++ b/applets/appmenu/package/contents/ui/configGeneral.qml
@@ -22,26 +22,32 @@ import QtQuick 2.0
 import QtQuick.Controls 1.0 as Controls
 import QtQuick.Layouts 1.1 as Layouts
 
+import org.kde.plasma.plasmoid 2.0
 import org.kde.plasma.core 2.0 as PlasmaCore
 
 Layouts.ColumnLayout {
     id: configGeneral
 
-    property alias cfg_compactView: compactViewCheckBox.checked
+    property alias cfg_compactView: compactViewRadioButton.checked
+
+    property bool disableSetting: plasmoid.formFactor === PlasmaCore.Types.Vertical || !plasmoid.nativeInterface.appletEnabled
 
     Controls.ExclusiveGroup {
         id: viewOptionGroup
     }
 
     Controls.RadioButton {
-        id: compactViewCheckBox
+        id: compactViewRadioButton
+        enabled: !disableSetting
         text: i18n("Use single button for application menu")
         exclusiveGroup: viewOptionGroup
     }
     Controls.RadioButton {
+        id: fullViewRadioButton
         //this checked binding is just for the initial load in case
         //compactViewCheckBox is not checked. Then exclusive group manages it
-        checked: !compactViewCheckBox.checked
+        enabled: !disableSetting
+        checked: !compactViewRadioButton.checked
         text: i18n("Show full application menu")
         exclusiveGroup: viewOptionGroup
     }
diff --git a/applets/appmenu/package/contents/ui/main.qml b/applets/appmenu/package/contents/ui/main.qml
index e24682ac..ca5a50bc 100644
--- a/applets/appmenu/package/contents/ui/main.qml
+++ b/applets/appmenu/package/contents/ui/main.qml
@@ -21,35 +21,46 @@ import QtQuick.Layouts 1.1
 import QtQuick.Controls 1.4
 
 import org.kde.plasma.plasmoid 2.0
+import org.kde.kquickcontrolsaddons 2.0
 import org.kde.plasma.core 2.0 as PlasmaCore
 import org.kde.plasma.components 2.0 as PlasmaComponents
-import org.kde.plasma.extras 2.0 as PlasmaExtras
 import org.kde.plasma.private.appmenu 1.0 as AppMenuPrivate
 
 Item {
     id: root
 
     readonly property bool vertical: plasmoid.formFactor === PlasmaCore.Types.Vertical
+    readonly property bool appletEnabled: plasmoid.nativeInterface.appletEnabled
+    readonly property bool view: plasmoid.configuration.compactView
+    readonly property bool menuAvailable: appMenuModel.menuAvailable
 
-    readonly property bool compactView: plasmoid.configuration.compactView
-
-    onCompactViewChanged: {
-        plasmoid.nativeInterface.view = compactView
+    onViewChanged: {
+        plasmoid.nativeInterface.view = view
     }
 
     Layout.minimumWidth: units.gridUnit
     Layout.minimumHeight: units.gridUnit
 
-    Plasmoid.preferredRepresentation: plasmoid.configuration.compactView ? Plasmoid.compactRepresentation : Plasmoid.fullRepresentation
+    Plasmoid.preferredRepresentation: (plasmoid.configuration.compactView || vertical || !appletEnabled) ? Plasmoid.compactRepresentation : Plasmoid.fullRepresentation
 
     Plasmoid.compactRepresentation: PlasmaComponents.ToolButton {
+        readonly property int fakeIndex: 0
         Layout.fillWidth: false
         Layout.fillHeight: false
         Layout.minimumWidth: implicitWidth
         Layout.maximumWidth: implicitWidth
-        text: i18n("Menu")
+        enabled: appletEnabled ? menuAvailable : true
+        checkable: appletEnabled && menuAvailable && plasmoid.nativeInterface.currentIndex === fakeIndex
+        checked: checkable
+        iconSource: appletEnabled ? i18n("application-menu") : i18n("emblem-warning")
         onClicked: {
-            plasmoid.nativeInterface.trigger(this, 0);
+            if (appletEnabled) {
+                plasmoid.nativeInterface.trigger(this, 0);
+            } else {
+                KCMShell.open("style")
+            }
+
+
         }
     }
 
@@ -97,6 +108,8 @@ Item {
         }
     }
 
+    Plasmoid.toolTipSubText: !appletEnabled ? i18n("Application Menu Widget is disabled in settings.\n\nGo to Settings > Application Style > Fine Tuning(tab) to enable it again.") : ""
+
     AppMenuPrivate.AppMenuModel {
         id: appMenuModel
         Component.onCompleted: {
diff --git a/applets/appmenu/plugin/appmenumodel.cpp b/applets/appmenu/plugin/appmenumodel.cpp
index 2e4b8546..41e030c7 100644
--- a/applets/appmenu/plugin/appmenumodel.cpp
+++ b/applets/appmenu/plugin/appmenumodel.cpp
@@ -66,6 +66,19 @@ AppMenuModel::AppMenuModel(QObject *parent)
 
 AppMenuModel::~AppMenuModel() = default;
 
+bool AppMenuModel::menuAvailable() const
+{
+    return m_menuAvailable;
+}
+
+void AppMenuModel::setMenuAvailable(bool set)
+{
+    if (m_menuAvailable != set) {
+        m_menuAvailable = set;
+        emit menuAvailableChanged();
+    }
+}
+
 int AppMenuModel::rowCount(const QModelIndex &parent) const
 {
     Q_UNUSED(parent);
@@ -80,7 +93,7 @@ void AppMenuModel::update()
         m_activeActions.clear();
     }
 
-    if (m_menu && m_winHasMenu) {
+    if (m_menu && m_menuAvailable) {
         const auto &actions = m_menu->actions();
         for (QAction *action : actions) {
             m_activeActions.append(action);
@@ -141,7 +154,7 @@ void AppMenuModel::onActiveWindowChanged(WId id)
                 updateApplicationMenu(serviceName, menuObjectPath);
                 return true;
             }
-            m_winHasMenu = false;
+            setMenuAvailable(false);
             emit modelNeedsUpdate();
             return false;
         };
@@ -218,7 +231,7 @@ void AppMenuModel::updateApplicationMenu(const QString &serviceName, const QStri
         if (m_menu.isNull()) {
             return;
         }
-        m_winHasMenu = true;
+        setMenuAvailable(true);
         emit modelNeedsUpdate();
     });
 
diff --git a/applets/appmenu/plugin/appmenumodel.h b/applets/appmenu/plugin/appmenumodel.h
index 581cf483..77ad5e9d 100644
--- a/applets/appmenu/plugin/appmenumodel.h
+++ b/applets/appmenu/plugin/appmenumodel.h
@@ -33,6 +33,8 @@ class AppMenuModel : public QAbstractListModel
 {
     Q_OBJECT
 
+    Q_PROPERTY(bool menuAvailable READ menuAvailable WRITE setMenuAvailable NOTIFY menuAvailableChanged)
+
 public:
     explicit AppMenuModel(QObject *parent = 0);
     ~AppMenuModel();
@@ -48,16 +50,19 @@ public:
 
     void updateApplicationMenu(const QString &serviceName, const QString &menuObjectPath);
 
+    bool menuAvailable() const;
+    void setMenuAvailable(bool set);
+
 private Q_SLOTS:
     void onActiveWindowChanged(WId id);
     void update();
 
 signals:
+    void menuAvailableChanged();
     void modelNeedsUpdate();
 
-
 private:
-    bool m_winHasMenu;
+    bool m_menuAvailable;
 
     QPointer<QMenu> m_menu;
     QStringList m_activeMenu;
-- 
2.12.0

openSUSE Build Service is sponsored by