Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
IZoneLayoutRegistry.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// IZoneLayoutRegistry - enumeration + mutation of the catalog of
7// manual zone layouts.
8//
9// Split out of ILayoutManager so callers that need the layout set
10// (editor save path, layout-import flow, settings create-layout
11// button, read-only preview renderers) can depend on one contract
12// instead of the full manager. "Active layout" selection lives here
13// because it mutates the manager's active-layout slot.
14//
15// Inherits PhosphorLayout::ILayoutSourceRegistry so concrete registries
16// (LayoutManager) carry the unified `contentsChanged` signal that
17// ZonesLayoutSource subscribes to - matching the pattern every other
18// provider library (phosphor-tiles, future phosphor-scrolling, …)
19// follows. Inheriting QObject via the unified base rather than
20// directly keeps ILayoutManager's non-virtual multi-inheritance safe:
21// every path through ILayoutManager reaches QObject exactly once, so
22// LayoutManager has a single QObject subobject.
23
24#include <phosphorzones_export.h>
25
29
30#include <QJsonObject>
31#include <QString>
32#include <QUuid>
33#include <QVector>
34
35namespace PhosphorZones {
36
45{
46 Q_OBJECT
47
48 // Live in the interface so QML-bound consumers can target the contract
49 // without depending on the concrete @ref LayoutRegistry. moc's NOTIFY
50 // check resolves the signal in the same class scope it sees the READ
51 // method, so the property + the signal must travel together.
52 Q_PROPERTY(Layout* activeLayout READ activeLayout NOTIFY activeLayoutChanged)
53
54public:
55 explicit IZoneLayoutRegistry(QObject* parent = nullptr);
57
61 virtual QVector<Layout*> layouts() const = 0;
62
63 virtual int layoutCount() const = 0;
64 virtual Layout* layout(int index) const = 0;
65 virtual Layout* layoutByName(const QString& name) const = 0;
66
69 virtual Layout* layoutById(const QUuid& id) const = 0;
70
73 virtual void addLayout(Layout* layout) = 0;
79 virtual void removeLayout(Layout* layout) = 0;
80 virtual void removeLayoutById(const QUuid& id) = 0;
85 virtual Layout* duplicateLayout(Layout* source) = 0;
86
87 // Active layout (internal - used for resnap / geometry / overlay
88 // machinery). Borrowed pointer owned by the registry.
89 virtual Layout* activeLayout() const = 0;
90 virtual void setActiveLayout(Layout* layout) = 0;
91 virtual void setActiveLayoutById(const QUuid& id) = 0;
92
93 // ─── Per-screen layout resolution (cascade-aware) ─────────────────────
94 //
95 // These queries resolve a layout for a (screen, desktop, activity)
96 // context by walking the assignment cascade and falling back to the
97 // global default. Overlay/geometry/animation consumers depend on this
98 // shape, so it lives on the interface - callers can target the
99 // contract without depending on the concrete @c LayoutRegistry.
100
103 virtual Layout* layoutForScreen(const QString& screenId, int virtualDesktop = 0,
104 const QString& activity = QString()) const = 0;
105
108 virtual Layout* resolveLayoutForScreen(const QString& screenId) const = 0;
109
112 virtual QString assignmentIdForScreen(const QString& screenId, int virtualDesktop = 0,
113 const QString& activity = QString()) const = 0;
114
116 virtual Layout* defaultLayout() const = 0;
117
118 // ─── Session context (current desktop / activity) ─────────────────────
119 //
120 // The registry holds session-context state because per-context
121 // assignment resolution needs it. Consumers that drive context-aware
122 // queries (overlay re-layout on desktop switch, autotile re-run on
123 // activity change) read it through the interface.
124
125 virtual int currentVirtualDesktop() const = 0;
129 virtual int currentVirtualDesktopForScreen(const QString& screenId) const
130 {
131 Q_UNUSED(screenId)
132 return currentVirtualDesktop();
133 }
134 virtual QString currentActivity() const = 0;
135
141 virtual QJsonObject loadAutotileOverrides(const QString& algorithmId) const
142 {
143 Q_UNUSED(algorithmId)
144 return {};
145 }
146
153 virtual QString tilingAlgorithmForScreen(const QString& screenId, int virtualDesktop = 0,
154 const QString& activity = QString()) const
155 {
156 Q_UNUSED(screenId)
157 Q_UNUSED(virtualDesktop)
158 Q_UNUSED(activity)
159 return {};
160 }
161
170 virtual ContextGapOverride resolveContextGaps(const QString& screenId, int virtualDesktop,
171 const QString& activity) const
172 {
173 Q_UNUSED(screenId);
174 Q_UNUSED(virtualDesktop);
175 Q_UNUSED(activity);
176 return {};
177 }
178
188 virtual bool resolveContextLocked(const QString& screenId, int virtualDesktop, const QString& activity) const
189 {
190 Q_UNUSED(screenId);
191 Q_UNUSED(virtualDesktop);
192 Q_UNUSED(activity);
193 return false;
194 }
195
203 virtual bool isContextActiveLayoutSuppressed(const QString& screenId, int virtualDesktop,
204 const QString& activity) const
205 {
206 Q_UNUSED(screenId);
207 Q_UNUSED(virtualDesktop);
208 Q_UNUSED(activity);
209 return false;
210 }
211
220 virtual ContextOverlayOverride resolveContextOverlay(const QString& screenId, int virtualDesktop,
221 const QString& activity) const
222 {
223 Q_UNUSED(screenId);
224 Q_UNUSED(virtualDesktop);
225 Q_UNUSED(activity);
226 return {};
227 }
228
229Q_SIGNALS:
230 // Catalog mutation. @c addLayout / @c duplicateLayout fire `layoutAdded`;
231 // @c removeLayout / @c removeLayoutById fire `layoutRemoved`.
232 void layoutAdded(Layout* layout);
233 void layoutRemoved(Layout* layout);
234
235 // Active-layout selection. Fires from @c setActiveLayout /
236 // @c setActiveLayoutById only when the active-layout pointer actually
237 // changes (concrete implementer guards with an equality check -
238 // matches the project rule "only emit signals when value actually
239 // changes").
241
242 // Assignment churn. Fires when a (screenId, virtualDesktop)
243 // assignment changes; activity context is intentionally omitted
244 // from the signal - consumers that care about activity-keyed
245 // assignments re-query via @c layoutForScreen with their current
246 // activity. Concrete impl emits only on actual change (matches the
247 // project "emit only when value changes" rule).
248 void layoutAssigned(const QString& screenId, int virtualDesktop, Layout* layout);
249};
250
251} // namespace PhosphorZones
Abstract notifier surface for every registry that feeds an ILayoutSource.
Definition ILayoutSourceRegistry.h:37
Enumeration + mutation surface for the in-memory zone-layout catalog.
Definition IZoneLayoutRegistry.h:45
virtual Layout * layout(int index) const =0
virtual Layout * layoutById(const QUuid &id) const =0
Resolve a layout by its stable UUID.
void layoutRemoved(Layout *layout)
virtual Layout * layoutForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const =0
Cascade-resolve the manual layout for screenId.
virtual QString assignmentIdForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const =0
Raw assignment id (manual-layout UUID or "autotile:<algorithmId>") for screenId, with cascade + level...
virtual bool isContextActiveLayoutSuppressed(const QString &screenId, int virtualDesktop, const QString &activity) const
True iff the (screenId, virtualDesktop, activity) context has no active layout specifically because t...
Definition IZoneLayoutRegistry.h:203
virtual int currentVirtualDesktopForScreen(const QString &screenId) const
This screen's current virtual desktop (Plasma 6.7 per-output virtual desktops, #648).
Definition IZoneLayoutRegistry.h:129
void layoutAdded(Layout *layout)
virtual Layout * activeLayout() const =0
virtual QVector< Layout * > layouts() const =0
Enumerate every known layout.
IZoneLayoutRegistry(QObject *parent=nullptr)
virtual bool resolveContextLocked(const QString &screenId, int virtualDesktop, const QString &activity) const
Resolve whether window rules lock the active layout for the (screenId, virtualDesktop,...
Definition IZoneLayoutRegistry.h:188
virtual Layout * layoutByName(const QString &name) const =0
virtual Layout * defaultLayout() const =0
Effective global default layout (snap-only fallback).
virtual QString currentActivity() const =0
virtual void addLayout(Layout *layout)=0
virtual void setActiveLayoutById(const QUuid &id)=0
void activeLayoutChanged(Layout *layout)
virtual void removeLayoutById(const QUuid &id)=0
virtual void setActiveLayout(Layout *layout)=0
void layoutAssigned(const QString &screenId, int virtualDesktop, Layout *layout)
virtual void removeLayout(Layout *layout)=0
virtual Layout * resolveLayoutForScreen(const QString &screenId) const =0
Convenience: resolve a layout using the registry's current (desktop, activity) context.
virtual ContextOverlayOverride resolveContextOverlay(const QString &screenId, int virtualDesktop, const QString &activity) const
Resolve the per-context overlay-property override for the (screenId, virtualDesktop,...
Definition IZoneLayoutRegistry.h:220
virtual int currentVirtualDesktop() const =0
virtual Layout * duplicateLayout(Layout *source)=0
virtual QJsonObject loadAutotileOverrides(const QString &algorithmId) const
Per-algorithm autotile settings (gaps, shader, hiddenFromSelector, …) stored in the unified layout-se...
Definition IZoneLayoutRegistry.h:141
virtual QString tilingAlgorithmForScreen(const QString &screenId, int virtualDesktop=0, const QString &activity=QString()) const
Raw id of the tiling algorithm active for the (screenId, virtualDesktop, activity) context,...
Definition IZoneLayoutRegistry.h:153
virtual int layoutCount() const =0
virtual ContextGapOverride resolveContextGaps(const QString &screenId, int virtualDesktop, const QString &activity) const
Resolve the per-context gap override (zone padding + outer gaps) that window rules pin for the (scree...
Definition IZoneLayoutRegistry.h:170
Represents a collection of zones that form a layout.
Definition Layout.h:40
Definition IWindowTrackingService.h:23
Per-context gap override resolved from window rules.
Definition AssignmentEntry.h:188
Per-context overlay-property overrides resolved from window-rule actions.
Definition AssignmentEntry.h:220