File indexing completed on 2025-01-12 13:31:30
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 <kwin_export.h> 0013 #include <kwinglobals.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