You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
8.4 KiB
265 lines
8.4 KiB
/* |
|
SPDX-FileCopyrightText: 2013 Marco Martin <mart@kde.org> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include <Plasma/Theme> |
|
#include <QPointer> |
|
#include <QTimer> |
|
|
|
#include <PlasmaQuick/ConfigView> |
|
#include <PlasmaQuick/ContainmentView> |
|
|
|
class ShellCorona; |
|
|
|
namespace KWayland |
|
{ |
|
namespace Client |
|
{ |
|
class PlasmaShellSurface; |
|
} |
|
} |
|
|
|
class PanelView : public PlasmaQuick::ContainmentView |
|
|
|
{ |
|
Q_OBJECT |
|
/** |
|
* Alignment of the panel: when not fullsize it can be aligned at left, |
|
* right or center of the screen (left and right work as top/bottom |
|
* too for vertical panels) |
|
*/ |
|
Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged) |
|
|
|
/** |
|
* how much the panel is moved from the left/right/center anchor point |
|
*/ |
|
Q_PROPERTY(int offset READ offset WRITE setOffset NOTIFY offsetChanged) |
|
|
|
/** |
|
* height of horizontal panels, width of vertical panels |
|
*/ |
|
Q_PROPERTY(int thickness READ thickness WRITE setThickness NOTIFY thicknessChanged) |
|
|
|
/** |
|
* width of horizontal panels, height of vertical panels |
|
*/ |
|
Q_PROPERTY(int length READ length WRITE setLength NOTIFY lengthChanged) |
|
|
|
/** |
|
* if the panel resizes itself, never resize more than that |
|
*/ |
|
Q_PROPERTY(int maximumLength READ maximumLength WRITE setMaximumLength NOTIFY maximumLengthChanged) |
|
|
|
/** |
|
* if the panel resizes itself, never resize less than that |
|
*/ |
|
Q_PROPERTY(int minimumLength READ minimumLength WRITE setMinimumLength NOTIFY minimumLengthChanged) |
|
|
|
/** |
|
* how much the panel is distant for the screen edge: used by the panel controller to drag it around |
|
*/ |
|
Q_PROPERTY(int distance READ distance WRITE setDistance NOTIFY distanceChanged) |
|
|
|
/** |
|
* support NoBackground in order to disable blur/contrast effects and remove |
|
* the panel shadows |
|
* @since 5.9 |
|
*/ |
|
Q_PROPERTY(Plasma::Types::BackgroundHints backgroundHints WRITE setBackgroundHints READ backgroundHints NOTIFY backgroundHintsChanged) |
|
|
|
/** |
|
* The borders that should have a shadow |
|
* @since 5.7 |
|
*/ |
|
Q_PROPERTY(Plasma::FrameSvg::EnabledBorders enabledBorders READ enabledBorders NOTIFY enabledBordersChanged) |
|
|
|
/** |
|
* information about the screen in which the panel is in |
|
*/ |
|
Q_PROPERTY(QScreen *screenToFollow READ screenToFollow WRITE setScreenToFollow NOTIFY screenToFollowChanged) |
|
|
|
/** |
|
* how the panel behaves, visible, autohide etc. |
|
*/ |
|
Q_PROPERTY(VisibilityMode visibilityMode READ visibilityMode WRITE setVisibilityMode NOTIFY visibilityModeChanged) |
|
|
|
/** |
|
* Property that determines how a panel's opacity behaves. |
|
* |
|
* @see OpacityMode |
|
*/ |
|
Q_PROPERTY(OpacityMode opacityMode READ opacityMode WRITE setOpacityMode NOTIFY opacityModeChanged) |
|
|
|
/** |
|
* Property that determines whether adaptive opacity is used. |
|
*/ |
|
Q_PROPERTY(bool adaptiveOpacityEnabled READ adaptiveOpacityEnabled NOTIFY adaptiveOpacityEnabledChanged) |
|
|
|
public: |
|
enum VisibilityMode { |
|
NormalPanel = 0, /** default, always visible panel, the windowmanager reserves a places for it */ |
|
AutoHide, /**the panel will be shownn only if the mouse cursor is on screen edges */ |
|
LetWindowsCover, /** always visible, windows will go over the panel, no area reserved */ |
|
WindowsGoBelow, /** always visible, windows will go under the panel, no area reserved */ |
|
}; |
|
Q_ENUM(VisibilityMode) |
|
|
|
/** Enumeration of possible opacity modes. */ |
|
enum OpacityMode { |
|
Adaptive = 0, /** The panel will change opacity depending on the presence of a maximized window */ |
|
Opaque, /** The panel will always be opaque */ |
|
Translucent /** The panel will always be translucent */ |
|
}; |
|
Q_ENUM(OpacityMode) |
|
|
|
explicit PanelView(ShellCorona *corona, QScreen *targetScreen = nullptr, QWindow *parent = nullptr); |
|
~PanelView() override; |
|
|
|
KConfigGroup config() const override; |
|
KConfigGroup configDefaults() const; |
|
|
|
Q_INVOKABLE QString fileFromPackage(const QString &key, const QString &fileName); |
|
Q_INVOKABLE void maximize(); |
|
|
|
Qt::Alignment alignment() const; |
|
void setAlignment(Qt::Alignment alignment); |
|
|
|
int offset() const; |
|
void setOffset(int offset); |
|
|
|
int thickness() const; |
|
void setThickness(int thickness); |
|
|
|
int length() const; |
|
void setLength(int value); |
|
|
|
int maximumLength() const; |
|
void setMaximumLength(int length); |
|
|
|
int minimumLength() const; |
|
void setMinimumLength(int length); |
|
|
|
int distance() const; |
|
void setDistance(int dist); |
|
|
|
Plasma::Types::BackgroundHints backgroundHints() const; |
|
void setBackgroundHints(Plasma::Types::BackgroundHints hint); |
|
|
|
Plasma::FrameSvg::EnabledBorders enabledBorders() const; |
|
|
|
VisibilityMode visibilityMode() const; |
|
void setVisibilityMode(PanelView::VisibilityMode mode); |
|
|
|
PanelView::OpacityMode opacityMode() const; |
|
bool adaptiveOpacityEnabled(); |
|
void setOpacityMode(PanelView::OpacityMode mode); |
|
void updateAdaptiveOpacityEnabled(); |
|
|
|
/** |
|
* @returns the geometry of the panel given a distance |
|
*/ |
|
QRect geometryByDistance(int distance) const; |
|
|
|
/* Both Shared with script/panel.cpp */ |
|
static KConfigGroup panelConfig(ShellCorona *corona, Plasma::Containment *containment, QScreen *screen); |
|
static KConfigGroup panelConfigDefaults(ShellCorona *corona, Plasma::Containment *containment, QScreen *screen); |
|
|
|
void updateStruts(); |
|
|
|
/*This is different from screen() as is always there, even if the window is |
|
temporarily outside the screen or if is hidden: only plasmashell will ever |
|
change this property, unlike QWindow::screen()*/ |
|
void setScreenToFollow(QScreen *screen); |
|
QScreen *screenToFollow() const; |
|
|
|
protected: |
|
void resizeEvent(QResizeEvent *ev) override; |
|
void showEvent(QShowEvent *event) override; |
|
void moveEvent(QMoveEvent *ev) override; |
|
bool event(QEvent *e) override; |
|
|
|
Q_SIGNALS: |
|
void alignmentChanged(); |
|
void offsetChanged(); |
|
void screenGeometryChanged(); |
|
void thicknessChanged(); |
|
void lengthChanged(); |
|
void maximumLengthChanged(); |
|
void minimumLengthChanged(); |
|
void distanceChanged(); |
|
void backgroundHintsChanged(); |
|
void enabledBordersChanged(); |
|
|
|
// QWindow does not have a property for screen. Adding this property requires re-implementing the signal |
|
void screenToFollowChanged(QScreen *screen); |
|
void visibilityModeChanged(); |
|
void opacityModeChanged(); |
|
void adaptiveOpacityEnabledChanged(); |
|
|
|
protected Q_SLOTS: |
|
/** |
|
* It will be called when the configuration is requested |
|
*/ |
|
void showConfigurationInterface(Plasma::Applet *applet) override; |
|
|
|
private Q_SLOTS: |
|
void positionPanel(); |
|
void restore(); |
|
void setAutoHideEnabled(bool autoHideEnabled); |
|
void showTemporarily(); |
|
void refreshContainment(); |
|
void refreshStatus(Plasma::Types::ItemStatus); |
|
void restoreAutoHide(); |
|
void screenDestroyed(QObject *screen); |
|
void adaptToScreen(); |
|
void handleQmlStatusChange(QQmlComponent::Status status); |
|
void updateMask(); |
|
void updateEnabledBorders(); |
|
void updatePadding(); |
|
|
|
private: |
|
int readConfigValueWithFallBack(const QString &key, int defaultValue); |
|
void resizePanel(); |
|
void integrateScreen(); |
|
bool containmentContainsPosition(const QPointF &point) const; |
|
QPointF positionAdjustedForContainment(const QPointF &point) const; |
|
void setupWaylandIntegration(); |
|
void visibilityModeToWayland(); |
|
bool edgeActivated() const; |
|
bool canSetStrut() const; |
|
|
|
int m_offset; |
|
int m_maxLength; |
|
int m_minLength; |
|
int m_contentLength; |
|
int m_distance; |
|
int m_thickness; |
|
int m_bottomPadding; |
|
int m_topPadding; |
|
int m_leftPadding; |
|
int m_rightPadding; |
|
bool m_initCompleted; |
|
bool m_containsMouse = false; |
|
bool m_fakeEventPending = false; |
|
Qt::Alignment m_alignment; |
|
QPointer<PlasmaQuick::ConfigView> m_panelConfigView; |
|
ShellCorona *m_corona; |
|
QTimer m_strutsTimer; |
|
VisibilityMode m_visibilityMode; |
|
OpacityMode m_opacityMode; |
|
Plasma::Theme m_theme; |
|
QTimer m_positionPaneltimer; |
|
QTimer m_unhideTimer; |
|
Plasma::Types::BackgroundHints m_backgroundHints; |
|
Plasma::FrameSvg::EnabledBorders m_enabledBorders = Plasma::FrameSvg::AllBorders; |
|
KWayland::Client::PlasmaShellSurface *m_shellSurface; |
|
QPointer<QScreen> m_lastScreen; |
|
QPointer<QScreen> m_screenToFollow; |
|
QMetaObject::Connection m_transientWindowVisibleWatcher; |
|
|
|
static const int STRUTSTIMERDELAY = 200; |
|
};
|
|
|