Files
DankMaterialShell/quickshell/Modules/ControlCenter/Components/CcTileSlot.qml
T
2026-09-28 14:26:42 -04:00

151 lines
4.7 KiB
QML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import QtQuick
import qs.Common
import qs.Widgets
import qs.Modules.ControlCenter
import "../utils/widgets.js" as WidgetUtils
import "../../../Common/GridLayout.js" as GridUtils
DankEditableGridSlot {
id: root
readonly property var widgetData: JSON.parse(json)
readonly property var sizeSpec: WidgetUtils.sizeSpec(widgetData, grid.columns, grid.maximumRows)
readonly property real cols: slot?.cols ?? 1
readonly property real rows: slot?.rows ?? 1
readonly property bool compact: cols <= 2 && rows === 1
readonly property var tileItem: tileLoader.item
passthrough: tileItem?.passthrough ?? null
onPressAndHold: {
if (!editChrome.hasOptions)
return;
root.grid.configRequested(root.index, root.widgetData, editChrome);
}
onResizeRequested: (requestedWidth, requestedHeight) => {
const step = sizeSpec.step;
let width = GridUtils.dimension(Math.round((requestedWidth + CcMetrics.gridGap) / grid.cellWidth / step) * step, sizeSpec.minW, sizeSpec.maxW, sizeSpec.w, step);
let height = GridUtils.dimension(Math.round((requestedHeight + CcMetrics.gridGap) / grid.cellWidth / step) * step, sizeSpec.minH, sizeSpec.maxH, sizeSpec.h, step);
const current = WidgetUtils.clampSize(widgetData, grid.columns, grid.maximumRows);
if (WidgetUtils.isSliderWidget(widgetData.id) && width < 2 && height < 2) {
if (width !== current.w && sizeSpec.maxH > 1)
height = 2;
else
width = Math.min(2, sizeSpec.maxW);
}
if (widgetData.id === "quickActions") {
const count = WidgetUtils.enabledQuickActions(widgetData).length;
if (height !== current.h)
width = Math.max(width, CcMetrics.actionSpan(Math.ceil(count / CcMetrics.actionCapacity(height))));
const size = WidgetUtils.clampSize(Object.assign({}, widgetData, {
w: width,
h: height
}), grid.columns, grid.maximumRows);
width = size.w;
height = size.h;
}
const changes = {};
if (width !== current.w)
changes.w = width;
if (height !== current.h)
changes.h = height;
grid.previewSize(index, changes);
}
Loader {
id: tileLoader
anchors.fill: parent
sourceComponent: root.grid.model ? root.grid.model.componentForWidget(root.widgetData) : null
}
Binding {
target: root.tileItem
property: "widgetData"
value: root.widgetData
when: root.tileItem !== null
}
Binding {
target: root.tileItem
property: "widgetDef"
value: root.grid.model?.getWidgetForId(root.widgetData.id || "") ?? null
when: root.tileItem !== null
}
Binding {
target: root.tileItem
property: "host"
value: root.grid
when: root.tileItem !== null
}
Binding {
target: root.tileItem
property: "live"
value: root.grid.live
when: root.tileItem !== null
}
Binding {
target: root.tileItem
property: "interactive"
value: !root.grid.editMode
when: root.tileItem !== null
}
Binding {
target: root.tileItem
property: "columns"
value: root.cols
when: root.tileItem !== null
}
Binding {
target: root.tileItem
property: "rows"
value: root.rows
when: root.tileItem !== null
}
Binding {
target: root.tileItem
property: "compact"
value: root.compact
when: root.tileItem !== null
}
Connections {
target: root.tileItem
ignoreUnknownSignals: true
function onExpandClicked() {
if (root.grid.editMode)
return;
root.grid.expandClicked(root.widgetData);
}
}
CcEditChrome {
id: editChrome
anchors.fill: parent
anchors.margins: -contentInset
z: 2
visible: root.grid.editMode
enabled: root.interactionEnabled
widgetData: root.widgetData
resizeEdgeWidth: root.widgetData.id === "quickActions" ? Theme.spacingL : -1
dragging: root.dragging
resizing: root.resizing
cornerRadius: root.tileItem?.bodyRadius ?? Theme.fullRadius(root.width, root.height)
sizeText: root.cols + "×" + root.rows
onResizeStarted: (px, py) => root.beginResize(px, py)
onResizeMoved: (px, py) => root.resizeTo(px, py)
onResizeEnded: root.finishResize()
onResizeCanceled: root.cancelResize()
onRemoveRequested: root.grid.removeWidget(root.index)
onConfigRequested: anchor => root.grid.configRequested(root.index, root.widgetData, anchor)
}
}