From dcc2b56bd34846c5e8562bdb33ea63f3734d5ec0 Mon Sep 17 00:00:00 2001 From: Don Williams Date: Mon, 13 Jul 2026 16:11:51 -0400 Subject: Fixed qs-hyprview to work with trixie+ Signed-off-by: Don Williams 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 --- .../layouts/SmartGridLayout.qml | 134 +++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 config/quickshell/qs-hyprview-unified/layouts/SmartGridLayout.qml (limited to 'config/quickshell/qs-hyprview-unified/layouts/SmartGridLayout.qml') diff --git a/config/quickshell/qs-hyprview-unified/layouts/SmartGridLayout.qml b/config/quickshell/qs-hyprview-unified/layouts/SmartGridLayout.qml new file mode 100644 index 00000000..6207d19c --- /dev/null +++ b/config/quickshell/qs-hyprview-unified/layouts/SmartGridLayout.qml @@ -0,0 +1,134 @@ +pragma Singleton +import Quickshell + +Singleton { + id: root + + function doLayout(windowList, outerWidth, outerHeight) { + var N = windowList.length + if (N === 0) return [] + if (outerWidth <= 0 || outerHeight <= 0) return [] + + var gap = Math.min(outerWidth * 0.03, outerHeight * 0.03) + + // --- 0. DEFINIZIONE AREA SICURA (SCALATA) --- + // Riduciamo l'area di calcolo al 90% per lasciare spazio alle animazioni hover + var contentScale = 0.9 + var usableW = outerWidth * contentScale + var usableH = outerHeight * contentScale + + // --- 1. TROVARE LA SCALA OTTIMALE --- + // Usiamo usableW/H per decidere la dimensione delle finestre + var TARGET_ASPECT = 16.0 / 9.0 + var bestCols = 1 + var bestRows = 1 + var bestScale = 0 + + for (var cols = 1; cols <= N; cols++) { + var rows = Math.ceil(N / cols) + + // Calcoliamo lo spazio basandoci sull'area ridotta + var availW = usableW - gap * (cols - 1) + var availH = usableH - gap * (rows - 1) + + if (availW <= 0 || availH <= 0) continue + + var cellW = availW / cols + var cellH = availH / rows + + var scaleW = cellW / TARGET_ASPECT + var scaleH = cellH / 1.0 + var currentScale = Math.min(scaleW, scaleH) + + if (currentScale > bestScale) { + bestScale = currentScale + bestCols = cols + bestRows = rows + } + } + + // --- 2. CALCOLO DIMENSIONI REALI --- + + // Ricalcoliamo i limiti cella basati sull'area ridotta + var finalAvailW = usableW - gap * (bestCols - 1) + var finalAvailH = usableH - gap * (bestRows - 1) + var maxCellW = finalAvailW / bestCols + var maxCellH = finalAvailH / bestRows + + // --- 3. POSIZIONAMENTO (CENTRATO NELL'AREA TOTALE) --- + + // Calcoliamo l'altezza totale del blocco di contenuto + var totalGridContentH = bestRows * maxCellH + (bestRows - 1) * gap + + // Per centrare verticalmente, usiamo l'outerHeight REALE (al 100%) + // In questo modo il blocco ridotto (90%) finisce esattamente al centro dello schermo fisico + var startOffsetY = (outerHeight - totalGridContentH) / 2 + + var result = [] + + // Iteriamo per RIGA + for (var r = 0; r < bestRows; r++) { + var rowItems = [] + var startIndex = r * bestCols + var endIndex = Math.min(startIndex + bestCols, N) + + if (startIndex >= N) break + + var totalRowContentWidth = 0 + + // Fase 3a: Calcolo dimensioni miniature (Packed) + for (var i = startIndex; i < endIndex; i++) { + var item = windowList[i] + var w0 = (item.width && item.width > 0) ? item.width : 100 + var h0 = (item.height && item.height > 0) ? item.height : 100 + + // Scala calcolata sui limiti "sicuri" (90%) + var scale = Math.min(maxCellW / w0, maxCellH / h0) + + var thumbW = w0 * scale + var thumbH = h0 * scale + + rowItems.push({ + originalItem: item, + width: thumbW, + height: thumbH, + index: i, + col: i - startIndex + }) + + totalRowContentWidth += thumbW + } + + // Aggiungiamo i gap totali della riga + if (rowItems.length > 1) { + totalRowContentWidth += (rowItems.length - 1) * gap + } + + // Fase 3b: Posizionamento X + // Anche qui, usiamo outerWidth REALE per centrare il blocco riga nello schermo intero + var currentX = (outerWidth - totalRowContentWidth) / 2 + var cellAbsY = startOffsetY + r * (maxCellH + gap) + + for (var k = 0; k < rowItems.length; k++) { + var rItem = rowItems[k] + + // Centratura verticale nella fascia + var currentY = cellAbsY + (maxCellH - rItem.height) / 2 + + result.push({ + win: rItem.originalItem.win, + x: currentX, + y: currentY, + width: rItem.width, + height: rItem.height, + rowIndex: r, + colIndex: rItem.col + }) + + currentX += rItem.width + gap + } + } + + return result + } +} -- cgit v1.2.3