Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
TilingAlgorithm.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 fuddlesworth
2// SPDX-License-Identifier: LGPL-2.1-or-later
3
4#pragma once
5
6#include <phosphortiles_export.h>
7#include "AutotileConstants.h"
8// TilingParams, TilingScreenInfo, WindowInfo, buildWindowInfos and EdgeGaps used
9// to be declared inline in this header. They now live in TilingParams.h
10// (per-call parameter bundles + WindowInfo builder), included here so existing
11// callers that only include <PhosphorTiles/TilingAlgorithm.h> compile unchanged.
12#include "TilingParams.h"
13
14#include <QObject>
15#include <QRect>
16#include <QString>
17#include <QSize>
18#include <QVariant>
19#include <QVariantMap>
20#include <QVector>
21#include <functional>
22
23namespace PhosphorTiles {
24
25class TilingState;
26
50class PHOSPHORTILES_EXPORT TilingAlgorithm : public QObject
51{
52 Q_OBJECT
53
54 Q_PROPERTY(QString name READ name CONSTANT)
55 Q_PROPERTY(QString description READ description CONSTANT)
56 Q_PROPERTY(bool supportsMasterCount READ supportsMasterCount CONSTANT)
57 Q_PROPERTY(bool supportsSplitRatio READ supportsSplitRatio CONSTANT)
58
59public:
60 explicit TilingAlgorithm(QObject* parent = nullptr);
61 ~TilingAlgorithm() override = default;
62
63 // Prevent copying (QObject rule)
66
84 void setAppIdResolver(std::function<QString(const QString&)> resolver)
85 {
86 m_appIdResolver = std::move(resolver);
87 }
88
93 std::function<QString(const QString&)> appIdResolver() const
94 {
95 if (m_appIdResolver) {
96 return m_appIdResolver;
97 }
98 return [](const QString&) {
99 return QString();
100 };
101 }
102
112 QString registryId() const
113 {
114 return m_registryId;
115 }
118 void setRegistryId(const QString& id)
119 {
120 m_registryId = id;
121 }
122
127 virtual QString name() const = 0;
128
133 virtual QString description() const = 0;
134
148 virtual QVector<QRect> calculateZones(const TilingParams& params) const = 0;
149
158 virtual int masterZoneIndex() const;
159
167 virtual bool supportsMasterCount() const;
168
176 virtual bool supportsSplitRatio() const;
177
185 virtual qreal defaultSplitRatio() const;
186
195 virtual int minimumWindows() const;
196
206 virtual int defaultMaxWindows() const;
207
217 virtual bool producesOverlappingZones() const;
218
219 // ── noexcept convention for virtual methods ──────────────────────────
220 // Methods below are noexcept because they only read cached POD fields.
221 // Methods above (supportsMasterCount, supportsSplitRatio, etc.) are NOT
222 // noexcept because LuauTileAlgorithm overrides may allocate QStrings or
223 // marshal cached script values. When adding new virtuals, use noexcept only
224 // if the implementation is guaranteed to never allocate or throw.
225
234 virtual QString zoneNumberDisplay() const noexcept;
235
245 virtual bool centerLayout() const;
246
255 virtual bool isScripted() const noexcept;
256
266 virtual bool supportsMinSizes() const noexcept;
267
276 virtual bool supportsMemory() const noexcept;
277
290 virtual void prepareTilingState(TilingState* state) const;
291
301 virtual bool isUserScript() const noexcept;
302
303 // ── Lifecycle Hooks (optional, v2) ──────────────────────────────────
304
314 virtual bool supportsLifecycleHooks() const noexcept;
315
329 virtual void onWindowAdded(TilingState* state, int windowIndex);
330
349 virtual void onWindowRemoved(TilingState* state, int windowIndex);
350
360 virtual bool supportsResizeHook() const noexcept;
361
373 virtual void onWindowResized(TilingState* state, const ResizeEvent& resize);
374
384 virtual bool supportsScriptState() const noexcept;
385
386 // ── Custom Parameters (optional, v2) ──────────────────────────────────
387
396 virtual bool supportsCustomParams() const noexcept;
397
406 virtual QVariantList customParamDefList() const;
407
417 virtual bool hasCustomParam(const QString& name) const;
418
419protected:
420 // Resolver from instance id → live app class. Set by AutotileEngine via
421 // setAppIdResolver after constructing/looking up the algorithm. Default
422 // is an empty std::function; appIdResolver() returns a no-op lambda in
423 // that case so call sites can invoke it unconditionally.
424 std::function<QString(const QString&)> m_appIdResolver;
425
426 // Registry id — populated by AlgorithmRegistry at registration time so
427 // preview / serialisation code holding only a TilingAlgorithm* can
428 // recover the id without walking the registry.
429 QString m_registryId;
430
438 static QRect innerRect(const QRect& screenGeometry, int outerGap);
439
447 static QRect innerRect(const QRect& screenGeometry, const EdgeGaps& gaps);
448
449Q_SIGNALS:
456 void configurationChanged();
457};
458
459} // namespace PhosphorTiles
Algorithm-layer constants for the autotile/tile primitives.
Abstract base class for tiling algorithms.
Definition TilingAlgorithm.h:51
void setAppIdResolver(std::function< QString(const QString &)> resolver)
Inject a resolver that maps an opaque instance id to its live app class.
Definition TilingAlgorithm.h:84
virtual bool supportsSplitRatio() const
Check if algorithm supports split ratio adjustment.
TilingAlgorithm(const TilingAlgorithm &)=delete
virtual int minimumWindows() const
Get minimum number of windows for meaningful tiling.
TilingAlgorithm(QObject *parent=nullptr)
~TilingAlgorithm() override=default
virtual QVector< QRect > calculateZones(const TilingParams &params) const =0
Calculate zone geometries for N windows.
TilingAlgorithm & operator=(const TilingAlgorithm &)=delete
virtual qreal defaultSplitRatio() const
Get default split ratio for this algorithm.
QString registryId() const
The id this algorithm is registered under.
Definition TilingAlgorithm.h:112
void setRegistryId(const QString &id)
Registry-internal setter.
Definition TilingAlgorithm.h:118
virtual QString description() const =0
Description of the algorithm behavior.
virtual QString zoneNumberDisplay() const noexcept
How zone numbers should be displayed in previews.
virtual int defaultMaxWindows() const
Get default maximum number of windows for this algorithm.
virtual int masterZoneIndex() const
Get the index of the "master" zone (if applicable)
virtual bool producesOverlappingZones() const
Whether this algorithm intentionally produces overlapping zones.
virtual bool supportsMasterCount() const
Check if algorithm supports variable master count.
virtual QString name() const =0
Human-readable name of the algorithm.
std::function< QString(const QString &)> appIdResolver() const
Access the current resolver.
Definition TilingAlgorithm.h:93
Tracks tiling state for a single screen.
Definition TilingState.h:40
Definition AutotileEngine.h:46
Per-side edge gap values (resolved, non-negative pixel values)
Definition EdgeGaps.h:27
Describes an interactive resize that triggered a retile.
Definition TilingParams.h:51
Parameters for zone calculation.
Definition TilingParams.h:84