File indexing completed on 2024-05-12 05:35:36

0001 /*
0002     SPDX-FileCopyrightText: 2014 Ivan Cukic <ivan.cukic(at)kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 // Qt
0010 #include <QAbstractItemModel>
0011 #include <QHash>
0012 #include <QJSValue>
0013 #include <QKeySequence>
0014 #include <QMimeData>
0015 #include <QObject>
0016 #include <QPixmap>
0017 #include <QTimer>
0018 
0019 #include <qqmlregistration.h>
0020 
0021 // KDE
0022 #include <PlasmaActivities/Controller>
0023 
0024 // Local
0025 #include "sortedactivitiesmodel.h"
0026 
0027 class QAction;
0028 class QRasterWindow;
0029 class QQmlEngine;
0030 class QJSEngine;
0031 
0032 namespace KIO
0033 {
0034 class PreviewJob;
0035 }
0036 
0037 class SwitcherBackend : public QObject
0038 {
0039     Q_OBJECT
0040     QML_ELEMENT
0041     QML_NAMED_ELEMENT(Backend)
0042     QML_SINGLETON
0043 
0044     Q_PROPERTY(bool shouldShowSwitcher READ shouldShowSwitcher WRITE setShouldShowSwitcher NOTIFY shouldShowSwitcherChanged)
0045     Q_PROPERTY(bool dropEnabled READ dropEnabled CONSTANT)
0046 
0047 public:
0048     explicit SwitcherBackend(QObject *parent);
0049     ~SwitcherBackend() override;
0050 
0051     static SwitcherBackend *create(QQmlEngine *engine, QJSEngine *scriptEngine);
0052 
0053 Q_SIGNALS:
0054     void showSwitchNotification(const QString &id, const QString &name, const QString &icon);
0055     void shouldShowSwitcherChanged(bool value);
0056 
0057 public Q_SLOTS:
0058     void init();
0059 
0060     bool shouldShowSwitcher() const;
0061     void setShouldShowSwitcher(bool shouldShowSwitcher);
0062 
0063     QAbstractItemModel *runningActivitiesModel() const;
0064     QAbstractItemModel *stoppedActivitiesModel() const;
0065 
0066     void setCurrentActivity(const QString &activity);
0067     void stopActivity(const QString &activity);
0068     void removeActivity(const QString &activity);
0069 
0070     void setDropMode(bool value);
0071     void drop(QMimeData *mimeData, int modifiers, const QVariant &activityId);
0072     void dropCopy(QMimeData *mimeData, const QVariant &activityId);
0073     void dropMove(QMimeData *mimeData, const QVariant &activityId);
0074     bool dropEnabled() const;
0075 
0076     void toggleActivityManager();
0077 
0078 private:
0079     template<typename Handler>
0080     inline void registerShortcut(const QString &actionName, const QString &name, const QKeySequence &shortcut, Handler &&handler);
0081 
0082     enum Direction {
0083         Next,
0084         Previous,
0085     };
0086 
0087     void switchToActivity(Direction i);
0088 
0089 private Q_SLOTS:
0090     void keybdSwitchToNextActivity();
0091     void keybdSwitchToPreviousActivity();
0092     void keybdSwitchedToAnotherActivity();
0093 
0094     void showActivitySwitcherIfNeeded();
0095 
0096     void onCurrentActivityChanged(const QString &id);
0097 
0098 private:
0099     QHash<QString, QKeySequence> m_actionShortcut;
0100     QAction *m_lastInvokedAction = nullptr;
0101     QRasterWindow *m_inputWindow = nullptr;
0102     KActivities::Controller m_activities;
0103     bool m_shouldShowSwitcher;
0104     QTimer m_modKeyPollingTimer;
0105     QString m_previousActivity;
0106 
0107     bool m_dropModeActive;
0108     QTimer m_dropModeHider;
0109 
0110     SortedActivitiesModel *m_runningActivitiesModel = nullptr;
0111     SortedActivitiesModel *m_stoppedActivitiesModel = nullptr;
0112 };