aboutsummaryrefslogtreecommitdiffstats
path: root/config/quickshell/qs-hyprview-unified/layouts/SpiralLayout.qml
diff options
context:
space:
mode:
authorDon Williams <don.e.williams@gmail.com>2026-07-13 16:11:51 -0400
committerPinapelz <yukais@pinapelz.com>2026-08-29 21:40:34 -0700
commitdcc2b56bd34846c5e8562bdb33ea63f3734d5ec0 (patch)
treebb4dcab06f4a4f2f690fc87e9fc82d335cd21497 /config/quickshell/qs-hyprview-unified/layouts/SpiralLayout.qml
parent292b6daf5c56ff60a6263ff4945e74e5ca4372e7 (diff)
Fixed qs-hyprview to work with trixie+
Signed-off-by: Don Williams <don.e.williams@gmail.com> On branch development Your branch is up to date with 'origin/development'. Changes to be committed: renamed: qs-hyprview-trixie/LICENSE -> qs-hyprview-unified/LICENSE renamed: qs-hyprview-trixie/README.md -> qs-hyprview-unified/README.md renamed: qs-hyprview-trixie/common/Appearance.qml -> qs-hyprview-unified/common/Appearance.qml renamed: qs-hyprview-trixie/layouts/BandsLayout.qml -> qs-hyprview-unified/layouts/BandsLayout.qml renamed: qs-hyprview-trixie/layouts/ColumnarLayout.qml -> qs-hyprview-unified/layouts/ColumnarLayout.qml renamed: qs-hyprview-trixie/layouts/HeroLayout.qml -> qs-hyprview-unified/layouts/HeroLayout.qml renamed: qs-hyprview-trixie/layouts/JustifiedLayout.qml -> qs-hyprview-unified/layouts/JustifiedLayout.qml renamed: qs-hyprview-trixie/layouts/LayoutsManager.qml -> qs-hyprview-unified/layouts/LayoutsManager.qml renamed: qs-hyprview-trixie/layouts/MasonryLayout.qml -> qs-hyprview-unified/layouts/MasonryLayout.qml renamed: qs-hyprview-trixie/layouts/SatelliteLayout.qml -> qs-hyprview-unified/layouts/SatelliteLayout.qml renamed: qs-hyprview-trixie/layouts/SmartGridLayout.qml -> qs-hyprview-unified/layouts/SmartGridLayout.qml renamed: qs-hyprview-trixie/layouts/SpiralLayout.qml -> qs-hyprview-unified/layouts/SpiralLayout.qml renamed: qs-hyprview-trixie/layouts/StarggeredLayout.qml -> qs-hyprview-unified/layouts/StarggeredLayout.qml renamed: qs-hyprview-trixie/layouts/VortexLayout.qml -> qs-hyprview-unified/layouts/VortexLayout.qml renamed: qs-hyprview-trixie/layouts/qmldir -> qs-hyprview-unified/layouts/qmldir renamed: qs-hyprview-trixie/modules/Hyprview.qml -> qs-hyprview-unified/modules/Hyprview.qml renamed: qs-hyprview-trixie/modules/SearchBox.qml -> qs-hyprview-unified/modules/SearchBox.qml renamed: qs-hyprview-trixie/modules/WindowThumbnail.qml -> qs-hyprview-unified/modules/WindowThumbnail.qml renamed: qs-hyprview-trixie/modules/qmldir -> qs-hyprview-unified/modules/qmldir renamed: qs-hyprview-trixie/qs-hyprview-template.qml -> qs-hyprview-unified/qs-hyprview-template.qml renamed: qs-hyprview-trixie/screenshots/bands.jpeg -> qs-hyprview-unified/screenshots/bands.jpeg renamed: qs-hyprview-trixie/screenshots/hero.jpeg -> qs-hyprview-unified/screenshots/hero.jpeg renamed: qs-hyprview-trixie/screenshots/masonry.jpeg -> qs-hyprview-unified/screenshots/masonry.jpeg renamed: qs-hyprview-trixie/screenshots/satellite.jpeg -> qs-hyprview-unified/screenshots/satellite.jpeg renamed: qs-hyprview-trixie/screenshots/smartgrid.jpeg -> qs-hyprview-unified/screenshots/smartgrid.jpeg renamed: qs-hyprview-trixie/screenshots/spiral.jpeg -> qs-hyprview-unified/screenshots/spiral.jpeg renamed: qs-hyprview-trixie/screenshots/staggered.jpeg -> qs-hyprview-unified/screenshots/staggered.jpeg renamed: qs-hyprview-trixie/screenshots/vortex.jpeg -> qs-hyprview-unified/screenshots/vortex.jpeg renamed: qs-hyprview-trixie/shell.qml -> qs-hyprview-unified/shell.qml
Diffstat (limited to 'config/quickshell/qs-hyprview-unified/layouts/SpiralLayout.qml')
-rw-r--r--config/quickshell/qs-hyprview-unified/layouts/SpiralLayout.qml155
1 files changed, 155 insertions, 0 deletions
diff --git a/config/quickshell/qs-hyprview-unified/layouts/SpiralLayout.qml b/config/quickshell/qs-hyprview-unified/layouts/SpiralLayout.qml
new file mode 100644
index 00000000..bcfc7abb
--- /dev/null
+++ b/config/quickshell/qs-hyprview-unified/layouts/SpiralLayout.qml
@@ -0,0 +1,155 @@
+pragma Singleton
+import Quickshell
+import Quickshell.Hyprland
+
+Singleton {
+ id: root
+
+ function doLayout(windowList, outerWidth, outerHeight, maxSplits) {
+ var N = windowList.length
+ if (N === 0) return []
+
+ if (maxSplits === undefined) maxSplits = 3
+
+ // Standard Gap: 0.8% of screen
+ var rawGap = outerWidth * 0.008
+ var gap = Math.max(8, Math.min(24, rawGap))
+
+ // Primary Gap: The space between the first Big Window and the rest.
+ // We make it 3x larger than the standard gap for emphasis.
+ var primaryGap = gap * 3
+
+ // Safe Area (90%)
+ var contentScale = 0.90
+ var useW = outerWidth * contentScale
+ var useH = outerHeight * contentScale
+ var offX = (outerWidth - useW) / 2
+ var offY = (outerHeight - useH) / 2
+
+ // Move Active Window to start
+ var activeAddr = Hyprland.activeToplevel?.lastIpcObject?.address
+ if (activeAddr) {
+ var activeIdx = windowList.findIndex(it => it.lastIpcObject.address === activeAddr)
+ if (activeIdx !== -1) {
+ windowList = [windowList[activeIdx], ...windowList.filter(it => it !== windowList[activeIdx])]
+ }
+ }
+
+ var result = []
+
+ // Working area cursor
+ var curX = offX
+ var curY = offY
+ var curW = useW
+ var curH = useH
+
+ // Items to process in Spiral mode
+ var spiralCount = Math.min(N - 1, maxSplits)
+
+ // Spiral cuts
+ for (var k = 0; k < spiralCount; k++) {
+ var sItem = windowList[k]
+ var sBoxW, sBoxH
+ var sBoxX = curX
+ var sBoxY = curY
+
+ // Logic change: Use 'primaryGap' only for the very first cut (k=0),
+ // otherwise use standard 'gap'.
+ var currentGap = (k === 0) ? primaryGap : gap
+
+ if (curW > curH) { // Split Vertical
+ // Calculate width subtracting the specific gap for this iteration
+ sBoxW = (curW - currentGap) / 2
+ sBoxH = curH
+
+ // Shift working area for next items by the specific gap
+ curX += sBoxW + currentGap
+ curW -= (sBoxW + currentGap)
+ } else { // Split Horizontal
+ sBoxW = curW
+ sBoxH = (curH - currentGap) / 2
+
+ // Shift working area for next items by the specific gap
+ curY += sBoxH + currentGap
+ curH -= (sBoxH + currentGap)
+ }
+
+ // Aspect Fit
+ var sw0 = (sItem.width > 0) ? sItem.width : 100
+ var sh0 = (sItem.height > 0) ? sItem.height : 100
+ var sScale = Math.min(sBoxW / sw0, sBoxH / sh0)
+
+ result.push({
+ win: sItem.win,
+ x: sBoxX + (sBoxW - (sw0 * sScale))/2,
+ y: sBoxY + (sBoxH - (sh0 * sScale))/2,
+ width: sw0 * sScale,
+ height: sh0 * sScale,
+ isSpiral: true,
+ index: k
+ })
+ }
+
+ // Overflow grid
+ var remainingItems = windowList.slice(spiralCount)
+ var remN = remainingItems.length
+
+ if (remN > 0) {
+ // Standard Grid logic for the remaining box
+ var bestCols = 1
+ var bestScale = 0
+ var TARGET_ASPECT = 16.0/9.0
+
+ for (var c = 1; c <= remN; c++) {
+ var r = Math.ceil(remN / c)
+ var avW = curW - gap * (c - 1)
+ var avH = curH - gap * (r - 1)
+ if (avW <= 0 || avH <= 0) continue
+
+ var cW = avW / c
+ var cH = avH / r
+ var sc = Math.min(cW / TARGET_ASPECT, cH)
+
+ if (sc > bestScale) {
+ bestScale = sc
+ bestCols = c
+ }
+ }
+
+ var remRows = Math.ceil(remN / bestCols)
+ var finalCellW = (curW - gap * (bestCols - 1)) / bestCols
+ var finalCellH = (curH - gap * (remRows - 1)) / remRows
+
+ var gridContentH = remRows * finalCellH + (remRows - 1) * gap
+ var gridStartY = curY + (curH - gridContentH) / 2
+
+ for (var j = 0; j < remN; j++) {
+ var rItem = remainingItems[j]
+ var row = Math.floor(j / bestCols)
+ var col = j % bestCols
+
+ var itemsInRow = Math.min((row + 1) * bestCols, remN) - (row * bestCols)
+ var rowW = itemsInRow * finalCellW + (itemsInRow - 1) * gap
+ var rowStartX = curX + (curW - rowW) / 2
+
+ var cellX = rowStartX + col * (finalCellW + gap)
+ var cellY = gridStartY + row * (finalCellH + gap)
+
+ var rw0 = (rItem.width > 0) ? rItem.width : 100
+ var rh0 = (rItem.height > 0) ? rItem.height : 100
+ var rSc = Math.min(finalCellW / rw0, finalCellH / rh0)
+
+ result.push({
+ win: rItem.win,
+ x: cellX + (finalCellW - (rw0 * rSc))/2,
+ y: cellY + (finalCellH - (rh0 * rSc))/2,
+ width: rw0 * rSc,
+ height: rh0 * rSc,
+ isSpiral: false
+ })
+ }
+ }
+
+ return result
+ }
+}
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage