KWin
Loading...
Searching...
No Matches
quicktile.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2022 Marco Martin <mart@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#include "quicktile.h"
11
12namespace KWin
13{
14
16 : Tile(tiling, parentItem)
17{
18 setPadding(0.0);
19 setRelativeGeometry(QRectF(0, 0, 1, 1));
21
22 auto createTile = [this, &tiling](const QRectF &geometry, QuickTileMode tileMode) {
23 Tile *tile = new Tile(tiling, this);
24 tile->setPadding(0.0);
25 tile->setQuickTileMode(tileMode);
26 tile->setRelativeGeometry(geometry);
27
28 connect(tile, &Tile::relativeGeometryChanged, this, [this, tile]() {
29 relayoutToFit(tile);
30 });
31
32 return std::unique_ptr<Tile>(tile);
33 };
34
35 m_leftVerticalTile = createTile(QRectF(0, 0, 0.5, 1), QuickTileFlag::Left);
36 m_rightVerticalTile = createTile(QRectF(0.5, 0, 0.5, 1), QuickTileFlag::Right);
37 m_topHorizontalTile = createTile(QRectF(0, 0, 1, 0.5), QuickTileFlag::Top);
38 m_bottomHorizontalTile = createTile(QRectF(0, 0.5, 1, 0.5), QuickTileFlag::Bottom);
39
40 m_topLeftTile = createTile(QRectF(0, 0, 0.5, 0.5), QuickTileFlag::Top | QuickTileFlag::Left);
41 m_topRightTile = createTile(QRectF(0.5, 0, 0.5, 0.5), QuickTileFlag::Top | QuickTileFlag::Right);
42 m_bottomLeftTile = createTile(QRectF(0, 0.5, 0.5, 0.5), QuickTileFlag::Bottom | QuickTileFlag::Left);
43 m_bottomRightTile = createTile(QRectF(0.5, 0.5, 0.5, 0.5), QuickTileFlag::Bottom | QuickTileFlag::Right);
44}
45
49
50void QuickRootTile::relayoutToFit(Tile *tile)
51{
52 if (m_resizedTile) {
53 return;
54 }
55
56 m_resizedTile = tile;
57
58 const QRectF geometry = tile->relativeGeometry();
59
60 if (m_topHorizontalTile.get() == tile) {
61 setVerticalSplit(geometry.bottom());
62 } else if (m_bottomHorizontalTile.get() == tile) {
63 setVerticalSplit(geometry.top());
64 } else if (m_leftVerticalTile.get() == tile) {
65 setHorizontalSplit(geometry.right());
66 } else if (m_rightVerticalTile.get() == tile) {
67 setHorizontalSplit(geometry.left());
68 } else if (m_topLeftTile.get() == tile) {
69 setHorizontalSplit(geometry.right());
70 setVerticalSplit(geometry.bottom());
71 } else if (m_topRightTile.get() == tile) {
72 setHorizontalSplit(geometry.left());
73 setVerticalSplit(geometry.bottom());
74 } else if (m_bottomRightTile.get() == tile) {
75 setHorizontalSplit(geometry.left());
76 setVerticalSplit(geometry.top());
77 } else if (m_bottomLeftTile.get() == tile) {
78 setHorizontalSplit(geometry.right());
79 setVerticalSplit(geometry.top());
80 }
81
82 m_resizedTile = nullptr;
83}
84
85Tile *QuickRootTile::tileForMode(QuickTileMode mode)
86{
87 switch (mode) {
88 case QuickTileMode(QuickTileFlag::Left):
89 return m_leftVerticalTile.get();
90 case QuickTileMode(QuickTileFlag::Right):
91 return m_rightVerticalTile.get();
92 case QuickTileMode(QuickTileFlag::Top):
93 return m_topHorizontalTile.get();
94 case QuickTileMode(QuickTileFlag::Bottom):
95 return m_bottomHorizontalTile.get();
96 case QuickTileMode(QuickTileFlag::Left | QuickTileFlag::Top):
97 return m_topLeftTile.get();
98 case QuickTileMode(QuickTileFlag::Right | QuickTileFlag::Top):
99 return m_topRightTile.get();
100 case QuickTileMode(QuickTileFlag::Left | QuickTileFlag::Bottom):
101 return m_bottomLeftTile.get();
102 case QuickTileMode(QuickTileFlag::Right | QuickTileFlag::Bottom):
103 return m_bottomRightTile.get();
104 case QuickTileMode(QuickTileFlag::Maximize):
105 case QuickTileMode(QuickTileFlag::Horizontal):
106 case QuickTileMode(QuickTileFlag::Vertical):
107 return this;
108 default:
109 return nullptr;
110 }
111}
112
114{
115 switch (border) {
116 case ElectricTop:
117 return m_topHorizontalTile.get();
118 case ElectricTopRight:
119 return m_topRightTile.get();
120 case ElectricRight:
121 return m_rightVerticalTile.get();
123 return m_bottomRightTile.get();
124 case ElectricBottom:
125 return m_bottomHorizontalTile.get();
127 return m_bottomLeftTile.get();
128 case ElectricLeft:
129 return m_leftVerticalTile.get();
130 case ElectricTopLeft:
131 return m_topLeftTile.get();
132 case ElectricNone:
133 default:
134 return nullptr;
135 }
136}
137
139{
140 return m_leftVerticalTile->relativeGeometry().right();
141}
142
144{
145 const QSizeF minSize = minimumSize(); // minimum size is the same for all tiles
146 const qreal effectiveSplit = std::clamp(split, minSize.width(), 1.0 - minSize.width());
147
148 auto geom = m_leftVerticalTile->relativeGeometry();
149 geom.setRight(effectiveSplit);
150 m_leftVerticalTile->setRelativeGeometry(geom);
151
152 geom = m_rightVerticalTile->relativeGeometry();
153 geom.setLeft(effectiveSplit);
154 m_rightVerticalTile->setRelativeGeometry(geom);
155
156 geom = m_topLeftTile->relativeGeometry();
157 geom.setRight(effectiveSplit);
158 m_topLeftTile->setRelativeGeometry(geom);
159
160 geom = m_topRightTile->relativeGeometry();
161 geom.setLeft(effectiveSplit);
162 m_topRightTile->setRelativeGeometry(geom);
163
164 geom = m_bottomLeftTile->relativeGeometry();
165 geom.setRight(effectiveSplit);
166 m_bottomLeftTile->setRelativeGeometry(geom);
167
168 geom = m_bottomRightTile->relativeGeometry();
169 geom.setLeft(effectiveSplit);
170 m_bottomRightTile->setRelativeGeometry(geom);
171}
172
174{
175 return m_topHorizontalTile->relativeGeometry().bottom();
176}
177
179{
180 const QSizeF minSize = minimumSize(); // minimum size is the same for all tiles
181 const qreal effectiveSplit = std::clamp(split, minSize.height(), 1.0 - minSize.height());
182
183 auto geom = m_topHorizontalTile->relativeGeometry();
184 geom.setBottom(effectiveSplit);
185 m_topHorizontalTile->setRelativeGeometry(geom);
186
187 geom = m_bottomHorizontalTile->relativeGeometry();
188 geom.setTop(effectiveSplit);
189 m_bottomHorizontalTile->setRelativeGeometry(geom);
190
191 geom = m_topLeftTile->relativeGeometry();
192 geom.setBottom(effectiveSplit);
193 m_topLeftTile->setRelativeGeometry(geom);
194
195 geom = m_topRightTile->relativeGeometry();
196 geom.setBottom(effectiveSplit);
197 m_topRightTile->setRelativeGeometry(geom);
198
199 geom = m_bottomLeftTile->relativeGeometry();
200 geom.setTop(effectiveSplit);
201 m_bottomLeftTile->setRelativeGeometry(geom);
202
203 geom = m_bottomRightTile->relativeGeometry();
204 geom.setTop(effectiveSplit);
205 m_bottomRightTile->setRelativeGeometry(geom);
206}
207
208} // namespace KWin
209
210#include "moc_quicktile.cpp"
qreal verticalSplit() const
void setHorizontalSplit(qreal split)
Tile * tileForBorder(ElectricBorder border)
qreal horizontalSplit() const
void setVerticalSplit(qreal split)
Tile * tileForMode(QuickTileMode mode)
Definition quicktile.cpp:85
QuickRootTile(TileManager *tiling, Tile *parentItem=nullptr)
Definition quicktile.cpp:15
static QSizeF minimumSize()
Definition tile.h:122
void setQuickTileMode(QuickTileMode mode)
Definition tile.cpp:200
void relativeGeometryChanged()
Tile(TileManager *tiling, Tile *parentItem=nullptr)
Definition tile.cpp:24
virtual void setRelativeGeometry(const QRectF &geom)
Definition tile.cpp:95
QRectF relativeGeometry
Definition tile.h:28
void setPadding(qreal padding)
Definition tile.cpp:176
ElectricBorder
Definition globals.h:60
@ ElectricNone
Definition globals.h:70
@ ElectricTopLeft
Definition globals.h:68
@ ElectricBottomLeft
Definition globals.h:66
@ ElectricBottom
Definition globals.h:65
@ ElectricTopRight
Definition globals.h:62
@ ElectricTop
Definition globals.h:61
@ ElectricRight
Definition globals.h:63
@ ElectricBottomRight
Definition globals.h:64
@ ElectricLeft
Definition globals.h:67