bcd9f1e958
Our logical co-ordinates for shape can be floating. The shape is used to determine final vertices on screen. The commit appears to introduce some new loops but they're mostly what QRegion would be doing internally so it shouldn't impact performance. For most cases we just have a single rectangle in our shape anyway. opaqueRegion is unchanged for now.
156 lines
3.9 KiB
C++
156 lines
3.9 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 <QVector>
|
|
|
|
#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);
|
|
|
|
QPointF position() const;
|
|
void setPosition(const QPointF &point);
|
|
|
|
QSizeF size() const;
|
|
void setSize(const QSizeF &size);
|
|
|
|
int z() const;
|
|
void setZ(int z);
|
|
|
|
/**
|
|
* Returns the enclosing rectangle of the item. The rect equals QRect(0, 0, width(), height()).
|
|
*/
|
|
QRectF rect() const;
|
|
/**
|
|
* Returns the enclosing rectangle of the item and all of its descendants.
|
|
*/
|
|
QRectF boundingRect() const;
|
|
|
|
virtual QVector<QRectF> 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;
|
|
|
|
QPointF 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.
|
|
*/
|
|
QRectF mapToGlobal(const QRectF &rect) const;
|
|
/**
|
|
* Maps the given @a rect from the scene's coordinate system to the item's coordinate
|
|
* system.
|
|
*/
|
|
QRectF mapFromGlobal(const QRectF &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 QRectF ®ion);
|
|
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;
|
|
QRectF m_boundingRect;
|
|
QPointF m_position;
|
|
QSizeF 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
|