1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-06-08 04:09:15 -04:00
Files
DankMaterialShell/quickshell/Modules/ControlCenter/utils/layout.js
T
bbedward 8c20f448ed control center: improve drag handling
misc: fix layer shell enum usage
2026-06-01 13:16:47 -04:00

114 lines
3.1 KiB
JavaScript

function spanWidthFor(baseWidth, widgetWidth, spacing) {
const w = widgetWidth || 50
if (w <= 25)
return (baseWidth - spacing * 3) / 4
if (w <= 50)
return (baseWidth - spacing) / 2
if (w <= 75)
return (baseWidth - spacing * 2) * 0.75
return baseWidth
}
function isSliderWidget(id) {
return id === "volumeSlider" || id === "brightnessSlider" || id === "inputVolumeSlider"
}
function computeSlots(widgets, order, baseWidth, spacing, rowSpacing, sliderHeight, normalHeight) {
const slots = []
let x = 0
let y = 0
let rowRight = 0
let rowMaxH = 0
let countInRow = 0
for (let p = 0; p < order.length; p++) {
const sourceIndex = order[p]
const widget = widgets[sourceIndex]
if (!widget)
continue
const itemW = spanWidthFor(baseWidth, widget.width, spacing)
const itemH = isSliderWidget(widget.id || "") ? sliderHeight : normalHeight
if (countInRow > 0 && (rowRight + spacing + itemW > baseWidth + 0.5)) {
y += rowMaxH + rowSpacing
rowRight = 0
rowMaxH = 0
countInRow = 0
}
x = countInRow === 0 ? 0 : rowRight + spacing
slots[sourceIndex] = {
"x": x,
"y": y,
"w": itemW,
"h": itemH
}
rowRight = x + itemW
rowMaxH = Math.max(rowMaxH, itemH)
countInRow++
}
return {
"slots": slots,
"totalHeight": y + rowMaxH
}
}
function slotContainingPoint(slots, order, px, py) {
for (let p = 0; p < order.length; p++) {
const s = slots[order[p]]
if (!s)
continue
if (px >= s.x && px < s.x + s.w && py >= s.y && py < s.y + s.h)
return p
}
return -1
}
function calculateRowsAndWidgets(controlCenterColumn, expandedSection, expandedWidgetIndex) {
var rows = []
var currentRow = []
var currentWidth = 0
var expandedRow = -1
const widgets = SettingsData.controlCenterWidgets || []
const baseWidth = controlCenterColumn.width
const spacing = Theme.spacingS
for (var i = 0; i < widgets.length; i++) {
const widget = widgets[i]
const widgetWidth = widget.width || 50
var itemWidth
if (widgetWidth <= 25) {
itemWidth = (baseWidth - spacing * 3) / 4
} else if (widgetWidth <= 50) {
itemWidth = (baseWidth - spacing) / 2
} else if (widgetWidth <= 75) {
itemWidth = (baseWidth - spacing * 2) * 0.75
} else {
itemWidth = baseWidth
}
if (currentRow.length > 0 && (currentWidth + spacing + itemWidth > baseWidth)) {
rows.push([...currentRow])
currentRow = [widget]
currentWidth = itemWidth
} else {
currentRow.push(widget)
currentWidth += (currentRow.length > 1 ? spacing : 0) + itemWidth
}
if (expandedWidgetIndex === i) {
expandedRow = rows.length
}
}
if (currentRow.length > 0) {
rows.push(currentRow)
}
return { rows: rows, expandedRowIndex: expandedRow }
}