File indexing completed on 2024-05-12 05:32:15

0001 /*
0002     KWin - the KDE window manager
0003     This file is part of the KDE project.
0004 
0005     SPDX-FileCopyrightText: 2022 Marco Martin <mart@kde.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #pragma once
0011 
0012 #include "effect/globals.h"
0013 #include <kwin_export.h>
0014 #include <utils/common.h>
0015 
0016 #include <QObject>
0017 #include <QRectF>
0018 
0019 namespace KWin
0020 {
0021 
0022 class TileManager;
0023 class Window;
0024 
0025 class KWIN_EXPORT Tile : public QObject
0026 {
0027     Q_OBJECT
0028     Q_PROPERTY(QRectF relativeGeometry READ relativeGeometry WRITE setRelativeGeometry NOTIFY relativeGeometryChanged)
0029     Q_PROPERTY(QRectF absoluteGeometry READ absoluteGeometry NOTIFY absoluteGeometryChanged)
0030     Q_PROPERTY(QRectF absoluteGeometryInScreen READ absoluteGeometryInScreen NOTIFY absoluteGeometryChanged)
0031     Q_PROPERTY(qreal padding READ padding WRITE setPadding NOTIFY paddingChanged)
0032     Q_PROPERTY(int positionInLayout READ row NOTIFY rowChanged)
0033     Q_PROPERTY(Tile *parent READ parentTile CONSTANT)
0034     Q_PROPERTY(QList<KWin::Tile *> tiles READ childTiles NOTIFY childTilesChanged)
0035     Q_PROPERTY(QList<KWin::Window *> windows READ windows NOTIFY windowsChanged)
0036     Q_PROPERTY(bool isLayout READ isLayout NOTIFY isLayoutChanged)
0037     Q_PROPERTY(bool canBeRemoved READ canBeRemoved CONSTANT)
0038 
0039 public:
0040     enum class LayoutDirection {
0041         Floating = 0,
0042         Horizontal = 1,
0043         Vertical = 2
0044     };
0045     Q_ENUM(LayoutDirection)
0046 
0047     explicit Tile(TileManager *tiling, Tile *parentItem = nullptr);
0048     ~Tile();
0049 
0050     void setGeometryFromWindow(const QRectF &geom);
0051     void setGeometryFromAbsolute(const QRectF &geom);
0052     virtual void setRelativeGeometry(const QRectF &geom);
0053 
0054     virtual bool supportsResizeGravity(Gravity gravity);
0055 
0056     /**
0057      * Geometry of the tile in units between 0 and 1 relative to the screen geometry
0058      */
0059     QRectF relativeGeometry() const;
0060 
0061     /**
0062      * Geometry of the tile in absolute coordinates
0063      */
0064     QRectF absoluteGeometry() const;
0065 
0066     /**
0067      * Geometry of the tile in absolute coordinates, but in screen coordinates,
0068      * ie the top left corner of rootTile always at 0,0
0069      */
0070     QRectF absoluteGeometryInScreen() const;
0071 
0072     /**
0073      * Absolute geometry minus the padding and reserved areas such as panels
0074      */
0075     QRectF windowGeometry() const;
0076 
0077     /**
0078      * Absolute geometry minus the padding and reserved areas such as panels
0079      */
0080     QRectF maximizedWindowGeometry() const;
0081 
0082     bool isLayout() const;
0083     bool canBeRemoved() const;
0084 
0085     qreal padding() const;
0086     void setPadding(qreal padding);
0087 
0088     QuickTileMode quickTileMode() const;
0089     void setQuickTileMode(QuickTileMode mode);
0090 
0091     /**
0092      * All tiles directly children of this tile
0093      */
0094     QList<Tile *> childTiles() const;
0095 
0096     /**
0097      * All tiles descendant of this tile, recursive
0098      */
0099     QList<Tile *> descendants() const;
0100 
0101     /**
0102      * Visit all tiles descendant of this tile, recursive
0103      */
0104     void visitDescendants(std::function<void(const Tile *child)> callback) const;
0105 
0106     void resizeFromGravity(Gravity gravity, int x_root, int y_root);
0107 
0108     Q_INVOKABLE void resizeByPixels(qreal delta, Qt::Edge edge);
0109 
0110     void addWindow(Window *window);
0111     void removeWindow(Window *window);
0112     QList<KWin::Window *> windows() const;
0113 
0114     int row() const;
0115     int childCount() const;
0116     Tile *childTile(int row);
0117     Tile *nextSibling() const;
0118     Tile *previousSibling() const;
0119     Tile *parentTile() const;
0120     TileManager *manager() const;
0121 
0122     static inline QSizeF minimumSize()
0123     {
0124         return s_minimumSize;
0125     }
0126 
0127     void destroyChild(Tile *tile);
0128 
0129     template<class T>
0130     T *createChildAt(const QRectF &relativeGeometry, int position)
0131     {
0132         T *t = new T(m_tiling, static_cast<T *>(this));
0133         t->setRelativeGeometry(relativeGeometry);
0134         insertChild(position, t);
0135         return t;
0136     }
0137 
0138 Q_SIGNALS:
0139     void relativeGeometryChanged();
0140     void absoluteGeometryChanged();
0141     void windowGeometryChanged();
0142     void paddingChanged(qreal padding);
0143     void rowChanged(int row);
0144     void isLayoutChanged(bool isLayout);
0145     void childTilesChanged();
0146     void windowAdded(Window *window);
0147     void windowRemoved(Window *window);
0148     void windowsChanged();
0149 
0150 protected:
0151     void insertChild(int position, Tile *item);
0152     void removeChild(Tile *child);
0153 
0154 private:
0155     QList<Tile *> m_children;
0156     QList<Window *> m_windows;
0157     Tile *m_parentTile;
0158 
0159     TileManager *m_tiling;
0160     QRectF m_relativeGeometry;
0161     static QSizeF s_minimumSize;
0162     QuickTileMode m_quickTileMode = QuickTileFlag::None;
0163     qreal m_padding = 4.0;
0164 };
0165 
0166 } // namespace KWin