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, EdgeGaps and
9// the static helper structs (ThreeColumnWidths, CumulativeMinDims) used to be
10// declared inline in this header. They have moved to dedicated headers to
11// keep responsibilities split:
12// - TilingParams.h — per-call parameter bundles + WindowInfo builder
13// - TilingAlgorithmHelpers.h — POD helper result types
14// Both are included here so existing callers that only include
15// <PhosphorTiles/TilingAlgorithm.h> continue to compile unchanged.
17#include "TilingParams.h"
18
19#include <QObject>
20#include <QRect>
21#include <QString>
22#include <QSize>
23#include <QVariant>
24#include <QVariantMap>
25#include <QVector>
26#include <functional>
27
28namespace PhosphorTiles {
29
30class TilingState;
31
55class PHOSPHORTILES_EXPORT TilingAlgorithm : public QObject
56{
57 Q_OBJECT
58
59 Q_PROPERTY(QString name READ name CONSTANT)
60 Q_PROPERTY(QString description READ description CONSTANT)
61 Q_PROPERTY(bool supportsMasterCount READ supportsMasterCount CONSTANT)
62 Q_PROPERTY(bool supportsSplitRatio READ supportsSplitRatio CONSTANT)
63
64public:
65 explicit TilingAlgorithm(QObject* parent = nullptr);
66 ~TilingAlgorithm() override = default;
67
68 // Prevent copying (QObject rule)
71
89 void setAppIdResolver(std::function<QString(const QString&)> resolver)
90 {
91 m_appIdResolver = std::move(resolver);
92 }
93
98 std::function<QString(const QString&)> appIdResolver() const
99 {
100 if (m_appIdResolver) {
101 return m_appIdResolver;
102 }
103 return [](const QString&) {
104 return QString();
105 };
106 }
107
117 QString registryId() const
118 {
119 return m_registryId;
120 }
123 void setRegistryId(const QString& id)
124 {
125 m_registryId = id;
126 }
127
132 virtual QString name() const = 0;
133
138 virtual QString description() const = 0;
139
153 virtual QVector<QRect> calculateZones(const TilingParams& params) const = 0;
154
163 virtual int masterZoneIndex() const;
164
172 virtual bool supportsMasterCount() const;
173
181 virtual bool supportsSplitRatio() const;
182
190 virtual qreal defaultSplitRatio() const;
191
200 virtual int minimumWindows() const;
201
211 virtual int defaultMaxWindows() const;
212
222 virtual bool producesOverlappingZones() const;
223
224 // ── noexcept convention for virtual methods ──────────────────────────
225 // Methods below are noexcept because they only read cached POD fields.
226 // Methods above (supportsMasterCount, supportsSplitRatio, etc.) are NOT
227 // noexcept because ScriptedAlgorithm overrides may allocate QStrings or
228 // invoke cached JS values. When adding new virtuals, use noexcept only
229 // if the implementation is guaranteed to never allocate or throw.
230
239 virtual QString zoneNumberDisplay() const noexcept;
240
250 virtual bool centerLayout() const;
251
260 virtual bool isScripted() const noexcept;
261
271 virtual bool supportsMinSizes() const noexcept;
272
281 virtual bool supportsMemory() const noexcept;
282
295 virtual void prepareTilingState(TilingState* state) const;
296
306 virtual bool isUserScript() const noexcept;
307
308 // ── Lifecycle Hooks (optional, v2) ──────────────────────────────────
309
319 virtual bool supportsLifecycleHooks() const noexcept;
320
334 virtual void onWindowAdded(TilingState* state, int windowIndex);
335
354 virtual void onWindowRemoved(TilingState* state, int windowIndex);
355
356 // ── Custom Parameters (optional, v2) ──────────────────────────────────
357
366 virtual bool supportsCustomParams() const noexcept;
367
376 virtual QVariantList customParamDefList() const;
377
387 virtual bool hasCustomParam(const QString& name) const;
388
389protected:
390 // Resolver from instance id → live app class. Set by AutotileEngine via
391 // setAppIdResolver after constructing/looking up the algorithm. Default
392 // is an empty std::function; appIdResolver() returns a no-op lambda in
393 // that case so call sites can invoke it unconditionally.
394 std::function<QString(const QString&)> m_appIdResolver;
395
396 // Registry id — populated by AlgorithmRegistry at registration time so
397 // preview / serialisation code holding only a TilingAlgorithm* can
398 // recover the id without walking the registry.
399 QString m_registryId;
400
413 static QVector<int> distributeEvenly(int total, int count);
414
422 static QRect innerRect(const QRect& screenGeometry, int outerGap);
423
431 static QRect innerRect(const QRect& screenGeometry, const EdgeGaps& gaps);
432
444 static QVector<int> distributeWithGaps(int total, int count, int gap);
445
460 static QVector<int> distributeWithMinSizes(int total, int count, int gap, const QVector<int>& minDims);
461
466 static int minWidthAt(const QVector<QSize>& minSizes, int index);
467
472 static int minHeightAt(const QVector<QSize>& minSizes, int index);
473
486 static void solveTwoPartMinSizes(int contentDim, int& firstDim, int& secondDim, int minFirst, int minSecond);
487
499 static void applyPerWindowMinSize(int& width, int& height, const QVector<QSize>& minSizes, int index);
500
509
526 static ThreeColumnWidths solveThreeColumnWidths(int areaX, int contentWidth, int innerGap, qreal splitRatio,
527 int minLeftWidth, int minCenterWidth, int minRightWidth);
528
537
545 static CumulativeMinDims computeAlternatingCumulativeMinDims(int windowCount, const QVector<QSize>& minSizes,
546 int innerGap);
547
554 static void appendGracefulDegradation(QVector<QRect>& zones, const QRect& remaining, int leftover, int innerGap);
555
562 static qreal clampOrProportionalFallback(qreal ratio, qreal minFirstRatio, qreal maxFirstRatio, int firstDim,
563 int secondDim);
564
565Q_SIGNALS:
572 void configurationChanged();
573};
574
575} // namespace PhosphorTiles
Algorithm-layer constants for the autotile/tile primitives.
Abstract base class for tiling algorithms.
Definition TilingAlgorithm.h:56
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:89
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:117
void setRegistryId(const QString &id)
Registry-internal setter.
Definition TilingAlgorithm.h:123
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:98
Tracks tiling state for a single screen.
Definition TilingState.h:40
Definition AutotileEngine.h:71
Per-side edge gap values (resolved, non-negative pixel values)
Definition EdgeGaps.h:27
Result of precomputing cumulative min dimensions for alternating V/H splits.
Definition TilingAlgorithmHelpers.h:42
Result of solving three-column width distribution.
Definition TilingAlgorithmHelpers.h:22
Parameters for zone calculation.
Definition TilingParams.h:61