63a866d98c
This change makes the WindowItem track the opacity and schedule a repaint. It further decouples the legacy scene from code window abstractions. It's an API breaking change. WindowPaintData no longer can make windows more opaque. It only provides additional opacity factor.
149 lines
3.6 KiB
C++
149 lines
3.6 KiB
C++
/*
|
|
SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "kwineffects.h"
|
|
#include "kwinglobals.h"
|
|
|
|
#include <QMatrix4x4>
|
|
#include <QObject>
|
|
|
|
#include <optional>
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
class Output;
|
|
|
|
/**
|
|
* The Item class is the base class for items in the scene.
|
|
*/
|
|
class KWIN_EXPORT Item : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit Item(Item *parent = nullptr);
|
|
~Item() override;
|
|
|
|
qreal opacity() const;
|
|
void setOpacity(qreal opacity);
|
|
|
|
QPoint position() const;
|
|
void setPosition(const QPoint &point);
|
|
|
|
QSize size() const;
|
|
void setSize(const QSize &size);
|
|
|
|
int z() const;
|
|
void setZ(int z);
|
|
|
|
/**
|
|
* Returns the enclosing rectangle of the item. The rect equals QRect(0, 0, width(), height()).
|
|
*/
|
|
QRect rect() const;
|
|
/**
|
|
* Returns the enclosing rectangle of the item and all of its descendants.
|
|
*/
|
|
QRect boundingRect() const;
|
|
|
|
virtual QRegion shape() const;
|
|
virtual QRegion opaque() const;
|
|
|
|
/**
|
|
* Returns the visual parent of the item. Note that the visual parent differs from
|
|
* the QObject parent.
|
|
*/
|
|
Item *parentItem() const;
|
|
void setParentItem(Item *parent);
|
|
QList<Item *> childItems() const;
|
|
QList<Item *> sortedChildItems() const;
|
|
|
|
QPoint rootPosition() const;
|
|
|
|
QMatrix4x4 transform() const;
|
|
void setTransform(const QMatrix4x4 &transform);
|
|
|
|
/**
|
|
* Maps the given @a region from the item's coordinate system to the scene's coordinate
|
|
* system.
|
|
*/
|
|
QRegion mapToGlobal(const QRegion ®ion) const;
|
|
/**
|
|
* Maps the given @a rect from the item's coordinate system to the scene's coordinate
|
|
* system.
|
|
*/
|
|
QRect mapToGlobal(const QRect &rect) const;
|
|
|
|
/**
|
|
* Moves this item right before the specified @a sibling in the parent's children list.
|
|
*/
|
|
void stackBefore(Item *sibling);
|
|
/**
|
|
* Moves this item right after the specified @a sibling in the parent's children list.
|
|
*/
|
|
void stackAfter(Item *sibling);
|
|
|
|
bool explicitVisible() const;
|
|
bool isVisible() const;
|
|
void setVisible(bool visible);
|
|
|
|
void scheduleRepaint(const QRegion ®ion);
|
|
void scheduleFrame();
|
|
QRegion repaints(Output *output) const;
|
|
void resetRepaints(Output *output);
|
|
|
|
WindowQuadList quads() const;
|
|
virtual void preprocess();
|
|
|
|
Q_SIGNALS:
|
|
/**
|
|
* This signal is emitted when the position of this item has changed.
|
|
*/
|
|
void positionChanged();
|
|
/**
|
|
* This signal is emitted when the size of this item has changed.
|
|
*/
|
|
void sizeChanged();
|
|
|
|
/**
|
|
* This signal is emitted when the rectangle that encloses this item and all of its children
|
|
* has changed.
|
|
*/
|
|
void boundingRectChanged();
|
|
|
|
protected:
|
|
virtual WindowQuadList buildQuads() const;
|
|
void discardQuads();
|
|
|
|
private:
|
|
void addChild(Item *item);
|
|
void removeChild(Item *item);
|
|
void updateBoundingRect();
|
|
void scheduleRepaintInternal(const QRegion ®ion);
|
|
void markSortedChildItemsDirty();
|
|
|
|
bool computeEffectiveVisibility() const;
|
|
void updateEffectiveVisibility();
|
|
void removeRepaints(Output *output);
|
|
|
|
QPointer<Item> m_parentItem;
|
|
QList<Item *> m_childItems;
|
|
QMatrix4x4 m_transform;
|
|
QRect m_boundingRect;
|
|
QPoint m_position;
|
|
QSize m_size = QSize(0, 0);
|
|
qreal m_opacity = 1;
|
|
int m_z = 0;
|
|
bool m_explicitVisible = true;
|
|
bool m_effectiveVisible = true;
|
|
QMap<Output *, QRegion> m_repaints;
|
|
mutable std::optional<WindowQuadList> m_quads;
|
|
mutable std::optional<QList<Item *>> m_sortedChildItems;
|
|
};
|
|
|
|
} // namespace KWin
|