3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-16 04:05:53 +00:00
2022-03-05 22:41:29 +05:00

267 lines
8.5 KiB
C++

/*
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;
void keyPressEvent(QKeyEvent *event) 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;
};